diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 97fc18b3..b58a858c 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -96,6 +96,9 @@ jobs: - name: Typecheck frontend run: npx tsc -p tsconfig.json --noEmit --pretty false + - name: Typecheck frontend tests + run: npx tsc -p tsconfig.test.json --noEmit --pretty false + - name: Build frontend bundle run: npm run build @@ -119,7 +122,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - name: Tune Git HTTP settings run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index a9c5a2ef..243d5eb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,15 @@ All notable changes to this project are documented in this file. ### Fixed - **`mjr_am_backend.adapters.tools` missing from Registry installs**: `.comfyignore`'s unanchored `tools/` pattern also matched `mjr_am_backend/adapters/tools/`, stripping the ExifTool/FFProbe adapters out of every Registry-published package and causing `ModuleNotFoundError: No module named 'mjr_am_backend.adapters.tools'` at startup. The pattern is now anchored to the repo-root `/tools/` dev-scripts folder only. +### Changed (ComfyUI integration) +- **Compat assets API moved to `/mjr/am/compat/assets/*`**: the read-only OpenAPI-aligned surface no longer squats ComfyUI core's `/api` namespace. The old `/api/v2/assets/*` paths are only registered when `MJR_AM_LEGACY_API_V2_ASSETS=1` (deprecated). +- **Python 3.14**: `requires-python` is now `>=3.10, <3.15`; CI runs the full suite on 3.14. +- **Execution tracking without wrapping `api.queuePrompt`**: the floating viewer progress reads the running prompt from ComfyUI's Jobs API (`GET /api/jobs/{id}`), then `/queue` and `/history/{id}` on older cores, driven by websocket events. No more conflicts with other extensions that wrap `queuePrompt`. +- **Optional: hide ComfyUI's native Assets tab** (`Majoor.Integration.HideNativeAssetsTab`, off by default). Uses the official `getSidebarTabs`/`unregisterSidebarTab` API and restores the tab when turned off. +- **Workflow serialization** uses the root graph instead of the async `graphToPrompt()`; dirty state reads the frontend workflow store. +- **Typed aiohttp request keys** (`web.RequestKey`) — no more `NotAppKeyWarning` on aiohttp ≥ 3.13. +- **Frontend test typing**: `tsconfig.test.json` now type-checks with 0 errors (was 913) and runs in CI. + ## [2.5.2] - 2026-09-27 ### Changed diff --git a/README.md b/README.md index 363e1a36..810536dc 100644 --- a/README.md +++ b/README.md @@ -716,7 +716,7 @@ See [`docs/TESTING.md`](docs/TESTING.md), [`tests/README.md`](tests/README.md), - Linux (Ubuntu 22.04+, Fedora, Debian) - **Browsers**: Modern browsers with ES2020+ support -The automated CI matrix currently validates Python 3.10-3.13 and the frontend on Ubuntu. Windows and macOS support is maintained through portable code paths and contributor/user testing rather than dedicated hosted CI jobs. +The automated CI matrix currently validates Python 3.10-3.14 and the frontend on Ubuntu. Windows and macOS support is maintained through portable code paths and contributor/user testing rather than dedicated hosted CI jobs. --- diff --git a/dist/chunks/FloatingViewer-C99U6UdL.js b/dist/chunks/FloatingViewer-Cccq5sHS.js similarity index 99% rename from dist/chunks/FloatingViewer-C99U6UdL.js rename to dist/chunks/FloatingViewer-Cccq5sHS.js index ae49467d..34e1d7db 100644 --- a/dist/chunks/FloatingViewer-C99U6UdL.js +++ b/dist/chunks/FloatingViewer-Cccq5sHS.js @@ -1,12 +1,12 @@ -import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { B as r, C as i, I as a, M as o, O as s, P as c, R as l, V as u, j as d, m as f, o as p, r as m, rt as h, v as g, w as _, x as v } from "./events-DxfljH4A.js"; +import { $t as e, g as t, y as n } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { C as r, H as i, I as a, M as o, O as s, P as c, V as l, at as u, j as d, m as f, o as p, r as m, v as h, w as g, x as _, z as v } from "./events-BRfpU-6M.js"; import { a as y, i as b, o as x, s as S } from "./graphTraversal-DTdQWkn5.js"; -import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-DI9upE3v.js"; -import { r as k, v as A } from "./SidebarWorkflowSection-BHtHjc_k.js"; -import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-BfOHsVlq.js"; -import { a as W, n as ae, r as oe } from "./model3dRenderer-k0ey48io.js"; +import { _ as C, g as w, m as T, n as E, p as ee, r as D, w as O } from "./Viewer-geJFRz8N.js"; +import { r as k, v as A } from "./SidebarWorkflowSection-BihItyAk.js"; +import { _ as j, a as M, c as N, d as P, f as F, g as I, h as L, i as te, l as R, m as z, o as ne, p as B, r as re, s as V, t as ie, u as H, v as U } from "./openMajoorSettings-Cd5Nutru.js"; +import { a as W, n as ae, r as oe } from "./model3dRenderer-DdPKugXy.js"; import { i as se, o as ce, r as le, t as ue } from "./geninfoParser-CgHp-y-n.js"; -import { t as de } from "./genInfo-Dxtoun1T.js"; +import { t as de } from "./genInfo-BkEKNdy-.js"; // ui/features/viewer/floatingViewerConstants.ts var G = Object.freeze({ SIMPLE: "simple", @@ -305,7 +305,7 @@ function K(e) { return a === ".gif" ? "gif" : De.has(a) ? "video" : Oe.has(a) ? "audio" : ae.has(a) ? "model3d" : "image"; } function Ae(e) { - return e ? e.url ? String(e.url) : e.filename && h(e) || "" : ""; + return e ? e.url ? String(e.url) : e.filename && u(e) || "" : ""; } function q(e = "No media - select assets in the grid") { let t = document.createElement("div"); @@ -600,15 +600,15 @@ var Xe = class { let t = e?.widgets?.[0], i = t?.inputEl ?? t?.element ?? t?.el ?? null; i != null && "value" in i && i.value !== n.value && (i.value = n.value), r(); try { - l(e); + v(e); } catch {} }), n._mjrAutoFit = r, this._noteTextarea = n, this._autoFits.push(r), c.appendChild(n), this._body = c, t.appendChild(c), this._el = t, this._applyExpandedState(), requestAnimationFrame(r), t; } - let u = e.widgets ?? [], d = !1; - for (let t of u) { + let l = e.widgets ?? [], u = !1; + for (let t of l) { let n = String(t.type || "").toLowerCase(); if (Re.has(n) || t.hidden || t.options?.hidden) continue; - d = !0; + u = !0; let r = n === "text" || n === "string" || n === "customtext", i = document.createElement("div"); i.className = r ? "mjr-ws-widget-row mjr-ws-widget-row--block" : "mjr-ws-widget-row"; let a = document.createElement("label"); @@ -620,7 +620,7 @@ var Xe = class { let l = s._mjrAutoFit ?? s.querySelector?.("textarea")?._mjrAutoFit; l && this._autoFits.push(l), i.appendChild(a), i.appendChild(o), c.appendChild(i); } - if (!d) { + if (!u) { let e = document.createElement("div"); e.className = "mjr-ws-node-empty", e.textContent = "No editable parameters", c.appendChild(e); } @@ -647,7 +647,7 @@ var Xe = class { } let e = this._node; if (e) try { - i(e, { + r(e, { select: !1, focusCanvas: !1 }); @@ -830,7 +830,7 @@ function it(e, t, n) { } function at(e) { try { - i(e); + r(e); } catch (e) { console.debug?.("[MFV] _focusNode", e); } @@ -870,14 +870,14 @@ function dt(e) { if (!e || !t || typeof t.add != "function") return !1; let n = String(e?.type || e?.class_type || e?.comfyClass || "").trim(), r = null; try { - r = v(n); + r = _(n); } catch (e) { console.debug?.("[MFV Graph Map] createNode failed", e); } if (!r) return !1; try { let t = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); - return gt(t, e), delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof r.configure == "function" ? r.configure(t) : Object.assign(r, t), g(r); + return gt(t, e), delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof r.configure == "function" ? r.configure(t) : Object.assign(r, t), h(r); } catch (e) { return console.debug?.("[MFV Graph Map] import node failed", e), !1; } @@ -895,34 +895,34 @@ function ft(e) { count: 0, reason: "no-widgets" }; - let i = /* @__PURE__ */ new Map(); + let a = /* @__PURE__ */ new Map(); r.forEach((e, t) => { - for (let n of vt(e)) i.has(n) || i.set(n, { + for (let n of vt(e)) a.has(n) || a.set(n, { widget: e, index: t }); }); - let a = bt(R(e)), o = bt(t?.type || t?.comfyClass || t?.class_type), s = !!(a && o && a === o), c = /* @__PURE__ */ new Set(), l = 0; + let o = bt(R(e)), s = bt(t?.type || t?.comfyClass || t?.class_type), c = !!(o && s && o === s), l = /* @__PURE__ */ new Set(), u = 0; for (let e of n) { - let n = yt(e.label), a = n ? i.get(n) : null, o = e.index; - if ((!a || c.has(a.index)) && s && typeof o == "number" && Number.isInteger(o)) { + let n = yt(e.label), i = n ? a.get(n) : null, o = e.index; + if ((!i || l.has(i.index)) && c && typeof o == "number" && Number.isInteger(o)) { let e = r[o]; - e && (a = { + e && (i = { widget: e, index: o }); } - a && !c.has(a.index) && te(a.widget, X(e.value), t) && (c.add(a.index), l += 1); + i && !l.has(i.index) && te(i.widget, X(e.value), t) && (l.add(i.index), u += 1); } - return u(), { - ok: l > 0, - count: l, - reason: l > 0 ? "ok" : "no-match", + return i(), { + ok: u > 0, + count: u, + reason: u > 0 ? "ok" : "no-match", targetNode: t }; } function pt() { - return _() || null; + return g() || null; } function mt(e) { let t = N(e); @@ -1648,7 +1648,7 @@ async function Xt() { let e = d(); if (!e) throw Error("ComfyUI app not available"); let t = Yt(y(e)); - return { tracked: await r({ + return { tracked: await l({ app: e, forceNativeQueue: t, resolvePromptData(e) { diff --git a/dist/chunks/LiveStreamTracker-CXkc1cyF.js b/dist/chunks/LiveStreamTracker-C8HwFSOT.js similarity index 97% rename from dist/chunks/LiveStreamTracker-CXkc1cyF.js rename to dist/chunks/LiveStreamTracker-C8HwFSOT.js index d1c1ea1c..56babecc 100644 --- a/dist/chunks/LiveStreamTracker-CXkc1cyF.js +++ b/dist/chunks/LiveStreamTracker-C8HwFSOT.js @@ -1,5 +1,5 @@ -import { J as e, o as t, r as n } from "./events-DxfljH4A.js"; -import { t as r } from "./floatingViewerManager-DKOeP6-T.js"; +import { Z as e, o as t, r as n } from "./events-BRfpU-6M.js"; +import { t as r } from "./floatingViewerManager-Gv7MTmpu.js"; // ui/features/viewer/LiveStreamTracker.ts var i = !1, a = null, o = null, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = 0, h = !1, g = 400, _ = "kj_preview_override", v = /* @__PURE__ */ new Set([ "image/jpeg", diff --git a/dist/chunks/SidebarWorkflowSection-BHtHjc_k.js b/dist/chunks/SidebarWorkflowSection-BihItyAk.js similarity index 85% rename from dist/chunks/SidebarWorkflowSection-BHtHjc_k.js rename to dist/chunks/SidebarWorkflowSection-BihItyAk.js index 3a6b75ba..37e8e2d9 100644 --- a/dist/chunks/SidebarWorkflowSection-BHtHjc_k.js +++ b/dist/chunks/SidebarWorkflowSection-BihItyAk.js @@ -1,11 +1,11 @@ -import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as E, X as re, Y as D, Yt as ie, Z as ae, Zt as oe, at as se, cn as ce, ct as le, dt as ue, en as de, et as fe, gt as pe, it as me, jt as he, k as ge, kt as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, sn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { Ct as Oe, K as ke, N as Ae, T as je, c as Me, d as Ne, f as Pe, h as Fe, j as Ie, l as Le, m as O, o as k, p as Re, pt as ze, s as A, tt as Be, u as Ve, x as He, y as Ue } from "./events-DxfljH4A.js"; -import { F as We, K as Ge, P as Ke, Y as qe, f as Je, m as Ye, p as Xe } from "./Viewer-DI9upE3v.js"; -import { t as Ze } from "./floatingViewerManager-DKOeP6-T.js"; -import { A as Qe, C as j, D as $e, E as M, G as et, J as tt, K as nt, N as rt, O as N, R as it, S as at, T as P, U as F, V as I, Y as ot, _ as st, a as ct, b as lt, c as ut, d as dt, dt as L, f as ft, ft as R, g as pt, h as mt, i as ht, j as gt, k as z, l as _t, lt as B, m as vt, n as yt, nt as bt, o as xt, p as St, r as Ct, rt as V, s as wt, t as Tt, u as Et, ut as Dt, y as Ot, z as kt } from "./mjr-primevue-BRqtdXzb.js"; -import { t as At } from "./mjr-vue-vendor-mHY_eIVE.js"; -import { t as jt } from "./viewerOpenRequest-CCFPrnGk.js"; -import { a as Mt, i as Nt, n as Pt, o as Ft, r as It, t as Lt } from "./geninfoParser-CgHp-y-n.js"; +import { $ as e, $t as t, At as n, Bt as r, Ct as i, Dt as a, Et as o, Ft as s, Gt as c, Ht as l, I as u, It as d, K as f, Kt as p, Mt as m, N as h, Nt as g, O as _, Ot as v, Pt as y, Q as b, Qt as x, R as S, Rt as C, S as ee, St as te, T as ne, Tt as w, Ut as T, Vt as E, X as re, Y as D, Yt as ie, Z as ae, Zt as oe, at as se, cn as ce, ct as le, dt as ue, en as de, et as fe, gt as pe, it as me, jt as he, k as ge, kt as _e, lt as ve, nt as ye, ot as be, p as xe, rt as Se, sn as Ce, tt as we, ut as Te, w as Ee, wt as De } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { G as Oe, J as ke, N as Ae, R as je, T as Me, Tt as Ne, X as Pe, c as Fe, d as Ie, f as Le, h as Re, ht as ze, j as Be, l as Ve, m as O, o as k, p as He, rt as Ue, s as A, u as We, x as Ge, y as Ke } from "./events-BRfpU-6M.js"; +import { F as qe, K as Je, P as Ye, Y as Xe, f as Ze, m as Qe, p as $e } from "./Viewer-geJFRz8N.js"; +import { t as et } from "./floatingViewerManager-Gv7MTmpu.js"; +import { A as tt, C as j, D as nt, E as M, G as rt, J as it, K as at, N as ot, O as N, R as st, S as ct, T as P, U as F, V as I, Y as lt, _ as ut, a as dt, b as ft, c as pt, d as mt, dt as L, f as ht, ft as R, g as gt, h as _t, i as vt, j as yt, k as z, l as bt, lt as B, m as xt, n as St, nt as Ct, o as wt, p as Tt, r as Et, rt as V, s as Dt, t as Ot, u as kt, ut as At, y as jt, z as Mt } from "./mjr-primevue-BRqtdXzb.js"; +import { t as Nt } from "./mjr-vue-vendor-mHY_eIVE.js"; +import { t as Pt } from "./viewerOpenRequest-Crw9UWH5.js"; +import { a as Ft, i as It, n as Lt, o as Rt, r as zt, t as Bt } from "./geninfoParser-CgHp-y-n.js"; // ui/app/settings/settingsUtils.ts var H = (e, t) => { if (typeof e == "boolean") return e; @@ -28,30 +28,30 @@ var H = (e, t) => { }, U = (e, t) => { let n = Number(e); return Number.isFinite(n) ? n : Number(t); -}, Rt = (e, t, n) => { +}, Vt = (e, t, n) => { let r = typeof e == "string" ? e.trim() : String(e ?? ""); return t.includes(r) ? r : n; -}, zt = (e) => e === "__proto__" || e === "prototype" || e === "constructor", Bt = (e, t) => { +}, Ht = (e) => e === "__proto__" || e === "prototype" || e === "constructor", Ut = (e, t) => { let n = { ...e }; return !t || typeof t != "object" || Object.keys(t).forEach((r) => { - if (zt(r)) return; + if (Ht(r)) return; let i = t[r]; - i && typeof i == "object" && !Array.isArray(i) ? n[r] = Bt(e[r] || {}, i) : i !== void 0 && (n[r] = i); + i && typeof i == "object" && !Array.isArray(i) ? n[r] = Ut(e[r] || {}, i) : i !== void 0 && (n[r] = i); }), n; -}, Vt = Object.freeze({ +}, Wt = Object.freeze({ small: 80, medium: 120, large: 180 -}), Ht = Object.freeze([ +}), Gt = Object.freeze([ "small", "medium", "large" -]), Ut = (e, t) => Math.max(60, Math.min(600, Math.round(U(e, t)))), Wt = (e = {}) => { +]), Kt = (e, t) => Math.max(60, Math.min(600, Math.round(U(e, t)))), qt = (e = {}) => { let t = Number(e?.minSize); - if (Number.isFinite(t)) return Ut(t, A.GRID_MIN_SIZE); - let n = Rt(String(e?.minSizePreset || "").toLowerCase(), Ht, ""); - return n ? Vt[n] : Ut(e?.minSize, A.GRID_MIN_SIZE); -}, Gt = (e = {}) => Ut(e?.minSize, A.FEED_GRID_MIN_SIZE), Kt = (e) => { + if (Number.isFinite(t)) return Kt(t, A.GRID_MIN_SIZE); + let n = Vt(String(e?.minSizePreset || "").toLowerCase(), Gt, ""); + return n ? Wt[n] : Kt(e?.minSize, A.GRID_MIN_SIZE); +}, Jt = (e = {}) => Kt(e?.minSize, A.FEED_GRID_MIN_SIZE), Yt = (e) => { let t = Math.round(U(e, A.GRID_MIN_SIZE)); return t <= 100 ? "small" : t >= 150 ? "large" : "medium"; }, W = { @@ -63,7 +63,7 @@ var H = (e, t) => { grid: { pageSize: A.DEFAULT_PAGE_SIZE, minSize: A.GRID_MIN_SIZE, - minSizePreset: Kt(A.GRID_MIN_SIZE), + minSizePreset: Yt(A.GRID_MIN_SIZE), gap: A.GRID_GAP, showExtBadge: A.GRID_SHOW_BADGES_EXTENSION, showRatingBadge: A.GRID_SHOW_BADGES_RATING, @@ -156,6 +156,7 @@ var H = (e, t) => { widthPx: 360, assetBadgeEnabled: A.SIDEBAR_ASSET_BADGE_ENABLED }, + integration: { hideNativeAssetsTab: !1 }, probeBackend: { mode: "auto" }, i18n: { followComfyLanguage: !0 }, metadataFallback: { @@ -213,16 +214,16 @@ var H = (e, t) => { tokenConfigured: !1, tokenHint: "" } -}, qt = () => { +}, Xt = () => { try { - let e = Fe.get(ce); + let e = Re.get(ce); if (!e) return { ...W }; let t = JSON.parse(e), n = t && typeof t == "object" && Number.isInteger(t.version) && t.data && typeof t.data == "object"; if (!n && (!t || typeof t != "object" || Array.isArray(t))) return { ...W }; if (n && Number(t.version) > 1) return console.warn("[Majoor] settings schema version is newer than this build, using defaults"), { ...W }; let r = n ? t.data : t, i = /* @__PURE__ */ new Set(/* @__PURE__ */ "debug.grid.infiniteScroll.siblings.autoScan.scan.watcher.status.viewer.rtHydrate.observability.feed.sidebar.probeBackend.i18n.paths.db.ratingTagsSync.cache.search.ai.executionGrouping.workflowMinimap.ui.security.safety".split(".")), a = {}; if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) i.has(e) && (a[e] = t); - let o = Bt(W, a); + let o = Ut(W, a); if (!n) try { G(o); } catch (e) { @@ -240,24 +241,24 @@ var H = (e, t) => { version: 1, data: t }; - if (!Fe.set("mjrSettings", JSON.stringify(n))) throw Error("SettingsStore rejected the write"); + if (!Re.set("mjrSettings", JSON.stringify(n))) throw Error("SettingsStore rejected the write"); } catch (e) { console.warn("[Majoor] settings save failed", e); try { let e = Date.now(); - e - (Number(window?._mjrSettingsSaveFailAt || 0) || 0) > 3e4 && (window._mjrSettingsSaveFailAt = e, Ge(O("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked)."))); + e - (Number(window?._mjrSettingsSaveFailAt || 0) || 0) > 3e4 && (window._mjrSettingsSaveFailAt = e, Je(O("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked)."))); } catch (e) { console.debug?.(e); } try { - qe("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); + Xe("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); } catch (e) { console.debug?.(e); } } }, K = (e) => { let t = Number(A.MAX_PAGE_SIZE) || 2e3, n = Math.max(50, Math.min(t, Number(e.grid?.pageSize) || A.DEFAULT_PAGE_SIZE)); - k.DEFAULT_PAGE_SIZE = n, k.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, k.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), k.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || A.STATUS_POLL_INTERVAL), k.DEBUG_SAFE_CALL = !!e.debug?.safeCall, k.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, k.DEBUG_VIEWER = !!e.debug?.viewer, k.GRID_MIN_SIZE = Wt(e.grid), k.FEED_GRID_MIN_SIZE = Gt(e.feed), k.GRID_GAP = Math.max(0, Math.min(40, Math.round(U(e.grid?.gap, A.GRID_GAP)))), k.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? A.GRID_SHOW_BADGES_EXTENSION), k.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? A.GRID_SHOW_BADGES_RATING), k.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? A.GRID_SHOW_BADGES_TAGS), k.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? A.GRID_SHOW_DETAILS), k.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? A.GRID_SHOW_DETAILS_FILENAME), k.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? A.GRID_SHOW_DETAILS_DATE), k.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? A.GRID_SHOW_DETAILS_DIMENSIONS), k.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? A.GRID_SHOW_DETAILS_GENTIME), k.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? A.GRID_SHOW_HOVER_INFO), k.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? A.GRID_SHOW_WORKFLOW_DOT); + k.DEFAULT_PAGE_SIZE = n, k.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, k.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), k.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || A.STATUS_POLL_INTERVAL), k.DEBUG_SAFE_CALL = !!e.debug?.safeCall, k.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, k.DEBUG_VIEWER = !!e.debug?.viewer, k.GRID_MIN_SIZE = qt(e.grid), k.FEED_GRID_MIN_SIZE = Jt(e.feed), k.GRID_GAP = Math.max(0, Math.min(40, Math.round(U(e.grid?.gap, A.GRID_GAP)))), k.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? A.GRID_SHOW_BADGES_EXTENSION), k.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? A.GRID_SHOW_BADGES_RATING), k.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? A.GRID_SHOW_BADGES_TAGS), k.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? A.GRID_SHOW_DETAILS), k.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? A.GRID_SHOW_DETAILS_FILENAME), k.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? A.GRID_SHOW_DETAILS_DATE), k.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? A.GRID_SHOW_DETAILS_DIMENSIONS), k.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? A.GRID_SHOW_DETAILS_GENTIME), k.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? A.GRID_SHOW_HOVER_INFO), k.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? A.GRID_SHOW_WORKFLOW_DOT); { let t = String(e.grid?.workflowGroupBy ?? A.WORKFLOW_GRID_GROUP_BY).toLowerCase(); k.WORKFLOW_GRID_GROUP_BY = [ @@ -304,53 +305,53 @@ var H = (e, t) => { } k.VIEWER_VIDEO_GRADE_THROTTLE_FPS = Math.max(1, Math.min(60, Math.round(U(e.viewer?.videoGradeThrottleFps, A.VIEWER_VIDEO_GRADE_THROTTLE_FPS)))), k.VIEWER_SCOPES_FPS = Math.max(1, Math.min(60, Math.round(U(e.viewer?.scopesFps, A.VIEWER_SCOPES_FPS)))), k.VIEWER_META_TTL_MS = Math.max(1e3, Math.min(6e5, Math.round(U(e.viewer?.metaTtlMs, A.VIEWER_META_TTL_MS)))), k.VIEWER_META_MAX_ENTRIES = Math.max(50, Math.min(5e3, Math.round(U(e.viewer?.metaMaxEntries, A.VIEWER_META_MAX_ENTRIES)))), k.WORKFLOW_MINIMAP_ENABLED = !!(e.workflowMinimap?.enabled ?? A.WORKFLOW_MINIMAP_ENABLED), k.RT_HYDRATE_CONCURRENCY = Math.max(1, Math.min(16, Math.round(U(e.rtHydrate?.concurrency, A.RT_HYDRATE_CONCURRENCY)))), k.RT_HYDRATE_QUEUE_MAX = Math.max(10, Math.min(5e3, Math.round(U(e.rtHydrate?.queueMax, A.RT_HYDRATE_QUEUE_MAX)))), k.RT_HYDRATE_SEEN_MAX = Math.max(1e3, Math.min(2e5, Math.round(U(e.rtHydrate?.seenMax, A.RT_HYDRATE_SEEN_MAX)))), k.RT_HYDRATE_PRUNE_BUDGET = Math.max(10, Math.min(1e4, Math.round(U(e.rtHydrate?.pruneBudget, A.RT_HYDRATE_PRUNE_BUDGET)))), k.RT_HYDRATE_SEEN_TTL_MS = Math.max(5e3, Math.min(216e5, Math.round(U(e.rtHydrate?.seenTtlMs, A.RT_HYDRATE_SEEN_TTL_MS)))), k.DELETE_CONFIRMATION = !!e.safety?.confirmDeletion, k.DEBUG_VERBOSE_ERRORS = !!e.observability?.verboseErrors, k.WATCHER_MAX_PENDING = Math.max(10, Math.min(5e3, Math.round(U(e.watcher?.maxPending, 500)))), k.WATCHER_MIN_SIZE = Math.max(0, Math.min(1e6, Math.round(U(e.watcher?.minSize, 100)))), k.WATCHER_MAX_SIZE = Math.max(1e5, Math.min(17179869184, Math.round(U(e.watcher?.maxSize, 4294967296)))), k.DB_TIMEOUT_MS = Math.max(1e3, Math.min(3e4, Math.round(U(e.db?.timeoutMs, 5e3)))), k.DB_MAX_CONNECTIONS = Math.max(1, Math.min(100, Math.round(U(e.db?.maxConnections, 10)))), k.DB_QUERY_TIMEOUT_MS = Math.max(500, Math.min(1e4, Math.round(U(e.db?.queryTimeoutMs, 1e3)))), k.SIDEBAR_ASSET_BADGE_ENABLED = !!(e.sidebar?.assetBadgeEnabled ?? A.SIDEBAR_ASSET_BADGE_ENABLED), k.SEARCH_REQUEST_LIMIT = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Math.round(U(e.search?.maxResults, A.SEARCH_DEFAULT_LIMIT)))); }; -async function Jt() { +async function Zt() { try { let e = await se(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; - let n = qt(); + let n = Xt(); if (n.security = n.security || {}, n.security.safeMode = H(t.safe_mode, n.security.safeMode), n.security.allowWrite = H(t.allow_write, n.security.allowWrite), n.security.requireAuth = H(t.require_auth, n.security.requireAuth), n.security.allowRemoteWrite = H(t.allow_remote_write, n.security.allowRemoteWrite), n.security.allowInsecureTokenTransport = H(t.allow_insecure_token_transport, n.security.allowInsecureTokenTransport), n.security.allowDelete = H(t.allow_delete, n.security.allowDelete), n.security.allowRename = H(t.allow_rename, n.security.allowRename), n.security.allowOpenInFolder = H(t.allow_open_in_folder, n.security.allowOpenInFolder), n.security.allowResetIndex = H(t.allow_reset_index, n.security.allowResetIndex), n.security.tokenConfigured = H(t.token_configured, n.security.tokenConfigured), n.security.tokenHint = String(t.token_hint || "").trim(), !String(n.security.apiToken || "").trim()) try { let e = await S(), t = String(e?.data?.token || "").trim(); e?.ok && t && x(t); } catch (e) { console.debug?.(e); } - G(n), K(n), qe("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); + G(n), K(n), Xe("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend security settings", e); } } -async function Yt() { +async function Qt() { try { let e = await le(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; - let n = qt(); - n.ai = n.ai || {}, n.ai.vectorSearchEnabled = H(t.enabled, n.ai.vectorSearchEnabled ?? !0), n.ai.vectorCaptionOnIndex = H(t.caption_on_index ?? t.captionOnIndex, n.ai.vectorCaptionOnIndex ?? !1), n.ai.vectorIndexOnScan = H(t.index_on_scan ?? t.indexOnScan, n.ai.vectorIndexOnScan ?? !1), n.ai.vectorUnloadAfterUse = H(t.unload_after_use ?? t.unloadAfterUse, n.ai.vectorUnloadAfterUse ?? !1), n.ai.vectorConcurrency = Math.max(1, Math.min(16, Math.floor(Number(t.concurrency ?? n.ai.vectorConcurrency ?? 1) || 1))), G(n), K(n), qe("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); + let n = Xt(); + n.ai = n.ai || {}, n.ai.vectorSearchEnabled = H(t.enabled, n.ai.vectorSearchEnabled ?? !0), n.ai.vectorCaptionOnIndex = H(t.caption_on_index ?? t.captionOnIndex, n.ai.vectorCaptionOnIndex ?? !1), n.ai.vectorIndexOnScan = H(t.index_on_scan ?? t.indexOnScan, n.ai.vectorIndexOnScan ?? !1), n.ai.vectorUnloadAfterUse = H(t.unload_after_use ?? t.unloadAfterUse, n.ai.vectorUnloadAfterUse ?? !1), n.ai.vectorConcurrency = Math.max(1, Math.min(16, Math.floor(Number(t.concurrency ?? n.ai.vectorConcurrency ?? 1) || 1))), G(n), K(n), Xe("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend vector search settings", e); } } -async function Xt() { +async function $t() { try { let e = await D(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; - let n = qt(); - n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = H(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), G(n), K(n), qe("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); + let n = Xt(); + n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = H(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), G(n), K(n), Xe("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend execution grouping settings", e); } } // ui/app/settings/settingsRuntime.ts -var Zt = "mjr-runtime-status-dashboard", Qt = 3e4; -function $t() { +var en = "mjr-runtime-status-dashboard", tn = 3e4; +function nn() { try { - let e = qt(), t = String(e?.observability?.runtimeDashboardMode || W.observability.runtimeDashboardMode); + let e = Xt(), t = String(e?.observability?.runtimeDashboardMode || W.observability.runtimeDashboardMode); return [ "autoHide30", "always", @@ -360,27 +361,27 @@ function $t() { return "autoHide30"; } } -function en() { +function rn() { try { - document.getElementById(Zt)?.remove?.(); + document.getElementById(en)?.remove?.(); } catch (e) { console.debug?.(e); } } -function tn() { +function an() { try { window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ && (clearTimeout(window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__), window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = null); } catch (e) { console.debug?.(e); } } -function nn(e, t) { +function on(e, t) { let n = t === "auth" ? "__mjrAuthLine" : "__mjrMetricsLine"; if (e?.[n]) return e[n]; let r = document.createElement("div"); return r.style.whiteSpace = "nowrap", r.style.lineHeight = "1.35", t === "auth" && (r.style.marginTop = "4px", r.style.fontWeight = "600"), e.appendChild(r), e[n] = r, r; } -function rn(e) { +function sn(e) { let t = String(e?.token_hint || "").trim(), n = oe(), r = t || (n ? "(session)" : ""), i = e?.allow_write !== !1, a = e?.require_auth === !0, o = e?.token_configured === !0; return i ? n ? { text: O("runtime.writeAuthActive", "Write auth: active {tokenHint}", { tokenHint: r || "(session)" }), @@ -402,10 +403,10 @@ function rn(e) { color: "#ff9b9b" }; } -function an() { +function cn() { try { - if ($t() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return en(), null; - let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(Zt); + if (nn() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return rn(), null; + let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(en); if (!e) { try { t?.remove?.(); @@ -420,16 +421,16 @@ function an() { } catch (e) { console.debug?.(e); } - let n = document.getElementById(Zt); - return n ? n.parentElement !== e && e.appendChild(n) : (n = document.createElement("div"), n.id = Zt, n.style.position = "absolute", n.style.bottom = "10px", n.style.right = "10px", n.style.zIndex = "9999", n.style.padding = "6px 10px", n.style.borderRadius = "10px", n.style.border = "1px solid rgba(255,255,255,0.16)", n.style.background = "rgba(0,0,0,0.45)", n.style.backdropFilter = "blur(4px)", n.style.color = "var(--content-fg, #fff)", n.style.fontSize = "11px", n.style.pointerEvents = "none", n.style.display = "flex", n.style.flexDirection = "column", e.appendChild(n)), n; + let n = document.getElementById(en); + return n ? n.parentElement !== e && e.appendChild(n) : (n = document.createElement("div"), n.id = en, n.style.position = "absolute", n.style.bottom = "10px", n.style.right = "10px", n.style.zIndex = "9999", n.style.padding = "6px 10px", n.style.borderRadius = "10px", n.style.border = "1px solid rgba(255,255,255,0.16)", n.style.background = "rgba(0,0,0,0.45)", n.style.backdropFilter = "blur(4px)", n.style.color = "var(--content-fg, #fff)", n.style.fontSize = "11px", n.style.pointerEvents = "none", n.style.display = "flex", n.style.flexDirection = "column", e.appendChild(n)), n; } catch { return null; } } -async function on() { - let e = an(); +async function ln() { + let e = cn(); if (!e) return !1; - let t = nn(e, "metrics"), n = nn(e, "auth"); + let t = on(e, "metrics"), n = on(e, "auth"); try { let [r, i] = await Promise.all([me(), se()]), a = O("runtime.unavailable", "Runtime: unavailable"); if (!r?.ok || !r?.data) t.textContent = a; @@ -445,27 +446,27 @@ async function on() { pending: c }); } - let o = rn(i?.data?.prefs || null); + let o = sn(i?.data?.prefs || null); return n.textContent = o.text, n.style.color = o.color, e.title = `${a}\n${o.text}`, !0; } catch { return t.textContent = O("runtime.unavailable", "Runtime: unavailable"), n.textContent = O("runtime.writeAuthUnknown", "Write auth: unknown"), n.style.color = "#c8ced8", e.title = `${O("runtime.unavailable", "Runtime: unavailable")}\n${n.textContent}`, !0; } } -function sn() { +function un() { try { - let e = $t(); + let e = nn(); if (e === "hidden") { - window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, tn(), en(); + window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, an(), rn(); return; } window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ || (window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ = (e) => { if (e?.detail?.key !== "observability.runtimeDashboardMode") return; - let t = $t(); - window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", tn(), en(), t !== "hidden" && sn(); - }, window.addEventListener?.("mjr-settings-changed", window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__)), window.__MJR_RUNTIME_STATUS_HIDDEN__ = !1, tn(), e === "autoHide30" && (window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = setTimeout(() => { - window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, en(); - }, Qt)), on().catch(() => {}), window.__MJR_RUNTIME_STATUS_INFLIGHT__ ?? (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1), window.__MJR_RUNTIME_STATUS_MISS_COUNT__ ?? (window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0), window.__MJR_RUNTIME_STATUS_INTERVAL__ || (window.__MJR_RUNTIME_STATUS_INTERVAL__ = setInterval(() => { - window.__MJR_RUNTIME_STATUS_INFLIGHT__ || (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !0, on().then((e) => { + let t = nn(); + window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", an(), rn(), t !== "hidden" && un(); + }, window.addEventListener?.("mjr-settings-changed", window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__)), window.__MJR_RUNTIME_STATUS_HIDDEN__ = !1, an(), e === "autoHide30" && (window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = setTimeout(() => { + window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, rn(); + }, tn)), ln().catch(() => {}), window.__MJR_RUNTIME_STATUS_INFLIGHT__ ?? (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1), window.__MJR_RUNTIME_STATUS_MISS_COUNT__ ?? (window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0), window.__MJR_RUNTIME_STATUS_INTERVAL__ || (window.__MJR_RUNTIME_STATUS_INTERVAL__ = setInterval(() => { + window.__MJR_RUNTIME_STATUS_INFLIGHT__ || (window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !0, ln().then((e) => { e ? window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0 : window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = Number(window.__MJR_RUNTIME_STATUS_MISS_COUNT__ || 0) + 1; }).catch(() => {}).finally(() => { window.__MJR_RUNTIME_STATUS_INFLIGHT__ = !1; @@ -476,8 +477,8 @@ function sn() { } } // ui/utils/debounce.ts -var cn = 300; -function ln(e, t = cn) { +var dn = 300; +function fn(e, t = dn) { let n, r = (...r) => { clearTimeout(n), n = setTimeout(() => e(...r), t); }; @@ -487,37 +488,78 @@ function ln(e, t = cn) { clearTimeout(n), e(...t); }, r; } +// ui/features/runtime/nativeAssetsTab.ts +var pn = /* @__PURE__ */ new Set([ + "assets", + "media-assets", + "assets-sidebar" +]), mn = [ + 500, + 2e3, + 6e3 +], hn = !1, gn = /* @__PURE__ */ new Map(), _n = []; +function vn(e) { + let t = String(e?.id || "").trim().toLowerCase(); + return !t || t.startsWith("majoor") || t.startsWith("mjr") ? !1 : pn.has(t); +} +function yn() { + for (let e of _n.splice(0)) clearTimeout(e); +} +function bn() { + let e = 0; + for (let t of je()) { + if (!vn(t)) continue; + let n = String(t.id); + Pe(n) && (gn.set(n, t), e += 1); + } + return e; +} +function xn() { + for (let [e, t] of [...gn.entries()]) (je().some((t) => String(t?.id || "") === e) || Oe(t)) && gn.delete(e); +} +function Sn(e) { + if (hn = !!e, yn(), !hn) xn(); + else { + bn(); + for (let e of mn) _n.push(setTimeout(() => { + hn && bn(); + }, e)); + } +} +function Cn() { + hn = !1, yn(), xn(); +} // ui/app/settings/settingsGrid.ts -var q = "Majoor", un = "Majoor Assets Manager"; -function dn(e, t, n) { +var q = "Majoor", wn = "Majoor Assets Manager"; +function Tn(e, t, n) { let r = (e, t) => [ - un, + wn, e, t ], i = (e) => [ - un, + wn, O("cat.cards", "Cards"), e ], a = (e) => [ - un, + wn, O("cat.badges", "Badges"), e ], o = (e) => [ - un, + wn, O("cat.badges", "Badges"), e ], s = (e, t) => { let n = String(e || "").trim(); return /^[0-9a-fA-F]{6}$/.test(n) && (n = `#${n}`), /^#[0-9a-fA-F]{6}$/.test(n) ? n.toUpperCase() : t; }; - t.grid?.minSizePreset || (t.grid = t.grid || {}, t.grid.minSizePreset = Kt(t.grid.minSize), G(t)), e({ + t.grid?.minSizePreset || (t.grid = t.grid || {}, t.grid.minSizePreset = Yt(t.grid.minSize), G(t)), e({ id: `${q}.Cards.ThumbSize`, category: i(O("setting.grid.cardSize.group", "Card size")), name: O("setting.grid.cardSize.name", "Majoor: Card Size"), tooltip: O("setting.grid.cardSize.desc", "Choose the card size preset used by the grid layout."), type: "combo", defaultValue: (() => { - let e = Rt(String(t.grid?.minSizePreset || "").toLowerCase(), Ht, Kt(t.grid?.minSize)), n = { + let e = Vt(String(t.grid?.minSizePreset || "").toLowerCase(), Gt, Yt(t.grid?.minSize)), n = { small: O("setting.grid.cardSize.small", "Small"), medium: O("setting.grid.cardSize.medium", "Medium"), large: O("setting.grid.cardSize.large", "Large") @@ -531,7 +573,7 @@ function dn(e, t, n) { ], onChange: (e) => { let r = String(e || "").trim().toLowerCase(), i = O("setting.grid.cardSize.small", "Small").toLowerCase(), a = O("setting.grid.cardSize.medium", "Medium").toLowerCase(), o = O("setting.grid.cardSize.large", "Large").toLowerCase(), s = "medium"; - r === i || r === "small" || r === "petit" ? s = "small" : r === o || r === "large" || r === "grand" ? s = "large" : (r === a || r === "medium" || r === "moyen") && (s = "medium"), t.grid.minSizePreset = s, t.grid.minSize = Vt[s], G(t), K(t), n("grid.minSizePreset"); + r === i || r === "small" || r === "petit" ? s = "small" : r === o || r === "large" || r === "grand" ? s = "large" : (r === a || r === "medium" || r === "moyen") && (s = "medium"), t.grid.minSizePreset = s, t.grid.minSize = Wt[s], G(t), K(t), n("grid.minSizePreset"); } }), e({ id: `${q}.Cards.CustomThumbSize`, @@ -547,7 +589,7 @@ function dn(e, t, n) { }, onChange: (e) => { let r = Math.max(60, Math.min(600, Math.round(Number(e) || 120))); - t.grid.minSize = r, t.grid.minSizePreset = Kt(r), G(t), K(t), n("grid.minSize"); + t.grid.minSize = r, t.grid.minSizePreset = Yt(r), G(t), K(t), n("grid.minSize"); } }), e({ id: `${q}.Grid.ShowDetails`, @@ -796,6 +838,16 @@ function dn(e, t, n) { onChange: (e) => { t.sidebar = t.sidebar || {}, t.sidebar.assetBadgeEnabled = !!e, G(t), K(t), n("sidebar.assetBadgeEnabled"); } + }), e({ + id: `${q}.Integration.HideNativeAssetsTab`, + category: r(O("cat.grid"), "Hide ComfyUI native Assets tab"), + name: "Hide ComfyUI's native Assets sidebar tab", + tooltip: "Optional. Removes ComfyUI's built-in Assets tab from the sidebar so only Majoor Assets Manager is shown. Turning it off restores the native tab. Your files and the native tab's data are not affected.", + type: "boolean", + defaultValue: !!t.integration?.hideNativeAssetsTab, + onChange: (e) => { + t.integration = t.integration || {}, t.integration.hideNativeAssetsTab = !!e, G(t), Sn(!!e), n("integration.hideNativeAssetsTab"); + } }), e({ id: `${q}.Sidebar.WidthPx`, category: r(O("cat.grid"), "Sidebar width"), @@ -893,15 +945,15 @@ function dn(e, t, n) { }); } // ui/app/settings/settingsViewer.ts -var fn = "Majoor", pn = "Majoor Assets Manager"; -function mn(e, n, r) { +var En = "Majoor", Dn = "Majoor Assets Manager"; +function On(e, n, r) { let a = (e, t) => [ - pn, + Dn, e, t ], o = (e) => a(O("cat.viewer", "Viewer"), e), s = (e) => a(O("cat.floatingViewer", "Floating Viewer"), e); e({ - id: `${fn}.Viewer.AllowPanAtZoom1`, + id: `${En}.Viewer.AllowPanAtZoom1`, category: o(O("setting.viewer.pan.name").replace("Majoor: ", "")), name: O("setting.viewer.pan.name"), tooltip: O("setting.viewer.pan.desc"), @@ -911,7 +963,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.allowPanAtZoom1 = !!e, G(n), K(n), r("viewer.allowPanAtZoom1"); } }), e({ - id: `${fn}.Viewer.DisableWebGL`, + id: `${En}.Viewer.DisableWebGL`, category: o("Disable WebGL Video"), name: "Disable WebGL Video", tooltip: "Use CPU rendering (Canvas 2D) for video playback. Fixes 'black screen' issues on incompatible hardware/browsers.", @@ -921,7 +973,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.disableWebGL = !!e, G(n), K(n), r("viewer.disableWebGL"); } }), e({ - id: `${fn}.Viewer.PauseDuringExecution`, + id: `${En}.Viewer.PauseDuringExecution`, category: o(O("setting.viewer.pauseExecution.name").replace("Majoor: ", "")), name: O("setting.viewer.pauseExecution.name"), tooltip: O("setting.viewer.pauseExecution.desc"), @@ -931,7 +983,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.pauseDuringExecution = !!e, G(n), K(n), r("viewer.pauseDuringExecution"); } }), e({ - id: `${fn}.Viewer.FloatingPauseDuringExecution`, + id: `${En}.Viewer.FloatingPauseDuringExecution`, category: s(O("setting.viewer.floatingPauseExecution.name").replace("Majoor: ", "")), name: O("setting.viewer.floatingPauseExecution.name"), tooltip: O("setting.viewer.floatingPauseExecution.desc"), @@ -941,7 +993,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.floatingPauseDuringExecution = !!e, G(n), K(n), r("viewer.floatingPauseDuringExecution"); } }), e({ - id: `${fn}.Browser.ShowFolders`, + id: `${En}.Browser.ShowFolders`, category: o("Browser"), name: "Show folders in Input / Output panels", tooltip: "When enabled, subdirectories under the Input and Output roots are shown as folder cards in the browser grid. Disable to see only files.", @@ -958,7 +1010,7 @@ function mn(e, n, r) { } } }), e({ - id: `${fn}.Viewer.MfvLiveDefault`, + id: `${En}.Viewer.MfvLiveDefault`, category: s(O("setting.viewer.mfvLiveDefault.name").replace("Majoor: ", "")), name: O("setting.viewer.mfvLiveDefault.name"), tooltip: O("setting.viewer.mfvLiveDefault.desc"), @@ -968,7 +1020,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvLiveDefault = !!e, G(n), K(n), r("viewer.mfvLiveDefault"); } }), e({ - id: `${fn}.Viewer.MfvPreviewDefault`, + id: `${En}.Viewer.MfvPreviewDefault`, category: s(O("setting.viewer.mfvPreviewDefault.name").replace("Majoor: ", "")), name: O("setting.viewer.mfvPreviewDefault.name"), tooltip: O("setting.viewer.mfvPreviewDefault.desc"), @@ -978,7 +1030,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvPreviewDefault = !!e, G(n), K(n), r("viewer.mfvPreviewDefault"); } }), e({ - id: `${fn}.Viewer.MfvTopbarButton`, + id: `${En}.Viewer.MfvTopbarButton`, category: s("Top bar Viewer button"), name: "Show Viewer button in the top bar", tooltip: "Show a Viewer toggle button in the ComfyUI top bar next to the queue controls. Disable to hide it (the V shortcut keeps working).", @@ -988,7 +1040,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvTopbarButton = !!e, G(n), K(n), r("viewer.mfvTopbarButton"); } }), e({ - id: `${fn}.Viewer.MfvSidebarPosition`, + id: `${En}.Viewer.MfvSidebarPosition`, category: s("Node Parameters sidebar position"), name: "Node Parameters sidebar position", tooltip: "Position of the Node Parameters sidebar in the Floating Viewer (right, left, or bottom).", @@ -1008,7 +1060,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvSidebarPosition = t, G(n), K(n), r("viewer.mfvSidebarPosition"); } }), e({ - id: `${fn}.Viewer.MfvPreviewMethod`, + id: `${En}.Viewer.MfvPreviewMethod`, category: s(O("setting.viewer.mfvPreviewMethod.name").replace("Majoor: ", "")), name: O("setting.viewer.mfvPreviewMethod.name"), tooltip: O("setting.viewer.mfvPreviewMethod.desc"), @@ -1032,7 +1084,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvPreviewMethod = t, G(n), K(n), r("viewer.mfvPreviewMethod"); } }), e({ - id: `${fn}.Viewer.MfvKjPreviewOverrideEnabled`, + id: `${En}.Viewer.MfvKjPreviewOverrideEnabled`, category: s(O("setting.viewer.mfvKjPreviewOverride.name").replace("Majoor: ", "")), name: O("setting.viewer.mfvKjPreviewOverride.name"), tooltip: O("setting.viewer.mfvKjPreviewOverride.desc"), @@ -1042,7 +1094,7 @@ function mn(e, n, r) { n.viewer = n.viewer || {}, n.viewer.mfvKjPreviewOverrideEnabled = !!e, G(n), K(n), r("viewer.mfvKjPreviewOverrideEnabled"); } }), e({ - id: `${fn}.Viewer.LtxavRgbFallback`, + id: `${En}.Viewer.LtxavRgbFallback`, category: s("LTXAV preview fallback"), name: "Majoor: LTXAV RGB Preview Fallback (experimental)", tooltip: "Reuse LTXV RGB projection for LTXAV when native latent preview is unavailable. Experimental; quality may be approximate.", @@ -1062,7 +1114,7 @@ function mn(e, n, r) { try { fe().then((e) => { if (!e?.ok) return; - let t = !!e?.data?.prefs?.enabled, i = qt(); + let t = !!e?.data?.prefs?.enabled, i = Xt(); i.viewer = i.viewer || {}, !!i.viewer.ltxavRgbFallback !== t && (i.viewer.ltxavRgbFallback = t, Object.assign(n, i), G(i), K(i), r("viewer.ltxavRgbFallback")); }).catch(() => {}); } catch (e) { @@ -1070,7 +1122,7 @@ function mn(e, n, r) { } ((t, i, a, s) => { e({ - id: `${fn}.WorkflowMinimap.${t}`, + id: `${En}.WorkflowMinimap.${t}`, category: o(O(a).replace("Majoor: ", "")), name: O(a), tooltip: O(s), @@ -1083,15 +1135,15 @@ function mn(e, n, r) { })("Enabled", "enabled", "setting.minimap.enabled.name", "setting.minimap.enabled.desc"); } // ui/app/settings/settingsScanning.ts -var hn = "Majoor", gn = "Majoor Assets Manager"; -function _n(n, i, a) { +var kn = "Majoor", An = "Majoor Assets Manager"; +function jn(n, i, a) { let o = (e, t) => [ - gn, + An, e, t ]; n({ - id: `${hn}.ExecutionGrouping.Enabled`, + id: `${kn}.ExecutionGrouping.Enabled`, category: o(O("cat.scanning"), "Execution grouping"), name: "Execution job/stack grouping", tooltip: "Enable or disable all live job_id / stack_id tracking, grouping, and stack finalization logic.", @@ -1109,7 +1161,7 @@ function _n(n, i, a) { } } }), n({ - id: `${hn}.AutoScan.OnStartup`, + id: `${kn}.AutoScan.OnStartup`, category: o(O("cat.scanning"), O("setting.scan.startup.name").replace("Majoor: ", "")), name: O("setting.scan.startup.name"), tooltip: O("setting.scan.startup.desc"), @@ -1119,7 +1171,7 @@ function _n(n, i, a) { i.autoScan = i.autoScan || {}, i.autoScan.onStartup = !!e, G(i), K(i), a("autoScan.onStartup"); } }), n({ - id: `${hn}.Scan.FastMode`, + id: `${kn}.Scan.FastMode`, category: o(O("cat.scanning"), "Scan mode"), name: "Fast scan mode", tooltip: "Use fast scan mode for manual backfill scans (skip heavier metadata work during scan).", @@ -1129,7 +1181,7 @@ function _n(n, i, a) { i.scan = i.scan || {}, i.scan.fastMode = !!e, G(i), a("scan.fastMode"); } }), n({ - id: `${hn}.Scan.JpegXL`, + id: `${kn}.Scan.JpegXL`, category: o(O("cat.scanning"), "Image formats"), name: "JPEG XL (JXL) support (Experimental)", tooltip: "Index and preview .jxl images. Preview generation requires JPEG XL support in Pillow or FFmpeg. Run a new scan after enabling.", @@ -1148,7 +1200,7 @@ function _n(n, i, a) { }), e().then((e) => { e?.ok && (i.scan = i.scan || {}, i.scan.jxlEnabled = !!e?.data?.prefs?.enabled, G(i), a("scan.jxlEnabled")); }).catch(() => {}), n({ - id: `${hn}.RtHydrate.Concurrency`, + id: `${kn}.RtHydrate.Concurrency`, category: o(O("cat.scanning"), "Hydration"), name: "Hydrate Concurrency", tooltip: "Maximum concurrent hydration requests for rating/tags.", @@ -1187,7 +1239,7 @@ function _n(n, i, a) { } }; n({ - id: `${hn}.Watcher.Enabled`, + id: `${kn}.Watcher.Enabled`, category: o(O("cat.scanning"), O("setting.watcher.enabled.label", "Enable watcher")), name: O("setting.watcher.name"), tooltip: O("setting.watcher.desc") + " (env: MJR_ENABLE_WATCHER)", @@ -1203,7 +1255,7 @@ function _n(n, i, a) { } } }), n({ - id: `${hn}.Watcher.DebounceDelay`, + id: `${kn}.Watcher.DebounceDelay`, category: o(O("cat.scanning"), O("setting.watcher.debounce.label", "Watcher debounce delay")), name: O("setting.watcher.debounce.name"), tooltip: O("setting.watcher.debounce.desc") + " (env: MJR_WATCHER_DEBOUNCE_MS)", @@ -1229,7 +1281,7 @@ function _n(n, i, a) { } } }), n({ - id: `${hn}.Watcher.DedupeWindow`, + id: `${kn}.Watcher.DedupeWindow`, category: o(O("cat.scanning"), O("setting.watcher.dedupe.label", "Watcher dedupe window")), name: O("setting.watcher.dedupe.name"), tooltip: O("setting.watcher.dedupe.desc") + " (env: MJR_WATCHER_DEDUPE_TTL_MS)", @@ -1255,7 +1307,7 @@ function _n(n, i, a) { } } }), n({ - id: `${hn}.Watcher.MaxPending`, + id: `${kn}.Watcher.MaxPending`, category: o(O("cat.scanning"), "Watcher queue"), name: "Watcher: max pending files", tooltip: "Maximum number of pending watcher files kept in memory.", @@ -1270,7 +1322,7 @@ function _n(n, i, a) { i.watcher = i.watcher || {}, i.watcher.maxPending = Math.max(10, Math.min(5e3, Math.round(U(e, 500)))), G(i), K(i), a("watcher.maxPending"); } }), n({ - id: `${hn}.Watcher.MinSize`, + id: `${kn}.Watcher.MinSize`, category: o(O("cat.scanning"), "Watcher file size"), name: "Watcher: min size (bytes)", tooltip: "Minimum file size indexed by watcher.", @@ -1285,7 +1337,7 @@ function _n(n, i, a) { i.watcher = i.watcher || {}, i.watcher.minSize = Math.max(0, Math.min(1e6, Math.round(U(e, 100)))), G(i), K(i), a("watcher.minSize"); } }), n({ - id: `${hn}.Watcher.MaxSize`, + id: `${kn}.Watcher.MaxSize`, category: o(O("cat.scanning"), "Watcher file size"), name: "Watcher: max size (bytes)", tooltip: "Maximum file size indexed by watcher.", @@ -1306,7 +1358,7 @@ function _n(n, i, a) { console.debug?.(e); } n({ - id: `${hn}.RatingTagsSync.Enabled`, + id: `${kn}.RatingTagsSync.Enabled`, category: o(O("cat.scanning"), O("setting.sync.rating.name").replace("Majoor: ", "")), name: O("setting.sync.rating.name"), tooltip: O("setting.sync.rating.desc"), @@ -1318,17 +1370,17 @@ function _n(n, i, a) { }); } // ui/app/settings/settingsFeed.ts -var vn = "Majoor", yn = "Majoor Assets Manager"; -function bn(e, t, n) { +var Mn = "Majoor", Nn = "Majoor Assets Manager"; +function Pn(e, t, n) { let r = (e) => [ - yn, + Nn, O("cat.feed", "Generated Feed"), e ], i = () => { t.feed = t.feed || {}; }; e({ - id: `${vn}.Feed.CardSize`, + id: `${Mn}.Feed.CardSize`, category: r("Card size"), name: "Feed card size (px)", tooltip: "Set the minimum card width used by the Generated Feed layout (60-600 px).", @@ -1343,7 +1395,7 @@ function bn(e, t, n) { i(), t.feed.minSize = Math.max(60, Math.min(600, Math.round(Number(e) || 120))), G(t), K(t), n("feed.minSize"); } }), e({ - id: `${vn}.Feed.ShowInfo`, + id: `${Mn}.Feed.ShowInfo`, category: r("Show info section"), name: "Show card info section", tooltip: "Show or hide the entire info section (filename, metadata, dots) below thumbnails in the Generated Feed.", @@ -1353,7 +1405,7 @@ function bn(e, t, n) { i(), t.feed.showInfo = !!e, G(t), K(t), n("feed.showInfo"); } }), e({ - id: `${vn}.Feed.ShowFilename`, + id: `${Mn}.Feed.ShowFilename`, category: r("Show filename"), name: "Show filename", tooltip: "Display the filename on feed cards.", @@ -1363,7 +1415,7 @@ function bn(e, t, n) { i(), t.feed.showFilename = !!e, G(t), K(t), n("feed.showFilename"); } }), e({ - id: `${vn}.Feed.ShowDimensions`, + id: `${Mn}.Feed.ShowDimensions`, category: r("Show dimensions"), name: "Show dimensions", tooltip: "Display resolution (WxH) and duration on feed cards.", @@ -1373,7 +1425,7 @@ function bn(e, t, n) { i(), t.feed.showDimensions = !!e, G(t), K(t), n("feed.showDimensions"); } }), e({ - id: `${vn}.Feed.ShowDate`, + id: `${Mn}.Feed.ShowDate`, category: r("Show date/time"), name: "Show date/time", tooltip: "Display date and time on feed cards.", @@ -1383,7 +1435,7 @@ function bn(e, t, n) { i(), t.feed.showDate = !!e, G(t), K(t), n("feed.showDate"); } }), e({ - id: `${vn}.Feed.ShowGenTime`, + id: `${Mn}.Feed.ShowGenTime`, category: r("Show generation time"), name: "Show generation time", tooltip: "Display the generation time badge on feed cards.", @@ -1393,7 +1445,7 @@ function bn(e, t, n) { i(), t.feed.showGenTime = !!e, G(t), K(t), n("feed.showGenTime"); } }), e({ - id: `${vn}.Feed.ShowWorkflowDot`, + id: `${Mn}.Feed.ShowWorkflowDot`, category: r("Show workflow dot"), name: "Show workflow indicator", tooltip: "Display the workflow availability dot on feed cards.", @@ -1403,7 +1455,7 @@ function bn(e, t, n) { i(), t.feed.showWorkflowDot = !!e, G(t), K(t), n("feed.showWorkflowDot"); } }), e({ - id: `${vn}.Feed.ShowExtBadge`, + id: `${Mn}.Feed.ShowExtBadge`, category: r("Show format badges"), name: "Show format badges", tooltip: "Display format badges (e.g. JPG, MP4) on feed card thumbnails.", @@ -1413,7 +1465,7 @@ function bn(e, t, n) { i(), t.feed.showExtBadge = !!e, G(t), K(t), n("feed.showExtBadge"); } }), e({ - id: `${vn}.Feed.ShowRatingBadge`, + id: `${Mn}.Feed.ShowRatingBadge`, category: r("Show rating badges"), name: "Show ratings", tooltip: "Display star ratings on feed card thumbnails.", @@ -1423,7 +1475,7 @@ function bn(e, t, n) { i(), t.feed.showRatingBadge = !!e, G(t), K(t), n("feed.showRatingBadge"); } }), e({ - id: `${vn}.Feed.ShowTagsBadge`, + id: `${Mn}.Feed.ShowTagsBadge`, category: r("Show tags badges"), name: "Show tags", tooltip: "Display tag indicators on feed card thumbnails.", @@ -1435,7 +1487,7 @@ function bn(e, t, n) { }); } // ui/app/settings/settingsSecurity.ts -var xn = "Majoor", Sn = "Majoor Assets Manager", Cn = 16, wn = { +var Fn = "Majoor", In = "Majoor Assets Manager", Ln = 16, Rn = { safeMode: !1, allowWrite: !0, allowDelete: !0, @@ -1443,54 +1495,54 @@ var xn = "Majoor", Sn = "Majoor Assets Manager", Cn = 16, wn = { allowOpenInFolder: !0, allowResetIndex: !0 }; -function Tn(e) { +function zn(e) { return !!e; } -function En(e, t) { - return Tn(e) === Tn(t); +function Bn(e, t) { + return zn(e) === zn(t); } -function Dn(e) { +function Vn(e) { return typeof e == "string" ? e.trim() : ""; } -function On(e) { +function Hn(e) { let t = String(e || "").trim().toLowerCase(); return t === "localhost" || t === "127.0.0.1" || t === "::1"; } -function kn() { +function Un() { return globalThis.location || globalThis.window?.location || null; } -function An() { - let e = kn(); +function Wn() { + let e = Un(); if (!e) return !1; let t = String(e.protocol || "").toLowerCase(), n = String(e.hostname || "").trim(); - return t === "http:" && !On(n); + return t === "http:" && !Hn(n); } -function jn(e) { +function Gn(e) { let t = globalThis.crypto; if (!t?.getRandomValues) throw Error("Secure token generation requires crypto.getRandomValues()."); return t.getRandomValues(e); } -function Mn(e) { +function Kn(e) { let t = Math.max(4, Number(e) || 0), n = new Uint8Array(t); - return jn(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); + return Gn(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); } -function Nn() { - return `mjr_${Mn(18)}`; +function qn() { + return `mjr_${Kn(18)}`; } -function Pn(e) { - return String(e?.apiToken || "").trim().length >= Cn && H(e?.allowWrite, !0) && H(e?.requireAuth, !1) && !H(e?.allowRemoteWrite, !1); +function Jn(e) { + return String(e?.apiToken || "").trim().length >= Ln && H(e?.allowWrite, !0) && H(e?.requireAuth, !1) && !H(e?.allowRemoteWrite, !1); } -function Fn(e) { +function Yn(e) { let t = String((e && typeof e == "object" ? e : {}).apiToken || "").trim(); return { - apiToken: t.length >= Cn ? t : Nn(), + apiToken: t.length >= Ln ? t : qn(), allowWrite: !0, requireAuth: !0, allowRemoteWrite: !1, - allowInsecureTokenTransport: An() + allowInsecureTokenTransport: Wn() }; } -function In(e) { +function Xn(e) { let t = e || {}; return { safe_mode: H(t.safeMode, !1), @@ -1505,44 +1557,44 @@ function In(e) { ...String(t.apiToken || "").trim() ? { api_token: String(t.apiToken || "").trim() } : {} }; } -function Ln(e) { - return y(In(e)); +function Zn(e) { + return y(Xn(e)); } -function Rn(e) { +function Qn(e) { let t = String(e?.security?.tokenHint || "").trim(); return t ? O("setting.sec.token.placeholderConfigured", "Token configured on server ({tokenHint}). Leave blank to keep the current server token.", { tokenHint: t }) : e?.security?.tokenConfigured ? O("setting.sec.token.placeholderConfiguredGeneric", "Token configured on server. Leave blank to keep the current server token.") : O("setting.sec.token.placeholder", "Auto-generated for this browser session."); } -function zn(e, n, r) { +function $n(e, n, r) { let i = (e, t) => [ - Sn, + In, e, t ]; e({ - id: `${xn}.Safety.ConfirmDeletion`, + id: `${Fn}.Safety.ConfirmDeletion`, category: i(O("cat.security"), "Confirm before deleting"), name: "Confirm before deleting", tooltip: "Show a confirmation dialog before deleting files. Disabling this allows instant deletion.", type: "boolean", defaultValue: n.safety?.confirmDeletion !== !1, onChange: (e) => { - En(n.safety?.confirmDeletion !== !1, e) || (n.safety = n.safety || {}, n.safety.confirmDeletion = !!e, G(n), K(n), r("safety.confirmDeletion")); + Bn(n.safety?.confirmDeletion !== !1, e) || (n.safety = n.safety || {}, n.safety.confirmDeletion = !!e, G(n), K(n), r("safety.confirmDeletion")); } }); let a = (t, a, o, s = "cat.security") => { e({ - id: `${xn}.Security.${t}`, + id: `${Fn}.Security.${t}`, category: i(O(s), O(a).replace("Majoor: ", "")), name: O(a), tooltip: O(o), type: "boolean", - defaultValue: H(n.security?.[t], wn[t] ?? !1), + defaultValue: H(n.security?.[t], Rn[t] ?? !1), onChange: (e) => { - if (!En(n.security?.[t], e)) { + if (!Bn(n.security?.[t], e)) { n.security = n.security || {}, n.security[t] = !!e, G(n), r(`security.${t}`); try { - Ln(n.security).then((e) => { - e?.ok && e.data?.prefs ? Jt() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e); + Zn(n.security).then((e) => { + e?.ok && e.data?.prefs ? Zt() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e); }).catch(() => {}); } catch (e) { console.debug?.(e); @@ -1552,29 +1604,29 @@ function zn(e, n, r) { }); }; a("safeMode", "setting.sec.safe.name", "setting.sec.safe.desc"), a("allowWrite", "setting.sec.write.name", "setting.sec.write.desc"), a("allowDelete", "setting.sec.del.name", "setting.sec.del.desc"), a("allowRename", "setting.sec.ren.name", "setting.sec.ren.desc"), a("allowOpenInFolder", "setting.sec.open.name", "setting.sec.open.desc"), a("allowResetIndex", "setting.sec.reset.name", "setting.sec.reset.desc"), e({ - id: `${xn}.Security.RemoteLanPreset`, + id: `${Fn}.Security.RemoteLanPreset`, category: i(O("cat.remote"), O("setting.sec.remoteLanPreset.name").replace("Majoor: ", "")), name: O("setting.sec.remoteLanPreset.name"), tooltip: O("setting.sec.remoteLanPreset.desc"), type: "boolean", - defaultValue: Pn(n.security), + defaultValue: Jn(n.security), onChange: (e) => { - if (n.security = n.security || {}, En(n.security.remoteLanPreset, e)) return; + if (n.security = n.security || {}, Bn(n.security.remoteLanPreset, e)) return; if (n.security.remoteLanPreset = !!e, !e) { G(n), r("security.remoteLanPreset"); return; } let i; try { - i = Fn(n.security); + i = Yn(n.security); } catch (e) { t(e?.message || O("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); return; } Object.assign(n.security, i), n.security.tokenConfigured = !0, n.security.tokenHint = String(i.apiToken || "").trim() ? `...${String(i.apiToken).trim().slice(-4)}` : "", i.apiToken && x(i.apiToken), G(n), r("security.remoteLanPreset"), r("security.apiToken"), r("security.allowWrite"), r("security.requireAuth"), r("security.allowRemoteWrite"), r("security.allowInsecureTokenTransport"); try { - Ln(n.security).then((e) => { - e?.ok && e.data?.prefs ? (Jt(), t(O("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (t(e.error || O("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"), console.warn("[Majoor] backend remote LAN preset update failed", e.error || e)); + Zn(n.security).then((e) => { + e?.ok && e.data?.prefs ? (Zt(), t(O("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (t(e.error || O("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"), console.warn("[Majoor] backend remote LAN preset update failed", e.error || e)); }).catch((e) => { t(e?.message || O("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); }); @@ -1583,19 +1635,19 @@ function zn(e, n, r) { } } }), e({ - id: `${xn}.Security.ApiToken`, + id: `${Fn}.Security.ApiToken`, category: i(O("cat.remote"), O("setting.sec.token.name").replace("Majoor: ", "")), name: O("setting.sec.token.name", "Majoor: API Token"), tooltip: O("setting.sec.token.desc", "Store the API token used for write operations. Majoor sends it via X-MJR-Token and Authorization headers."), type: "text", defaultValue: n.security?.apiToken || "", - attrs: { placeholder: Rn(n) }, + attrs: { placeholder: Qn(n) }, onChange: (e) => { n.security = n.security || {}; - let t = Dn(e); - if (Dn(n.security.apiToken) !== t && (n.security.apiToken = t, n.security.apiToken && (n.security.tokenConfigured = !0, n.security.tokenHint = `...${n.security.apiToken.slice(-4)}`, x(n.security.apiToken)), G(n), r("security.apiToken"), n.security.apiToken)) try { + let t = Vn(e); + if (Vn(n.security.apiToken) !== t && (n.security.apiToken = t, n.security.apiToken && (n.security.tokenConfigured = !0, n.security.tokenHint = `...${n.security.apiToken.slice(-4)}`, x(n.security.apiToken)), G(n), r("security.apiToken"), n.security.apiToken)) try { y({ api_token: n.security.apiToken }).then((e) => { - e?.ok && e.data?.prefs ? Jt() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e); + e?.ok && e.data?.prefs ? Zt() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e); }).catch(() => {}); } catch (e) { console.debug?.(e); @@ -1604,10 +1656,10 @@ function zn(e, n, r) { }), a("requireAuth", "setting.sec.requireAuth.name", "setting.sec.requireAuth.desc", "cat.remote"), a("allowRemoteWrite", "setting.sec.remote.name", "setting.sec.remote.desc", "cat.remote"), a("allowInsecureTokenTransport", "setting.sec.insecureTransport.name", "setting.sec.insecureTransport.desc", "cat.remote"); } // ui/app/settings/settingsAdvanced.ts -var J = "Majoor", Bn = "Majoor Assets Manager"; -function Vn(e, r, i, c) { +var J = "Majoor", er = "Majoor Assets Manager"; +function tr(e, r, i, c) { let l = (e, t) => [ - Bn, + er, e, t ], u = String(r.paths?.outputDirectory || ""), d = null, p = 0, h = null; @@ -1794,17 +1846,17 @@ function Vn(e, r, i, c) { } catch (e) { console.debug?.(e); } - let fe = Le().map((e) => e.code), pe = ["auto", ...fe]; + let fe = Ve().map((e) => e.code), pe = ["auto", ...fe]; e({ id: `${J}.Language`, category: l(O("cat.advanced"), O("setting.language.name", "Language")), name: O("setting.language.name", "Majoor: Language"), tooltip: "Use auto to detect and follow ComfyUI language. Or choose a fixed language for Majoor only.", type: "combo", - defaultValue: r.i18n?.followComfyLanguage ? "auto" : Me(), + defaultValue: r.i18n?.followComfyLanguage ? "auto" : Fe(), options: pe, onChange: (e) => { - r.i18n = r.i18n || {}, e === "auto" ? (r.i18n.followComfyLanguage = !0, Ne(!0), Ve(c), G(r), i("language")) : fe.includes(e) && (r.i18n.followComfyLanguage = !1, Ne(!1), Pe(e), G(r), i("language")); + r.i18n = r.i18n || {}, e === "auto" ? (r.i18n.followComfyLanguage = !0, Ie(!0), We(c), G(r), i("language")) : fe.includes(e) && (r.i18n.followComfyLanguage = !1, Ie(!1), Le(e), G(r), i("language")); } }), e({ id: `${J}.ProbeBackend.Mode`, @@ -1820,7 +1872,7 @@ function Vn(e, r, i, c) { "both" ], onChange: (e) => { - let t = Rt(e, [ + let t = Vt(e, [ "auto", "exiftool", "ffprobe", @@ -1948,7 +2000,7 @@ function Vn(e, r, i, c) { "hidden" ], onChange: (e) => { - let t = Rt(e, [ + let t = Vt(e, [ "autoHide30", "always", "hidden" @@ -2238,15 +2290,15 @@ function Vn(e, r, i, c) { }); } // ui/app/settings/settingsSearch.ts -var Hn = "Majoor", Un = "Majoor Assets Manager"; -function Wn(e, n, r) { +var nr = "Majoor", rr = "Majoor Assets Manager"; +function ir(e, n, r) { let i = (e, t) => [ - Un, + rr, e, t ]; e({ - id: `${Hn}.AI.VectorSearchEnabled`, + id: `${nr}.AI.VectorSearchEnabled`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.enabled.name", "Enable AI semantic search"), tooltip: O("setting.ai.vector.enabled.desc", "Enable/disable AI vector search features (SigLIP2/X-CLIP: description search, prompt alignment, AI tag suggestions, smart collections)."), @@ -2268,7 +2320,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorCaptionOnIndex`, + id: `${nr}.AI.VectorCaptionOnIndex`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.captionOnIndex.name", "Generate AI captions during indexing"), tooltip: O("setting.ai.vector.captionOnIndex.desc", "Allow automatic vector indexing and backfill to run Florence-2 captions for image assets. This is slower and can use significant VRAM/CPU; leave it off for faster grid startup."), @@ -2290,7 +2342,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorIndexOnScan`, + id: `${nr}.AI.VectorIndexOnScan`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.indexOnScan.name", "Index vectors during scans"), tooltip: O("setting.ai.vector.indexOnScan.desc", "Compute SigLIP/X-CLIP embeddings while assets are scanned. Disable to avoid surprise VRAM use; run vector backfill manually when needed."), @@ -2312,7 +2364,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorConcurrency`, + id: `${nr}.AI.VectorConcurrency`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.concurrency.name", "Vector indexing concurrency"), tooltip: O("setting.ai.vector.concurrency.desc", "Maximum concurrent vector embedding workers. Use 1 to minimize transient VRAM spikes."), @@ -2335,7 +2387,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorUnloadAfterUse`, + id: `${nr}.AI.VectorUnloadAfterUse`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.unloadAfterUse.name", "Unload AI models after use"), tooltip: O("setting.ai.vector.unloadAfterUse.desc", "Unload Majoor SigLIP/X-CLIP/Florence models after heavy AI actions and call torch CUDA cache cleanup. This frees VRAM but makes the next AI action slower."), @@ -2357,7 +2409,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.AI.VectorUnloadNow`, + id: `${nr}.AI.VectorUnloadNow`, category: i(O("cat.search", "Search"), "AI"), name: O("setting.ai.vector.unloadNow.name", "Memory purge now"), tooltip: O("setting.ai.vector.unloadNow.desc", "Immediately unload Majoor AI vector/caption models, ask ComfyUI to unload loaded models, and clear torch CUDA cache when idle."), @@ -2373,7 +2425,7 @@ function Wn(e, n, r) { } } }), e({ - id: `${Hn}.Search.MaxResults`, + id: `${nr}.Search.MaxResults`, category: i(O("cat.search", "Search")), name: O("setting.search.maxResults.name", "Max search results (client)"), tooltip: O("setting.search.maxResults.desc", "Maximum number of results requested per search. The backend still enforces MAJOOR_SEARCH_MAX_LIMIT; increase that env var if you need a higher hard cap."), @@ -2388,7 +2440,7 @@ function Wn(e, n, r) { n.search = n.search || {}, n.search.maxResults = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Number(e) || A.SEARCH_DEFAULT_LIMIT)), G(n), K(n), r("search.maxResults"); } }), e({ - id: `${Hn}.EnvVars.Reference`, + id: `${nr}.EnvVars.Reference`, category: i(O("cat.advanced"), "Environment variables"), name: "Environment variables reference", tooltip: "Set these env vars before starting ComfyUI to override defaults:\n\nMAJOOR_OUTPUT_DIRECTORY - Override output root directory\nMAJOOR_EXIFTOOL_PATH - Path to exiftool binary\nMAJOOR_FFPROBE_PATH - Path to ffprobe binary\nMAJOOR_MEDIA_PROBE_BACKEND - Probe mode: auto|exiftool|ffprobe|both\nMAJOOR_EXIFTOOL_TIMEOUT - ExifTool timeout in seconds (default: 15)\nMAJOOR_FFPROBE_TIMEOUT - FFprobe timeout in seconds (default: 10)\nMAJOOR_DB_TIMEOUT - Database timeout in seconds (default: 30)\nMAJOOR_DB_MAX_CONNECTIONS - Max DB connections (default: 8)\nMAJOOR_METADATA_CACHE_MAX - Metadata cache max entries (default: 100000)\nMAJOOR_METADATA_EXTRACT_CONCURRENCY - Parallel metadata workers (default: 1)\nMJR_ENABLE_WATCHER - Enable file watcher: 1|0 (default: 1)\nMJR_WATCHER_DEBOUNCE_MS - Watcher debounce delay in ms (default: 3000)\nMJR_WATCHER_DEDUPE_TTL_MS - Watcher dedupe window in ms (default: 3000)\nMJR_WATCHER_MAX_FILE_SIZE_BYTES - Max file size to index (default: 512MB)\nMJR_WATCHER_FLUSH_MAX_FILES - Max files per flush batch (default: 256)\nMJR_WATCHER_PENDING_MAX - Max pending watcher queue (default: 5000)\nMJR_AM_ENABLE_VECTOR_SEARCH - Enable AI vector/semantic search: 1|0 (default: 1)\nMJR_AM_VECTOR_INDEX_ON_SCAN - Compute vectors during scans: 1|0 (default: 0)\nMJR_AM_VECTOR_CAPTION_ON_INDEX - Generate Florence captions during vector indexing: 1|0 (default: 0)\nMJR_VECTOR_CONCURRENCY - Concurrent vector workers (default: 2, use 1 for lower VRAM spikes)\nMJR_AM_VECTOR_UNLOAD_AFTER_USE - Unload Majoor AI models after heavy vector actions: 1|0 (default: 0)\nMAJOOR_SEARCH_MAX_LIMIT - Max search results (default: 500)\nMAJOOR_BG_SCAN_ON_LIST - Scan on directory list: 0|1 (default: 0)", @@ -2397,7 +2449,7 @@ function Wn(e, n, r) { }); } // ui/app/settings/SettingsPanel.ts -var Gn = "Majoor Assets Manager", Kn = /^\s*Majoor:\s*/i, qn = Object.freeze({ +var ar = "Majoor Assets Manager", or = /^\s*Majoor:\s*/i, sr = Object.freeze({ ASSETS_PANEL: "Assets Panel", GENERATED_FEED: "Generated Feed", VIEWER: "Viewer & Floating Viewer", @@ -2406,7 +2458,7 @@ var Gn = "Majoor Assets Manager", Kn = /^\s*Majoor:\s*/i, qn = Object.freeze({ GENERAL: "General", ADVANCED: "Advanced", SECURITY: "Security" -}), Jn = /* @__PURE__ */ new Set([ +}), cr = /* @__PURE__ */ new Set([ "grid.starColor", "grid.badgeImageColor", "grid.badgeVideoColor", @@ -2417,70 +2469,70 @@ var Gn = "Majoor Assets Manager", Kn = /^\s*Majoor:\s*/i, qn = Object.freeze({ "ui.cardSelectionColor", "ui.ratingColor", "ui.tagColor" -]), Yn = "Majoor.General.ResetAllSettings", Xn = "mjr-settings-reset-btn", Zn = null, Qn = null; -function $n(e) { +]), lr = "Majoor.General.ResetAllSettings", ur = "mjr-settings-reset-btn", dr = null, fr = null; +function pr(e) { let t = String(e || "").trim(); - return !t || t === Yn || t === "Majoor.Language" ? qn.GENERAL : /^Majoor\.(Safety|Security)\./.test(t) ? qn.SECURITY : /^Majoor\.(Paths|Db|ProbeBackend|MetadataFallback|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" ? qn.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? qn.VIEWER : /^Majoor\.Feed\./.test(t) ? qn.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) || t === "Majoor.RtHydrate.Concurrency" ? qn.INDEXING : /^Majoor\.AI\.(HuggingFaceTokenVisible|HuggingFaceToken|VerboseLogs|VectorStats|VectorBackfillAction|VectorSearchEnabled|VectorCaptionOnIndex|VectorIndexOnScan|VectorConcurrency|VectorUnloadAfterUse|VectorUnloadNow)$/.test(t) || /^Majoor\.Search\./.test(t) ? qn.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? qn.ASSETS_PANEL : qn.GENERAL; + return !t || t === lr || t === "Majoor.Language" ? sr.GENERAL : /^Majoor\.(Safety|Security)\./.test(t) ? sr.SECURITY : /^Majoor\.(Paths|Db|ProbeBackend|MetadataFallback|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" ? sr.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? sr.VIEWER : /^Majoor\.Feed\./.test(t) ? sr.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) || t === "Majoor.RtHydrate.Concurrency" ? sr.INDEXING : /^Majoor\.AI\.(HuggingFaceTokenVisible|HuggingFaceToken|VerboseLogs|VectorStats|VectorBackfillAction|VectorSearchEnabled|VectorCaptionOnIndex|VectorIndexOnScan|VectorConcurrency|VectorUnloadAfterUse|VectorUnloadNow)$/.test(t) || /^Majoor\.Search\./.test(t) ? sr.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? sr.ASSETS_PANEL : sr.GENERAL; } -function er(e) { - let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = $n(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(Kn, "").trim(); +function mr(e) { + let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = pr(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(or, "").trim(); return [ - Gn, + ar, n, i || r || a || n ]; } -var tr = !1, nr = null, rr = null, ir = !1, ar = /* @__PURE__ */ new Set(); -function or(e) { +var hr = !1, gr = null, _r = null, vr = !1, yr = /* @__PURE__ */ new Set(); +function br(e) { if (!e || typeof e != "object") return null; let t = { ...e }; try { - typeof t.name == "string" && (t.name = t.name.replace(Kn, "").trim()); + typeof t.name == "string" && (t.name = t.name.replace(or, "").trim()); } catch (e) { console.debug?.(e); } try { - t.category = er(t); + t.category = mr(t); } catch { - t.category = [Gn, qn.GENERAL]; + t.category = [ar, sr.GENERAL]; } return !t.tooltip && typeof t.name == "string" && t.name.trim() && (t.tooltip = t.name.trim()), t; } -function sr(e, t, n) { +function xr(e, t, n) { let r = String(t?.id || "").trim(); - if (!r || ar.has(r)) return !1; - ar.add(r); + if (!r || yr.has(r)) return !1; + yr.add(r); try { return ke(e, r, n); } finally { - ar.delete(r); + yr.delete(r); } } -function cr(e, t) { +function Sr(e, t) { if (!t || typeof t != "object") return t; let n = { ...t }; - sr(e, n, n.defaultValue); + xr(e, n, n.defaultValue); let r = n.onChange; return n.onChange = (t, ...i) => { - if (sr(e, n, t), typeof r == "function") return r(t, ...i); + if (xr(e, n, t), typeof r == "function") return r(t, ...i); n.defaultValue = t; }, n; } -function lr(e) { +function Cr(e) { try { return JSON.parse(JSON.stringify(e || {})); } catch { return { ...W }; } } -function ur(e, t, n, { wrapForComfy: r = !0 } = {}) { +function wr(e, t, n, { wrapForComfy: r = !0 } = {}) { let i = [], a = (e) => { - let n = or(e); - n && i.push(r ? cr(t, n) : n); + let n = br(e); + n && i.push(r ? Sr(t, n) : n); }; - return dn(a, e, n), bn(a, e, n), mn(a, e, n), _n(a, e, n), zn(a, e, n), Vn(a, e, n, t), Wn(a, e, n), i; + return Tn(a, e, n), Pn(a, e, n), On(a, e, n), jn(a, e, n), $n(a, e, n), tr(a, e, n, t), ir(a, e, n), i; } -function dr(e, t) { +function Tr(e, t) { if (e === t) return !0; try { return JSON.stringify(e) === JSON.stringify(t); @@ -2488,97 +2540,97 @@ function dr(e, t) { return !1; } } -function fr(e) { +function Er(e) { return e ? e.querySelector(".form-input") || e.querySelector(".p-inputgroup") || e.querySelector(".setting-input") || e.querySelector("[class*='input']") : null; } -function pr(e, t) { +function Dr(e, t) { let n = document.createElement("button"); - return n.type = "button", n.className = Xn, n.textContent = e, n.title = t, n.style.marginLeft = "8px", n.style.minWidth = e.length > 2 ? "auto" : "24px", n.style.height = "24px", n.style.padding = e.length > 2 ? "0 10px" : "0", n.style.borderRadius = "6px", n.style.border = "1px solid var(--border-color, #555)", n.style.background = "var(--comfy-input-bg, #2b2b2b)", n.style.color = "var(--input-text, inherit)", n.style.cursor = "pointer", n.style.fontSize = "12px", n.style.lineHeight = "22px", n.style.flexShrink = "0", n; + return n.type = "button", n.className = ur, n.textContent = e, n.title = t, n.style.marginLeft = "8px", n.style.minWidth = e.length > 2 ? "auto" : "24px", n.style.height = "24px", n.style.padding = e.length > 2 ? "0 10px" : "0", n.style.borderRadius = "6px", n.style.border = "1px solid var(--border-color, #555)", n.style.background = "var(--comfy-input-bg, #2b2b2b)", n.style.color = "var(--input-text, inherit)", n.style.cursor = "pointer", n.style.fontSize = "12px", n.style.lineHeight = "22px", n.style.flexShrink = "0", n; } -function mr(e, t, n) { - String(e?.id || "").trim() && (sr(n, e, t), typeof e?.onChange == "function" && e.onChange(t)); +function Or(e, t, n) { + String(e?.id || "").trim() && (xr(n, e, t), typeof e?.onChange == "function" && e.onChange(t)); } -function hr(e, t, n, r) { - let i = !dr(Ae(r, t.id, t.defaultValue), n); +function kr(e, t, n, r) { + let i = !Tr(Ae(r, t.id, t.defaultValue), n); e.disabled = !i, e.style.opacity = i ? "1" : "0.45"; } -function gr() { - if (typeof document > "u" || !Qn) return; - let { app: e, definitions: t, defaultValues: n } = Qn, r = document.querySelector(`[data-setting-id="${Yn}"]`), i = fr(r); +function Ar() { + if (typeof document > "u" || !fr) return; + let { app: e, definitions: t, defaultValues: n } = fr, r = document.querySelector(`[data-setting-id="${lr}"]`), i = Er(r); if (r && i && !r.getAttribute("data-mjr-reset-injected")) { r.setAttribute("data-mjr-reset-injected", "true"), i.innerHTML = ""; - let a = pr("Reset all settings", "Reset all Majoor settings to defaults"); + let a = Dr("Reset all settings", "Reset all Majoor settings to defaults"); a.onclick = (r) => { r.preventDefault(), r.stopPropagation(); - for (let r of t) r.id !== Yn && n.has(r.id) && mr(r, n.get(r.id), e); - gr(); + for (let r of t) r.id !== lr && n.has(r.id) && Or(r, n.get(r.id), e); + Ar(); }, i.appendChild(a); } for (let r of t) { - if (!r?.id || r.id === Yn || !n.has(r.id)) continue; + if (!r?.id || r.id === lr || !n.has(r.id)) continue; let t = document.querySelector(`[data-setting-id="${r.id}"]`); if (!t || t.getAttribute("data-mjr-reset-injected")) continue; - let i = fr(t); + let i = Er(t); if (!i) continue; t.setAttribute("data-mjr-reset-injected", "true"); - let a = pr("Reset", "Reset this setting to default"); - hr(a, r, n.get(r.id), e), a.onclick = (t) => { + let a = Dr("Reset", "Reset this setting to default"); + kr(a, r, n.get(r.id), e), a.onclick = (t) => { t.preventDefault(), t.stopPropagation(); let i = n.get(r.id); - mr(r, i, e), hr(a, r, i, e); + Or(r, i, e), kr(a, r, i, e); }, i.appendChild(a); } } -function _r(e, t, n) { - typeof document < "u" && typeof MutationObserver < "u" && (Qn = { +function jr(e, t, n) { + typeof document < "u" && typeof MutationObserver < "u" && (fr = { app: e, definitions: t, - defaultValues: new Map(n.filter((e) => e?.id && e.id !== Yn).map((e) => [e.id, e.defaultValue])) - }, gr(), !Zn && (Zn = new MutationObserver(() => gr()), Zn.observe(document.body, { + defaultValues: new Map(n.filter((e) => e?.id && e.id !== lr).map((e) => [e.id, e.defaultValue])) + }, Ar(), !dr && (dr = new MutationObserver(() => Ar()), dr.observe(document.body, { childList: !0, subtree: !0 }))); } -function vr(e, t, { initRuntime: n = !1 } = {}) { - if (rr) typeof t == "function" && rr.onAppliedListeners.add(t), e && !rr.app && (rr.app = e); +function Mr(e, t, { initRuntime: n = !1 } = {}) { + if (_r) typeof t == "function" && _r.onAppliedListeners.add(t), e && !_r.app && (_r.app = e); else { - let n = qt(); - n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? Ne(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, Ne(!0), G(n)); + let n = Xt(); + n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? Ie(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, Ie(!0), G(n)); let r = /* @__PURE__ */ new Set(); typeof t == "function" && r.add(t); let i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = () => { if (!i.size) return; let e = Array.from(i); i.clear(); - for (let t of e) qe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + for (let t of e) Xe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); }, s = () => { if (!a.size) return; let e = Array.from(a); a.clear(); - for (let t of e) qe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); - }, c = ln(o, 120), l = ln(s, 450), u = (e) => { + for (let t of e) Xe("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + }, c = fn(o, 120), l = fn(s, 450), u = (e) => { typeof e == "string" && i.add(e), c(); }, d = (e) => { typeof e == "string" && a.add(e), l(); }, f = () => { - let e = qt(); + let e = Xt(); Object.assign(n, e), K(n), u("storage"); }, p = (e) => { e && e.key === "mjrSettings" && e.newValue !== e.oldValue && f(); }; - if (!tr) { - if (nr && typeof window < "u") try { - window.removeEventListener("storage", nr); + if (!hr) { + if (gr && typeof window < "u") try { + window.removeEventListener("storage", gr); } catch (e) { console.debug?.(e); } try { - window.addEventListener("storage", p), tr = !0, nr = p; + window.addEventListener("storage", p), hr = !0, gr = p; } catch (e) { console.debug?.(e); } } - rr = { + _r = { app: e, notifyApplied: (e) => { for (let t of r) try { @@ -2586,47 +2638,47 @@ function vr(e, t, { initRuntime: n = !1 } = {}) { } catch (e) { console.debug?.(e); } - Jn.has(String(e || "")) ? d(e) : u(e); + cr.has(String(e || "")) ? d(e) : u(e); }, onAppliedListeners: r, refreshFromStorage: f, settings: n }; } - if (n && !ir) { - let t = e || rr.app, n = rr.settings; - Ve(t), K(n), Re(t), Jt(), Yt(), Xt(), n?.watcher && typeof n.watcher.enabled == "boolean" && r(!!n.watcher.enabled).catch(() => {}), sn(), ir = !0; + if (n && !vr) { + let t = e || _r.app, n = _r.settings; + We(t), K(n), He(t), Zt(), Qt(), $t(), n?.watcher && typeof n.watcher.enabled == "boolean" && r(!!n.watcher.enabled).catch(() => {}), un(), vr = !0; } - return rr; + return _r; } -var yr = (e, t) => vr(e, t, { initRuntime: !0 }).settings, br = (e, t) => { - let n = vr(e, t, { initRuntime: !1 }); - Object.assign(n.settings, qt()); - let r = e || n.app, i = ur(n.settings, r, n.notifyApplied), a = ur(lr(W), r, () => {}, { wrapForComfy: !1 }); - return i.unshift(cr(r, { - id: Yn, +var Nr = (e, t) => Mr(e, t, { initRuntime: !0 }).settings, Pr = (e, t) => { + let n = Mr(e, t, { initRuntime: !1 }); + Object.assign(n.settings, Xt()); + let r = e || n.app, i = wr(n.settings, r, n.notifyApplied), a = wr(Cr(W), r, () => {}, { wrapForComfy: !1 }); + return i.unshift(Sr(r, { + id: lr, category: [ - Gn, - qn.GENERAL, + ar, + sr.GENERAL, "Reset" ], name: "Reset all settings to defaults", tooltip: "Reset every Majoor Assets Manager setting to its default value.", type: "text", defaultValue: "" - })), _r(r, i, a), i; + })), jr(r, i, a), i; }; try { - let e = qt(); + let e = Xt(); e?.watcher && typeof e.watcher.enabled == "boolean" && Te().then((e) => { - let t = !!e?.ok && !!e?.data?.enabled, n = qt(); - n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, G(n), qe("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); + let t = !!e?.ok && !!e?.data?.enabled, n = Xt(); + n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, G(n), Xe("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); }).catch(() => {}); } catch (e) { console.debug?.(e); } // ui/features/contextmenu/gridContextMenuState.ts -function xr() { +function Fr() { return { open: !1, x: 0, @@ -2635,11 +2687,11 @@ function xr() { title: "" }; } -var Y = bt({ +var Y = Ct({ portalOwnerId: "", mountedPortalIds: [], - main: xr(), - submenu: xr(), + main: Fr(), + submenu: Fr(), tags: { open: !1, x: 0, @@ -2647,51 +2699,51 @@ var Y = bt({ asset: null, onChanged: null } -}), Sr = 1; -function Cr(e) { +}), Ir = 1; +function Lr(e) { e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = ""); } -function wr(e = "") { +function Rr(e = "") { try { window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } })); } catch (e) { console.debug?.(e); } } -function Tr() { - let e = `mjr-grid-context-menu-portal-${Sr++}`; +function zr() { + let e = `mjr-grid-context-menu-portal-${Ir++}`; return Y.mountedPortalIds.push(e), Y.portalOwnerId ||= e, e; } -function Er(e) { +function Br(e) { let t = Y.mountedPortalIds.filter((t) => t !== e); Y.mountedPortalIds.splice(0, Y.mountedPortalIds.length, ...t), Y.portalOwnerId === e && (Y.portalOwnerId = Y.mountedPortalIds[0] || ""); } -function Dr(e) { +function Vr(e) { return String(Y.portalOwnerId || "") === String(e || ""); } -function Or({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - wr("grid"), Nr(), jr(), Y.main.open = !0, Y.main.x = Number(e) || 0, Y.main.y = Number(t) || 0, Y.main.items = Array.isArray(n) ? n.filter(Boolean) : [], Y.main.title = String(r || ""); +function Hr({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { + Rr("grid"), qr(), Gr(), Y.main.open = !0, Y.main.x = Number(e) || 0, Y.main.y = Number(t) || 0, Y.main.items = Array.isArray(n) ? n.filter(Boolean) : [], Y.main.title = String(r || ""); } -function kr() { - Cr(Y.main), jr(); +function Ur() { + Lr(Y.main), Gr(); } -function Ar({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { +function Wr({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { Y.submenu.open = !0, Y.submenu.x = Number(e) || 0, Y.submenu.y = Number(t) || 0, Y.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], Y.submenu.title = String(r || ""); } -function jr() { - Cr(Y.submenu); +function Gr() { + Lr(Y.submenu); } -function Mr({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { - kr(), Y.tags.open = !!n, Y.tags.x = Number(e) || 0, Y.tags.y = Number(t) || 0, Y.tags.asset = n || null, Y.tags.onChanged = typeof r == "function" ? r : null; +function Kr({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { + Ur(), Y.tags.open = !!n, Y.tags.x = Number(e) || 0, Y.tags.y = Number(t) || 0, Y.tags.asset = n || null, Y.tags.onChanged = typeof r == "function" ? r : null; } -function Nr() { +function qr() { Y.tags.open = !1, Y.tags.x = 0, Y.tags.y = 0, Y.tags.asset = null, Y.tags.onChanged = null; } -function Pr() { - kr(), Nr(); +function Jr() { + Ur(), qr(); } // ui/features/dnd/utils/constants.ts -var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "application/x-comfy-asset-info", Rr = /* @__PURE__ */ new Set([ +var Yr = "application/x-mjr-asset", Xr = "application/x-mjr-assets", Zr = "application/x-comfy-asset-info", Qr = /* @__PURE__ */ new Set([ ".png", ".jpg", ".jpeg", @@ -2702,14 +2754,14 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli ".tiff", ".avif", ".jxl" -]), zr = /* @__PURE__ */ new Set([ +]), $r = /* @__PURE__ */ new Set([ ".mp4", ".mov", ".mkv", ".webm", ".avi", ".m4v" -]), Br = /* @__PURE__ */ new Set([ +]), ei = /* @__PURE__ */ new Set([ ".wav", ".mp3", ".flac", @@ -2717,7 +2769,7 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli ".m4a", ".aac", ".opus" -]), Vr = /* @__PURE__ */ new Set([ +]), ti = /* @__PURE__ */ new Set([ ".obj", ".fbx", ".glb", @@ -2727,23 +2779,23 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli ".splat", ".ksplat", ".spz" -]), Hr = (e) => { +]), ni = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); - return t !== -1 && Rr.has(e.slice(t).toLowerCase()); -}, Ur = (e) => e ? String(e.kind || "").toLowerCase() === "image" || Hr(e.filename) : !1, Wr = (e) => { + return t !== -1 && Qr.has(e.slice(t).toLowerCase()); +}, ri = (e) => e ? String(e.kind || "").toLowerCase() === "image" || ni(e.filename) : !1, ii = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); - return t !== -1 && zr.has(e.slice(t).toLowerCase()); -}, Gr = (e) => e ? String(e.kind || "").toLowerCase() === "video" || Wr(e.filename) : !1, Kr = (e) => { + return t !== -1 && $r.has(e.slice(t).toLowerCase()); +}, ai = (e) => e ? String(e.kind || "").toLowerCase() === "video" || ii(e.filename) : !1, oi = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); - return t !== -1 && Br.has(e.slice(t).toLowerCase()); -}, qr = (e) => e ? String(e.kind || "").toLowerCase() === "audio" || Kr(e.filename) : !1, Jr = (e) => { + return t !== -1 && ei.has(e.slice(t).toLowerCase()); +}, si = (e) => e ? String(e.kind || "").toLowerCase() === "audio" || oi(e.filename) : !1, ci = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); - return t !== -1 && Vr.has(e.slice(t).toLowerCase()); -}, Yr = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" || Jr(e.filename) : !1, Xr = (e) => Ur(e) || Gr(e) || qr(e) || Yr(e) || String(e?.kind || "").toLowerCase() === "workflow", Zr = { + return t !== -1 && ti.has(e.slice(t).toLowerCase()); +}, li = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" || ci(e.filename) : !1, ui = (e) => ri(e) || ai(e) || si(e) || li(e) || String(e?.kind || "").toLowerCase() === "workflow", di = { mp4: "video/mp4", mov: "video/quicktime", webm: "video/webm", @@ -2753,45 +2805,45 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli obj: "model/obj", stl: "model/stl", ply: "application/ply" -}, Qr = (e) => Zr[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", $r = (e, t) => { +}, fi = (e) => di[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", pi = (e, t) => { if (typeof e != "string") return !1; let n = e.trim().toLowerCase(); if (!n) return !1; let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : zr.has(`.${r}`) : !1; -}, ei = (e, t, n) => { + return r ? t && r === String(t).toLowerCase() ? !0 : $r.has(`.${r}`) : !1; +}, mi = (e, t, n) => { if (!e || e.type !== "combo" || !e.options) return !1; let r = Array.isArray(e.options.values) && e.options.values || e.options.values && Array.isArray(e.options.values.values) && e.options.values.values || null; return Array.isArray(r) ? r.some((e) => n(typeof e == "string" ? e : e?.content ?? e?.value ?? e?.text, t)) : !1; -}, ti = (e, t) => ei(e, t, $r), ni = (e, t) => { +}, hi = (e, t) => mi(e, t, pi), gi = (e, t) => { if (typeof e != "string") return !1; let n = e.trim().toLowerCase(); if (!n) return !1; let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : Rr.has(`.${r}`) : !1; -}, ri = (e, t) => ei(e, t, ni), ii = (e, t) => { + return r ? t && r === String(t).toLowerCase() ? !0 : Qr.has(`.${r}`) : !1; +}, _i = (e, t) => mi(e, t, gi), vi = (e, t) => { if (typeof e != "string") return !1; let n = e.trim().toLowerCase(); if (!n) return !1; let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : Br.has(`.${r}`) : !1; -}, ai = (e, t) => ei(e, t, ii), oi = (e, t) => { + return r ? t && r === String(t).toLowerCase() ? !0 : ei.has(`.${r}`) : !1; +}, yi = (e, t) => mi(e, t, vi), bi = (e, t) => { if (typeof e != "string") return !1; let n = e.trim().toLowerCase(); if (!n) return !1; let r = (n.split(/[?#]/)[0].split(".").pop() || "").toLowerCase(); - return r ? t && r === String(t).toLowerCase() ? !0 : Vr.has(`.${r}`) : !1; -}, si = (e, t) => ei(e, t, oi), ci = /* @__PURE__ */ new WeakMap(), li = (e) => { + return r ? t && r === String(t).toLowerCase() ? !0 : ti.has(`.${r}`) : !1; +}, xi = (e, t) => mi(e, t, bi), Si = /* @__PURE__ */ new WeakMap(), Ci = (e) => { if (!e || typeof e != "object") return { node: null, prev: null }; - let t = ci.get(e); + let t = Si.get(e); return t || (t = { node: null, prev: null - }, ci.set(e, t)), t; -}, ui = (e, t, n) => { + }, Si.set(e, t)), t; +}, wi = (e, t, n) => { let r = e?.canvas?.canvas || document.querySelector("canvas"), i = e?.canvas?.graph, a = e?.canvas?.ds; if (!r || !i || !a) return null; let o = r.getBoundingClientRect(); @@ -2806,14 +2858,14 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli if (t.flags && t.flags.collapsed && (r = 30), d >= t.pos[0] && f >= t.pos[1] && d <= t.pos[0] + n && f <= t.pos[1] + r) return t; } return null; -}, di = (e, t, n) => { - let r = li(e); - t && r.node !== t && (fi(e, n), r.node = t, r.prev = { +}, Ti = (e, t, n) => { + let r = Ci(e); + t && r.node !== t && (Ei(e, n), r.node = t, r.prev = { color: t.color, bgcolor: t.bgcolor }, t.bgcolor = "#3355ff", t.color = "#a9c4ff", n(e)); -}, fi = (e, t) => { - let n = li(e); +}, Ei = (e, t) => { + let n = Ci(e); if (n.node) { try { n.prev && (n.node.color = n.prev.color, n.node.bgcolor = n.prev.bgcolor); @@ -2822,7 +2874,7 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli } n.node = null, n.prev = null, t(e); } -}, pi = (e, t) => { +}, Di = (e, t) => { if (!e || e.type !== "combo" || !e.options) return; let n = e.options.values, r = e.options; if (typeof n != "function") { @@ -2836,7 +2888,7 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli value: t }), r.values = n); } -}, mi = /* @__PURE__ */ new Set([ +}, Oi = /* @__PURE__ */ new Set([ "number", "int", "float", @@ -2845,34 +2897,34 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli "checkbox", "button", "hidden" -]), hi = [ +]), ki = [ "output", "save", "export", "folder", "dir" -], gi = ["file", "path"], _i = [ +], Ai = ["file", "path"], ji = [ "path", "file", "input", "src", "source" -], vi = (e, t, n) => { +], Mi = (e, t, n) => { let r = e?.widgets; if (!Array.isArray(r) || !r.length) return null; let i = String(t || "").toLowerCase().replace(/^\./, ""), a = String(e?.type || "").toLowerCase(), o = n.knownNodeIncludes.some((e) => a.includes(e)), s = []; for (let e of r) { if (!e) continue; let t = String(e?.type || "").toLowerCase(), r = e?.value; - if (mi.has(t) || typeof r == "number" || typeof r == "boolean") continue; + if (Oi.has(t) || typeof r == "number" || typeof r == "boolean") continue; let a = t === "text" || t === "string" || t === "combo", c = typeof e?.callback == "function" && typeof r == "string"; if (!a && !c) continue; let l = String(e?.name || e?.label || "").toLowerCase().trim(), u = 0; n.exactNames.has(l) && (u += 100), l === "file" && o && t === "combo" && n.comboChecker(e, i) && (u += 100); - let d = n.mediaTerms.some((e) => l.includes(e)), f = _i.some((e) => l.includes(e)); - d && f && (u += 80), gi.some((e) => l.includes(e)) && (u += 35); + let d = n.mediaTerms.some((e) => l.includes(e)), f = ji.some((e) => l.includes(e)); + d && f && (u += 80), Ai.some((e) => l.includes(e)) && (u += 35); for (let { terms: e, score: t } of n.extraTerms) e.some((e) => l.includes(e)) && (u += t); - hi.some((e) => l.includes(e)) && (u -= 90), n.exactSingleNames.has(l) && (typeof r == "string" && r.trim() === "" || n.looksLikeFn(r, i) ? u += 25 : u -= 10), o && (u += 15); + ki.some((e) => l.includes(e)) && (u -= 90), n.exactSingleNames.has(l) && (typeof r == "string" && r.trim() === "" || n.looksLikeFn(r, i) ? u += 25 : u -= 10), o && (u += 15); let p = typeof r == "string" && r.trim() === ""; p && (u += 3), t === "combo" && n.comboChecker(e, i) && (u += 12), s.push({ w: e, @@ -2891,7 +2943,7 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli console.debug?.(e); } return c.w; -}, yi = { +}, Ni = { exactNames: /* @__PURE__ */ new Set([ "video_path", "input_video", @@ -2934,10 +2986,10 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli score: 45 }], exactSingleNames: /* @__PURE__ */ new Set(["video"]), - looksLikeFn: $r, - comboChecker: ti, + looksLikeFn: pi, + comboChecker: hi, scoreKey: "__mjrVideoPickScore" -}, bi = { +}, Pi = { exactNames: /* @__PURE__ */ new Set([ "image", "image_path", @@ -2992,10 +3044,10 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli score: 35 }], exactSingleNames: /* @__PURE__ */ new Set(["image", "face"]), - looksLikeFn: ni, - comboChecker: ri, + looksLikeFn: gi, + comboChecker: _i, scoreKey: "__mjrImagePickScore" -}, xi = { +}, Fi = { exactNames: /* @__PURE__ */ new Set([ "audio_path", "input_audio", @@ -3043,10 +3095,10 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli score: 45 }], exactSingleNames: /* @__PURE__ */ new Set(["audio", "voice"]), - looksLikeFn: ii, - comboChecker: ai, + looksLikeFn: vi, + comboChecker: yi, scoreKey: "__mjrAudioPickScore" -}, Si = { +}, Ii = { exactNames: /* @__PURE__ */ new Set([ "model_path", "input_model", @@ -3105,13 +3157,13 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli "mesh", "geometry" ]), - looksLikeFn: oi, - comboChecker: si, + looksLikeFn: bi, + comboChecker: xi, scoreKey: "__mjrModel3DPickScore" -}, Ci = (e, t, n) => { +}, Li = (e, t, n) => { let r = String(t?.kind || "").toLowerCase(); - return vi(e, n, r === "model3d" ? Si : r === "audio" ? xi : r === "image" ? bi : yi); -}, wi = (e, t, n, r) => { + return Mi(e, n, r === "model3d" ? Ii : r === "audio" ? Fi : r === "image" ? Pi : Ni); +}, Ri = (e, t, n, r) => { if (!t || !t.inputs || !t.inputs.length) return null; let i = e?.canvas?.canvas || document.querySelector("canvas"), a = e?.canvas?.ds; if (!i || !a) return null; @@ -3124,15 +3176,15 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli }; } return null; -}, Ti = (e) => { +}, zi = (e) => { let t = e?.canvas?.canvas || document.querySelector("canvas"); return t ? t.getBoundingClientRect() : null; -}, Ei = (e, t) => { - let n = Ti(e); +}, Bi = (e, t) => { + let n = zi(e); if (!n) return !1; let r = t.clientX, i = t.clientY; return r >= n.left && r <= n.right && i >= n.top && i <= n.bottom; -}, Di = (e) => { +}, Vi = (e) => { try { e?.graph?.setDirtyCanvas?.(!0, !0); } catch (e) { @@ -3143,21 +3195,21 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli } catch (e) { console.debug?.(e); } -}, Oi = (e) => { +}, Hi = (e) => { let t = String(e?.filename || ""), n = t.lastIndexOf("."); return n >= 0 ? t.slice(n).toLowerCase() : ""; -}, ki = (e) => { - let t = String(e?.kind || "").toLowerCase(), n = Oi(e); - return t === "image" || Rr.has(n) ? ["LoadImage"] : t === "video" || zr.has(n) ? [ +}, Ui = (e) => { + let t = String(e?.kind || "").toLowerCase(), n = Hi(e); + return t === "image" || Qr.has(n) ? ["LoadImage"] : t === "video" || $r.has(n) ? [ "LoadVideo", "VHS_LoadVideo", "VideoLoader" - ] : t === "audio" || Br.has(n) ? [ + ] : t === "audio" || ei.has(n) ? [ "LoadAudio", "VHS_LoadAudioUpload", "VHS_LoadAudio", "AudioLoader" - ] : t === "model3d" || Vr.has(n) ? [ + ] : t === "model3d" || ti.has(n) ? [ "Load3D", "LoadModel", "LoadMesh", @@ -3166,9 +3218,9 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli "LoadSTL", "LoadPLY" ] : []; -}, Ai = (e, t) => { +}, Wi = (e, t) => { if (e) { - e.type === "combo" && pi(e, t), e.value = t; + e.type === "combo" && Di(e, t), e.value = t; try { e.callback?.(e.value); } catch (e) { @@ -3180,41 +3232,41 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli console.debug?.(e); } } -}, ji = (e) => { +}, Gi = (e) => { let t = e?.canvas?.canvas || document.querySelector("canvas"), n = t?.getBoundingClientRect?.(), r = n ? Number(n.width || n.right - n.left) : 0, i = n ? Number(n.height || n.bottom - n.top) : 0, a = Number(r || t?.width || 800), o = Number(i || t?.height || 600); if (!n) return [Math.max(0, a / 2), Math.max(0, o / 2)]; let s = n && Number(n.left) || 0, c = n && Number(n.top) || 0; - return Mi(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2)); -}, Mi = (e, t, n) => { + return Ki(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2)); +}, Ki = (e, t, n) => { let r = (e?.canvas?.canvas || document.querySelector("canvas"))?.getBoundingClientRect?.(), i = e?.canvas?.ds || {}, a = Number(i.scale) || 1, o = i.offset || [0, 0], s = Array.isArray(o) ? Number(o[0]) || 0 : Number(o?.x) || 0, c = Array.isArray(o) ? Number(o[1]) || 0 : Number(o?.y) || 0; - return !r || !Number.isFinite(Number(t)) || !Number.isFinite(Number(n)) ? ji(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c]; -}, Ni = (e, t = null) => { - if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return Mi(e, t.clientX, t.clientY); + return !r || !Number.isFinite(Number(t)) || !Number.isFinite(Number(n)) ? Gi(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c]; +}, qi = (e, t = null) => { + if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return Ki(e, t.clientX, t.clientY); try { let n = e?.canvas?.convertEventToCanvasOffset?.(t); if (Array.isArray(n)) return [Number(n[0]) || 0, Number(n[1]) || 0]; } catch (e) { console.debug?.(e); } - return Mi(e, t?.clientX, t?.clientY); -}, Pi = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => { + return Ki(e, t?.clientX, t?.clientY); +}, Ji = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => { let o = e?.graph ?? e?.canvas?.graph ?? null; if (!o || typeof o.add != "function") return !1; let s = null; - for (let n of ki(t)) try { - if (s = He(n, e), s) break; + for (let n of Ui(t)) try { + if (s = Ge(n, e), s) break; } catch (e) { console.debug?.(e); } if (!s) return !1; - s.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : Ni(e, r), o.add(s); - let c = Ci(s, t, i); - return c && Ai(c, n), Di(e), !0; -}, Fi = ({ app: e, items: t = [], event: n = null, gap: r = 90 }) => { + s.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : qi(e, r), o.add(s); + let c = Li(s, t, i); + return c && Wi(c, n), Vi(e), !0; +}, Yi = ({ app: e, items: t = [], event: n = null, gap: r = 90 }) => { let i = Array.isArray(t) ? t.filter(Boolean) : []; if (!i.length) return 0; - let a = Ni(e, n), o = 0; - for (let t of i) Pi({ + let a = qi(e, n), o = 0; + for (let t of i) Ji({ app: e, payload: t.payload, relativePath: t.relativePath, @@ -3223,27 +3275,27 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli position: [a[0] + o * Number(r || 90), a[1]] }) && (o += 1); return o; -}, Ii = Ai, Li = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => { +}, Xi = Wi, Zi = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => { let o = e?.graph ?? e?.canvas?.graph ?? null; if (!o || typeof o.add != "function" || !r) return !1; let s = null; - for (let n of ki(t)) try { - if (s = He(n, e), s) break; + for (let n of Ui(t)) try { + if (s = Ge(n, e), s) break; } catch (e) { console.debug?.(e); } if (!s) return !1; let c = Number(r.pos[0]) || 0, l = Number(r.pos[1]) || 0, u = Array.isArray(s.size) && Number(s.size[0]) || 220; s.pos = [c - u - 60, l + Number(i) * 20], o.add(s); - let d = Oi(t), f = Ci(s, t, d); - f && Ai(f, n); + let d = Hi(t), f = Li(s, t, d); + f && Wi(f, n); try { s.connect(0, r, i); } catch (e) { console.debug?.(e); } - return Di(e), !0; -}, Ri = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { + return Vi(e), !0; +}, Qi = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { let a = { index: !!r, files: [{ @@ -3251,12 +3303,12 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli subfolder: n.subfolder || "", dest_subfolder: "", type: n.type || "output", - root_id: Oe(n) || void 0 + root_id: Ne(n) || void 0 }] }; return i && (a.purpose = i), e(t, a); -}, zi = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { - let a = await Ri({ +}, $i = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { + let a = await Qi({ post: e, endpoint: t, payload: n, @@ -3271,40 +3323,40 @@ var Fr = "application/x-mjr-asset", Ir = "application/x-mjr-assets", Lr = "appli name: o?.name || null, subfolder: o?.subfolder || "" } : null; -}, Bi = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await zi({ +}, ea = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await $i({ post: e, endpoint: t, payload: n, index: r, purpose: i -}))?.relativePath || null, Vi = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Hi = /^[0-9a-f]{20,}$/i; -function Ui(...e) { +}))?.relativePath || null, ta = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, na = /^[0-9a-f]{20,}$/i; +function ra(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function Wi(e) { +function ia(e) { let t = String(e || "").trim(); - return !!t && (Vi.test(t) || Hi.test(t)); + return !!t && (ta.test(t) || na.test(t)); } -function Gi(e) { +function aa(e) { return String(e?.type || e?.class_type || e?.comfyClass || e?.classType || "").trim(); } -function Ki(e) { - return Ui(e?.properties?.subgraph_name, e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name, e?.subgraph?.name, e?.subgraph_instance?.name); +function oa(e) { + return ra(e?.properties?.subgraph_name, e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name, e?.subgraph?.name, e?.subgraph_instance?.name); } -function qi(e) { - let t = Gi(e), n = Ki(e); - return n && (!t || Wi(t) || n !== t) ? n : t && !Wi(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node"); +function sa(e) { + let t = aa(e), n = oa(e); + return n && (!t || ia(t) || n !== t) ? n : t && !ia(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node"); } -function Ji(e) { - let t = Gi(e); - return t && !Wi(t) ? t : t ? "Subgraph" : "Node"; +function ca(e) { + let t = aa(e); + return t && !ia(t) ? t : t ? "Subgraph" : "Node"; } // ui/components/sidebar/utils/minimap.ts -var Yi = 6, Xi = 1, Zi = 64, Qi = 74, $i = 42, ea = [ +var la = 6, ua = 1, da = 64, fa = 74, pa = 42, ma = [ ["sampler", "#8e5cff"], ["ksampler", "#8e5cff"], ["loader", "#4f8cff"], @@ -3321,20 +3373,20 @@ var Yi = 6, Xi = 1, Zi = 64, Qi = 74, $i = 42, ea = [ ["save", "#4aa37c"], ["preview", "#4aa37c"], ["api", "#3aa6a6"] -], ta = (e, t, n) => { +], ha = (e, t, n) => { let r = Number(e); return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; -}, na = (e, t = !1) => { +}, ga = (e, t = !1) => { let n = String(e || "").toUpperCase(); return n.includes("IMAGE") ? "rgba(145,198,99,0.9)" : n.includes("LATENT") ? "rgba(89,178,118,0.9)" : n.includes("MODEL") ? "rgba(112,155,255,0.9)" : n.includes("CONDITIONING") ? "rgba(191,123,226,0.9)" : n.includes("CLIP") ? "rgba(220,178,77,0.9)" : n.includes("VAE") ? "rgba(72,184,214,0.9)" : n.includes("MASK") ? "rgba(190,190,190,0.88)" : n.includes("STRING") || n.includes("TEXT") ? "rgba(230,230,230,0.86)" : n.includes("INT") || n.includes("FLOAT") || n.includes("NUMBER") ? "rgba(130,210,220,0.88)" : t ? "rgba(170,220,255,0.82)" : "rgba(255,255,255,0.72)"; -}, ra = (e, t, n) => { +}, _a = (e, t, n) => { let r = String(t || "").replace(/\s+/g, " ").trim(), i = Math.max(1, Number(n) || 1); if (!r || e.measureText(r).width <= i) return r; let a = r; for (; a.length > 3 && e.measureText(`${a}...`).width > i;) a = a.slice(0, -1); return a.length > 3 ? `${a}...` : r.slice(0, 3); }; -function ia(e, t, n = null) { +function va(e, t, n = null) { if (!e) return; let r = e.getContext?.("2d"); if (!r) return; @@ -3348,7 +3400,7 @@ function ia(e, t, n = null) { showNodeLabels: !1, expandSubgraphs: !0, ...n && typeof n == "object" ? n : {} - }, a = i.expandSubgraphs === !1 ? t : aa(t), o = Array.isArray(a?.nodes) ? a.nodes : [], s = Array.isArray(a?.groups) && a.groups || Array.isArray(a?.extra?.groups) && a.extra.groups || Array.isArray(a?.extra?.groupNodes) && a.extra.groupNodes || Array.isArray(a?.extra?.group_nodes) && a.extra.group_nodes || [], c = Array.isArray(a?.links) && a.links || Array.isArray(a?.extra?.links) && a.extra.links || [], l = Math.max(1, e.clientWidth || e.width || 1), u = Math.max(1, e.clientHeight || e.height || 1); + }, a = i.expandSubgraphs === !1 ? t : ya(t), o = Array.isArray(a?.nodes) ? a.nodes : [], s = Array.isArray(a?.groups) && a.groups || Array.isArray(a?.extra?.groups) && a.extra.groups || Array.isArray(a?.extra?.groupNodes) && a.extra.groupNodes || Array.isArray(a?.extra?.group_nodes) && a.extra.group_nodes || [], c = Array.isArray(a?.links) && a.links || Array.isArray(a?.extra?.links) && a.extra.links || [], l = Math.max(1, e.clientWidth || e.width || 1), u = Math.max(1, e.clientHeight || e.height || 1); if ((!o || o.length === 0) && (!s || s.length === 0)) return r.clearRect(0, 0, l, u), null; let d = (e, t) => { if (!e || typeof e != "string") return `rgba(255,255,255,${t})`; @@ -3385,7 +3437,7 @@ function ia(e, t, n = null) { let t = e?.bgcolor || e?.color || null; if (t) return t; let n = String(e?.category || e?.type || e?.comfyClass || e?.class_type || e?.title || "").toLowerCase(); - for (let [e, t] of ea) if (n.includes(e)) return t; + for (let [e, t] of ma) if (n.includes(e)) return t; let r = 0; for (let e = 0; e < n.length; e += 1) r = r * 31 + n.charCodeAt(e) | 0; return `hsl(${Math.abs(r) % 360} 42% 42%)`; @@ -3394,7 +3446,7 @@ function ia(e, t, n = null) { if (n) { for (let [e, r] of Object.entries(n)) if (!(Array.isArray(r) || r && typeof r == "object") && (t.push([e, r]), t.length >= 3)) return t; } - let r = Array.isArray(e?.widgets_values) ? e.widgets_values : [], i = Array.isArray(e?.widgets) ? e.widgets : [], a = Array.isArray(e?.inputs) ? e.inputs : [], o = a.filter((e) => e?.widget === !0 || e?.widget && typeof e.widget == "object" || typeof e?.widget == "string" && e.widget.trim()), s = a.filter((e) => e?.link == null && pa(e?.type)), c = (o.length ? o : s.length ? s : a).map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); + let r = Array.isArray(e?.widgets_values) ? e.widgets_values : [], i = Array.isArray(e?.widgets) ? e.widgets : [], a = Array.isArray(e?.inputs) ? e.inputs : [], o = a.filter((e) => e?.widget === !0 || e?.widget && typeof e.widget == "object" || typeof e?.widget == "string" && e.widget.trim()), s = a.filter((e) => e?.link == null && Da(e?.type)), c = (o.length ? o : s.length ? s : a).map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); return r.forEach((e, n) => { let r = i[n]?.name || i[n]?.label || c[n] || `p${n + 1}`; t.push([r, e]); @@ -3437,7 +3489,7 @@ function ia(e, t, n = null) { outputs: C, inputCount: S.length || (e?.inputs && typeof e.inputs == "object" ? Object.keys(e.inputs).length : 0), outputCount: C.length, - label: qi(e).replace(/\s+/g, " ").trim() + label: sa(e).replace(/\s+/g, " ").trim() }), n && h.set(n, m[m.length - 1]); } if (i.showGroups) for (let e of s || []) { @@ -3457,21 +3509,21 @@ function ia(e, t, n = null) { if (!m.length) return r.clearRect(0, 0, l, u), null; let v = m[0].x, y = m[0].y, b = m[0].x + m[0].w, x = m[0].y + m[0].h; for (let e of m) v = Math.min(v, e.x), y = Math.min(y, e.y), b = Math.max(b, e.x + e.w), x = Math.max(x, e.y + e.h); - let S = Math.max(1, b - v), C = Math.max(1, x - y), ee = v + S / 2, te = y + C / 2, ne = i.view && typeof i.view == "object" ? i.view : Object.create(null), w = ta(ne.zoom ?? 1, Xi, Zi), T = Math.max(1, S / w), E = Math.max(1, C / w), re = T / 2, D = E / 2, ie = T >= S ? ee : ta(ne.centerX ?? ee, v + re, b - re), ae = E >= C ? te : ta(ne.centerY ?? te, y + D, x - D), oe = ie - re, se = ae - D, ce = Yi, le = Math.min((l - 12) / T, (u - 12) / E), ue = ne.hoveredNodeId !== null && ne.hoveredNodeId !== void 0 ? String(ne.hoveredNodeId) : null; + let S = Math.max(1, b - v), C = Math.max(1, x - y), ee = v + S / 2, te = y + C / 2, ne = i.view && typeof i.view == "object" ? i.view : Object.create(null), w = ha(ne.zoom ?? 1, ua, da), T = Math.max(1, S / w), E = Math.max(1, C / w), re = T / 2, D = E / 2, ie = T >= S ? ee : ha(ne.centerX ?? ee, v + re, b - re), ae = E >= C ? te : ha(ne.centerY ?? te, y + D, x - D), oe = ie - re, se = ae - D, ce = la, le = Math.min((l - 12) / T, (u - 12) / E), ue = ne.hoveredNodeId !== null && ne.hoveredNodeId !== void 0 ? String(ne.hoveredNodeId) : null; r.clearRect(0, 0, l, u), r.fillStyle = "rgba(0,0,0,0.22)", r.fillRect(0, 0, l, u); let de = (e, t) => ({ x: ce + (e - oe) * le, y: ce + (t - se) * le }), fe = (e, t) => ({ - x: ta(oe + (Number(e) - ce) / le, v, b), - y: ta(se + (Number(t) - ce) / le, y, x) + x: ha(oe + (Number(e) - ce) / le, v, b), + y: ha(se + (Number(t) - ce) / le, y, x) }), pe = (e) => ({ x: ce + (e.x - oe) * le, y: ce + (e.y - se) * le, w: Math.max(1, e.w * le), h: Math.max(1, e.h * le) }), me = (e) => Math.max(10, Math.min(24, Math.floor(Number(e) * .2))), he = (e, t, n) => { - let r = pe(e), i = me(r.h), a = n === "output" ? e.outputs : e.inputs, o = Math.max(1, Array.isArray(a) ? a.length : Number(e[`${n}Count`]) || 0), s = ta(t, 0, Math.max(0, o - 1)); + let r = pe(e), i = me(r.h), a = n === "output" ? e.outputs : e.inputs, o = Math.max(1, Array.isArray(a) ? a.length : Number(e[`${n}Count`]) || 0), s = ha(t, 0, Math.max(0, o - 1)); return r.y + i + (r.h - i) * (s + 1) / (o + 1); }, ge = (e) => Array.isArray(e) && e.length >= 5 ? { originId: e[1], @@ -3508,7 +3560,7 @@ function ia(e, t, n = null) { r.restore(); } }, ye = (e) => { - let { x: t, y: n, w: a, h: o } = pe(e), s = e.kind === "node", c = e.kind === "group", l = !!e.bypassed, u = !!e.errored, f = c ? .18 : l && i.renderBypassState ? .14 : .62, p = c ? .55 : l && i.renderBypassState ? .32 : .8, m = d(e.fill, f), h = d(e.stroke, p), g = s && i.showNodeLabels && a >= Qi && o >= $i, _ = Math.max(2, Math.min(g ? 7 : 8, Math.floor(Math.min(a, o) * .08))), v = s ? me(o) : 0; + let { x: t, y: n, w: a, h: o } = pe(e), s = e.kind === "node", c = e.kind === "group", l = !!e.bypassed, u = !!e.errored, f = c ? .18 : l && i.renderBypassState ? .14 : .62, p = c ? .55 : l && i.renderBypassState ? .32 : .8, m = d(e.fill, f), h = d(e.stroke, p), g = s && i.showNodeLabels && a >= fa && o >= pa, _ = Math.max(2, Math.min(g ? 7 : 8, Math.floor(Math.min(a, o) * .08))), v = s ? me(o) : 0; if (r.save(), r.globalAlpha = 1, typeof m == "string" && (m.startsWith("#") || m.startsWith("rgb") || m.startsWith("hsl")) ? (r.fillStyle = m, r.globalAlpha = f) : (r.fillStyle = typeof m == "string" ? m : "rgba(82,88,96,0.72)", r.globalAlpha = f), typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, o, _), r.fill()) : r.fillRect(t, n, a, o), r.restore(), s && (r.save(), r.fillStyle = d(e.stroke || e.fill, l ? .34 : .9), typeof r.roundRect == "function" ? (r.beginPath(), r.roundRect(t, n, a, v, [ _, _, @@ -3529,11 +3581,11 @@ function ia(e, t, n = null) { r.save(), r.strokeStyle = "rgba(0,0,0,0.48)", r.lineWidth = 1; for (let i = 0; i < n; i += 1) { let n = he(e, i, "input"); - r.fillStyle = na(e.inputs?.[i]?.type, !1), r.beginPath(), r.arc(t, n, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); + r.fillStyle = ga(e.inputs?.[i]?.type, !1), r.beginPath(), r.arc(t, n, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); } for (let n = 0; n < i; n += 1) { let i = he(e, n, "output"); - r.fillStyle = na(e.outputs?.[n]?.type, !0), r.beginPath(), r.arc(t + a, i, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); + r.fillStyle = ga(e.outputs?.[n]?.type, !0), r.beginPath(), r.arc(t + a, i, g ? 3 : 2.2, 0, Math.PI * 2), r.fill(), r.stroke(); } r.restore(); } @@ -3576,12 +3628,12 @@ function ia(e, t, n = null) { let i = Math.max(24, a * .34); for (let a = 0; a < Math.min(8, e.inputs?.length || 0); a += 1) { let o = e.inputs[a], s = String(o?.label || o?.localized_name || o?.name || "").trim(); - s && r.fillText(ra(r, s, i), t + 7, he(e, a, "input") + n * .35, i); + s && r.fillText(_a(r, s, i), t + 7, he(e, a, "input") + n * .35, i); } for (let o = 0; o < Math.min(8, e.outputs?.length || 0); o += 1) { let s = e.outputs[o], c = String(s?.label || s?.localized_name || s?.name || "").trim(); if (!c) continue; - let l = ra(r, c, i); + let l = _a(r, c, i); r.fillText(l, t + a - 7 - Math.min(i, r.measureText(l).width), he(e, o, "output") + n * .35, i); } r.restore(); @@ -3591,7 +3643,7 @@ function ia(e, t, n = null) { ve(); for (let e of m.filter((e) => e.kind === "node")) ye(e); if (i.showViewport) try { - let e = je(); + let e = Me(); if (e) { let t = de(e.x0, e.y0), n = de(e.x1, e.y1), i = Math.min(t.x, n.x), a = Math.min(t.y, n.y), o = Math.abs(n.x - t.x), s = Math.abs(n.y - t.y); r.save(), r.globalAlpha = 1, r.strokeStyle = "rgba(255,255,255,0.9)", r.lineWidth = 1, r.strokeRect(i, a, o, s), r.restore(); @@ -3631,16 +3683,16 @@ function ia(e, t, n = null) { } }; } -function aa(e, t = null) { +function ya(e, t = null) { if (!e || typeof e != "object") return e; - let n = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], r = oa(e, t); + let n = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], r = ba(e, t); if (!n.length) return e; let i = [], a = Array.isArray(e.links) ? [...e.links] : [], o = [...Array.isArray(e.groups) ? e.groups : [], ...Array.isArray(e.extra?.groups) ? e.extra.groups : []]; for (let e of n) { i.push(e); - let t = sa(e, r); + let t = xa(e, r); if (!t || !Array.isArray(t.nodes) || !t.nodes.length) continue; - let n = la(e, aa(t, r)); + let n = Ca(e, ya(t, r)); i.push(...n.nodes), a.push(...n.links), n.group && o.push(n.group); } return { @@ -3654,16 +3706,16 @@ function aa(e, t = null) { } }; } -function oa(e, t = null) { +function ba(e, t = null) { let n = [ ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] ], r = new Map(t || []); - for (let e of n) for (let t of ca(e)) t != null && r.set(String(t), e); + for (let e of n) for (let t of Sa(e)) t != null && r.set(String(t), e); return r; } -function sa(e, t) { +function xa(e, t) { let n = [ e?.type, e?.comfyClass, @@ -3691,7 +3743,7 @@ function sa(e, t) { e?.subgraph_graph ].find((e) => e && typeof e == "object" && Array.isArray(e.nodes)) || null; } -function ca(e) { +function Sa(e) { return [ e?.id, e?.name, @@ -3703,9 +3755,9 @@ function ca(e) { e?.properties?.subgraphId ].filter((e) => e != null && String(e).trim()); } -function la(e, t) { - let n = String(e?.id ?? e?.ID ?? ""), r = da(e?.pos) || [0, 0], i = fa(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = ua(a), s = Math.min(22, Math.max(8, i[0] * .08)), c = Math.min(34, Math.max(18, i[1] * .18)), l = Math.min(18, Math.max(8, i[1] * .08)), u = Math.max(40, i[0] - s * 2), d = Math.max(34, i[1] - c - l), f = Math.min(1, u / o.width, d / o.height), p = r[0] + s + (u - o.width * f) / 2, m = r[1] + c + (d - o.height * f) / 2, h = a.map((r) => { - let i = da(r?.pos) || [o.minX, o.minY], a = fa(r?.size) || [140, 60]; +function Ca(e, t) { + let n = String(e?.id ?? e?.ID ?? ""), r = Ta(e?.pos) || [0, 0], i = Ea(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = wa(a), s = Math.min(22, Math.max(8, i[0] * .08)), c = Math.min(34, Math.max(18, i[1] * .18)), l = Math.min(18, Math.max(8, i[1] * .08)), u = Math.max(40, i[0] - s * 2), d = Math.max(34, i[1] - c - l), f = Math.min(1, u / o.width, d / o.height), p = r[0] + s + (u - o.width * f) / 2, m = r[1] + c + (d - o.height * f) / 2, h = a.map((r) => { + let i = Ta(r?.pos) || [o.minX, o.minY], a = Ea(r?.size) || [140, 60]; return { ...r, id: `${n}::${r?.id ?? r?.ID ?? ""}`, @@ -3745,12 +3797,12 @@ function la(e, t) { } }; } -function ua(e) { +function wa(e) { let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity; for (let a of e) { - let e = da(a?.pos); + let e = Ta(a?.pos); if (!e) continue; - let o = fa(a?.size) || [140, 60]; + let o = Ea(a?.size) || [140, 60]; t = Math.min(t, e[0]), n = Math.min(n, e[1]), r = Math.max(r, e[0] + o[0]), i = Math.max(i, e[1] + o[1]); } return Number.isFinite(t) ? { @@ -3765,7 +3817,7 @@ function ua(e) { height: 1 }; } -function da(e) { +function Ta(e) { if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; if (e && typeof e == "object") { let t = e[0] ?? e[0] ?? e.x ?? e.left ?? null, n = e[1] ?? e[1] ?? e.y ?? e.top ?? null; @@ -3773,7 +3825,7 @@ function da(e) { } return null; } -function fa(e) { +function Ea(e) { if (Array.isArray(e) && e.length >= 2) return [Number(e[0]), Number(e[1])]; if (e && typeof e == "object") { let t = e[0] ?? e[0] ?? e.w ?? e.width ?? null, n = e[1] ?? e[1] ?? e.h ?? e.height ?? null; @@ -3781,12 +3833,12 @@ function fa(e) { } return null; } -function pa(e) { +function Da(e) { if (Array.isArray(e)) return !0; let t = String(e || "").trim().toUpperCase(); return t === "INT" || t === "FLOAT" || t === "STRING" || t === "BOOLEAN" || t === "BOOL" || t === "COMBO" || t === "ENUM"; } -function ma(e, t = null) { +function Oa(e, t = null) { if (!e || typeof e != "object") return null; let n = { maxNodes: 220, @@ -3856,7 +3908,7 @@ function ma(e, t = null) { }; } // ui/features/workflows/workflowPickerState.ts -var X = bt({ +var X = Ct({ open: !1, mode: "workflow", title: "", @@ -3865,17 +3917,17 @@ var X = bt({ items: [], resolve: null }); -function ha({ title: e = "Select workflow", sourceAsset: t = null } = {}) { - return _a(null), X.open = !0, X.mode = "workflow", X.title = String(e || "Select workflow"), X.sourceAsset = t || null, X.workflow = null, X.items = [], new Promise((e) => { +function ka({ title: e = "Select workflow", sourceAsset: t = null } = {}) { + return ja(null), X.open = !0, X.mode = "workflow", X.title = String(e || "Select workflow"), X.sourceAsset = t || null, X.workflow = null, X.items = [], new Promise((e) => { X.resolve = e; }); } -function ga({ title: e = "Select asset", workflow: t = null, items: n = [] } = {}) { - return _a(null), X.open = !0, X.mode = "asset", X.title = String(e || "Select asset"), X.sourceAsset = null, X.workflow = t || null, X.items = Array.isArray(n) ? n.filter(Boolean) : [], new Promise((e) => { +function Aa({ title: e = "Select asset", workflow: t = null, items: n = [] } = {}) { + return ja(null), X.open = !0, X.mode = "asset", X.title = String(e || "Select asset"), X.sourceAsset = null, X.workflow = t || null, X.items = Array.isArray(n) ? n.filter(Boolean) : [], new Promise((e) => { X.resolve = e; }); } -function _a(e = null) { +function ja(e = null) { let t = X.resolve; if (X.open = !1, X.mode = "workflow", X.title = "", X.sourceAsset = null, X.workflow = null, X.items = [], X.resolve = null, typeof t == "function") try { t(e || null); @@ -3884,40 +3936,40 @@ function _a(e = null) { } } // ui/vue/majoorPrimeVue.ts -var va = { - Button: ft, - Checkbox: dt, - InputText: Et, - Textarea: _t, - Select: wt, - ToggleButton: xt, - Badge: St, - Tag: ct, - Dialog: ht, - Menu: Ct, - Listbox: yt, - Tree: Tt, - VirtualScroller: ut +var Ma = { + Button: ht, + Checkbox: mt, + InputText: kt, + Textarea: bt, + Select: Dt, + ToggleButton: wt, + Badge: Tt, + Tag: dt, + Dialog: vt, + Menu: Et, + Listbox: St, + Tree: Ot, + VirtualScroller: pt }; -function ya(e) { - return e.use(pt, { +function Na(e) { + return e.use(gt, { ripple: !1, unstyled: !0, zIndex: { overlay: 10100 } - }), e.use(mt), e.use(vt), Object.entries(va).forEach(([t, n]) => { + }), e.use(_t), e.use(xt), Object.entries(Ma).forEach(([t, n]) => { e.component(`M${t}`, n); }), e; } // ui/vue/createVueApp.ts -function ba(e, t = void 0) { - let n = At(), r = st(e, t); - return r.use(n), ya(r), { +function Pa(e, t = void 0) { + let n = Nt(), r = ut(e, t); + return r.use(n), Na(r), { app: r, pinia: n }; } -var xa = /* @__PURE__ */ new Map(); -function Sa(e, t, n) { +var Fa = /* @__PURE__ */ new Map(); +function Ia(e, t, n) { try { window.dispatchEvent(new CustomEvent("mjr:keepalive-attached", { detail: { mountKey: String(e || "_mjrVueApp"), @@ -3926,31 +3978,31 @@ function Sa(e, t, n) { } })); } catch {} } -function Ca(e) { +function La(e) { let t = document.createElement("div"); return t.dataset.mjrKeepAliveHost = String(e || "_mjrVueApp"), t.style.height = "100%", t.style.width = "100%", t.style.minHeight = "0", t.style.display = "flex", t.style.flexDirection = "column", t.style.overflow = "hidden", t; } -function wa(e, t) { - e && t && (e.style.height = "100%", e.style.minHeight = "0", e.style.display = "flex", e.style.flexDirection = "column", e.style.overflow = "hidden", (e.firstChild !== t || e.childNodes.length !== 1) && (e.replaceChildren(t), Sa(t?.dataset?.mjrKeepAliveHost, t, e))); +function Ra(e, t) { + e && t && (e.style.height = "100%", e.style.minHeight = "0", e.style.display = "flex", e.style.flexDirection = "column", e.style.overflow = "hidden", (e.firstChild !== t || e.childNodes.length !== 1) && (e.replaceChildren(t), Ia(t?.dataset?.mjrKeepAliveHost, t, e))); } -function Ta(e, t, n = "_mjrVueApp", { attachIfExists: r = !0 } = {}) { +function za(e, t, n = "_mjrVueApp", { attachIfExists: r = !0 } = {}) { if (!e) return !1; - let i = xa.get(n), a = !1; + let i = Fa.get(n), a = !1; if (!i) { - let e = Ca(n), { app: r } = ba(t); + let e = La(n), { app: r } = Pa(t); r.mount(e), i = { app: r, host: e, container: null - }, xa.set(n, i), a = !0; + }, Fa.set(n, i), a = !0; } - return (a || r) && (wa(e, i.host), i.container = e), a; + return (a || r) && (Ra(e, i.host), i.container = e), a; } -function Ea(e = "_mjrVueApp") { - return xa.has(e); +function Ba(e = "_mjrVueApp") { + return Fa.has(e); } -function Da(e, t = "_mjrVueApp") { - let n = xa.get(t); +function Va(e, t = "_mjrVueApp") { + let n = Fa.get(t); if (n?.app) { try { n.app.unmount(); @@ -3958,29 +4010,29 @@ function Da(e, t = "_mjrVueApp") { try { n.host?.remove?.(); } catch {} - xa.delete(t); + Fa.delete(t); } } // ui/utils/format.ts -function Oa(e) { +function Ha(e) { if (!e) return null; let t = Number(e); if (!isNaN(t)) return /* @__PURE__ */ new Date(t * 1e3); let n = new Date(e); return isNaN(n.getTime()) ? null : n; } -function ka(e) { - let t = Oa(e); +function Ua(e) { + let t = Ha(e); return t ? `${t.getDate().toString().padStart(2, "0")}/${(t.getMonth() + 1).toString().padStart(2, "0")}` : ""; } -function Aa(e) { - let t = Oa(e); +function Wa(e) { + let t = Ha(e); return t ? `${t.getHours().toString().padStart(2, "0")}:${t.getMinutes().toString().padStart(2, "0")}` : ""; } -function ja(e) { +function Ga(e) { return e ? e < 60 ? `${Math.round(e)}s` : `${Math.floor(e / 60)}m ${Math.round(e % 60)}s` : ""; } -var Ma = { +var Ka = { version: 1, parser_family_version: "geninfo-catalog-v1", sections: [ @@ -4073,24 +4125,24 @@ var Ma = { } ] }; -function Na() { +function qa() { let e = {}; - for (let t of Ma.sections) { + for (let t of Ka.sections) { e[t.key] = t.searchField, e[t.searchField] = t.searchField; for (let n of t.aliases || []) e[String(n).toLowerCase()] = t.searchField; } return e; } -function Pa(e) { +function Ja(e) { let t = String(e || "").trim().toLowerCase(); - return Na()[t] || ""; + return qa()[t] || ""; } -function Fa(e) { +function Ya(e) { let t = String(e || "").trim().toLowerCase(); - return t && Ma.sections.find((e) => e.key === t) || null; + return t && Ka.sections.find((e) => e.key === t) || null; } // ui/vue/components/panel/sidebar/SidebarFileInfoSection.vue?vue&type=script&setup=true&lang.ts -var Ia = { +var Xa = { key: 0, class: "mjr-sidebar-section", style: { @@ -4099,11 +4151,11 @@ var Ia = { "border-radius": "8px", padding: "10px" } -}, La = { style: { +}, Za = { style: { display: "flex", "flex-direction": "column", gap: "6px" -} }, Ra = ["title"], za = ["title"], Ba = /* @__PURE__ */ rt({ +} }, Qa = ["title"], $a = ["title"], eo = /* @__PURE__ */ ot({ __name: "SidebarFileInfoSection", props: { asset: {} }, setup(e) { @@ -4156,16 +4208,16 @@ var Ia = { tooltip: "Image/video resolution in pixels" }), e.duration && e.duration > 0 && f.push({ label: "Duration", - value: ja(e.duration), + value: Ga(e.duration), tooltip: "Video duration" }); - let p = Xe(e); + let p = $e(e); p != null && f.push({ label: "FPS", - value: Je(p), + value: Ze(p), tooltip: "Native frame rate" }); - let m = Ye(e, p); + let m = Qe(e, p); f.push({ label: "Frames", value: m == null ? "N/A" : String(Math.max(0, Math.floor(m))), @@ -4199,16 +4251,16 @@ var Ia = { value: String(i(u.color_space, c.color_space, c.colorspace) || "N/A"), tooltip: "Encoded color space" }); - let h = We(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0); + let h = qe(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0); h > 0 && f.push({ label: "Generation Time", value: `${(Number(h) / 1e3).toFixed(1)}s`, tooltip: "Time taken to generate this asset (workflow execution time)", - valueStyle: `color: ${Ke(h)}; font-weight: 600;` + valueStyle: `color: ${Ye(h)}; font-weight: 600;` }); let g = e.generation_time || e.file_creation_time || e.mtime || e.created_at; if (g) { - let e = ka(g), t = Aa(g); + let e = Ua(g), t = Wa(g); e && f.push({ label: "Date", value: e, @@ -4253,14 +4305,14 @@ var Ia = { tooltip: "ComfyUI workflow identifier (from workflow.id in extra_data)" }), f.filter((e) => a(e.value)); }); - return (e, t) => c.value.length ? (I(), z("div", Ia, [t[0] ||= M("div", { style: { + return (e, t) => c.value.length ? (I(), z("div", Xa, [t[0] ||= M("div", { style: { "font-size": "12px", "font-weight": "700", color: "#607d8b", "margin-bottom": "8px", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, " File Info ", -1), M("div", La, [(I(!0), z(j, null, F(c.value, (e) => (I(), z("div", { + } }, " File Info ", -1), M("div", Za, [(I(!0), z(j, null, F(c.value, (e) => (I(), z("div", { key: e.label, style: { display: "flex", @@ -4275,12 +4327,12 @@ var Ia = { opacity: "0.68", "min-width": "92px" } - }, R(e.label), 9, Ra), M("div", { + }, R(e.label), 9, Qa), M("div", { style: L(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") - }, R(e.value), 13, za)]))), 128))])])) : N("", !0); + }, R(e.value), 13, $a)]))), 128))])])) : N("", !0); } -}), Va = /* @__PURE__ */ new Set([ +}), to = /* @__PURE__ */ new Set([ "png", "jpg", "jpeg", @@ -4297,31 +4349,31 @@ var Ia = { "hdr", "svg" ]); -function Ha(e) { +function no(e) { let t = String(e?.filename || e?.name || e?.filepath || e?.path || "").trim().toLowerCase(); return !t || !t.includes(".") ? "" : t.split(".").pop() || ""; } -function Ua(e) { - return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : Va.has(Ha(e)); +function ro(e) { + return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : to.has(no(e)); } -function Wa(e) { - let t = Ha(e); +function io(e) { + let t = no(e); return t === "jpg" || t === "jpeg"; } -function Ga() { +function ao() { try { - return !!(qt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Xt()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } } -function Ka(e) { +function oo(e) { return e >= .75 ? "#4CAF50" : e >= .5 ? "#8BC34A" : e >= .3 ? "#FF9800" : "#F44336"; } -function qa(e) { +function so(e) { return e >= .85 ? "Excellent" : e >= .7 ? "Good" : e >= .5 ? "Fair" : e >= .3 ? "Low" : "Very Low"; } -function Ja(e) { +function co(e) { let t = String(e || "").trim(); if (!t) return ""; let n = []; @@ -4331,7 +4383,7 @@ function Ja(e) { } return (n.length ? n.join(" ") : t).replace(/\s+/g, " ").replace(/:{2,}\s*$/, "").trim(); } -function Ya(e) { +function lo(e) { let t = String(e?.filename || "").trim(); if (!t) return []; let n = String(e?.subfolder || "").trim(), r = String(e?.folder_type || "input").trim().toLowerCase(), i = [], a = (e) => { @@ -4341,11 +4393,11 @@ function Ya(e) { }; return (r === "input" || r === "output") && a(r), a("input"), a("output"), i; } -function Xa(e) { +function uo(e) { let t = String(e?.filepath || "").trim(), n = String(e?.filename || "").trim(); return !t || t === n ? "" : t; } -function Za(e) { +function fo(e) { let t = String(e || "").trim(); if (!t) return !1; if (t.startsWith("/")) return !0; @@ -4359,7 +4411,7 @@ function Za(e) { function Z(e) { return e == null || e === "" ? "-" : String(e); } -function Qa(e, t) { +function po(e, t) { let n = String(e?.pass_stage || e?.stage || e?.kind || "").trim().toLowerCase(); if (n === "txt2img" || n === "text_to_image" || n === "text-to-image") return O("sidebar.generation.stageTextToImage", "Text-to-Image"); if (n === "img2img" || n === "image_to_image" || n === "image-to-image") return O("sidebar.generation.stageImageToImage", "Image-to-Image"); @@ -4371,34 +4423,34 @@ function Qa(e, t) { let i = Number(e?.denoise); return t === 0 || i === 1 ? O("sidebar.generation.stageBase", "Base") : Number.isFinite(i) && i < 1 ? O("sidebar.generation.stageRefineUpscale", "Refine / Upscale") : O("sidebar.generation.stagePassN", "Pass {n}", { n: t + 1 }); } -function $a(e) { +function mo(e) { let t = []; return e?.metadata_raw && t.push(e.metadata_raw), e?.workflow && t.push(e.workflow), e?.metadata_raw?.workflow && t.push(e.metadata_raw.workflow), e?.metadata_raw?.raw_ffprobe?.format?.tags && t.push(e.metadata_raw.raw_ffprobe.format.tags), e?.metadata_raw?.ffprobe?.format?.tags && t.push(e.metadata_raw.ffprobe.format.tags), e?.geninfo && typeof e.geninfo == "object" && t.push({ geninfo: e.geninfo }), e?.metadata && (typeof e.metadata == "object" || typeof e.metadata == "string") && t.push(e.metadata), e?.prompt && (typeof e.prompt == "object" || typeof e.prompt == "string") && t.push(e.prompt), e?.exif && t.push(e.exif), e && typeof e == "object" && t.push(e), t; } -function eo(e, t) { +function ho(e, t) { for (let [n, r] of Object.entries(t)) r != null && r !== "" && (e[n] === void 0 || e[n] === null || e[n] === "") && (e[n] = r); } -function to(e) { - let t = $a(e), n = {}; +function go(e) { + let t = mo(e), n = {}; for (let e of t) { - let t = Nt(e); - t && typeof t == "object" && eo(n, t); + let t = It(e); + t && typeof t == "object" && ho(n, t); } return Object.keys(n).length ? n : null; } -function no(e) { +function _o(e) { try { if (!e || typeof e != "object") return !1; - if (e.is_override || typeof e.workflow_notes == "string" && e.workflow_notes.trim() || typeof e.notes == "string" && e.notes.trim() || Array.isArray(e.custom_info) && e.custom_info.length > 0 || e.engine && typeof e.engine == "object" && e.engine.type || Ft(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && Ft(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || e.ltx_director && typeof e.ltx_director == "object" || e.ideogram && typeof e.ideogram == "object" || e.sampler || e.sampler_name || e.steps || e.cfg || e.cfg_scale || e.cfg_high_noise || e.cfg_low_noise || e.scheduler || Array.isArray(e.chained_passes) && e.chained_passes.length > 0 || Array.isArray(e.all_samplers) && e.all_samplers.length > 0 || e.seed || e.denoise || e.denoising || e.clip_skip || e.voice || e.language || e.temperature || e.top_k || e.top_p || e.repetition_penalty || e.max_new_tokens || e.device || e.voice_preset || e.instruct || e.dtype || e.attn_implementation || e.enable_chunking !== void 0 || e.max_chars_per_chunk || e.chunk_combination_method || e.silence_between_chunks_ms || e.enable_audio_cache !== void 0 || e.batch_size !== void 0 || e.use_torch_compile !== void 0 || e.use_cuda_graphs !== void 0 || e.compile_mode || typeof e.lyrics == "string" && e.lyrics.trim()) return !0; + if (e.is_override || typeof e.workflow_notes == "string" && e.workflow_notes.trim() || typeof e.notes == "string" && e.notes.trim() || Array.isArray(e.custom_info) && e.custom_info.length > 0 || e.engine && typeof e.engine == "object" && e.engine.type || Rt(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && Rt(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || e.ltx_director && typeof e.ltx_director == "object" || e.ideogram && typeof e.ideogram == "object" || e.sampler || e.sampler_name || e.steps || e.cfg || e.cfg_scale || e.cfg_high_noise || e.cfg_low_noise || e.scheduler || Array.isArray(e.chained_passes) && e.chained_passes.length > 0 || Array.isArray(e.all_samplers) && e.all_samplers.length > 0 || e.seed || e.denoise || e.denoising || e.clip_skip || e.voice || e.language || e.temperature || e.top_k || e.top_p || e.repetition_penalty || e.max_new_tokens || e.device || e.voice_preset || e.instruct || e.dtype || e.attn_implementation || e.enable_chunking !== void 0 || e.max_chars_per_chunk || e.chunk_combination_method || e.silence_between_chunks_ms || e.enable_audio_cache !== void 0 || e.batch_size !== void 0 || e.use_torch_compile !== void 0 || e.use_cuda_graphs !== void 0 || e.compile_mode || typeof e.lyrics == "string" && e.lyrics.trim()) return !0; } catch { return !1; } return !1; } function Q(e) { - return e ? typeof e == "string" ? It(e) : typeof e == "object" ? It(e.name || e.value || "") : "" : ""; + return e ? typeof e == "string" ? zt(e) : typeof e == "object" ? zt(e.name || e.value || "") : "" : ""; } -function ro(e, t, n, r) { +function vo(e, t, n, r) { let i = String(r || "").trim(); if (!i) return; let a = `${n}::${i}`; @@ -4407,15 +4459,15 @@ function ro(e, t, n, r) { value: i })); } -function io(e) { +function yo(e) { let t = `${String(e?.source || "").toLowerCase()} ${String(e?.name || e?.lora_name || "").toLowerCase()}`; return t.includes("high_noise") || t.includes("high noise") ? "high_noise" : t.includes("low_noise") || t.includes("low noise") ? "low_noise" : ""; } -function ao(e) { +function bo(e) { let t = [], n = Array.isArray(e.model_groups) ? e.model_groups : []; if (n.length) return n.forEach((e) => { if (!e || typeof e != "object") return; - let n = Q(e.model), r = Array.isArray(e.loras) ? e.loras.map((e) => Pt(e)).filter(Boolean) : []; + let n = Q(e.model), r = Array.isArray(e.loras) ? e.loras.map((e) => Lt(e)).filter(Boolean) : []; (n || r.length) && t.push({ key: String(e.key || "").trim() || `group-${t.length + 1}`, label: String(e.label || "").trim() || `Group ${t.length + 1}`, @@ -4433,14 +4485,14 @@ function ao(e) { label: O("sidebar.generation.lowNoise", "Low Noise"), model: Q(r.unet_low_noise) }].forEach((e) => { - let n = i.filter((t) => io(t) === e.key).map((e) => Pt(e)).filter(Boolean); + let n = i.filter((t) => yo(t) === e.key).map((e) => Lt(e)).filter(Boolean); (e.model || n.length) && t.push({ ...e, loras: n }); }), t; } -function oo(e, t) { +function xo(e, t) { return t == null ? null : { label: e, value: t ? O("state.on", "on") : O("state.off", "off") @@ -4449,74 +4501,74 @@ function oo(e, t) { function $(e) { return e != null && String(e).trim() !== ""; } -function so(e) { +function So(e) { let t = String(e || "").toLowerCase(); return t.includes("high") ? "#52ffe8" : t.includes("low") ? "#42A5F5" : t.includes("refine") ? "#AB47BC" : t.includes("upscale") ? "#66BB6A" : t.includes("interpolation") || t.includes("video") ? "#dace26" : "#9C27B0"; } -function co(e) { +function Co(e) { return String(e || "").trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, ""); } -function lo(e, t) { +function wo(e, t) { let n = String(t || e || "").trim(), r = String(e || n).toLowerCase(), i = r.match(/^pass_(\d+)$/); return i ? O("sidebar.generation.stagePassN", "Pass {n}", { n: Number(i[1]) }) : r.includes("high") ? "High" : r.includes("low") ? "Low" : r.includes("refine") ? "Refiner" : r.includes("upscale") ? "Upscale" : r.includes("text_to_image") || r.includes("image_to_image") || r === "base" ? "Base" : n || "Branch"; } -function uo(e, t) { +function To(e, t) { let n = new Set(t.map((e) => String(e).toLowerCase())); return e.find((e) => n.has(String(e.label || "").toLowerCase())) || null; } -function fo(e, t) { +function Eo(e, t) { return $(t) ? { label: e, value: t } : null; } -function po(e) { +function Do(e) { let t = String(e || "").toLowerCase(); return t.includes("high_noise") || t.includes("high-noise") || t.includes("high noise") ? "high" : t.includes("low_noise") || t.includes("low-noise") || t.includes("low noise") ? "low" : ""; } -function mo(e) { +function Oo(e) { return Array.isArray(e) || e && typeof e == "object" ? !1 : $(e) && String(e).trim() !== "-"; } -function ho(e) { +function ko(e) { return typeof e == "number" ? Math.abs(e - Math.round(e)) < 1e-9 ? String(Math.round(e)) : e.toFixed(2).replace(/0+$/g, "").replace(/\.$/, "") : String(e ?? "").trim(); } -function go(e) { +function Ao(e) { if (!$(e)) return null; let t = Number(e); return !Number.isFinite(t) || t <= 0 ? null : e; } -function _o(e, t) { - let n = go(e.seed); +function jo(e, t) { + let n = Ao(e.seed); if (n !== null) return n; let r = [Array.isArray(e.chained_passes) ? e.chained_passes : [], Array.isArray(e.all_samplers) ? e.all_samplers : []]; for (let e of r) for (let t of e) { - let e = go(t?.seed_val ?? t?.seed); + let e = Ao(t?.seed_val ?? t?.seed); if (e !== null) return e; } for (let e of t || []) { - let t = go(uo(e.fields || [], ["Seed"])?.value); + let t = Ao(To(e.fields || [], ["Seed"])?.value); if (t !== null) return t; } return null; } -function vo(e, t) { - if (!t || !mo(t.value)) return; - let n = `${String(t.label || "").toLowerCase()}::${ho(t.value)}`; - e.some((e) => `${String(e.label || "").toLowerCase()}::${ho(e.value)}` === n) || e.push({ +function Mo(e, t) { + if (!t || !Oo(t.value)) return; + let n = `${String(t.label || "").toLowerCase()}::${ko(t.value)}`; + e.some((e) => `${String(e.label || "").toLowerCase()}::${ko(e.value)}` === n) || e.push({ ...t, - value: ho(t.value) + value: ko(t.value) }); } -function yo(e, t, n, r) { +function No(e, t, n, r) { let i = /* @__PURE__ */ new Map(), a = (e, t) => { - let n = co(e || t || "branch") || "branch"; + let n = Co(e || t || "branch") || "branch"; n.includes("high") && (n = "high"), n.includes("low") && (n = "low"); let r = i.get(n); if (r) return r; let a = { key: n, - label: lo(n, t), - accent: so(n), + label: wo(n, t), + accent: So(n), modelFields: [], samplingFields: [], loras: [] @@ -4524,7 +4576,7 @@ function yo(e, t, n, r) { return i.set(n, a), a; }, o = (e, t, n) => { let r = String(n || "").trim(); - r && (e.modelFields.some((e) => String(e.label || "").toLowerCase() === String(t || "").toLowerCase() && It(e.value) === It(r)) || e.modelFields.push({ + r && (e.modelFields.some((e) => String(e.label || "").toLowerCase() === String(t || "").toLowerCase() && zt(e.value) === zt(r)) || e.modelFields.push({ label: t, value: r })); @@ -4539,7 +4591,7 @@ function yo(e, t, n, r) { } let c = e.models && typeof e.models == "object" ? e.models : null; if (c) { - let t = Q(c.unet), n = po(t), r = Q(c.checkpoint || (n ? null : c.unet) || e.model || e.checkpoint), i = Q(c.unet_high_noise) || (n === "high" ? t : ""), l = Q(c.unet_low_noise) || (n === "low" ? t : ""), u = Q(c.clip), d = Q(c.vae), f = Array.isArray(e.loras) ? e.loras.map((e) => Pt(e)).filter(Boolean) : [], p = !!(i || l), m = !p && (r || u || d || f.length) ? a("base", "Base") : null, h = p && (u || d) ? a("shared", "Shared") : null, g = i ? a("high", "High") : null, _ = l ? a("low", "Low") : null; + let t = Q(c.unet), n = Do(t), r = Q(c.checkpoint || (n ? null : c.unet) || e.model || e.checkpoint), i = Q(c.unet_high_noise) || (n === "high" ? t : ""), l = Q(c.unet_low_noise) || (n === "low" ? t : ""), u = Q(c.clip), d = Q(c.vae), f = Array.isArray(e.loras) ? e.loras.map((e) => Lt(e)).filter(Boolean) : [], p = !!(i || l), m = !p && (r || u || d || f.length) ? a("base", "Base") : null, h = p && (u || d) ? a("shared", "Shared") : null, g = i ? a("high", "High") : null, _ = l ? a("low", "Low") : null; if (m) { r && o(m, e.model || e.checkpoint || c.checkpoint ? "Model" : "UNet", r), u && o(m, "CLIP", u), d && o(m, "VAE", d); for (let e of f) s(m, e); @@ -4547,22 +4599,22 @@ function yo(e, t, n, r) { h && (u && o(h, "CLIP", u), d && o(h, "VAE", d)), g && o(g, "UNet", i), _ && o(_, "UNet", l); } let l = i.get("high") || i.get("high_noise"), u = i.get("low") || i.get("low_noise"), d = [ - uo(n, ["Sampler"]), - uo(n, ["Scheduler"]), - uo(n, ["Steps"]), - uo(n, ["Seed"]) - ].filter(Boolean), f = fo("CFG", e.cfg_high_noise), p = fo("CFG", e.cfg_low_noise); - l && [...d, ...f ? [f] : []].forEach((e) => vo(l.samplingFields, e)), u && [...d, ...p ? [p] : []].forEach((e) => vo(u.samplingFields, e)); - let m = (r || []).some((e) => co(e.label).includes("upscale")), h = (r || []).length === 2 && (r || []).every((e) => ["base", "pass_2"].includes(co(e.label))); + To(n, ["Sampler"]), + To(n, ["Scheduler"]), + To(n, ["Steps"]), + To(n, ["Seed"]) + ].filter(Boolean), f = Eo("CFG", e.cfg_high_noise), p = Eo("CFG", e.cfg_low_noise); + l && [...d, ...f ? [f] : []].forEach((e) => Mo(l.samplingFields, e)), u && [...d, ...p ? [p] : []].forEach((e) => Mo(u.samplingFields, e)); + let m = (r || []).some((e) => Co(e.label).includes("upscale")), h = (r || []).length === 2 && (r || []).every((e) => ["base", "pass_2"].includes(Co(e.label))); for (let [e, t] of (r || []).entries()) { - let n = co(t.label); + let n = Co(t.label); if (!n) continue; - let i = (r || []).filter((e) => co(e.label) === co(t.label)).length, o = co(t.stage), s = o ? (r || []).filter((e) => co(e.stage) === o).length : 0, c = uo(t.fields || [], ["Model"]), d = po(c?.value); + let i = (r || []).filter((e) => Co(e.label) === Co(t.label)).length, o = Co(t.stage), s = o ? (r || []).filter((e) => Co(e.stage) === o).length : 0, c = To(t.fields || [], ["Model"]), d = Do(c?.value); ["high", "low"].includes(n) || (d ? n = d : s > 1 || i > 1 ? n = `pass_${e + 1}` : h ? n = e === 0 ? "high" : "low" : n === "base" && l && u ? n = "high" : ["text_to_image", "image_to_image"].includes(n) && (n = m ? "low" : "base")), n.includes("upscale") && m && (n = "high"); let f = a(n, t.label); if (!/^pass_\d+$/i.test(n) && c && String(c.value || "") !== "-") { - let e = It(c.value); - f.modelFields.some((t) => It(t.value) === e) || f.modelFields.push(c); + let e = zt(c.value); + f.modelFields.some((t) => zt(t.value) === e) || f.modelFields.push(c); } for (let e of t.fields || []) [ "Sampler", @@ -4573,11 +4625,11 @@ function yo(e, t, n, r) { "Seed", "Start", "End" - ].includes(String(e.label || "")) && vo(f.samplingFields, e); + ].includes(String(e.label || "")) && Mo(f.samplingFields, e); } return Array.from(i.values()).filter((e) => e.modelFields.length || e.samplingFields.length || e.loras.length); } -function bo(e, t, n, r) { +function Po(e, t, n, r) { let i = [], a = (e, t, n, r) => { let a = r.filter((e) => e && $(e.value) && String(e.value) !== "-"); a.length && i.push({ @@ -4588,24 +4640,24 @@ function bo(e, t, n, r) { }); }; for (let n of t || []) { - let t = co(n.label), r = (n.fields || []).some((e) => { + let t = Co(n.label), r = (n.fields || []).some((e) => { let t = String(e?.label || "").toLowerCase(), n = String(e?.value || "").toLowerCase(); return t.includes("upscaler") || n.includes("upscale") || n.includes("upscaler") || /(?:^|[_\s-])to[_\s-]?\d{3,5}(?:[_\s.-]|$)/i.test(n); }); t.includes("upscale") && (e.upscaler || r) && a("upscale", "Upscale", "#66BB6A", n.fields || []), (t.includes("interpolation") || t.includes("rife") || t.includes("film")) && a("interpolation", "Interpolation", "#26C6DA", n.fields || []); } a("audio", "MMAudio", "#26A69A", [ - fo("Voice", e.voice), - fo("Language", e.language), - fo("Temperature", e.temperature), - fo("Lyrics Strength", e.lyrics_strength) + Eo("Voice", e.voice), + Eo("Language", e.language), + Eo("Temperature", e.temperature), + Eo("Lyrics Strength", e.lyrics_strength) ].filter(Boolean)), a("interpolation", "Interpolation", "#26C6DA", [ - fo("Engine", e.interpolation_engine || e.frame_interpolation || e.interpolator), - fo("Source FPS", e.source_fps || e.input_fps), - fo("Final FPS", e.final_fps || e.output_fps || e.fps) + Eo("Engine", e.interpolation_engine || e.frame_interpolation || e.interpolator), + Eo("Source FPS", e.source_fps || e.input_fps), + Eo("Final FPS", e.final_fps || e.output_fps || e.fps) ].filter(Boolean)); for (let e of n || []) i.push({ - key: co(e.title) || `module_${i.length}`, + key: Co(e.title) || `module_${i.length}`, title: e.title, accent: e.color || "#2196F3", fields: [{ @@ -4613,32 +4665,32 @@ function bo(e, t, n, r) { value: e.content }] }); - r && !i.some((e) => String(e.title).toLowerCase() === String(r).toLowerCase()) && a("workflow_engine", r, "#2196F3", [fo("Engine", r)].filter(Boolean)); + r && !i.some((e) => String(e.title).toLowerCase() === String(r).toLowerCase()) && a("workflow_engine", r, "#2196F3", [Eo("Engine", r)].filter(Boolean)); let o = /* @__PURE__ */ new Set(); return i.filter((e) => { let t = `${e.key}:${e.title}:${JSON.stringify(e.fields)}`; return !o.has(t) && (o.add(t), !0); }); } -function xo(e) { +function Fo(e) { return new Set(Array.isArray(e.override_fields) ? e.override_fields.map((e) => String(e || "").trim()).filter(Boolean) : []); } -function So(e, ...t) { +function Io(e, ...t) { return t.some((t) => e.has(t)); } -function Co(e) { +function Lo(e) { return Array.isArray(e) ? e.filter((e) => e && typeof e == "object").map((e, t) => ({ title: String(e.title || O("sidebar.generation.customInfoN", "Custom Info {n}", { n: t + 1 })).trim(), content: String(e.content ?? e.value ?? "").trim(), color: /^#[0-9a-fA-F]{6}$/.test(String(e.color || "").trim()) ? String(e.color).trim() : "#2196F3" })).filter((e) => e.content) : []; } -function wo(e) { +function Ro(e) { if (!e || typeof e != "object") return null; let t = [], n = (e, n) => { $(n) && t.push({ label: e, - value: ho(n) + value: ko(n) }); }; n("FPS", e.frame_rate), n("Frames", e.duration_frames), n("Duration", e.duration_seconds), ($(e.width) || $(e.height)) && t.push({ @@ -4647,7 +4699,7 @@ function wo(e) { }); let r = Array.isArray(e.segments) ? e.segments.map((e, t) => { if (!e || typeof e != "object") return null; - let n = Ft(e.prompt || e.text || ""), r = String(e.filename || e.imageFile || e.videoFile || e.audioFile || "").trim(), i = String(e.filepath || e.path || r).trim(), a = String(e.in || e.in_label || e.start || e.start_frame || "").trim(), o = String(e.out || e.out_label || e.end || e.end_frame || "").trim(); + let n = Rt(e.prompt || e.text || ""), r = String(e.filename || e.imageFile || e.videoFile || e.audioFile || "").trim(), i = String(e.filepath || e.path || r).trim(), a = String(e.in || e.in_label || e.start || e.start_frame || "").trim(), o = String(e.out || e.out_label || e.end || e.end_frame || "").trim(); if (!n && !r && !a && !o) return null; let s = String(e.type || "").trim().toLowerCase(), c = s === "video" || /\.(mp4|mov|webm|mkv|avi|m4v)$/i.test(r), l = s === "audio" || /\.(mp3|wav|flac|ogg|m4a|aac|opus)$/i.test(r); return { @@ -4661,14 +4713,14 @@ function wo(e) { type: String(e.type || "").trim(), isVideo: c, isAudio: l, - previewCandidates: r ? Ya({ + previewCandidates: r ? lo({ filename: r, filepath: i, folder_type: String(e.folder_type || e.folderType || "input").trim(), subfolder: String(e.subfolder || "").trim() }) : [] }; - }).filter(Boolean) : [], i = Ft(e.global_prompt || e.globalPrompt || ""); + }).filter(Boolean) : [], i = Rt(e.global_prompt || e.globalPrompt || ""); return !i && !r.length && !t.length ? null : { title: String(e.title || "LTX Director").trim(), globalPrompt: i, @@ -4676,12 +4728,12 @@ function wo(e) { segments: r }; } -function To(e) { +function zo(e) { if (!e || typeof e != "object") return null; - let t = e.payload && typeof e.payload == "object" ? e.payload : e, n = typeof e.json == "string" && e.json.trim() ? e.json.trim() : JSON.stringify(t, null, 2), r = Ft(e.high_level_description || e.highLevelDescription || t.high_level_description || ""), i = Ft(e.background || t.background || ""), a = [], o = (e, t) => { + let t = e.payload && typeof e.payload == "object" ? e.payload : e, n = typeof e.json == "string" && e.json.trim() ? e.json.trim() : JSON.stringify(t, null, 2), r = Rt(e.high_level_description || e.highLevelDescription || t.high_level_description || ""), i = Rt(e.background || t.background || ""), a = [], o = (e, t) => { $(t) && a.push({ label: e, - value: ho(t) + value: ko(t) }); }; o("Style", t.style), o("Photo Style", t.photo_style || t["style.photo"]), o("Medium", t.medium), o("Lighting", t.lighting), o("Aesthetics", t.aesthetics), o("BG Brightness", t.bg_brightness), ($(t.width) || $(t.height)) && a.push({ @@ -4715,8 +4767,8 @@ function To(e) { colorPalette: c.map((e) => String(e || "").trim()).filter(Boolean) }; } -function Eo(e) { - let t = to(e), n = { +function Bo(e) { + let t = go(e), n = { kind: "empty", title: O("sidebar.generation.title", "Generation"), workflowType: "", @@ -4732,7 +4784,7 @@ function Eo(e) { showAlignment: !1, captionLabel: O("sidebar.generation.imageDescription", "Image Description"), emptyCaptionText: O("sidebar.generation.noImageDescription", "No image description yet."), - isImageAsset: Ua(e), + isImageAsset: ro(e), lyrics: "", modelFields: [], modelGroups: [], @@ -4755,26 +4807,26 @@ function Eo(e) { ltxDirector: null, ideogram: null }; - if (!t || typeof t == "object" && Object.keys(t).length === 0 || !no(t)) { + if (!t || typeof t == "object" && Object.keys(t).length === 0 || !_o(t)) { let t = e?.metadata_raw?.geninfo_status || e?.geninfo_status; return t && typeof t == "object" && t.kind === "media_pipeline" ? { ...n, kind: "media-only", mediaOnlyMessage: O("sidebar.generation.mediaOnlyPipeline", "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters.") - } : Ua(e) || Wa(e) ? { + } : ro(e) || io(e) ? { ...n, kind: "caption-only", showAlignment: !1 } : n; } - let r = t, i = wo(r.ltx_director), a = To(r.ideogram), o = xo(r), s = r.engine && typeof r.engine == "object" ? r.engine : null, c = !!(r.is_override || s?.mode === "override" || s?.parser_version === "geninfo-override-v1" || s?.source === "majoor_geninfo"), l = Lt(r), u = Mt(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), d = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => { - let n = Mt(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : ""); + let r = t, i = Ro(r.ltx_director), a = zo(r.ideogram), o = Fo(r), s = r.engine && typeof r.engine == "object" ? r.engine : null, c = !!(r.is_override || s?.mode === "override" || s?.parser_version === "geninfo-override-v1" || s?.source === "majoor_geninfo"), l = Bt(r), u = Ft(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), d = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => { + let n = Ft(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : ""); return { label: O("sidebar.generation.promptN", "Prompt {n}", { n: t + 1 }), - positive: Ft(n.positive), - negative: Ft(n.negative) + positive: Rt(n.positive), + negative: Rt(n.negative) }; - }).filter((e) => e.positive) : [], f = [], p = /* @__PURE__ */ new Set(), m = r.models && typeof r.models == "object" ? r.models : null, h = ao(r), g = new Set(h.map((e) => String(e.model || "").trim()).filter(Boolean)), _ = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null; + }).filter((e) => e.positive) : [], f = [], p = /* @__PURE__ */ new Set(), m = r.models && typeof r.models == "object" ? r.models : null, h = bo(r), g = new Set(h.map((e) => String(e.model || "").trim()).filter(Boolean)), _ = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null; if (m) { let e = new Set([ Q(m.unet_high_noise), @@ -4783,11 +4835,11 @@ function Eo(e) { ].filter(Boolean)); if (_) _.forEach((e, t) => { let n = Q(e); - ro(f, p, O("sidebar.generation.checkpointN", "Checkpoint {n}", { n: t + 1 }), n); + vo(f, p, O("sidebar.generation.checkpointN", "Checkpoint {n}", { n: t + 1 }), n); }); else { let t = Q(m.checkpoint); - t && !e.has(t) && ro(f, p, O("sidebar.generation.checkpoint", "Checkpoint"), t); + t && !e.has(t) && vo(f, p, O("sidebar.generation.checkpoint", "Checkpoint"), t); } [ ["UNet", Q(m.unet)], @@ -4796,37 +4848,37 @@ function Eo(e) { ["CLIP", Q(m.clip)], ["VAE", Q(m.vae)] ].forEach(([t, n]) => { - e.has(n) || ro(f, p, t, n); + e.has(n) || vo(f, p, t, n); }); - } else (r.model || r.checkpoint) && ro(f, p, O("sidebar.generation.model", "Model"), It(r.model || r.checkpoint)); + } else (r.model || r.checkpoint) && vo(f, p, O("sidebar.generation.model", "Model"), zt(r.model || r.checkpoint)); if (Array.isArray(r.loras) && r.loras.length > 0) { - let e = r.loras.map((e) => Pt(e)).filter(Boolean).join("\n"); - e && ro(f, p, r.loras.length > 1 ? O("sidebar.generation.loras", "LoRAs") : "LoRA", e); + let e = r.loras.map((e) => Lt(e)).filter(Boolean).join("\n"); + e && vo(f, p, r.loras.length > 1 ? O("sidebar.generation.loras", "LoRAs") : "LoRA", e); } - !m && r.clip && ro(f, p, "CLIP", It(r.clip)), !m && r.vae && ro(f, p, "VAE", It(r.vae)), !m && r.unet && ro(f, p, "UNet", It(r.unet)), !m && r.diffusion && ro(f, p, "Diffusion", It(r.diffusion)), !m && r.upscaler && ro(f, p, O("sidebar.generation.upscaler", "Upscaler"), It(r.upscaler)), m && r.clip && ro(f, p, "CLIP", It(r.clip)), m && r.vae && ro(f, p, "VAE", It(r.vae)); + !m && r.clip && vo(f, p, "CLIP", zt(r.clip)), !m && r.vae && vo(f, p, "VAE", zt(r.vae)), !m && r.unet && vo(f, p, "UNet", zt(r.unet)), !m && r.diffusion && vo(f, p, "Diffusion", zt(r.diffusion)), !m && r.upscaler && vo(f, p, O("sidebar.generation.upscaler", "Upscaler"), zt(r.upscaler)), m && r.clip && vo(f, p, "CLIP", zt(r.clip)), m && r.vae && vo(f, p, "VAE", zt(r.vae)); for (let e of f) { let t = String(e.label || "").toLowerCase(); - (t.includes("checkpoint") || t === "model") && (e.override = So(o, "checkpoint", "model")), t === "clip" && (e.override = So(o, "clip")), t === "vae" && (e.override = So(o, "vae")), t.includes("lora") && (e.override = So(o, "loras")); + (t.includes("checkpoint") || t === "model") && (e.override = Io(o, "checkpoint", "model")), t === "clip" && (e.override = Io(o, "clip")), t === "vae" && (e.override = Io(o, "vae")), t.includes("lora") && (e.override = Io(o, "loras")); } let v = []; $(r.seed) && v.push({ label: O("sidebar.generation.seed", "Seed"), value: r.seed, - override: So(o, "seed") + override: Io(o, "seed") }), (r.sampler || r.sampler_name) && v.push({ label: O("sidebar.generation.sampler", "Sampler"), value: r.sampler || r.sampler_name, - override: So(o, "sampler", "sampler_name") + override: Io(o, "sampler", "sampler_name") }), $(r.steps) && v.push({ label: O("sidebar.generation.steps", "Steps"), value: r.steps, - override: So(o, "steps") + override: Io(o, "steps") }); let y = $(r.cfg) ? r.cfg : r.cfg_scale; $(y) && v.push({ label: O("sidebar.generation.cfgScale", "CFG Scale"), value: y, - override: So(o, "cfg", "cfg_scale") + override: Io(o, "cfg", "cfg_scale") }), r.cfg_high_noise !== void 0 && r.cfg_high_noise !== null && v.push({ label: O("sidebar.generation.cfgHighNoise", "CFG High Noise"), value: r.cfg_high_noise @@ -4836,17 +4888,17 @@ function Eo(e) { }), r.scheduler && v.push({ label: O("sidebar.generation.scheduler", "Scheduler"), value: r.scheduler, - override: So(o, "scheduler") + override: Io(o, "scheduler") }); let b = $(r.denoise) ? r.denoise : r.denoising; $(b) && v.push({ label: O("sidebar.generation.denoise", "Denoise"), value: b, - override: So(o, "denoise", "denoising") + override: Io(o, "denoise", "denoising") }); let x = []; Array.isArray(r.chained_passes) && r.chained_passes.length > 1 ? x = r.chained_passes.filter((e) => e && typeof e == "object").map((e, t) => ({ - label: Qa(e, t), + label: po(e, t), stage: String(e?.pass_stage || "").trim(), fields: [ { @@ -4887,7 +4939,7 @@ function Eo(e) { } ] })) : Array.isArray(r.all_samplers) && r.all_samplers.length > 1 && (x = r.all_samplers.filter((e) => e && typeof e == "object").map((e, t) => ({ - label: Qa(e, t), + label: po(e, t), stage: String(e?.pass_stage || "").trim(), fields: [ { @@ -4968,13 +5020,13 @@ function Eo(e) { label: O("sidebar.generation.compileMode", "Compile Mode"), value: r.compile_mode }), [ - oo(O("sidebar.generation.torchCompile", "Torch Compile"), r.use_torch_compile), - oo(O("sidebar.generation.cudaGraphs", "CUDA Graphs"), r.use_cuda_graphs), - oo(O("sidebar.generation.xVectorOnly", "X-Vector Only"), r.x_vector_only_mode) + xo(O("sidebar.generation.torchCompile", "Torch Compile"), r.use_torch_compile), + xo(O("sidebar.generation.cudaGraphs", "CUDA Graphs"), r.use_cuda_graphs), + xo(O("sidebar.generation.xVectorOnly", "X-Vector Only"), r.x_vector_only_mode) ].filter(Boolean).forEach((e) => C.push(e)); let ee = []; [ - oo(O("sidebar.generation.chunking", "Chunking"), r.enable_chunking), + xo(O("sidebar.generation.chunking", "Chunking"), r.enable_chunking), r.max_chars_per_chunk !== void 0 && r.max_chars_per_chunk !== null ? { label: O("sidebar.generation.maxCharsChunk", "Max Chars/Chunk"), value: r.max_chars_per_chunk @@ -4987,7 +5039,7 @@ function Eo(e) { label: O("sidebar.generation.silenceBetweenChunks", "Silence Between Chunks (ms)"), value: r.silence_between_chunks_ms } : null, - oo(O("sidebar.generation.audioCache", "Audio Cache"), r.enable_audio_cache), + xo(O("sidebar.generation.audioCache", "Audio Cache"), r.enable_audio_cache), r.batch_size !== void 0 && r.batch_size !== null ? { label: O("sidebar.generation.batchSize", "Batch Size"), value: r.batch_size @@ -5010,21 +5062,21 @@ function Eo(e) { T && w.push({ label: O("sidebar.generation.workflowNotes", "Workflow Notes"), value: T, - override: So(o, "workflow_notes", "notes") + override: Io(o, "workflow_notes", "notes") }); - let E = Co(r.custom_info), re = yo(r, h, v, x), D = bo(r, x, E, l.workflowType), ie = _o(r, x), ae = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({ + let E = Lo(r.custom_info), re = No(r, h, v, x), D = Po(r, x, E, l.workflowType), ie = jo(r, x), ae = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({ id: `${e.filename}-${t}`, filename: String(e.filename || "").trim(), subfolder: String(e.subfolder || "").trim(), type: String(e.folder_type || "input").trim().toLowerCase(), root_id: String(e.root_id || e.rootId || "").trim(), kind: String(e.kind || e.media_kind || e.type || "").trim().toLowerCase(), - filepath: Xa(e), + filepath: uo(e), role: String(e.role || "").trim(), roleLabel: String(e.role || "").trim().replace(/_/g, " "), isVideo: String(e.type || "").toLowerCase() === "video" || /\.(mp4|mov|webm)$/i.test(String(e.filename || "")), isAudio: String(e.type || "").toLowerCase() === "audio" || /\.(wav|mp3|flac|ogg|m4a|aac|opus)$/i.test(String(e.filename || "")), - previewCandidates: Ya(e) + previewCandidates: lo(e) })) : []; return { ...n, @@ -5036,11 +5088,11 @@ function Eo(e) { isTruncated: !!(e?.geninfo?._truncated || e?.metadata?._truncated || e?.prompt?._truncated), positivePrompt: d.length || a ? "" : String(u.positive || "").trim(), negativePrompt: d.length ? "" : String(u.negative || "").trim(), - positivePromptOverride: So(o, "prompt", "positive", "positive_prompt"), - negativePromptOverride: So(o, "negative_prompt", "negative", "negativePrompt"), + positivePromptOverride: Io(o, "prompt", "positive", "positive_prompt"), + negativePromptOverride: Io(o, "negative_prompt", "negative", "negativePrompt"), promptTabs: d, showAlignment: !!e?.id && (!!String(u.positive || "").trim() || d.length > 0), - isImageAsset: Ua(e), + isImageAsset: ro(e), lyrics: String(r.lyrics || "").trim(), modelFields: f, modelGroups: h, @@ -5065,7 +5117,7 @@ function Eo(e) { }; } // ui/vue/components/panel/sidebar/GenerationInputThumb.vue?vue&type=script&setup=true&lang.ts -var Do = ["title"], Oo = ["src"], ko = { +var Vo = ["title"], Ho = ["src"], Uo = { key: 1, style: { width: "100%", @@ -5080,14 +5132,14 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "6px", "text-align": "center" } -}, Ao = { style: { +}, Wo = { style: { "font-size": "8px", "font-weight": "700", "max-width": "54px", "white-space": "nowrap", overflow: "hidden", "text-overflow": "ellipsis" -} }, jo = ["src"], Mo = { +} }, Go = ["src"], Ko = { key: 3, style: { position: "absolute", @@ -5103,7 +5155,7 @@ var Do = ["title"], Oo = ["src"], ko = { overflow: "hidden", "text-overflow": "ellipsis" } -}, No = { +}, qo = { key: 4, title: "Video file", style: { @@ -5113,13 +5165,13 @@ var Do = ["title"], Oo = ["src"], ko = { "font-size": "16px", "pointer-events": "none" } -}, Po = /* @__PURE__ */ rt({ +}, Jo = /* @__PURE__ */ ot({ __name: "GenerationInputThumb", props: { inputFile: {} }, setup(e) { let n = e, r = V(0), i = V(!1), a = null; function o() { - return a ||= import("./floatingViewerManager-DKOeP6-T.js").then((e) => e.n), a; + return a ||= import("./floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), a; } function s() { return (Array.isArray(n.inputFile?.previewCandidates) ? n.inputFile.previewCandidates : [])[r.value] || ""; @@ -5184,16 +5236,16 @@ var Do = ["title"], Oo = ["src"], ko = { }; } function h() { - return Za(s()) || !!n.inputFile?.filename || !!n.inputFile?.filepath; + return fo(s()) || !!n.inputFile?.filename || !!n.inputFile?.filepath; } function g() { let e = d(); - if (jt({ + if (Pt({ asset: e, index: 0 })) return; let t = s(); - if (Za(t)) try { + if (fo(t)) try { window.open(t, "_blank", "noopener,noreferrer"); } catch (e) { console.debug?.(e); @@ -5221,14 +5273,14 @@ var Do = ["title"], Oo = ["src"], ko = { type: e.type || "input", root_id: e.root_id || void 0, kind: e.kind - }, r = await zi({ + }, r = await $i({ post: ge, - endpoint: Be.STAGE_TO_INPUT, + endpoint: Ue.STAGE_TO_INPUT, payload: n, index: !1 }); - if (!r?.relativePath || !Fi({ - app: Ie(), + if (!r?.relativePath || !Yi({ + app: Be(), items: [{ payload: n, relativePath: r.relativePath, @@ -5245,7 +5297,7 @@ var Do = ["title"], Oo = ["src"], ko = { function b(e) { e?.preventDefault?.(), e?.stopPropagation?.(); let t = f(), r = t === "video" ? O("ctx.loadVideo", "Load video") : t === "audio" ? O("ctx.loadAudio", "Load audio") : t === "model3d" ? O("ctx.loadModel3d", "Load 3D model") : O("ctx.loadImage", "Load image"); - Or({ + Hr({ x: e?.clientX || 0, y: e?.clientY || 0, items: [ @@ -5305,10 +5357,10 @@ var Do = ["title"], Oo = ["src"], ko = { onError: c, onMouseover: x, onMouseout: S - }, null, 40, Oo)) : C() ? (I(), z("div", ko, [n[0] ||= M("div", { style: { + }, null, 40, Ho)) : C() ? (I(), z("div", Uo, [n[0] ||= M("div", { style: { "font-size": "18px", "line-height": "1" - } }, "♪", -1), M("div", Ao, R(e.inputFile.filename), 1)])) : (I(), z("img", { + } }, "♪", -1), M("div", Wo, R(e.inputFile.filename), 1)])) : (I(), z("img", { key: 2, src: s(), style: { @@ -5317,16 +5369,16 @@ var Do = ["title"], Oo = ["src"], ko = { "object-fit": "cover" }, onError: c - }, null, 40, jo)), e.inputFile.role && e.inputFile.role !== "secondary" ? (I(), z("div", Mo, R(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (I(), z("div", No, " Play ")) : N("", !0)], 44, Do)); + }, null, 40, Go)), e.inputFile.role && e.inputFile.role !== "secondary" ? (I(), z("div", Ko, R(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (I(), z("div", qo, " Play ")) : N("", !0)], 44, Vo)); } -}), Fo = { +}), Yo = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "12px" } -}, Io = { +}, Xo = { key: 0, style: { display: "flex", @@ -5341,66 +5393,66 @@ var Do = ["title"], Oo = ["src"], ko = { fontSize: "11px", color: "var(--fg-color, #ccc)" } -}, Lo = { style: { opacity: "0.85" } }, Ro = { style: { +}, Zo = { style: { opacity: "0.85" } }, Qo = { style: { display: "flex", "align-items": "center", gap: "8px", "flex-wrap": "wrap", "justify-content": "flex-end" -} }, zo = ["title"], Bo = ["title"], Vo = { style: { +} }, $o = ["title"], es = ["title"], ts = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px" -} }, Ho = { style: { +} }, ns = { style: { "font-size": "11px", "font-weight": "700", color: "#00BCD4", "text-transform": "uppercase", "letter-spacing": "0.6px" -} }, Uo = { style: { +} }, rs = { style: { "font-size": "11px", color: "var(--fg-color, rgba(255,255,255,0.9))", "font-weight": "600" -} }, Wo = { style: { +} }, is = { style: { "font-size": "11px", "font-weight": "600", color: "#FF9800", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, Go = { style: { +} }, as = { style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.9))", "line-height": "1.5", "white-space": "pre-wrap", "word-break": "break-word" -} }, Ko = { style: { +} }, os = { style: { "font-size": "11px", "font-weight": "600", color: "#9E9E9E", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, qo = { style: { +} }, ss = { style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.9))", "line-height": "1.5", "white-space": "pre-wrap", "word-break": "break-word" -} }, Jo = { style: { +} }, cs = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "10px" -} }, Yo = { style: { +} }, ls = { style: { "font-size": "11px", "font-weight": "800", color: "#26C6DA", "text-transform": "uppercase", "letter-spacing": "0.5px" -} }, Xo = { +} }, us = { key: 0, style: { display: "grid", @@ -5408,18 +5460,18 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "8px", "margin-bottom": "10px" } -}, Zo = { style: { +}, ds = { style: { "font-size": "9px", "font-weight": "800", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Qo = { style: { +} }, fs = { style: { "font-size": "12px", color: "var(--fg-color,#eee)", "font-weight": "650", "word-break": "break-word" -} }, $o = { +} }, ps = { key: 1, style: { border: "1px solid rgba(76,175,80,0.36)", @@ -5428,32 +5480,32 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px", "margin-bottom": "10px" } -}, es = ["title"], ts = { +}, ms = ["title"], hs = { key: 2, style: { display: "flex", "flex-direction": "column", gap: "8px" } -}, ns = { style: { +}, gs = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "7px" -} }, rs = { style: { +} }, _s = { style: { "font-size": "10px", "font-weight": "800", color: "#26C6DA", "text-transform": "uppercase", "letter-spacing": "0.45px" -} }, is = { style: { +} }, vs = { style: { display: "flex", "align-items": "center", gap: "5px", "flex-wrap": "wrap", "justify-content": "flex-end" -} }, as = { +} }, ys = { key: 0, style: { "font-size": "10px", @@ -5464,7 +5516,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "2px 6px", "font-weight": "700" } -}, os = { +}, bs = { key: 1, style: { "font-size": "10px", @@ -5475,15 +5527,15 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "2px 6px", "font-weight": "700" } -}, ss = { style: { +}, xs = { style: { display: "flex", gap: "10px", "align-items": "flex-start", "min-width": "0" -} }, cs = { style: { +} }, Ss = { style: { "min-width": "0", flex: "1" -} }, ls = ["title", "onClick"], us = { +} }, Cs = ["title", "onClick"], ws = { key: 1, style: { "font-size": "10px", @@ -5493,19 +5545,19 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "6px", "flex-wrap": "wrap" } -}, ds = { key: 0 }, fs = { key: 1 }, ps = { style: { +}, Ts = { key: 0 }, Es = { key: 1 }, Ds = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "10px" -} }, ms = { style: { +} }, Os = { style: { "font-size": "11px", "font-weight": "800", color: "#FFB300", "text-transform": "uppercase", "letter-spacing": "0.5px" -} }, hs = { +} }, ks = { key: 0, style: { display: "grid", @@ -5513,18 +5565,18 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "8px", "margin-bottom": "10px" } -}, gs = { style: { +}, As = { style: { "font-size": "9px", "font-weight": "800", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, _s = { style: { +} }, js = { style: { "font-size": "12px", color: "var(--fg-color,#eee)", "font-weight": "650", "word-break": "break-word" -} }, vs = { +} }, Ms = { key: 1, style: { border: "1px solid rgba(76,175,80,0.34)", @@ -5533,7 +5585,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px", "margin-bottom": "10px" } -}, ys = ["title"], bs = { +}, Ns = ["title"], Ps = { key: 2, style: { border: "1px solid rgba(33,150,243,0.32)", @@ -5542,7 +5594,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px", "margin-bottom": "10px" } -}, xs = ["title"], Ss = { +}, Fs = ["title"], Is = { key: 3, style: { display: "flex", @@ -5550,19 +5602,19 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "8px", "margin-bottom": "10px" } -}, Cs = { style: { +}, Ls = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "7px" -} }, ws = { style: { +} }, Rs = { style: { "font-size": "10px", "font-weight": "800", color: "#FFCA28", "text-transform": "uppercase", "letter-spacing": "0.45px" -} }, Ts = { +} }, zs = { key: 0, style: { "font-size": "10px", @@ -5573,7 +5625,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "2px 6px", "font-weight": "700" } -}, Es = ["title", "onClick"], Ds = { +}, Bs = ["title", "onClick"], Vs = { key: 1, style: { display: "flex", @@ -5581,35 +5633,35 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "5px", "margin-top": "8px" } -}, Os = ["title", "onClick"], ks = { style: { +}, Hs = ["title", "onClick"], Us = { style: { border: "1px solid rgba(255,179,0,0.30)", "border-radius": "6px", background: "rgba(0,0,0,0.16)", overflow: "hidden" -} }, As = ["title"], js = { style: { +} }, Ws = ["title"], Gs = { style: { "font-size": "11px", "font-weight": "600", color: "#4CAF50", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, Ms = { style: { +} }, Ks = { style: { display: "flex", "flex-wrap": "wrap", gap: "6px", "margin-bottom": "10px" -} }, Ns = { style: { +} }, qs = { style: { "font-size": "10px", "font-weight": "700", color: "#4CAF50", "letter-spacing": "0.4px" -} }, Ps = ["onClick"], Fs = { style: { +} }, Js = ["onClick"], Ys = { style: { "font-size": "10px", "font-weight": "700", color: "#F44336", "letter-spacing": "0.4px", "margin-top": "4px" -} }, Is = ["onClick"], Ls = { style: { +} }, Xs = ["onClick"], Zs = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -5619,7 +5671,7 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, Rs = ["title"], zs = ["title"], Bs = { style: { +} }, Qs = ["title"], $s = ["title"], ec = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -5629,7 +5681,7 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, Vs = ["title"], Hs = ["title"], Us = { style: { +} }, tc = ["title"], nc = ["title"], rc = { style: { "font-size": "11px", "font-weight": "600", color: "#00BCD4", @@ -5638,17 +5690,17 @@ var Do = ["title"], Oo = ["src"], ko = { display: "flex", "align-items": "center", "justify-content": "space-between" -} }, Ws = ["title"], Gs = { style: { +} }, ic = ["title"], ac = { style: { display: "flex", "align-items": "center", gap: "10px" -} }, Ks = { style: { +} }, oc = { style: { flex: "1", height: "8px", background: "rgba(255,255,255,0.1)", "border-radius": "4px", overflow: "hidden" -} }, qs = { +} }, sc = { key: 0, style: { "font-size": "10px", @@ -5658,7 +5710,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "6px 8px", background: "rgba(255,255,255,0.04)" } -}, Js = { style: { +}, cc = { style: { "font-size": "10px", "font-weight": "600", color: "rgba(0, 188, 212, 0.75)", @@ -5669,35 +5721,35 @@ var Do = ["title"], Oo = ["src"], ko = { "align-items": "center", "justify-content": "space-between", gap: "8px" -} }, Ys = ["title"], Xs = { style: { +} }, lc = ["title"], uc = { style: { display: "flex", "align-items": "center", gap: "6px" -} }, Zs = ["title"], Qs = { style: { +} }, dc = ["title"], fc = { style: { "font-size": "11px", "font-weight": "600", color: "#9C27B0", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, $s = { style: { +} }, pc = { style: { display: "grid", "grid-template-columns": "repeat(auto-fit, minmax(190px, 1fr))", gap: "10px" -} }, ec = { style: { +} }, mc = { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, tc = ["onClick"], nc = { +} }, hc = ["onClick"], gc = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "5px" } -}, rc = ["onClick"], ic = { style: { +}, _c = ["onClick"], vc = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -5707,90 +5759,90 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, ac = { style: { +} }, yc = { style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.9))", "line-height": "1.5", "white-space": "pre-wrap", "word-break": "break-word" -} }, oc = { style: { +} }, bc = { style: { "font-size": "11px", "font-weight": "600", color: "#FF9800", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, sc = { style: { +} }, xc = { style: { display: "grid", "grid-template-columns": "repeat(auto-fit, minmax(130px, 1fr))", gap: "8px" -} }, cc = ["onClick"], lc = { style: { +} }, Sc = ["onClick"], Cc = { style: { "font-size": "11px", "font-weight": "600", color: "#9C27B0", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, uc = { style: { +} }, wc = { style: { display: "grid", "grid-template-columns": "repeat(auto-fit, minmax(220px, 1fr))", gap: "10px" -} }, dc = { style: { +} }, Tc = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px" -} }, fc = { style: { +} }, Ec = { style: { display: "flex", "flex-direction": "column", gap: "4px" -} }, pc = ["onClick"], mc = { +} }, Dc = ["onClick"], Oc = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "6px" } -}, hc = { style: { +}, kc = { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, gc = { style: { +} }, Ac = { style: { display: "flex", "flex-direction": "column", gap: "5px" -} }, _c = ["onClick"], vc = { style: { +} }, jc = ["onClick"], Mc = { style: { display: "grid", "grid-template-columns": "auto 1fr", gap: "8px 12px", "align-items": "start" -} }, yc = ["title"], bc = ["title"], xc = ["title", "onClick"], Sc = { style: { +} }, Nc = ["title"], Pc = ["title"], Fc = ["title", "onClick"], Ic = { style: { "font-size": "11px", "font-weight": "600", color: "#4CAF50", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, Cc = ["title", "onClick"], wc = { style: { +} }, Lc = ["title", "onClick"], Rc = { style: { "font-size": "11px", "font-weight": "600", color: "#26C6DA", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, Tc = { style: { +} }, zc = { style: { display: "grid", "grid-template-columns": "repeat(auto-fit, minmax(190px, 1fr))", gap: "10px" -} }, Ec = { style: { +} }, Bc = { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Dc = ["title", "onClick"], Oc = { style: { +} }, Vc = ["title", "onClick"], Hc = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -5800,17 +5852,17 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, kc = ["title"], Ac = { style: { +} }, Uc = ["title"], Wc = { style: { "font-size": "11px", "font-weight": "700", color: "#E91E63", "text-transform": "uppercase", "letter-spacing": "1px" -} }, jc = ["title"], Mc = ["title"], Nc = { style: { +} }, Gc = ["title"], Kc = ["title"], qc = { style: { display: "flex", gap: "8px", "flex-wrap": "wrap" -} }, Pc = /* @__PURE__ */ rt({ +} }, Jc = /* @__PURE__ */ ot({ __name: "SidebarGenerationSection", props: { asset: {} }, setup(e) { @@ -5871,10 +5923,10 @@ var Do = ["title"], Oo = ["src"], ko = { whiteSpace: "nowrap" }; } - let _ = P(() => Eo(t.asset)), v = P(() => Ga()), y = P(() => _.value.kind === "full" || _.value.kind === "caption-only"), b = P(() => Ja(i.value) || _.value.emptyCaptionText), x = P(() => v.value && _.value.isImageAsset && !!t.asset?.id), S = P(() => v.value && !!Ja(b.value) && b.value !== _.value.emptyCaptionText), C = P(() => _.value.branchCards.filter((e) => e.modelFields.length || e.loras.length)), ee = P(() => _.value.branchCards.filter((e) => e.samplingFields.length)); + let _ = P(() => Bo(t.asset)), v = P(() => ao()), y = P(() => _.value.kind === "full" || _.value.kind === "caption-only"), b = P(() => co(i.value) || _.value.emptyCaptionText), x = P(() => v.value && _.value.isImageAsset && !!t.asset?.id), S = P(() => v.value && !!co(b.value) && b.value !== _.value.emptyCaptionText), C = P(() => _.value.branchCards.filter((e) => e.modelFields.length || e.loras.length)), ee = P(() => _.value.branchCards.filter((e) => e.samplingFields.length)); P(() => _.value.branchCards.filter((e) => e.loras.length)); let te = P(() => { - let e = [], t = (e, t) => Fa(e)?.title || t; + let e = [], t = (e, t) => Ya(e)?.title || t; return !C.value.length && _.value.modelFields.length && e.push({ key: "model", title: t("model", O("sidebar.generation.modelLora", "Model & LoRA")), @@ -6001,11 +6053,11 @@ var Do = ["title"], Oo = ["src"], ko = { }; return; } - let i = Math.round(r * 100), a = Ka(r); + let i = Math.round(r * 100), a = oo(r); l.value = { scoreText: `${i}%`, scoreColor: a, - qualityText: qa(r), + qualityText: so(r), qualityColor: a, qualityBackground: `${a}33`, fillWidth: `${i}%`, @@ -6051,9 +6103,9 @@ var Do = ["title"], Oo = ["src"], ko = { console.debug?.(e); } } - return nt(() => t.asset, () => { + return at(() => t.asset, () => { n.value = 0, r.value = 0, i.value = String(t.asset?.enhanced_caption || "").trim(), a.value = O("action.copy", "Copy"), o.value = O("action.generate", "Generate"); - }, { immediate: !0 }), nt(() => [ + }, { immediate: !0 }), at(() => [ t.asset?.id, _.value.kind, _.value.showAlignment, @@ -6061,9 +6113,9 @@ var Do = ["title"], Oo = ["src"], ko = { ], () => { oe(); }, { immediate: !0 }), (e, t) => { - let r = et("MButton"); - return _.value.kind === "empty" ? N("", !0) : (I(), z("div", Fo, [ - _.value.workflowType ? (I(), z("div", Io, [M("span", Lo, R(B(O)("viewer.workflow", "Workflow")), 1), M("div", Ro, [M("span", { + let r = rt("MButton"); + return _.value.kind === "empty" ? N("", !0) : (I(), z("div", Yo, [ + _.value.workflowType ? (I(), z("div", Xo, [M("span", Zo, R(B(O)("viewer.workflow", "Workflow")), 1), M("div", Qo, [M("span", { title: B(O)("sidebar.generation.workflowEngine", "Workflow engine: {value}", { value: _.value.workflowType }), style: { background: "#2196F3", @@ -6074,7 +6126,7 @@ var Do = ["title"], Oo = ["src"], ko = { "font-size": "10px", "letter-spacing": "0.2px" } - }, R(_.value.workflowLabel || _.value.workflowType), 9, zo), _.value.workflowBadge ? (I(), z("span", { + }, R(_.value.workflowLabel || _.value.workflowType), 9, $o), _.value.workflowBadge ? (I(), z("span", { key: 0, title: B(O)("sidebar.generation.apiProvider", "API provider: {value}", { value: _.value.workflowBadge }), style: { @@ -6087,7 +6139,7 @@ var Do = ["title"], Oo = ["src"], ko = { "font-size": "10px", "letter-spacing": "0.2px" } - }, R(_.value.workflowBadge), 9, Bo)) : N("", !0)])])) : N("", !0), + }, R(_.value.workflowBadge), 9, es)) : N("", !0)])])) : N("", !0), _.value.isOverride ? (I(), z("div", { key: 1, style: L(m("#00BCD4", { @@ -6095,7 +6147,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .14, endAlpha: .08 })) - }, [M("div", Vo, [M("span", Ho, R(B(O)("sidebar.generation.override", "Override")), 1), M("span", Uo, R(_.value.overrideLabel), 1)])], 4)) : N("", !0), + }, [M("div", ts, [M("span", ns, R(B(O)("sidebar.generation.override", "Override")), 1), M("span", rs, R(_.value.overrideLabel), 1)])], 4)) : N("", !0), _.value.isTruncated ? (I(), z("div", { key: 2, style: L(m("#FF9800", { @@ -6103,7 +6155,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .12, endAlpha: .08 })) - }, [M("div", Wo, R(B(O)("sidebar.generation.metadataTruncated", "Metadata Truncated")), 1), M("div", Go, R(B(O)("sidebar.generation.metadataTruncatedBody", "Generation data is incomplete because it exceeded the size limit.")), 1)], 4)) : N("", !0), + }, [M("div", is, R(B(O)("sidebar.generation.metadataTruncated", "Metadata Truncated")), 1), M("div", as, R(B(O)("sidebar.generation.metadataTruncatedBody", "Generation data is incomplete because it exceeded the size limit.")), 1)], 4)) : N("", !0), _.value.kind === "media-only" ? (I(), z("div", { key: 3, style: L(m("#9E9E9E", { @@ -6111,7 +6163,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .1, endAlpha: .06 })) - }, [M("div", Ko, R(B(O)("sidebar.generation.generationData", "Generation Data")), 1), M("div", qo, R(_.value.mediaOnlyMessage), 1)], 4)) : N("", !0), + }, [M("div", os, R(B(O)("sidebar.generation.generationData", "Generation Data")), 1), M("div", ss, R(_.value.mediaOnlyMessage), 1)], 4)) : N("", !0), _.value.kind === "full" ? (I(), z(j, { key: 4 }, [ _.value.ltxDirector ? (I(), z("div", { key: 0, @@ -6121,7 +6173,7 @@ var Do = ["title"], Oo = ["src"], ko = { endAlpha: .08 })) }, [ - M("div", Jo, [M("div", Yo, R(_.value.ltxDirector.title || "LTX Director"), 1), t[8] ||= M("span", { style: { + M("div", cs, [M("div", ls, R(_.value.ltxDirector.title || "LTX Director"), 1), t[8] ||= M("span", { style: { "font-size": "10px", "font-weight": "700", color: "#26C6DA", @@ -6130,7 +6182,7 @@ var Do = ["title"], Oo = ["src"], ko = { "border-radius": "999px", padding: "2px 8px" } }, " Director ", -1)]), - _.value.ltxDirector.fields.length ? (I(), z("div", Xo, [(I(!0), z(j, null, F(_.value.ltxDirector.fields, (e) => (I(), z("div", { + _.value.ltxDirector.fields.length ? (I(), z("div", us, [(I(!0), z(j, null, F(_.value.ltxDirector.fields, (e) => (I(), z("div", { key: `ltx-field-${e.label}`, style: { border: "1px solid rgba(255,255,255,0.10)", @@ -6139,8 +6191,8 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "7px 8px", "min-width": "0" } - }, [M("div", Zo, R(e.label), 1), M("div", Qo, R(e.value), 1)]))), 128))])) : N("", !0), - _.value.ltxDirector.globalPrompt ? (I(), z("div", $o, [t[9] ||= M("div", { style: { + }, [M("div", ds, R(e.label), 1), M("div", fs, R(e.value), 1)]))), 128))])) : N("", !0), + _.value.ltxDirector.globalPrompt ? (I(), z("div", ps, [t[9] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", color: "#66BB6A", @@ -6158,8 +6210,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[0] ||= (e) => D(_.value.ltxDirector.globalPrompt, e.currentTarget) - }, R(_.value.ltxDirector.globalPrompt), 9, es)])) : N("", !0), - _.value.ltxDirector.segments.length ? (I(), z("div", ts, [(I(!0), z(j, null, F(_.value.ltxDirector.segments, (e) => (I(), z("div", { + }, R(_.value.ltxDirector.globalPrompt), 9, ms)])) : N("", !0), + _.value.ltxDirector.segments.length ? (I(), z("div", hs, [(I(!0), z(j, null, F(_.value.ltxDirector.segments, (e) => (I(), z("div", { key: e.key, style: { border: "1px solid rgba(38,198,218,0.30)", @@ -6167,7 +6219,7 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(38,198,218,0.075)", padding: "10px" } - }, [M("div", ns, [M("div", rs, R(e.label), 1), M("div", is, [e.inLabel ? (I(), z("span", as, " in " + R(e.inLabel), 1)) : N("", !0), e.outLabel ? (I(), z("span", os, " out " + R(e.outLabel), 1)) : N("", !0)])]), M("div", ss, [e.filename ? (I(), $e(Po, { + }, [M("div", gs, [M("div", _s, R(e.label), 1), M("div", vs, [e.inLabel ? (I(), z("span", ys, " in " + R(e.inLabel), 1)) : N("", !0), e.outLabel ? (I(), z("span", bs, " out " + R(e.outLabel), 1)) : N("", !0)])]), M("div", xs, [e.filename ? (I(), nt(Jo, { key: 0, "input-file": { filename: e.filename, @@ -6178,7 +6230,7 @@ var Do = ["title"], Oo = ["src"], ko = { isAudio: e.isAudio, previewCandidates: e.previewCandidates } - }, null, 8, ["input-file"])) : N("", !0), M("div", cs, [e.prompt ? (I(), z("div", { + }, null, 8, ["input-file"])) : N("", !0), M("div", Ss, [e.prompt ? (I(), z("div", { key: 0, title: B(O)("action.clickToCopy", "Click to copy"), style: { @@ -6190,7 +6242,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.prompt, t.currentTarget) - }, R(e.prompt), 9, ls)) : N("", !0), e.filename || e.type ? (I(), z("div", us, [e.type ? (I(), z("span", ds, R(e.type), 1)) : N("", !0), e.filename ? (I(), z("span", fs, R(e.filename), 1)) : N("", !0)])) : N("", !0)])])]))), 128))])) : N("", !0) + }, R(e.prompt), 9, Cs)) : N("", !0), e.filename || e.type ? (I(), z("div", ws, [e.type ? (I(), z("span", Ts, R(e.type), 1)) : N("", !0), e.filename ? (I(), z("span", Es, R(e.filename), 1)) : N("", !0)])) : N("", !0)])])]))), 128))])) : N("", !0) ], 4)) : N("", !0), _.value.ideogram ? (I(), z("div", { key: 1, @@ -6200,7 +6252,7 @@ var Do = ["title"], Oo = ["src"], ko = { endAlpha: .08 })) }, [ - M("div", ps, [M("div", ms, R(_.value.ideogram.title || "Ideogram 4"), 1), t[10] ||= M("span", { style: { + M("div", Ds, [M("div", Os, R(_.value.ideogram.title || "Ideogram 4"), 1), t[10] ||= M("span", { style: { "font-size": "10px", "font-weight": "700", color: "#FFCA28", @@ -6209,7 +6261,7 @@ var Do = ["title"], Oo = ["src"], ko = { "border-radius": "999px", padding: "2px 8px" } }, " Prompt JSON ", -1)]), - _.value.ideogram.fields.length ? (I(), z("div", hs, [(I(!0), z(j, null, F(_.value.ideogram.fields, (e) => (I(), z("div", { + _.value.ideogram.fields.length ? (I(), z("div", ks, [(I(!0), z(j, null, F(_.value.ideogram.fields, (e) => (I(), z("div", { key: `ideogram-field-${e.label}`, style: { border: "1px solid rgba(255,255,255,0.10)", @@ -6218,8 +6270,8 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "7px 8px", "min-width": "0" } - }, [M("div", gs, R(e.label), 1), M("div", _s, R(e.value), 1)]))), 128))])) : N("", !0), - _.value.ideogram.highLevelDescription ? (I(), z("div", vs, [t[11] ||= M("div", { style: { + }, [M("div", As, R(e.label), 1), M("div", js, R(e.value), 1)]))), 128))])) : N("", !0), + _.value.ideogram.highLevelDescription ? (I(), z("div", Ms, [t[11] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", color: "#81C784", @@ -6237,8 +6289,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[1] ||= (e) => D(_.value.ideogram.highLevelDescription, e.currentTarget) - }, R(_.value.ideogram.highLevelDescription), 9, ys)])) : N("", !0), - _.value.ideogram.background ? (I(), z("div", bs, [t[12] ||= M("div", { style: { + }, R(_.value.ideogram.highLevelDescription), 9, Ns)])) : N("", !0), + _.value.ideogram.background ? (I(), z("div", Ps, [t[12] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", color: "#64B5F6", @@ -6256,8 +6308,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[2] ||= (e) => D(_.value.ideogram.background, e.currentTarget) - }, R(_.value.ideogram.background), 9, xs)])) : N("", !0), - _.value.ideogram.elements.length ? (I(), z("div", Ss, [(I(!0), z(j, null, F(_.value.ideogram.elements, (e) => (I(), z("div", { + }, R(_.value.ideogram.background), 9, Fs)])) : N("", !0), + _.value.ideogram.elements.length ? (I(), z("div", Is, [(I(!0), z(j, null, F(_.value.ideogram.elements, (e) => (I(), z("div", { key: e.key, style: { border: "1px solid rgba(255,179,0,0.30)", @@ -6266,7 +6318,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px" } }, [ - M("div", Cs, [M("div", ws, R(e.label), 1), e.bbox ? (I(), z("span", Ts, " bbox " + R(e.bbox), 1)) : N("", !0)]), + M("div", Ls, [M("div", Rs, R(e.label), 1), e.bbox ? (I(), z("span", zs, " bbox " + R(e.bbox), 1)) : N("", !0)]), e.description ? (I(), z("div", { key: 0, title: B(O)("action.clickToCopy", "Click to copy"), @@ -6279,8 +6331,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.description, t.currentTarget) - }, R(e.description), 9, Es)) : N("", !0), - e.palette.length ? (I(), z("div", Ds, [(I(!0), z(j, null, F(e.palette, (t) => (I(), z("span", { + }, R(e.description), 9, Bs)) : N("", !0), + e.palette.length ? (I(), z("div", Vs, [(I(!0), z(j, null, F(e.palette, (t) => (I(), z("span", { key: `${e.key}-${t}`, title: t, style: L({ @@ -6291,9 +6343,9 @@ var Do = ["title"], Oo = ["src"], ko = { background: t }), onClick: (e) => D(t, e.currentTarget) - }, null, 12, Os))), 128))])) : N("", !0) + }, null, 12, Hs))), 128))])) : N("", !0) ]))), 128))])) : N("", !0), - M("details", ks, [t[13] ||= M("summary", { style: { + M("details", Us, [t[13] ||= M("summary", { style: { cursor: "pointer", padding: "8px 10px", "font-size": "10px", @@ -6316,7 +6368,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[3] ||= (e) => D(_.value.ideogram.json, e.currentTarget) - }, R(_.value.ideogram.json), 9, As)]) + }, R(_.value.ideogram.json), 9, Ws)]) ], 4)) : N("", !0), !_.value.ltxDirector && !_.value.ideogram && _.value.promptTabs.length ? (I(), z("div", { key: 2, @@ -6326,8 +6378,8 @@ var Do = ["title"], Oo = ["src"], ko = { endAlpha: .1 })) }, [ - M("div", js, R(B(O)("sidebar.generation.promptPipeline", "Prompt Pipeline ({count} variants)", { count: _.value.promptTabs.length })), 1), - M("div", Ms, [(I(!0), z(j, null, F(_.value.promptTabs, (e, t) => (I(), $e(r, { + M("div", Gs, R(B(O)("sidebar.generation.promptPipeline", "Prompt Pipeline ({count} variants)", { count: _.value.promptTabs.length })), 1), + M("div", Ks, [(I(!0), z(j, null, F(_.value.promptTabs, (e, t) => (I(), nt(r, { key: e.label, type: "button", severity: "secondary", @@ -6347,10 +6399,10 @@ var Do = ["title"], Oo = ["src"], ko = { }), onClick: (e) => n.value = t }, { - default: tt(() => [Qe(R(e.label), 1)]), + default: it(() => [tt(R(e.label), 1)]), _: 2 }, 1032, ["style", "onClick"]))), 128))]), - (I(!0), z(j, null, F(_.value.promptTabs, (e, t) => ot((I(), z("div", { + (I(!0), z(j, null, F(_.value.promptTabs, (e, t) => lt((I(), z("div", { key: `${e.label}-panel`, style: { display: "flex", @@ -6363,7 +6415,7 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "10px" } }, [ - M("div", Ns, R(B(O)("sidebar.generation.positive", "POSITIVE")), 1), + M("div", qs, R(B(O)("sidebar.generation.positive", "POSITIVE")), 1), M("div", { style: { "font-size": "12px", @@ -6373,8 +6425,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.positive, t.currentTarget) - }, R(e.positive), 9, Ps), - e.negative ? (I(), z(j, { key: 0 }, [M("div", Fs, R(B(O)("sidebar.generation.negative", "NEGATIVE")), 1), M("div", { + }, R(e.positive), 9, Js), + e.negative ? (I(), z(j, { key: 0 }, [M("div", Ys, R(B(O)("sidebar.generation.negative", "NEGATIVE")), 1), M("div", { style: { "font-size": "12px", color: "var(--fg-color, #ddd)", @@ -6383,8 +6435,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.negative, t.currentTarget) - }, R(e.negative), 9, Is)], 64)) : N("", !0) - ])), [[lt, n.value === t]])), 128)) + }, R(e.negative), 9, Xs)], 64)) : N("", !0) + ])), [[ft, n.value === t]])), 128)) ], 4)) : !_.value.ltxDirector && !_.value.ideogram && _.value.positivePrompt ? (I(), z("div", { key: 3, style: L(m("#4CAF50", { @@ -6392,11 +6444,11 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .16, endAlpha: .1 })) - }, [M("div", Ls, [M("span", null, R(B(O)("sidebar.generation.positivePrompt", "Positive Prompt")), 1), _.value.positivePromptOverride ? (I(), z("span", { + }, [M("div", Zs, [M("span", null, R(B(O)("sidebar.generation.positivePrompt", "Positive Prompt")), 1), _.value.positivePromptOverride ? (I(), z("span", { key: 0, style: L(g()), title: B(O)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") - }, R(B(O)("sidebar.generation.override", "override")), 13, Rs)) : N("", !0)]), M("div", { + }, R(B(O)("sidebar.generation.override", "override")), 13, Qs)) : N("", !0)]), M("div", { title: B(O)("action.clickToCopy", "Click to copy"), style: { "font-size": "12px", @@ -6407,7 +6459,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[4] ||= (e) => D(_.value.positivePrompt, e.currentTarget) - }, R(_.value.positivePrompt), 9, zs)], 4)) : N("", !0), + }, R(_.value.positivePrompt), 9, $s)], 4)) : N("", !0), !_.value.ltxDirector && !_.value.ideogram && !_.value.promptTabs.length && _.value.negativePrompt ? (I(), z("div", { key: 4, style: L(m("#F44336", { @@ -6415,11 +6467,11 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .16, endAlpha: .1 })) - }, [M("div", Bs, [M("span", null, R(B(O)("sidebar.generation.negativePrompt", "Negative Prompt")), 1), _.value.negativePromptOverride ? (I(), z("span", { + }, [M("div", ec, [M("span", null, R(B(O)("sidebar.generation.negativePrompt", "Negative Prompt")), 1), _.value.negativePromptOverride ? (I(), z("span", { key: 0, style: L(g()), title: B(O)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") - }, R(B(O)("sidebar.generation.override", "override")), 13, Vs)) : N("", !0)]), M("div", { + }, R(B(O)("sidebar.generation.override", "override")), 13, tc)) : N("", !0)]), M("div", { title: B(O)("action.clickToCopy", "Click to copy"), style: { "font-size": "12px", @@ -6430,7 +6482,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[5] ||= (e) => D(_.value.negativePrompt, e.currentTarget) - }, R(_.value.negativePrompt), 9, Hs)], 4)) : N("", !0) + }, R(_.value.negativePrompt), 9, nc)], 4)) : N("", !0) ], 64)) : N("", !0), y.value ? (I(), z("div", { key: 5, @@ -6443,12 +6495,12 @@ var Do = ["title"], Oo = ["src"], ko = { "flex-direction": "column", gap: "10px" }, - class: Dt({ "mjr-ai-disabled-block": !v.value }) + class: At({ "mjr-ai-disabled-block": !v.value }) }, [ _.value.showAlignment ? (I(), z(j, { key: 0 }, [ - M("div", Us, [M("span", { title: B(O)("sidebar.generation.promptAlignmentTooltip", "How closely the generated image matches the prompt (SigLIP2 score)") }, R(B(O)("sidebar.generation.promptAlignment", "Prompt Alignment")), 9, Ws)]), - M("div", Gs, [ - M("div", Ks, [M("div", { style: L({ + M("div", rc, [M("span", { title: B(O)("sidebar.generation.promptAlignmentTooltip", "How closely the generated image matches the prompt (SigLIP2 score)") }, R(B(O)("sidebar.generation.promptAlignment", "Prompt Alignment")), 9, ic)]), + M("div", ac, [ + M("div", oc, [M("div", { style: L({ height: "100%", width: l.value.fillWidth, background: l.value.fillColor, @@ -6474,9 +6526,9 @@ var Do = ["title"], Oo = ["src"], ko = { letterSpacing: "0.5px" }) }, R(l.value.qualityText), 5) ]), - l.value.aiStatusVisible ? (I(), z("div", qs, R(l.value.aiStatusText), 1)) : N("", !0) + l.value.aiStatusVisible ? (I(), z("div", sc, R(l.value.aiStatusText), 1)) : N("", !0) ], 64)) : N("", !0), - M("div", Js, [M("span", { title: B(O)("sidebar.generation.aiCaptionTooltip", "AI caption generated by Florence-2") }, R(_.value.captionLabel), 9, Ys), M("div", Xs, [gt(r, { + M("div", cc, [M("span", { title: B(O)("sidebar.generation.aiCaptionTooltip", "AI caption generated by Florence-2") }, R(_.value.captionLabel), 9, lc), M("div", uc, [yt(r, { type: "button", class: "mjr-ai-control", severity: "secondary", @@ -6495,11 +6547,11 @@ var Do = ["title"], Oo = ["src"], ko = { opacity: x.value ? "1" : "0.6", cursor: x.value ? "pointer" : "default" }]), - onClick: at(se, ["stop"]) + onClick: ct(se, ["stop"]) }, { - default: tt(() => [Qe(R(o.value), 1)]), + default: it(() => [tt(R(o.value), 1)]), _: 1 - }, 8, ["disabled", "style"]), gt(r, { + }, 8, ["disabled", "style"]), yt(r, { type: "button", class: "mjr-ai-control", severity: "secondary", @@ -6518,9 +6570,9 @@ var Do = ["title"], Oo = ["src"], ko = { opacity: S.value ? "1" : "0.6", cursor: S.value ? "pointer" : "default" }]), - onClick: at(ce, ["stop"]) + onClick: ct(ce, ["stop"]) }, { - default: tt(() => [Qe(R(a.value), 1)]), + default: it(() => [tt(R(a.value), 1)]), _: 1 }, 8, ["disabled", "style"])])]), M("div", { @@ -6539,7 +6591,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: S.value ? "copy" : "default" }), onClick: ce - }, R(b.value), 13, Zs) + }, R(b.value), 13, dc) ], 2)) : N("", !0), C.value.length ? (I(), z("div", { key: 6, @@ -6548,7 +6600,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .18, endAlpha: .1 })) - }, [M("div", Qs, R(B(O)("sidebar.generation.models", "Models")), 1), M("div", $s, [(I(!0), z(j, null, F(C.value, (e) => (I(), z("div", { + }, [M("div", fc, R(B(O)("sidebar.generation.models", "Models")), 1), M("div", pc, [(I(!0), z(j, null, F(C.value, (e) => (I(), z("div", { key: `models-top-${e.key}`, style: L(w(T(e), !0)) }, [ @@ -6567,7 +6619,7 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "3px", "min-width": "0" } - }, [M("span", ec, R(t.label), 1), M("span", { + }, [M("span", mc, R(t.label), 1), M("span", { style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.96))", @@ -6576,8 +6628,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t.value, e.currentTarget) - }, R(t.value || "-"), 9, tc)]))), 128)), - e.loras.length ? (I(), z("div", nc, [t[14] ||= M("span", { style: { + }, R(t.value || "-"), 9, hc)]))), 128)), + e.loras.length ? (I(), z("div", gc, [t[14] ||= M("span", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", @@ -6597,12 +6649,12 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t, e.currentTarget) - }, R(t), 9, rc))), 128))])) : N("", !0) + }, R(t), 9, _c))), 128))])) : N("", !0) ], 4))), 128))])], 4)) : N("", !0), _.value.lyrics ? (I(), z("div", { key: 7, style: L(m("#00BCD4", { emphasis: !1 })) - }, [M("div", ic, [M("span", null, R(B(O)("sidebar.generation.lyrics", "Lyrics")), 1)]), M("div", ac, R(_.value.lyrics), 1)], 4)) : N("", !0), + }, [M("div", vc, [M("span", null, R(B(O)("sidebar.generation.lyrics", "Lyrics")), 1)]), M("div", yc, R(_.value.lyrics), 1)], 4)) : N("", !0), _.value.branchCards.length ? (I(), z(j, { key: 8 }, [ N("", !0), ee.value.length ? (I(), z("div", { @@ -6612,7 +6664,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .16, endAlpha: .1 })) - }, [M("div", oc, R(B(O)("sidebar.generation.sampling", "Sampling")), 1), M("div", sc, [(I(!0), z(j, null, F(ee.value, (e) => (I(), z("div", { + }, [M("div", bc, R(B(O)("sidebar.generation.sampling", "Sampling")), 1), M("div", xc, [(I(!0), z(j, null, F(ee.value, (e) => (I(), z("div", { key: `sampling-${e.key}`, style: L(w(E(e), !0)) }, [M("div", { style: L({ @@ -6639,7 +6691,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t.value, e.currentTarget) - }, R(t.value), 9, cc)]))), 128))], 4))), 128))])], 4)) : N("", !0), + }, R(t.value), 9, Sc)]))), 128))], 4))), 128))])], 4)) : N("", !0), N("", !0) ], 64)) : _.value.modelGroups.length ? (I(), z("div", { key: 9, @@ -6648,11 +6700,11 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .18, endAlpha: .1 })) - }, [M("div", lc, R(B(O)("sidebar.generation.models", "Models")), 1), M("div", uc, [(I(!0), z(j, null, F(_.value.modelGroups, (e) => (I(), z("div", { + }, [M("div", Cc, R(B(O)("sidebar.generation.models", "Models")), 1), M("div", wc, [(I(!0), z(j, null, F(_.value.modelGroups, (e) => (I(), z("div", { key: `model-group-${e.key}`, style: L(w(re(e.key), !0)) }, [ - M("div", dc, [M("div", { style: L({ + M("div", Tc, [M("div", { style: L({ fontSize: "10px", fontWeight: "800", color: re(e.key), @@ -6669,7 +6721,7 @@ var Do = ["title"], Oo = ["src"], ko = { letterSpacing: "0.4px", textTransform: "uppercase" }) }, R(e.loras?.length || 0) + " LoRA ", 5)]), - M("div", fc, [t[15] ||= M("div", { style: { + M("div", Ec, [t[15] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", @@ -6684,8 +6736,8 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.model, t.currentTarget) - }, R(e.model || "-"), 9, pc)]), - e.loras?.length ? (I(), z("div", mc, [M("div", hc, R(B(O)("sidebar.generation.loraStack", "LoRA Stack")), 1), M("div", gc, [(I(!0), z(j, null, F(e.loras, (t, n) => (I(), z("div", { + }, R(e.model || "-"), 9, Dc)]), + e.loras?.length ? (I(), z("div", Oc, [M("div", kc, R(B(O)("sidebar.generation.loraStack", "LoRA Stack")), 1), M("div", Ac, [(I(!0), z(j, null, F(e.loras, (t, n) => (I(), z("div", { key: `${e.key}-lora-${n}`, style: { "font-size": "12px", @@ -6699,7 +6751,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t, e.currentTarget) - }, R(t), 9, _c))), 128))])])) : N("", !0) + }, R(t), 9, jc))), 128))])])) : N("", !0) ], 4))), 128))])], 4)) : N("", !0), (I(!0), z(j, null, F(te.value, (e) => (I(), z("div", { key: e.key, @@ -6711,7 +6763,7 @@ var Do = ["title"], Oo = ["src"], ko = { textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: "10px" - }) }, R(e.title), 5), M("div", vc, [(I(!0), z(j, null, F(e.fields, (t) => (I(), z(j, { key: `${e.key}-${t.label}` }, [M("div", { + }) }, R(e.title), 5), M("div", Mc, [(I(!0), z(j, null, F(e.fields, (t) => (I(), z(j, { key: `${e.key}-${t.label}` }, [M("div", { title: t.label, style: { "font-size": "11px", @@ -6725,7 +6777,7 @@ var Do = ["title"], Oo = ["src"], ko = { key: 0, style: L(g()), title: B(O)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") - }, R(B(O)("sidebar.generation.override", "override")), 13, bc)) : N("", !0)], 8, yc), M("div", { + }, R(B(O)("sidebar.generation.override", "override")), 13, Pc)) : N("", !0)], 8, Nc), M("div", { title: `${t.label}: ${t.value}`, style: { "font-size": "12px", @@ -6735,11 +6787,11 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t.value, e.currentTarget) - }, R(t.value), 9, xc)], 64))), 128))])], 4))), 128)), + }, R(t.value), 9, Fc)], 64))), 128))])], 4))), 128)), _.value.notesFields.length ? (I(), z("div", { key: 10, style: L(m("#4CAF50", { emphasis: !1 })) - }, [M("div", Sc, R(B(O)("sidebar.generation.notes", "Notes")), 1), (I(!0), z(j, null, F(_.value.notesFields, (e) => (I(), z("div", { + }, [M("div", Ic, R(B(O)("sidebar.generation.notes", "Notes")), 1), (I(!0), z(j, null, F(_.value.notesFields, (e) => (I(), z("div", { key: e.label, title: `${e.label}: ${e.value}`, style: { @@ -6751,7 +6803,7 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (t) => D(e.value, t.currentTarget) - }, R(e.value), 9, Cc))), 128))], 4)) : N("", !0), + }, R(e.value), 9, Lc))), 128))], 4)) : N("", !0), _.value.moduleBlocks.length ? (I(), z("div", { key: 11, style: L(m("#26C6DA", { @@ -6759,7 +6811,7 @@ var Do = ["title"], Oo = ["src"], ko = { startAlpha: .14, endAlpha: .08 })) - }, [M("div", wc, R(B(O)("sidebar.generation.modules", "Modules")), 1), M("div", Tc, [(I(!0), z(j, null, F(_.value.moduleBlocks, (e) => (I(), z("div", { + }, [M("div", Rc, R(B(O)("sidebar.generation.modules", "Modules")), 1), M("div", zc, [(I(!0), z(j, null, F(_.value.moduleBlocks, (e) => (I(), z("div", { key: `module-${e.key}-${e.title}`, style: L(w(e.accent, !1)) }, [M("div", { style: L({ @@ -6776,7 +6828,7 @@ var Do = ["title"], Oo = ["src"], ko = { gap: "3px", "min-width": "0" } - }, [M("span", Ec, R(t.label), 1), M("span", { + }, [M("span", Bc, R(t.label), 1), M("span", { title: `${t.label}: ${t.value}`, style: { "font-size": "12px", @@ -6787,11 +6839,11 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: (e) => D(t.value, e.currentTarget) - }, R(t.value), 9, Dc)]))), 128))], 4))), 128))])], 4)) : N("", !0), + }, R(t.value), 9, Vc)]))), 128))], 4))), 128))])], 4)) : N("", !0), _.value.ttsInstruction ? (I(), z("div", { key: 12, style: L(m("#26A69A", { emphasis: !1 })) - }, [M("div", Oc, [M("span", null, R(B(O)("sidebar.generation.ttsInstruction", "TTS Instruction")), 1)]), M("div", { + }, [M("div", Hc, [M("span", null, R(B(O)("sidebar.generation.ttsInstruction", "TTS Instruction")), 1)]), M("div", { title: B(O)("action.clickToCopy", "Click to copy"), style: { "font-size": "12px", @@ -6802,11 +6854,11 @@ var Do = ["title"], Oo = ["src"], ko = { cursor: "pointer" }, onClick: t[6] ||= (e) => D(_.value.ttsInstruction, e.currentTarget) - }, R(_.value.ttsInstruction), 9, kc)], 4)) : N("", !0), + }, R(_.value.ttsInstruction), 9, Uc)], 4)) : N("", !0), _.value.seed !== null && _.value.seed !== void 0 && _.value.seed !== "" ? (I(), z("div", { key: 13, style: L(h()) - }, [M("div", Ac, R(B(O)("sidebar.generation.seed", "SEED")), 1), M("div", { + }, [M("div", Wc, R(B(O)("sidebar.generation.seed", "SEED")), 1), M("div", { title: B(O)("sidebar.generation.copySeedTooltip", "Click to copy seed: {seed}", { seed: _.value.seed }), style: { "font-size": "18px", @@ -6820,7 +6872,7 @@ var Do = ["title"], Oo = ["src"], ko = { transition: "background 0.2s" }, onClick: t[7] ||= (e) => D(_.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)") - }, R(_.value.seed), 9, jc)], 4)) : N("", !0), + }, R(_.value.seed), 9, Gc)], 4)) : N("", !0), _.value.inputFiles.length ? (I(), z("div", { key: 14, style: L(m("#4CAF50", { @@ -6838,14 +6890,14 @@ var Do = ["title"], Oo = ["src"], ko = { "letter-spacing": "0.5px", "margin-bottom": "8px" } - }, R(B(O)("sidebar.generation.sourceFiles", "Source Files")), 9, Mc), M("div", Nc, [(I(!0), z(j, null, F(_.value.inputFiles, (e) => (I(), $e(Po, { + }, R(B(O)("sidebar.generation.sourceFiles", "Source Files")), 9, Kc), M("div", qc, [(I(!0), z(j, null, F(_.value.inputFiles, (e) => (I(), nt(Jo, { key: e.id, "input-file": e }, null, 8, ["input-file"]))), 128))])], 4)) : N("", !0) ])); }; } -}), Fc = { +}), Yc = { key: 0, class: "mjr-sidebar-section", style: { @@ -6855,14 +6907,14 @@ var Do = ["title"], Oo = ["src"], ko = { padding: "12px", "min-width": "300px" } -}, Ic = { style: { "margin-bottom": "12px" } }, Lc = { style: { +}, Xc = { style: { "margin-bottom": "12px" } }, Zc = { style: { "font-size": "16px", "font-weight": "800", color: "rgba(255,255,255,0.94)", "line-height": "1.25", overflow: "hidden", "text-overflow": "ellipsis" -} }, Rc = ["title"], zc = { +} }, Qc = ["title"], $c = { key: 1, style: { display: "flex", @@ -6872,16 +6924,16 @@ var Do = ["title"], Oo = ["src"], ko = { "min-width": "0" }, "aria-label": "Workflow metadata badges" -}, Bc = ["title"], Vc = { style: { +}, el = ["title"], tl = { style: { overflow: "hidden", "text-overflow": "ellipsis", "white-space": "nowrap" -} }, Hc = { style: { +} }, nl = { style: { display: "flex", "flex-wrap": "wrap", gap: "8px", "margin-bottom": "10px" -} }, Uc = { style: { +} }, rl = { style: { padding: "4px 9px", "border-radius": "999px", background: "rgba(33,150,243,0.14)", @@ -6891,7 +6943,7 @@ var Do = ["title"], Oo = ["src"], ko = { color: "#90CAF9", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Wc = { +} }, il = { key: 0, style: { padding: "4px 9px", @@ -6902,12 +6954,12 @@ var Do = ["title"], Oo = ["src"], ko = { "font-weight": "600", color: "rgba(255,255,255,0.82)" } -}, Gc = { style: { +}, al = { style: { display: "grid", "grid-template-columns": "repeat(2, minmax(0, 1fr))", gap: "8px", "margin-bottom": "12px" -} }, Kc = { +} }, ol = { key: 0, style: { padding: "8px 10px", @@ -6915,12 +6967,12 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" } -}, qc = { style: { +}, sl = { style: { "font-size": "13px", "font-weight": "750", color: "rgba(255,255,255,0.92)", "margin-top": "3px" -} }, Jc = { +} }, cl = { key: 1, style: { padding: "8px 10px", @@ -6928,12 +6980,12 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" } -}, Yc = { style: { +}, ll = { style: { "font-size": "13px", "font-weight": "750", color: "rgba(255,255,255,0.92)", "margin-top": "3px" -} }, Xc = { +} }, ul = { key: 2, style: { padding: "8px 10px", @@ -6941,12 +6993,12 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" } -}, Zc = { style: { +}, dl = { style: { "font-size": "13px", "font-weight": "750", color: "rgba(255,255,255,0.92)", "margin-top": "3px" -} }, Qc = { +} }, fl = { key: 3, style: { padding: "8px 10px", @@ -6954,19 +7006,19 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" } -}, $c = { style: { +}, pl = { style: { "font-size": "12px", "font-weight": "650", color: "rgba(255,255,255,0.84)", "margin-top": "3px" -} }, el = { +} }, ml = { key: 0, style: { "font-size": "11px", color: "rgba(255,255,255,0.54)", "margin-top": "2px" } -}, tl = { +}, hl = { key: 0, style: { "margin-bottom": "12px", @@ -6975,14 +7027,14 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(244,67,54,0.08)", border: "1px solid rgba(244,67,54,0.25)" } -}, nl = { +}, gl = { key: 1, style: { display: "flex", "flex-wrap": "wrap", gap: "5px" } -}, rl = { +}, _l = { key: 1, style: { "margin-bottom": "12px", @@ -6991,7 +7043,7 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.035)", border: "1px solid rgba(255,255,255,0.10)" } -}, il = { +}, vl = { key: 0, style: { "font-size": "12px", @@ -6999,12 +7051,12 @@ var Do = ["title"], Oo = ["src"], ko = { color: "rgba(255,255,255,0.82)", "white-space": "pre-wrap" } -}, al = { style: { +}, yl = { style: { display: "grid", "grid-template-columns": "repeat(3, minmax(0, 1fr))", gap: "8px", "margin-bottom": "12px" -} }, ol = { +} }, bl = { key: 2, style: { "margin-bottom": "12px", @@ -7013,92 +7065,92 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(76,175,80,0.07)", border: "1px solid rgba(76,175,80,0.22)" } -}, sl = { style: { +}, xl = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "8px", "margin-bottom": "7px" -} }, cl = { style: { +} }, Sl = { style: { "font-size": "11px", color: "rgba(255,255,255,0.62)" -} }, ll = { +} }, Cl = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "6px" } -}, ul = { +}, wl = { key: 0, style: { display: "flex", "flex-wrap": "wrap", gap: "5px" } -}, dl = { +}, Tl = { key: 1, style: { display: "flex", "flex-wrap": "wrap", gap: "5px" } -}, fl = { +}, El = { key: 1, style: { "font-size": "12px", color: "rgba(255,255,255,0.78)" } -}, pl = { +}, Dl = { key: 2, style: { "margin-top": "7px", "font-size": "11px", color: "rgba(255,255,255,0.58)" } -}, ml = { +}, Ol = { key: 3, style: { "margin-top": "8px", "font-size": "11px", color: "rgba(255,255,255,0.62)" } -}, hl = { key: 0 }, gl = { style: { +}, kl = { key: 0 }, Al = { style: { display: "grid", "grid-template-columns": "repeat(3, minmax(0, 1fr))", gap: "8px", "margin-bottom": "12px" -} }, _l = { style: { +} }, jl = { style: { padding: "8px 10px", "border-radius": "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" -} }, vl = { style: { +} }, Ml = { style: { "font-size": "18px", "font-weight": "700", color: "rgba(255,255,255,0.94)", "margin-top": "2px" -} }, yl = { style: { +} }, Nl = { style: { padding: "8px 10px", "border-radius": "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" -} }, bl = { style: { +} }, Pl = { style: { "font-size": "18px", "font-weight": "700", color: "rgba(255,255,255,0.94)", "margin-top": "2px" -} }, xl = { style: { +} }, Fl = { style: { padding: "8px 10px", "border-radius": "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" -} }, Sl = { style: { +} }, Il = { style: { "font-size": "18px", "font-weight": "700", color: "rgba(255,255,255,0.94)", "margin-top": "2px" -} }, Cl = { +} }, Ll = { key: 3, style: { "margin-bottom": "12px", @@ -7107,41 +7159,41 @@ var Do = ["title"], Oo = ["src"], ko = { background: "rgba(255,255,255,0.03)", border: "1px solid rgba(255,255,255,0.10)" } -}, wl = { style: { +}, Rl = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px", "margin-bottom": "8px", "min-width": "0" -} }, Tl = { style: { +} }, zl = { style: { "min-width": "0", flex: "1 1 auto" -} }, El = ["title"], Dl = ["title"], Ol = { style: { +} }, Bl = ["title"], Vl = ["title"], Hl = { style: { display: "flex", gap: "8px", "align-items": "center" -} }, kl = ["placeholder"], Al = { +} }, Ul = ["placeholder"], Wl = { key: 4, class: "mjr-workflow-tree-wrap" -}, jl = { class: "mjr-workflow-tree-node" }, Ml = { class: "mjr-workflow-tree-node-name" }, Nl = { +}, Gl = { class: "mjr-workflow-tree-node" }, Kl = { class: "mjr-workflow-tree-node-name" }, ql = { key: 0, class: "mjr-workflow-tree-node-type" -}, Pl = { class: "mjr-menu-item-hint" }, Fl = { +}, Jl = { class: "mjr-menu-item-hint" }, Yl = { key: 0, class: "mjr-section-hint" -}, Il = { style: { +}, Xl = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px", "margin-top": "8px" -} }, Ll = { style: { +} }, Zl = { style: { display: "flex", "flex-wrap": "wrap", gap: "6px", "align-items": "center" -} }, Rl = { +} }, Ql = { key: 5, style: { display: "grid", @@ -7151,23 +7203,23 @@ var Do = ["title"], Oo = ["src"], ko = { "margin-top": "10px", "margin-bottom": "10px" } -}, zl = { style: { +}, $l = { style: { display: "flex", "flex-direction": "column", gap: "2px", "min-width": "0" -} }, Bl = { style: { +} }, eu = { style: { "font-size": "13px", "font-weight": "600" -} }, Vl = { style: { +} }, tu = { style: { "font-size": "11px", color: "rgba(255,255,255,0.58)" -} }, Hl = { style: { +} }, nu = { style: { display: "flex", gap: "10px", "align-items": "stretch", "margin-top": "10px" -} }, Ul = { style: { +} }, ru = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -7175,7 +7227,7 @@ var Do = ["title"], Oo = ["src"], ko = { "margin-top": "8px", "font-size": "11px", color: "rgba(255,255,255,0.58)" -} }, Wl = ["open"], Gl = { style: { +} }, iu = ["open"], au = { style: { background: "rgba(0,0,0,0.5)", padding: "10px", "border-radius": "6px", @@ -7185,7 +7237,7 @@ var Do = ["title"], Oo = ["src"], ko = { margin: "10px 0 0 0", color: "#90CAF9", "font-family": "'Consolas', 'Monaco', monospace" -} }, Kl = 1, ql = 8, Jl = 250, Yl = /* @__PURE__ */ rt({ +} }, ou = 1, su = 8, cu = 250, lu = /* @__PURE__ */ ot({ __name: "SidebarWorkflowSection", props: { asset: {} }, setup(e) { @@ -7227,7 +7279,7 @@ var Do = ["title"], Oo = ["src"], ko = { function re(e) { e && typeof e == "object" && (x.value = { ...x.value, - zoom: E(e.zoom ?? x.value.zoom, Kl, ql), + zoom: E(e.zoom ?? x.value.zoom, ou, su), centerX: Number.isFinite(Number(e.centerX)) ? Number(e.centerX) : null, centerY: Number.isFinite(Number(e.centerY)) ? Number(e.centerY) : null }); @@ -7295,7 +7347,7 @@ var Do = ["title"], Oo = ["src"], ko = { } function ce() { try { - let e = qt?.()?.workflowMinimap; + let e = Xt?.()?.workflowMinimap; if (e && typeof e == "object") return { ...r, ...e @@ -7313,7 +7365,7 @@ var Do = ["title"], Oo = ["src"], ko = { ...t }; try { - let e = qt(); + let e = Xt(); e.workflowMinimap = { ...e.workflowMinimap, ...n @@ -7328,7 +7380,7 @@ var Do = ["title"], Oo = ["src"], ko = { } function le(e) { try { - let t = qt(); + let t = Xt(); t.workflowMinimap = { ...t.workflowMinimap, ...e @@ -7339,7 +7391,7 @@ var Do = ["title"], Oo = ["src"], ko = { } let ue = P(() => { let e = oe(n.asset) || oe(d.value), t = se(n.asset) || se(d.value); - return !e && !t ? null : e || ma(t); + return !e && !t ? null : e || Oa(t); }), de = P(() => String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim()), fe = P(() => { if (de.value.toLowerCase().endsWith(".json")) return !0; let e = String(n.asset?.kind || "").trim().toLowerCase(), t = String(n.asset?.source || "").trim().toLowerCase(); @@ -7351,7 +7403,7 @@ var Do = ["title"], Oo = ["src"], ko = { n.asset?.detected_task ? `detected: ${n.asset.detected_task}` : "", n.asset?.detected_model_family ? n.asset.detected_model_family : "", n.asset?.detected_provider ? n.asset.detected_provider : "" - ].filter(Boolean).join(" · ")), Se = P(() => ze(n.asset?.missing_nodes || n.asset?.missingNodes)), we = P(() => ze(n.asset?.missing_models || n.asset?.missingModels)), Te = P(() => ze(n.asset?.tags || n.asset?.workflow_tags || n.asset?.tags_json)), De = P(() => Te.value.slice(0, 3)), Oe = P(() => Math.max(0, Te.value.length - De.value.length)), ke = P(() => ze(p.value?.missing_nodes)), Ae = P(() => ze(p.value?.missing_models)), je = P(() => ze(p.value?.warnings)), Me = P(() => { + ].filter(Boolean).join(" · ")), Se = P(() => Be(n.asset?.missing_nodes || n.asset?.missingNodes)), we = P(() => Be(n.asset?.missing_models || n.asset?.missingModels)), Te = P(() => Be(n.asset?.tags || n.asset?.workflow_tags || n.asset?.tags_json)), De = P(() => Te.value.slice(0, 3)), Oe = P(() => Math.max(0, Te.value.length - De.value.length)), ke = P(() => Be(p.value?.missing_nodes)), Ae = P(() => Be(p.value?.missing_models)), je = P(() => Be(p.value?.warnings)), Me = P(() => { let e = p.value; return e ? `${Number(e.node_count || 0)} nodes | ${Number(e.subgraph_count || 0)} subgraphs | ${Array.isArray(e.required_nodes) ? e.required_nodes.length : 0} node types` : ""; }), Ne = P(() => { @@ -7363,7 +7415,7 @@ var Do = ["title"], Oo = ["src"], ko = { }), Fe = P(() => { let e = Number(n.asset?.usage_count || n.asset?.usageCount || 0); return !Number.isFinite(e) || e <= 0 ? "" : `${Math.floor(e)} use${e === 1 ? "" : "s"}`; - }), Ie = P(() => A(n.asset?.last_loaded_at || n.asset?.lastLoadedAt)), Le = P(() => A(n.asset?.mtime || n.asset?.modified_at || n.asset?.updated_at)), k = P(() => { + }), Ie = P(() => Ve(n.asset?.last_loaded_at || n.asset?.lastLoadedAt)), Le = P(() => Ve(n.asset?.mtime || n.asset?.modified_at || n.asset?.updated_at)), Re = P(() => { let e = []; n.asset?.favorite && e.push({ key: "favorite", @@ -7394,25 +7446,25 @@ var Do = ["title"], Oo = ["src"], ko = { tone: "tag" }), e; }); - function Re(e) { + function ze(e) { let t = "display:inline-flex;align-items:center;gap:5px;max-width:100%;padding:4px 8px;border-radius:999px;font-size:10px;font-weight:750;line-height:1.1;overflow:hidden"; return e === "favorite" ? `${t};background:rgba(255,193,7,0.15);border:1px solid rgba(255,193,7,0.34);color:#ffe082` : e === "usage" ? `${t};background:rgba(33,150,243,0.14);border:1px solid rgba(33,150,243,0.30);color:#90caf9` : e === "loaded" ? `${t};background:rgba(76,175,80,0.13);border:1px solid rgba(76,175,80,0.28);color:#a5d6a7` : `${t};background:rgba(255,255,255,0.07);border:1px solid rgba(255,255,255,0.14);color:rgba(255,255,255,0.82)`; } - function ze(e) { + function Be(e) { if (Array.isArray(e)) return e.map((e) => String(e || "").trim()).filter(Boolean); if (typeof e == "string") { let t = e.trim(); if (!t) return []; try { let e = JSON.parse(t); - if (Array.isArray(e)) return ze(e); + if (Array.isArray(e)) return Be(e); } catch { return t.split(/[,\n]/).map((e) => e.trim()).filter(Boolean); } } return []; } - function A(e) { + function Ve(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return ""; let n = t > 1e10 ? t : t * 1e3; @@ -7422,7 +7474,7 @@ var Do = ["title"], Oo = ["src"], ko = { return ""; } } - async function Be() { + async function k() { if (ue.value) return; let e = de.value; if (e && !l.value) { @@ -7443,7 +7495,7 @@ var Do = ["title"], Oo = ["src"], ko = { } } } - let Ve = P(() => n.asset?.has_generation_data ? "Complete" : "Partial"), He = P(() => ue.value ? JSON.stringify(ue.value, null, 2) : ""), We = P(() => String(n.asset?.category || n.asset?.subfolder || n.asset?.folder || "").trim().replace(/^\/+|\/+$/g, "")), Ge = P(() => We.value ? We.value.split(/[\\/]+/).filter(Boolean) : []), Ke = P(() => Ge.value.at(-1) || We.value || "Root"), qe = P(() => Ge.value.slice(-1)); + let He = P(() => n.asset?.has_generation_data ? "Complete" : "Partial"), Ue = P(() => ue.value ? JSON.stringify(ue.value, null, 2) : ""), A = P(() => String(n.asset?.category || n.asset?.subfolder || n.asset?.folder || "").trim().replace(/^\/+|\/+$/g, "")), We = P(() => A.value ? A.value.split(/[\\/]+/).filter(Boolean) : []), Ge = P(() => We.value.at(-1) || A.value || "Root"), qe = P(() => We.value.slice(-1)); function Je(e, t) { let n = e?.id ?? e?.key ?? t + 1; return String(e?.title || e?._meta?.title || e?.type || e?.class_type || e?.name || `Node ${n}`); @@ -7452,9 +7504,9 @@ var Do = ["title"], Oo = ["src"], ko = { return String(e?.type || e?.class_type || e?.name || "").trim(); } function Xe() { - s.value = We.value; + s.value = A.value; } - async function rt() { + async function Ze() { if (!fe.value) return; let e = String(n.asset?.filepath || n.asset?.path || n.asset?.file_info?.filepath || "").trim(); if (!e) { @@ -7462,7 +7514,7 @@ var Do = ["title"], Oo = ["src"], ko = { return; } let r = String(s.value || "").trim(); - if (r !== We.value) { + if (r !== A.value) { c.value = !0; try { let n = await _({ @@ -7481,7 +7533,7 @@ var Do = ["title"], Oo = ["src"], ko = { } } } - async function at() { + async function Qe() { let e = de.value; if (!e) { t(O("toast.workflowMissingPath", "Workflow file path is missing."), "error"); @@ -7500,7 +7552,7 @@ var Do = ["title"], Oo = ["src"], ko = { t(O("toast.workflowThumbnailNoCandidates", "No linked outputs are available for this workflow yet."), "warning", 2600); return; } - let a = await ga({ + let a = await Aa({ title: O("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), workflow: n.asset, items: i @@ -7512,10 +7564,10 @@ var Do = ["title"], Oo = ["src"], ko = { }, { timeoutMs: 3e4 }); o?.ok ? (t(O("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-thumbnail-sidebar" } }))) : t(o?.error || O("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } - async function st() { - if (await Be(), !ue.value) t(O("toast.workflowLoadFailed", "Failed to load workflow."), "error"); + async function $e() { + if (await k(), !ue.value) t(O("toast.workflowLoadFailed", "Failed to load workflow."), "error"); else try { - await Ze.openAssets({ + await et.openAssets({ assets: [{ ...n.asset, workflow: ue.value, @@ -7528,7 +7580,7 @@ var Do = ["title"], Oo = ["src"], ko = { console.debug?.(e), t(O("toast.workflowLoadFailed", "Failed to load workflow."), "error"); } } - async function ct() { + async function ot() { let e = de.value; if (!e) t(O("toast.workflowMissingPath", "Workflow file path is missing."), "error"); else { @@ -7552,7 +7604,7 @@ var Do = ["title"], Oo = ["src"], ko = { } } } - let lt = P(() => (Array.isArray(ue.value?.nodes) ? ue.value.nodes : []).slice(0, Jl).map((e, t) => { + let ct = P(() => (Array.isArray(ue.value?.nodes) ? ue.value.nodes : []).slice(0, cu).map((e, t) => { let n = e?.id ?? e?.key ?? t + 1, r = Ye(e); return { key: String(n), @@ -7563,7 +7615,7 @@ var Do = ["title"], Oo = ["src"], ko = { type: r } }; - })), ut = P(() => Math.max(0, Number(dt.value.nodes || 0) - lt.value.length)), dt = P(() => { + })), ut = P(() => Math.max(0, Number(dt.value.nodes || 0) - ct.value.length)), dt = P(() => { let e = ue.value; return e ? { nodes: Array.isArray(e?.nodes) ? e.nodes.length : 0, @@ -7622,15 +7674,15 @@ var Do = ["title"], Oo = ["src"], ko = { let n = Math.max(1, e.clientWidth || 320), r = Math.max(1, e.clientHeight || 120), i = Math.max(1, Math.min(2, window.devicePixelRatio || 1)); e.width = Math.floor(n * i), e.height = Math.floor(r * i); let a = e.getContext("2d"); - a && a.setTransform(i, 0, 0, i, 0, 0), w = ia(e, t, { + a && a.setTransform(i, 0, 0, i, 0, 0), w = va(e, t, { ...b.value, view: x.value }) || null, re(w?.resolvedView); } - function _t(e) { - Ue(e); + function gt(e) { + Ke(e); } - function vt(e) { + function _t(e) { let t = o.value; if (!t) return null; let n = t.getBoundingClientRect?.(); @@ -7639,22 +7691,22 @@ var Do = ["title"], Oo = ["src"], ko = { y: Number(e?.clientY) - n.top } : null; } - function yt(e) { - let t = vt(e); + function vt(e) { + let t = _t(e); return !t || !w?.canvasToWorld ? null : { local: t, world: w.canvasToWorld(t.x, t.y) }; } function bt(e) { - let t = vt(e), n = t && w?.hitTestNode ? w.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = x.value.hoveredNodeId !== null && x.value.hoveredNodeId !== void 0 ? String(x.value.hoveredNodeId) : null; + let t = _t(e), n = t && w?.hitTestNode ? w.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = x.value.hoveredNodeId !== null && x.value.hoveredNodeId !== void 0 ? String(x.value.hoveredNodeId) : null; C.value = n?.label || "", r !== i && (x.value = { ...x.value, hoveredNodeId: r }, ht()); } function xt(e) { - e && (_t(e), x.value = { + e && (gt(e), x.value = { ...x.value, centerX: Number(e.x), centerY: Number(e.y) @@ -7662,12 +7714,12 @@ var Do = ["title"], Oo = ["src"], ko = { } function St(e) { if (Number(e?.button ?? 0) !== 0) return; - let t = yt(e); + let t = vt(e); t && (T = e.pointerId ?? 1, S.value = "grabbing", o.value?.setPointerCapture?.(T), xt(t.world), bt(e), e.preventDefault?.(), e.stopPropagation?.()); } function Ct(e) { if (T !== null && e.pointerId === T) { - let t = yt(e); + let t = vt(e); t && xt(t.world), e.preventDefault?.(), e.stopPropagation?.(); } else bt(e); } @@ -7678,9 +7730,9 @@ var Do = ["title"], Oo = ["src"], ko = { }, ht())); } function Tt(e) { - let t = yt(e), n = w?.resolvedView; + let t = vt(e), n = w?.resolvedView; if (!t || !n) return; - let r = E(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = E((Number(x.value.zoom) || 1) * i, Kl, ql); + let r = E(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = E((Number(x.value.zoom) || 1) * i, ou, su); if (Math.abs(a - (Number(x.value.zoom) || 1)) < .001) { e.preventDefault?.(), e.stopPropagation?.(); return; @@ -7694,37 +7746,37 @@ var Do = ["title"], Oo = ["src"], ko = { }, ht(), bt(e), e.preventDefault?.(), e.stopPropagation?.(); } function Et(e) { - let t = yt(e); - D(), t && _t(t.world), ht(), e.preventDefault?.(), e.stopPropagation?.(); + let t = vt(e); + D(), t && gt(t.world), ht(), e.preventDefault?.(), e.stopPropagation?.(); } - function At(e) { + function Dt(e) { b.value = { ...b.value, [e]: !b.value?.[e] }, le(b.value); } - function jt(e) { + function Ot(e) { a.some((t) => t.key === e) && (b.value = { ...b.value, size: e }, le(b.value)); } - return kt(() => { - o.value && typeof ResizeObserver == "function" && (te = new ResizeObserver(() => ht()), te.observe(o.value)), Xe(), Be(), ht(); - }), nt(ue, () => { + return Mt(() => { + o.value && typeof ResizeObserver == "function" && (te = new ResizeObserver(() => ht()), te.observe(o.value)), Xe(), k(), ht(); + }), at(ue, () => { D(), ht(); - }, { flush: "post" }), nt(de, () => { - d.value = null, Be(); - }, { immediate: !0 }), nt(We, () => { + }, { flush: "post" }), at(de, () => { + d.value = null, k(); + }, { immediate: !0 }), at(A, () => { Xe(); - }), nt(b, () => { + }), at(b, () => { ht(); }, { deep: !0, flush: "post" - }), nt(v, () => { + }), at(v, () => { ht(); - }, { flush: "post" }), it(() => { + }, { flush: "post" }), st(() => { try { te?.disconnect?.(); } catch (e) { @@ -7732,8 +7784,8 @@ var Do = ["title"], Oo = ["src"], ko = { } te = null, T = null; }), (e, t) => { - let n = et("MButton"), r = et("MTree"); - return ue.value ? (I(), z("div", Fc, [ + let n = rt("MButton"), r = rt("MTree"); + return ue.value ? (I(), z("div", Yc, [ t[18] ||= M("div", { style: { "font-size": "13px", "font-weight": "600", @@ -7742,8 +7794,8 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.5px" } }, " ComfyUI Workflow ", -1), - M("div", Ic, [ - M("div", Lc, R(pe.value), 1), + M("div", Xc, [ + M("div", Zc, R(pe.value), 1), de.value ? (I(), z("div", { key: 0, style: { @@ -7755,43 +7807,43 @@ var Do = ["title"], Oo = ["src"], ko = { "white-space": "nowrap" }, title: de.value - }, R(de.value), 9, Rc)) : N("", !0), - k.value.length ? (I(), z("div", zc, [(I(!0), z(j, null, F(k.value, (e) => (I(), z("span", { + }, R(de.value), 9, Qc)) : N("", !0), + Re.value.length ? (I(), z("div", $c, [(I(!0), z(j, null, F(Re.value, (e) => (I(), z("span", { key: e.key, - style: L(Re(e.tone)), + style: L(ze(e.tone)), title: e.label }, [M("i", { - class: Dt(e.icon), + class: At(e.icon), style: { "font-size": "10px", flex: "0 0 auto" } - }, null, 2), M("span", Vc, R(e.label), 1)], 12, Bc))), 128))])) : N("", !0) + }, null, 2), M("span", tl, R(e.label), 1)], 12, el))), 128))])) : N("", !0) ]), - M("div", Hc, [M("div", Uc, R(Ve.value), 1), dt.value.source ? (I(), z("div", Wc, R(dt.value.source), 1)) : N("", !0)]), - M("div", Gc, [ - me.value ? (I(), z("div", Kc, [t[3] ||= M("div", { style: { + M("div", nl, [M("div", rl, R(He.value), 1), dt.value.source ? (I(), z("div", il, R(dt.value.source), 1)) : N("", !0)]), + M("div", al, [ + me.value ? (I(), z("div", ol, [t[3] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Task", -1), M("div", qc, R(me.value), 1)])) : N("", !0), - he.value ? (I(), z("div", Jc, [t[4] ||= M("div", { style: { + } }, "Task", -1), M("div", sl, R(me.value), 1)])) : N("", !0), + he.value ? (I(), z("div", cl, [t[4] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Model", -1), M("div", Yc, R(he.value), 1)])) : N("", !0), - ve.value ? (I(), z("div", Xc, [t[5] ||= M("div", { style: { + } }, "Model", -1), M("div", ll, R(he.value), 1)])) : N("", !0), + ve.value ? (I(), z("div", ul, [t[5] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Runs on", -1), M("div", Zc, R(ve.value), 1)])) : N("", !0), - Fe.value || Le.value ? (I(), z("div", Qc, [ + } }, "Runs on", -1), M("div", dl, R(ve.value), 1)])) : N("", !0), + Fe.value || Le.value ? (I(), z("div", fl, [ t[6] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", @@ -7799,11 +7851,11 @@ var Do = ["title"], Oo = ["src"], ko = { "text-transform": "uppercase", "letter-spacing": "0.4px" } }, "Library", -1), - M("div", $c, R(Fe.value || Le.value), 1), - Fe.value && Le.value ? (I(), z("div", el, R(Le.value), 1)) : N("", !0) + M("div", pl, R(Fe.value || Le.value), 1), + Fe.value && Le.value ? (I(), z("div", ml, R(Le.value), 1)) : N("", !0) ])) : N("", !0) ]), - Se.value.length || we.value.length ? (I(), z("div", tl, [ + Se.value.length || we.value.length ? (I(), z("div", hl, [ t[7] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", @@ -7831,7 +7883,7 @@ var Do = ["title"], Oo = ["src"], ko = { color: "#ffcdd2" } }, R(e), 1))), 128))], 4)) : N("", !0), - we.value.length ? (I(), z("div", nl, [(I(!0), z(j, null, F(we.value, (e) => (I(), z("span", { + we.value.length ? (I(), z("div", gl, [(I(!0), z(j, null, F(we.value, (e) => (I(), z("span", { key: `model-${e}`, style: { padding: "3px 7px", @@ -7843,7 +7895,7 @@ var Do = ["title"], Oo = ["src"], ko = { } }, R(e), 1))), 128))])) : N("", !0) ])) : N("", !0), - ye.value || be.value ? (I(), z("div", rl, [ye.value ? (I(), z("div", il, R(ye.value), 1)) : N("", !0), be.value ? (I(), z("div", { + ye.value || be.value ? (I(), z("div", _l, [ye.value ? (I(), z("div", vl, R(ye.value), 1)) : N("", !0), be.value ? (I(), z("div", { key: 1, style: L({ fontSize: "11px", @@ -7851,8 +7903,8 @@ var Do = ["title"], Oo = ["src"], ko = { marginTop: ye.value ? "7px" : "0" }) }, R(be.value), 5)) : N("", !0)])) : N("", !0), - M("div", al, [ - gt(n, { + M("div", yl, [ + yt(n, { type: "button", severity: "secondary", text: "", @@ -7870,12 +7922,12 @@ var Do = ["title"], Oo = ["src"], ko = { "justify-content": "center", gap: "7px" }, - onClick: at + onClick: Qe }, { - default: tt(() => [t[8] ||= M("i", { class: "pi pi-image" }, null, -1), M("span", null, R(B(O)("ctx.setWorkflowThumbnail", "Set workflow thumbnail")), 1)]), + default: it(() => [t[8] ||= M("i", { class: "pi pi-image" }, null, -1), M("span", null, R(B(O)("ctx.setWorkflowThumbnail", "Set workflow thumbnail")), 1)]), _: 1 }), - gt(n, { + yt(n, { type: "button", severity: "secondary", text: "", @@ -7893,12 +7945,12 @@ var Do = ["title"], Oo = ["src"], ko = { "justify-content": "center", gap: "7px" }, - onClick: st + onClick: $e }, { - default: tt(() => [t[9] ||= M("i", { class: "pi pi-search" }, null, -1), M("span", null, R(B(O)("ctx.inspect", "Inspect")), 1)]), + default: it(() => [t[9] ||= M("i", { class: "pi pi-search" }, null, -1), M("span", null, R(B(O)("ctx.inspect", "Inspect")), 1)]), _: 1 }), - gt(n, { + yt(n, { type: "button", severity: "secondary", text: "", @@ -7917,21 +7969,21 @@ var Do = ["title"], Oo = ["src"], ko = { "justify-content": "center", gap: "7px" }, - onClick: ct + onClick: ot }, { - default: tt(() => [M("i", { class: Dt(f.value ? "pi pi-spin pi-spinner" : "pi pi-check-circle") }, null, 2), M("span", null, R(f.value ? "Checking" : "Validate"), 1)]), + default: it(() => [M("i", { class: At(f.value ? "pi pi-spin pi-spinner" : "pi pi-check-circle") }, null, 2), M("span", null, R(f.value ? "Checking" : "Validate"), 1)]), _: 1 }, 8, ["disabled"]) ]), - p.value ? (I(), z("div", ol, [ - M("div", sl, [t[10] ||= M("div", { style: { + p.value ? (I(), z("div", bl, [ + M("div", xl, [t[10] ||= M("div", { style: { "font-size": "10px", "font-weight": "800", color: "#a5d6a7", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Workflow diagnostics", -1), M("div", cl, R(Me.value), 1)]), - ke.value.length || Ae.value.length ? (I(), z("div", ll, [ke.value.length ? (I(), z("div", ul, [(I(!0), z(j, null, F(ke.value, (e) => (I(), z("span", { + } }, "Workflow diagnostics", -1), M("div", Sl, R(Me.value), 1)]), + ke.value.length || Ae.value.length ? (I(), z("div", Cl, [ke.value.length ? (I(), z("div", wl, [(I(!0), z(j, null, F(ke.value, (e) => (I(), z("span", { key: `diag-node-${e}`, style: { padding: "3px 7px", @@ -7941,7 +7993,7 @@ var Do = ["title"], Oo = ["src"], ko = { "font-weight": "700", color: "#ffcdd2" } - }, " Missing node: " + R(e), 1))), 128))])) : N("", !0), Ae.value.length ? (I(), z("div", dl, [(I(!0), z(j, null, F(Ae.value, (e) => (I(), z("span", { + }, " Missing node: " + R(e), 1))), 128))])) : N("", !0), Ae.value.length ? (I(), z("div", Tl, [(I(!0), z(j, null, F(Ae.value, (e) => (I(), z("span", { key: `diag-model-${e}`, style: { padding: "3px 7px", @@ -7951,41 +8003,41 @@ var Do = ["title"], Oo = ["src"], ko = { "font-weight": "700", color: "#ffe0b2" } - }, " Missing model: " + R(e), 1))), 128))])) : N("", !0)])) : (I(), z("div", fl, " No missing dependencies detected by the current ComfyUI runtime. ")), - je.value.length ? (I(), z("div", pl, R(je.value.join(" | ")), 1)) : N("", !0), - Ne.value || Pe.value ? (I(), z("div", ml, [Qe(" Latest version: " + R(Ne.value || "none"), 1), Pe.value ? (I(), z("span", hl, " | Diff: " + R(Pe.value), 1)) : N("", !0)])) : N("", !0) + }, " Missing model: " + R(e), 1))), 128))])) : N("", !0)])) : (I(), z("div", El, " No missing dependencies detected by the current ComfyUI runtime. ")), + je.value.length ? (I(), z("div", Dl, R(je.value.join(" | ")), 1)) : N("", !0), + Ne.value || Pe.value ? (I(), z("div", Ol, [tt(" Latest version: " + R(Ne.value || "none"), 1), Pe.value ? (I(), z("span", kl, " | Diff: " + R(Pe.value), 1)) : N("", !0)])) : N("", !0) ])) : N("", !0), - M("div", gl, [ - M("div", _l, [t[11] ||= M("div", { style: { + M("div", Al, [ + M("div", jl, [t[11] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Nodes", -1), M("div", vl, R(dt.value.nodes), 1)]), - M("div", yl, [t[12] ||= M("div", { style: { + } }, "Nodes", -1), M("div", Ml, R(dt.value.nodes), 1)]), + M("div", Nl, [t[12] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Links", -1), M("div", bl, R(dt.value.links), 1)]), - M("div", xl, [t[13] ||= M("div", { style: { + } }, "Links", -1), M("div", Pl, R(dt.value.links), 1)]), + M("div", Fl, [t[13] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" - } }, "Groups", -1), M("div", Sl, R(dt.value.groups), 1)]) + } }, "Groups", -1), M("div", Il, R(dt.value.groups), 1)]) ]), - fe.value ? (I(), z("div", Cl, [M("div", wl, [M("div", Tl, [t[14] ||= M("div", { style: { + fe.value ? (I(), z("div", Ll, [M("div", Rl, [M("div", zl, [t[14] ||= M("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.55)", "text-transform": "uppercase", "letter-spacing": "0.4px" } }, "Category", -1), M("div", { - title: We.value || "Root", + title: A.value || "Root", style: { "font-size": "12px", color: "rgba(255,255,255,0.8)", @@ -7995,9 +8047,9 @@ var Do = ["title"], Oo = ["src"], ko = { "white-space": "nowrap", "max-width": "100%" } - }, R(Ke.value), 9, El)]), qe.value.length ? (I(), z("div", { + }, R(Ge.value), 9, Bl)]), qe.value.length ? (I(), z("div", { key: 0, - title: We.value, + title: A.value, style: { display: "flex", "flex-wrap": "wrap", @@ -8023,7 +8075,7 @@ var Do = ["title"], Oo = ["src"], ko = { "text-overflow": "ellipsis", "white-space": "nowrap" } - }, R(e), 1))), 128))], 8, Dl)) : N("", !0)]), M("div", Ol, [ot(M("input", { + }, R(e), 1))), 128))], 8, Vl)) : N("", !0)]), M("div", Hl, [lt(M("input", { "onUpdate:modelValue": t[0] ||= (e) => s.value = e, type: "text", placeholder: B(O)("dialog.workflowCategory", "Workflow category"), @@ -8037,7 +8089,7 @@ var Do = ["title"], Oo = ["src"], ko = { color: "rgba(255,255,255,0.92)", "font-size": "12px" } - }, null, 8, kl), [[Ot, s.value]]), gt(n, { + }, null, 8, Ul), [[jt, s.value]]), yt(n, { type: "button", severity: "secondary", text: "", @@ -8054,15 +8106,15 @@ var Do = ["title"], Oo = ["src"], ko = { fontWeight: "700", whiteSpace: "nowrap" }), - onClick: rt + onClick: Ze }, { - default: tt(() => [Qe(R(c.value ? "Saving..." : "Move"), 1)]), + default: it(() => [tt(R(c.value ? "Saving..." : "Move"), 1)]), _: 1 }, 8, ["disabled", "style"])])])) : N("", !0), - lt.value.length ? (I(), z("div", Al, [ + ct.value.length ? (I(), z("div", Wl, [ t[15] ||= M("div", { class: "mjr-section-title" }, " Workflow Nodes ", -1), - gt(r, { - value: lt.value, + yt(r, { + value: ct.value, class: "mjr-workflow-tree", "scroll-height": "180px", pt: { @@ -8074,16 +8126,16 @@ var Do = ["title"], Oo = ["src"], ko = { nodeLabel: { class: "mjr-workflow-tree-label" } } }, { - default: tt(({ node: e }) => [M("span", jl, [ - M("span", Ml, R(e.label), 1), - e.data?.type ? (I(), z("span", Nl, R(e.data.type), 1)) : N("", !0), - M("span", Pl, "#" + R(e.data?.id), 1) + default: it(({ node: e }) => [M("span", Gl, [ + M("span", Kl, R(e.label), 1), + e.data?.type ? (I(), z("span", ql, R(e.data.type), 1)) : N("", !0), + M("span", Jl, "#" + R(e.data?.id), 1) ])]), _: 1 }, 8, ["value"]), - ut.value ? (I(), z("div", Fl, " +" + R(ut.value) + " more nodes ", 1)) : N("", !0) + ut.value ? (I(), z("div", Yl, " +" + R(ut.value) + " more nodes ", 1)) : N("", !0) ])) : N("", !0), - M("div", Il, [M("div", Ll, [(I(!0), z(j, null, F(B(a), (e) => (I(), $e(n, { + M("div", Xl, [M("div", Zl, [(I(!0), z(j, null, F(B(a), (e) => (I(), nt(n, { key: e.key, type: "button", severity: "secondary", @@ -8101,15 +8153,15 @@ var Do = ["title"], Oo = ["src"], ko = { fontWeight: b.value.size === e.key ? "700" : "600", cursor: "pointer" }), - onClick: (t) => jt(e.key) + onClick: (t) => Ot(e.key) }, { - default: tt(() => [Qe(R(e.label), 1)]), + default: it(() => [tt(R(e.label), 1)]), _: 2 }, 1032, [ "title", "style", "onClick" - ]))), 128))]), gt(n, { + ]))), 128))]), yt(n, { type: "button", class: "mjr-btn mjr-icon-btn", severity: "secondary", @@ -8130,10 +8182,10 @@ var Do = ["title"], Oo = ["src"], ko = { }, onClick: t[1] ||= (e) => v.value = !v.value }, { - default: tt(() => [...t[16] ||= [M("i", { class: "pi pi-sliders-h" }, null, -1)]]), + default: it(() => [...t[16] ||= [M("i", { class: "pi pi-sliders-h" }, null, -1)]]), _: 1 }, 8, ["title"])]), - v.value ? (I(), z("div", Rl, [(I(!0), z(j, null, F(mt.value, (e) => (I(), $e(n, { + v.value ? (I(), z("div", Ql, [(I(!0), z(j, null, F(mt.value, (e) => (I(), nt(n, { key: e.key, type: "button", severity: "secondary", @@ -8150,9 +8202,9 @@ var Do = ["title"], Oo = ["src"], ko = { color: "rgba(255,255,255,0.92)", textAlign: "left" }), - onClick: (t) => At(e.key) + onClick: (t) => Dt(e.key) }, { - default: tt(() => [ + default: it(() => [ M("span", { style: L({ width: "22px", height: "22px", @@ -8171,18 +8223,18 @@ var Do = ["title"], Oo = ["src"], ko = { }) }, null, 4)], 4), M("i", { - class: Dt(e.iconClass), + class: At(e.iconClass), style: { "font-size": "18px", opacity: "0.9", width: "18px" } }, null, 2), - M("div", zl, [M("div", Bl, R(e.label), 1), M("div", Vl, R(b.value?.[e.key] ? "On" : "Off"), 1)]) + M("div", $l, [M("div", eu, R(e.label), 1), M("div", tu, R(b.value?.[e.key] ? "On" : "Off"), 1)]) ]), _: 2 }, 1032, ["style", "onClick"]))), 128))])) : N("", !0), - M("div", Hl, [M("canvas", { + M("div", nu, [M("canvas", { ref_key: "canvasRef", ref: o, style: L({ @@ -8204,7 +8256,7 @@ var Do = ["title"], Oo = ["src"], ko = { onWheel: Tt, onDblclick: Et }, null, 36)]), - M("div", Ul, [M("span", null, R(C.value || "Click/drag to navigate | wheel to zoom"), 1), M("span", null, R(Math.round((x.value.zoom || 1) * 100)) + "% | " + R(ft.value.label), 1)]), + M("div", ru, [M("span", null, R(C.value || "Click/drag to navigate | wheel to zoom"), 1), M("span", null, R(Math.round((x.value.zoom || 1) * 100)) + "% | " + R(ft.value.label), 1)]), M("details", { open: y.value, style: { "margin-top": "10px" }, @@ -8214,9 +8266,9 @@ var Do = ["title"], Oo = ["src"], ko = { color: "var(--mjr-muted, rgba(255,255,255,0.65))", "font-size": "12px", "user-select": "none" - } }, " Show raw JSON ", -1), M("pre", Gl, R(He.value), 1)], 40, Wl) + } }, " Show raw JSON ", -1), M("pre", au, R(Ue.value), 1)], 40, iu) ])) : N("", !0); }; } }); -export { qt as $, di as A, Tr as B, Bi as C, Ii as D, Li as E, Qr as F, Or as G, jr as H, Xr as I, Er as J, Ar as K, Lr as L, wi as M, ui as N, Ei as O, Ci as P, K as Q, Fr as R, Ji as S, Fi as T, Y as U, Pr as V, Dr as W, yr as X, br as Y, ln as Z, X as _, Na as a, qi as b, ja as c, Ea as d, G as et, Ta as f, ha as g, ga as h, Ba as i, fi as j, Di as k, Aa as l, _a as m, Pc as n, Pa as o, Da as p, Mr as q, Eo as r, ka as s, Yl as t, ba as u, ia as v, zi as w, Gi as x, ma as y, Ir as z }; +export { fn as $, Ti as A, zr as B, ea as C, Xi as D, Zi as E, fi as F, Hr as G, Gr as H, ui as I, Br as J, Wr as K, Zr as L, Ri as M, wi as N, Bi as O, Li as P, Cn as Q, Yr as R, ca as S, Yi as T, Y as U, Jr as V, Vr as W, Nr as X, Pr as Y, Sn as Z, X as _, qa as a, sa as b, Ga as c, Ba as d, K as et, za as f, ka as g, Aa as h, eo as i, Ei as j, Vi as k, Wa as l, ja as m, Jc as n, G as nt, Ja as o, Va as p, Kr as q, Bo as r, Ua as s, lu as t, Xt as tt, Pa as u, va as v, $i as w, aa as x, Oa as y, Xr as z }; diff --git a/dist/chunks/TagsEditor-7DAMS3OV.js b/dist/chunks/TagsEditor-CPV0rYyM.js similarity index 74% rename from dist/chunks/TagsEditor-7DAMS3OV.js rename to dist/chunks/TagsEditor-CPV0rYyM.js index 6c97a968..a4fd667f 100644 --- a/dist/chunks/TagsEditor-7DAMS3OV.js +++ b/dist/chunks/TagsEditor-CPV0rYyM.js @@ -1,12 +1,12 @@ -import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { St as r, m as i, n as a } from "./events-DxfljH4A.js"; -import { Y as o } from "./Viewer-DI9upE3v.js"; -import { A as s, C as c, E as l, G as u, J as d, K as f, L as ee, N as p, R as te, T as m, U as ne, V as h, Y as g, b as _, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; +import { $t as e, F as t, v as n } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { m as r, n as i, wt as a } from "./events-BRfpU-6M.js"; +import { Y as o } from "./Viewer-geJFRz8N.js"; +import { A as s, C as c, E as l, G as u, J as d, K as f, L as p, N as m, R as ee, T as h, U as te, V as g, Y as _, b as ne, ft as v, j as y, k as b, lt as x, rt as S, ut as C, z as w } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/common/TagsEditor.vue?vue&type=script&setup=true&lang.ts -var T = ["aria-busy"], E = ["aria-label"], re = { +var T = ["aria-busy"], re = ["aria-label"], ie = { key: 0, class: "mjr-tags-empty" -}, ie = { class: "mjr-tags-input-wrap" }, ae = ["aria-selected", "onMouseenter"], oe = 100, D = 200, O = /* @__PURE__ */ p({ +}, ae = { class: "mjr-tags-input-wrap" }, oe = ["aria-selected", "onMouseenter"], se = 100, E = 200, D = /* @__PURE__ */ m({ __name: "TagsEditor", props: { asset: {}, @@ -14,11 +14,11 @@ var T = ["aria-busy"], E = ["aria-label"], re = { disabled: { type: Boolean } }, emits: ["update:modelValue", "tags-change"], - setup(p, { emit: O }) { - function se(e) { + setup(m, { emit: D }) { + function O(e) { try { let t = String(e ?? "").trim(); - if (!t || t.length > oe) return null; + if (!t || t.length > se) return null; for (let e = 0; e < t.length; e += 1) { let n = t.charCodeAt(e); if (n <= 31 || n === 127) return null; @@ -45,7 +45,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { let e = k(r); if (!e) continue; let i = e.toLowerCase(); - if (!n.has(i) && (n.add(i), t.push(e), t.length >= D)) break; + if (!n.has(i) && (n.add(i), t.push(e), t.length >= E)) break; } return t; } @@ -68,7 +68,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { for (let n = 0; n < e.length; n += 1) if (e[n] !== t[n]) return !1; return !0; } - let N = p, P = O, F = M(N.asset?.tags ?? N.modelValue ?? []), I = S([...F]), L = S(null), R = S(""), z = S(!1), B = S(-1), V = S(null), H = S([]), U = S(!1), W = (e) => e?.$el || e || null, G = !1, K = !1, q = null, J = [...F], le = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), ue = (e) => new Promise((t) => setTimeout(t, e)), de = () => setTimeout(() => z.value = !1, 200), Y = m(() => { + let N = m, P = D, F = M(N.asset?.tags ?? N.modelValue ?? []), I = S([...F]), L = S(null), R = S(""), z = S(!1), B = S(-1), V = S(null), H = S([]), U = S(!1), W = (e) => e?.$el || e || null, G = !1, K = !1, q = null, J = [...F], le = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), ue = (e) => new Promise((t) => setTimeout(t, e)), de = () => setTimeout(() => z.value = !1, 200), Y = h(() => { let e = R.value.toLowerCase().trim(); if (!e) return []; let t = new Set(I.value.map((e) => A(e)).filter(Boolean)); @@ -76,7 +76,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { let r = A(n); return n.toLowerCase().includes(e) && (!r || !t.has(r)); }).slice(0, 10); - }), X = m(() => Y.value.length > 0); + }), X = h(() => Y.value.length > 0); function Z(e) { if (G) return; let t = M(e); @@ -87,7 +87,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { P("update:modelValue", t), P("tags-change", { assetId: N.asset?.id, tags: t - }), o(a, { + }), o(i, { assetId: n, tags: t }); @@ -107,11 +107,11 @@ var T = ["aria-busy"], E = ["aria-label"], re = { let n = 0; for (; n < 10;) { n > 0 && await ue(le(n)), n += 1; - let a = M(I.value), o = typeof AbortController < "u" ? new AbortController() : null; + let i = M(I.value), o = typeof AbortController < "u" ? new AbortController() : null; q = o; let s = null; try { - s = await t(N.asset, a, o ? { signal: o.signal } : {}); + s = await t(N.asset, i, o ? { signal: o.signal } : {}); } catch (e) { console.error("Failed to update tags:", e); } @@ -124,23 +124,23 @@ var T = ["aria-busy"], E = ["aria-label"], re = { break; } let t = [...J]; - I.value = t, P("update:modelValue", t), e(s?.error || i("toast.tagsUpdateFailed", "Failed to update tags"), "error"), G = !1, q = null, U.value = !1; + I.value = t, P("update:modelValue", t), e(s?.error || r("toast.tagsUpdateFailed", "Failed to update tags"), "error"), G = !1, q = null, U.value = !1; return; } try { let e = s?.data?.asset_id ?? null; - e != null && !r(N.asset.id) && (N.asset.id = e); + e != null && !a(N.asset.id) && (N.asset.id = e); } catch (e) { console.debug?.(e); } - let c = M(Array.isArray(s?.data?.tags) ? s.data.tags : a); + let c = M(Array.isArray(s?.data?.tags) ? s.data.tags : i); J = [...c]; try { N.asset.tags = [...c]; } catch (e) { console.debug?.(e); } - if (K || (I.value = [...c]), fe(c), e(i("toast.tagsUpdated", "Tags updated"), "success", 1e3), !K) break; + if (K || (I.value = [...c]), fe(c), e(r("toast.tagsUpdated", "Tags updated"), "success", 1e3), !K) break; K = !1; } if (n >= 10) { @@ -151,13 +151,13 @@ var T = ["aria-busy"], E = ["aria-label"], re = { } catch (e) { console.debug?.(e); } - P("update:modelValue", t), e(i("toast.tagsUpdateFailed", "Failed to update tags"), "error"); + P("update:modelValue", t), e(r("toast.tagsUpdateFailed", "Failed to update tags"), "error"); } G = !1, q = null, U.value = !1; } w(async () => { try { - await ee(), W(L.value)?.focus(); + await p(), W(L.value)?.focus(); } catch (e) { console.debug?.(e); } @@ -167,7 +167,7 @@ var T = ["aria-busy"], E = ["aria-label"], re = { } catch (e) { console.warn("Failed to load available tags:", e); } - }), te(() => { + }), ee(() => { try { q?.abort?.(); } catch (e) { @@ -176,10 +176,10 @@ var T = ["aria-busy"], E = ["aria-label"], re = { }); function $(t) { if (N.disabled) return; - let n = se(t); + let n = O(t); if (!n) return; - let r = A(n); - r && (I.value.some((e) => A(e) === r) || (I.value.length >= D ? e(i("toast.maxTagsReached", "Maximum number of tags reached"), "warning") : (I.value = [...I.value, n], Q()))); + let i = A(n); + i && (I.value.some((e) => A(e) === i) || (I.value.length >= E ? e(r("toast.maxTagsReached", "Maximum number of tags reached"), "warning") : (I.value = [...I.value, n], Q()))); } function pe(e) { if (N.disabled || e < 0 || e >= I.value.length) return; @@ -212,15 +212,15 @@ var T = ["aria-busy"], E = ["aria-label"], re = { }), f(() => N.asset?.tags, (e) => { Z(e); }), (e, t) => { - let n = u("MButton"), r = u("MInputText"), a = u("MListbox"); - return h(), b("div", { - class: C(["mjr-tags-editor", { "is-disabled": p.disabled }]), + let n = u("MButton"), i = u("MInputText"), a = u("MListbox"); + return g(), b("div", { + class: C(["mjr-tags-editor", { "is-disabled": m.disabled }]), "aria-busy": U.value }, [l("div", { class: "mjr-tags-display", role: "list", - "aria-label": x(i)("tags.label", "Tags") - }, [I.value.length === 0 ? (h(), b("span", re, v(x(i)("msg.noTagsYet", "No tags yet...")), 1)) : (h(!0), b(c, { key: 1 }, ne(I.value, (e, r) => (h(), b("div", { + "aria-label": x(r)("tags.label", "Tags") + }, [I.value.length === 0 ? (g(), b("span", ie, v(x(r)("msg.noTagsYet", "No tags yet...")), 1)) : (g(!0), b(c, { key: 1 }, te(I.value, (e, i) => (g(), b("div", { key: e, class: "mjr-tag-chip", role: "listitem" @@ -230,9 +230,9 @@ var T = ["aria-busy"], E = ["aria-label"], re = { severity: "secondary", text: "", rounded: "", - "aria-label": x(i)("tags.remove", "Remove tag"), - disabled: p.disabled, - onClick: (e) => pe(r) + "aria-label": x(r)("tags.remove", "Remove tag"), + disabled: m.disabled, + onClick: (e) => pe(i) }, { default: d(() => [...t[4] ||= [s(" x ", -1)]]), _: 1 @@ -240,16 +240,16 @@ var T = ["aria-busy"], E = ["aria-label"], re = { "aria-label", "disabled", "onClick" - ])]))), 128))], 8, E), l("div", ie, [y(r, { + ])]))), 128))], 8, re), l("div", ae, [y(i, { ref_key: "inputRef", ref: L, modelValue: R.value, "onUpdate:modelValue": t[0] ||= (e) => R.value = e, type: "text", class: "mjr-tag-input", - placeholder: x(i)("sidebar.addTag", "Add tag..."), - disabled: p.disabled, - "aria-label": x(i)("tags.addLabel", "Add tag"), + placeholder: x(r)("sidebar.addTag", "Add tag..."), + disabled: m.disabled, + "aria-label": x(r)("tags.addLabel", "Add tag"), "aria-autocomplete": X.value ? "list" : "none", "aria-expanded": z.value, "aria-haspopup": X.value ? "listbox" : void 0, @@ -265,27 +265,27 @@ var T = ["aria-busy"], E = ["aria-label"], re = { "aria-autocomplete", "aria-expanded", "aria-haspopup" - ]), g(y(a, { + ]), _(y(a, { modelValue: V.value, "onUpdate:modelValue": t[3] ||= (e) => V.value = e, options: Y.value, class: "mjr-tags-dropdown", "scroll-height": "150px", - "aria-label": x(i)("tags.suggestions", "Tag suggestions"), + "aria-label": x(r)("tags.suggestions", "Tag suggestions"), onChange: ge }, { option: d(({ option: e, index: t }) => [l("div", { class: C(["mjr-tag-suggestion", { "is-active": t === B.value }]), "aria-selected": t === B.value, onMouseenter: (e) => B.value = t - }, v(e), 43, ae)]), + }, v(e), 43, oe)]), _: 1 }, 8, [ "modelValue", "options", "aria-label" - ]), [[_, z.value && X.value]])])], 10, T); + ]), [[ne, z.value && X.value]])])], 10, T); }; } }); -export { O as t }; +export { D as t }; diff --git a/dist/chunks/Viewer-DI9upE3v.js b/dist/chunks/Viewer-geJFRz8N.js similarity index 96% rename from dist/chunks/Viewer-DI9upE3v.js rename to dist/chunks/Viewer-geJFRz8N.js index 287e6f92..f60897c3 100644 --- a/dist/chunks/Viewer-DI9upE3v.js +++ b/dist/chunks/Viewer-geJFRz8N.js @@ -1,9 +1,9 @@ -import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { Ct as h, D as g, a as _, ct as v, h as y, i as b, j as x, k as S, m as C, n as w, o as T, pt as E, r as D, rt as O, t as k } from "./events-DxfljH4A.js"; +import { $t as e, H as t, P as n, _ as r, c as i, d as a, g as o, gt as s, n as c, o as l, r as u, s as d, vt as f, x as p, y as m } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { D as h, Tt as g, a as _, at as v, h as y, ht as b, i as x, j as S, k as C, m as w, n as T, o as E, r as D, t as O, ut as k } from "./events-BRfpU-6M.js"; import { T as A, nt as j, rt as M } from "./mjr-primevue-BRqtdXzb.js"; import { n as N, r as ee } from "./mjr-vue-vendor-mHY_eIVE.js"; import { n as P, r as te, t as F } from "./state-D0Gu1AgG.js"; -import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-k0ey48io.js"; +import { a as ne, c as re, i as ie, o as ae, r as oe, s as se } from "./model3dRenderer-DdPKugXy.js"; // ui/utils/events.ts function ce(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { let i = n || (typeof window < "u" ? window : null); @@ -95,7 +95,7 @@ var le = async (e, t = "Majoor", n = {}) => { justifyContent: "flex-end", gap: "10px" } }, [U("button", { - textContent: C("dialog.confirm", "Confirm"), + textContent: w("dialog.confirm", "Confirm"), onclick: () => { try { r.close(); @@ -135,7 +135,7 @@ var le = async (e, t = "Majoor", n = {}) => { let n = de(); if (n) try { let r = { - title: String(t || C("dialog.confirm", "Confirm")), + title: String(t || w("dialog.confirm", "Confirm")), message: String(e || "") }; return !!(typeof n.confirm == "function" && await n.confirm(r)); @@ -191,7 +191,7 @@ var le = async (e, t = "Majoor", n = {}) => { justifyContent: "flex-end", gap: "10px" } }, [U("button", { - textContent: C("dialog.cancel", "Cancel"), + textContent: w("dialog.cancel", "Cancel"), onclick: () => a(!1), style: { padding: "10px 16px", @@ -203,7 +203,7 @@ var le = async (e, t = "Majoor", n = {}) => { cursor: "pointer" } }), U("button", { - textContent: C("dialog.confirm", "Confirm"), + textContent: w("dialog.confirm", "Confirm"), onclick: () => a(!0), style: { padding: "10px 16px", @@ -230,7 +230,7 @@ var le = async (e, t = "Majoor", n = {}) => { let r = de(); if (r) try { let i = { - title: String(n || C("dialog.prompt", "Prompt")), + title: String(n || w("dialog.prompt", "Prompt")), message: String(e || ""), defaultValue: String(t ?? "") }, a = typeof r.prompt == "function" ? await r.prompt(i) : null; @@ -299,7 +299,7 @@ var le = async (e, t = "Majoor", n = {}) => { justifyContent: "flex-end", gap: "10px" } }, [U("button", { - textContent: C("dialog.cancel", "Cancel"), + textContent: w("dialog.cancel", "Cancel"), onclick: () => o(null), style: { padding: "8px 12px", @@ -310,7 +310,7 @@ var le = async (e, t = "Majoor", n = {}) => { cursor: "pointer" } }), U("button", { - textContent: C("dialog.ok", "OK"), + textContent: w("dialog.ok", "OK"), onclick: () => o(s.value), style: { padding: "8px 12px", @@ -340,14 +340,14 @@ var le = async (e, t = "Majoor", n = {}) => { }); }, ue = () => { try { - return x()?.ui || null; + return S()?.ui || null; } catch { return null; } }, de = () => { let e = (e) => !!e && (typeof e.alert == "function" || typeof e.confirm == "function" || typeof e.prompt == "function"); try { - let t = g(); + let t = h(); if (e(t)) return t; } catch (e) { console.debug?.(e); @@ -355,7 +355,7 @@ var le = async (e, t = "Majoor", n = {}) => { return null; }, R = () => { try { - let e = S(); + let e = C(); if (e && typeof e.add == "function") return e; } catch (e) { console.debug?.(e); @@ -1310,7 +1310,7 @@ async function pt(e) { } // ui/utils/deleteGuard.ts async function mt(e, t) { - return !T.DELETE_CONFIRMATION || !!await I(e > 1 ? C("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : C("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || C("label.thisFile", "this file")) }), C("dialog.confirmDeleteTitle", "Majoor: Confirm delete")); + return !E.DELETE_CONFIRMATION || !!await I(e > 1 ? w("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : w("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || w("label.thisFile", "this file")) }), w("dialog.confirmDeleteTitle", "Majoor: Confirm delete")); } // ui/features/collections/contextmenu/addToCollectionMenuState.ts var ht = j({ @@ -1341,7 +1341,7 @@ function yt(e) { filename: e.filename || "", subfolder: e.subfolder || "", type: (e.type || "output").toLowerCase(), - root_id: h(e), + root_id: g(e), kind: e.kind || "" } : null; } @@ -1351,7 +1351,7 @@ async function bt({ x: t, y: n, assets: r }) { x: Number(t) || 0, y: Number(n) || 0, assets: i - }) : e(C("toast.noValidAssetsSelected", "No valid assets selected."), "warning"); + }) : e(w("toast.noValidAssetsSelected", "No valid assets selected."), "warning"); } // ui/features/contextmenu/ratingUpdater.ts var xt = 350, St = /* @__PURE__ */ new Map(); @@ -1422,7 +1422,7 @@ function Ot(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) { var kt = () => {}; function At(e) { try { - return !!T?.[e]; + return !!E?.[e]; } catch { return !1; } @@ -1617,14 +1617,14 @@ function Zt(e, t) { let r = document.createElement("div"); r.className = "mjr-video-controls mjr-video-controls--preview"; try { - r.setAttribute("role", "group"), r.setAttribute("aria-label", C("video.previewControls", "Video preview controls")); + r.setAttribute("role", "group"), r.setAttribute("aria-label", w("video.previewControls", "Video preview controls")); } catch (e) { console.debug?.(e); } let i = document.createElement("button"); - i.type = "button", i.className = "mjr-video-preview-btn", i.title = C("video.playPause", "Play/Pause"); + i.type = "button", i.className = "mjr-video-preview-btn", i.title = w("video.playPause", "Play/Pause"); try { - i.setAttribute("aria-label", C("video.playPause", "Play/Pause")); + i.setAttribute("aria-label", w("video.playPause", "Play/Pause")); } catch (e) { console.debug?.(e); } @@ -1712,7 +1712,7 @@ function Qt(e, t = {}) { window.getComputedStyle?.(c)?.position === "static" && (c.style.position = "relative"); }); let l = document.createElement("div"); - l.className = `mjr-video-controls mjr-video-controls--${n}`, i && l.classList.add("mjr-video-controls--modern"), r && l.classList.add("mjr-video-controls--audio"), l.dataset.mjrLayout = "regular", l.setAttribute("role", "group"), l.setAttribute("aria-label", r ? C("video.audioControls", "Audio controls") : C("video.controls", "Video controls")); + l.className = `mjr-video-controls mjr-video-controls--${n}`, i && l.classList.add("mjr-video-controls--modern"), r && l.classList.add("mjr-video-controls--audio"), l.dataset.mjrLayout = "regular", l.setAttribute("role", "group"), l.setAttribute("aria-label", r ? w("video.audioControls", "Audio controls") : w("video.controls", "Video controls")); let u = document.createElement("div"); u.className = "mjr-video-row mjr-video-row--top"; let d = document.createElement("div"); @@ -1720,7 +1720,7 @@ function Qt(e, t = {}) { let f = document.createElement("div"); f.className = "mjr-video-seek-wrap"; let p = document.createElement("input"); - p.className = "mjr-video-range mjr-video-range--seek", p.type = "range", p.min = "0", p.max = String(Rt), p.step = "1", p.value = "0", p.setAttribute("aria-label", C("video.seek", "Seek")), p.title = r ? C("video.seekThroughAudio", "Seek through audio") : C("video.seekThrough", "Seek through video"); + p.className = "mjr-video-range mjr-video-range--seek", p.type = "range", p.min = "0", p.max = String(Rt), p.step = "1", p.value = "0", p.setAttribute("aria-label", w("video.seek", "Seek")), p.title = r ? w("video.seekThroughAudio", "Seek through audio") : w("video.seekThrough", "Seek through video"); let m = document.createElement("div"); m.className = "mjr-video-seek-overlay"; let h = null, g = null, _ = null, v = null; @@ -1733,16 +1733,16 @@ function Qt(e, t = {}) { x.className = "mjr-video-seek-mark mjr-video-seek-mark--in"; let S = document.createElement("div"); S.className = "mjr-video-seek-mark mjr-video-seek-mark--out"; - let w = document.createElement("div"); - w.className = "mjr-video-seek-playhead"; + let C = document.createElement("div"); + C.className = "mjr-video-seek-playhead"; let T = document.createElement("div"); - T.className = "mjr-video-seek-playhead-label", m.appendChild(y), m.appendChild(b), m.appendChild(w), m.appendChild(T); + T.className = "mjr-video-seek-playhead-label", m.appendChild(y), m.appendChild(b), m.appendChild(C), m.appendChild(T); let E = document.createElement("div"); - E.className = "mjr-video-seek-handle mjr-video-seek-handle--in", E.title = C("video.dragSetIn", "Drag to set In"), E.setAttribute("aria-label", C("video.dragSetIn", "Drag to set In")); + E.className = "mjr-video-seek-handle mjr-video-seek-handle--in", E.title = w("video.dragSetIn", "Drag to set In"), E.setAttribute("aria-label", w("video.dragSetIn", "Drag to set In")); let D = document.createElement("div"); - D.className = "mjr-video-seek-handle mjr-video-seek-handle--out", D.title = C("video.dragSetOut", "Drag to set Out"), D.setAttribute("aria-label", C("video.dragSetOut", "Drag to set Out")), f.appendChild(p), h && f.appendChild(h), f.appendChild(m), o && (f.appendChild(x), f.appendChild(S), f.appendChild(E), f.appendChild(D)); + D.className = "mjr-video-seek-handle mjr-video-seek-handle--out", D.title = w("video.dragSetOut", "Drag to set Out"), D.setAttribute("aria-label", w("video.dragSetOut", "Drag to set Out")), f.appendChild(p), h && f.appendChild(h), f.appendChild(m), o && (f.appendChild(x), f.appendChild(S), f.appendChild(E), f.appendChild(D)); let O = document.createElement("span"); - O.className = "mjr-video-time", O.textContent = "0:00 / 0:00", O.title = C("video.currentTimeTotal", "Current time / Total duration"); + O.className = "mjr-video-time", O.textContent = "0:00 / 0:00", O.title = w("video.currentTimeTotal", "Current time / Total duration"); let k = document.createElement("span"); k.className = "mjr-video-range-count", k.textContent = ""; try { @@ -1753,37 +1753,37 @@ function Qt(e, t = {}) { let A = document.createElement("div"); A.className = "mjr-video-timegroup", A.appendChild(O), o && A.appendChild(k); let j = document.createElement("span"); - j.className = "mjr-video-frame", j.textContent = "F: 0", j.title = C("video.currentFrame", "Current frame number"); - let M = Gt("mjr-video-btn--play", C("btn.play", "Play"), C("video.playPauseSpace", "Play/Pause (Space)")), N = Gt("mjr-video-btn--step", "<", C("video.stepBack", "Step back")), ee = Gt("mjr-video-btn--step", ">", C("video.stepForward", "Step forward")), te = Gt("mjr-video-btn--jump mjr-video-btn--in", "|<", C("video.goToIn", "Go to In")), ne = Gt("mjr-video-btn--jump mjr-video-btn--out", ">|", C("video.goToOut", "Go to Out")), re = Gt("mjr-video-btn--mark mjr-video-btn--in", "I", C("video.setInFromCurrent", "Set In from current frame")), ie = Gt("mjr-video-btn--mark mjr-video-btn--out", "O", C("video.setOutFromCurrent", "Set Out from current frame")), ae = Kt("mjr-video-btn--toggle", "pi-refresh", C("video.loopPlaybackInRange", "Loop playback in range"), C("video.loop", "Loop")), oe = ae.btn, se = qt("mjr-video-num--in", { + j.className = "mjr-video-frame", j.textContent = "F: 0", j.title = w("video.currentFrame", "Current frame number"); + let M = Gt("mjr-video-btn--play", w("btn.play", "Play"), w("video.playPauseSpace", "Play/Pause (Space)")), N = Gt("mjr-video-btn--step", "<", w("video.stepBack", "Step back")), ee = Gt("mjr-video-btn--step", ">", w("video.stepForward", "Step forward")), te = Gt("mjr-video-btn--jump mjr-video-btn--in", "|<", w("video.goToIn", "Go to In")), ne = Gt("mjr-video-btn--jump mjr-video-btn--out", ">|", w("video.goToOut", "Go to Out")), re = Gt("mjr-video-btn--mark mjr-video-btn--in", "I", w("video.setInFromCurrent", "Set In from current frame")), ie = Gt("mjr-video-btn--mark mjr-video-btn--out", "O", w("video.setOutFromCurrent", "Set Out from current frame")), ae = Kt("mjr-video-btn--toggle", "pi-refresh", w("video.loopPlaybackInRange", "Loop playback in range"), w("video.loop", "Loop")), oe = ae.btn, se = qt("mjr-video-num--in", { min: 0, step: 1, value: 0, - title: C("video.inFrame", "In frame"), - ariaLabel: C("video.inFrame", "In frame"), + title: w("video.inFrame", "In frame"), + ariaLabel: w("video.inFrame", "In frame"), widthPx: 72 }), ce = qt("mjr-video-num--out", { min: 0, step: 1, value: 0, - title: C("video.outFrame", "Out frame"), - ariaLabel: C("video.outFrame", "Out frame"), + title: w("video.outFrame", "Out frame"), + ariaLabel: w("video.outFrame", "Out frame"), widthPx: 72 }), le = qt("mjr-video-num--step", { min: 1, step: 1, value: 1, - title: C("video.frameIncrement", "Frame increment"), - ariaLabel: C("video.frameIncrement", "Frame increment"), + title: w("video.frameIncrement", "Frame increment"), + ariaLabel: w("video.frameIncrement", "Frame increment"), widthPx: 56 }), I = qt("mjr-video-num--fps", { min: 1, step: .001, value: It(s || 30), - title: C("video.fpsStepping", "FPS (used for frame stepping)"), - ariaLabel: C("video.fps", "FPS"), + title: w("video.fpsStepping", "FPS (used for frame stepping)"), + ariaLabel: w("video.fps", "FPS"), widthPx: 56 }), L = document.createElement("select"); - L.className = "mjr-video-num mjr-video-num--speed", L.title = C("video.playbackSpeed", "Playback speed"), L.setAttribute("aria-label", C("video.playbackSpeed", "Playback speed")), L.style.width = "74px"; + L.className = "mjr-video-num mjr-video-num--speed", L.title = w("video.playbackSpeed", "Playback speed"), L.setAttribute("aria-label", w("video.playbackSpeed", "Playback speed")), L.style.width = "74px"; for (let e of [ .25, .5, @@ -1799,10 +1799,10 @@ function Qt(e, t = {}) { let t = document.createElement("option"); t.value = String(e), t.textContent = `${e}x`, L.appendChild(t); } - let ue = Kt("mjr-video-btn--mute", "pi-volume-up", C("video.mute", "Mute"), C("video.mute", "Mute")), de = ue.btn, R = document.createElement("div"); + let ue = Kt("mjr-video-btn--mute", "pi-volume-up", w("video.mute", "Mute"), w("video.mute", "Mute")), de = ue.btn, R = document.createElement("div"); R.className = "mjr-video-volume-wrap", R.style.cssText = "display:none; align-items:center; position:relative;"; let z = null; - z = document.createElement("input"), z.className = "mjr-video-range mjr-video-range--volume", z.type = "range", z.min = "0", z.max = "1", z.step = "0.02", z.value = String(P(Number(e.volume) || 0)), z.setAttribute("aria-label", C("video.volume", "Volume")), z.title = C("video.volume", "Volume"); + z = document.createElement("input"), z.className = "mjr-video-range mjr-video-range--volume", z.type = "range", z.min = "0", z.max = "1", z.step = "0.02", z.value = String(P(Number(e.volume) || 0)), z.setAttribute("aria-label", w("video.volume", "Volume")), z.title = w("video.volume", "Volume"); try { z.style.width = "120px"; } catch (e) { @@ -1812,17 +1812,17 @@ function Qt(e, t = {}) { let fe = document.createElement("div"); fe.className = "mjr-video-group mjr-video-group--in"; let B = document.createElement("span"); - B.textContent = "In", B.title = C("video.resetInToStart", "Reset In to start"), B.style.cssText = "cursor:pointer; user-select:none;", o && (fe.appendChild(B), fe.appendChild(se)); + B.textContent = "In", B.title = w("video.resetInToStart", "Reset In to start"), B.style.cssText = "cursor:pointer; user-select:none;", o && (fe.appendChild(B), fe.appendChild(se)); let V = document.createElement("div"); V.className = "mjr-video-group mjr-video-group--out"; let H = document.createElement("span"); - H.textContent = "Out", H.title = C("video.resetOutToEnd", "Reset Out to end"), H.style.cssText = "cursor:pointer; user-select:none;", o && (V.appendChild(H), V.appendChild(ce)); + H.textContent = "Out", H.title = w("video.resetOutToEnd", "Reset Out to end"), H.style.cssText = "cursor:pointer; user-select:none;", o && (V.appendChild(H), V.appendChild(ce)); let pe = document.createElement("div"); - pe.className = "mjr-video-group mjr-video-group--adjust-left", o && (pe.appendChild(re), r || (pe.appendChild(document.createTextNode(C("video.step", "Step"))), pe.appendChild(le), pe.appendChild(document.createTextNode(C("video.fps", "FPS"))), pe.appendChild(I)), pe.appendChild(j)); + pe.className = "mjr-video-group mjr-video-group--adjust-left", o && (pe.appendChild(re), r || (pe.appendChild(document.createTextNode(w("video.step", "Step"))), pe.appendChild(le), pe.appendChild(document.createTextNode(w("video.fps", "FPS"))), pe.appendChild(I)), pe.appendChild(j)); let U = document.createElement("div"); U.className = "mjr-video-group mjr-video-group--adjust-right", o && (U.appendChild(A), U.appendChild(oe)); let me = document.createElement("div"); - me.className = "mjr-video-group mjr-video-group--speed", me.appendChild(document.createTextNode(C("video.speed", "Speed"))), me.appendChild(L); + me.className = "mjr-video-group mjr-video-group--speed", me.appendChild(document.createTextNode(w("video.speed", "Speed"))), me.appendChild(L); let he = document.createElement("div"); he.className = "mjr-video-bottom mjr-video-bottom--left"; let ge = document.createElement("div"); @@ -1939,7 +1939,7 @@ function Qt(e, t = {}) { }, xe = (e = !1) => { try { if (!I || r) return; - let t = Number(q.nativeFps), n = be(), i = C("video.fpsStepping", "FPS (used for frame stepping)"); + let t = Number(q.nativeFps), n = be(), i = w("video.fpsStepping", "FPS (used for frame stepping)"); I.classList.toggle("is-overridden", n), Number.isFinite(t) && t > 0 ? (I.dataset.defaultFps = String(t), I.title = `${i} - Source FPS: ${t}`, n && (I.title += " - Modified")) : (delete I.dataset.defaultFps, I.title = i), e && !I.matches?.(":focus") && (I.value = String(It(q.fps, q.nativeFps || 30))); } catch (e) { console.debug?.(e); @@ -2018,7 +2018,7 @@ function Qt(e, t = {}) { try { Te(oe, !!(q.loop || q.pingpong)); try { - ae?.icon && (q.pingpong ? (ae.icon.className = "pi pi-sort-alt", oe.title = C("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (ae.icon.className = "pi pi-refresh", oe.title = C("video.loopPlaybackInRange", "Loop playback in range"))); + ae?.icon && (q.pingpong ? (ae.icon.className = "pi pi-sort-alt", oe.title = w("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (ae.icon.className = "pi pi-refresh", oe.title = w("video.loopPlaybackInRange", "Loop playback in range"))); } catch (e) { console.debug?.(e); } @@ -2086,7 +2086,7 @@ function Qt(e, t = {}) { }, Fe = () => { try { let t = !e?.paused || q._ppReverse; - M.textContent = t ? C("video.pause", "Pause") : C("video.play", "Play"); + M.textContent = t ? w("video.pause", "Pause") : w("video.play", "Play"); } catch (e) { console.debug?.(e); } @@ -2098,7 +2098,7 @@ function Qt(e, t = {}) { } catch (e) { console.debug?.(e); } - let n = t ? C("video.unmute", "Unmute") : C("video.mute", "Mute"); + let n = t ? w("video.unmute", "Unmute") : w("video.mute", "Mute"); de.title = n, de.setAttribute("aria-label", n); } catch (e) { console.debug?.(e); @@ -2112,14 +2112,14 @@ function Qt(e, t = {}) { let t = Math.round(e * Ne()); Number.isNaN(t) || q._seeking || p.matches?.(":active") || (p.value = String(t)); try { - w.style.left = `${e * 100}%`; + C.style.left = `${e * 100}%`; } catch (e) { console.debug?.(e); } } else { p.value = "0"; try { - w.style.left = "0%"; + C.style.left = "0%"; } catch (e) { console.debug?.(e); } @@ -2564,7 +2564,7 @@ function Qt(e, t = {}) { W(e), We(); })); try { - k.title = C("video.resetPlayerControls", "Reset player controls"), k.style.cursor = "pointer", k.style.userSelect = "none"; + k.title = w("video.resetPlayerControls", "Reset player controls"), k.style.cursor = "pointer", k.style.userSelect = "none"; } catch (e) { console.debug?.(e); } @@ -3113,7 +3113,7 @@ function Sn(e, t, r) { errorMessage: "Failed to update rating", warnPrefix: "[ViewerContextMenu]", onSuccess: () => { - ce(k, { + ce(O, { assetId: String(i), rating: t }, { warnPrefix: "[ViewerContextMenu]" }); @@ -3142,35 +3142,35 @@ function wn(e, t, n) { ].map((r) => yn(`${r} Stars`, "pi pi-star", null, async () => { Sn(e, r, t); }, { disabled: !n })); - return r.push(bn()), r.push(yn(C("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { + return r.push(bn()), r.push(yn(w("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { Sn(e, 0, t); }, { disabled: !n })), r; } function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { - let c = typeof i == "function" ? i(n) : O(n), l = !!(n?.id || n?.filepath); + let c = typeof i == "function" ? i(n) : v(n), l = !!(n?.id || n?.filepath); return [ - yn(C("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => { + yn(w("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => { xn(c) && window.open(c, "_blank", "noopener,noreferrer"); }), - yn(C("ctx.copyPath", "Copy path"), "pi pi-copy", mn.COPY_PATH, async () => { + yn(w("ctx.copyPath", "Copy path"), "pi pi-copy", mn.COPY_PATH, async () => { let t = n?.filepath ? String(n.filepath) : ""; - if (!t) e(C("toast.noFilePath"), "error"); + if (!t) e(w("toast.noFilePath"), "error"); else try { - await navigator.clipboard.writeText(t), e(C("toast.pathCopied"), "success", 2e3); + await navigator.clipboard.writeText(t), e(w("toast.pathCopied"), "success", 2e3); } catch (t) { - console.error("[ViewerContextMenu] Copy failed:", t), e(C("toast.pathCopyFailed"), "error"); + console.error("[ViewerContextMenu] Copy failed:", t), e(w("toast.pathCopyFailed"), "error"); } }), - yn(C("ctx.downloadOriginal", "Download Original"), "pi pi-download", mn.DOWNLOAD, async () => { + yn(w("ctx.downloadOriginal", "Download Original"), "pi pi-download", mn.DOWNLOAD, async () => { if (!n || !n.filepath) return; - let t = v(n.filepath), r = document.createElement("a"); - r.href = t, r.download = n.filename, document.body.appendChild(r), r.click(), document.body.removeChild(r), e(C("toast.downloadingFile", "Downloading {filename}...", { filename: n.filename }), "info", 3e3); + let t = k(n.filepath), r = document.createElement("a"); + r.href = t, r.download = n.filename, document.body.appendChild(r), r.click(), document.body.removeChild(r), e(w("toast.downloadingFile", "Downloading {filename}...", { filename: n.filename }), "info", 3e3); }, { disabled: !n?.filepath }), - yn(C("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", mn.OPEN_IN_FOLDER, async () => { + yn(w("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", mn.OPEN_IN_FOLDER, async () => { let t = await s(n); - t?.ok ? e(C("toast.openedInFolder"), "info", 2e3) : e(t?.error || C("toast.openFolderFailed"), "error"); + t?.ok ? e(w("toast.openedInFolder"), "info", 2e3) : e(t?.error || w("toast.openFolderFailed"), "error"); }, { disabled: !(n?.id || n?.filepath) }), - yn(C("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", mn.ADD_TO_COLLECTION, async () => { + yn(w("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", mn.ADD_TO_COLLECTION, async () => { try { await bt({ x: r?.clientX, @@ -3182,14 +3182,14 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { } }), bn(), - yn(C("ctx.editTags", "Edit tags"), "pi pi-tags", mn.EDIT_TAGS, async () => { + yn(w("ctx.editTags", "Edit tags"), "pi pi-tags", mn.EDIT_TAGS, async () => { dn({ x: (Number(r?.clientX) || 0) + 6, y: (Number(r?.clientY) || 0) + 6, asset: n, onChanged: ((...e) => { let t = e[0]; - n.tags = t, ce(w, { + n.tags = t, ce(T, { assetId: String(n.id), tags: t }, { warnPrefix: "[ViewerContextMenu]" }); @@ -3202,16 +3202,16 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { }); }, { closeOnSelect: !1 }), bn(), - yn(C("ctx.setRating", "Set rating"), "pi pi-star", `${mn.RATING_SUBMENU} >`, null, { + yn(w("ctx.setRating", "Set rating"), "pi pi-star", `${mn.RATING_SUBMENU} >`, null, { disabled: !l, closeOnSelect: !1, submenu: wn(n, o, l) }), - yn(C("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => { + yn(w("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => { if (n?.id) try { let t = await p(n.id, { refresh: !0 }); if (!t?.ok || !t?.data) { - e(t?.error || C("toast.metadataRefreshFailed", "Failed to refresh metadata."), "error"); + e(t?.error || w("toast.metadataRefreshFailed", "Failed to refresh metadata."), "error"); return; } let r = t.data; @@ -3226,15 +3226,15 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { let i = [], a = Cn(r?.size_bytes); a && i.push(a), r?.mime && i.push(r.mime); let o = i.length ? ` (${i.join(", ")})` : ""; - e(C("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: o }), "success", 3e3); + e(w("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: o }), "success", 3e3); } catch (e) { a(e, "[ViewerContextMenu] Metadata refresh", { showToast: !0 }); } }, { disabled: !n?.id }), bn(), - yn(C("ctx.rename", "Rename"), "pi pi-pencil", mn.RENAME, async () => { + yn(w("ctx.rename", "Rename"), "pi pi-pencil", mn.RENAME, async () => { if (!(n?.id || n?.filepath)) return; - let t = n.filename || "", r = ut(await L(C("dialog.rename.title", "Rename file"), t), t); + let t = n.filename || "", r = ut(await L(w("dialog.rename.title", "Rename file"), t), t); if (!r || r === t) return; let i = st(r); if (!i.valid) e(i.reason, "error"); @@ -3242,24 +3242,24 @@ function Tn({ asset: n, event: r, getCurrentViewUrl: i, onAssetChanged: o }) { let t = await f(n, r); if (t?.ok) { let i = t?.data?.asset; - i && typeof i == "object" ? Object.assign(n, i) : (n.filename = r, n.filepath = n.filepath.replace(/[^\\/]+$/, r), n.path &&= String(n.path).replace(/[^\\/]+$/, r), n.file_info && typeof n.file_info == "object" && (n.file_info.filename = r, n.file_info.filepath && (n.file_info.filepath = String(n.file_info.filepath).replace(/[^\\/]+$/, r)), n.file_info.path && (n.file_info.path = String(n.file_info.path).replace(/[^\\/]+$/, r)))), e(C("toast.fileRenamedSuccess"), "success"); + i && typeof i == "object" ? Object.assign(n, i) : (n.filename = r, n.filepath = n.filepath.replace(/[^\\/]+$/, r), n.path &&= String(n.path).replace(/[^\\/]+$/, r), n.file_info && typeof n.file_info == "object" && (n.file_info.filename = r, n.file_info.filepath && (n.file_info.filepath = String(n.file_info.filepath).replace(/[^\\/]+$/, r)), n.file_info.path && (n.file_info.path = String(n.file_info.path).replace(/[^\\/]+$/, r)))), e(w("toast.fileRenamedSuccess"), "success"); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "viewer-rename" } })); } catch (e) { console.debug?.(e); } o?.(); - } else e(t?.error || C("toast.fileRenameFailed"), "error"); + } else e(t?.error || w("toast.fileRenameFailed"), "error"); } catch (t) { - e(C("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); + e(w("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); } }, { disabled: !(n?.id || n?.filepath) }), - yn(C("ctx.delete", "Delete"), "pi pi-trash", mn.DELETE, async () => { + yn(w("ctx.delete", "Delete"), "pi pi-trash", mn.DELETE, async () => { if ((n?.id || n?.filepath) && await mt(1, n?.filename)) try { let r = await t(n); - r?.ok ? (e(C("toast.fileDeletedSuccess"), "success"), o?.()) : e(r?.error || C("toast.fileDeleteFailed"), "error"); + r?.ok ? (e(w("toast.fileDeletedSuccess"), "success"), o?.()) : e(r?.error || w("toast.fileDeleteFailed"), "error"); } catch (t) { - e(C("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); + e(w("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); } }, { disabled: !(n?.id || n?.filepath) }) ]; @@ -3660,7 +3660,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged b: i, setActive: a }; - }, w = b("Channel View", [ + }, C = b("Channel View", [ { value: "rgb", label: "RGB" @@ -3686,7 +3686,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Luma" } ]); - w.title = C("tooltip.colorChannels", "View color channels or luminance"); + C.title = w("tooltip.colorChannels", "View color channels or luminance"); let T = x("Exposure (EV)", { min: -10, max: 10, @@ -3729,31 +3729,31 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged }, A = (e) => { try { let t = String(e || "rgb"); - if (w.style.boxShadow = "", t === "r") { - w.style.borderColor = "rgba(255,90,90,0.60)", w.style.background = "rgba(255,90,90,0.14)", w.style.boxShadow = "0 0 0 1px rgba(255,90,90,0.14) inset"; + if (C.style.boxShadow = "", t === "r") { + C.style.borderColor = "rgba(255,90,90,0.60)", C.style.background = "rgba(255,90,90,0.14)", C.style.boxShadow = "0 0 0 1px rgba(255,90,90,0.14) inset"; return; } if (t === "g") { - w.style.borderColor = "rgba(90,255,140,0.55)", w.style.background = "rgba(90,255,140,0.12)", w.style.boxShadow = "0 0 0 1px rgba(90,255,140,0.12) inset"; + C.style.borderColor = "rgba(90,255,140,0.55)", C.style.background = "rgba(90,255,140,0.12)", C.style.boxShadow = "0 0 0 1px rgba(90,255,140,0.12) inset"; return; } if (t === "b") { - w.style.borderColor = "rgba(90,160,255,0.60)", w.style.background = "rgba(90,160,255,0.12)", w.style.boxShadow = "0 0 0 1px rgba(90,160,255,0.12) inset"; + C.style.borderColor = "rgba(90,160,255,0.60)", C.style.background = "rgba(90,160,255,0.12)", C.style.boxShadow = "0 0 0 1px rgba(90,160,255,0.12) inset"; return; } if (t === "l") { - w.style.borderColor = "rgba(255,210,90,0.60)", w.style.background = "rgba(255,210,90,0.12)", w.style.boxShadow = "0 0 0 1px rgba(255,210,90,0.12) inset"; + C.style.borderColor = "rgba(255,210,90,0.60)", C.style.background = "rgba(255,210,90,0.12)", C.style.boxShadow = "0 0 0 1px rgba(255,210,90,0.12) inset"; return; } if (t === "a") { - w.style.borderColor = "rgba(220,220,220,0.35)", w.style.background = "rgba(255,255,255,0.10)", w.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.08) inset"; + C.style.borderColor = "rgba(220,220,220,0.35)", C.style.background = "rgba(255,255,255,0.10)", C.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.08) inset"; return; } if (t === "rgb") { - w.style.borderColor = "rgba(255,255,255,0.22)", w.style.background = "linear-gradient(90deg, rgba(255,90,90,0.16), rgba(90,255,140,0.14), rgba(90,160,255,0.16))", w.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.10) inset"; + C.style.borderColor = "rgba(255,255,255,0.22)", C.style.background = "linear-gradient(90deg, rgba(255,90,90,0.16), rgba(90,255,140,0.14), rgba(90,160,255,0.16))", C.style.boxShadow = "0 0 0 1px rgba(255,255,255,0.10) inset"; return; } - w.style.borderColor = "rgba(255,255,255,0.14)", w.style.background = "rgba(255,255,255,0.08)"; + C.style.borderColor = "rgba(255,255,255,0.14)", C.style.background = "rgba(255,255,255,0.08)"; } catch (e) { console.debug?.(e); } @@ -3807,7 +3807,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Both" } ]); - P.title = C("tooltip.scopesHistogram", "Show histogram/waveform scopes"); + P.title = w("tooltip.scopesHistogram", "Show histogram/waveform scopes"); let te = S("Grid", "Grid (G)", { iconClass: "pi-th-large", accentRgb: D.overlay @@ -3833,7 +3833,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Golden" } ]); - F.title = Dt(C("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G"); + F.title = Dt(w("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G"); let ne = S("Mask", "Format mask (dim outside)", { iconClass: "pi-stop", accentRgb: D.overlay @@ -3863,7 +3863,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "9:16" } ]); - re.title = C("tooltip.aspectRatioMask", "Aspect ratio overlay mask"); + re.title = w("tooltip.aspectRatioMask", "Aspect ratio overlay mask"); let ie = x("Mask Opacity", { min: 0, max: .9, @@ -3918,7 +3918,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Screen" } ]); - I.title = C("tooltip.compareBlendMode", "Compare blend mode"); + I.title = w("tooltip.compareBlendMode", "Compare blend mode"); let L = b("Audio Visualizer", [{ value: "simple", label: "Simple" @@ -3926,11 +3926,11 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged value: "artistic", label: "Artistic" }]); - L.title = C("tooltip.audioVisualizer", "Audio visualizer mode"); - let ue = Ln("Reset", C("tooltip.resetPlayerControls", "Reset all viewer controls")); + L.title = w("tooltip.audioVisualizer", "Audio visualizer mode"); + let ue = Ln("Reset", w("tooltip.resetPlayerControls", "Reset all viewer controls")); ue.style.height = "26px", ue.style.fontSize = "11px", ue.style.padding = "0 8px", ue.classList?.add?.("mjr-viewer-tool-btn", "mjr-viewer-tool-btn--reset"), ue.classList?.add?.("mjr-viewer-tools-action", "mjr-viewer-tools-action--primary"), ue.style.marginLeft = "auto"; let de = document.createElement("button"); - de.type = "button", de.title = C("tooltip.exportFrame", "Save current frame as PNG"), de.setAttribute("aria-label", C("tooltip.exportFrame", "Save frame as PNG")), de.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", de.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; + de.type = "button", de.title = w("tooltip.exportFrame", "Save current frame as PNG"), de.setAttribute("aria-label", w("tooltip.exportFrame", "Save frame as PNG")), de.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", de.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; let R = document.createElement("span"); R.className = "pi pi-download", R.setAttribute("aria-hidden", "true"), R.style.fontSize = "14px", de.appendChild(R), de.classList?.add?.("mjr-viewer-tools-action"); try { @@ -3939,7 +3939,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged console.debug?.(e); } let z = document.createElement("button"); - z.type = "button", z.title = C("tooltip.copyFrame", "Copy current frame to clipboard"), z.setAttribute("aria-label", C("tooltip.copyFrame", "Copy frame to clipboard")), z.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", z.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; + z.type = "button", z.title = w("tooltip.copyFrame", "Copy current frame to clipboard"), z.setAttribute("aria-label", w("tooltip.copyFrame", "Copy frame to clipboard")), z.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", z.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; let fe = document.createElement("span"); fe.className = "pi pi-copy", fe.setAttribute("aria-hidden", "true"), fe.style.fontSize = "14px", z.appendChild(fe), z.classList?.add?.("mjr-viewer-tools-action"); try { @@ -3952,7 +3952,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Channel", accentRgb: D.channel }); - B.appendChild(w), f.body.appendChild(B); + B.appendChild(C), f.body.appendChild(B); let V = y({ key: "exposure", label: "EV", @@ -3999,23 +3999,23 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged }; try { let e = V.querySelector?.(".mjr-viewer-tools-group-label"); - e && (e.title = C("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none"); + e && (e.title = w("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none"); } catch (e) { console.debug?.(e); } try { - T.out.title = C("tooltip.resetExposure", "Reset EV to 0"), T.out.style.cursor = "pointer", T.out.style.userSelect = "none"; + T.out.title = w("tooltip.resetExposure", "Reset EV to 0"), T.out.style.cursor = "pointer", T.out.style.userSelect = "none"; } catch (e) { console.debug?.(e); } try { let e = H.querySelector?.(".mjr-viewer-tools-group-label"); - e && (e.title = C("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none"); + e && (e.title = w("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none"); } catch (e) { console.debug?.(e); } try { - E.out.title = C("tooltip.resetGamma", "Reset Gamma to 1.00"), E.out.style.cursor = "pointer", E.out.style.userSelect = "none"; + E.out.title = w("tooltip.resetGamma", "Reset Gamma to 1.00"), E.out.style.cursor = "pointer", E.out.style.userSelect = "none"; } catch (e) { console.debug?.(e); } @@ -4062,7 +4062,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged let ve = document.createElement("div"); ve.style.cssText = "position: relative; display:inline-flex; align-items:center;", ve.className = "mjr-viewer-tools-action", ve.style.marginLeft = "4px"; let ye = document.createElement("button"); - ye.type = "button", ye.title = C("tooltip.viewerShortcuts", "Viewer shortcuts"), ye.setAttribute("aria-label", C("tooltip.viewerShortcuts", "Viewer shortcuts")), ye.style.cssText = "\n height: 24px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n color: rgba(255,255,255,0.92);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n "; + ye.type = "button", ye.title = w("tooltip.viewerShortcuts", "Viewer shortcuts"), ye.setAttribute("aria-label", w("tooltip.viewerShortcuts", "Viewer shortcuts")), ye.style.cssText = "\n height: 24px;\n padding: 0 8px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n color: rgba(255,255,255,0.92);\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n "; let q = document.createElement("span"); q.className = "pi pi-question-circle", q.setAttribute("aria-hidden", "true"), q.style.fontSize = "14px", ye.appendChild(q); let be = document.createElement("div"); @@ -4101,7 +4101,7 @@ function zn({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged helpWrap: ve, helpBtn: ye, helpPop: be, - channelsSelect: w, + channelsSelect: C, exposureCtl: T, gammaCtl: E, zebraToggle: N, @@ -4508,22 +4508,22 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, x.className = "mjr-viewer-title-wrap", x.style.cssText = "display:flex; align-items:center; justify-content:center; gap:12px; min-width:0; max-width:min(100%, calc(100vw - 220px)); text-align:center;"; let S = document.createElement("span"); S.className = "mjr-viewer-filename", S.style.cssText = "font-size: 13px; font-weight: 600; min-width:0; max-width:min(60vw, 820px); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:center;"; - let w = document.createElement("div"); - w.className = "mjr-viewer-badges", w.style.cssText = "display:flex; gap:6px; align-items:center; flex-wrap:nowrap; min-width:0;"; + let C = document.createElement("div"); + C.className = "mjr-viewer-badges", C.style.cssText = "display:flex; gap:6px; align-items:center; flex-wrap:nowrap; min-width:0;"; let T = document.createElement("div"); T.className = "mjr-viewer-header-meta mjr-viewer-header-meta--right", T.style.cssText = "display:none; align-items:center; gap:10px; min-width:0; justify-content:flex-end; overflow:hidden;"; let E = document.createElement("span"); E.className = "mjr-viewer-filename mjr-viewer-filename--right", E.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:right;"; let D = document.createElement("div"); - D.className = "mjr-viewer-badges mjr-viewer-badges--right", D.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap; justify-content:flex-end;", b.appendChild(S), b.appendChild(w), x.appendChild(b), T.appendChild(D), T.appendChild(E); + D.className = "mjr-viewer-badges mjr-viewer-badges--right", D.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap; justify-content:flex-end;", b.appendChild(S), b.appendChild(C), x.appendChild(b), T.appendChild(D), T.appendChild(E); let O = document.createElement("div"); O.className = "mjr-viewer-mode-buttons", O.style.cssText = "display: flex; gap: 4px;"; let k = Rn("Single", e.SINGLE); - k.title = C("tooltip.singleViewMode", "Single view mode (one image)"); + k.title = w("tooltip.singleViewMode", "Single view mode (one image)"); let A = Rn("A/B", e.AB_COMPARE); - A.title = C("tooltip.compareOverlayMode", "A/B compare mode (overlay)"); + A.title = w("tooltip.compareOverlayMode", "A/B compare mode (overlay)"); let j = Rn("Side", e.SIDE_BY_SIDE); - j.title = C("tooltip.compareSideBySide", "Side-by-side comparison mode"), O.appendChild(k), O.appendChild(A), O.appendChild(j); + j.title = w("tooltip.compareSideBySide", "Side-by-side comparison mode"), O.appendChild(k), O.appendChild(A), O.appendChild(j); let M = Ln("X", "Close (Esc)"); M.style.fontSize = "18px"; try { @@ -4742,7 +4742,7 @@ function Un({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, headerEl: _, headerTopEl: v, filenameEl: S, - badgesBarEl: w, + badgesBarEl: C, filenameRightEl: E, badgesBarRightEl: D, leftAreaEl: ee, @@ -4788,7 +4788,7 @@ function Wn(e) { } return null; } -function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, computeOneToOneZoom: o, setZoom: s, scheduleOverlayRedraw: c, scheduleApplyGrade: l, syncToolsUIFromState: u, applyDistractionFreeUI: f, navigateViewerAssets: p, closeViewer: m, renderBadges: h, updateAssetRating: g, safeDispatchCustomEvent: _, ASSET_RATING_CHANGED_EVENT: v, probeTooltip: y, loupeWrap: b, getVideoControls: x, lifecycle: S, renderGenInfoPanel: T } = {}) { +function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, computeOneToOneZoom: o, setZoom: s, scheduleOverlayRedraw: c, scheduleApplyGrade: l, syncToolsUIFromState: u, applyDistractionFreeUI: f, navigateViewerAssets: p, closeViewer: m, renderBadges: h, updateAssetRating: g, safeDispatchCustomEvent: _, ASSET_RATING_CHANGED_EVENT: v, probeTooltip: y, loupeWrap: b, getVideoControls: x, lifecycle: S, renderGenInfoPanel: C } = {}) { let E = S?.unsubs || [], D = null, O = null, k = () => { try { D && clearTimeout(D); @@ -4805,15 +4805,15 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, if (D = null, O = null, t?.assetId) try { let n = await g?.(t.assetId, t.rating); if (!n?.ok) { - e(n?.error || C("toast.ratingUpdateFailed"), "error"); + e(n?.error || w("toast.ratingUpdateFailed"), "error"); return; } - e(C("toast.ratingSetN", { n: t.rating }), "success", 1500), _?.(v, { + e(w("toast.ratingSetN", { n: t.rating }), "success", 1500), _?.(v, { assetId: String(t.assetId), rating: t.rating }, { warnPrefix: "[Viewer]" }); } catch { - e(C("toast.ratingUpdateError"), "error"); + e(w("toast.ratingUpdateError"), "error"); } }, 300); }, j = () => { @@ -4910,10 +4910,10 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, if (!r) return !1; if (n) { let n = r.setPlaybackRate?.(t); - return Number.isFinite(Number(n)) ? (i.playbackRate = Number(n), e(C("toast.playbackRate", "Playback {rate}x", { rate: Number(n).toFixed(2) }), "info", 1200), !0) : !1; + return Number.isFinite(Number(n)) ? (i.playbackRate = Number(n), e(w("toast.playbackRate", "Playback {rate}x", { rate: Number(n).toFixed(2) }), "info", 1200), !0) : !1; } let a = r.adjustPlaybackRate?.(t); - return Number.isFinite(Number(a)) ? (i.playbackRate = Number(a), e(C("toast.playbackRate", "Playback {rate}x", { rate: Number(a).toFixed(2) }), "info", 1200), !0) : !1; + return Number.isFinite(Number(a)) ? (i.playbackRate = Number(a), e(w("toast.playbackRate", "Playback {rate}x", { rate: Number(a).toFixed(2) }), "info", 1200), !0) : !1; } catch { return !1; } @@ -4921,7 +4921,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, if ((n.ctrlKey || n.metaKey) && (n.key === "c" || n.key === "C")) try { let t = Wn(S); if (t) { - g(), navigator.clipboard?.writeText?.(t).then(() => e(C("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => e(C("toast.copyFailed", "Copy failed"), "error", 1500)); + g(), navigator.clipboard?.writeText?.(t).then(() => e(w("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => e(w("toast.copyFailed", "Copy failed"), "error", 1500)); return; } } catch (e) { @@ -4967,7 +4967,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, } catch (e) { console.debug?.(e); } - X(u), X(T); + X(u), X(C); break; case "t": case "T": @@ -4978,7 +4978,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, asset: S, onChanged: ((...e) => { let t = e[0]; - S.tags = t, _(w, { + S.tags = t, _(T, { assetId: String(S.id), tags: t }, { warnPrefix: "[ViewerKeyboard]" }), X(h); @@ -4998,7 +4998,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, case "i": case "I": if (v && S?.kind === "video" && k()?.setInPoint?.()) { - g(), e(C("toast.inPointSet", "In point set"), "info", 1200); + g(), e(w("toast.inPointSet", "In point set"), "info", 1200); break; } g(); @@ -5017,7 +5017,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, case "o": case "O": if (v && S?.kind === "video" && k()?.setOutPoint?.()) { - g(), e(C("toast.outPointSet", "Out point set"), "info", 1200); + g(), e(w("toast.outPointSet", "Out point set"), "info", 1200); break; } break; @@ -5056,7 +5056,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, } catch (e) { console.debug?.(e); } - X(u), X(f), X(T); + X(u), X(f), X(C); break; case "c": case "C": { @@ -5129,15 +5129,15 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, break; case "[": case "{": - g(), N(-.25) || e(C("toast.playbackVideoOnly"), "warning", 1400); + g(), N(-.25) || e(w("toast.playbackVideoOnly"), "warning", 1400); break; case "]": case "}": - g(), N(.25) || e(C("toast.playbackVideoOnly"), "warning", 1400); + g(), N(.25) || e(w("toast.playbackVideoOnly"), "warning", 1400); break; case "\\": case "|": - g(), N(1, { absolute: !0 }) || e(C("toast.playbackVideoOnly"), "warning", 1400); + g(), N(1, { absolute: !0 }) || e(w("toast.playbackVideoOnly"), "warning", 1400); break; case "+": case "=": @@ -5189,7 +5189,7 @@ function Gn({ overlay: t, _content: n, singleView: r, state: i, VIEWER_MODES: a, // ui/features/viewer/videoSync.ts var Kn = () => { try { - return !!T?.DEBUG_VIEWER; + return !!E?.DEBUG_VIEWER; } catch { return !1; } @@ -6373,7 +6373,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta let n = Number(a?.zoom) || 1, r = f(), { w: i, h: o } = p(r) || { w: 0, h: 0 - }, s = m(), c = s && i > 0 && o > 0 ? E(i, o, s.width, s.height, n) : !1; + }, s = m(), c = s && i > 0 && o > 0 ? T(i, o, s.width, s.height, n) : !1; if (!(n > 1.01 || c)) { t.style.cursor = ""; return; @@ -6486,7 +6486,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta } catch { return n || t || null; } - }, E = (e, t, n, r, i) => { + }, T = (e, t, n, r, i) => { try { let a = S(e, t, n, r); if (!(a.w > 0 && a.h > 0)) return !1; @@ -6526,7 +6526,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta if (!e || e.style.display === "none" || ne(n?.target)) return; let r = Number(a?.zoom) || 1, i = (() => { try { - return !!T?.VIEWER_ALLOW_PAN_AT_ZOOM_1; + return !!E?.VIEWER_ALLOW_PAN_AT_ZOOM_1; } catch { return !1; } @@ -6538,7 +6538,7 @@ function $n({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta w: 0, h: 0 }, a = m(); - return !a || !(t > 0 && n > 0) ? r > 1.01 : r > 1.01 || E(t, n, a.width, a.height, r); + return !a || !(t > 0 && n > 0) ? r > 1.01 : r > 1.01 || T(t, n, a.width, a.height, r); } catch { return r > 1.01; } @@ -6898,7 +6898,7 @@ function ar(e) { } // ui/features/viewer/videoProcessor.ts function or({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = null, getGradeParams: i, isDefaultGrade: a, _tonemap: o, maxProcPixelsVideo: s, throttleFps: c, safeAddListener: l, safeCall: u, onReady: d } = {}) { - let f = r == null ? !!T?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null; + let f = r == null ? !!E?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null; if (!n && ir()) try { p = ar({ canvas: e, @@ -7050,7 +7050,7 @@ function or({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = } catch (e) { console.debug?.(e); } - }, E = () => { + }, T = () => { if (!y._destroyed && e?.isConnected && (y.ready || S(), y.ready)) { try { let e = y.lastParams || i?.() || {}; @@ -7125,7 +7125,7 @@ function or({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = y._rendering = !0; try { y._rafIdSchedule = requestAnimationFrame(() => { - y._rafIdSchedule = null, y._rendering = !1, E(); + y._rafIdSchedule = null, y._rendering = !1, T(); try { r && (y._lastHeavyRenderAt = Date.now()); } catch (e) { @@ -7408,7 +7408,7 @@ function cr(e) { console.debug?.(e); } try { - let e = String(T?.VIEWER_AUDIO_VISUALIZER_MODE || "simple").toLowerCase(); + let e = String(E?.VIEWER_AUDIO_VISUALIZER_MODE || "simple").toLowerCase(); if (e === "artistic") return "artistic"; if (e === "webgl3d" || e === "webgl") return "simple"; } catch (e) { @@ -7563,7 +7563,7 @@ function ur(e, { pseudo3d: t = !1 } = {}) { } function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = {}) { if (!e || !t) return { destroy() {} }; - let i = r == null ? !!T?.VIEWER_PAUSE_DURING_EXECUTION : !!r, a = null, o = !1, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = !1, h = 1e3 / sr(T?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = cr(n), _ = () => { + let i = r == null ? !!E?.VIEWER_PAUSE_DURING_EXECUTION : !!r, a = null, o = !1, s = null, c = null, l = null, u = null, d = null, f = null, p = 0, m = !1, h = 1e3 / sr(E?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = cr(n), _ = () => { try { let t = sr(window.devicePixelRatio || 1, 1, 2), n = Math.max(32, Math.floor((e.clientWidth || 640) * t)), r = Math.max(24, Math.floor((e.clientHeight || 140) * t)); e.width !== n && (e.width = n), e.height !== r && (e.height = r); @@ -7584,7 +7584,7 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = console.debug?.(e); } try { - g === "artistic" && !T?.VIEWER_DISABLE_WEBGL_AUDIO && (f = ur(e, { pseudo3d: !0 })); + g === "artistic" && !E?.VIEWER_DISABLE_WEBGL_AUDIO && (f = ur(e, { pseudo3d: !0 })); } catch (e) { console.debug?.(e); } @@ -7640,7 +7640,7 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = a = null; }, C = () => { x(); - }, w = () => S(), E = () => S(), O = () => _(), k = (e) => { + }, w = () => S(), T = () => S(), O = () => _(), k = (e) => { i && (m = !!String(e?.detail?.active_prompt_id || "").trim(), m ? S() : t?.paused || x()); }; try { @@ -7649,7 +7649,7 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = console.debug?.(e); } try { - t.addEventListener("play", C, { passive: !0 }), t.addEventListener("pause", w, { passive: !0 }), t.addEventListener("ended", E, { passive: !0 }), window.addEventListener("resize", O, { passive: !0 }), i && (window.addEventListener(D.RUNTIME_STATUS, k), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (m = !0)); + t.addEventListener("play", C, { passive: !0 }), t.addEventListener("pause", w, { passive: !0 }), t.addEventListener("ended", T, { passive: !0 }), window.addEventListener("resize", O, { passive: !0 }), i && (window.addEventListener(D.RUNTIME_STATUS, k), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (m = !0)); } catch (e) { console.debug?.(e); } @@ -7661,7 +7661,7 @@ function dr({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = if (!o) { o = !0, S(); try { - t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("ended", E), window.removeEventListener("resize", O), window.removeEventListener(D.RUNTIME_STATUS, k); + t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("ended", T), window.removeEventListener("resize", O), window.removeEventListener(D.RUNTIME_STATUS, k); } catch (e) { console.debug?.(e); } @@ -7865,7 +7865,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } catch (e) { console.debug?.(e); } - }, E = (e, n, { compare: r = !1 } = {}) => { + }, T = (e, n, { compare: r = !1 } = {}) => { let i = document.createElement("div"); if (i.className = "mjr-viewer-audio-shell", !r) { let t = document.createElement("div"); @@ -7948,7 +7948,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } return t; } - if (v === "audio") return E(e, m, { compare: !1 }); + if (v === "audio") return T(e, m, { compare: !1 }); if (v === "video") { let u = document.createElement("canvas"); u.className = "mjr-viewer-media"; @@ -7975,8 +7975,8 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r u._mjrProc = or({ canvas: u, videoEl: v, - disableWebGL: f || !!T.VIEWER_DISABLE_WEBGL_VIDEO, - pauseDuringExecution: T.VIEWER_PAUSE_DURING_EXECUTION, + disableWebGL: f || !!E.VIEWER_DISABLE_WEBGL_VIDEO, + pauseDuringExecution: E.VIEWER_PAUSE_DURING_EXECUTION, getGradeParams: s, isDefaultGrade: c, tonemap: l, @@ -8126,7 +8126,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } return t; } - if (m === "audio") return E(e, f, { compare: !0 }); + if (m === "audio") return T(e, f, { compare: !0 }); if (m === "video") { let u = document.createElement("div"); u.style.cssText = "width:100%; height:100%; position:relative; display:flex; align-items:center; justify-content:center;"; @@ -8155,7 +8155,7 @@ function fr({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r m._mjrProc = or({ canvas: m, videoEl: h, - pauseDuringExecution: T.VIEWER_PAUSE_DURING_EXECUTION, + pauseDuringExecution: E.VIEWER_PAUSE_DURING_EXECUTION, getGradeParams: s, isDefaultGrade: c, tonemap: l, @@ -8463,7 +8463,7 @@ function br(e, t) { let r = document.createElement("div"); r.style.cssText = "display:flex;flex-direction:column;gap:8px;margin:0 0 14px 0;padding:10px;border:1px solid rgba(144,220,220,0.22);border-radius:10px;background:rgba(90,220,220,0.06);"; let i = document.createElement("div"); - i.textContent = C("viewer.metadataCompare", "Metadata compare"), i.style.cssText = "font-size:12px;font-weight:700;color:rgba(255,255,255,0.9);letter-spacing:0.02em", r.appendChild(i); + i.textContent = w("viewer.metadataCompare", "Metadata compare"), i.style.cssText = "font-size:12px;font-weight:700;color:rgba(255,255,255,0.9);letter-spacing:0.02em", r.appendChild(i); for (let e of n.slice(0, 24)) { let t = document.createElement("div"); t.style.cssText = "display:grid;grid-template-columns:minmax(74px,0.42fr) 1fr 1fr;gap:6px;align-items:start"; @@ -9298,7 +9298,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } zr(e, { releaseSrc: !0 }), y(r); - }, { once: !0 }), r.appendChild(e), S(r), f(e), r; + }, { once: !0 }), r.appendChild(e), C(r), f(e), r; } if (a === "audio") { let t = String(e?.thumbnail_url || e?.thumb_url || "").trim(); @@ -9310,10 +9310,10 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } catch (e) { console.debug?.(e); } - b(r); + x(r); }, { once: !0 }), r.appendChild(n); - } else b(r); - return T(r), r; + } else x(r); + return E(r), r; } if (a === "model3d") { let n = (() => { @@ -9325,7 +9325,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { ...e, filename: r, kind: "image" - }) : E(r, i || null, a); + }) : b(r, i || null, a); } catch { return ""; } @@ -9338,10 +9338,10 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } catch (e) { console.debug?.(e); } - C(r); + w(r); }, { once: !0 }), r.appendChild(t); - } else C(r); - return w(r), r; + } else w(r); + return T(r), r; } if (o) { let e = document.createElement("img"); @@ -9353,7 +9353,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } }, { once: !0 }), r.appendChild(e), r; } - return x(r), r; + return S(r), r; }; function y(e) { let t = document.createElement("div"); @@ -9364,7 +9364,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } } - function b(e) { + function x(e) { let t = document.createElement("div"); t.className = "mjr-filmstrip-audio-thumb"; let n = document.createElement("span"); @@ -9375,7 +9375,7 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } } - function x(e) { + function S(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; inset: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 18px; color: rgba(255,255,255,0.25);\n pointer-events: none;\n ", t.textContent = "?"; try { @@ -9384,11 +9384,11 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } } - function S(e) { + function C(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; bottom: 2px; right: 2px;\n font-size: 7px; line-height: 1;\n background: rgba(0,0,0,0.55); color: rgba(255,255,255,0.85);\n padding: 2px 3px; border-radius: 2px;\n pointer-events: none;\n letter-spacing: 0.02em;\n ", t.textContent = "VID", e.appendChild(t); } - function C(e) { + function w(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; inset: 0;\n display: flex; align-items: center; justify-content: center;\n font-size: 10px; font-weight: 700;\n color: rgba(76, 175, 80, 0.7);\n pointer-events: none;\n letter-spacing: 0.04em;\n ", t.textContent = "3D"; try { @@ -9397,11 +9397,11 @@ function Br({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { console.debug?.(e); } } - function w(e) { + function T(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; bottom: 2px; right: 2px;\n font-size: 7px; line-height: 1;\n background: rgba(0,0,0,0.55); color: rgba(76, 175, 80, 0.95);\n padding: 2px 3px; border-radius: 2px;\n pointer-events: none;\n letter-spacing: 0.02em;\n font-weight: 700;\n ", t.textContent = "3D", e.appendChild(t); } - function T(e) { + function E(e) { let t = document.createElement("div"); t.style.cssText = "\n position: absolute; bottom: 2px; right: 2px;\n font-size: 7px; line-height: 1;\n background: rgba(0,0,0,0.55); color: rgba(255,255,255,0.85);\n padding: 2px 3px; border-radius: 2px;\n pointer-events: none;\n letter-spacing: 0.02em;\n ", t.textContent = "AUD", e.appendChild(t); } @@ -9619,13 +9619,13 @@ var Wr = null, Gr = null, Kr = null, qr = null, Jr = null, Yr = null; function Xr() { Wr || import("./abCompare-BUrGm4-x.js").then((e) => { Wr = e; - }), Gr || import("./sideBySide-Css6Vh8y.js").then((e) => { + }), Gr || import("./sideBySide-sOf24A5X.js").then((e) => { Gr = e; - }), Kr || import("./model3dRenderer-k0ey48io.js").then((e) => e.t).then((e) => { + }), Kr || import("./model3dRenderer-DdPKugXy.js").then((e) => e.t).then((e) => { Kr = e; }), qr || import("./scopes-bvTRS68K.js").then((e) => { qr = e; - }), Jr || import("./genInfo-Dxtoun1T.js").then((e) => e.n).then((e) => { + }), Jr || import("./genInfo-BkEKNdy-.js").then((e) => e.n).then((e) => { Jr = e; }), Yr || import("./frameExport-CnNO7oN6.js").then((e) => { Yr = e; @@ -9689,21 +9689,21 @@ function Zr() { console.debug?.(e); } } - function v() { + function y() { try { u?.updatePanCursor?.(); } catch (e) { console.debug?.(e); } } - function y() { + function b() { try { return u?.getPrimaryMedia?.() || null; } catch { return null; } } - function x(e) { + function S(e) { try { return u?.getMediaNaturalSize?.(e) || { w: 0, @@ -9716,21 +9716,21 @@ function Zr() { }; } } - function S() { + function C() { try { return u?.getViewportRect?.() || null; } catch { return null; } } - function E() { + function D() { try { return u?.computeOneToOneZoom?.() ?? null; } catch { return null; } } - function D() { + function k() { try { u?.updateMediaNaturalSize?.(); } catch (e) { @@ -9845,7 +9845,7 @@ function Zr() { onZoomOneToOne: () => { try { let e = () => { - let e = E(); + let e = D(); return e != null && (_(Math.abs((Number(s.zoom) || 1) - e) < .01 ? 1 : e, { clientX: s._lastPointerX, clientY: s._lastPointerY @@ -9855,7 +9855,7 @@ function Zr() { try { requestAnimationFrame(() => { try { - D(); + k(); } catch (e) { console.debug?.(e); } @@ -9958,7 +9958,7 @@ function Zr() { } let { contentRow: z, content: fe, singleView: B, abView: V, sideView: H, overlayLayer: pe, gridCanvas: U, probeTooltip: me, loupeWrap: he, loupeCanvas: ge, genInfoOverlay: _e, genInfoTitle: W, genInfoBody: G, genInfoOverlayLeft: K, genInfoTitleLeft: ve, genInfoBodyLeft: ye, footer: q, prevBtn: be, indexInfo: xe, nextBtn: Se, navBar: Ce, playerBarHost: we, filmstrip: Te } = Hr({ state: s, - buildAssetViewURL: O, + buildAssetViewURL: v, onNavigate: (e) => { try { s.compareAsset != null && (s.compareAsset = null, s.mode = $.SINGLE), s.currentIndex = e, Qe(); @@ -10007,7 +10007,7 @@ function Zr() { let Oe = Zn({ state: s, VIEWER_MODES: $, - APP_CONFIG: T, + APP_CONFIG: E, getAssetMetadata: o, getAssetsBatch: r }), ke = 3e5, Ae = /* @__PURE__ */ new Map(), je = () => { @@ -10117,7 +10117,7 @@ function Zr() { } return null; }, - getViewportRect: S, + getViewportRect: C, clearCanvas: Fe }), Re = () => { let t = (() => { @@ -10363,14 +10363,14 @@ function Zr() { e.textContent = t, e.style.cssText = "font-size: 12px; font-weight: 600; letter-spacing: 0.02em; color: rgba(255,255,255,0.86);", i.appendChild(e); } let o = document.createElement("div"); - o.style.cssText = "padding: 10px 12px; border-radius: 10px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.72);", o.textContent = C("viewer.noGenerationDataFile", "No generation data found for this file."), i.appendChild(o); + o.style.cssText = "padding: 10px 12px; border-radius: 10px; border: 1px solid rgba(255,255,255,0.12); background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.72);", o.textContent = w("viewer.noGenerationDataFile", "No generation data found for this file."), i.appendChild(o); try { let e = n?.metadata_raw; if (e != null) { let t = document.createElement("details"); t.style.cssText = "border: 1px solid rgba(255,255,255,0.10); border-radius: 10px; background: rgba(255,255,255,0.04); overflow: hidden;"; let n = document.createElement("summary"); - n.textContent = C("msg.rawMetadata", "Raw metadata"), n.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;"; + n.textContent = w("msg.rawMetadata", "Raw metadata"), n.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;"; let r = document.createElement("pre"); r.style.cssText = "margin:0; padding: 10px 12px; max-height: 280px; overflow:auto; font-size: 11px; line-height: 1.35; color: rgba(255,255,255,0.86);"; let a = ""; @@ -10668,7 +10668,7 @@ function Zr() { function et() { let e = s.assets[s.currentIndex]; if (!e) return; - let t = O(e); + let t = v(e); if (t) { if (s.mode === $.SINGLE) { try { @@ -10684,7 +10684,7 @@ function Zr() { state: s, currentAsset: e, viewUrl: t, - buildAssetViewURL: O, + buildAssetViewURL: v, createCompareMediaElement: j, destroyMediaProcessorsIn: Fn }) : s.mode === $.SIDE_BY_SIDE && Y() && Gr?.renderSideBySideView?.({ @@ -10692,11 +10692,11 @@ function Zr() { state: s, currentAsset: e, viewUrl: t, - buildAssetViewURL: O, + buildAssetViewURL: v, createMediaElement: A, destroyMediaProcessorsIn: Fn }); - g(), v(); + g(), y(); } else { try { Fn(B); @@ -10713,12 +10713,12 @@ function Zr() { } } let { preloadAdjacentAssets: tt, preloadImageForAsset: nt, trackPreloadRef: rt } = pr({ - buildAssetViewURL: O, + buildAssetViewURL: v, IMAGE_PRELOAD_EXTENSIONS: c, state: s }), { destroyPlayerBar: at, syncPlayerBar: ot } = Sr({ state: s, - APP_CONFIG: T, + APP_CONFIG: E, VIEWER_MODES: $, overlay: e, navBar: Ce, @@ -10736,7 +10736,7 @@ function Zr() { scheduleOverlayRedraw: J, viewerInfoCacheGet: Me, viewerInfoCacheSet: Ne - }), st = () => ot(), ct = T.VIEWER_MAX_PROC_PIXELS ?? 12e6, lt = () => ({ + }), st = () => ot(), ct = E.VIEWER_MAX_PROC_PIXELS ?? 12e6, lt = () => ({ exposureEV: Number(s.exposureEV) || 0, gamma: Math.max(.1, Math.min(3, Number(s.gamma) || 1)), channel: s.channel || "rgb", @@ -10768,13 +10768,13 @@ function Zr() { } catch { return !0; } - }, ft = T.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, pt = T.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15; + }, ft = E.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, pt = E.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15; try { d = fr({ overlay: e, state: s, mediaTransform: f, - updateMediaNaturalSize: D, + updateMediaNaturalSize: k, clampPanToBounds: h, applyTransform: g, scheduleOverlayRedraw: J, @@ -10783,7 +10783,7 @@ function Zr() { tonemap: null, maxProcPixels: ct, maxProcPixelsVideo: ft, - disableWebGL: !!T.VIEWER_DISABLE_WEBGL_VIDEO, + disableWebGL: !!E.VIEWER_DISABLE_WEBGL_VIDEO, videoGradeThrottleFps: pt, safeAddListener: Z, safeCall: X @@ -10852,7 +10852,7 @@ function Zr() { }); }, yt = (e, t, n, { offsetX: r = 16, offsetY: i = 16 } = {}) => { try { - let a = S(); + let a = C(); if (!a) return; let o = fe.getBoundingClientRect(), s = (Number(t) || 0) - o.left, c = (Number(n) || 0) - o.top, l = Number(e.offsetWidth) || 0, u = Number(e.offsetHeight) || 0, d = s + r, f = c + i; d = Math.max(10, Math.min(d, a.width - l - 10)), f = Math.max(10, Math.min(f, a.height - u - 10)), e.style.left = `${Math.round(d)}px`, e.style.top = `${Math.round(f)}px`; @@ -10864,9 +10864,9 @@ function Zr() { content: fe, state: s, VIEWER_MODES: $, - getPrimaryMedia: y, - getMediaNaturalSize: x, - getViewportRect: S, + getPrimaryMedia: b, + getMediaNaturalSize: S, + getViewportRect: C, positionOverlayBox: yt, probeTooltip: me, loupeWrap: he, @@ -10874,7 +10874,7 @@ function Zr() { state: s, loupeCanvas: ge, loupeWrap: he, - getMediaNaturalSize: x, + getMediaNaturalSize: S, positionOverlayBox: yt }).redraw, lifecycle: t @@ -10916,7 +10916,7 @@ function Zr() { singleView: B, state: s, VIEWER_MODES: $, - computeOneToOneZoom: E, + computeOneToOneZoom: D, setZoom: _, scheduleOverlayRedraw: J, scheduleApplyGrade: ht, @@ -10927,7 +10927,7 @@ function Zr() { renderBadges: Ye, updateAssetRating: n, safeDispatchCustomEvent: ce, - ASSET_RATING_CHANGED_EVENT: k, + ASSET_RATING_CHANGED_EVENT: O, probeTooltip: me, loupeWrap: he, renderGenInfoPanel: Ke, @@ -11027,7 +11027,7 @@ function Zr() { } }; try { - e._mjrBadgeSyncBound ||= (a.push(Z(window, k, (e) => { + e._mjrBadgeSyncBound ||= (a.push(Z(window, O, (e) => { try { let t = e?.detail?.assetId, n = e?.detail?.rating; if (t == null) return; @@ -11041,7 +11041,7 @@ function Zr() { } catch (e) { console.debug?.(e); } - }, { passive: !0 })), a.push(Z(window, w, (e) => { + }, { passive: !0 })), a.push(Z(window, T, (e) => { try { let t = e?.detail?.assetId, n = e?.detail?.tags; if (t == null) return; @@ -11062,7 +11062,7 @@ function Zr() { function Tt() { try { let e = s.assets?.[s.currentIndex]; - e?.id && ce(b, { assetId: String(e.id) }, { warnPrefix: "[ViewerRuntime]" }); + e?.id && ce(x, { assetId: String(e.id) }, { warnPrefix: "[ViewerRuntime]" }); } catch (e) { console.debug?.(e); } @@ -11391,7 +11391,7 @@ function Zr() { En({ overlayEl: e, getCurrentAsset: () => s.assets[s.currentIndex], - getCurrentViewUrl: (e) => O(e), + getCurrentViewUrl: (e) => v(e), onAssetChanged: () => { try { Ye(); diff --git a/dist/chunks/ViewerPortal-uNjS7OxV.js b/dist/chunks/ViewerPortal-BStxU0ID.js similarity index 97% rename from dist/chunks/ViewerPortal-uNjS7OxV.js rename to dist/chunks/ViewerPortal-BStxU0ID.js index c8630aa5..85eee5b1 100644 --- a/dist/chunks/ViewerPortal-uNjS7OxV.js +++ b/dist/chunks/ViewerPortal-BStxU0ID.js @@ -1,9 +1,9 @@ -import { a as e, i as t } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { r as n } from "./events-DxfljH4A.js"; -import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-DI9upE3v.js"; -import { i as d, r as f } from "./floatingViewerManager-DKOeP6-T.js"; +import { a as e, i as t } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { r as n } from "./events-BRfpU-6M.js"; +import { a as r, c as i, i as a, l as o, o as s, s as c, t as l, u } from "./Viewer-geJFRz8N.js"; +import { i as d, r as f } from "./floatingViewerManager-Gv7MTmpu.js"; import { B as p, C as m, D as h, E as g, G as _, J as v, K as y, L as b, N as x, O as S, T as C, U as w, V as T, dt as E, ft as D, j as O, k, lt as A, rt as j, ut as M, w as N, z as P } from "./mjr-primevue-BRqtdXzb.js"; -import { t as F } from "./TagsEditor-7DAMS3OV.js"; +import { t as F } from "./TagsEditor-CPV0rYyM.js"; // ui/vue/components/viewer/FloatingViewerHost.vue var I = /* @__PURE__ */ x({ __name: "FloatingViewerHost", diff --git a/dist/chunks/events-DxfljH4A.js b/dist/chunks/events-BRfpU-6M.js similarity index 95% rename from dist/chunks/events-DxfljH4A.js rename to dist/chunks/events-BRfpU-6M.js index b25e5a0a..fd1f95f0 100644 --- a/dist/chunks/events-DxfljH4A.js +++ b/dist/chunks/events-BRfpU-6M.js @@ -580,7 +580,7 @@ async function Ae({ app: e = null, timeoutMs: t = 4e3, intervalMs: n = de, warnO return null; } // ui/app/hostAdapter.ts -var N = null, P = Symbol.for("mjr.host.queuePromptBinding"), je = [ +var N = null, je = [ "selectionchange", "selection-change", "node-selected", @@ -626,59 +626,82 @@ function Ie(e, t, n) { return !1; } } -function Le(e, t) { +function Le(e) { try { - return Te(e || N || j(), t); + return Te(N || j(), e); } catch { return !1; } } -function Re(e, t) { +function Re(e = null) { try { - return Se(e || N || j(), t); + let t = M(e || N || j()), n = typeof t?.getSidebarTabs == "function" ? t.getSidebarTabs() : []; + return Array.isArray(n) ? n.filter(Boolean) : []; } catch { - return !1; + return []; } } -function ze(e, t) { +function ze(e, t = null) { try { - return Ee(e || N || j(), t); + let n = M(t || N || j()); + return !e || typeof n?.unregisterSidebarTab != "function" ? !1 : (n.unregisterSidebarTab(e), !0); } catch { return !1; } } function Be(e, t) { try { - return Ce(e || N || j(), t); + return Te(e || N || j(), t); } catch { return !1; } } function Ve(e, t) { + try { + return Se(e || N || j(), t); + } catch { + return !1; + } +} +function He(e, t) { + try { + return Ee(e || N || j(), t); + } catch { + return !1; + } +} +function Ue(e, t) { + try { + return Ce(e || N || j(), t); + } catch { + return !1; + } +} +function We(e, t) { try { return we(e || N || j(), t); } catch { return !1; } } -function He() { +function Ge() { return N || j() || null; } -function F(e = null) { +function P(e = null) { try { return A(e || N || j()) || null; } catch { return null; } } -async function Ue(e = {}) { +async function Ke(e = {}) { try { return await Ae(e); } catch { return null; } } -async function We(e, t = null, n = null) { +async function qe(e, t = null, n = null) { try { return await me(e, t, n || N || j()); } catch { @@ -688,7 +711,7 @@ async function We(e, t = null, n = null) { }); } } -function Ge(e, t, n) { +function Je(e, t, n) { if (!e || typeof e.addEventListener != "function") return null; try { e.addEventListener(t, n); @@ -703,7 +726,7 @@ function Ge(e, t, n) { } }; } -function Ke(e, t = {}) { +function Ye(e, t = {}) { if (typeof e != "function") return null; let n = t.app || N || j(), r = n?.canvas; if (!r) return null; @@ -719,7 +742,7 @@ function Ke(e, t = {}) { } }; for (let e of o) for (let t of je) { - let n = Ge(e, t, s); + let n = Je(e, t, s); n && (i.push(n), a = !0); } if (!a) { @@ -739,7 +762,7 @@ function Ke(e, t = {}) { }); } if (t.includePointerFallback !== !1 && r.canvas?.addEventListener) { - let e = Ge(r.canvas, "pointerup", s); + let e = Je(r.canvas, "pointerup", s); e && i.push(e); } let c = !1; @@ -750,34 +773,8 @@ function Ke(e, t = {}) { } }; } -function qe(e = {}) { - let t = e.api || F(e.app || N || j()), n = e.owner || null, r = typeof e.createWrapper == "function" ? e.createWrapper : null; - if (!t || typeof t.queuePrompt != "function" || !r) return null; - let i = t.queuePrompt?.[P] || null; - if (i?.owner === n) return i; - if (i?.owner && i.owner !== n) return null; - let a = t.queuePrompt, o = r(a, t); - if (typeof o != "function") return null; - let s = { - api: t, - owner: n, - originalQueuePrompt: a, - wrappedQueuePrompt: o, - restore: () => { - try { - return (t.queuePrompt?.[P] || null)?.owner === n && (t.queuePrompt = a, !0); - } catch (e) { - return console.debug?.(e), !1; - } - } - }; - return Object.defineProperty(o, P, { - configurable: !0, - value: s - }), t.queuePrompt = o, s; -} -async function Je(e = null) { - let t = e || N || j(), n = (t?.api && typeof t.api.interrupt == "function" ? t.api : null) || F(t); +async function Xe(e = null) { + let t = e || N || j(), n = (t?.api && typeof t.api.interrupt == "function" ? t.api : null) || P(t); if (n && typeof n.interrupt == "function") return await n.interrupt(), !0; if (n && typeof n.fetchApi == "function") { let e = await n.fetchApi("/interrupt", { method: "POST" }); @@ -791,20 +788,20 @@ async function Je(e = null) { if (!r.ok) throw Error(`POST /interrupt failed (${r.status})`); return !1; } -function I(e = null) { +function F(e = null) { return (e || N || j())?.canvas || null; } -function Ye(e = null) { - return I(e); +function Ze(e = null) { + return F(e); } -function L(e = null) { +function I(e = null) { let t = e || N || j(); return t?.graph || t?.canvas?.graph || null; } -function Xe(e = null) { - return L(e); +function Qe(e = null) { + return I(e); } -function Ze(e) { +function $e(e) { if (typeof e != "object" || !e) return e; try { return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); @@ -812,23 +809,23 @@ function Ze(e) { return e; } } -function R(e, t) { +function L(e, t) { n(e, ({ node: e }) => t(e)); } -function Qe(e) { +function et(e) { let t = []; - return R(e, (e) => { + return L(e, (e) => { for (let n of e?.widgets ?? []) t.push({ widget: n, - value: Ze(n?.value) + value: $e(n?.value) }); }), t; } -function $e(e, t) { +function tt(e, t) { for (let e of Array.isArray(t) ? t : []) { let t = e?.widget; if (!t || typeof t != "object") continue; - let n = Ze(e?.value); + let n = $e(e?.value); try { t.value = n; } catch (e) { @@ -841,9 +838,9 @@ function $e(e, t) { console.debug?.(e); } } - z(e, { change: !1 }); + R(e, { change: !1 }); } -function et(e, t) { +function nt(e, t) { let n = [ e?.clientId, e?.clientID, @@ -858,46 +855,46 @@ function et(e, t) { } return ""; } -function tt(e = null) { - let t = I(e); +function rt(e = null) { + let t = F(e); return t?.selected_nodes ?? t?.selectedNodes ?? null; } -function nt(e = null) { - let t = tt(e); +function it(e = null) { + let t = rt(e); return t ? Array.isArray(t) ? t.filter(Boolean) : t instanceof Map ? Array.from(t.values()).filter(Boolean) : typeof t == "object" ? Object.values(t).filter(Boolean) : [] : []; } -function rt(e = null) { - return nt(e).map((e) => String(e?.id ?? "").trim()).filter(Boolean); +function at(e = null) { + return it(e).map((e) => String(e?.id ?? "").trim()).filter(Boolean); } -function it(e = null) { - return nt(e)[0] || null; +function ot(e = null) { + return it(e)[0] || null; } -function z(e = null, t = {}) { +function R(e = null, t = {}) { try { - let n = e || N || j(), r = I(n), i = L(n); + let n = e || N || j(), r = F(n), i = I(n); return r?.setDirty?.(!0, !0), t.draw !== !1 && r?.draw?.(!0, !0), i?.setDirtyCanvas?.(!0, !0), t.change !== !1 && i?.change?.(), !!(r || i); } catch (e) { return console.debug?.(e), !1; } } -function at(e, t = null, n = {}) { +function st(e, t = null, n = {}) { try { - let r = t || N || j(), i = L(r), a = e?.graph ?? null; - return a && a !== i && (a.setDirtyCanvas?.(!0, !0), n.change !== !1 && a.change?.()), z(r, n); + let r = t || N || j(), i = I(r), a = e?.graph ?? null; + return a && a !== i && (a.setDirtyCanvas?.(!0, !0), n.change !== !1 && a.change?.()), R(r, n); } catch (e) { return console.debug?.(e), !1; } } -function ot(e, t = null) { +function ct(e, t = null) { if (!e) return !1; try { - let n = t || N || j(), r = L(n); - return !r || typeof r.add != "function" ? !1 : (r.add(e), at(e, n), !0); + let n = t || N || j(), r = I(n); + return !r || typeof r.add != "function" ? !1 : (r.add(e), st(e, n), !0); } catch (e) { return console.debug?.(e), !1; } } -function st(e = null) { +function lt(e = null) { try { let t = e || N || j(), n = globalThis; return t?.LiteGraph || t?.ui?.LiteGraph || t?.canvas?.LiteGraph || n?.LiteGraph || n?.window?.LiteGraph || null; @@ -905,17 +902,17 @@ function st(e = null) { return console.debug?.(e), null; } } -function ct(e, t = null) { +function ut(e, t = null) { let n = String(e || "").trim(); if (!n) return null; try { - let e = st(t); + let e = lt(t); return !e || typeof e.createNode != "function" ? null : e.createNode(n) || null; } catch (e) { return console.debug?.(e), null; } } -function lt(e, t = null) { +function dt(e, t = null) { let n = t || N || j(); if (!e || typeof e != "object") return !1; try { @@ -927,7 +924,7 @@ function lt(e, t = null) { n?.extensionManager?.workflow?.importWorkflow ]; for (let r of t) if (typeof r == "function") try { - return r.call(n?.workflowManager || n?.extensionManager?.workflow || n, e), z(n, { + return r.call(n?.workflowManager || n?.extensionManager?.workflow || n, e), R(n, { draw: !1, change: !1 }), !0; @@ -935,8 +932,8 @@ function lt(e, t = null) { console.debug?.(e); } if (typeof n?.loadGraphData == "function") return n.loadGraphData(e), !0; - let r = L(n); - if (typeof r?.configure == "function") return r.configure(e), z(n, { + let r = I(n); + if (typeof r?.configure == "function") return r.configure(e), R(n, { draw: !1, change: !1 }), !0; @@ -945,14 +942,14 @@ function lt(e, t = null) { } return !1; } -function ut(e, t = null) { +function ft(e, t = null) { let n = t || N || j(); if (!e || typeof e != "object") return { ok: !1, mode: "none" }; try { - if (lt(e, n)) return { + if (dt(e, n)) return { ok: !0, mode: "replace" }; @@ -964,14 +961,14 @@ function ut(e, t = null) { mode: "none" }; } -function dt(t = null) { +function pt(t = null) { try { let n = t || N || j(), r = e(n); if (typeof r?.serialize == "function") { let e = r.serialize(); if (e && typeof e == "object") return e; } - let i = L(n); + let i = I(n); if (i !== r && typeof i?.serialize == "function") { let e = i.serialize(); if (e && typeof e == "object") return e; @@ -986,7 +983,7 @@ function dt(t = null) { } return null; } -function ft(e = null) { +function mt(e = null) { try { let t = e || N || j(); if (!t) return null; @@ -1018,29 +1015,29 @@ function ft(e = null) { } return null; } -async function pt(t = {}) { +async function ht(t = {}) { let n = t.app || N || j(); if (!n) throw Error("ComfyUI app not available"); - let r = F(n), i = !!(r && typeof r.queuePrompt == "function" || r && typeof r.fetchApi == "function"); + let r = P(n), i = !!(r && typeof r.queuePrompt == "function" || r && typeof r.fetchApi == "function"); if ((t.forceNativeQueue || !i) && typeof n.queuePrompt == "function") return await n.queuePrompt(0), !0; let a = e(n), o = null; try { - o = Qe(a), R(a, (e) => { + o = et(a), L(a, (e) => { for (let t of e?.widgets ?? []) t.beforeQueued?.({ isPartialExecution: !1 }); }); let e = await (typeof t.resolvePromptData == "function" ? t.resolvePromptData : (e) => e?.graphToPrompt?.())(n); if (!e?.output) throw Error("graphToPrompt returned empty output"); let i = typeof t.enrichPromptData == "function" ? t.enrichPromptData(e) : e; - if (r && typeof r.queuePrompt == "function") return await r.queuePrompt(0, i), R(a, (e) => { + if (r && typeof r.queuePrompt == "function") return await r.queuePrompt(0, i), L(a, (e) => { for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), z(n, { change: !1 }), !0; + }), R(n, { change: !1 }), !0; let s = (typeof t.buildPromptRequestBody == "function" ? t.buildPromptRequestBody : (e, t) => { let n = { prompt: e?.output, extra_data: e?.extra_data || {} }; return t.clientId && (n.client_id = t.clientId), n; - })(e, { clientId: et(r, n) }); + })(e, { clientId: nt(r, n) }); if (r && typeof r.fetchApi == "function") { let e = await r.fetchApi("/prompt", { method: "POST", @@ -1048,9 +1045,9 @@ async function pt(t = {}) { body: JSON.stringify(s) }); if (!e?.ok) throw Error(`POST /prompt failed (${e?.status})`); - return R(a, (e) => { + return L(a, (e) => { for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), z(n, { change: !1 }), !0; + }), R(n, { change: !1 }), !0; } let c = await fetch("/prompt", { method: "POST", @@ -1059,17 +1056,17 @@ async function pt(t = {}) { body: JSON.stringify(s) }); if (!c.ok) throw Error(`POST /prompt failed (${c.status})`); - return R(a, (e) => { + return L(a, (e) => { for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), z(n, { change: !1 }), !1; + }), R(n, { change: !1 }), !1; } catch (e) { - throw $e(n, o), e; + throw tt(n, o), e; } } -function mt(e, t = {}) { +function gt(e, t = {}) { if (!e) return !1; try { - let n = I(t.app || N || j()); + let n = F(t.app || N || j()); if (!n) return !1; if (t.select !== !1 && n.selectNode?.(e, !1), typeof n.centerOnNode == "function") n.centerOnNode(e); else if (e.pos && n.ds) { @@ -1081,12 +1078,12 @@ function mt(e, t = {}) { return console.debug?.(e), !1; } } -function ht(n, r = null) { +function _t(n, r = null) { let i = String(n || "").trim(); if (!i) return !1; try { let n = r || N || j(), a = t(e(n), i); - return a ? mt(a, { + return a ? gt(a, { app: n, select: !1, focusCanvas: !1 @@ -1095,7 +1092,7 @@ function ht(n, r = null) { return console.debug?.(e), !1; } } -function gt() { +function vt() { let e = N || j() || null, t = e?.canvas || null, n = t?.ds || null, r = t?.canvas || t?.el || null; if (!t || !n || !r) return null; let i = Number(n?.scale), a = Number(r?.width || r?.clientWidth || 0), o = Number(r?.height || r?.clientHeight || 0); @@ -1108,10 +1105,10 @@ function gt() { height: o }; } -function _t(e, t, n) { +function yt(e, t, n) { return Array.isArray(e?.offset) ? (e.offset[0] = t, e.offset[1] = n, !0) : e?.offset && typeof e.offset == "object" ? (e.offset.x = t, e.offset.y = n, !0) : !1; } -function vt(e, t) { +function bt(e, t) { try { t?.setDirty?.(!0, !0); } catch (e) { @@ -1123,21 +1120,21 @@ function vt(e, t) { console.debug?.(e); } } -function yt(e) { +function xt(e) { try { - let t = gt(); + let t = vt(); if (!t || !e) return !1; let n = Number(e.x), r = Number(e.y); if (!Number.isFinite(n) || !Number.isFinite(r)) return !1; let i = Math.max(1, Number(globalThis?.devicePixelRatio ?? globalThis?.window?.devicePixelRatio) || 1), a = -n + t.width * .5 / (t.scale * i), o = -r + t.height * .5 / (t.scale * i); - return !Number.isFinite(a) || !Number.isFinite(o) || !_t(t.ds, a, o) ? !1 : (vt(t.app, t.graphCanvas), !0); + return !Number.isFinite(a) || !Number.isFinite(o) || !yt(t.ds, a, o) ? !1 : (bt(t.app, t.graphCanvas), !0); } catch (e) { return console.debug?.(e), !1; } } -function bt() { +function St() { try { - let e = gt(); + let e = vt(); if (!e) return null; let t = e.ds?.offset, n = Number(Array.isArray(t) ? t[0] : t?.x), r = Number(Array.isArray(t) ? t[1] : t?.y); return !Number.isFinite(n) || !Number.isFinite(r) ? null : { @@ -1151,35 +1148,35 @@ function bt() { } } // ui/app/settings/SettingsStore.ts -var B = /* @__PURE__ */ new Map(), V = !1, H = null; -function U() { +var z = /* @__PURE__ */ new Map(), B = !1, V = null; +function H() { try { return typeof window > "u" ? null : window.localStorage || null; } catch { return null; } } -function W(e, t, n) { - let r = B.get(String(e || "")); +function U(e, t, n) { + let r = z.get(String(e || "")); if (r && r.size) for (let i of Array.from(r)) try { i(t, n, e); } catch (e) { console.debug?.(e); } } -function xt() { - if (!V) try { - H = (e) => { +function Ct() { + if (!B) try { + V = (e) => { let t = String(e?.key || ""); - t && W(t, e?.newValue ?? null, e?.oldValue ?? null); - }, window.addEventListener("storage", H), V = !0; + t && U(t, e?.newValue ?? null, e?.oldValue ?? null); + }, window.addEventListener("storage", V), B = !0; } catch (e) { console.debug?.(e); } } -var G = { +var W = { get(e) { - let t = U(); + let t = H(); if (!t) return null; try { return t.getItem(String(e || "")); @@ -1190,13 +1187,13 @@ var G = { set(e, t) { let n = String(e || ""); if (!n) return !1; - let r = U(); + let r = H(); if (!r) return !1; - let i = G.get(n); + let i = W.get(n); try { - if (t == null) return r.removeItem(n), W(n, null, i), !0; + if (t == null) return r.removeItem(n), U(n, null, i), !0; let e = String(t); - return r.setItem(n, e), W(n, e, i), !0; + return r.setItem(n, e), U(n, e, i), !0; } catch { return !1; } @@ -1204,19 +1201,19 @@ var G = { subscribe(e, t) { let n = String(e || ""); if (!n || typeof t != "function") return () => {}; - xt(); - let r = B.get(n); - return r || (r = /* @__PURE__ */ new Set(), B.set(n, r)), r.add(t), () => { + Ct(); + let r = z.get(n); + return r || (r = /* @__PURE__ */ new Set(), z.set(n, r)), r.add(t), () => { try { - let e = B.get(n); - e?.delete(t), e && !e.size && B.delete(n); + let e = z.get(n); + e?.delete(t), e && !e.size && z.delete(n); } catch (e) { console.debug?.(e); } }; }, getAll() { - let e = {}, t = U(); + let e = {}, t = H(); if (!t) return e; try { let n = Number(t.length || 0) || 0; @@ -1231,17 +1228,17 @@ var G = { }, dispose() { try { - V && H && typeof window < "u" && window.removeEventListener("storage", H); + B && V && typeof window < "u" && window.removeEventListener("storage", V); } catch (e) { console.debug?.(e); } - V = !1, H = null, B.clear(); + B = !1, V = null, z.clear(); } -}, K = "en-US", q = K, St = /* @__PURE__ */ new Set(), Ct = ["mjr_lang", "majoor.lang"], wt = "mjr_lang_follow_comfy", Tt = 500, J = /* @__PURE__ */ new Set(), Y = null, Et = /* @__PURE__ */ new Set([ +}, G = "en-US", K = G, wt = /* @__PURE__ */ new Set(), Tt = ["mjr_lang", "majoor.lang"], Et = "mjr_lang_follow_comfy", Dt = 500, q = /* @__PURE__ */ new Set(), J = null, Ot = /* @__PURE__ */ new Set([ "ar-SA", "fa-IR", "he-IL" -]), Dt = { +]), kt = { fr: "fr-FR", "fr-fr": "fr-FR", fr_FR: "fr-FR", @@ -1347,7 +1344,7 @@ var G = { "el-gr": "el-GR", el_gr: "el-GR", elgr: "el-GR" -}, X = { +}, Y = { "en-US": { "cat.grid": "Grid", "cat.cards": "Cards", @@ -2847,7 +2844,7 @@ var G = { "msg.newVersionDetail": "La version {latest} est disponible. Version installée : {current}.", "tooltip.starGithub": "Ouvrir GitHub et mettre une etoile" } -}, Ot = Object.freeze({ +}, At = Object.freeze({ "en-US": "English", "fr-FR": "Français", "zh-CN": "Chinese (Simplified)", @@ -2897,43 +2894,43 @@ var G = { "ro-RO", "el-GR" ].forEach((e) => { - X[e] || (X[e] = {}); + Y[e] || (Y[e] = {}); }); -var Z = !1, kt = null; -function At(e) { - Z || (Z = !0, Object.entries(e || {}).forEach(([e, t]) => { - X[e] = { - ...X[e] || {}, +var X = !1, jt = null; +function Mt(e) { + X || (X = !0, Object.entries(e || {}).forEach(([e, t]) => { + Y[e] = { + ...Y[e] || {}, ...t || {} }; - }), jt()); + }), Z()); } -function jt() { - let e = X["en-US"] || {}; - Object.keys(X).forEach((t) => { - t !== "en-US" && (X[t] = { +function Z() { + let e = Y["en-US"] || {}; + Object.keys(Y).forEach((t) => { + t !== "en-US" && (Y[t] = { ...e, - ...X[t] || {} + ...Y[t] || {} }); }); } -function Mt() { - return Z ? Promise.resolve() : (kt ||= import("./i18n.generated-DqByySOH.js").then(({ GENERATED_TRANSLATIONS: e }) => { - At(e); - }).catch((e) => { - console.warn("[Majoor i18n] Failed to load generated translations:", e), jt(); - }), kt); -} -jt(); -function Q(e) { - if (!e) return K; - let t = String(e || "").trim(), n = t.toLowerCase(); - return Dt[n] ? Dt[n] : X[t] ? t : K; -} function Nt() { + return X ? Promise.resolve() : (jt ||= import("./i18n.generated-DqByySOH.js").then(({ GENERATED_TRANSLATIONS: e }) => { + Mt(e); + }).catch((e) => { + console.warn("[Majoor i18n] Failed to load generated translations:", e), Z(); + }), jt); +} +Z(); +function Q(e) { + if (!e) return G; + let t = String(e || "").trim(), n = t.toLowerCase(); + return kt[n] ? kt[n] : Y[t] ? t : G; +} +function Pt() { try { - for (let e of Ct) { - let t = String(G.get(e) || "").trim(); + for (let e of Tt) { + let t = String(W.get(e) || "").trim(); if (t) return t; } } catch (e) { @@ -2941,16 +2938,16 @@ function Nt() { } return ""; } -function Pt(e) { +function Ft(e) { try { - G.set(Ct[0], e), G.set(Ct[1], e); + W.set(Tt[0], e), W.set(Tt[1], e); } catch (e) { console.debug?.(e); } } -function Ft() { +function It() { try { - let e = String(G.get(wt) || "").trim().toLowerCase(); + let e = String(W.get(Et) || "").trim().toLowerCase(); return !e || ![ "0", "false", @@ -2962,14 +2959,14 @@ function Ft() { } return !0; } -function It(e) { +function Lt(e) { try { - G.set(wt, e ? "1" : "0"); + W.set(Et, e ? "1" : "0"); } catch (e) { console.debug?.(e); } } -function Lt(e) { +function Rt(e) { let t = [], n = (e) => { if (typeof e != "string") return; let n = e.trim(); @@ -2984,7 +2981,7 @@ function Lt(e) { ]) n(Fe(e, t)); return n(e?.ui?.locale), n(e?.locale), n(e?.ui?.i18n?.locale), t; } -function Rt() { +function zt() { let e = [], t = (t) => { if (typeof t != "string") return; let n = t.trim(); @@ -3006,84 +3003,84 @@ function Rt() { } return e; } -function zt() { +function Bt() { try { if (typeof document < "u" && document.documentElement) { - let e = Et.has(q); + let e = Ot.has(K); document.documentElement.dir = e ? "rtl" : "ltr"; } } catch (e) { console.debug?.(e); } } -var Bt = (e) => { +var Vt = (e) => { try { - let t = Ft(), n = Nt(), r = Q(n), i = () => { - let t = Lt(e); + let t = It(), n = Pt(), r = Q(n), i = () => { + let t = Rt(e); for (let e of t) { let t = Q(e); - if (X[t]) return $(t), !0; + if (Y[t]) return $(t), !0; } return !1; }; if (t) { if (i()) return; - if (n && X[r]) { + if (n && Y[r]) { $(r); return; } - if (X[q]) return; - $(K); + if (Y[K]) return; + $(G); return; } - if (n && X[r]) { + if (n && Y[r]) { $(r); return; } if (i()) return; - let a = Rt(); + let a = zt(); for (let e of a) { let t = Q(e); - if (X[t]) { + if (Y[t]) { $(t); return; } } - $(K); + $(G); } catch (e) { - console.warn("[Majoor i18n] Failed to detect language:", e), $(K); + console.warn("[Majoor i18n] Failed to detect language:", e), $(G); } }, $ = (e) => { - X[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${K}`), e = K), q !== e && (q = e, Pt(e), zt(), e !== K && !Z && Mt().then(() => { - Array.from(St).forEach((t) => { + Y[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${G}`), e = G), K !== e && (K = e, Ft(e), Bt(), e !== G && !X && Nt().then(() => { + Array.from(wt).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } }); - }), Array.from(St).forEach((t) => { + }), Array.from(wt).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } })); -}, Vt = (e) => { - It(!!e); }, Ht = (e) => { + Lt(!!e); +}, Ut = (e) => { try { - Y &&= (clearInterval(Y), null), typeof window < "u" && window.__MJR_COMFY_LANG_SYNC_TIMER__ && (clearInterval(window.__MJR_COMFY_LANG_SYNC_TIMER__), window.__MJR_COMFY_LANG_SYNC_TIMER__ = null); + J &&= (clearInterval(J), null), typeof window < "u" && window.__MJR_COMFY_LANG_SYNC_TIMER__ && (clearInterval(window.__MJR_COMFY_LANG_SYNC_TIMER__), window.__MJR_COMFY_LANG_SYNC_TIMER__ = null); } catch (e) { console.debug?.(e); } - Y = setInterval(() => { + J = setInterval(() => { try { - if (!Ft()) return; - let t = Lt(e); + if (!It()) return; + let t = Rt(e); for (let e of t) { let t = Q(e); - if (X[t] && t !== q) { + if (Y[t] && t !== K) { $(t); return; } @@ -3093,35 +3090,35 @@ var Bt = (e) => { } }, 2e3); try { - typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = Y); + typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = J); } catch (e) { console.debug?.(e); } -}, Ut = () => q, Wt = () => Object.keys(X).map((e) => ({ +}, Wt = () => K, Gt = () => Object.keys(Y).map((e) => ({ code: e, - name: Ot[e] || e -})), Gt = (e, t, n) => { - let r = X[q] || X[K], i = X[K], a = r[e] || i[e]; + name: At[e] || e +})), Kt = (e, t, n) => { + let r = Y[K] || Y[G], i = Y[G], a = r[e] || i[e]; if (!a) { - let n = `${q}:${String(e || "")}`; - if (!J.has(n)) { - if (J.size >= Tt) { - let e = Math.floor(Tt * .2), t = J.values(); + let n = `${K}:${String(e || "")}`; + if (!q.has(n)) { + if (q.size >= Dt) { + let e = Math.floor(Dt * .2), t = q.values(); for (let n = 0; n < e; n++) { let e = t.next().value; - e && J.delete(e); + e && q.delete(e); } } - J.add(n); + q.add(n); try { - console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${q}"`); + console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${K}"`); } catch (e) { console.debug?.(e); } try { typeof window < "u" && typeof window.dispatchEvent == "function" && window.dispatchEvent(new CustomEvent("mjr-i18n-missing-key", { detail: { key: String(e || ""), - locale: q + locale: K } })); } catch (e) { console.debug?.(e); @@ -3133,7 +3130,7 @@ var Bt = (e) => { return o && typeof o == "object" && Object.entries(o).forEach(([e, t]) => { a = a.replaceAll(`{${e}}`, String(t)); }), a; -}, Kt = Object.freeze({ +}, qt = Object.freeze({ DEBUG_SAFE_CALL: !1, DEBUG_SAFE_LISTENERS: !1, DEBUG_VIEWER: !1, @@ -3223,11 +3220,11 @@ var Bt = (e) => { DELETE_CONFIRMATION: !0, DEBUG_VERBOSE_ERRORS: !1, SIDEBAR_ASSET_BADGE_ENABLED: !0 -}), qt = { ...Kt }, Jt = "mjr:asset-rating-changed", Yt = "mjr:asset-tags-changed", Xt = "mjr:viewer-info-refreshed", Zt = "mjr:viewer-active-asset-changed", Qt = Object.freeze({ - ASSET_RATING_CHANGED: Jt, - ASSET_TAGS_CHANGED: Yt, - VIEWER_INFO_REFRESHED: Xt, - VIEWER_ACTIVE_ASSET_CHANGED: Zt, +}), Jt = { ...qt }, Yt = "mjr:asset-rating-changed", Xt = "mjr:asset-tags-changed", Zt = "mjr:viewer-info-refreshed", Qt = "mjr:viewer-active-asset-changed", $t = Object.freeze({ + ASSET_RATING_CHANGED: Yt, + ASSET_TAGS_CHANGED: Xt, + VIEWER_INFO_REFRESHED: Zt, + VIEWER_ACTIVE_ASSET_CHANGED: Qt, SCAN_COMPLETE: "mjr-scan-complete", CORE_EXECUTION_ASSETS_READY: "mjr-core-execution-assets-ready", ENRICHMENT_STATUS: "mjr-enrichment-status", @@ -3262,4 +3259,4 @@ var Bt = (e) => { OPEN_NODE_CONTEXT: "mjr:open-node-context", OPEN_MESSAGE_HISTORY: "mjr:open-message-history" }); -export { Ae as $, F as A, pt as B, mt as C, u as Ct, Pe as D, Ye as E, ut as F, dt as G, Be as H, Je as I, Ue as J, Ie as K, ft as L, rt as M, Fe as N, Xe as O, lt as P, fe as Q, at as R, We as S, l as St, bt as T, Ve as U, z as V, Le as W, A as X, qe as Y, pe as Z, Re as _, S as _t, Xt as a, ue as at, ht as b, o as bt, Ut as c, se as ct, Vt as d, ne as dt, ke as et, $ as f, y as ft, ze as g, le as gt, G as h, ce as ht, Zt as i, ee as it, He as j, Ne as k, Wt as l, b as lt, Gt as m, ie as mt, Yt as n, _ as nt, qt as o, x as ot, Ht as p, v as pt, Me as q, Qt as r, oe as rt, Kt as s, ae as st, Jt as t, g as tt, Bt as u, re as ut, ot as v, C as vt, it as w, ct as x, s as xt, yt as y, d as yt, Ke as z }; +export { pe as $, P as A, Ye as B, gt as C, s as Ct, Pe as D, Ze as E, ft as F, Le as G, R as H, Xe as I, Ie as J, Be as K, mt as L, at as M, Fe as N, Qe as O, dt as P, A as Q, Re as R, qe as S, o as St, St as T, u as Tt, Ue as U, ht as V, We as W, ze as X, Me as Y, Ke as Z, Ve as _, ce as _t, Zt as a, oe as at, _t as b, C as bt, Wt as c, x as ct, Ht as d, b as dt, fe as et, $ as f, re as ft, He as g, ie as gt, W as h, v as ht, Qt as i, _ as it, Ge as j, Ne as k, Gt as l, ae as lt, Kt as m, y as mt, Xt as n, ke as nt, Jt as o, ee as ot, Ut as p, ne as pt, pt as q, $t as r, g as rt, qt as s, ue as st, Yt as t, Ae as tt, Vt as u, se as ut, ct as v, le as vt, ot as w, l as wt, ut as x, d as xt, xt as y, S as yt, st as z }; diff --git a/dist/chunks/floatingViewerManager-DKOeP6-T.js b/dist/chunks/floatingViewerManager-Gv7MTmpu.js similarity index 90% rename from dist/chunks/floatingViewerManager-DKOeP6-T.js rename to dist/chunks/floatingViewerManager-Gv7MTmpu.js index 0c60d21d..3775a913 100644 --- a/dist/chunks/floatingViewerManager-DKOeP6-T.js +++ b/dist/chunks/floatingViewerManager-Gv7MTmpu.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-DQcoOjsY.js"; -import { o, r as s, z as c } from "./events-DxfljH4A.js"; +import { _ as t, d as n, o as r, s as i, t as a } from "./viewerRuntimeHosts-D3Jyfx0-.js"; +import { B as o, o as s, r as c } from "./events-BRfpU-6M.js"; // ui/features/panel/panelRuntimeRefs.ts var l = null; function u(e) { @@ -96,7 +96,7 @@ var te = /* @__PURE__ */ e({ teardownFloatingViewerManager: () => we }), v = null, y = null; async function ne() { - return v || (y ||= import("./FloatingViewer-C99U6UdL.js").then((e) => (v = e.FloatingViewer, v)), y); + return v || (y ||= import("./FloatingViewer-Cccq5sHS.js").then((e) => (v = e.FloatingViewer, v)), y); } var b = null, re = null; async function ie() { @@ -117,10 +117,10 @@ function ae(e) { } var S = null; function C() { - return o.MFV_LIVE_DEFAULT !== !1; + return s.MFV_LIVE_DEFAULT !== !1; } function w() { - return o.MFV_PREVIEW_DEFAULT !== !1; + return s.MFV_PREVIEW_DEFAULT !== !1; } var T = C(), E = w(), D = !1, O = null, k = !1, A = null, j = 0; function oe() { @@ -178,7 +178,7 @@ function se() { } } function F(e) { - typeof window < "u" && window.dispatchEvent(new CustomEvent(s.MFV_VISIBILITY_CHANGED, { detail: { visible: !!e } })); + typeof window < "u" && window.dispatchEvent(new CustomEvent(c.MFV_VISIBILITY_CHANGED, { detail: { visible: !!e } })); } function I(e) { e && (e.setLiveActive(T), e.setPreviewActive(E), e.setNodeStreamActive?.(D)); @@ -299,10 +299,10 @@ function B(e) { } } function V() { - k || typeof window < "u" && (window.addEventListener(s.SELECTION_CHANGED, B), k = !0); + k || typeof window < "u" && (window.addEventListener(c.SELECTION_CHANGED, B), k = !0); } function H() { - typeof window < "u" && window.removeEventListener(s.SELECTION_CHANGED, B), k = !1, N(); + typeof window < "u" && window.removeEventListener(c.SELECTION_CHANGED, B), k = !1, N(); } var U = !1, W = null, G = null, K = ""; function q() { @@ -329,7 +329,7 @@ function de() { } function J() { if (!U) try { - W = c(ue, { includePointerFallback: !0 }), U = typeof W == "function"; + W = o(ue, { includePointerFallback: !0 }), U = typeof W == "function"; } catch (e) { console.debug?.("[MFV] _bindNodeSelectionListener error", e); } @@ -394,7 +394,7 @@ var Y = { }, async upsertWithContent(e) { let t = await M(), n = !!t.isVisible; - (n || o.MFV_LIVE_AUTO_OPEN !== !1) && (t.show(), I(t), V(), ce(t, e), n || F(!0)); + (n || s.MFV_LIVE_AUTO_OPEN !== !1) && (t.show(), I(t), V(), ce(t, e), n || F(!0)); }, setLiveActive(e) { T = !!e, S?.setLiveActive(T); @@ -413,12 +413,12 @@ var Y = { return E; }, canAcceptPreviewBlob() { - return E ? S?.isVisible ? !0 : o.MFV_PREVIEW_AUTO_OPEN !== !1 : !1; + return E ? S?.isVisible ? !0 : s.MFV_PREVIEW_AUTO_OPEN !== !1 : !1; }, async feedPreviewBlob(e, t = {}) { if (!Y.canAcceptPreviewBlob()) return; let n = await M(), r = !!n.isVisible; - (r || o.MFV_PREVIEW_AUTO_OPEN !== !1) && (n.isVisible || n.show(), I(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), r || F(!0)); + (r || s.MFV_PREVIEW_AUTO_OPEN !== !1) && (n.isVisible || n.show(), I(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), r || F(!0)); }, toggleNodeStream() { Y.setNodeStreamActive(!D); @@ -443,7 +443,7 @@ var Y = { async feedNodeStream(e) { if (!D) return; let t = await M(), n = !!t.isVisible; - (n || o.MFV_NODE_STREAM_AUTO_OPEN !== !1) && (t.isVisible || (t.show(), V()), I(t), L(t), ce(t, e), n || F(!0)); + (n || s.MFV_NODE_STREAM_AUTO_OPEN !== !1) && (t.isVisible || (t.show(), V()), I(t), L(t), ce(t, e), n || F(!0)); } }, X = !1, pe = () => Y.open(), me = () => Y.close(), he = () => Y.toggle(), Z = () => Y.toggleLive(), ge = () => Y.togglePreview(), _e = () => Y.toggleNodeStream(), ve = () => Y.popOut(), ye = () => { try { @@ -504,10 +504,10 @@ var Q = (e) => { } }; function $() { - X || typeof window < "u" && window?.addEventListener && (window.addEventListener(s.MFV_OPEN, pe), window.addEventListener(s.MFV_CLOSE, me), window.addEventListener(s.MFV_TOGGLE, he), window.addEventListener(s.MFV_LIVE_TOGGLE, Z), window.addEventListener(s.MFV_PREVIEW_TOGGLE, ge), window.addEventListener(s.MFV_NODESTREAM_TOGGLE, _e), window.addEventListener(s.MFV_POPOUT, ve), window.addEventListener(s.SETTINGS_CHANGED, be), window.addEventListener("keydown", Q, !0), window.addEventListener("beforeunload", ye), X = !0); + X || typeof window < "u" && window?.addEventListener && (window.addEventListener(c.MFV_OPEN, pe), window.addEventListener(c.MFV_CLOSE, me), window.addEventListener(c.MFV_TOGGLE, he), window.addEventListener(c.MFV_LIVE_TOGGLE, Z), window.addEventListener(c.MFV_PREVIEW_TOGGLE, ge), window.addEventListener(c.MFV_NODESTREAM_TOGGLE, _e), window.addEventListener(c.MFV_POPOUT, ve), window.addEventListener(c.SETTINGS_CHANGED, be), window.addEventListener("keydown", Q, !0), window.addEventListener("beforeunload", ye), X = !0); } function Ce() { - typeof window > "u" || !window?.removeEventListener || (window.removeEventListener(s.MFV_OPEN, pe), window.removeEventListener(s.MFV_CLOSE, me), window.removeEventListener(s.MFV_TOGGLE, he), window.removeEventListener(s.MFV_LIVE_TOGGLE, Z), window.removeEventListener(s.MFV_PREVIEW_TOGGLE, ge), window.removeEventListener(s.MFV_NODESTREAM_TOGGLE, _e), window.removeEventListener(s.MFV_POPOUT, ve), window.removeEventListener(s.SETTINGS_CHANGED, be), window.removeEventListener("keydown", Q, !0), window.removeEventListener("beforeunload", ye)), X = !1; + typeof window > "u" || !window?.removeEventListener || (window.removeEventListener(c.MFV_OPEN, pe), window.removeEventListener(c.MFV_CLOSE, me), window.removeEventListener(c.MFV_TOGGLE, he), window.removeEventListener(c.MFV_LIVE_TOGGLE, Z), window.removeEventListener(c.MFV_PREVIEW_TOGGLE, ge), window.removeEventListener(c.MFV_NODESTREAM_TOGGLE, _e), window.removeEventListener(c.MFV_POPOUT, ve), window.removeEventListener(c.SETTINGS_CHANGED, be), window.removeEventListener("keydown", Q, !0), window.removeEventListener("beforeunload", ye)), X = !1; } function we({ reinstallGlobalHandlers: e = !1 } = {}) { let t = !!S?.isVisible; diff --git a/dist/chunks/genInfo-Dxtoun1T.js b/dist/chunks/genInfo-BkEKNdy-.js similarity index 99% rename from dist/chunks/genInfo-Dxtoun1T.js rename to dist/chunks/genInfo-BkEKNdy-.js index 056f1e44..4fbbf7a3 100644 --- a/dist/chunks/genInfo-Dxtoun1T.js +++ b/dist/chunks/genInfo-BkEKNdy-.js @@ -1,7 +1,7 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, o as n } from "./events-DxfljH4A.js"; -import { h as r } from "./Viewer-DI9upE3v.js"; -import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BHtHjc_k.js"; +import { m as t, o as n } from "./events-BRfpU-6M.js"; +import { h as r } from "./Viewer-geJFRz8N.js"; +import { i, n as a, r as o, t as s, u as c } from "./SidebarWorkflowSection-BihItyAk.js"; import { D as l, E as u, N as d, O as f, T as p, V as m, dt as h, ft as g, k as _, lt as v } from "./mjr-primevue-BRqtdXzb.js"; // ui/vue/components/viewer/ViewerMetadataBlock.vue?vue&type=script&setup=true&lang.ts var y = { style: { diff --git a/dist/chunks/model3dRenderer-k0ey48io.js b/dist/chunks/model3dRenderer-DdPKugXy.js similarity index 94% rename from dist/chunks/model3dRenderer-k0ey48io.js rename to dist/chunks/model3dRenderer-DdPKugXy.js index 2641c018..67ce336c 100644 --- a/dist/chunks/model3dRenderer-k0ey48io.js +++ b/dist/chunks/model3dRenderer-DdPKugXy.js @@ -1,5 +1,5 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { m as t, mt as n, o as r, r as i } from "./events-DxfljH4A.js"; +import { gt as t, m as n, o as r, r as i } from "./events-BRfpU-6M.js"; import { n as a } from "./state-D0Gu1AgG.js"; // ui/features/viewer/model3dCore.ts function o(e, t) { @@ -544,16 +544,16 @@ function T(e) { let t = Math.max(0, Number(e) || 0), n = Math.floor(t / 60), r = Math.floor(t % 60); return n > 0 ? `${n}:${String(r).padStart(2, "0")}` : `${Math.floor(t)}s`; } -function E(e, n) { +function E(e, t) { let r = document.createElement("button"); - return r.type = "button", r.textContent = String(e || ""), r.title = String(n || e || ""), r.setAttribute("aria-label", String(n || e || t("model3d.viewportAction", "3D viewport action"))), r.style.cssText = "height:28px;padding:0 10px;border-radius:999px;border:1px solid rgba(255,255,255,0.16);background:rgba(13,15,20,0.78);color:rgba(255,255,255,0.92);font:600 11px system-ui,sans-serif;letter-spacing:0.02em;cursor:pointer;backdrop-filter:blur(8px);display:inline-flex;align-items:center;justify-content:center;box-shadow:0 4px 18px rgba(0,0,0,0.24)", r; + return r.type = "button", r.textContent = String(e || ""), r.title = String(t || e || ""), r.setAttribute("aria-label", String(t || e || n("model3d.viewportAction", "3D viewport action"))), r.style.cssText = "height:28px;padding:0 10px;border-radius:999px;border:1px solid rgba(255,255,255,0.16);background:rgba(13,15,20,0.78);color:rgba(255,255,255,0.92);font:600 11px system-ui,sans-serif;letter-spacing:0.02em;cursor:pointer;backdrop-filter:blur(8px);display:inline-flex;align-items:center;justify-content:center;box-shadow:0 4px 18px rgba(0,0,0,0.24)", r; } function D(e, t) { if (!e) return; let n = !!t; e.dataset.active = n ? "1" : "0", e.style.background = n ? "rgba(76,175,80,0.18)" : "rgba(13,15,20,0.78)", e.style.borderColor = n ? "rgba(76,175,80,0.42)" : "rgba(255,255,255,0.16)", e.style.color = n ? "rgba(230,255,235,0.96)" : "rgba(255,255,255,0.92)"; } -function O(e, n, r = "", i = "#4CAF50") { +function O(e, t, r = "", i = "#4CAF50") { if (!e) return; try { let t = Math.max(480, Number(e.width) || 960), n = Math.max(270, Number(e.height) || 540); @@ -572,17 +572,17 @@ function O(e, n, r = "", i = "#4CAF50") { let o = Number(e.width) || 960, s = Number(e.height) || 540, c = o / 2, l = s / 2; try { let e = a.createLinearGradient(0, 0, o, s); - e.addColorStop(0, "#0f1419"), e.addColorStop(1, "#11181f"), a.fillStyle = e, a.fillRect(0, 0, o, s), a.save(), a.translate(c, l - 32), a.strokeStyle = i, a.lineWidth = 3, a.globalAlpha = .95, a.beginPath(), a.moveTo(0, -44), a.lineTo(42, -22), a.lineTo(42, 22), a.lineTo(0, 44), a.lineTo(-42, 22), a.lineTo(-42, -22), a.closePath(), a.stroke(), a.beginPath(), a.moveTo(0, -44), a.lineTo(0, 0), a.lineTo(42, 22), a.moveTo(0, 0), a.lineTo(-42, 22), a.moveTo(-42, -22), a.lineTo(0, 0), a.moveTo(42, -22), a.lineTo(0, 0), a.stroke(), a.restore(), a.fillStyle = "rgba(255,255,255,0.94)", a.font = "600 18px system-ui, sans-serif", a.textAlign = "center", a.textBaseline = "middle", a.fillText(String(n || t("model3d.preview", "3D preview")), c, l + 44), r && (a.fillStyle = "rgba(255,255,255,0.62)", a.font = "13px system-ui, sans-serif", a.fillText(String(r), c, l + 72)); + e.addColorStop(0, "#0f1419"), e.addColorStop(1, "#11181f"), a.fillStyle = e, a.fillRect(0, 0, o, s), a.save(), a.translate(c, l - 32), a.strokeStyle = i, a.lineWidth = 3, a.globalAlpha = .95, a.beginPath(), a.moveTo(0, -44), a.lineTo(42, -22), a.lineTo(42, 22), a.lineTo(0, 44), a.lineTo(-42, 22), a.lineTo(-42, -22), a.closePath(), a.stroke(), a.beginPath(), a.moveTo(0, -44), a.lineTo(0, 0), a.lineTo(42, 22), a.moveTo(0, 0), a.lineTo(-42, 22), a.moveTo(-42, -22), a.lineTo(0, 0), a.moveTo(42, -22), a.lineTo(0, 0), a.stroke(), a.restore(), a.fillStyle = "rgba(255,255,255,0.94)", a.font = "600 18px system-ui, sans-serif", a.textAlign = "center", a.textBaseline = "middle", a.fillText(String(t || n("model3d.preview", "3D preview")), c, l + 44), r && (a.fillStyle = "rgba(255,255,255,0.62)", a.font = "13px system-ui, sans-serif", a.fillText(String(r), c, l + 72)); } catch (i) { console.debug?.(i); try { - b(e, n, r || t("model3d.unavailable", "3D viewer unavailable")); + b(e, t, r || n("model3d.unavailable", "3D viewer unavailable")); } catch (e) { console.debug?.(e); } } } -function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSkeleton: i } = {}) { +function ne({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: r, hasSkeleton: i } = {}) { let a = document.createElement("div"); a.className = "mjr-model3d-settings", a.style.cssText = "position:absolute;right:0;top:44px;width:210px;max-height:calc(100% - 100px);overflow-y:auto;background:rgba(14,18,26,0.96);border:1px solid rgba(255,255,255,0.10);border-right:none;border-radius:10px 0 0 10px;padding:10px 10px 12px 10px;z-index:4;display:none;box-shadow:-6px 4px 24px rgba(0,0,0,0.5);backdrop-filter:blur(12px);font:13px system-ui,sans-serif;color:rgba(255,255,255,0.88);scrollbar-width:thin", [ "pointerdown", @@ -634,7 +634,7 @@ function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSke }; o("Scene"); let u = document.createElement("input"); - u.type = "color", u.value = e || "#282828", u.style.cssText = "width:34px;height:24px;cursor:pointer;border:1px solid rgba(255,255,255,0.18);border-radius:4px;padding:1px;background:none;flex-shrink:0;", s(t("model3d.background", "Background"), u), o("Model"); + u.type = "color", u.value = e || "#282828", u.style.cssText = "width:34px;height:24px;cursor:pointer;border:1px solid rgba(255,255,255,0.18);border-radius:4px;padding:1px;background:none;flex-shrink:0;", s(n("model3d.background", "Background"), u), o("Model"); let d = c([ ["original", "Original"], ["normal", "Normal map"], @@ -642,7 +642,7 @@ function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSke ["wireframe", "Wireframe"], ["pointcloud", "Point cloud"] ], "original"); - s(t("model3d.material", "Material"), d); + s(n("model3d.material", "Material"), d); let f = c([ ["original", "Original"], ["+y", "+Y (default)"], @@ -654,11 +654,11 @@ function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSke ], "original"); s("Up", f); let p = null, m = null; - i && (m = document.createElement("input"), m.type = "checkbox", m.checked = !1, m.style.cssText = "cursor:pointer;accent-color:#4CAF50;flex-shrink:0;", p = s(t("model3d.skeleton", "Skeleton"), m)), o("Camera"); - let h = l(15, 120, 1, n ?? 75); - s("FOV", h.wrap), o(t("model3d.lights", "Lights")); + i && (m = document.createElement("input"), m.type = "checkbox", m.checked = !1, m.style.cssText = "cursor:pointer;accent-color:#4CAF50;flex-shrink:0;", p = s(n("model3d.skeleton", "Skeleton"), m)), o("Camera"); + let h = l(15, 120, 1, t ?? 75); + s("FOV", h.wrap), o(n("model3d.lights", "Lights")); let g = l(0, 5, .1, r ?? 1); - return s(t("model3d.intensity", "Intensity"), g.wrap), { + return s(n("model3d.intensity", "Intensity"), g.wrap), { panel: a, bgInput: u, materialSel: d, @@ -699,10 +699,10 @@ function re() { ].forEach((t) => { e.addEventListener(t, (e) => w(e, { preventDefault: !1 })); }); - let n = document.createElement("button"); - n.type = "button", n.textContent = t("model3d.play", "Play"), n.title = t("model3d.playPause", "Play / Pause"), n.style.cssText = "width:28px;height:28px;border-radius:50%;border:1px solid rgba(255,255,255,0.18);background:rgba(76,175,80,0.14);color:rgba(255,255,255,0.92);font:600 12px system-ui,sans-serif;cursor:pointer;flex-shrink:0;padding:0;line-height:1;display:flex;align-items:center;justify-content:center"; + let t = document.createElement("button"); + t.type = "button", t.textContent = n("model3d.play", "Play"), t.title = n("model3d.playPause", "Play / Pause"), t.style.cssText = "width:28px;height:28px;border-radius:50%;border:1px solid rgba(255,255,255,0.18);background:rgba(76,175,80,0.14);color:rgba(255,255,255,0.92);font:600 12px system-ui,sans-serif;cursor:pointer;flex-shrink:0;padding:0;line-height:1;display:flex;align-items:center;justify-content:center"; let r = document.createElement("select"); - r.title = t("model3d.playbackSpeed", "Playback speed"), r.style.cssText = "background:rgba(20,24,34,0.9);color:rgba(255,255,255,0.8);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 4px;font:11px system-ui,sans-serif;cursor:pointer;width:52px;flex-shrink:0"; + r.title = n("model3d.playbackSpeed", "Playback speed"), r.style.cssText = "background:rgba(20,24,34,0.9);color:rgba(255,255,255,0.8);border:1px solid rgba(255,255,255,0.14);border-radius:6px;padding:3px 4px;font:11px system-ui,sans-serif;cursor:pointer;width:52px;flex-shrink:0"; for (let e of S) { let t = document.createElement("option"); t.value = String(e), t.textContent = `${e}x`, e === 1 && (t.selected = !0), r.appendChild(t); @@ -712,9 +712,9 @@ function re() { let a = document.createElement("input"); a.type = "range", a.min = "0", a.max = "1000", a.value = "0", a.style.cssText = "flex:1;min-width:50px;cursor:pointer;accent-color:#4CAF50;height:3px;"; let o = document.createElement("span"); - return o.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.45);white-space:nowrap;flex-shrink:0", o.textContent = "0s / 0s", e.appendChild(n), e.appendChild(r), e.appendChild(i), e.appendChild(a), e.appendChild(o), { + return o.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.45);white-space:nowrap;flex-shrink:0", o.textContent = "0s / 0s", e.appendChild(t), e.appendChild(r), e.appendChild(i), e.appendChild(a), e.appendChild(o), { bar: e, - playBtn: n, + playBtn: t, speedSel: r, animSel: i, progressSlider: a, @@ -738,7 +738,7 @@ var ie = Object.freeze({ "fbx", "stl", "ply" -]), oe = "#282828", se = t("model3d.controlHint", "Rotate: left drag Pan: right drag Zoom: wheel"), A = Object.freeze({ +]), oe = "#282828", se = n("model3d.controlHint", "Rotate: left drag Pan: right drag Zoom: wheel"), A = Object.freeze({ PERSPECTIVE: "perspective", ORTHOGRAPHIC: "orthographic" }); @@ -877,7 +877,7 @@ function F(e, a, o = {}) { S.className = "mjr-model3d-toolbar", S.style.cssText = "position:absolute;top:10px;right:10px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:none;z-index:5"; let C = document.createElement("div"); C.style.cssText = "display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:auto;"; - let ie = E(t("model3d.reset", "Reset"), t("model3d.resetView", "Reset 3D view")), k = E(t("model3d.grid", "Grid"), t("model3d.toggleGrid", "Toggle grid")), pe = E(t("model3d.persp", "Persp"), t("model3d.switchCamera", "Switch perspective / orthographic")), me = E(t("model3d.settings", "Settings"), t("model3d.settings", "Settings")); + let ie = E(n("model3d.reset", "Reset"), n("model3d.resetView", "Reset 3D view")), k = E(n("model3d.grid", "Grid"), n("model3d.toggleGrid", "Toggle grid")), pe = E(n("model3d.persp", "Persp"), n("model3d.switchCamera", "Switch perspective / orthographic")), me = E(n("model3d.settings", "Settings"), n("model3d.settings", "Settings")); C.append(ie, k, pe, me), S.appendChild(C), _.appendChild(S); let M = document.createElement("div"); M.className = "mjr-model3d-hint", M.textContent = o.hintText || se, M.style.cssText = "position:absolute;right:10px;bottom:10px;padding:5px 10px;border-radius:999px;font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.75);background:rgba(0,0,0,0.35);backdrop-filter:blur(6px);pointer-events:none;z-index:2;transition:bottom 0.2s", _.appendChild(M); @@ -1013,8 +1013,8 @@ function F(e, a, o = {}) { } }, qe = (e) => { if (!X || !Z.length) return; - let n = Z[e]; - if (!n) return; + let t = Z[e]; + if (!t) return; Q.forEach((e) => { try { e?.stop(); @@ -1022,14 +1022,14 @@ function F(e, a, o = {}) { console.debug?.(e); } }); - let r = X.clipAction(n); - r.timeScale = Ae, r.clampWhenFinished = !1, r.loop = I?.LoopRepeat ?? 2201, r.play(), Q[e] = r, $ = e, je = !0, P.playBtn.textContent = t("model3d.pause", "Pause"); + let r = X.clipAction(t); + r.timeScale = Ae, r.clampWhenFinished = !1, r.loop = I?.LoopRepeat ?? 2201, r.play(), Q[e] = r, $ = e, je = !0, P.playBtn.textContent = n("model3d.pause", "Pause"); try { - let e = Math.max(100, Math.min(1e4, Math.round((n.duration || 1) * 100))); + let e = Math.max(100, Math.min(1e4, Math.round((t.duration || 1) * 100))); P.progressSlider.max = String(e); } catch {} }, Je = () => { - X && Z.length && (je ? (X.timeScale = 0, je = !1, P.playBtn.textContent = t("model3d.play", "Play")) : (X.timeScale = Ae, Q[$]?.isRunning?.() ? (je = !0, P.playBtn.textContent = t("model3d.pause", "Pause")) : qe($))); + X && Z.length && (je ? (X.timeScale = 0, je = !1, P.playBtn.textContent = n("model3d.play", "Play")) : (X.timeScale = Ae, Q[$]?.isRunning?.() ? (je = !0, P.playBtn.textContent = n("model3d.pause", "Pause")) : qe($))); }, Ye = (e, t) => { e && e.length !== 0 && I && (Z = e, X = new I.AnimationMixer(t), ke = new I.Clock(), Q = Array(e.length).fill(null), P.animSel.innerHTML = "", e.forEach((e, t) => { let n = document.createElement("option"); @@ -1060,7 +1060,7 @@ function F(e, a, o = {}) { } })); }, Xe = () => { - D(k, !!W?.visible), D(pe, q === A.ORTHOGRAPHIC), pe.textContent = q === A.ORTHOGRAPHIC ? t("model3d.ortho", "Ortho") : t("model3d.persp", "Persp"), D(me, Ne); + D(k, !!W?.visible), D(pe, q === A.ORTHOGRAPHIC), pe.textContent = q === A.ORTHOGRAPHIC ? n("model3d.ortho", "Ortho") : n("model3d.persp", "Persp"), D(me, Ne); }; N.bgInput.addEventListener("input", () => { let e = N.bgInput.value; @@ -1237,26 +1237,26 @@ function F(e, a, o = {}) { return Ie("Preparing 3D preview", Pe), Promise.resolve().then(async () => { let r = he(e); if (ae.has(r)) try { - let t = await te(); + let n = await te(); if (F) return; - let i = t.THREE; + let i = n.THREE; I = i; let l = new i.LoadingManager(); - l.setURLModifier((t) => { - if (!t || fe(t)) return t; - let r = n(e, t); + l.setURLModifier((n) => { + if (!n || fe(n)) return n; + let r = t(e, n); if (r) return r; try { - return new URL(t, a).href; + return new URL(n, a).href; } catch { - return t; + return n; } }), L = new i.WebGLRenderer({ canvas: y, antialias: !0, alpha: !0, preserveDrawingBuffer: !0 - }), L.outputColorSpace = i.SRGBColorSpace, L.setPixelRatio(Math.min(2, window.devicePixelRatio || 1)), R = new i.Scene(), R.background = new i.Color(oe), B = new i.PerspectiveCamera(le, 16 / 9, .01, 1e4), V = new i.OrthographicCamera(-1, 1, 1, -1, -1e4, 1e4), z = B, H = new t.OrbitControls(z, y), H.enableDamping = !0, H.dampingFactor = .08, H.rotateSpeed = .82, H.zoomSpeed = 1, H.panSpeed = .9, H.screenSpacePanning = !0, H.mouseButtons = ge(null, i.MOUSE), xe = Ze(), De = new i.AmbientLight(16777215, j.ambient * Y), R.add(De); + }), L.outputColorSpace = i.SRGBColorSpace, L.setPixelRatio(Math.min(2, window.devicePixelRatio || 1)), R = new i.Scene(), R.background = new i.Color(oe), B = new i.PerspectiveCamera(le, 16 / 9, .01, 1e4), V = new i.OrthographicCamera(-1, 1, 1, -1, -1e4, 1e4), z = B, H = new n.OrbitControls(z, y), H.enableDamping = !0, H.dampingFactor = .08, H.rotateSpeed = .82, H.zoomSpeed = 1, H.panSpeed = .9, H.screenSpacePanning = !0, H.mouseButtons = ge(null, i.MOUSE), xe = Ze(), De = new i.AmbientLight(16777215, j.ambient * Y), R.add(De); let u = new i.DirectionalLight(16777215, j.main * Y); u.position.set(0, 10, 10); let p = new i.DirectionalLight(16777215, j.back * Y); @@ -1279,14 +1279,14 @@ function F(e, a, o = {}) { L.setSize(t, n, !1), B && (B.aspect = t / n, B.updateProjectionMatrix()), ze(t, n), Re(), Fe(); }; typeof ResizeObserver < "u" && (_e = new ResizeObserver(() => x()), _e.observe(_)); - let S = v(t, r, l); + let S = v(n, r, l); if (!S) { Ie("3D loader unavailable", `${r.toUpperCase()} loader could not be created.`), M.style.display = "none"; return; } - if (r === "obj" && t.MTLLoader) try { - let e = a.replace(/\.obj(\?.*)?$/i, (e, t) => `.mtl${t || ""}`), n = new t.MTLLoader(l), r = await new Promise((t) => { - n.load(e, t, void 0, () => t(null)); + if (r === "obj" && n.MTLLoader) try { + let e = a.replace(/\.obj(\?.*)?$/i, (e, t) => `.mtl${t || ""}`), t = new n.MTLLoader(l), r = await new Promise((n) => { + t.load(e, n, void 0, () => n(null)); }); r && !F && (r.preload(), S.setMaterials(r)); } catch (e) { @@ -1435,8 +1435,8 @@ function F(e, a, o = {}) { console.warn("[MJR 3D] preview init failed", e), Ie("Failed to load 3D preview", String(e?.message || "Three.js initialization failed.")), M.style.display = "none"; } else if (Ie("3D preview unavailable", `${r.toUpperCase()} is not supported in the embedded viewer.`), M.style.display = "none", a) try { - let n = document.createElement("a"); - n.href = a, n.download = String(e?.filename || "model"), n.textContent = t("model3d.downloadFile", "Download {file}", { file: String(e?.filename || "file") }), n.style.cssText = "position:absolute;bottom:18px;left:50%;transform:translateX(-50%);padding:7px 16px;border-radius:8px;font:600 12px system-ui,sans-serif;color:#fff;background:rgba(76,175,80,0.85);text-decoration:none;pointer-events:auto;z-index:3", _.appendChild(n); + let t = document.createElement("a"); + t.href = a, t.download = String(e?.filename || "model"), t.textContent = n("model3d.downloadFile", "Download {file}", { file: String(e?.filename || "file") }), t.style.cssText = "position:absolute;bottom:18px;left:50%;transform:translateX(-50%);padding:7px 16px;border-radius:8px;font:600 12px system-ui,sans-serif;color:#fff;background:rgba(76,175,80,0.85);text-decoration:none;pointer-events:auto;z-index:3", _.appendChild(t); } catch {} }).catch((e) => { if (!F) { diff --git a/dist/chunks/openMajoorSettings-BfOHsVlq.js b/dist/chunks/openMajoorSettings-Cd5Nutru.js similarity index 83% rename from dist/chunks/openMajoorSettings-BfOHsVlq.js rename to dist/chunks/openMajoorSettings-Cd5Nutru.js index 3f6a8644..0635730a 100644 --- a/dist/chunks/openMajoorSettings-BfOHsVlq.js +++ b/dist/chunks/openMajoorSettings-Cd5Nutru.js @@ -1,18 +1,18 @@ -import { A as e, E as t, J as n, R as r, S as i, Y as a, b as o, j as s, m as c } from "./events-DxfljH4A.js"; -import { a as l, n as u } from "./graphTraversal-DTdQWkn5.js"; -import { S as d, Y as f, b as p, x as m, y as h } from "./SidebarWorkflowSection-BHtHjc_k.js"; +import { A as e, E as t, S as n, Z as r, b as i, j as a, m as o, z as s } from "./events-BRfpU-6M.js"; +import { a as c, n as l } from "./graphTraversal-DTdQWkn5.js"; +import { S as u, Y as d, b as f, x as p, y as m } from "./SidebarWorkflowSection-BihItyAk.js"; // ui/features/viewer/floatingViewerProgress.ts -var g = "progress-update", _ = "__MJR_MFV_PROGRESS_SERVICE__"; +var h = "progress-update", g = "__MJR_MFV_PROGRESS_SERVICE__"; function ee() { return typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : {}; } -function v(e, t) { +function _(e, t) { if (typeof CustomEvent == "function") return new CustomEvent(e, { detail: t }); let n = typeof Event == "function" ? new Event(e) : { type: e }; return n.detail = t, n; } var te = class { - constructor(e, t = () => s()) { + constructor(e, t = () => a()) { this.id = String(e || ""), this.promptApi = null, this.executedNodeIds = [], this.totalNodes = 0, this.currentlyExecuting = null, this.errorDetails = null, this._getApp = typeof t == "function" ? t : () => null; } setPrompt(e) { @@ -25,7 +25,7 @@ var te = class { getNodeLabel(e) { let t = this.getApiNode(e), n = t?._meta?.title || t?.class_type || ""; if (!n) { - let t = this._getApp?.(), r = u(l(t), e); + let t = this._getApp?.(), r = l(c(t), e); n = r?.title || r?.type || ""; } return String(n || "").trim(); @@ -61,8 +61,8 @@ var te = class { this.errorDetails = e || null; } }, ne = class extends EventTarget { - constructor({ getApi: t = (t) => e(t), getApp: r = () => s(), waitForApi: i = (e) => n(e) } = {}) { - super(), this._getApi = t, this._getApp = r, this._waitForApi = i, this.promptsMap = /* @__PURE__ */ new Map(), this.currentExecution = null, this.lastQueueRemaining = 0, this._api = null, this._listenerEntries = [], this._initPromise = null, this._queuePromptBinding = null; + constructor({ getApi: t = (t) => e(t), getApp: n = () => a(), waitForApi: i = (e) => r(e) } = {}) { + super(), this._getApi = t, this._getApp = n, this._waitForApi = i, this.promptsMap = /* @__PURE__ */ new Map(), this.currentExecution = null, this.lastQueueRemaining = 0, this._api = null, this._listenerEntries = [], this._initPromise = null, this._hydrations = /* @__PURE__ */ new Map(); } getSnapshot() { return { @@ -100,45 +100,51 @@ var te = class { return r ? (this._attachApi(r), r) : null; } _attachApi(e) { - e && typeof e.addEventListener == "function" && this._api !== e && (this.dispose({ - resetPatchedQueuePrompt: !1, - keepState: !0 - }), this._api = e, this._patchQueuePrompt(e), this._attachApiListeners(e)); + e && typeof e.addEventListener == "function" && this._api !== e && (this.dispose({ keepState: !0 }), this._api = e, this._attachApiListeners(e)); } - _patchQueuePrompt(e) { - let t = this; - this._queuePromptBinding = a({ - api: e, - owner: this, - createWrapper(e) { - return async function(n, r, ...i) { - let a; - try { - a = await e.apply(this, [ - n, - r, - ...i - ]); - } catch (e) { - let n = t.getOrMakePrompt("error"); - throw n.error({ exception_type: "Unknown." }), t.currentExecution = n, t.dispatchProgressUpdate(), e; - } - let o = String(a?.prompt_id || a?.promptId || "").trim(); - if (o) { - let e = t.getOrMakePrompt(o); - e.setPrompt(r), t.currentExecution ||= e, t.dispatchEvent(v("queue-prompt", { prompt: e })), t.dispatchProgressUpdate(); - } - return a; - }; + async _hydratePrompt(e, t) { + let n = String(t?.id || "").trim(); + if (!n || n === "unknown" || t.promptApi || !e) return; + if (this._hydrations.has(n)) return this._hydrations.get(n); + let r = (async () => { + let r = await this._findPromptInJob(e, n) || await this._findPromptInQueue(e, n) || await this._findPromptInHistory(e, n); + if (r && !t.promptApi) { + t.setPrompt({ output: r }); + let e = t.currentlyExecuting; + e?.nodeId && (e.nodeLabel = t.getNodeLabel(e.nodeId) || e.nodeLabel), this.promptsMap.get(n) === t && this.dispatchProgressUpdate(); } - }); + })().catch((e) => console.debug?.(e)).finally(() => this._hydrations.delete(n)); + return this._hydrations.set(n, r), r; + } + async _findPromptInJob(e, t) { + if (typeof e.getJobDetail != "function") return null; + try { + let n = (await e.getJobDetail(t))?.workflow?.prompt; + return n && typeof n == "object" && !Array.isArray(n) ? n : null; + } catch (e) { + return console.debug?.(e), null; + } + } + async _fetchJson(e, t) { + if (typeof e.fetchApi != "function") return null; + let n = await e.fetchApi(t, { cache: "no-store" }); + return !n?.ok || typeof n.json != "function" ? null : n.json(); + } + async _findPromptInQueue(e, t) { + let n = await this._fetchJson(e, "/queue"), r = [...Array.isArray(n?.queue_running) ? n.queue_running : [], ...Array.isArray(n?.queue_pending) ? n.queue_pending : []]; + for (let e of r) if (Array.isArray(e) && String(e[1] || "") === t) return e[2] && typeof e[2] == "object" ? e[2] : null; + return null; + } + async _findPromptInHistory(e, t) { + let n = (await this._fetchJson(e, `/history/${encodeURIComponent(t)}`))?.[t]?.prompt; + return Array.isArray(n) && n[2] && typeof n[2] == "object" ? n[2] : null; } _attachApiListeners(e) { this._attachListener(e, "status", (e) => { e?.detail?.exec_info && (this.lastQueueRemaining = Number(e.detail.exec_info.queue_remaining) || 0, this.dispatchProgressUpdate()); - }), this._attachListener(e, "execution_start", (e) => { - let t = String(e?.detail?.prompt_id || e?.detail?.promptId || "").trim(); - t && (this.currentExecution = this.getOrMakePrompt(t), this.dispatchProgressUpdate()); + }), this._attachListener(e, "execution_start", (t) => { + let n = String(t?.detail?.prompt_id || t?.detail?.promptId || "").trim(); + n && (this.currentExecution = this.getOrMakePrompt(n), this.dispatchProgressUpdate(), this._hydratePrompt(e, this.currentExecution)); }), this._attachListener(e, "executing", (e) => { this.currentExecution ||= this.getOrMakePrompt("unknown"), this.currentExecution.executing(e?.detail), e?.detail ?? (this.currentExecution = null), this.dispatchProgressUpdate(); }), this._attachListener(e, "progress", (e) => { @@ -172,25 +178,20 @@ var te = class { }); } dispatchProgressUpdate() { - this.dispatchEvent(v(g, this.getSnapshot())); + this.dispatchEvent(_(h, this.getSnapshot())); } - dispose({ resetPatchedQueuePrompt: e = !1, keepState: t = !1 } = {}) { + dispose({ keepState: e = !1 } = {}) { for (let { api: e, type: t, handler: n } of this._listenerEntries.splice(0)) try { e?.removeEventListener?.(t, n); } catch (e) { console.debug?.(e); } - if (e && this._queuePromptBinding?.owner === this) try { - this._queuePromptBinding.restore?.(); - } catch (e) { - console.debug?.(e); - } - this._queuePromptBinding = null, this._api = null, t || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0); + this._api = null, e || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0); } -}, y = ee(), b = y[_] || new ne(); -y[_] || (y[_] = b); -function x(e = {}) { - return b.ensureInitialized(e); +}, v = ee(), y = v[g] || new ne(); +v[g] || (v[g] = y); +function b(e = {}) { + return y.ensureInitialized(e); } function re(e) { let t = Math.max(0, Number(e?.queue) || 0), n = e?.prompt || null; @@ -227,7 +228,7 @@ function ie(e) { let r = String(n.nodeLabel || n.nodeId || "Node").trim(), i = Number(n.step), a = Number(n.maxSteps); return Number.isFinite(i) && Number.isFinite(a) && a > 0 ? n.pass > 1 ? `${r} #${n.pass} - ${i}/${a}` : `${r} - ${i}/${a}` : r; } -function S(e, t) { +function x(e, t) { if (!e?._progressEl && !e?._mediaProgressEl) return; let n = t?.prompt || null, r = String(n?.errorDetails?.node_id || n?.currentlyExecuting?.nodeId || "").trim(), i = "0%", a = "0%", o = !!n?.errorDetails; if (n?.currentlyExecuting) { @@ -247,7 +248,7 @@ function ae(e, t) { let n = String(t || "").trim(); if (!n) return !1; try { - return o(n, s()); + return i(n, a()); } catch (e) { return console.debug?.(e), !1; } @@ -264,78 +265,78 @@ function oe(e) { let a = document.createElement("span"); return a.className = "mjr-mfv-progress-text", a.textContent = "Idle", t.appendChild(n), t.appendChild(r), t.appendChild(i), t.appendChild(a), t.addEventListener("pointerdown", (t) => { t.button === 0 && ae(e, e._progressCurrentNodeId) && (t.preventDefault(), t.stopPropagation()); - }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && b.removeEventListener(g, e._progressUpdateHandler), e._progressUpdateHandler = (t) => { - S(e, t?.detail || b.getSnapshot()); - }, b.addEventListener(g, e._progressUpdateHandler), x({ timeoutMs: 4e3 }).catch((e) => { + }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && y.removeEventListener(h, e._progressUpdateHandler), e._progressUpdateHandler = (t) => { + x(e, t?.detail || y.getSnapshot()); + }, y.addEventListener(h, e._progressUpdateHandler), b({ timeoutMs: 4e3 }).catch((e) => { console.debug?.(e); - }), S(e, b.getSnapshot()), t; + }), x(e, y.getSnapshot()), t; } function se(e) { let t = document.createElement("div"); t.className = "mjr-mfv-media-progress", t.setAttribute("aria-hidden", "true"); let n = document.createElement("span"); - return n.className = "mjr-mfv-media-progress-text", t.appendChild(n), e._mediaProgressEl = t, e._mediaProgressTextEl = n, S(e, b.getSnapshot()), t; + return n.className = "mjr-mfv-media-progress-text", t.appendChild(n), e._mediaProgressEl = t, e._mediaProgressTextEl = n, x(e, y.getSnapshot()), t; } function ce(e) { if (e?._progressUpdateHandler) try { - b.removeEventListener(g, e._progressUpdateHandler); + y.removeEventListener(h, e._progressUpdateHandler); } catch (e) { console.debug?.(e); } e._progressUpdateHandler = null, e._progressCurrentNodeId = null, e._progressEl = null, e._progressNodesEl = null, e._progressStepsEl = null, e._progressTextEl = null, e._mediaProgressEl = null, e._mediaProgressTextEl = null; } // ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts -var C = /* @__PURE__ */ new Map(), w = null; +var S = /* @__PURE__ */ new Map(), C = null; async function le(e) { - let t = Array.from(new Set(T(e).map((e) => O(e)).filter(Boolean))); - if (t.length && t.filter((e) => !C.has(e)).length) try { - w ||= i("/object_info").then((e) => e?.ok ? e.json() : null).then((e) => { - if (e && typeof e == "object") for (let [t, n] of Object.entries(e)) C.set(String(t), n); + let t = Array.from(new Set(w(e).map((e) => D(e)).filter(Boolean))); + if (t.length && t.filter((e) => !S.has(e)).length) try { + C ||= n("/object_info").then((e) => e?.ok ? e.json() : null).then((e) => { + if (e && typeof e == "object") for (let [t, n] of Object.entries(e)) S.set(String(t), n); return e; - }).catch(() => null), await w; + }).catch(() => null), await C; } catch {} } function ue(e) { - let t = be(e), n = xe(e); + let t = ye(e), n = be(e); for (let e of t) { - let t = Se(L(e)); - if (t) return we(t, n), R(t), t; + let t = xe(L(e)); + if (t) return Ce(t, n), R(t), t; } return null; } -function T(e, t = null) { +function w(e, t = null) { let n = t?.includeSubgraphs !== !1, r = Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : []; if (!n) return r; let i = [...r], a = H(e); for (let n of r) { let r = W(e, n, a); - r && i.push(...T(r, t)); + r && i.push(...w(r, t)); } return i; } -function E(e, t, n = null) { +function T(e, t, n = null) { let r = n?.includeSubgraphs !== !1, i = String(t ?? ""); if (!i) return null; if (!r) return (Array.isArray(e?.nodes) ? e.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === i) || null; - if (i.includes("::")) return Pe(e, i.split("::").filter(Boolean)); + if (i.includes("::")) return Ne(e, i.split("::").filter(Boolean)); let a = (Array.isArray(e?.nodes) ? e.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === i) || null; if (a) return a; for (let t of Array.isArray(e?.nodes) ? e.nodes : []) { - let n = W(e, t, H(e)), r = n ? E(n, i) : null; + let n = W(e, t, H(e)), r = n ? T(n, i) : null; if (r) return r; } return null; } +function E(e) { + return f(e); +} function D(e) { return p(e); } -function O(e) { - return m(e); -} function de(e) { - return d(e); + return u(e); } -function k(e) { +function O(e) { let t = fe(e), n = e?.properties && typeof e.properties == "object" ? e.properties : null; if (Array.isArray(e?._mjrSubgraphProxyParams)) for (let n of e._mjrSubgraphProxyParams) { let e = String(n?.label || n?.key || "").trim(); @@ -346,21 +347,21 @@ function k(e) { } function fe(e) { let t = [], n = e?._mjrPromptInputs && typeof e._mjrPromptInputs == "object" ? e._mjrPromptInputs : null, r = e?.inputs && typeof e.inputs == "object" ? e.inputs : null; - if (n && !Array.isArray(n)) for (let [e, r] of Object.entries(n)) M(r) || t.push([e, r]); - if (r && !Array.isArray(r)) for (let [e, n] of Object.entries(r)) M(n) || t.some(([t]) => String(t) === String(e)) || t.push([e, n]); - for (let { label: n, value: r } of A(e)) t.some(([e]) => String(e) === String(n)) || t.push([n, r]); + if (n && !Array.isArray(n)) for (let [e, r] of Object.entries(n)) j(r) || t.push([e, r]); + if (r && !Array.isArray(r)) for (let [e, n] of Object.entries(r)) j(n) || t.some(([t]) => String(t) === String(e)) || t.push([e, n]); + for (let { label: n, value: r } of k(e)) t.some(([e]) => String(e) === String(n)) || t.push([n, r]); return t; } -function A(e) { +function k(e) { let t = e?.widgets_values; if (pe(t)) return Object.entries(t).map(([e, t], n) => ({ label: e, value: t, index: n })); - let n = me(t), r = Array.isArray(e?.widgets) ? e.widgets : [], i = P(_e(e)), a = he(e); + let n = me(t), r = Array.isArray(e?.widgets) ? e.widgets : [], i = N(_e(e)), a = he(e); return n.map((t, n) => { - let o = ye(e, n, t); + let o = ve(e, n, t); return { label: a[n] || r[n]?.name || r[n]?.label || i[n] || o || `param ${n + 1}`, value: t, @@ -369,29 +370,29 @@ function A(e) { }); } function pe(e) { - return !(!e || typeof e != "object" || Array.isArray(e) || j(e)); + return !(!e || typeof e != "object" || Array.isArray(e) || A(e)); } function me(e) { if (Array.isArray(e)) return e; - if (!j(e)) return []; + if (!A(e)) return []; let t = Math.max(0, Math.floor(Number(e.length) || 0)), n = []; for (let r = 0; r < t; r += 1) n.push(e[r]); return n; } -function j(e) { +function A(e) { if (!e || typeof e != "object" || Array.isArray(e)) return !1; let t = Number(e.length); return !(!Number.isFinite(t) || t < 0); } function he(e) { - let t = (Array.isArray(e?.inputs) ? e.inputs : []).filter(F), n = [], r = /* @__PURE__ */ new Set(), i = (e) => { + let t = (Array.isArray(e?.inputs) ? e.inputs : []).filter(P), n = [], r = /* @__PURE__ */ new Set(), i = (e) => { let t = `${String(e?.name || "")}\u0000${String(e?.label || "")}\u0000${String(e?.link ?? "")}`; r.has(t) || (r.add(t), n.push(e)); }; for (let e of t) i(e); return n.map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); } -function M(e) { +function j(e) { return Array.isArray(e) && e.length === 2 && String(e[0] ?? "").trim() !== "" && Number.isFinite(Number(e[1])); } function ge(e) { @@ -399,39 +400,39 @@ function ge(e) { return !t || t === "cnr_id" || t === "ver" || t === "node_name_for_s&r" || t === "subgraph_name" || t === "subgraph_id" || t === "enabletabs" || t === "tabwidth" || t === "tabxoffset" || t === "hassecondtab" || t === "secondtabtext" || t === "secondtaboffset" || t === "secondtabwidth" || t.startsWith("ue_"); } function _e(e) { - let t = O(e); - return t && C.get(t) || null; + let t = D(e); + return t && S.get(t) || null; } -function N(e) { +function M(e) { let t = e?.input_order; if (t && typeof t == "object") return [...Array.isArray(t.required) ? t.required : [], ...Array.isArray(t.optional) ? t.optional : []].filter(Boolean); let n = e?.input; return n && typeof n == "object" ? ["required", "optional"].flatMap((e) => n[e] && typeof n[e] == "object" ? Object.keys(n[e]) : []).filter(Boolean) : []; } -function P(e) { +function N(e) { let t = e?.input; - if (!t || typeof t != "object") return N(e); + if (!t || typeof t != "object") return M(e); let n = []; for (let e of ["required", "optional"]) { let r = t[e]; - if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) I(t) && n.push(e); + if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) F(t) && n.push(e); } - return n.length ? n : N(e); + return n.length ? n : M(e); } -function F(e) { +function P(e) { return !e || typeof e != "object" ? !1 : !!(e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim() || e.widget_index != null || e.widgetIndex != null); } -function I(e) { +function F(e) { let t = Array.isArray(e) ? e : [], n = t[0], r = t[1] && typeof t[1] == "object" && !Array.isArray(t[1]) ? t[1] : null; - return r?.forceInput === !0 || r?.rawLink === !0 ? !1 : r?.widgetType && String(r.widgetType).trim() ? !0 : ve(n); + return r?.forceInput === !0 || r?.rawLink === !0 ? !1 : r?.widgetType && String(r.widgetType).trim() ? !0 : I(n); } -function ve(e) { +function I(e) { if (Array.isArray(e)) return !0; let t = String(e || "").trim().toUpperCase(); return t ? t === "INT" || t === "FLOAT" || t === "STRING" || t === "BOOLEAN" || t === "BOOL" || t === "COMBO" || t === "ENUM" : !1; } -function ye(e, t, n) { - let r = O(e), i = D(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase(); +function ve(e, t, n) { + let r = D(e), i = E(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase(); if (a.includes("ksamplerselect")) return "sampler_name"; if (a.includes("ksampler")) return [ "seed", @@ -472,7 +473,7 @@ function ye(e, t, n) { } return null; } -function be(e) { +function ye(e) { let t = L(e?.metadata_raw), n = L(e?.metadata); return [ e?.workflow, @@ -514,7 +515,7 @@ function be(e) { n?.Prompt ].filter((e) => e != null); } -function xe(e) { +function be(e) { let t = L(e?.metadata_raw), n = L(e?.metadata), r = [ e?.prompt, e?.Prompt, @@ -541,16 +542,16 @@ function L(e) { return null; } } -function Se(e) { +function xe(e) { if (!e || typeof e != "object") return null; if (Array.isArray(e.nodes)) return e; - let t = Ce(e); + let t = Se(e); if (t) return t; - if (e.prompt && typeof e.prompt == "object") return h(e.prompt); - let n = h(e); + if (e.prompt && typeof e.prompt == "object") return m(e.prompt); + let n = m(e); return n && Array.isArray(n.nodes) ? n : null; } -function Ce(e) { +function Se(e) { for (let t of [ "workflow", "Workflow", @@ -571,14 +572,14 @@ function R(e, t = /* @__PURE__ */ new WeakSet()) { t.add(e); let n = H(e); for (let r of Array.isArray(e?.nodes) ? e.nodes : []) { - De(r, n); + Ee(r, n); let i = W(e, r, n); - i && (Oe(r, i), R(i, t)); + i && (De(r, i), R(i, t)); } } -function we(e, t) { +function Ce(e, t) { if (!e || typeof e != "object" || !t || typeof t != "object") return; - let n = Te(t); + let n = we(t); n.length && z(e, n, /* @__PURE__ */ new WeakSet()); } function z(e, t, n) { @@ -586,13 +587,13 @@ function z(e, t, n) { n.add(e); let r = H(e); for (let i of Array.isArray(e?.nodes) ? e.nodes : []) { - let a = Ee(i, t); + let a = Te(i, t); a?.inputs && typeof a.inputs == "object" && !Array.isArray(a.inputs) && (i._mjrPromptInputs = a.inputs); let o = W(e, i, r); o && z(o, t, n); } } -function Te(e) { +function we(e) { if (!e || typeof e != "object" || Array.isArray(e)) return []; let t = []; for (let [n, r] of Object.entries(e)) { @@ -609,8 +610,8 @@ function Te(e) { } return t; } -function Ee(e, t) { - let n = String(e?.id ?? e?.ID ?? "").trim(), r = B(O(e)); +function Te(e, t) { + let n = String(e?.id ?? e?.ID ?? "").trim(), r = B(D(e)); if (!n || !r) return null; let i = t.find((e) => e.id === n && B(e.classType) === r); if (i) return i; @@ -620,7 +621,7 @@ function Ee(e, t) { function B(e) { return String(e || "").trim().toLowerCase(); } -function De(e, t) { +function Ee(e, t) { if (!e || typeof e != "object") return; let n = U(e).find((e) => t.has(String(e))); if (!n) return; @@ -629,18 +630,18 @@ function De(e, t) { let a = e?.properties && typeof e.properties == "object" ? e.properties : e.properties = {}; String(a.subgraph_name || "").trim() || (a.subgraph_name = i), String(a.subgraph_id || "").trim() || (a.subgraph_id = n); } -function Oe(e, t) { +function De(e, t) { let n = Array.isArray(e?.properties?.proxyWidgets) ? e.properties.proxyWidgets : []; if (!n.length || !Array.isArray(t?.nodes)) return; - let r = new Map(t.nodes.filter(Boolean).map((e) => [String(e?.id ?? e?.ID ?? ""), e])), i = ke(e), a = Ae(t), o = []; + let r = new Map(t.nodes.filter(Boolean).map((e) => [String(e?.id ?? e?.ID ?? ""), e])), i = Oe(e), a = ke(t), o = []; for (let e = 0; e < n.length; e += 1) { let t = n[e], s = Array.isArray(t) ? t[0] : t?.nodeId ?? t?.node_id ?? t?.id, c = Array.isArray(t) ? t[1] : t?.widget ?? t?.name ?? t?.widgetName, l = r.get(String(s ?? "")); if (!l) continue; - let u = k(l); + let u = O(l); if (!u.length) continue; let d = u.find(([e]) => V(e) === V(c)) || u.find(([e]) => V(e) === "value") || (u.length === 1 ? u[0] : null); if (!d) continue; - let f = `${String(s)}:${je(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || Me(l, d[0], c); + let f = `${String(s)}:${Ae(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || je(l, d[0], c); (!i.size || i.has(V(p))) && o.push({ label: p, value: d[1], @@ -650,16 +651,16 @@ function Oe(e, t) { } o.length && (e._mjrSubgraphProxyParams = o); } -function ke(e) { +function Oe(e) { let t = Array.isArray(e?.inputs) ? e.inputs : [], n = /* @__PURE__ */ new Set(); for (let e of t) { - if (!F(e)) continue; + if (!P(e)) continue; let t = String(e?.label || e?.localized_name || e?.name || "").trim(); t && n.add(V(t)); } return n; } -function Ae(e) { +function ke(e) { let t = Array.isArray(e?.inputs) ? e.inputs : [], n = Array.isArray(e?.links) ? e.links : [], r = /* @__PURE__ */ new Map(); for (let e of n) { let n = Array.isArray(e) ? e[1] : e?.origin_id ?? e?.originId ?? e?.from; @@ -669,15 +670,15 @@ function Ae(e) { } return r; } -function je(e, t, n) { +function Ae(e, t, n) { if (e && typeof e == "object" && !Array.isArray(e)) { let t = e.target_slot ?? e.targetSlot ?? e.slot; if (Number.isFinite(Number(t))) return Number(t); } return 0; } -function Me(e, t, n) { - let r = String(D(e) || "").trim(), i = String(t || n || "").trim(); +function je(e, t, n) { + let r = String(E(e) || "").trim(), i = String(t || n || "").trim(); return r && i && V(i) !== "value" ? `${r} ${i}` : r || i || "param"; } function V(e) { @@ -689,10 +690,10 @@ function H(e) { ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] ], n = /* @__PURE__ */ new Map(); - for (let e of t) for (let t of Ne(e)) t != null && n.set(String(t), e); + for (let e of t) for (let t of Me(e)) t != null && n.set(String(t), e); return n; } -function Ne(e) { +function Me(e) { let t = e?.properties && typeof e.properties == "object" ? e.properties : {}; return [ e?.id, @@ -734,7 +735,7 @@ function W(e, t, n = H(e)) { for (let e of r) if (e && typeof e == "object" && Array.isArray(e.nodes)) return e; return Array.isArray(t?.nodes) ? { nodes: t.nodes } : null; } -function Pe(e, t) { +function Ne(e, t) { let n = e, r = null; for (let e = 0; e < t.length; e += 1) { let i = String(t[e] ?? "").trim(); @@ -747,42 +748,42 @@ function Pe(e, t) { return r; } // ui/features/viewer/workflowSidebar/widgetAdapters.ts -function Fe(e, t, n = null) { +function Pe(e, t, n = null) { switch (String(e?.type || "").toLowerCase()) { case "number": case "int": - case "float": return Le(e, t, n); - case "combo": return Re(e, t, n); + case "float": return Ie(e, t, n); + case "combo": return Le(e, t, n); case "text": case "string": - case "customtext": return ze(e, t, n); + case "customtext": return Re(e, t, n); case "toggle": - case "boolean": return Be(e, t, n); - default: return Ve(e); + case "boolean": return ze(e, t, n); + default: return Be(e); } } -function G(e, n, i = null) { +function G(e, n, r = null) { if (!e) return !1; - let a = String(e.type || "").toLowerCase(); - if (a === "number" || a === "int" || a === "float") { + let i = String(e.type || "").toLowerCase(); + if (i === "number" || i === "int" || i === "float") { let t = Number(n); if (Number.isNaN(t)) return !1; - let r = e.options ?? {}, i = r.min ?? -Infinity, o = r.max ?? Infinity, s = Math.min(o, Math.max(i, t)); - (a === "int" || r.precision === 0 || r.round === 1) && (s = Math.round(s)), e.value = s; - } else e.value = a === "toggle" || a === "boolean" ? !!n : n; + let r = e.options ?? {}, a = r.min ?? -Infinity, o = r.max ?? Infinity, s = Math.min(o, Math.max(a, t)); + (i === "int" || r.precision === 0 || r.round === 1) && (s = Math.round(s)), e.value = s; + } else e.value = i === "toggle" || i === "boolean" ? !!n : n; try { - let n = t(), o = i ?? e?.parent ?? null, s = e.value; - e.callback?.(e.value, n, o, null, e), (a === "number" || a === "int" || a === "float") && (e.value = s), Ie(e), r(o); + let n = t(), a = r ?? e?.parent ?? null, o = e.value; + e.callback?.(e.value, n, a, null, e), (i === "number" || i === "int" || i === "float") && (e.value = o), Fe(e), s(a); } catch (e) { console.debug?.("[MFV] writeWidgetValue", e); } return !0; } -function Ie(e) { +function Fe(e) { let t = String(e.value ?? ""), n = e?.inputEl ?? e?.element ?? e?.el ?? e?.cachedDeepestByFrame?.widget?.inputEl ?? e?.cachedDeepestByFrame?.widget?.element ?? e?.cachedDeepestByFrame?.widget?.el ?? null; n != null && "value" in n && n.value !== t && (n.value = t); } -function Le(e, t, n = null) { +function Ie(e, t, n = null) { let r = document.createElement("input"); r.type = "number", r.className = "mjr-ws-input", r.value = e.value ?? ""; let i = e.options ?? {}, a = String(e?.type || "").toLowerCase() === "int" || i.precision === 0 || i.round === 1; @@ -798,7 +799,7 @@ function Le(e, t, n = null) { G(e, r.value, n) && (r.value = String(e.value), t?.(e.value)); }), r; } -function Re(e, t, n = null) { +function Le(e, t, n = null) { let r = document.createElement("select"); r.className = "mjr-ws-input"; let i = e.options?.values ?? []; @@ -816,7 +817,7 @@ function Re(e, t, n = null) { G(e, r.value, n) && t?.(e.value); }), r; } -function ze(e, t, n = null) { +function Re(e, t, n = null) { let r = document.createElement("div"); r.className = "mjr-ws-text-wrapper"; let i = document.createElement("textarea"); @@ -830,7 +831,7 @@ function ze(e, t, n = null) { G(e, i.value, n), t?.(e.value), a(); }), r.appendChild(i), r._mjrAutoFit = a, i._mjrAutoFit = a, requestAnimationFrame(a), r; } -function Be(e, t, n = null) { +function ze(e, t, n = null) { let r = document.createElement("label"); r.className = "mjr-ws-toggle-label"; let i = document.createElement("input"); @@ -838,12 +839,12 @@ function Be(e, t, n = null) { G(e, i.checked, n) && t?.(e.value); }), r.appendChild(i), r; } -function Ve(e) { +function Be(e) { let t = document.createElement("input"); return t.type = "text", t.className = "mjr-ws-input mjr-ws-readonly", t.value = e.value == null ? "" : String(e.value), t.readOnly = !0, t.tabIndex = -1, t; } // ui/app/settings/MajoorSettingsDialog.ts -var K = "mjr-settings-dialog", q = "mjr-settings-dialog-style", J = "mjr:settings-dialog-visibility", Y = null, He = { +var K = "mjr-settings-dialog", q = "mjr-settings-dialog-style", J = "mjr:settings-dialog-visibility", Y = null, Ve = { Cards: { icon: "pi pi-th-large", label: "Cards" @@ -897,7 +898,7 @@ var K = "mjr-settings-dialog", q = "mjr-settings-dialog-style", J = "mjr:setting label: "General" } }; -function Ue() { +function He() { if (typeof document > "u" || document.getElementById(q)) return; let e = document.createElement("style"); e.id = q, e.textContent = ` @@ -1078,23 +1079,23 @@ function Ue() { } `, document.head.appendChild(e); } -function We(e) { +function Ue(e) { return String(e || "").replace(/^\s*Majoor:\s*/i, "").trim(); } -function Ge(e) { +function We(e) { let t = Array.isArray(e?.category) ? e.category : []; return String(t[1] || "General").trim() || "General"; } -function Ke(e) { +function X(e) { return (Array.isArray(e?.category) ? e.category : []).slice(2).filter(Boolean).join(" / ") || "General"; } -function qe(e) { - return He[e] || { +function Ge(e) { + return Ve[e] || { icon: "pi pi-sliders-h", label: e || "General" }; } -function X(e, t) { +function Ke(e, t) { return !t || [ e?.id, e?.name, @@ -1115,7 +1116,7 @@ function Z(e, t) { } } } -function Je(e) { +function qe(e) { let t = String(e?.type || "text").toLowerCase(), n = e?.defaultValue, r; if (t === "boolean") return r = document.createElement("input"), r.type = "checkbox", r.checked = !!n, r.addEventListener("change", () => Z(e, r.checked)), r; if (t === "combo") { @@ -1133,20 +1134,20 @@ function Je(e) { Z(e, t === "number" ? Number(r.value) : r.value); }), r; } -function Ye(e, t, n = "") { +function Je(e, t, n = "") { e.replaceChildren(); let r = document.createElement("div"); r.className = "mjr-settings-stack", e.appendChild(r); let i = /* @__PURE__ */ new Map(); for (let e of t || []) { - if (!X(e, n)) continue; - let t = Ge(e), r = Ke(e); + if (!Ke(e, n)) continue; + let t = We(e), r = X(e); i.has(t) || i.set(t, /* @__PURE__ */ new Map()); let a = i.get(t); a.has(r) || a.set(r, []), a.get(r).push(e); } for (let [e, t] of i.entries()) { - let i = Array.from(t.values()).flat(), a = qe(e), o = document.createElement("details"); + let i = Array.from(t.values()).flat(), a = Ge(e), o = document.createElement("details"); o.className = "mjr-settings-group", o.open = !!n; let s = document.createElement("summary"), c = document.createElement("span"); c.className = "mjr-settings-group-icon"; @@ -1169,19 +1170,19 @@ function Ye(e, t, n = "") { let n = document.createElement("label"); n.className = "mjr-settings-row"; let r = document.createElement("div"), i = document.createElement("div"); - if (i.className = "mjr-settings-name", i.textContent = We(e?.name) || e?.id || "Setting", r.appendChild(i), e?.tooltip) { + if (i.className = "mjr-settings-name", i.textContent = Ue(e?.name) || e?.id || "Setting", r.appendChild(i), e?.tooltip) { let t = document.createElement("div"); t.className = "mjr-settings-tip", t.textContent = String(e.tooltip), r.appendChild(t); } - n.appendChild(r), n.appendChild(Je(e)), t.appendChild(n); + n.appendChild(r), n.appendChild(qe(e)), t.appendChild(n); } p.appendChild(t); } o.appendChild(p), r.appendChild(o); } } -function Xe() { - Ue(); +function Ye() { + He(); let e = document.createElement("div"); e.id = K, e.hidden = !0, e.addEventListener("click", (t) => { t.target === e && Q(); @@ -1191,18 +1192,18 @@ function Xe() { let n = document.createElement("div"); n.className = "mjr-settings-head"; let r = document.createElement("div"); - r.className = "mjr-settings-title", r.textContent = c("settings.majoor.title", "Majoor Assets Manager Settings"); + r.className = "mjr-settings-title", r.textContent = o("settings.majoor.title", "Majoor Assets Manager Settings"); let i = document.createElement("button"); - i.type = "button", i.className = "mjr-settings-close", i.textContent = "X", i.setAttribute("aria-label", c("btn.close", "Close")), i.addEventListener("click", Q), n.append(r, i); + i.type = "button", i.className = "mjr-settings-close", i.textContent = "X", i.setAttribute("aria-label", o("btn.close", "Close")), i.addEventListener("click", Q), n.append(r, i); let a = document.createElement("div"); a.className = "mjr-settings-tools"; - let o = document.createElement("input"); - o.type = "search", o.className = "mjr-settings-search", o.placeholder = c("placeholder.searchSettings", "Search settings"), a.appendChild(o); - let s = document.createElement("div"); - return s.className = "mjr-settings-body", t.append(n, a, s), e.appendChild(t), document.body.appendChild(e), { - body: s, + let s = document.createElement("input"); + s.type = "search", s.className = "mjr-settings-search", s.placeholder = o("placeholder.searchSettings", "Search settings"), a.appendChild(s); + let c = document.createElement("div"); + return c.className = "mjr-settings-body", t.append(n, a, c), e.appendChild(t), document.body.appendChild(e), { + body: c, root: e, - search: o + search: s }; } function Q() { @@ -1215,10 +1216,10 @@ function Q() { } } } -function Ze(e = s()) { +function Xe(e = a()) { if (typeof document > "u") return !1; - Y?.root?.isConnected || (Y = Xe()); - let t = f(e), n = () => Ye(Y.body, t, String(Y.search.value || "").trim().toLowerCase()); + Y?.root?.isConnected || (Y = Ye()); + let t = d(e), n = () => Je(Y.body, t, String(Y.search.value || "").trim().toLowerCase()); Y.search.oninput = n, Y.search.value = "", n(), Y.root.hidden = !1; try { window.dispatchEvent(new CustomEvent(J, { detail: { open: !0 } })); @@ -1228,12 +1229,12 @@ function Ze(e = s()) { return setTimeout(() => Y?.search?.focus?.(), 0), !0; } // ui/app/openMajoorSettings.ts -function $(e = s()) { - return Ze(e); +function $(e = a()) { + return Xe(e); } try { typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.openSettings = $); } catch (e) { console.debug?.(e); } -export { x as _, le as a, k as c, A as d, T as f, ce as g, oe as h, G as i, O as l, se as m, J as n, E as o, ue as p, Fe as r, D as s, $ as t, de as u, b as v }; +export { b as _, le as a, O as c, k as d, w as f, ce as g, oe as h, G as i, D as l, se as m, J as n, T as o, ue as p, Pe as r, E as s, $ as t, de as u, y as v }; diff --git a/dist/chunks/sideBySide-Css6Vh8y.js b/dist/chunks/sideBySide-sOf24A5X.js similarity index 99% rename from dist/chunks/sideBySide-Css6Vh8y.js rename to dist/chunks/sideBySide-sOf24A5X.js index 95bd34fe..d9223df7 100644 --- a/dist/chunks/sideBySide-Css6Vh8y.js +++ b/dist/chunks/sideBySide-sOf24A5X.js @@ -1,4 +1,4 @@ -import { i as e } from "./model3dRenderer-k0ey48io.js"; +import { i as e } from "./model3dRenderer-DdPKugXy.js"; import { i as t, o as n } from "./geninfoParser-CgHp-y-n.js"; // ui/features/viewer/sideBySide.ts function r(e) { diff --git a/dist/chunks/viewerOpenRequest-CCFPrnGk.js b/dist/chunks/viewerOpenRequest-Crw9UWH5.js similarity index 90% rename from dist/chunks/viewerOpenRequest-CCFPrnGk.js rename to dist/chunks/viewerOpenRequest-Crw9UWH5.js index 05c52289..66e81f13 100644 --- a/dist/chunks/viewerOpenRequest-CCFPrnGk.js +++ b/dist/chunks/viewerOpenRequest-Crw9UWH5.js @@ -1,6 +1,6 @@ import { t as e } from "./rolldown-runtime-CGnMp29N.js"; -import { r as t } from "./events-DxfljH4A.js"; -import { t as n } from "./Viewer-DI9upE3v.js"; +import { r as t } from "./events-BRfpU-6M.js"; +import { t as n } from "./Viewer-geJFRz8N.js"; // ui/features/viewer/viewerOpenRequest.ts var r = /* @__PURE__ */ e({ requestViewerOpen: () => o }); function i(e) { diff --git a/dist/chunks/viewerRuntimeHosts-DQcoOjsY.js b/dist/chunks/viewerRuntimeHosts-D3Jyfx0-.js similarity index 87% rename from dist/chunks/viewerRuntimeHosts-DQcoOjsY.js rename to dist/chunks/viewerRuntimeHosts-D3Jyfx0-.js index 6190750f..b7725742 100644 --- a/dist/chunks/viewerRuntimeHosts-DQcoOjsY.js +++ b/dist/chunks/viewerRuntimeHosts-D3Jyfx0-.js @@ -1,4 +1,4 @@ -import { Ct as e, St as t, _t as n, gt as r, ht as i, k as a, m as o, nt as s, o as c, tt as l, vt as u, xt as d } from "./events-DxfljH4A.js"; +import { Ct as e, Tt as t, _t as n, bt as r, it as i, k as a, m as o, o as s, rt as c, vt as l, wt as u, yt as d } from "./events-BRfpU-6M.js"; // ui/app/settingsStore.ts var f = "mjrSettings", p = "mjrMinimapSettings", m = /* @__PURE__ */ new Set([ "POST", @@ -429,28 +429,28 @@ function ye(e) { function be(e, t, n) { return e && t ? `${e}: ${t}` : t || e || n || ""; } -function k(e, t = "info", n = null) { - if (!e || typeof e != "object") return null; - let r = O(e.title || e.summary), i = O(e.detail), a = O(e.message || be(r, i, O(e.fallbackMessage))); - if (!a) return null; - let o = ve(e.durationMs ?? e.duration ?? n), s = Number(e.createdAt), c = Number.isFinite(s) && s > 0 ? s : Date.now(), l = typeof e.persistent == "boolean" ? e.persistent : !(Number.isFinite(o) && (o ?? 0) > 0); +function k(t, n = "info", r = null) { + if (!t || typeof t != "object") return null; + let i = O(t.title || t.summary), a = O(t.detail), o = O(t.message || be(i, a, O(t.fallbackMessage))); + if (!o) return null; + let s = ve(t.durationMs ?? t.duration ?? r), c = Number(t.createdAt), l = Number.isFinite(c) && c > 0 ? c : Date.now(), u = typeof t.persistent == "boolean" ? t.persistent : !(Number.isFinite(s) && (s ?? 0) > 0); return { - id: O(e.id) || d(`th-${c}-`, 4), - message: a, - title: r, - detail: i, - type: _e(e.type || t), - createdAt: c, - durationMs: o, - persistent: l, - source: O(e.source), - trackId: O(e.trackId), - status: O(e.status), - operation: O(e.operation), - progress: ye(e.progress), - forceStore: !!e.forceStore, - actionLabel: O(e.actionLabel), - actionUrl: O(e.actionUrl) + id: O(t.id) || e(`th-${l}-`, 4), + message: o, + title: i, + detail: a, + type: _e(t.type || n), + createdAt: l, + durationMs: s, + persistent: u, + source: O(t.source), + trackId: O(t.trackId), + status: O(t.status), + operation: O(t.operation), + progress: ye(t.progress), + forceStore: !!t.forceStore, + actionLabel: O(t.actionLabel), + actionUrl: O(t.actionUrl) }; } function A() { @@ -944,99 +944,99 @@ async function Qe(e) { } : Y("/mjr/am/settings/probe-backend", { mode: e }); } async function $e() { - return J(l.SETTINGS_METADATA_FALLBACK); + return J(c.SETTINGS_METADATA_FALLBACK); } async function et({ image: e, media: t } = {}) { - return Y(l.SETTINGS_METADATA_FALLBACK, { + return Y(c.SETTINGS_METADATA_FALLBACK, { image: e, media: t }); } async function tt() { - return J(l.SETTINGS_VECTOR_SEARCH); + return J(c.SETTINGS_VECTOR_SEARCH); } async function nt(e = !0) { if (e && typeof e == "object") { let t = {}; - return "enabled" in e && (t.enabled = !!e.enabled), "caption_on_index" in e && (t.caption_on_index = !!e.caption_on_index), "captionOnIndex" in e && (t.caption_on_index = !!e.captionOnIndex), "index_on_scan" in e && (t.index_on_scan = !!e.index_on_scan), "indexOnScan" in e && (t.index_on_scan = !!e.indexOnScan), "unload_after_use" in e && (t.unload_after_use = !!e.unload_after_use), "unloadAfterUse" in e && (t.unload_after_use = !!e.unloadAfterUse), "concurrency" in e && (t.concurrency = Number(e.concurrency) || 1), "vectorConcurrency" in e && (t.concurrency = Number(e.vectorConcurrency) || 1), Y(l.SETTINGS_VECTOR_SEARCH, t); + return "enabled" in e && (t.enabled = !!e.enabled), "caption_on_index" in e && (t.caption_on_index = !!e.caption_on_index), "captionOnIndex" in e && (t.caption_on_index = !!e.captionOnIndex), "index_on_scan" in e && (t.index_on_scan = !!e.index_on_scan), "indexOnScan" in e && (t.index_on_scan = !!e.indexOnScan), "unload_after_use" in e && (t.unload_after_use = !!e.unload_after_use), "unloadAfterUse" in e && (t.unload_after_use = !!e.unloadAfterUse), "concurrency" in e && (t.concurrency = Number(e.concurrency) || 1), "vectorConcurrency" in e && (t.concurrency = Number(e.vectorConcurrency) || 1), Y(c.SETTINGS_VECTOR_SEARCH, t); } - return Y(l.SETTINGS_VECTOR_SEARCH, { enabled: !!e }); + return Y(c.SETTINGS_VECTOR_SEARCH, { enabled: !!e }); } async function rt() { - return Y(l.SETTINGS_VECTOR_SEARCH_UNLOAD, {}); + return Y(c.SETTINGS_VECTOR_SEARCH_UNLOAD, {}); } async function it() { - return J(l.SETTINGS_EXECUTION_GROUPING); + return J(c.SETTINGS_EXECUTION_GROUPING); } async function at(e = !0) { - return Y(l.SETTINGS_EXECUTION_GROUPING, { enabled: !!e }); + return Y(c.SETTINGS_EXECUTION_GROUPING, { enabled: !!e }); } async function ot(e = !0) { - return Y(l.SETTINGS_BROWSER_SHOW_FOLDERS, { enabled: !!e }); + return Y(c.SETTINGS_BROWSER_SHOW_FOLDERS, { enabled: !!e }); } async function st() { - return J(l.SETTINGS_HUGGINGFACE); + return J(c.SETTINGS_HUGGINGFACE); } async function ct(e = "") { - return Y(l.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() }); + return Y(c.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() }); } async function lt() { - return J(l.SETTINGS_AI_LOGGING); + return J(c.SETTINGS_AI_LOGGING); } async function ut(e = !1) { - return Y(l.SETTINGS_AI_LOGGING, { enabled: !!e }); + return Y(c.SETTINGS_AI_LOGGING, { enabled: !!e }); } async function dt() { - return J(l.SETTINGS_ROUTE_LOGGING); + return J(c.SETTINGS_ROUTE_LOGGING); } async function ft(e = !1) { - return Y(l.SETTINGS_ROUTE_LOGGING, { enabled: !!e }); + return Y(c.SETTINGS_ROUTE_LOGGING, { enabled: !!e }); } async function pt() { - return J(l.SETTINGS_STARTUP_LOGGING); + return J(c.SETTINGS_STARTUP_LOGGING); } async function mt(e = !1) { - return Y(l.SETTINGS_STARTUP_LOGGING, { enabled: !!e }); + return Y(c.SETTINGS_STARTUP_LOGGING, { enabled: !!e }); } async function ht() { - return J(l.SETTINGS_LTXAV_RGB_FALLBACK); + return J(c.SETTINGS_LTXAV_RGB_FALLBACK); } async function gt(e = !1) { - return Y(l.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e }); + return Y(c.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e }); } async function _t() { - return J(l.SETTINGS_JXL); + return J(c.SETTINGS_JXL); } async function vt(e = !1) { - return Y(l.SETTINGS_JXL, { enabled: !!e }); + return Y(c.SETTINGS_JXL, { enabled: !!e }); } async function yt() { - return J(l.SETTINGS_OUTPUT_DIRECTORY); + return J(c.SETTINGS_OUTPUT_DIRECTORY); } async function bt() { - return J(l.SETTINGS_INPUT_DIRECTORY); + return J(c.SETTINGS_INPUT_DIRECTORY); } async function xt(e, t = {}) { let n = String(e ?? "").trim(); - return Y(l.SETTINGS_INPUT_DIRECTORY, { input_directory: n }, t); + return Y(c.SETTINGS_INPUT_DIRECTORY, { input_directory: n }, t); } async function St(e, t = {}) { let n = String(e ?? "").trim(); - return Y(l.SETTINGS_OUTPUT_DIRECTORY, { output_directory: n }, t); + return Y(c.SETTINGS_OUTPUT_DIRECTORY, { output_directory: n }, t); } async function Ct() { - return J(l.SETTINGS_INDEX_DIRECTORY); + return J(c.SETTINGS_INDEX_DIRECTORY); } async function wt(e, t = {}) { let n = String(e ?? "").trim(); - return Y(l.SETTINGS_INDEX_DIRECTORY, { index_directory: n }, t); + return Y(c.SETTINGS_INDEX_DIRECTORY, { index_directory: n }, t); } async function Tt(e = {}) { - return J(l.SETTINGS_WORKFLOW_ROOTS, e); + return J(c.SETTINGS_WORKFLOW_ROOTS, e); } async function Et(e, t = {}) { let n = Array.isArray(e) ? e.map((e) => String(e ?? "").trim()).filter(Boolean) : String(e ?? "").trim(); - return Y(l.SETTINGS_WORKFLOW_ROOTS, { workflow_roots: n }, t); + return Y(c.SETTINGS_WORKFLOW_ROOTS, { workflow_roots: n }, t); } async function Dt() { return J("/mjr/am/settings/security"); @@ -1056,14 +1056,14 @@ async function kt() { } async function At(e) { if (e && typeof e == "object") { - let n = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); - return n ? Y("/mjr/am/open-in-folder", { filepath: n }) : Y("/mjr/am/open-in-folder", { asset_id: t(e.id) }); + let t = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); + return t ? Y("/mjr/am/open-in-folder", { filepath: t }) : Y("/mjr/am/open-in-folder", { asset_id: u(e.id) }); } - return Y("/mjr/am/open-in-folder", { asset_id: t(e) }); + return Y("/mjr/am/open-in-folder", { asset_id: u(e) }); } async function jt(e) { let t = ""; - return t = e && typeof e == "object" ? String(e.filepath || e.path || e?.file_info?.filepath || "").trim() : String(e || "").trim(), t ? Y(l.COLLECT_FILES, { filepath: t }) : { + return t = e && typeof e == "object" ? String(e.filepath || e.path || e?.file_info?.filepath || "").trim() : String(e || "").trim(), t ? Y(c.COLLECT_FILES, { filepath: t }) : { ok: !1, data: null, error: "Missing file path", @@ -1075,7 +1075,7 @@ async function Mt({ op: e = "", path: t = "", name: n = "", destination: r = "", op: String(e || "").trim().toLowerCase(), path: String(t || "").trim() }; - return n != null && String(n).trim() && (o.name = String(n).trim()), r != null && String(r).trim() && (o.destination = String(r).trim()), o.op === "delete" && (o.recursive = !!i), Y(l.BROWSER_FOLDER_OP, o, a); + return n != null && String(n).trim() && (o.name = String(n).trim()), r != null && String(r).trim() && (o.destination = String(r).trim()), o.op === "delete" && (o.recursive = !!i), Y(c.BROWSER_FOLDER_OP, o, a); } async function Nt(e = {}) { let t = (e, t) => e == null ? t : !!e, n = String(e.scope || "output").trim().toLowerCase() || "output", r = e.customRootId ?? e.custom_root_id ?? e.rootId ?? e.root_id ?? e.customRoot ?? null, i = { @@ -1093,42 +1093,42 @@ async function Nt(e = {}) { background_metadata: t(e.backgroundMetadata ?? e.background_metadata, !0), maintenance_force: t(e.maintenanceForce ?? e.maintenance_force, !1) }; - return r && (i.custom_root_id = String(r)), Y(l.INDEX_RESET, i); + return r && (i.custom_root_id = String(r)), Y(c.INDEX_RESET, i); } async function Pt({ scope: e = "output", customRootId: t = "" } = {}) { let n = String(e || "output").trim().toLowerCase() || "output", r = String(t || "").trim(), i = { scope: n }; - return r && (i.custom_root_id = r), Y(l.WATCHER_SCOPE, i); + return r && (i.custom_root_id = r), Y(c.WATCHER_SCOPE, i); } async function Ft(e = {}) { - return J(l.WATCHER_STATUS, e); + return J(c.WATCHER_STATUS, e); } async function It(e = !0) { - return Y(l.WATCHER_TOGGLE, { enabled: !!e }); + return Y(c.WATCHER_TOGGLE, { enabled: !!e }); } async function Lt() { - return J(l.WATCHER_SETTINGS); + return J(c.WATCHER_SETTINGS); } async function Rt(e = {}) { - return Y(l.WATCHER_SETTINGS, e); + return Y(c.WATCHER_SETTINGS, e); } async function zt(e = {}) { - return J(l.TOOLS_STATUS, e); + return J(c.TOOLS_STATUS, e); } async function Bt(e = {}) { - return J(l.STATUS, e); + return J(c.STATUS, e); } async function Vt() { return Y("/mjr/am/db/force-delete", {}); } async function Ht(e = {}) { - return J(l.DB_BACKUPS, e); + return J(c.DB_BACKUPS, e); } async function Ut() { - return Y(l.DB_BACKUP_SAVE, {}); + return Y(c.DB_BACKUP_SAVE, {}); } async function Wt({ name: e = "", useLatest: t = !1 } = {}) { let n = {}; - return e && (n.name = String(e)), t && (n.use_latest = !0), Y(l.DB_BACKUP_RESTORE, n); + return e && (n.name = String(e)), t && (n.use_latest = !0), Y(c.DB_BACKUP_RESTORE, n); } async function Gt(e = 250) { return Y("/mjr/am/duplicates/analyze", { limit: Math.max(10, Math.min(5e3, Number(e) || 250)) }); @@ -1144,18 +1144,18 @@ async function qt(e, t = []) { }); } async function Jt(e) { - let n, r; + let t, n; if (e && typeof e == "object") { - n = t(e.id); - let i = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); - r = n ? { asset_id: n } : { filepath: i }; - } else n = t(e), r = { asset_id: n }; - let i = await Y("/mjr/am/asset/delete", r); - return i?.ok && n && Xt([n]), i; + t = u(e.id); + let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); + n = t ? { asset_id: t } : { filepath: r }; + } else t = u(e), n = { asset_id: t }; + let r = await Y("/mjr/am/asset/delete", n); + return r?.ok && t && Xt([t]), r; } async function Yt(e) { - let n = Array.isArray(e) ? e.map((e) => t(e)).filter(Boolean) : [], r = await Y("/mjr/am/assets/delete", { ids: n }); - return r?.ok && Xt(n), r; + let t = Array.isArray(e) ? e.map((e) => u(e)).filter(Boolean) : [], n = await Y("/mjr/am/assets/delete", { ids: t }); + return n?.ok && Xt(t), n; } function Xt(e) { try { @@ -1166,43 +1166,43 @@ function Xt(e) { console.debug?.(e); } } -async function Zt(e, n) { - let r; +async function Zt(e, t) { + let n; if (e && typeof e == "object") { - r = t(e.id); - let i = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), a = r ? await Y("/mjr/am/asset/rename", { - asset_id: r, - new_name: n + n = u(e.id); + let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), i = n ? await Y("/mjr/am/asset/rename", { + asset_id: n, + new_name: t }) : await Y("/mjr/am/asset/rename", { - filepath: i, - new_name: n + filepath: r, + new_name: t }); - if (a?.ok && r) try { - let e = await In(r); - e?.ok && e?.data && (a.data = { - ...a.data || {}, + if (i?.ok && n) try { + let e = await In(n); + e?.ok && e?.data && (i.data = { + ...i.data || {}, asset: e.data }); } catch (e) { console.debug?.(e); } - return a; + return i; } - r = t(e); - let i = await Y("/mjr/am/asset/rename", { - asset_id: r, - new_name: n + n = u(e); + let r = await Y("/mjr/am/asset/rename", { + asset_id: n, + new_name: t }); - if (i?.ok && r) try { - let e = await In(r); - e?.ok && e?.data && (i.data = { - ...i.data || {}, + if (r?.ok && n) try { + let e = await In(n); + e?.ok && e?.data && (r.data = { + ...r.data || {}, asset: e.data }); } catch (e) { console.debug?.(e); } - return i; + return r; } async function Qt() { let e = typeof AbortController < "u" ? new AbortController() : null, t = null; @@ -1237,8 +1237,8 @@ async function an(e, t = 20) { ok: !1, error: "Empty query" }; - let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), c = `${l.VECTOR_SEARCH}?q=${encodeURIComponent(n)}&top_k=${i}`; - return a && (c += `&scope=${encodeURIComponent(a)}`), o && (c += `&custom_root_id=${encodeURIComponent(o)}`), c = s(c, { + let r = t && typeof t == "object" ? t : { topK: Number(t) }, a = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), o = String(r?.scope || "").trim(), s = String(r?.customRootId || "").trim(), l = `${c.VECTOR_SEARCH}?q=${encodeURIComponent(n)}&top_k=${a}`; + return o && (l += `&scope=${encodeURIComponent(o)}`), s && (l += `&custom_root_id=${encodeURIComponent(s)}`), l = i(l, { subfolder: r?.subfolder ?? null, kind: r?.kind ?? null, hasWorkflow: r?.hasWorkflow ?? null, @@ -1253,7 +1253,7 @@ async function an(e, t = 20) { workflowId: r?.workflowId ?? null, dateRange: r?.dateRange ?? null, dateExact: r?.dateExact ?? null - }), J(c, { timeoutMs: 12e4 }); + }), J(l, { timeoutMs: 12e4 }); } async function on(e, t = 20) { let n = String(e || "").trim(); @@ -1261,34 +1261,34 @@ async function on(e, t = 20) { ok: !1, error: "Missing asset ID" }; - let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), s = `${l.VECTOR_SIMILAR}/${encodeURIComponent(n)}?top_k=${i}`; + let r = t && typeof t == "object" ? t : { topK: Number(t) }, i = Math.max(1, Math.min(200, Number(r?.topK ?? 20) || 20)), a = String(r?.scope || "").trim(), o = String(r?.customRootId || "").trim(), s = `${c.VECTOR_SIMILAR}/${encodeURIComponent(n)}?top_k=${i}`; return a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`), J(s, { dedupeKey: `vec:${n}:${i}:${a}:${o}` }); } async function sn(e) { let t = String(e || "").trim(); - return t ? J(`${l.VECTOR_ALIGNMENT}/${encodeURIComponent(t)}`) : { + return t ? J(`${c.VECTOR_ALIGNMENT}/${encodeURIComponent(t)}`) : { ok: !1, error: "Missing asset ID" }; } async function cn(e) { let t = String(e || "").trim(); - return t ? Y(`${l.VECTOR_INDEX}/${encodeURIComponent(t)}`, {}) : { + return t ? Y(`${c.VECTOR_INDEX}/${encodeURIComponent(t)}`, {}) : { ok: !1, error: "Missing asset ID" }; } async function ln() { - return J(l.VECTOR_STATS); + return J(c.VECTOR_STATS); } async function un(e = 64, t = {}) { - let n = Math.max(1, Math.min(200, e)), r = typeof t?.onProgress == "function" ? t.onProgress : null, i = String(t?.scope || "").trim().toLowerCase(), a = String(t?.customRootId ?? t?.custom_root_id ?? "").trim(), o = `${l.VECTOR_BACKFILL}?batch_size=${n}&async=1`; + let n = Math.max(1, Math.min(200, e)), r = typeof t?.onProgress == "function" ? t.onProgress : null, i = String(t?.scope || "").trim().toLowerCase(), a = String(t?.customRootId ?? t?.custom_root_id ?? "").trim(), o = `${c.VECTOR_BACKFILL}?batch_size=${n}&async=1`; i && (o += `&scope=${encodeURIComponent(i)}`), a && (o += `&custom_root_id=${encodeURIComponent(a)}`); let s = await Y(o, {}, { timeoutMs: 3e4 }); if (!s?.ok) return s; - let c = s?.data || {}, u = String(c?.status || "").toLowerCase(), d = String(c?.backfill_id || "").trim(); + let l = s?.data || {}, u = String(l?.status || "").toLowerCase(), d = String(l?.backfill_id || "").trim(); try { - r?.(c); + r?.(l); } catch (e) { console.debug?.(e); } @@ -1300,7 +1300,7 @@ async function un(e = 64, t = {}) { let f = Number(t?.pollIntervalMs), p = Number(t?.pollTimeoutMs), m = Number.isFinite(f) ? Math.max(500, Math.min(1e4, Math.floor(f))) : vn, h = Number.isFinite(p) ? Math.max(1e4, Math.min(bn, Math.floor(p))) : yn, ee = Date.now(), g = null; for (; Date.now() - ee < h;) { await S(m); - let e = await J(`${l.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }); + let e = await J(`${c.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }); if (!e?.ok) { g = e; continue; @@ -1326,7 +1326,7 @@ async function un(e = 64, t = {}) { status: 500 }; } - let _ = await J(`${l.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }), v = _?.data || g?.data || {}, y = String(v?.status || "").toLowerCase(); + let _ = await J(`${c.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }), v = _?.data || g?.data || {}, y = String(v?.status || "").toLowerCase(); if (_?.ok && [ "queued", "running", @@ -1368,23 +1368,23 @@ async function un(e = 64, t = {}) { } async function dn(e) { let t = String(e || "").trim(); - return t ? Y(`${l.VECTOR_CAPTION}/${encodeURIComponent(t)}`, {}) : { + return t ? Y(`${c.VECTOR_CAPTION}/${encodeURIComponent(t)}`, {}) : { ok: !1, error: "Missing asset ID" }; } -async function fn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", subfolder: i = null, kind: a = null, hasWorkflow: o = null, minRating: c = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: h = null, workflowType: ee = null, workflowId: g = null, dateRange: _ = null, dateExact: v = null } = {}) { +async function fn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", subfolder: a = null, kind: o = null, hasWorkflow: s = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: h = null, workflowType: ee = null, workflowId: g = null, dateRange: _ = null, dateExact: v = null } = {}) { let y = String(e || "").trim(); if (!y) return { ok: !1, error: "Empty query" }; - let b = `${l.HYBRID_SEARCH}?q=${encodeURIComponent(y)}&top_k=${Math.max(1, Math.min(200, t))}&scope=${encodeURIComponent(n)}`; - return r && (b += `&custom_root_id=${encodeURIComponent(r)}`), b = s(b, { - subfolder: i, - kind: a, - hasWorkflow: o, - minRating: c, + let b = `${c.HYBRID_SEARCH}?q=${encodeURIComponent(y)}&top_k=${Math.max(1, Math.min(200, t))}&scope=${encodeURIComponent(n)}`; + return r && (b += `&custom_root_id=${encodeURIComponent(r)}`), b = i(b, { + subfolder: a, + kind: o, + hasWorkflow: s, + minRating: l, minSizeMB: u, maxSizeMB: d, minWidth: f, @@ -1398,7 +1398,7 @@ async function fn(e, { topK: t = 50, scope: n = "output", customRootId: r = "", }), J(b, { timeoutMs: 12e4 }); } async function pn(e = 8) { - return Y(l.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) }); + return Y(c.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) }); } // ui/api/client.ts var mn = 3e4, hn = "__MJR_API_CLIENT__", gn = 2e3, _n = 200, vn = 1e3, yn = 18e5, bn = 432e5, H = "settings", xn = "available-tags", U = E({ @@ -1511,27 +1511,27 @@ async function J(e, t = {}) { async function Y(e, t, n = {}) { return q.post(e, t, n); } -async function Nn(n, r, i = {}) { - let a = jn(), o = n && typeof n == "object" ? n : null, s = o ? o.id : n, c = t(s), l = { rating: Math.max(0, Math.min(5, Number(r) || 0)) }; - return c ? l.asset_id = c : o && (l.filepath = o.filepath || o.path || o?.file_info?.filepath || "", l.type = o.type || "output", l.root_id = e(o)), Mn("/mjr/am/asset/rating", { - ...i, +async function Nn(e, n, r = {}) { + let i = jn(), a = e && typeof e == "object" ? e : null, o = a ? a.id : e, s = u(o), c = { rating: Math.max(0, Math.min(5, Number(n) || 0)) }; + return s ? c.asset_id = s : a && (c.filepath = a.filepath || a.path || a?.file_info?.filepath || "", c.type = a.type || "output", c.root_id = t(a)), Mn("/mjr/am/asset/rating", { + ...r, method: "POST", headers: { "Content-Type": "application/json", - ...a ? { "X-MJR-RTSYNC": "on" } : {} + ...i ? { "X-MJR-RTSYNC": "on" } : {} }, - body: JSON.stringify(l) + body: JSON.stringify(c) }); } -async function Pn(n, r, i = {}) { - let a = jn(), o = n && typeof n == "object" ? n : null, s = o ? o.id : n, c = t(s), u = String(o?.kind || o?.type || "").trim().toLowerCase() === "workflow", d = String(o?.filepath || o?.path || o?.file_info?.filepath || "").trim(), f = { tags: Array.isArray(r) ? r : [] }; - u && d ? f.filepath = d : c ? f.asset_id = c : o && (f.filepath = o.filepath || o.path || o?.file_info?.filepath || "", f.type = o.type || "output", f.root_id = e(o)); - let p = await Mn(u && d ? l.WORKFLOWS_TAGS : "/mjr/am/asset/tags", { - ...i, +async function Pn(e, n, r = {}) { + let i = jn(), a = e && typeof e == "object" ? e : null, o = a ? a.id : e, s = u(o), l = String(a?.kind || a?.type || "").trim().toLowerCase() === "workflow", d = String(a?.filepath || a?.path || a?.file_info?.filepath || "").trim(), f = { tags: Array.isArray(n) ? n : [] }; + l && d ? f.filepath = d : s ? f.asset_id = s : a && (f.filepath = a.filepath || a.path || a?.file_info?.filepath || "", f.type = a.type || "output", f.root_id = t(a)); + let p = await Mn(l && d ? c.WORKFLOWS_TAGS : "/mjr/am/asset/tags", { + ...r, method: "POST", headers: { "Content-Type": "application/json", - ...a ? { "X-MJR-RTSYNC": "on" } : {} + ...i ? { "X-MJR-RTSYNC": "on" } : {} }, body: JSON.stringify(f) }); @@ -1556,25 +1556,25 @@ async function Fn() { } return t; } -async function In(e, n = {}) { - let r = encodeURIComponent(t(e)); - return J(`/mjr/am/asset/${r}`, { - ...n, - dedupeKey: n?.dedupeKey || `meta:${r}` +async function In(e, t = {}) { + let n = encodeURIComponent(u(e)); + return J(`/mjr/am/asset/${n}`, { + ...t, + dedupeKey: t?.dedupeKey || `meta:${n}` }); } -async function Ln(e, n = {}) { - let r = t(e); - if (!r) return { +async function Ln(e, t = {}) { + let n = u(e); + if (!n) return { ok: !1, data: null, error: "Missing assetId", code: "INVALID_INPUT" }; - let i = `/mjr/am/viewer/info?asset_id=${encodeURIComponent(r)}`; - n.refresh && (i += "&refresh=1"); - let { refresh: a, ...o } = n; - return J(i, o); + let r = `/mjr/am/viewer/info?asset_id=${encodeURIComponent(n)}`; + t.refresh && (r += "&refresh=1"); + let { refresh: i, ...a } = t; + return J(r, a); } async function Rn(e, t = {}) { let n = Array.isArray(e) ? e : [], r = []; @@ -1590,15 +1590,6 @@ async function Rn(e, t = {}) { }; } async function zn(e, t = {}) { - let n = i(e); - return n ? J(n, t) : { - ok: !1, - data: null, - error: "Missing workflow filepath", - code: "INVALID_INPUT" - }; -} -async function Bn(e, t = {}) { let r = n(e); return r ? J(r, t) : { ok: !1, @@ -1607,8 +1598,17 @@ async function Bn(e, t = {}) { code: "INVALID_INPUT" }; } +async function Bn(e, t = {}) { + let n = d(e); + return n ? J(n, t) : { + ok: !1, + data: null, + error: "Missing workflow filepath", + code: "INVALID_INPUT" + }; +} async function Vn(e, t = {}) { - let n = u(e); + let n = r(e); return n ? J(n, t) : { ok: !1, data: null, @@ -1617,16 +1617,16 @@ async function Vn(e, t = {}) { }; } async function Hn(e, t = "", n = {}) { - let i = r(e, t); - return i ? J(i, n) : { + let r = l(e, t); + return r ? J(r, n) : { ok: !1, data: null, error: "Missing workflow filepath", code: "INVALID_INPUT" }; } -async function Un({ workflow: e = null, name: t = "", category: n = "", overwrite: r = !1, filepath: i = "", task: a = "", model_family: o = "", provider: s = "", runs_on: c = "", notes: u = "" } = {}, d = {}) { - return Y(l.WORKFLOWS_SAVE, { +async function Un({ workflow: e = null, name: t = "", category: n = "", overwrite: r = !1, filepath: i = "", task: a = "", model_family: o = "", provider: s = "", runs_on: l = "", notes: u = "" } = {}, d = {}) { + return Y(c.WORKFLOWS_SAVE, { workflow: e, name: t, category: n, @@ -1635,37 +1635,37 @@ async function Un({ workflow: e = null, name: t = "", category: n = "", overwrit task: a, model_family: o, provider: s, - runs_on: c, + runs_on: l, notes: u }, d); } async function Wn({ filepath: e = "", name: t = "" } = {}, n = {}) { - return Y(l.WORKFLOWS_DUPLICATE, { + return Y(c.WORKFLOWS_DUPLICATE, { filepath: e, name: t }, n); } async function Gn({ filepath: e = "", name: t = "", category: n = "" } = {}, r = {}) { - return Y(l.WORKFLOWS_MOVE, { + return Y(c.WORKFLOWS_MOVE, { filepath: e, name: t, category: n }, r); } async function Kn({ filepath: e = "" } = {}, t = {}) { - return Y(l.WORKFLOWS_DELETE, { filepath: e }, t); + return Y(c.WORKFLOWS_DELETE, { filepath: e }, t); } async function qn({ filepath: e = "" } = {}, t = {}) { - return Y(l.WORKFLOWS_MARK_LOADED, { filepath: e }, t); + return Y(c.WORKFLOWS_MARK_LOADED, { filepath: e }, t); } async function Jn({ filepath: e = "", favorite: t = !1 } = {}, n = {}) { - return Y(l.WORKFLOWS_FAVORITE, { + return Y(c.WORKFLOWS_FAVORITE, { filepath: e, favorite: !!t }, n); } async function Yn({ filepath: e = "", task: t = "", model_family: n = "", provider: r = "", runs_on: i = "", notes: a = "" } = {}, o = {}) { - return Y(l.WORKFLOWS_INFO, { + return Y(c.WORKFLOWS_INFO, { filepath: e, task: t, model_family: n, @@ -1676,17 +1676,17 @@ async function Yn({ filepath: e = "", task: t = "", model_family: n = "", provid } async function Xn({ filepath: e = "", limit: t = 12 } = {}, n = {}) { let r = Math.max(1, Math.min(50, Number(t) || 12)); - return J(`${l.WORKFLOWS_THUMBNAIL_CANDIDATES}?filepath=${encodeURIComponent(String(e || "").trim())}&limit=${encodeURIComponent(String(r))}`, n); + return J(`${c.WORKFLOWS_THUMBNAIL_CANDIDATES}?filepath=${encodeURIComponent(String(e || "").trim())}&limit=${encodeURIComponent(String(r))}`, n); } async function Zn(e = {}) { - return J(l.WORKFLOWS_MODEL_FAMILIES, e); + return J(c.WORKFLOWS_MODEL_FAMILIES, e); } async function Qn({ q: e = "*", limit: t = 100, offset: n = 0, sort: r = "mtime" } = {}, i = {}) { let a = Math.max(1, Math.min(500, Number(t) || 100)), o = Math.max(0, Number(n) || 0); - return J(`${l.LIST}?scope=workflow&q=${encodeURIComponent(String(e || "*"))}&limit=${encodeURIComponent(String(a))}&offset=${encodeURIComponent(String(o))}&sort=${encodeURIComponent(String(r || "mtime"))}`, i); + return J(`${c.LIST}?scope=workflow&q=${encodeURIComponent(String(e || "*"))}&limit=${encodeURIComponent(String(a))}&offset=${encodeURIComponent(String(o))}&sort=${encodeURIComponent(String(r || "mtime"))}`, i); } async function $n({ filepath: e = "", source_filepath: t = "" } = {}, n = {}) { - return Y(l.WORKFLOWS_THUMBNAIL_SET, { + return Y(c.WORKFLOWS_THUMBNAIL_SET, { filepath: e, source_filepath: t }, n); @@ -1725,8 +1725,8 @@ async function tr({ filepath: e = "", root_id: t = "", subfolder: n = "" } = {}, } catch (e) { console.debug?.(e); } - let i = String(e || "").trim(), a = String(t || "").trim(), o = String(n || "").trim(), s = l.FOLDER_INFO, c = []; - i ? (c.push(`filepath=${encodeURIComponent(i)}`), c.push("browser_mode=1")) : (a && c.push(`root_id=${encodeURIComponent(a)}`), o && c.push(`subfolder=${encodeURIComponent(o)}`)), c.length && (s += `?${c.join("&")}`); + let i = String(e || "").trim(), a = String(t || "").trim(), o = String(n || "").trim(), s = c.FOLDER_INFO, l = []; + i ? (l.push(`filepath=${encodeURIComponent(i)}`), l.push("browser_mode=1")) : (a && l.push(`root_id=${encodeURIComponent(a)}`), o && l.push(`subfolder=${encodeURIComponent(o)}`)), l.length && (s += `?${l.join("&")}`); let u = await J(s, r); try { !u?.ok && Number(u?.status || 0) === 404 && (globalThis.__mjrFolderInfoSupported = !1); @@ -1738,17 +1738,17 @@ async function tr({ filepath: e = "", root_id: t = "", subfolder: n = "" } = {}, // ui/utils/logging.ts function nr(e, ...t) { try { - c.DEBUG_VERBOSE_ERRORS && console.debug(e, ...t); + s.DEBUG_VERBOSE_ERRORS && console.debug(e, ...t); } catch {} } function rr(e, t = "Majoor", { showToast: n = !1, toastType: r = "error" } = {}) { let i = e?.message || String(e || "Unknown error"); try { - c.DEBUG_VERBOSE_ERRORS ? console.error(`[Majoor][${t}]`, i, e) : console.debug(`[Majoor][${t}]`, i); + s.DEBUG_VERBOSE_ERRORS ? console.error(`[Majoor][${t}]`, i, e) : console.debug(`[Majoor][${t}]`, i); } catch (e) { console.debug?.(e); } - if (n && c.DEBUG_VERBOSE_ERRORS) try { + if (n && s.DEBUG_VERBOSE_ERRORS) try { N(`${t}: ${i}`, r, 4e3); } catch (e) { console.debug?.(e); diff --git a/dist/entry.js b/dist/entry.js index 51a2d33f..77cea6da 100644 --- a/dist/entry.js +++ b/dist/entry.js @@ -1,25 +1,25 @@ -import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, st as ye, tn as be, u as xe, ut as Se, vt as Ce, w as we, xt as Te, y as Ee, yt as De, z as Oe, zt as ke } from "./chunks/viewerRuntimeHosts-DQcoOjsY.js"; -import { $ as Ae, A as je, Ct as Me, F as Ne, G as Pe, H as Fe, K as Ie, L as Le, Q as Re, St as ze, U as Be, W as Ve, X as He, Z as Ue, _ as We, at as Ge, bt as Ke, ct as qe, dt as Je, et as Ye, ft as Xe, g as Ze, it as Qe, j as $e, lt as et, m as R, n as z, o as B, ot as tt, pt as nt, q as rt, r as V, rt as it, st as at, t as ot, tt as st, ut as ct, xt as lt, yt as ut } from "./chunks/events-DxfljH4A.js"; +import { $t as e, A as t, B as n, Bt as r, C as i, D as a, E as o, Et as s, G as c, H as l, J as u, Jt as d, L as f, Lt as p, M as m, N as h, O as g, P as _, Rt as v, S as y, U as b, Ut as x, V as S, Vt as C, W as w, Wt as T, Xt as E, Yt as D, _ as O, _t as k, an as A, b as j, bt as M, c as N, d as P, en as ee, f as te, ft as F, g as I, gt as ne, h as re, ht as ie, in as ae, j as oe, jt as se, k as L, l as ce, m as le, mt as ue, nn as de, o as fe, on as pe, pt as me, q as he, qt as ge, rn as _e, s as ve, st as ye, tn as be, u as xe, ut as Se, vt as Ce, w as we, xt as Te, y as Ee, yt as De, z as Oe, zt as ke } from "./chunks/viewerRuntimeHosts-D3Jyfx0-.js"; +import { $ as Ae, A as je, Ct as Me, F as Ne, J as Pe, K as Fe, L as Ie, Q as Le, St as Re, Tt as ze, U as Be, W as Ve, Y as He, _ as Ue, at as We, ct as Ge, dt as Ke, et as qe, ft as Je, g as Ye, ht as Xe, j as Ze, lt as Qe, m as R, mt as $e, n as et, nt as z, o as B, ot as tt, pt as nt, q as rt, r as V, rt as it, st as at, t as ot, tt as st, ut as ct, wt as lt, xt as ut } from "./chunks/events-BRfpU-6M.js"; import { a as dt, i as ft, n as pt, t as mt } from "./chunks/graphTraversal-DTdQWkn5.js"; -import { A as ht, B as gt, C as _t, D as vt, E as yt, F as bt, G as xt, H as St, I as Ct, J as wt, L as Tt, M as Et, N as Dt, O as Ot, P as kt, R as At, S as jt, T as Mt, U as Nt, V as Pt, W as Ft, Y as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-DI9upE3v.js"; -import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, o as Fn, p as In, q as Ln, s as Rn, t as zn, u as Bn, w as Vn, z as Hn } from "./chunks/SidebarWorkflowSection-BHtHjc_k.js"; -import { _ as Un, i as Wn, n as Gn, p as Kn, t as qn } from "./chunks/openMajoorSettings-BfOHsVlq.js"; -import { a as Jn, c as Yn, l as Xn, o as Zn, s as Qn, u as $n } from "./chunks/floatingViewerManager-DKOeP6-T.js"; -import { A as er, B as tr, C as H, D as nr, E as U, G as rr, H as ir, I as ar, J as W, K as or, L as sr, M as cr, N as lr, O as G, P as ur, R as dr, S as fr, T as K, U as pr, V as q, W as mr, Y as hr, at as gr, b as _r, ct as vr, dt as yr, ft as J, it as br, j as Y, k as X, lt as Z, nt as xr, q as Sr, rt as Q, tt as Cr, ut as wr, v as Tr, w as Er, x as Dr, y as Or, z as kr } from "./chunks/mjr-primevue-BRqtdXzb.js"; -import { n as Ar, r as jr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; -import { t as Mr } from "./chunks/TagsEditor-7DAMS3OV.js"; -import { app as Nr } from "../../scripts/app.js"; -function Pr(e = null) { +import { A as ht, B as gt, C as _t, D as vt, E as yt, F as bt, G as xt, H as St, I as Ct, J as wt, L as Tt, M as Et, N as Dt, O as Ot, P as kt, R as At, S as jt, T as Mt, U as Nt, V as Pt, W as Ft, Y as It, _ as Lt, b as Rt, d as zt, g as Bt, j as Vt, k as Ht, q as Ut, v as Wt, x as Gt, y as Kt, z as qt } from "./chunks/Viewer-geJFRz8N.js"; +import { $ as Jt, A as Yt, B as Xt, C as Zt, D as Qt, E as $t, F as en, G as tn, H as nn, I as rn, J as an, K as on, L as sn, M as cn, N as ln, O as un, P as dn, Q as fn, R as pn, T as mn, U as hn, V as gn, W as _n, X as vn, Y as yn, Z as bn, _ as xn, a as Sn, c as Cn, d as wn, et as Tn, f as En, g as Dn, h as On, i as kn, j as An, k as jn, l as Mn, m as Nn, n as Pn, nt as Fn, o as In, p as Ln, q as Rn, s as zn, t as Bn, tt as Vn, u as Hn, w as Un, z as Wn } from "./chunks/SidebarWorkflowSection-BihItyAk.js"; +import { _ as Gn, i as Kn, n as qn, p as Jn, t as Yn } from "./chunks/openMajoorSettings-Cd5Nutru.js"; +import { a as Xn, c as Zn, l as Qn, o as $n, s as er, u as tr } from "./chunks/floatingViewerManager-Gv7MTmpu.js"; +import { A as nr, B as rr, C as H, D as ir, E as U, G as ar, H as or, I as sr, J as W, K as cr, L as lr, M as ur, N as dr, O as G, P as fr, R as pr, S as mr, T as K, U as hr, V as q, W as gr, Y as _r, at as vr, b as yr, ct as br, dt as xr, ft as J, it as Sr, j as Y, k as X, lt as Z, nt as Cr, q as wr, rt as Q, tt as Tr, ut as Er, v as Dr, w as Or, x as kr, y as Ar, z as jr } from "./chunks/mjr-primevue-BRqtdXzb.js"; +import { n as Mr, r as Nr } from "./chunks/mjr-vue-vendor-mHY_eIVE.js"; +import { t as Pr } from "./chunks/TagsEditor-CPV0rYyM.js"; +import { app as Fr } from "../../scripts/app.js"; +function Ir(e = null) { return null; } -function Fr() { +function Lr() { return null; } try { - typeof window < "u" && st && st.LIST; + typeof window < "u" && it && it.LIST; } catch {} // ui/integration/comfy_send_to_am.ts -var Ir = "MajoorAssetsManager.SendTo", Lr = "Send to Asset Manager", Rr = /* @__PURE__ */ new Set([ +var Rr = "MajoorAssetsManager.SendTo", zr = "Send to Asset Manager", Br = /* @__PURE__ */ new Set([ "SaveImage", "PreviewImage", "VHS_VideoCombine", @@ -29,11 +29,11 @@ var Ir = "MajoorAssetsManager.SendTo", Lr = "Send to Asset Manager", Rr = /* @__ "SaveAnimatedPNG", "SaveAudio" ]); -function zr(e) { +function Vr(e) { let t = String(e?.comfyClass || e?.type || "").trim(); - return Rr.has(t); + return Br.has(t); } -function Br(e) { +function Hr(e) { let t = []; try { let n = e?.imgs && Array.isArray(e.imgs) ? e.imgs : null, r = []; @@ -61,15 +61,15 @@ function Br(e) { } catch {} return t; } -async function Vr(e) { - let t = $e(), n = je(t); - if (!e.length) rt({ +async function Ur(e) { + let t = Ze(), n = je(t); + if (!e.length) He({ severity: "warn", summary: "Majoor Assets Manager", detail: "No output to send (run the node first).", life: 3500 }); - else if (!n || typeof n.fetchApi != "function") rt({ + else if (!n || typeof n.fetchApi != "function") He({ severity: "error", summary: "Majoor Assets Manager", detail: "ComfyUI API unavailable.", @@ -82,14 +82,14 @@ async function Vr(e) { body: JSON.stringify({ items: e }) }); if (!r.ok && r.status !== 404) throw Error(`HTTP ${r.status}`); - We(t, "majoor-assets"), rt({ + Ue(t, "majoor-assets"), He({ severity: "success", summary: "Majoor Assets Manager", detail: `Sent ${e.length} item(s) to the asset grid.`, life: 2500 }); } catch (e) { - rt({ + He({ severity: "error", summary: "Majoor Assets Manager", detail: `Failed to send: ${e?.message || e}`, @@ -97,16 +97,16 @@ async function Vr(e) { }); } } -function Hr() { - let e = $e(); - !e || typeof e.registerExtension != "function" ? setTimeout(Hr, 100) : e.registerExtension({ - name: Ir, +function Wr() { + let e = Ze(); + !e || typeof e.registerExtension != "function" ? setTimeout(Wr, 100) : e.registerExtension({ + name: Rr, getNodeMenuItems(e) { try { - return zr(e) ? [{ - content: Lr, + return Vr(e) ? [{ + content: zr, callback: () => { - Vr(Br(e)); + Ur(Hr(e)); } }] : []; } catch { @@ -115,11 +115,11 @@ function Hr() { } }); } -Hr(); +Wr(); // ui/integration/majoor_save_placeholders.ts -var Ur = "MajoorAssetsManager.SavePlaceholders", Wr = /* @__PURE__ */ new Set(["MajoorSaveImage", "MajoorSaveVideo"]), Gr = /dd?|MM?|hh?|mm?|ss?|yyy?y?/g; -function Kr(e, t) { - return e.replace(Gr, (e) => { +var Gr = "MajoorAssetsManager.SavePlaceholders", Kr = /* @__PURE__ */ new Set(["MajoorSaveImage", "MajoorSaveVideo"]), qr = /dd?|MM?|hh?|mm?|ss?|yyy?y?/g; +function Jr(e, t) { + return e.replace(qr, (e) => { if (e === "yyyy") return String(t.getFullYear()); if (e === "yy") return String(t.getFullYear()).substring(2, 4); let n; @@ -144,51 +144,51 @@ function Kr(e, t) { return String(n).padStart(e.length, "0"); }); } -var qr = /[/?<>\\:*|"\x00-\x1F\x7F]/g; -function Jr(e) { +var Yr = /[/?<>\\:*|"\x00-\x1F\x7F]/g; +function Xr(e) { let t = e?.nodes ?? e?._nodes; return Array.isArray(t) ? t : []; } -function Yr(e, t) { +function Zr(e, t) { return String(t ?? "").replace(/%([^%]+)%/g, (t, n) => { let r = String(n).split("."); - if (r.length !== 2) return r[0].startsWith("date:") ? Kr(r[0].substring(5), /* @__PURE__ */ new Date()) : t; - let i = Jr(e), a = i.filter((e) => e?.properties?.["Node name for S&R"] === r[0]); + if (r.length !== 2) return r[0].startsWith("date:") ? Jr(r[0].substring(5), /* @__PURE__ */ new Date()) : t; + let i = Xr(e), a = i.filter((e) => e?.properties?.["Node name for S&R"] === r[0]); a.length || (a = i.filter((e) => e?.title === r[0])); let o = a[0]; if (!o) return t; let s = Array.isArray(o.widgets) ? o.widgets.find((e) => e?.name === r[1]) : null; - return s ? String(s.value ?? "").replace(qr, "_") : t; + return s ? String(s.value ?? "").replace(Yr, "_") : t; }); } -function Xr(e, t) { +function Qr(e, t) { try { let n = Array.isArray(e?.widgets) ? e.widgets.find((e) => e?.name === "filename_prefix") : null; if (!n) return; let r = n.serializeValue; n.serializeValue = () => { let i = typeof r == "function" ? r.call(n) : n.value; - return Yr(e?.graph || t?.graph, i); + return Zr(e?.graph || t?.graph, i); }; } catch {} } -function Zr() { - let e = $e(); - !e || typeof e.registerExtension != "function" ? setTimeout(Zr, 100) : e.registerExtension({ - name: Ur, +function $r() { + let e = Ze(); + !e || typeof e.registerExtension != "function" ? setTimeout($r, 100) : e.registerExtension({ + name: Gr, nodeCreated(t) { try { let n = String(t?.comfyClass || t?.type || ""); - if (!Wr.has(n)) return; - Xr(t, e); + if (!Kr.has(n)) return; + Qr(t, e); } catch {} } }); } -Zr(); +$r(); // ui/app/bootstrap.ts -var Qr = !1, $r = null, ei = !1, ti = null; -function ni() { +var ei = !1, ti = null, ni = !1, ri = null; +function ii() { try { let e = window?.__MJR_EXECUTION_RUNTIME__; return !String(e?.active_prompt_id || "").trim(); @@ -196,26 +196,26 @@ function ni() { return console.debug?.(e), !0; } } -async function ri(e = {}) { - if (!B || typeof B != "object" || !B.AUTO_SCAN_ON_STARTUP || Qr) return; +async function ai(e = {}) { + if (!B || typeof B != "object" || !B.AUTO_SCAN_ON_STARTUP || ei) return; let t = Math.max(0, Number(e?.delayMs) || 0), n = e?.idleOnly !== !1; - if (t > 0) $r && clearTimeout($r), $r = setTimeout(() => { - $r = null, ri({ + if (t > 0) ti && clearTimeout(ti), ti = setTimeout(() => { + ti = null, ai({ ...e, delayMs: 0 }); }, t); - else if (n && !ni()) $r && clearTimeout($r), $r = setTimeout(() => { - $r = null, ri({ + else if (n && !ii()) ti && clearTimeout(ti), ti = setTimeout(() => { + ti = null, ai({ ...e, delayMs: 0 }); }, 5e3); else { - Qr = !0; + ei = !0; try { xe("[Majoor] Starting startup scan of output directory..."); - let e = await L(st.SCAN, { + let e = await L(it.SCAN, { recursive: !0, incremental: !0, fast: !0, @@ -230,23 +230,23 @@ async function ri(e = {}) { } } } -async function ii() { +async function oi() { try { await Promise.allSettled([ - re(st.HEALTH), - re(`${st.HEALTH_COUNTERS}?scope=output`), - re(st.HEALTH_DB) + re(it.HEALTH), + re(`${it.HEALTH_COUNTERS}?scope=output`), + re(it.HEALTH_DB) ]); } catch (e) { console.debug?.(e); } } -async function ai(e = {}) { - return ei ? ti || Promise.resolve() : (ei = !0, ti = (async () => { - await oi(), await ii(), await ri(e); - })(), ti); +async function si(e = {}) { + return ni ? ri || Promise.resolve() : (ni = !0, ri = (async () => { + await ci(), await oi(), await ai(e); + })(), ri); } -function oi() { +function ci() { return new Promise((e) => { try { if (typeof window > "u") { @@ -265,26 +265,26 @@ function oi() { } }); } -async function si() { +async function li() { try { xe("[Majoor] Testing API connection..."); - let e = await re(st.HEALTH); + let e = await re(it.HEALTH); e?.ok ? xe("[Majoor] API connection successful, health:", e.data.overall) : console.error("[Majoor] ERROR: API health check failed:", e?.error); } catch (e) { console.error("[Majoor] ERROR: Failed to connect to API:", e); } } // ui/app/style.ts -function ci() { +function ui() { let e = "mjr-feed-selection-override"; if (typeof document > "u" || document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-bottom-feed .mjr-asset-card.is-selected,\n .mjr-bottom-feed .mjr-card.is-selected {\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 78%, #ffffff 22%), 0 0 0 6px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 34%, transparent), 0 0 24px color-mix(in srgb, var(--mjr-accent, #5fb3ff) 52%, transparent), 0 10px 28px rgba(0, 0, 0, 0.32) !important;\n outline: 2px solid color-mix(in srgb, var(--mjr-accent, #5fb3ff) 85%, #ffffff 15%) !important;\n outline-offset: 0 !important;\n border-color: color-mix(in srgb, var(--mjr-accent, #5fb3ff) 62%, var(--mjr-border, rgba(255, 255, 255, 0.12))) !important;\n overflow: visible !important;\n z-index: 12 !important;\n }\n ", document.head.appendChild(t); } -function li({ enabled: e = !0 } = {}) { +function di({ enabled: e = !0 } = {}) { if (!e) return; let t = "mjr-theme-comfy-css"; - if (document.getElementById(t)) ci(); + if (document.getElementById(t)) ui(); else try { let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciAtIENvbWZ5LWxpa2UgdGhlbWUgbGF5ZXIKICoKICogUlVMRVM6CiAqIC0gRG8gTk9UIGhhcmRjb2RlIGEgY3VzdG9tIHBhbGV0dGU7IHVzZSBleGlzdGluZyBDb21meVVJIENTUyB2YXJpYWJsZXMgdmlhIHZhciguLi4pLgogKiAtIEtlZXAgZXZlcnl0aGluZyBzY29wZWQgdW5kZXIgYC5tanItYXNzZXRzLW1hbmFnZXJgIHRvIGF2b2lkIGxlYWtpbmcgc3R5bGVzIHRvIENvbWZ5VUkgKGV4Y2VwdCBgLm1qci1wb3BvdmVyKmAgd2hpY2ggY2FuIGJlIHBvcnRhbGVkIHRvIGBkb2N1bWVudC5ib2R5YCkuCiAqLwoKLm1qci1hc3NldHMtbWFuYWdlciB7CiAgICAvKiBUeXBvZ3JhcGh5ICovCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qCiAgICAgKiBTdXJmYWNlcyAtIHByaW9yaXR5OiBDb21meVVJIHYxLjQyIGRlc2lnbi1zeXN0ZW0gdG9rZW4gLT4gbGVnYWN5IHRva2VuIC0+IGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkgLSB1c2UgQ29tZnlVSSBkZXNpZ24tc3lzdGVtIHJhZGl1cyB0b2tlbnMgd2hlbiBhdmFpbGFibGUgKi8KICAgIC0tbWpyLXItc206IHZhcigtLXJhZGl1cy1zbSwgOHB4KTsKICAgIC0tbWpyLXItbWQ6IHZhcigtLXJhZGl1cy1tZCwgMTBweCk7CiAgICAtLW1qci1yLWxnOiB2YXIoLS1yYWRpdXMtbGcsIDEycHgpOwoKICAgIC8qIFNwYWNpbmcgKi8KICAgIC0tbWpyLXBhZC1zbTogOHB4OwogICAgLS1tanItcGFkLW1kOiAxMnB4OwogICAgLS1tanItcGFkLWxnOiAxNnB4OwoKICAgIC8qIFNlbWFudGljIFN0YXR1cyBDb2xvcnMgLSBwcmVmZXIgQ29tZnlVSSB2MS40MiBzZW1hbnRpYyB0b2tlbnMgKi8KICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1zdWNjZXNzLWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci1zdGF0dXMtd2FybmluZzogdmFyKC0td2FybmluZy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItc3RhdHVzLWVycm9yOiB2YXIoLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKICAgIC0tbWpyLXN0YXR1cy1pbmZvOiB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMyk7CiAgICAtLW1qci1zdGF0dXMtbmV1dHJhbDogdmFyKC0tY29tZnktc3RhdHVzLW5ldXRyYWwsICM5ZTllOWUpOwogICAgLS1tanItc3Rhci1hY3RpdmU6ICNmZmQ0NWE7CgogICAgLyogQmFkZ2UgY29sb3JzIChvdmVycmlkZGVuIGJ5IHNldHRpbmdzKSAqLwogICAgLS1tanItYmFkZ2UtaW1hZ2U6ICMyMTk2ZjM7CiAgICAtLW1qci1iYWRnZS12aWRlbzogIzljMjdiMDsKICAgIC0tbWpyLWJhZGdlLWF1ZGlvOiAjZmY5ODAwOwogICAgLS1tanItYmFkZ2UtbW9kZWwzZDogIzRjYWY1MDsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjM2QzZDNkKTsKICAgIC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgIzRhOTBlMik7CiAgICAtLW1qci1yYXRpbmctY29sb3I6ICNmZjk1MDA7CiAgICAtLW1qci10YWctY29sb3I6ICM0YTkwZTI7Cn0KCi8qIE1ha2UgdGhlIHRoZW1lIHZpc2libHkgYXBwbHkgZXZlbiB3aXRoIGlubGluZSBzdHlsZXMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIubWpyLWFtLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXIgewogICAgcGFkZGluZzogMTRweCAxNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIHJvdy1nYXA6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItbGVmdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWhlYWRlci10b29scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYnMgewogICAgLyogUXVldWUtbGlrZSB0YWJzIChhY3RpdmUgcGlsbCwgb3RoZXJzIGFzIHRleHQpICovCiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBnYXA6IDEwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjUlLCB0cmFuc3BhcmVudCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiLmlzLWFjdGl2ZSB7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItY29udGV4dC1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItcG9wb3Zlci1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24gLSB0ZWFsIGdsb3cgd2hlbiB2aWV3ZXIgaXMgb3BlbiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIHsKICAgIGNvbG9yOiAjNGRkOWMwOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAyMTcsIDE5MiwgMC4xKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDc3LCAyMTcsIDE5MiwgMC4yNSk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZnYtYnRuLWFjdGl2ZSAucGkgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWJ0biB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuLm1qci1tZXNzYWdlLWhhcy11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzIlLCB2YXIoLS1tanItYWNjZW50KSAxMSUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVzc2FnZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICByaWdodDogLTZweDsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTUlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykpOwogICAgYmFja2dyb3VuZDogI2VmNTM1MDsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG46ZGlzYWJsZWQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1haS1jb250cm9sOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgOTIlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkIC5tanItYWktY29udHJvbDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIHsKICAgIG9wYWNpdHk6IDAuNTg7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIC5tanItYWktY29udHJvbCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWRpc2FibGVkLWJsb2NrIGJ1dHRvbiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogUG9wb3ZlcnMgY2FuIGJlIG1vdmVkIHRvIGBkb2N1bWVudC5ib2R5YCAocG9ydGFsKSB0byBhdm9pZCBiZWluZyBjbGlwcGVkLiAqLwoubWpyLXBvcG92ZXIgewogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdmFyKAogICAgICAgICAgICAtLWZvbnQtaW50ZXIsCiAgICAgICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgICAgIHN5c3RlbS11aSwKICAgICAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICAgICAgUm9ib3RvLAogICAgICAgICAgICBBcmlhbCwKICAgICAgICAgICAgc2Fucy1zZXJpZgogICAgICAgICkKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpKTsKCiAgICAvKiBQcm92aWRlIGZhbGxiYWNrcyB3aGVuIG91dHNpZGUgYC5tanItYXNzZXRzLW1hbmFnZXJgIHNjb3BlICovCiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgLS1tanItcG9wb3Zlci16LWluZGV4OiAyMTQ3NDgzNjQ3OwoKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aWR0aDogbWluKDI4MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXBvcG92ZXItLWhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMzQwcHg7CiAgICB3aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgcGFkZGluZzogMTJweDsKfQoKLm1qci1zb3J0LXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIHdpZHRoOiBtaW4oMjYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAyODBweDsKICAgIHdpZHRoOiBtaW4oMzQwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMHB4Owp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVycy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlcnMtZW1wdHkgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3BlbiB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE5MCwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMSkpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItb3Blbjpob3ZlciwKLm1qci1waW5uZWQtZm9sZGVycy1wb3BvdmVyIC5tanItcGlubmVkLWZvbGRlci1vcGVuOmZvY3VzLXZpc2libGUgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0NSwgMjA1LCAyNTUsIDAuNCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDgwLCAxNDAsIDI1NSwgMC4xOCksIHJnYmEoMzIsIDEwMCwgMjAwLCAwLjE0KSk7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItbGFiZWwgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXBhdGggewogICAgZmxleDogMCAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuNjg7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItcGlubmVkLWZvbGRlcnMtcG9wb3ZlciAubWpyLXBpbm5lZC1mb2xkZXItdW5waW4gewogICAgd2lkdGg6IDQycHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgOTUsIDk1LCAwLjM1KTsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KSwgcmdiYSgxNjAsIDIwLCAyMCwgMC4xMikpOwp9CgoubWpyLXBpbm5lZC1mb2xkZXJzLXBvcG92ZXIgLm1qci1waW5uZWQtZm9sZGVyLXVucGluIC5waSB7CiAgICBvcGFjaXR5OiAwLjg4OwogICAgY29sb3I6IHJnYmEoMjU1LCAxMzAsIDEzMCwgMC45Nik7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiAtIHVucmVhZCBpbmRpY2F0b3IgZG90ICovCi5tanItdGFiLXVucmVhZC1kb3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBtYXJnaW4tbGVmdDogNXB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBIaXN0b3J5IHBhbmVsICovCi5tanItbWVzc2FnZXMtaGlzdG9yeS1wYW5lbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWhpc3RvcnktaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDRweCAwIDZweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWhpc3RvcnktaGVhZC1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgb3BhY2l0eTogMC42MjsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvcGFjaXR5OiAwLjcyOwp9CgoubWpyLWhpc3RvcnktY2xlYXItYnRuOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTIlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaGlzdG9yeS1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwp9CgoubWpyLWhpc3RvcnktaXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXdhcm5pbmcgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YwYjg1YSA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA1MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0taWNvbiB7CiAgICBmbGV4LXNocmluazogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNvbnRlbnQgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1tc2cgewogICAgb3BhY2l0eTogMC45MjsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBvcGFjaXR5OiAwLjk2OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWRldGFpbCB7CiAgICBvcGFjaXR5OiAwLjg0OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tdGltZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBvcGFjaXR5OiAwLjUyOwp9CgoubWpyLWhpc3RvcnktaXRlbS1jaGlwIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgyJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzY7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWFjdGlvbjpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4Owp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1zdW1tYXJ5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuNzQ7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1iYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tcHJvZ3Jlc3MtZmlsbCB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDcyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikpCiAgICApOwp9CgoubWpyLXNob3J0Y3V0LWd1aWRlIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKfQoKLm1qci1zaG9ydGN1dC1ndWlkZS1pbnRybyB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIG9wYWNpdHk6IDAuODQ7Cn0KCi5tanItc2hvcnRjdXQtc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg0JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTMsIHZhcigtLW1qci1zdXJmYWNlLTIpKSA3MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSkgODglLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItc2hvcnRjdXQtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItc2hvcnRjdXQtcm93IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxMzJweCwgMTYwcHgpIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7Cn0KCi5tanItc2hvcnRjdXQta2V5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzOCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTAlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwp9CgoubWpyLXNob3J0Y3V0LWRlc2MgewogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA1NjBweCkgewogICAgLm1qci1zaG9ydGN1dC1yb3cgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItc2hvcnRjdXQta2V5IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCAxMHB4OwogICAgcGFkZGluZzogNHB4IDJweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWxlZnQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWtpY2tlciB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDllbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDY1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXN1YnRpdGxlIHsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNjIlLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zdGFjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWFjdGl2ZS1jb3VudCB7CiAgICBtaW4td2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBwYWRkaW5nOiAwIDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2xlYXItYWxsIHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3ctLTNjb2wgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItcm93LS0zY29sIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBncmlkLWNvbHVtbjogMSAvIC0xOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA3MCUsIHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsICNlNmVkZjcpOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2NiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLXBvcG92ZXItdG9nZ2xlIGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cCB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiB2YXIoLS1tanItYWNjZW50LCAjN2FhMmZmKTsKICAgIHBhZGRpbmc6IDEwcHggMCA4cHg7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtLWNvcmUgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzU2YThmZjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tbWVkaWEgewogICAgLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudDogIzM1ZDA4YjsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC0tdGltZSB7CiAgICAtLW1qci1maWx0ZXItZ3JvdXAtYWNjZW50OiAjZjBiODRmOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRvZ2dsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgMTBweDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogMnB4IDRweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1ncm91cC10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDYyJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA4ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwLXRpdGxlOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBmbGV4OiAwIDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItZmlsdGVyLWdyb3VwLWFjY2VudCk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtY2hldnJvbiB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWZpbHRlci1ncm91cC1hY2NlbnQpIDc4JSwgdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXAtYm9keSB7CiAgICBwYWRkaW5nLXRvcDogNHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWNhcmQgewogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg4JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHRyYW5zcGFyZW50KSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgODglLCB0cmFuc3BhcmVudCkKICAgICk7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZDpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItY2FyZC0tYWdlbmRhIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICNmMGI4NGYgOSUsIHZhcigtLW1qci1zdXJmYWNlLTIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCB0cmFuc3BhcmVudCkKICAgICk7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItZ3JvdXA6bm90KC5pcy1vcGVuKSB7CiAgICBwYWRkaW5nLWJvdHRvbTogOHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLWdyb3VwOm5vdCguaXMtb3BlbikgLm1qci1maWx0ZXItZ3JvdXAtdG9nZ2xlIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA0NDBweCkgewogICAgLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1oZWFkIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgfQoKICAgIC5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItaGVhZC1hY3Rpb25zIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYiB7CiAgICAtLW1qci1icmVhZGNydW1iLWFjY2VudDogIzU2YThmZjsKICAgIC0tbWpyLWJyZWFkY3J1bWItY3VycmVudDogIzM1ZDA4YjsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgbWFyZ2luOiAxcHggMCAzcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgMjIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA5JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWIuaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uIHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA0MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDc4JSwgI2ZmZmZmZik7CiAgICBmb250OiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItYWN0aW9uOmRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNTg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1mb2xkZXItYnJlYWRjcnVtYi1hY3Rpb246bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA2MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudCB7CiAgICBtYXgtd2lkdGg6IDIyMHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSA3NiUsICNmZmZmZmYpOwogICAgZm9udDogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlZ21lbnQ6bm90KDpkaXNhYmxlZCk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItYWNjZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1hY2NlbnQpIDE2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudC5pcy1jdXJyZW50LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZm9sZGVyLWJyZWFkY3J1bWItc2VnbWVudDpkaXNhYmxlZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAzOCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYnJlYWRjcnVtYi1jdXJyZW50KSAxNCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJyZWFkY3J1bWItY3VycmVudCkgNzQlLCAjZmZmZmZmKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWZvbGRlci1icmVhZGNydW1iLXNlcGFyYXRvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1icmVhZGNydW1iLWFjY2VudCkgNTglLCB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42MikpKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0cyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lZGlhLXNob3J0Y3V0LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZHVwLWFsZXJ0IHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICM1NTUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2VlZSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLyogU2Nyb2xsYmFycyAobWF0Y2ggQ29tZnlVSSBmZWVsKSAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpIHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MCUsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1jdXN0b20tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaCB7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgbWFyZ2luLWJvdHRvbTogNnB4Owp9CgovKiBDYXJkIE1ldGFkYXRhIENvbG9ycyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBjb2xvcjogI2ZmYTcyNjsgLyogT3JhbmdlIGZvciBkdXJhdGlvbiAqLwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtcmVzIHsKICAgIGNvbG9yOiAjNGZjM2Y3OyAvKiBMaWdodCBCbHVlIGZvciByZXNvbHV0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1kYXRlIHsKICAgIGNvbG9yOiAjYjlmNmNhOyAvKiBQYWxlIEdyZWVuIGZvciBkYXRlICovCiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1ldGEtdGltZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMC45ZW07Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgbWFyZ2luOiAwIDAgNnB4IDA7CiAgICBwYWRkaW5nOiAwIDAgNHB4IDA7CiAgICBtaW4taGVpZ2h0OiAxNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgZmxleDogMCAwIGF1dG87Cn0KCi8qIFRvYXN0cyAoZ2xvYmFsOiBjYW4gYmUgbW91bnRlZCB1bmRlciBkb2N1bWVudC5ib2R5KSAqLwoubWpyLXRvYXN0LWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDE2cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICB6LWluZGV4OiAxMDAwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdG9hc3QgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCAjM2EzYTNhKTsKICAgIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdmFyKC0tbWpyLXRvYXN0LXN0cmlwKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgI2VmZWZlZik7CiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTE1cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMnMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMnMgZWFzZS1vdXQ7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgbWluLXdpZHRoOiBtaW4oMjUwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBtYXgtd2lkdGg6IG1pbig0MDBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItdG9hc3QuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9CgoubWpyLXRvYXN0LXRleHQgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi8qIFRvYXN0IGljb24gc3R5bGluZyAqLwoubWpyLXRvYXN0LXRleHQ6OmJlZm9yZSB7CiAgICBjb250ZW50OiBhdHRyKGRhdGEtaWNvbik7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGNvbG9yOiB2YXIoLS1tanItdG9hc3QtaWNvbi1jb2xvcik7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG1pbi13aWR0aDogMTZweDsKfQoKLm1qci10b2FzdC1zdWNjZXNzIHsKICAgIC0tbWpyLXRvYXN0LXN0cmlwOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsIHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKSk7Cn0KCi5tanItdG9hc3QtZXJyb3IgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtZXJyb3IsIHZhcigtLWNvbWZ5LXN0YXR1cy1lcnJvciwgI2Y0NDMzNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7Cn0KCi5tanItdG9hc3Qtd2FybmluZyB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCB2YXIoLS1jb21meS1zdGF0dXMtd2FybmluZywgI2ZmYTcyNikpOwp9CgoubWpyLXRvYXN0LWluZm8gewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtaW5mbywgdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWNvbnRleHQtcGlsbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICByb3ctZ2FwOiA0cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDEwLjVweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWluLWhlaWdodDogMjJweDsKICAgIG1heC13aWR0aDogMjIwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGw6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTAlLCB2YXIoLS1tanItYWNjZW50KSAxNCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXRleHQgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwteCB7CiAgICB3aWR0aDogMjBweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzUlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC14OmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgaGVpZ2h0OiAxLjc1cmVtOwogICAgcGFkZGluZzogMCAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXRvb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1wb3BvdmVyLWFuY2hvciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItYWdlbmRhLWlucHV0IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjJzIGVhc2UsCiAgICAgICAgY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjJzIGVhc2U7Cn0KLm1qci1hZ2VuZGEtaW5wdXQubWpyLWFnZW5kYS1maWxsZWQgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZW1wdHkgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg1JSwgdHJhbnNwYXJlbnQgMTUlKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKfQoKLm1qci1hZ2VuZGEtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLWFnZW5kYS1jYWxlbmRhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYWdlbmRhLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLWFnZW5kYS1tb250aCB7CiAgICBmbGV4OiAxOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1uYXYgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKfQoKLm1qci1hZ2VuZGEtZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNywgbWlubWF4KDAsIDFmcikpOwogICAgZ2FwOiA2cHg7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtd2Vla2RheSB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXkgewogICAgaGVpZ2h0OiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBwYWRkaW5nOiAwOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFnZW5kYS1kYXktYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtNXB4OwogICAgcmlnaHQ6IC01cHg7CiAgICBtaW4td2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogI2U1MzkzNTsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsICNlNTM5MzUgNjUlLCAjZmZmZmZmIDM1JSk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItYWdlbmRhLWRheTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpIDU1JSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA0NSUKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA0NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTAlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXk6YWN0aXZlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxcHgpOwp9CgoubWpyLWFnZW5kYS1kYXktLWJsYW5rIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWFnZW5kYS1kYXktLWhhcy1hc3NldHMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlcikKICAgICk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSAxOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgODIlCiAgICApOwp9CgoubWpyLWFnZW5kYS1kYXktLXNlbGVjdGVkIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHgKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItYWdlbmRhLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4cHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItYWdlbmRhLWNsZWFyLAoubWpyLWFnZW5kYS1yZWZyZXNoIHsKICAgIGZsZXg6IDE7Cn0KCi5tanItbWVudSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDRweDsKfQoKLm1qci1wcmltZS1tZW51LWxpc3QsCi5tanItc29ydC1tZW51IFtkYXRhLXBjLXNlY3Rpb249Imxpc3QiXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1wcmltZS1tZW51IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSwKLm1qci1wcmltZS1tZW51LWxpc3QgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbSJdIHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtY29udGVudCJdIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1lbnUtaXRlbSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbSB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbTpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZW51LWl0ZW06YWN0aXZlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tbGFiZWwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjaywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLW1lbnUtaXRlbSAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1jb2xsZWN0aW9ucy1tZW51IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tbGFiZWwtLWljb24gLnBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgZmxleDogMCAwIDE2cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLW1lbnUtaXRlbS1oaW50IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNjIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIG9wYWNpdHk6IDAuNzI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1lbnUtaXRlbS1jaGVjay0tdmlzaWJsZSwKLm1qci1tZW51LWl0ZW0uaXMtYWN0aXZlIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWVudS1kaXZpZGVyIHsKICAgIGhlaWdodDogMXB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tdXRlZCB7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBvcGFjaXR5OiAwLjc1Owp9CgoubWpyLXN0YXRlLWJsb2NrIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7CiAgICBib3JkZXI6IDFweCBkYXNoZWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDg1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBtYXJnaW46IDRweCAwOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXN0YXRlLWJsb2NrLmlzLWVycm9yLAoubWpyLWNvbnRleHQtbWVudS1ub3RlLmlzLWVycm9yIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgODIlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jb2xsZWN0aW9uLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDQ4cHg7Cn0KCi5tanItY29sbGVjdGlvbnMtdmlydHVhbC1saXN0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItZGVsZXRlLWJ0biB7CiAgICB3aWR0aDogNDJweDsKICAgIGZsZXg6IDAgMCA0MnB4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDY1JSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlKTsKfQoKLm1qci1kZWxldGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDQwJSwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNjUlKTsKfQoKLm1qci1kZWxldGUtYnRuIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24tdGl0bGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4IDJweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC42cHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgb3BhY2l0eTogMC44ODsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS1jeWFuIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlLS12aW9sZXQgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjYzQ4ZGZmIDc4JSwgdmFyKC0tY29udGVudC1mZykpOwp9CgoubWpyLXNlY3Rpb24taGludCB7CiAgICBwYWRkaW5nOiAwIDEwcHggNHB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTUlLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0LAoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIHsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLW1lbnUtaXRlbS0tc21hcnQgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzZmZDRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgLnBpIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3NCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0OmhvdmVyOm5vdCg6ZGlzYWJsZWQpLAoubWpyLW1lbnUtaXRlbS0tY2x1c3Rlcjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWFyZ2luLWJvdHRvbTogNHB4OwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItdGh1bWJzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDNweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWNsdXN0ZXItdGh1bWIgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNjAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1pbmZvIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItY2x1c3Rlci1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcpOwp9CgoubWpyLWNsdXN0ZXItY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA1OCUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0biB7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2U7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNjI7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItY2x1c3Rlci1jcmVhdGUtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLWljb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIC5waSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1waWxsIC5tanItaW5wdXQgewogICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4yICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbDpmb2N1cy13aXRoaW4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tYnJvd3NlIHsKICAgIG1hcmdpbi10b3A6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbCB7CiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7Cn0KCi8qIEdyaWQgbGF5b3V0ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAvKiBBdm9pZCBvdmVyZmxvdyB3aGVuIHRoZSBwYW5lbCBiZWNvbWVzIG5hcnJvd2VyIHRoYW4gdGhlIG1pbiBjYXJkIHNpemUgKi8KICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KAogICAgICAgIGF1dG8tZmlsbCwKICAgICAgICBtaW5tYXgobWluKDEwMCUsIHZhcigtLW1qci1ncmlkLW1pbi1zaXplLCAxODBweCkpLCAxZnIpCiAgICApOwogICAgZ2FwOiB2YXIoLS1tanItZ3JpZC1nYXAsIDEwcHgpOwogICAgbWFyZ2luLXRvcDogNnB4OwogICAgbWluLWhlaWdodDogMDsKfQoKLyogQ2FyZCBzZWxlY3Rpb24gKyBmb2N1cyAoa2VlcHMgYSB2aXNpYmxlIGluZGljYXRvciB3aGVuIHNpZGViYXIgaXMgb3BlbikgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgewogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQuaXMtc2VsZWN0ZWQgewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDAgMCAzcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMTBweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICAvKiBzY2FsZSgwLjk3KSBpbnN0ZWFkIG9mIDAuOTI6IHN1YnRsZSBpbnNldCBmZWVsIHdpdGhvdXQgdGhlIGFnZ3Jlc3NpdmUKICAgICAgIHNocmluayB0aGF0IGNhdXNlZCBhIHZpc2libGUgYmxpbmsgb24gcmFwaWQgc2VsZWN0aW9uIGNoYW5nZXMuICovCiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTcpICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMDsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZDpmb2N1cy12aXNpYmxlIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLWNvbnRlbnQtZmcpKSwKICAgICAgICAwIDAgMCA2cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk3KSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gewogICAgMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTglKTsKICAgICAgICBvcGFjaXR5OiAwLjE4OwogICAgfQogICAgNTAlIHsKICAgICAgICBvcGFjaXR5OiAwLjM0OwogICAgfQogICAgMTAwJSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KfQoKQGtleWZyYW1lcyBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSB7CiAgICAwJSwKICAgIDEwMCUgewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICAgIDAgMCAwIDFweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpLAogICAgICAgICAgICAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgfQogICAgNTAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjUyKSwKICAgICAgICAgICAgMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xMiksCiAgICAgICAgICAgIDAgMTJweCAzMHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWxpdmUtcGxhY2Vob2xkZXI9InRydWUiXSAubWpyLXRodW1iIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBsYWNlaG9sZGVyLXdhc2ggewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IC04JTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxMTVkZWcsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjA4KSAzMCUsCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSA1MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDAuMTIpIDcwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMCkgMTAwJQogICAgKTsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItc2hlZW4gMi4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1saXZlLXBpbGwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA2cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7CiAgICBwYWRkaW5nOiAwIDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4zNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsLWRvdCB7CiAgICB3aWR0aDogN3B4OwogICAgaGVpZ2h0OiA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICM3NmQ2ZmY7CiAgICBib3gtc2hhZG93OiAwIDAgMCA0cHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjE2KTsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci1hc3NldC1zdGF0dXMtZG90IHsKICAgIGFuaW1hdGlvbjogbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgMS45cyBlYXNlLWluLW91dCBpbmZpbml0ZTsKfQoKLyogR3JpZCBsb2FkaW5nIG92ZXJsYXkgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtbG9hZGluZy1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjMDAwIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuM3B4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMnB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tbGF5b3V0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMzJweCwgMWZyKSk7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWNhcmQgewogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE5MiwgMTk4LCAyMDYsIDAuMik7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgLyogbWluLWhlaWdodCByZW1vdmVkOiBWdWUgc2tlbGV0b25DYXJkU3R5bGUgc2V0cyBhbiBleHBsaWNpdCBoZWlnaHQgZGVyaXZlZAogICAgICAgZnJvbSBlc3RpbWF0ZVJvd0hlaWdodC4gQSBjb25mbGljdGluZyBtaW4taGVpZ2h0IGNhdXNlZCBza2VsZXRvbiBjYXJkcyB0bwogICAgICAgYmUgdGFsbGVyIHRoYW4gdGhlIGFjdHVhbCBjYXJkcyB0aGV5IHJlcGxhY2UsIGNhdXNpbmcgYSBsYXlvdXQganVtcCB3aGVuCiAgICAgICBhc3NldHMgZmlyc3QgbG9hZC4gKi8KICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHJnYmEoMTU2LCAxNjIsIDE3MSwgMC41MikgMCUsCiAgICAgICAgcmdiYSgyMjAsIDIyNSwgMjMyLCAwLjcyKSA0NSUsCiAgICAgICAgcmdiYSgxNTYsIDE2MiwgMTcxLCAwLjUyKSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUgewogICAgaGVpZ2h0OiAxMHB4OwogICAgbWFyZ2luOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICByZ2JhKDE2NCwgMTcwLCAxNzksIDAuNDgpIDAlLAogICAgICAgIHJnYmEoMjE0LCAyMTksIDIyNiwgMC43KSA0NSUsCiAgICAgICAgcmdiYSgxNjQsIDE3MCwgMTc5LCAwLjQ4KSAxMDAlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyNDAlIDEwMCU7CiAgICBhbmltYXRpb246IG1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgMS4ycyBsaW5lYXIgaW5maW5pdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLXRpdGxlIHsKICAgIHdpZHRoOiA3MiU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLWxpbmUtLW1ldGEgewogICAgd2lkdGg6IDQ4JTsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCkBrZXlmcmFtZXMgbWpyLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEyMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjAlIDA7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogMTAwJSAwOwogICAgfQogICAgMTAwJSB7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEwMCUgMDsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQtc2tlbGV0b24tc2hpbW1lciB7CiAgICB3aWxsLWNoYW5nZTogYmFja2dyb3VuZC1wb3NpdGlvbjsKfQoKLyogR2VuZXJpYyBoZWFkaW5ncyBpbnNpZGUgcGFuZWwgKi8KLm1qci1hc3NldHMtbWFuYWdlciBoMywKLm1qci1hc3NldHMtbWFuYWdlciBoNCB7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxZW07Cn0KCi8qIFBhbmVscyAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItcGFuZWwgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIGJveC1zaGFkb3c6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ib3gtc2hhZG93LCAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yNSkpOwp9CgovKiBUb29sYmFyICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogdmFyKC0tbWpyLXBhZC1tZCk7Cn0KCi8qIEJ1dHRvbnMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDdweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjU1OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxNCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0biB7CiAgICAvKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIGlmIHByZXNlbnQgKi8KICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2NhbiB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIHBhZGRpbmc6IDRweCAxMHB4OwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtY29sb3IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDE0JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2Nhbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1zdGF0dXMtY29sb3IpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtY29sb3IpIDI0JSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuLm1qci1zdGF0dXMtc2Nhbjpmb2N1cy12aXNpYmxlIHsKICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItc3RhdHVzLWNvbG9yKTsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7Cn0KCi8qIElucHV0cyAvIHNlbGVjdHMgKHVzZWQgaW5zaWRlIHBvcnRhbGVkIHBvcG92ZXJzIHRvbykgKi8KLm1qci1pbnB1dCwKLm1qci1zZWxlY3QsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdCB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0OjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaW5wdXQ6Zm9jdXMsCi5tanItc2VsZWN0OmZvY3VzLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQ6Zm9jdXMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3Q6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWlucHV0LAoubWpyLXNlbGVjdCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0IHsKICAgIC8qIE92ZXJyaWRlIGlubGluZSBzdHlsZXMgaWYgcHJlc2VudCAqLwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBtaW4taGVpZ2h0OiAzNHB4OwogICAgcGFkZGluZzogMCA5cHg7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdFtkYXRhLXAtZGlzYWJsZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAwLjU1OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCBbZGF0YS1wYy1zZWN0aW9uPSJsYWJlbCJdIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1maWx0ZXItcG9wb3ZlciAubWpyLWZpbHRlci1zZWxlY3QgW2RhdGEtcGMtc2VjdGlvbj0iZHJvcGRvd24iXSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIHsKICAgIG1pbi13aWR0aDogdmFyKC0tcC1zZWxlY3Qtb3ZlcmxheS13aWR0aCwgMTJyZW0pOwogICAgbWF4LXdpZHRoOiBtaW4oMzIwcHgsIGNhbGMoMTAwdncgLSAzMnB4KSk7CiAgICBtYXgtaGVpZ2h0OiBtaW4oMzIwcHgsIGNhbGMoMTAwdmggLSAzMnB4KSk7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zOCk7CiAgICB6LWluZGV4OiBjYWxjKHZhcigtLW1qci1wb3BvdmVyLXotaW5kZXgsIDIxNDc0ODM2NDcpICsgMSk7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXJnaW46IDA7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl0gewogICAgbWluLWhlaWdodDogMjhweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tbWpyLXItbWQpIC0gMnB4KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI1OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Im9wdGlvbiJdOmhvdmVyLAoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcC1oaWdobGlnaHQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2ZmZik7Cn0KCi8qIFRhYnM6IG92ZXJyaWRkZW4gYWJvdmUgd2l0aCBxdWV1ZS1saWtlIHN0eWxlICovCgovKiBSZW1vdmVkIHJlZHVuZGFudCB0YWIgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSB1c2luZyAhaW1wb3J0YW50ICovCgovKiBNdXRlZCB0ZXh0IGhlbHBlciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbXV0ZWQgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi8qIEdyaWQgKyBjYXJkcyAob3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBmcm9tIENhcmQuanMpICovCi5tanItYXNzZXRzLW1hbmFnZXIgI21qci1hc3NldHMtZ3JpZCB7CiAgICBnYXA6IDEwcHggIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICBtaW4td2lkdGg6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMTIwbXMgZWFzZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZDpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQ6aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgNTUlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1tanItY2FyZC1ob3Zlci1jb2xvcikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDIycHggcmdiYSgwLCAwLCAwLCAwLjI1KSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCBpbWcsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHZpZGVvLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWItbWVkaWEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAxMDAlICFpbXBvcnRhbnQ7CiAgICBvYmplY3QtZml0OiBjb3ZlciAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgewogICAgZmxleDogMCAwIGF1dG87CiAgICB3aWR0aDogMTAwJTsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODAlLCB0cmFuc3BhcmVudCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTRweCAxMnB4IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDE4JSAyMCUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjMyKSwgdHJhbnNwYXJlbnQgMzglKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDg4JSA3MiUsIHJnYmEoODIsIDIyMCwgMTU2LCAwLjI0KSwgdHJhbnNwYXJlbnQgNDIlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDE4LCAyNiwgMzYsIDAuOTgpLCByZ2JhKDgsIDEyLCAxOCwgMC45OCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWIuaGFzLXBvc3RlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLmhhcy1wb3N0ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDQsIDYsIDEwLCAwLjI4KSwgcmdiYSg0LCA2LCAxMCwgMC44NikpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDQyJSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMiksIHRyYW5zcGFyZW50IDU0JSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IHNhdHVyYXRlKDEuMSk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogc2F0dXJhdGUoMS4xKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLWhlYWQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1pY29uLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItaWNvbiB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLWtpbmQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1raW5kIHsKICAgIG1heC13aWR0aDogNjJweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEzKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXVkaW8tdGh1bWItd2F2ZWZvcm0gewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDQycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiBjbGFtcCgycHgsIDIuMiUsIDVweCk7CiAgICBwYWRkaW5nOiA0cHggMDsKICAgIGZpbHRlcjogZHJvcC1zaGFkb3coMCA0cHggMTRweCByZ2JhKDAsIDAsIDAsIDAuMzQpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLXdhdmVmb3JtIHNwYW4sCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi13YXZlZm9ybSBzcGFuIHsKICAgIHdpZHRoOiAzcHg7CiAgICBtaW4td2lkdGg6IDJweDsKICAgIG1heC13aWR0aDogNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTgpLCByZ2JhKDE2MCwgMjI0LCAyNTUsIDAuNzIpKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWF1ZGlvLXRodW1iLW1ldGEsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi1tZXRhIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNjIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXVkaW8tdGh1bWItdGl0bGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hdWRpby10aHVtYi10aXRsZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hdWRpby10aHVtYi1zdWJ0aXRsZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWF1ZGlvLXRodW1iLXN1YnRpdGxlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDY1MDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgcGFkZGluZzogMTRweCAxMnB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDQ3LCA1OCwgNzYsIDAuOTQpLCByZ2JhKDE4LCAyMywgMzIsIDAuOTgpKSwKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDMwJSAyNSUsIHJnYmEoNzgsIDE4NCwgMjU1LCAwLjIyKSwgdHJhbnNwYXJlbnQgNDIlKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggOHB4IHJnYmEoMCwgMCwgMCwgMC43Mik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItdGh1bWIubWpyLXRodW1iLXdvcmtmbG93LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXRodW1iLm1qci10aHVtYi13b3JrZmxvdyB7CiAgICBhc3BlY3QtcmF0aW86IDEuMDggLyAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWNhcmQtYWN0aW9ucywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1jYXJkLWFjdGlvbnMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA3cHg7CiAgICByaWdodDogN3B4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDRweDsKICAgIHotaW5kZXg6IDEyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LWFjdGlvbi1idG4sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0biB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDI0cHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBtaW4td2lkdGg6IDI0cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDgsIDEyLCAxOCwgMC41OCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoM3B4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDNweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bjpob3ZlciwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy1hY3Rpb24tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjksIDQwLCA1OCwgMC43OCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bi5pcy1hY3RpdmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctYWN0aW9uLWJ0bi5pcy1hY3RpdmUgewogICAgY29sb3I6ICNmZmQ0NWE7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyMTIsIDkwLCAwLjcpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iIC5waSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYiAucGkgewogICAgZm9udC1zaXplOiAxLjc1cmVtOwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtdGh1bWJuYWlsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy10aHVtYm5haWwgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgdHJhbnNwYXJlbnQgMjQlLCByZ2JhKDAsIDAsIDAsIDAuMjgpIDU4JSwgcmdiYSgwLCAwLCAwLCAwLjc4KSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2JhKDAsIDAsIDAsIDAuMzQpLCB0cmFuc3BhcmVudCAzNCUsIHRyYW5zcGFyZW50IDY2JSwgcmdiYSgwLCAwLCAwLCAwLjM0KSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItdGh1bWItbWVkaWEubWpyLXdvcmtmbG93LWdyYXBoLW1hcC1wcmV2aWV3LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXRodW1iLW1lZGlhLm1qci13b3JrZmxvdy1ncmFwaC1tYXAtcHJldmlldyB7CiAgICBvYmplY3QtZml0OiBjb3ZlciAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC40NjsKICAgIGZpbHRlcjogc2F0dXJhdGUoMC43NSkgY29udHJhc3QoMC44MikgYnJpZ2h0bmVzcygwLjcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA2KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy1ncmFwaC1tYXAgewogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoOCwgMTAsIDE0LCAwLjMpLCByZ2JhKDgsIDEwLCAxNCwgMC44MikpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgNTAlIDQyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSwgcmdiYSgwLCAwLCAwLCAwLjY4KSA3MiUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLmhhcy1ncmFwaC1tYXAgLm1qci13b3JrZmxvdy10aHVtYi10aXRsZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUgewogICAgcGFkZGluZzogMnB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCAucGksCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWIuaGFzLXRodW1ibmFpbCAucGkgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5waSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi5oYXMtZ3JhcGgtbWFwIC5waSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIG1hcmdpbi1ib3R0b206IDJweDsKICAgIGZvbnQtc2l6ZTogMS4xNXJlbTsKICAgIG9wYWNpdHk6IDAuNTU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItdGl0bGUgewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMC44NHJlbTsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsaW5lLWhlaWdodDogMS4xOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgZmxleC13cmFwOiB3cmFwOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZvbnQtc2l6ZTogMC42OHJlbTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci13b3JrZmxvdy10aHVtYi1tZXRhIHNwYW4sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItd29ya2Zsb3ctdGh1bWItbWV0YSBzcGFuLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLW1ldGEtd29ya2Zsb3ctdGFzaywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1zdWJncmFwaHMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1zdWJncmFwaHMgewogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIHBhZGRpbmc6IDJweCA1cHg7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbjpudGgtY2hpbGQobiArIDQpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LXRodW1iLW1ldGEgc3BhbjpudGgtY2hpbGQobiArIDQpIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gewogICAgcGFkZGluZzogN3B4IDlweCAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1maWxlbmFtZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgbWFyZ2luLWJvdHRvbTogM3B4ICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDAuNzhyZW0gIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxLjE1ICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLWNhcmQtbWV0YVtkYXRhLW1qci1raW5kPSJ3b3JrZmxvdyJdIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBmb250LXNpemU6IDAuNzJyZW0gIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNzQgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1jYXJkLW1ldGFbZGF0YS1tanIta2luZD0id29ya2Zsb3ciXSAubWpyLWNhcmQtbWV0YS1yb3cgLm1qci1tZXRhLXdvcmtmbG93LXRhc2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItY2FyZC1tZXRhW2RhdGEtbWpyLWtpbmQ9IndvcmtmbG93Il0gLm1qci1jYXJkLW1ldGEtcm93IC5tanItbWV0YS13b3JrZmxvdy10YXNrIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIC5tanItd29ya2Zsb3ctbWlzc2luZy1jaGlwLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZCAubWpyLXdvcmtmbG93LW1pc3NpbmctY2hpcCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgLm1qci1tZXRhLXdvcmtmbG93LW1pc3NpbmcsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkIC5tanItbWV0YS13b3JrZmxvdy1taXNzaW5nIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxOTAsIDY2LCAwLjI4KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjM2LCAxODAsIDAuOTgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDIwNiwgMTAxLCAwLjQ1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvciB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBtYXJnaW46IDAgMCA4cHg7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC40Mik7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTM1ZGVnLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjIyKSwKICAgICAgICAgICAgcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC4wOCkKICAgICAgICApLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3OCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250OiBpbmhlcml0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSwgMC42Nik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTM1ZGVnLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjMpLAogICAgICAgICAgICByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjEyKQogICAgICAgICksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogMnB4IHNvbGlkIHJnYmEodmFyKC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2IsIDk1LCAxNzksIDI1NSksIDAuNTUpOwogICAgb3V0bGluZS1vZmZzZXQ6IDJweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTAgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogOTUsIDE3OSwgMjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtMSB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiA1NSwgMjExLCAxNTY7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC0yIHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDI0NiwgMTc3LCA3NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTMgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMjM4LCAxMDQsIDEzNjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTQgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogMTU3LCAxMzIsIDIzODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci0tYWNjZW50LTUgewogICAgLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYjogNzEsIDE5NywgMjIyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLS1hY2NlbnQtNiB7CiAgICAtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiOiAxNDksIDIwNywgODE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItZ3JpZC1ncm91cC1zZXBhcmF0b3ItLWFjY2VudC03IHsKICAgIC0tbWpyLXdvcmtmbG93LWdyb3VwLWFjY2VudC1yZ2I6IDI0MiwgMTMwLCA3ODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci1jaGV2cm9uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZmxleDogMCAwIGF1dG87CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY29sb3I6IHJnYih2YXIoLS1tanItd29ya2Zsb3ctZ3JvdXAtYWNjZW50LXJnYiwgOTUsIDE3OSwgMjU1KSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLW1qci13b3JrZmxvdy1ncm91cC1hY2NlbnQtcmdiLCA5NSwgMTc5LCAyNTUpLCAwLjE0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQgLm1qci1ncmlkLWdyb3VwLXNlcGFyYXRvci1jaGV2cm9uID4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCAubWpyLWdyaWQtZ3JvdXAtc2VwYXJhdG9yLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogODAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1iYWNrZHJvcCB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBpbnNldDogMDsKICAgIHotaW5kZXg6IDk5OTk5OTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU4KTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWRpYWxvZyB7CiAgICB3aWR0aDogbWluKDkyMHB4LCA5NnZ3KTsKICAgIG1heC1oZWlnaHQ6IG1pbig3NjBweCwgOTJ2aCk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExNDE4KSA5NiUsICMwMDApOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwogICAgYm94LXNoYWRvdzogMCAxOHB4IDYwcHggcmdiYSgwLCAwLCAwLCAwLjQ4KTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWRpYWxvZyB7CiAgICB3aWR0aDogbWluKDU2MHB4LCA5NnZ3KTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDE0cHggMThweCA0cHg7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIGxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItd29ya2Zsb3ctaW5mby1mb3JtIGxhYmVsLmlzLXdpZGUgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKfQoKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gc3BhbiB7CiAgICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjY0KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3NTA7CiAgICBsZXR0ZXItc3BhY2luZzogLjA0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSBpbnB1dCwKLm1qci13b3JrZmxvdy1pbmZvLWZvcm0gc2VsZWN0LAoubWpyLXdvcmtmbG93LWluZm8tZm9ybSB0ZXh0YXJlYSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMjYpOwogICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC45Mik7CiAgICBmb250OiBpbmhlcml0OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgcGFkZGluZzogOXB4IDEwcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdvcmtmbG93LWluZm8tZm9ybSB0ZXh0YXJlYSB7CiAgICByZXNpemU6IHZlcnRpY2FsOwogICAgbWluLWhlaWdodDogOTZweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItaGVhZGVyLAoubWpyLXdvcmtmbG93LXBpY2tlci1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxMnB4IDE0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1mb290ZXIgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXItYm90dG9tOiAwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10aXRsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDlweDsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtc2l6ZTogMTVweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDA7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWljb24tYnRuLAoubWpyLXdvcmtmbG93LXBpY2tlci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzI1MjgyZCkgODglLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjVmNSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWljb24tYnRuIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1idG4gewogICAgbWluLWhlaWdodDogMzJweDsKICAgIHBhZGRpbmc6IDAgMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJ0bi5pcy1wcmltYXJ5IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NywgMTcxLCAyNDcsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc3LCAxNzEsIDI0NywgMC4yMik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWJ0bjpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc291cmNlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgI2FlYjNiZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc291cmNlIHN0cm9uZyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY1ZjUpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgxODBweCwgMWZyKSByZXBlYXQoMywgbWlubWF4KDExMHB4LCAxNTBweCkpOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4IDE0cHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLWRpYWxvZy5pcy1hc3NldC1tb2RlIC5tanItd29ya2Zsb3ctcGlja2VyLXRvb2xiYXIgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMTgwcHgsIDFmcik7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCwKLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciBzZWxlY3QgewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzE3MWExZikgOTIlLCAjMDAwKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZjVmNWY1KTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItc2VhcmNoIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAwIDEwcHg7Cn0KCi5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCBpbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi13aWR0aDogMDsKICAgIGJvcmRlcjogMDsKICAgIG91dGxpbmU6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiBpbmhlcml0Owp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10b29sYmFyIHNlbGVjdCB7CiAgICBwYWRkaW5nOiAwIDhweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItYm9keSB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDI2MHB4OwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTgwcHgsIDFmcikpOwogICAgYWxpZ24tY29udGVudDogc3RhcnQ7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAwIDE0cHggMTRweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZCB7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNjhweCBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogMTBweDsKICAgIG1pbi1oZWlnaHQ6IDg0cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMxNzFhMWYpIDkyJSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1kaWFsb2cuaXMtYXNzZXQtbW9kZSAubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNzZweCBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZDpob3ZlciwKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC5pcy1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjcyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDE3MSwgMjQ3LCAwLjEyKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItdGh1bWIgewogICAgd2lkdGg6IDY4cHg7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci10aHVtYiBpbWcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHN0cm9uZywKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHNwYW4sCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzbWFsbCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXdvcmtmbG93LXBpY2tlci1jYXJkLWluZm8gc3Ryb25nIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItY2FyZC1pbmZvIHNwYW4sCi5tanItd29ya2Zsb3ctcGlja2VyLWNhcmQtaW5mbyBzbWFsbCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCAjYWViM2JkKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZW1wdHkgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIHBhZGRpbmc6IDMycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCAjYWViM2JkKTsKfQoKLm1qci13b3JrZmxvdy1waWNrZXItZW1wdHkuaXMtZXJyb3IgewogICAgY29sb3I6ICNmZmI0YjQ7Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkgewogICAgLm1qci13b3JrZmxvdy1waWNrZXItYmFja2Ryb3AgewogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICB9CgogICAgLm1qci13b3JrZmxvdy1waWNrZXItdG9vbGJhciB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgfQoKICAgIC5tanItd29ya2Zsb3ctcGlja2VyLXNlYXJjaCB7CiAgICAgICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIH0KfQoKLyogS2VlcCBnZW5lcmF0aW9uLXRpbWUgYmFkZ2UgcGlubmVkIHRvIHRoZSB0aHVtYm5haWwgY29ybmVyIGFjcm9zcyBncmlkL2ZlZWQgdmFyaWFudHMuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci1nZW50aW1lLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgcmlnaHQ6IDZweCAhaW1wb3J0YW50OwogICAgYm90dG9tOiA2cHggIWltcG9ydGFudDsKICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDsKICAgIHRvcDogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDJweCA2cHggIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICBsaW5lLWhlaWdodDogMS4xOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgdGV4dC1zaGFkb3c6CiAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC45KSwKICAgICAgICAwIDAgMTBweCBjb2xvci1taXgoaW4gc3JnYiwgY3VycmVudENvbG9yIDM1JSwgdHJhbnNwYXJlbnQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOwp9CgovKiBLZWVwIHJhdGluZy90YWdzIGJhZGdlcyBhbmNob3JlZC4gRG8gbm90IGZvcmNlIGRpc3BsYXkgaGVyZSBzbyBncmlkIHZpc2liaWxpdHkgdG9nZ2xlcyBzdGlsbCBjb250cm9sIHNob3cvaGlkZS4gKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iID4gLm1qci1yYXRpbmctYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItcmF0aW5nLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgdG9wOiA2cHggIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDsKICAgIGJvdHRvbTogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMjUpOwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICBhbmltYXRpb246IG1qci1mYWRlLWluIDAuMnMgZWFzZS1vdXQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiA+IC5tanItdGFncy1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci10YWdzLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OwogICAgbGVmdDogNnB4ICFpbXBvcnRhbnQ7CiAgICBib3R0b206IDZweCAhaW1wb3J0YW50OwogICAgcmlnaHQ6IGF1dG8gIWltcG9ydGFudDsKICAgIHRvcDogYXV0byAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTAgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDNweCA2cHg7CiAgICBmb250LXNpemU6IDlweDsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNTZweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjJzIGVhc2Utb3V0Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWItcGxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBwbGFjZS1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiAyOHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIHRleHQtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDAsIDAsIDAuNyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMTIwbXMgZWFzZTsKfQoKLyogLS0tIEhvdmVyIGluZm8gb3ZlcmxheSAocG9zaXRpdmUgcHJvbXB0ICsgZ2VuIHRpbWUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFNsaWRlcyB1cCBmcm9tIHRoZSBib3R0b20gb2YgLm1qci10aHVtYiBvbiBjYXJkIGhvdmVyLgogICBwb2ludGVyLWV2ZW50czogbm9uZSAgLT4gbmV2ZXIgYmxvY2tzIHZpZGVvIG1vdXNlZW50ZXIgLyBwbGF5LW9uLWhvdmVyLgogICB6LWluZGV4OiAyICAgICAgICAgICAtPiBzaXRzIGFib3ZlIHRoZSB0aHVtYm5haWwgaW1hZ2UsIGJlbG93IHRoZSBwbGF5IGljb24uCiAgIENvbnRyb2xsZWQgYnkgdGhlIC5tanItc2hvdy1ob3Zlci1pbmZvIGNsYXNzIG9uIHRoZSBncmlkIGNvbnRhaW5lciwgd2hpY2gKICAgaXMgdG9nZ2xlZCB2aWEgdGhlICJTaG93IHByb21wdCBvbiBob3ZlciIgc2V0dGluZy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgcGFkZGluZzogMjJweCA4cHggN3B4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQgMCUsIHJnYmEoMCwgMCwgMCwgMC43OCkgMTAwJSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoNXB4KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAxNTBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSAxNTBtcyBlYXNlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDNweDsKICAgIHotaW5kZXg6IDI7Cn0KLyogT25seSByZXZlYWwgb24gaG92ZXIgd2hlbiB0aGUgc2V0dGluZyBpcyBlbmFibGVkIChjbGFzcyBvbiBncmlkIGNvbnRhaW5lcikgKi8KLm1qci1ncmlkLm1qci1zaG93LWhvdmVyLWluZm8gLm1qci1jYXJkOmhvdmVyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyAubWpyLWhvdmVyLXByb21wdCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IDI7CiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIG9wYWNpdHk6IDAuOTsKICAgIGZvbnQtc2l6ZTogOS41cHg7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyAubWpyLWhvdmVyLWdlbnRpbWUgewogICAgY29sb3I6IHJnYmEoMjU1LCAyMTAsIDEyMCwgMC45NSk7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZm9udC1zaXplOiA5cHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwp9CkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKSB7CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDBtczsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICB9Cn0KCi8qIC0tLSBDYXJkIGRldGFpbHMgcGFuZWwgc2hvdy9oaWRlIHZpYSBncmlkIGNvbnRhaW5lciBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tCiAgIC5tanItc2hvdy1kZXRhaWxzIGlzIHRvZ2dsZWQgYnkgYXBwbHlHcmlkU2V0dGluZ3NDbGFzc2VzKCkgd2hlbiB0aGUKICAgIlNob3cgbWV0YWRhdGEgcGFuZWwiIHNldHRpbmcgY2hhbmdlcy4gIERlZmF1bHQgPSBPRkYg4oaSIHBhbmVsIGhpZGRlbi4KICAgSGlkaW5nIGhlcmUga2VlcHMgYWN0dWFsIHJvdyBoZWlnaHQgPSBlc3RpbWF0ZVJvd0hlaWdodChtZXRhSGVpZ2h0PTApLAogICBwcmV2ZW50aW5nIHRoZSB2aXJ0dWFsaXplciBmcm9tIHJlcG9zaXRpb25pbmcgYWxsIHJvd3Mgb24gbWVhc3VyZQogICAod2hpY2ggd2FzIHRoZSByb290IGNhdXNlIG9mIHRoZSAicmVsb2FkIGltcHJlc3Npb24iIGJsaW5rKS4KICAgTWF0Y2ggdGhlIGJvdHRvbS1mZWVkIHBhdHRlcm4gYXQgLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtaW5mby4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWdyaWQubWpyLXNob3ctZGV0YWlscyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtbWV0YSB7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1kZXRhaWxzIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG9wYWNpdHk6IDAuODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgovKiBSYXRpbmcgJiBUYWdzIEVkaXRvcnMgKi8KQGtleWZyYW1lcyBmYWRlSW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KLyoqCiAqIEFyY2hpdmVkIENTUyBTdHlsZXMgLSBSYXRpbmcgYW5kIFRhZ3MKICogVGhlc2Ugc3R5bGVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZW1lLWNvbWZ5LmNzcwogKi8KCi8qIEFuaW1hdGlvbnMgKi8KQGtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogICAgZnJvbSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KCi8qIFBvcG92ZXJzICovCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZTsKfQoKLm1qci1yYXRpbmctcG9wb3ZlciwKLm1qci10YWdzLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHBhZGRpbmc6IDhweDsKfQoKLyogUmF0aW5nIEVkaXRvciAqLwoubWpyLXJhdGluZy1lZGl0b3IgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHg7Cn0KCi5tanItcmF0aW5nLXN0YXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXJhdGluZy1zdGFyOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikgMzUlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpIDY1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3Rhcjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMikgIWltcG9ydGFudDsKfQoKLm1qci1yYXRpbmctZWRpdG9yIC5tanItcmF0aW5nLXN0YXI6Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tZm9jdXMtb3V0bGluZS1jb2xvciwgIzRkYWJmNyk7CiAgICBvdXRsaW5lLW9mZnNldDogMnB4OwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3RhcjphY3RpdmUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KSAhaW1wb3J0YW50Owp9CgovKiBUYWdzIEVkaXRvciAqLwoubWpyLXRhZ3MtZWRpdG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgbWluLXdpZHRoOiAyNTBweDsKICAgIG1heC13aWR0aDogbWluKDM1MHB4LCBjYWxjKDEwMHZ3IC0gMjBweCkpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KCi5tanItdGFncy1lZGl0b3IuaXMtZGlzYWJsZWQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdGFncy1kaXNwbGF5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDMycHg7Cn0KCi5tanItdGFncy1lbXB0eSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLm1qci10YWctY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMjQlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLm1qci10YWctY2hpcC1yZW1vdmUgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZy1jaGlwLXJlbW92ZTpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItdGFncy1pbnB1dC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci10YWctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXRhZy1pbnB1dDpmb2N1cyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCkgIWltcG9ydGFudDsKfQoKLm1qci10YWctY2hpcDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMzQlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFncy1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwMCU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1heC1oZWlnaHQ6IDE1MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHotaW5kZXg6IDEwMDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXRhZy1zdWdnZXN0aW9uIHsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci10YWctc3VnZ2VzdGlvbi5pcy1hY3RpdmUsCi5tanItdGFnLXN1Z2dlc3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7Cn0KCi8qIEJhZGdlcyBJbnRlcmFjdGl2ZSAqLwoubWpyLXJhdGluZy1iYWRnZSwKLm1qci10YWdzLWJhZGdlIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItcmF0aW5nLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtYmFkZ2UgewogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWJhZGdlOmhvdmVyLAoubWpyLXRhZ3MtYmFkZ2U6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi8qIFNjcm9sbGJhciBmb3IgdGFncyBkcm9wZG93biAqLwoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA2cHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA0OCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi8qIFNpZGViYXIgKGNhbiBiZSBsZWZ0IG9yIHJpZ2h0KSAqLwoubWpyLXNpZGViYXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMzsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXdyYXAgewogICAgbWFyZ2luOiAwIDAgMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kLCA4cHgpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNlYWVhZWEpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtc2Nyb2xsIHsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogMnB4IDRweCA2cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtLCA2cHgpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZSB7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NCkpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtdG9nZ2xlW2RhdGEtcC1sZWFmPSJ0cnVlIl0gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtaWNvbiB7CiAgICB3aWR0aDogOHB4OwogICAgZmxleDogMCAwIDhweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzAlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBmb250LXNpemU6IDdweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLWxhYmVsIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1ub2RlLXR5cGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDc1JSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1zaWRlYmFyLmlzLW9wZW4gewogICAgLyogQm9yZGVyIGlzIHNldCBkeW5hbWljYWxseSBiYXNlZCBvbiBwb3NpdGlvbiAqLwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA4cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Cn0KCi8qIEN1c3RvbSBSb290cyBQb3BvdmVyIFN0eWxpbmcgKi8KLm1qci1jdXN0b20tcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMwMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICB3aWR0aDogNjBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXNlbGVjdCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItYnRuIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1zZWN0aW9uIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMykgIWltcG9ydGFudDsKfQoKLyogSW5saW5lIFNpZGViYXIgKHdpZHRoLWJhc2VkIHRyYW5zaXRpb25zIGxpa2UgYXJjaGl2ZWQgdmVyc2lvbikgKi8KLm1qci1pbmxpbmUtc2lkZWJhciB7CiAgICB3aWR0aDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogNDgwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgd2lkdGggMC4zcyBlYXNlLAogICAgICAgIG1pbi13aWR0aCAwLjNzIGVhc2U7Cn0KCi5tanItaW5saW5lLXNpZGViYXIuaXMtb3BlbiB7CiAgICB3aWR0aDogNDAwcHg7CiAgICBtaW4td2lkdGg6IDI2MHB4Owp9CgovKiBTcGFjZSBiZXR3ZWVuIHNpZGViYXIgYW5kIGdyaWQgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBnYXA6IDA7Cn0KCi8qIEJvcmRlciBiYXNlZCBvbiBwb3NpdGlvbiAqLwoubWpyLWlubGluZS1zaWRlYmFyW2RhdGEtcG9zaXRpb249ImxlZnQiXSB7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJyaWdodCJdIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi8qIFNpZGViYXIgcGxhY2Vob2xkZXIgKi8KLm1qci1zaWRlYmFyLXBsYWNlaG9sZGVyIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qID09PT09PT09PT0gVmlld2VyIENvbXBvbmVudCA9PT09PT09PT09ICovCi5tanItdmlld2VyLW92ZXJsYXkgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYm90dG9tOiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjk1KTsKICAgIC8qIFNpdCBhYm92ZSBNRlYgKDEwMDAwKSBzbyB0aGUgZnVsbCB2aWV3ZXIgYWx3YXlzIGNvdmVycyB0aGUgZmxvYXRpbmcgcGFuZWwgKi8KICAgIHotaW5kZXg6IDEwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQovKiBGYWRlLWluOiBhbmltYXRpb24gcmUtdHJpZ2dlcnMgZWFjaCB0aW1lIEpTIHN3aXRjaGVzIGRpc3BsYXkgYmFjayB0byBmbGV4ICovCi5tanItdmlld2VyLW92ZXJsYXlbc3R5bGUqPSJmbGV4Il0gewogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjE4cyBlYXNlLW91dDsKfQoKQGtleWZyYW1lcyBtanItZmFkZS1pbiB7CiAgICBmcm9tIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIH0KfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE3MGRlZywgcmdiYSgyNCwgMjcsIDMzLCAwLjk2KSwgcmdiYSgxNywgMTksIDI1LCAwLjk3KSk7CiAgICBib3JkZXItYm90dG9tOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMik7CiAgICBjb2xvcjogd2hpdGU7Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBtYXgtd2lkdGg6IDQwMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA0cHggMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4xKSwgcmdiYSgyMDYsIDIxMSwgMjE4LCAwLjAzKSk7CiAgICBib3JkZXI6IDAuOHB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4zKTsKICAgIGNvbG9yOiByZ2JhKDIzMCwgMjMzLCAyMzgsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTZzOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4xNCksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNDIpOwp9CgovKiBWaWV3ZXIgY2xvc2UgYnV0dG9uIHBpbm5lZCB0byBvdmVybGF5IGNvcm5lciAqLwoubWpyLXZpZXdlci1jbG9zZSwKLm1qci12aWV3ZXItZnMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjYpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wOCksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMikpLAogICAgICAgIHJnYmEoMjAsIDIzLCAyOSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1jbG9zZSB7CiAgICBjb2xvcjogI2ZmZjRmNCAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIwNSwgODIsIDgyLCAwLjUpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA1LCA4MiwgODIsIDAuMyksIHJnYmEoMjA1LCA4MiwgODIsIDAuMTIpKSwKICAgICAgICByZ2JhKDU4LCAxOCwgMTgsIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDIxOSwgMjE5LCAwLjE2KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyMDUsIDgyLCA4MiwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2U6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMzgpLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMTYpKSwKICAgICAgICByZ2JhKDcwLCAxOCwgMTgsIDAuOTcpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjM1LCAxMzgsIDEzOCwgMC42NCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItZnM6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKSwKICAgICAgICByZ2JhKDIzLCAyNiwgMzIsIDAuOTUpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC4zOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZXdlci1jb250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItc2luZ2xlLAoubWpyLXZpZXdlci1hYiwKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLm1qci12aWV3ZXItc2luZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSBpbWcsCi5tanItdmlld2VyLXNpbmdsZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzOwp9CgoubWpyLXZpZXdlci1hdWRpby1zaGVsbCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxNHB4OwogICAgcGFkZGluZzogMThweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMTglIDIyJSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMiksIHRyYW5zcGFyZW50IDMyJSksCiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4MiUgNzQlLCByZ2JhKDgyLCAyMjAsIDE1NiwgMC4xNSksIHRyYW5zcGFyZW50IDM2JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxMiwgMTgsIDI2LCAwLjk4KSwgcmdiYSg0LCA3LCAxMSwgMC45OSkpOwp9CgoubWpyLXZpZXdlci1hdWRpby1oZWFkZXIgewogICAgd2lkdGg6IG1pbigxMDgwcHgsIDg4JSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMXB4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogMCA4cHg7Cn0KCi5tanItdmlld2VyLWF1ZGlvLWljb24gewogICAgd2lkdGg6IDM0cHg7CiAgICBoZWlnaHQ6IDM0cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMjYpOwp9CgoubWpyLXZpZXdlci1hdWRpby10aXRsZS13cmFwIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7Cn0KCi5tanItdmlld2VyLWF1ZGlvLXRpdGxlIHsKICAgIG1heC13aWR0aDogbWluKDc2MHB4LCA3MnZ3KTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjU7Cn0KCi5tanItdmlld2VyLWF1ZGlvLW1ldGEgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41OCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7Cn0KCi5tanItdmlld2VyLWF1ZGlvLXZpeiB7CiAgICB3aWR0aDogbWluKDE5MjBweCwgOTYlKTsKICAgIGFzcGVjdC1yYXRpbzogMTYgLyA5OwogICAgaGVpZ2h0OiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDEwODBweCwgNjh2aCk7CiAgICBtaW4taGVpZ2h0OiAyNjBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOSk7CiAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDEpKSwKICAgICAgICByZ2JhKDIsIDUsIDksIDAuMjIpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksCiAgICAgICAgMCAxOHB4IDcwcHggcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXZpZXdlci1hdWRpby1zcmMgewogICAgd2lkdGg6IG1pbig2ODBweCwgOTAlKTsKfQoKLm1qci12aWV3ZXItYWIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGdhcDogMnB4Owp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlID4gZGl2IHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKfQoKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSBpbWcsCi5tanItdmlld2VyLXNpZGVieXNpZGUgdmlkZW8gewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47Cn0KCi5tanItdmlld2VyLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIGdhcDogMjBweDsKfQoKLm1qci12aWV3ZXItZm9vdGVyIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgY29sb3I6IHdoaXRlOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7Cn0KCi5tanItdmlld2VyLWZvb3RlciBidXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLXZpZXdlci1uYXYgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDE0cHg7Cn0KCi5tanItdmlld2VyLW5hdi1idG4gewogICAgd2lkdGg6IDQwcHggIWltcG9ydGFudDsKICAgIGhlaWdodDogNDBweCAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogMTBweCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjQyKSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMTgpLCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMDcpKSwKICAgICAgICByZ2JhKDM0LCAzOCwgNDQsIDAuOTIpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMzQsIDIzNiwgMjQwLCAwLjk2KSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogNzAwICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50OwogICAgdGV4dC1zaGFkb3c6IG5vbmU7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAwLjE0cyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNHMgZWFzZSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjU2KSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIwNywgMjEyLCAyMTksIDAuMiksIHJnYmEoMjA3LCAyMTIsIDIxOSwgMC4xKSksCiAgICAgICAgcmdiYSgzOSwgNDMsIDQ5LCAwLjk0KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7Cn0KCi5tanItdmlld2VyLW5hdi1idG46YWN0aXZlOm5vdCg6ZGlzYWJsZWQpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgwLjk4KTsKICAgIGZpbHRlcjogbm9uZTsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjM0ICFpbXBvcnRhbnQ7CiAgICBmaWx0ZXI6IGdyYXlzY2FsZSgwLjI1KTsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItaW5kZXggewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbWluLXdpZHRoOiA3NHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICBjb2xvcjogcmdiYSgyMjYsIDIyOCwgMjMzLCAwLjk0KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4xNSksIHJnYmEoMTk3LCAyMDMsIDIxMSwgMC4wNikpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTcsIDIwMywgMjExLCAwLjM0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgcGFkZGluZzogNXB4IDExcHg7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKfQoKLm1qci12aWV3ZXItcGxheWVyYmFyIHsKICAgIGJvcmRlci1yYWRpdXM6IDE4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NCwgMjAwLCAyMDgsIDAuMTYpOwogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IHRvcCBsZWZ0LCByZ2JhKDkwLCAxNTAsIDI1NSwgMC4wOCksIHRyYW5zcGFyZW50IDM2JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE2MGRlZywgcmdiYSgyMCwgMjQsIDMwLCAwLjk0KSwgcmdiYSgxMiwgMTUsIDIxLCAwLjk4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDE2cHggMzZweCByZ2JhKDAsIDAsIDAsIDAuMjIpOwogICAgLyogb3ZlcmZsb3cgbXVzdCBzdGF5IHZpc2libGUgc28gdGhlIHNlZWsgcnVsZXIgdGlja3MvbGFiZWxzICh0b3A6LTE2cHggLyB0b3A6LTM0cHgpCiAgICAgICB0aGF0IGFyZSBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYWJvdmUgdGhlIHNlZWsgYmFyIGFyZSBub3QgY2xpcHBlZC4gKi8KICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgoubWpyLXZpZXdlci10b29scyB7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0cmV0Y2g7CiAgICBnYXA6IDhweDsKfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci12aWV3ZXItaGVhZGVyOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDE4cHg7CiAgICByaWdodDogMThweDsKICAgIHRvcDogNDRweDsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwgdHJhbnNwYXJlbnQpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhIHsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKfQoKLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1yaWdodDogODRweDsKICAgIHBhZGRpbmctbGVmdDogMTJweDsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWxlZnQgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXg6IDEgMSAwOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWNlbnRlciB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxIDEgYXV0bzsKfQoKLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBmbGV4OiAxIDEgMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLXRpdGxlLXdyYXAgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IG1pbigxMDAlLCBjYWxjKDEwMHZ3IC0gMjIwcHgpKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItdmlld2VyLXRpdGxlLWxpbmUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci1maWxlbmFtZSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luOiAwIGF1dG87CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLWJhZGdlcyB7CiAgICBnYXA6IDRweDsKfQoKLm1qci12aWV3ZXItdGl0bGUtbGluZSAubWpyLXZpZXdlci1iYWRnZXMgewogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLWxlZnQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgd2lkdGg6IGZpdC1jb250ZW50OwogICAgbWF4LXdpZHRoOiAxMDAlOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdDplbXB0eSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAganVzdGlmeS1zZWxmOiBlbmQ7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlld2VyLW1vZGUtYnV0dG9ucyB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIHBhZGRpbmc6IDNweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWluLXdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICByZ2JhKDEwLCAxMiwgMTYsIDAuMjQpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCA2cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgcGFkZGluZzogNXB4IDZweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDAgMCBhdXRvIDA7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNiksIHRyYW5zcGFyZW50KTsKICAgIG9wYWNpdHk6IDAuNzsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1oZWFkIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWhlYWRpbmcgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDFweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtZXllYnJvdyB7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4xNGVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDYpOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC10aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGNvbG9yOiByZ2JhKDI0OCwgMjUwLCAyNTIsIDAuOTYpOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iZ3JhZGUiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Im92ZXJsYXkiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Imluc3BlY3QiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5LAoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJhY3Rpb25zIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSwKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iaW5mbyJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAgewogICAgd2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAzMHB4OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEyKTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzUpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICByZ2JhKDEwLCAxMiwgMTYsIDAuMTgpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwogICAgbWluLXdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSk7CiAgICBsZXR0ZXItc3BhY2luZzogMC4xNXB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtzdHlsZSo9Ii0tbWpyLWdyb3VwLWFjY2VudCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjkpOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtzdHlsZSo9Ii0tbWpyLWdyb3VwLWFjY2VudCJdIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4zNSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNoYW5uZWwiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgbWluLXdpZHRoOiA0MnB4Owp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJvdmVybGF5Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gewogICAgZmxleC13cmFwOiB3cmFwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY2hhbm5lbCJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJleHBvc3VyZSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJnYW1tYSJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImF1ZGlvLXZpeiJdIHsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucywKLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLWFjdGlvbi0tcHJpbWFyeSB7CiAgICBtYXJnaW4tbGVmdDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uICsgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uIHsKICAgIG1hcmdpbi1sZWZ0OiA0cHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBtaW4taGVpZ2h0OiAyNHB4Owp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZS1pbnB1dCB7CiAgICB3aWR0aDogOTJweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZSBzcGFuIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDE0ODBweCkgewogICAgLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAxMjIwcHgpIHsKICAgIC5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA4NHB4OwogICAgICAgIHBhZGRpbmctbGVmdDogMDsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyLAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktc2VsZjogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWRlY2sgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBvdmVyZmxvdy14OiB2aXNpYmxlOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLAogICAgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucywKICAgIC5tanItdmlld2VyLXRvb2xzLW1ldGEsCiAgICAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5IHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtbWV0YSB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgfQp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjb21wYXJlIl1bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjEpOwogICAgYm9yZGVyLWxlZnQtY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuNik7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4yMik7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXVtkYXRhLWFjdGl2ZT0iMSJdIC5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuNik7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC4xOCk7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjIyKTsKfQoKLyogTmF0aXZlIGRyb3Bkb3duczogaGludCBkYXJrIFVJIGFuZCBzdHlsZSBvcHRpb25zIHdoZW4gdGhlIGJyb3dzZXIgYWxsb3dzIGl0LiAqLwoubWpyLXZpZXdlci1oZWFkZXIgewogICAgY29sb3Itc2NoZW1lOiBkYXJrOwp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3QgewogICAgbWluLWhlaWdodDogMjRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40NikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1zZWxlY3Qgb3B0aW9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcmFuZ2UtaW5wdXQ6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbC1idG4tLXJlc2V0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0biB7CiAgICBtaW4taGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA4cHggIWltcG9ydGFudDsKICAgIGJvcmRlci13aWR0aDogMXB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNzUpLAogICAgICAgIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMjUpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xNikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgIGZvbnQtc2l6ZTogMTFweCAhaW1wb3J0YW50OwogICAgcGFkZGluZzogMCA4cHggIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMjQpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4xKSwKICAgICAgICByZ2JhKDIyMCwgMjI0LCAyMzAsIDAuMDM1KQogICAgKSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDI1NSwgMTY2LCA5MiwgMC4yMiksCiAgICAgICAgcmdiYSgyNTUsIDExNiwgNjQsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxNjAsIDkyLCAwLjM0KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyMzYsIDIyNCwgMC45NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYW5hbHlzaXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyNTUsIDE4MCwgMTA4LCAwLjI4KSwKICAgICAgICByZ2JhKDI1NSwgMTI4LCA3MiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE4NCwgMTE2LCAwLjQ2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDkyLCAyMTksIDE4NiwgMC4yMiksCiAgICAgICAgcmdiYSg0NCwgMTcwLCAxNDQsIDAuMDgpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTIsIDIxOSwgMTg2LCAwLjM0KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjI0LCAyNTUsIDI0OCwgMC45NikgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1ndWlkZXMiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMDIsIDIzMCwgMTk2LCAwLjI4KSwKICAgICAgICByZ2JhKDUyLCAxODIsIDE1NiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMTAsIDIzNiwgMjAyLCAwLjQ2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMjQsIDE2NiwgMjU1LCAwLjIyKSwKICAgICAgICByZ2JhKDEwOSwgODgsIDIyMiwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMzIsIDE3MCwgMjU1LCAwLjM2KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjM2LCAyNDIsIDI1NSwgMC45NykgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0ib3ZlcmxheS1pbnNwZWN0Il0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMTM4LCAxODAsIDI1NSwgMC4zKSwKICAgICAgICByZ2JhKDEyNCwgMTAwLCAyMzIsIDAuMTQpCiAgICApICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTQ4LCAxODgsIDI1NSwgMC40OCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBmaWx0ZXI6IHNhdHVyYXRlKDEuMTIpIGJyaWdodG5lc3MoMS4wNCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLAogICAgICAgIDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1oZWxwIHsKICAgIGJvcmRlci1yYWRpdXM6IDE0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTMsIDE3LCAyMiwgMC45NiksIHJnYmEoOCwgMTEsIDE2LCAwLjk4KSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgMThweCAzNHB4IHJnYmEoMCwgMCwgMCwgMC4zNCkgIWltcG9ydGFudDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDEyMjBweCkgewogICAgLm1qci12aWV3ZXItdG9vbHMgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5tanItdmlld2VyLXRvb2xzLWFjdGlvbnMgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgICAgICBqdXN0aWZ5LWl0ZW1zOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLWxlZnQsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyLAogICAgLm1qci12aWV3ZXItaGVhZGVyLWFyZWEtLXJpZ2h0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdCwKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtYm9keSB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7CiAgICB9Cn0KCi8qID09PT09PT09PT0gQ3VzdG9tIFZpZGVvIENvbnRyb2xzIChubyBuYXRpdmUgYmFyKSA9PT09PT09PT09ICovCi5tanItdmlkZW8taG9zdCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTJweDsKICAgIHJpZ2h0OiAxMnB4OwogICAgYm90dG9tOiAxMnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICBvcGFjaXR5OiAwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2U7CiAgICB6LWluZGV4OiA1Owp9CgoubWpyLXZpZGVvLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBnYXA6IDEycHg7CiAgICBkaXNwbGF5OiBncmlkOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogYXV0byBhdXRvIDFmciBhdXRvIGF1dG87Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXByZXZpZXcgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWdyb3VwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1udW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItdmlkZW8tbnVtOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM4KTsKfQoKLm1qci12aWRlby1udW0tLWZwcy5pcy1vdmVycmlkZGVuIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNDUsIDE1OCwgMTEsIDAuODIpOwogICAgY29sb3I6ICNmYmJmMjQ7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwgMTU4LCAxMSwgMC4xNCk7Cn0KCi5tanItdmlkZW8tbnVtLS1mcHMuaXMtb3ZlcnJpZGRlbjpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjUxLCAxOTEsIDM2LCAwLjk2KTsKfQoKLm1qci12aWRlby1udW0tLXNwZWVkIHsKICAgIGNvbG9yLXNjaGVtZTogZGFyazsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci12aWRlby1udW0tLXNwZWVkIG9wdGlvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKfQoKLm1qci12aWRlby1mcmFtZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgbWluLXdpZHRoOiA1MnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1mcmFtZS5pcy1zdGVwIHsKICAgIGNvbG9yOiAjZmZkMjRkOwp9CgoubWpyLXZpZGVvLWJvdHRvbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMTsKfQoKLm1qci12aWRlby1ib3R0b20tLWxlZnQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0Owp9CgoubWpyLXZpZGVvLWJvdHRvbS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci12aWRlby10cmFuc3BvcnQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgovKiBTaG93IGNvbnRyb2xzIG9uIGhvdmVyL2ZvY3VzICh2aWV3ZXIpLiAqLwoubWpyLXZpZGVvLWhvc3Q6aG92ZXIgLm1qci12aWRlby1jb250cm9scywKLm1qci12aWRlby1jb250cm9sczpmb2N1cy13aXRoaW4gewogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgovKiBQcmV2aWV3OiBrZWVwIGNvbnRyb2xzIHZpc2libGUgYmVjYXVzZSB0aGUgYXJlYSBpcyBzbWFsbC4gKi8KLm1qci12aWRlby1jb250cm9scy0tcHJldmlldyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IGF1dG87CiAgICBib3R0b206IDEwcHg7CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiBhdXRvOwogICAgYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IG5vbmU7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG4gewogICAgd2lkdGg6IDM4cHg7CiAgICBoZWlnaHQ6IDM4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNDIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5tanItdmlkZW8tcHJldmlldy1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWJ0biB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKfQoKLm1qci12aWRlby1idG4uaXMtb24gewogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTYwLCAyNTUsIDAuMjUpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDY0LCAxNjAsIDI1NSwgMC41NSk7Cn0KCi5tanItdmlkZW8tYnRuLS1pbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjEyKTsKfQoKLm1qci12aWRlby1idG4tLWluOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjE4KTsKfQoKLm1qci12aWRlby1idG4tLW91dCB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCA3MCwgNzAsIDAuNTUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xKTsKfQoKLm1qci12aWRlby1idG4tLW91dDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjE2KTsKfQoKLm1qci12aWRlby10aW1lIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBtaW4td2lkdGg6IDkycHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby10aW1lZ3JvdXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogMTBweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWRlby1yYW5nZS1jb3VudCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSg2NCwgMTkwLCAyNTUsIDAuOTIpOwogICAgYmFja2dyb3VuZDogcmdiYSg2NCwgMTkwLCAyNTUsIDAuMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDY0LCAxOTAsIDI1NSwgMC4yNSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIHBhZGRpbmc6IDFweCA4cHg7CiAgICBsaW5lLWhlaWdodDogMTZweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZSB7CiAgICBhY2NlbnQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2VlayB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA4MHB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgei1pbmRleDogMTsKICAgIC8qIFdlIGRyYXcgb3VyIG93biBwbGF5aGVhZC9tYXJrZXJzOyBoaWRlIHRoZSBuYXRpdmUgdGh1bWIgImRvdCIuICovCiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWs6Oi1tb3otcmFuZ2UtdGh1bWIgewogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG1pbi13aWR0aDogODBweDsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci12aWRlby1zZWVrLXpvbmVzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIHRvcDogNTAlOwogICAgaGVpZ2h0OiAxMHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7Cn0KCi8qIDAuLkluOiB0cmltbWVkLW91dCByYW5nZS4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLWxlZnRUcmltIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMTgpOwp9CgovKiBJbi4uT3V0OiBzZWxlY3RlZCBwbGF5YmFjayByYW5nZSBoaWdobGlnaHQuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC41NSk7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lcy5pcy1mdWxscmFuZ2UgLm1qci12aWRlby1zZWVrLXpvbmUtLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7Cn0KCi8qIE91dC4uRW5kOiBzaG93IG91dC1vZi1yYW5nZSBmcmFtZXMgYXMgYSBkaWZmZXJlbnQgY29sb3IuICovCi5tanItdmlkZW8tc2Vlay16b25lLS1yaWdodFRyaW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4yKTsKfQoKLm1qci12aWRlby1zZWVrLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDM7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMzJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgei1pbmRleDogNDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm94LXNoYWRvdzogMCA0cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmFmdGVyLAoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiA1MCU7CiAgICB3aWR0aDogMnB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjk1KTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmFmdGVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmJlZm9yZSwKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0taW46OmJlZm9yZSB7CiAgICB0b3A6IDRweDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YmVmb3JlIHsKICAgIGJvdHRvbTogNHB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstdGlja3MgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAtMTZweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItdmlkZW8tc2Vlay1sYWJlbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAtMzRweDsKICAgIGhlaWdodDogMTRweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuNTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWRlby1zZWVrLXBsYXloZWFkLWxhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTRweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmsgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMTBweDsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgei1pbmRleDogNDsKICAgIC0tbWpyLW1hcmstY29sb3I6IHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0taW4gewogICAgLS1tanItbWFyay1jb2xvcjogcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyazo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogNTAlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDJweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1tYXJrLWNvbG9yKTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyazo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC01cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1ib3R0b206IDZweCBzb2xpZCB2YXIoLS1tanItbWFyay1jb2xvcik7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1pbjo6YWZ0ZXIgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tbWpyLW1hcmstY29sb3IpOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyay0tb3V0OjphZnRlciB7CiAgICB0b3A6IGF1dG87CiAgICBib3R0b206IC01cHg7CiAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgYm9yZGVyLXRvcDogNnB4IHNvbGlkIHZhcigtLW1qci1tYXJrLWNvbG9yKTsKfQoKLm1qci12aWRlby1zZWVrLXBsYXloZWFkIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTEycHg7CiAgICB3aWR0aDogMnB4OwogICAgaGVpZ2h0OiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDIwMCwgNzAsIDAuOTUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTFweCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciB7CiAgICBwb3NpdGlvbjogc3RhdGljOwogICAgbGVmdDogYXV0bzsKICAgIHJpZ2h0OiBhdXRvOwogICAgYm90dG9tOiBhdXRvOwogICAgb3BhY2l0eTogMTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAxNHB4OwogICAgYm9yZGVyLXJhZGl1czogMThweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgdG9wIGxlZnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHRyYW5zcGFyZW50IDM0JSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTgsIDIwMywgMjEwLCAwLjAyNSksIHJnYmEoMTk4LCAyMDMsIDIxMCwgMC4wMDgpKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTY1ZGVnLCByZ2JhKDE4LCAyMiwgMjgsIDAuODIpLCByZ2JhKDEyLCAxNSwgMjEsIDAuOSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAxMHB4IDMwcHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogbm9uZTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4gewogICAgbWluLWhlaWdodDogMzhweDsKICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNyksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wMikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NCwgMjAxLCAyMDgsIDAuMTgpOwogICAgYm9yZGVyLXdpZHRoOiAxcHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAwLjEycyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4xMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xMnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTJzIGVhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0bjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4yNik7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0bi5pcy1vbiB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDEwMCwgMTcwLCAyNTUsIDAuMiksIHJnYmEoMTAwLCAxNzAsIDI1NSwgMC4wOCkpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEyMCwgMTg2LCAyNTUsIDAuNDIpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMTIwLCAxODYsIDI1NSwgMC4xMikgaW5zZXQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1oZWFkLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKSBhdXRvIG1pbm1heCgwLCAxZnIpOwogICAgZ2FwOiAxMnB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXN0YXR1cywKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUgewogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1jZW50ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMWZyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIG1pbm1heCgwLCAxZnIpIGF1dG87CiAgICBnYXA6IDEycHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyLm1qci12aWRlby1jb250cm9scy0tYXVkaW8gLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgZ3JpZC1jb2x1bW46IDEgLyAtMTsKICAgIGdyaWQtcm93OiAxOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhci5tanItdmlkZW8tY29udHJvbHMtLWF1ZGlvIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIubWpyLXZpZGVvLWNvbnRyb2xzLS1hdWRpbyAubWpyLXZpZGVvLWdyb3VwLS1vdXQgewogICAgZ3JpZC1yb3c6IDI7CiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLW1lZGlhLWJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSg3OCwgMjI0LCAxOTYsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3OCwgMjI0LCAxOTYsIDAuMjIpOwogICAgY29sb3I6IHJnYmEoMjIwLCAyNDcsIDI0MSwgMC45Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQ1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWUsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBjb2xvcjogcmdiYSgyMjgsIDIzMCwgMjM0LCAwLjkyKTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IDk0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgY29sb3I6IHJnYmEoMjIyLCAyMjUsIDIzMCwgMC45NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4yNik7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxOTQsIDIwMSwgMjA5LCAwLjA4KTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cCB7CiAgICBtaW4taGVpZ2h0OiAzNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtbGVmdCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLWFkanVzdC1yaWdodCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLXNwZWVkIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1udW0gewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDksIDEyLCAxNiwgMC41NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4tLXBsYXkgewogICAgbWluLXdpZHRoOiA4OHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi1oZWlnaHQ6IDQ0cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdm9sdW1lLXdyYXAgewogICAgcGFkZGluZzogMCA0cHg7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXZvbHVtZSB7CiAgICB3aWR0aDogOTBweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDk4MHB4KSB7CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGdhcDogMTBweDsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgfQp9CgovKiA9PT09PT09PT09IENvbnRleHQgTWVudSBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLWNvbnRleHQtbWVudSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAvKiBBYm92ZSB2aWV3ZXIgb3ZlcmxheSAoMTAwMDEpIGFuZCBNRlYgZGlhbG9nICgxMDAwMCkgKi8KICAgIHotaW5kZXg6IDEwMDAyOwogICAgZGlzcGxheTogbm9uZTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYW5pbWF0aW9uOiBtanItY29udGV4dC1tZW51LWluIDAuMTVzIGVhc2Utb3V0Owp9CgoubWpyLWNvbnRleHQtbWVudSwKLm1qci1jb250ZXh0LW1lbnUgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpAa2V5ZnJhbWVzIG1qci1jb250ZXh0LW1lbnUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW06aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwIHsKICAgIGNvbG9yOiAjZjVjNTQyOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lIHsKICAgIGNvbG9yOiAjNWRhOWZmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlIHsKICAgIGNvbG9yOiAjZmY1ZjVmOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZmxvYXRpbmctdmlld2VyIHsKICAgIGNvbG9yOiAjNWZkMzhkOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZ3JhcGgtbWFwOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE5NywgNjYsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtcmVuYW1lOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSg5MywgMTY5LCAyNTUsIDAuMTQpOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmhvdmVyLAoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLXRvbmUtZGVsZXRlOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDk1LCA5NSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtdG9uZS1mbG9hdGluZy12aWV3ZXI6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAyMTEsIDE0MSwgMC4xNCk7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQgewogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpob3ZlciwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS5pcy1kaXNhYmxlZDpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWNvbnRleHQtbWVudS1zZXBhcmF0b3IgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXItY29sb3IpOwogICAgbWFyZ2luOiA0cHggMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0LAoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1sZWZ0IHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLXJpZ2h0IHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWFyZ2luLWxlZnQ6IDE2cHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3BhY2l0eTogMC44MjsKfQoKLm1qci1jb250ZXh0LW1lbnUtaGludCB7CiAgICBvcGFjaXR5OiAwLjU4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc3VibWVudS1hcnJvdyB7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYWRkLXRvLWNvbGxlY3Rpb24tbWVudSB7CiAgICBtaW4td2lkdGg6IDI2MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTJweCk7Cn0KCi5tanItY29udGV4dC1tZW51LXRpdGxlIHsKICAgIHBhZGRpbmc6IDhweCAxNHB4IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yKTsKICAgIG9wYWNpdHk6IDAuOTI7Cn0KCi5tanItY29udGV4dC1tZW51LW5vdGUgewogICAgcGFkZGluZzogMTBweCAxNHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnKSA3MiUsIHZhcigtLW1qci1tdXRlZCkpOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7Cn0KCi5tanItZ3JpZC1wb3BvdmVyLAoubWpyLXZpZXdlci1wb3BvdmVyIHsKICAgIG1pbi13aWR0aDogMjUwcHg7CiAgICBtYXgtd2lkdGg6IG1pbigzNjBweCwgY2FsYygxMDB2dyAtIDE2cHgpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci12aWV3ZXItb3ZlcmxheSAqLAogICAgLm1qci12aWRlby1jb250cm9scywKICAgIC5tanItY29udGV4dC1tZW51IHsKICAgICAgICBhbmltYXRpb246IG5vbmUgIWltcG9ydGFudDsKICAgICAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgc2Nyb2xsLWJlaGF2aW9yOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB9Cn0KCi8qIEhpZGUgaGVhZGVyICh0b29sYmFyKSB3aGVuIHZpZXdlciBvdmVybGF5IGlzIGluIGZ1bGxzY3JlZW4gKi8KLm1qci12aWV3ZXItb3ZlcmxheTpmdWxsc2NyZWVuIC5tanItdmlld2VyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBNYWpvb3IgRmxvYXRpbmcgVmlld2VyIChNRlYpIC0gcG9ydGFsZWQgdG8gZG9jdW1lbnQuYm9keQogICBSZWRlY2xhcmVzIENTUyB2YXJpYWJsZXMgc28gdGhlIHBhbmVsIHdvcmtzIG91dHNpZGUgLm1qci1hc3NldHMtbWFuYWdlcgogICAoc2FtZSBwYXR0ZXJuIGFzIC5tanItcG9wb3ZlcikKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItbWZ2IHsKICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0tY29udGVudC1iZywgIzFlMWUxZSk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1jb21meS1tZW51LXNlY29uZGFyeS1iZywgIzMzMyk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKTsKICAgIC0tbWpyLXN0YXR1cy1zdWNjZXNzOiB2YXIoLS1jb21meS1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCk7CgogICAgZm9udC1mYW1pbHk6IHZhcigKICAgICAgICAtLWNvbWZ5LWZvbnQsCiAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICBzeXN0ZW0tdWksCiAgICAgICAgLWFwcGxlLXN5c3RlbSwKICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgIFJvYm90bywKICAgICAgICBBcmlhbCwKICAgICAgICBzYW5zLXNlcmlmCiAgICApOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAvKiBWaXN1YWwgY2hyb21lICovCiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDhweCAzMnB4IHJnYmEoMCwgMCwgMCwgMC41NSksCiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKfQoKLm1qci1tZnYgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpodG1sLm1qci1tZnYtcG9wb3V0LWRvY3VtZW50IHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KAogICAgICAgICAgICAxMjAwcHggNDIwcHggYXQgNTAlIDAlLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKSAxMCUsCiAgICAgICAgICAgICAgICB0cmFuc3BhcmVudAogICAgICAgICAgICApLAogICAgICAgICAgICB0cmFuc3BhcmVudCA2MiUKICAgICAgICApLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgKICAgICAgICAgICAgMTgwZGVnLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxNjE5MWYpKSA4MiUsCiAgICAgICAgICAgICAgICAjMDAwIDE4JQogICAgICAgICAgICApLAogICAgICAgICAgICBjb2xvci1taXgoCiAgICAgICAgICAgICAgICBpbiBzcmdiLAogICAgICAgICAgICAgICAgdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzFmMjIyNykpIDg0JSwKICAgICAgICAgICAgICAgICMwMDAgMTYlCiAgICAgICAgICAgICkKICAgICAgICApOwp9Cgpib2R5Lm1qci1tZnYtcG9wb3V0LWJvZHkgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCiNtanItbWZ2LXBvcG91dC1yb290LAoubWpyLW1mdi1wb3BvdXQtcm9vdCB7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KCi8qIC0tIEhlYWRlciAoZHJhZyBoYW5kbGUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBjdXJzb3I6IG1vdmU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9CgoubWpyLW1mdi1oZWFkZXItdGl0bGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG9wYWNpdHk6IDAuNzg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBmbGV4OiAxOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMjhweDsKfQoKLyogLS0gVG9vbGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzZweDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKfQoubWpyLW1mdi10b29sYmFyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICB3aWR0aDogMXB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW46IDAgM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBoZWlnaHQ6IDIycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlOmhvdmVyIHsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjAzKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB3aWR0aDogMCU7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCA3MG1zIGVhc2UtaW4tb3V0Owp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLW5vZGVzIHsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjglLCAjMGIzNTEzIDMyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NCUsICMwYjIzNDAgMzYlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcywKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1zdGVwcyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2Q5NTM0ZiA3OCUsICM0YTE0MTQgMjIlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3Mtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC4xOCkpOwogICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGhlaWdodDogMTAwJTsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtc2hhZG93OiAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC45KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICB3aWR0aDogMjZweDsKICAgIGhlaWdodDogMjZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDglKTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0MiUsIHZhcigtLW1qci1hY2NlbnQpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIC0tIFBpbiBncm91cDogbm93IGEgZHJvcGRvd24gbWVudSAoZGlzcGxheTpub25lIGJ5IGRlZmF1bHQsIGZsZXggd2hlbiAuaXMtb3BlbikgLS0gKi8KLm1qci1tZnYtcGluLWdyb3VwIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IGNhbGMoMTAwJSArIDRweCk7CiAgICBsZWZ0OiAwOwogICAgei1pbmRleDogMTAwMTA7CiAgICBtaW4td2lkdGg6IDcwcHg7CiAgICBwYWRkaW5nOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwp9Ci5tanItbWZ2LXBpbi1ncm91cC5pcy1vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMCAxMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzNSUsIHRyYW5zcGFyZW50KTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA0MiUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKfQoKLyogLS0gSWNvbiBEcm9wZG93biBjb21wb25lbnQgKC5tanItbWZ2LWlkcm9wKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtaWRyb3AgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LWlkcm9wLW1lbnUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItbWZ2LWlkcm9wLW1lbnUuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLW1mdi1pZHJvcC1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLW1mdi1pZHJvcC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbS5pcy1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1pZHJvcC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogQ2hhbm5lbCB0cmlnZ2VyOiBzbGlnaHRseSB3aWRlciB0byBmaXQgIlJHQiIgKi8KLm1qci1tZnYtY2gtbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBUb29sYmFyIGljb24tYnV0dG9uIHBvcG92ZXJzIChjaGFubmVsLCBndWlkZXMsIHBpbiwgZm9ybWF0IC0gc29ydC1zdHlsZSBjb250ZXh0IG1lbnVzKSAqLwoubWpyLW1mdi1jaC1wb3BvdmVyLAoubWpyLW1mdi1ndWlkZXMtcG9wb3ZlciwKLm1qci1tZnYtcGluLXBvcG92ZXIsCi5tanItbWZ2LWZvcm1hdC1wb3BvdmVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIG1pbi13aWR0aDogMTIwcHg7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLW1mdi1jaC1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LWd1aWRlcy1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LXBpbi1wb3BvdmVyLmlzLW9wZW4sCi5tanItbWZ2LWZvcm1hdC1wb3BvdmVyLmlzLW9wZW4gewogICAgZGlzcGxheTogYmxvY2s7Cn0KLyogVG9vbGJhciBpY29uIGltYWdlcyAtIGNoIGljb24gaXMgYmxhY2sgKGludmVydGVkKSwgZ3VpZGVzIGljb24gaXMgbmF0aXZlIHdoaXRlICovCi5tanItbWZ2LWNoLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBmaWx0ZXI6IGludmVydCgxKTsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBkaXNwbGF5OiBibG9jazsKfQoubWpyLW1mdi1ndWlkZXMtaWNvbiB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIG9wYWNpdHk6IDAuODU7CiAgICBkaXNwbGF5OiBibG9jazsKfQoubWpyLW1mdi1jaC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtZ3VpZGVzLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1waW4tdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWZvcm1hdC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogUGluIHNsb3QgYWN0aXZlIHN0YXRlICovCi5tanItbWZ2LXBpbi1wb3BvdmVyIC5tanItbWVudS1pdGVtLmlzLXBpbm5lZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgb3BhY2l0eTogMSAhaW1wb3J0YW50Owp9Ci8qIEZvcm1hdCBwb3BvdmVyOiBzZXBhcmF0b3IgKyBvcGFjaXR5IHNsaWRlciByb3cgKi8KLm1qci1tZnYtZm9ybWF0LXNlcCB7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSk7CiAgICBtYXJnaW46IDRweCAycHg7Cn0KLm1qci1tZnYtZm9ybWF0LXNsaWRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDRweCA4cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItbGFiZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWlucHV0LXRleHQsICNkZGQpOwogICAgb3BhY2l0eTogMC42NTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmbGV4LXNocmluazogMDsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciBpbnB1dFt0eXBlPSJyYW5nZSJdIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDcwcHg7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9Ci5tanItbWZ2LWZvcm1hdC1wb3BvdmVyIC5tanItbWZ2LXRvb2xiYXItcmFuZ2Utb3V0IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICBtaW4td2lkdGg6IDMwcHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiA3cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODAlLCB2YXIoLS1tanItYWNjZW50KSA4JSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG46Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLyogVW5pdmVyc2FsIGFjdGl2ZSBoaWdobGlnaHQgLSBhbnkgYXJpYS1wcmVzc2VkPSJ0cnVlIiBidXR0b24gZ2V0cyBhY2NlbnQgZ2xvdy4KICAgUGxhY2VkIGJlZm9yZSB0aGUgY29sb3JlZCBhY3RpdmUgY2xhc3NlcyBzbyB0aGV5IGNhbiBvdmVycmlkZSB3aXRoIHRoZWlyIG93biBjb2xvci4gKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0blthcmlhLXByZXNzZWQ9InRydWUiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAxMiUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiBQb3AtaW4gbW9kZSAodmlld2VyIHBvcHBlZCBvdXQpOiByYWlzZSBidXR0b24gY29udHJhc3QvYnJpZ2h0bmVzcyAqLwoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDI0cHggNTZweCByZ2JhKDAsIDAsIDAsIDAuNDIpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkwJSwgcmdiYSgwLCAwLCAwLCAwLjI0KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlci10aXRsZSB7CiAgICBvcGFjaXR5OiAwLjk4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXByb2dyZXNzIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzBhMTExOCAxOCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MiUsICMwMDAgOCUpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWNvbnRlbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIGNpcmNsZSBhdCB0b3AsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNDIlCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODIlLCAjMDAwIDE4JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB2YXIoLS1tanItYWNjZW50KSA0MiUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2MiUsIHZhcigtLW1qci1hY2NlbnQpIDM4JSkKICAgICk7CiAgICBjb2xvcjogI2Y0ZjhmZiAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biAucGkgewogICAgb3BhY2l0eTogMTsKICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgI2ZmZmZmZiA0MCUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSg3NiwgMTc1LCA4MCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDI1NSwgMTUyLCAwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDkyJSwgI2ZmZmZmZiA4JSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTYlLCB2YXIoLS1tanItYWNjZW50KSA0NCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUsIHZhcigtLW1qci1hY2NlbnQpIDM2JSkKICAgICk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDk0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDk0JSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA4MiUsIHZhcigtLW1qci1tdXRlZCkgMTglKTsKICAgIG9wYWNpdHk6IDAuODg7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4NiUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSksCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4NiUsIHJnYmEoMCwgMCwgMCwgMC4xNCkpCiAgICAgICAgKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXdpZGdldC1sYWJlbCwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1lbXB0eSwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODQlLCAjZmZmZmZmIDE2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3NCUsICMwNTA3MGEgMjYlKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMCUpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcG9waW4tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDQ1JSwgdmFyKC0tbWpyLWFjY2VudCkgNTUlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiAtLSBDb250ZW50IHdyYXBwZXIgKGhvcml6b250YWwgZmxleDogY29udGVudCArIHNpZGViYXIpIC0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplOwp9CgovKiAtLSBTaWRlYmFyIHBvc2l0aW9uIHZhcmlhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93Owp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBoZWlnaHQgMC4ycyBlYXNlLAogICAgICAgIHdpZHRoIDBzOwp9Ci5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMjIwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgbWluLWhlaWdodDogMTIwcHg7CiAgICBtYXgtaGVpZ2h0OiA2NSU7Cn0KCi8qIC0tIENvbnRlbnQgYXJlYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMCAwIDMyMHB4OwogICAgd2lkdGg6IDMyMHB4OwogICAgbWluLXdpZHRoOiAyMTBweDsKICAgIG1heC13aWR0aDogbWluKDQyJSwgNDIwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMTgsIDIwLCAwLjk2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBmbGV4OiAwIDAgY2xhbXAoMTkwcHgsIDMyJSwgMjgwcHgpOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtaGVpZ2h0OiA0NiU7CiAgICBib3JkZXItbGVmdDogbm9uZTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItdGl0bGUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NCk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb24gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgcGFkZGluZy10b3A6IDA7CiAgICBib3JkZXItdG9wOiBub25lOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1oZWFkaW5nIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLm9wZW4gewogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci10aXRsZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb24gewogICAgZmxleDogMCAwIGF1dG87CiAgICBtaW4taGVpZ2h0OiBhdXRvOwogICAgcGFkZGluZy10b3A6IDRweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWhlYWRpbmcgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBjb2x1bW5zOiAzIDE3MHB4OwogICAgY29sdW1uLWdhcDogMTBweDsKICAgIGNvbHVtbi1maWxsOiBiYWxhbmNlOwogICAgbWluLWhlaWdodDogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5ID4gKiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYnJlYWstaW5zaWRlOiBhdm9pZDsKICAgIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBtYXJnaW4tYmxvY2s6IDAgMTBweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2UgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjI0LCAyNTUsIDEyMiwgMC40Mik7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjI0LCAyNTUsIDEyMiwgMC4xNiksIHJnYmEoNzYsIDE3NSwgODAsIDAuMSkpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMjI0LCAyNTUsIDEyMiwgMC4xMikgaW5zZXQ7CiAgICBjdXJzb3I6IGNvcHk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tdGltZS1iYWRnZSB7CiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBib3JkZXItcmFkaXVzOiA2cHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLWxhYmVsIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7Cn0KCi5tanItbWZ2LWdlbi10aW1lLXZhbHVlIHsKICAgIGNvbG9yOiAjZTBmZjdhOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGZvbnQtZmFtaWx5OiBDb25zb2xhcywgTW9uYWNvLCBtb25vc3BhY2U7Cn0KCi5tanItbWZ2LWdlbi1jYXJkIHsKICAgIC0tbWpyLW1mdi1nZW4tYWNjZW50OiAjMjE5NmYzOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSA0NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxMzVkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgMTYlLCB0cmFuc3BhcmVudCkgMCUsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgOCUsIHRyYW5zcGFyZW50KSAxMDAlCiAgICApOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpIGluc2V0OwogICAgY3Vyc29yOiBjb3B5OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTZzIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTZzIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAwLjE2cyBlYXNlOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQgewogICAgbWluLWhlaWdodDogMDsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tcG9zaXRpdmUtcHJvbXB0LAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLW5lZ2F0aXZlLXByb21wdCwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1wcm9tcHQgewogICAgbWluLWhlaWdodDogMTEwcHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0td29ya2Zsb3cgewogICAgbWluLWhlaWdodDogNThweDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1tb2RlbC1hbmQtbG9yYSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1tb2RlbHMsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tc2FtcGxpbmcsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tZ2VuZXJhdGlvbi1waXBlbGluZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS10ZXh0LXRvLWltYWdlLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWltYWdlLXRvLWltYWdlLAoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtLWlucGFpbnQsCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tdXBzY2FsZSwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLS1yZWZpbmUgewogICAgbWluLWhlaWdodDogODZweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLXNlZWQgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBib3JkZXItd2lkdGg6IDJweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEycHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCB7CiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IC5tanItbWZ2LWdlbi1jYXJkLXRpdGxlLAoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZDpob3ZlciwKLm1qci1tZnYtZ2VuLXRpbWUtYmFkZ2U6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50LCAjZTBmZjdhKSA3MCUsIHRyYW5zcGFyZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50LCAjZTBmZjdhKSAyNCUsIHRyYW5zcGFyZW50KQogICAgICAgIGluc2V0Owp9CgoubWpyLW1mdi1nZW4tY29weS1mbGFzaCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc2LCAxNzUsIDgwLCAwLjI4KSAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi1nZW4tY2FyZC10aXRsZSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45MikpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1jYXJkLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICAgIC13ZWJraXQtbGluZS1jbGFtcDogNTsKICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtY29tcGFjdCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1tdWx0aWxpbmUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tc2VlZCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA3cHg7CiAgICAtd2Via2l0LWxpbmUtY2xhbXA6IHVuc2V0Owp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1icmFuY2gtZ3JvdXBzIHsKICAgIGdhcDogMTBweDsKfQoKLm1qci1tZnYtZ2VuLWJyYW5jaC1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogN3B4OwogICAgbWluLXdpZHRoOiAwOwogICAgcGFkZGluZzogOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7Cn0KCi5tanItbWZ2LWdlbi1icmFuY2gtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCg3OHB4LCBhdXRvKSAxZnI7CiAgICBnYXA6IDEwcHg7CiAgICBhbGlnbi1pdGVtczogc3RhcnQ7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tZmllbGQgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNTRweCwgYXV0bykgbWlubWF4KDAsIDFmcik7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tZmllbGQtdmFsdWUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLWxhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMTgwLCAxODAsIDE4MCwgMC43MikpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSk7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSA+IGRpdiwKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiBzZWN0aW9uIHsKICAgIG1hcmdpbi1ibG9jazogMCAxMHB4Owp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogNzYwcHgpIHsKICAgIC5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgICAgICBjb2x1bW5zOiBhdXRvOwogICAgICAgIGNvbHVtbi1jb3VudDogMTsKICAgICAgICBjb2x1bW4td2lkdGg6IGF1dG87CiAgICB9CgogICAgLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgPiAqIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgIH0KfQoKLm1qci1tZnYtb3ZlcmxheS1jYW52YXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTI7Cn0KCi5tanItbWZ2LXRvb2xiYXItc2VsZWN0IHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICB3aWR0aDogNzJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgovKiBFViBzbGlkZXIgYWN0aXZlIHN0YXRlICh2YWx1ZSAhPSAwKSAqLwoubWpyLW1mdi10b29sYmFyLXJhbmdlLmlzLWFjdGl2ZSBpbnB1dFt0eXBlPSJyYW5nZSJdIHsKICAgIGFjY2VudC1jb2xvcjogI2Y1Yzg0MjsKfQoubWpyLW1mdi10b29sYmFyLXJhbmdlLmlzLWFjdGl2ZSAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBjb2xvcjogI2Y1Yzg0MjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTBweDsKICAgIGxlZnQ6IDEwcHg7CiAgICB6LWluZGV4OiA2OwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgIHBhZGRpbmc6IDVweCA5cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCByZ2JhKDUsIDgsIDE0LCAwLjg2KSA4NiUsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxMTEpIDE0JSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2Y1ZjdmYSk7CiAgICBib3gtc2hhZG93OiAwIDJweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4yOCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xNnMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcy5pcy1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yLCAjZmY1YzdhKSA3MiUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCByZ2JhKDYwLCAxMCwgMTgsIDAuOSkgODIlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxOCUpOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcy10ZXh0IHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgovKiAtLSBXb3JrZmxvdyBTaWRlYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtc2lkZWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMnMgZWFzZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMjYwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWluLXdpZHRoOiAxODBweDsKICAgIG1heC13aWR0aDogNjUlOwogICAgdHJhbnNpdGlvbjogbm9uZTsKfQoKLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9Ci5tanItd3Mtc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0KLm1qci13cy1zaWRlYmFyLWJvZHkgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMDsKfQoubWpyLXdzLXNpZGViYXItZW1wdHkgewogICAgcGFkZGluZzogMjRweCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgovKiAtLSBUYWIgYmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLXRhYi1iYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZ2FwOiAycHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13cy10YWIgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICBjb2xvciAwLjE1czsKfQoKLm1qci13cy10YWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA3KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOwp9CgoubWpyLXdzLXRhYi5pcy1hY3RpdmUgewogICAgYmFja2dyb3VuZDogcmdiYSg5OSwgMTU1LCAyNTUsIDAuMTUpOwogICAgY29sb3I6ICM2MzliZmY7Cn0KCi8qIC0tIE5vZGVzIHRhYiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItd3Mtbm9kZXMtdGFiIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBHcmFwaCBNYXAgdGFiICovCi5tanItd2dtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLWhlaWdodDogMTAwJTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwp9CgoubWpyLXdnbS1tYXAtd3JhcCB7CiAgICBoZWlnaHQ6IDE5MHB4OwogICAgbWluLWhlaWdodDogMTUwcHg7CiAgICBtYXJnaW46IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIyKTsKfQoKLm1qci13Z20tcHJldmlldyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMzIpOwp9CgoubWpyLXdnbS1wcmV2aWV3IC5tanItbWZ2LW1lZGlhLAoubWpyLXdnbS1wcmV2aWV3IC5tanItbWZ2LXBsYXllci1ob3N0LAoubWpyLXdnbS1wcmV2aWV3IC5tanItbW9kZWwzZC1ob3N0LAoubWpyLXdnbS1wcmV2aWV3LW1lZGlhIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47Cn0KCi5tanItd2dtLXByZXZpZXctZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd2dtLWNhbnZhcyB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgY3Vyc29yOiBncmFiOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwp9CgoubWpyLXdnbS1jYW52YXM6YWN0aXZlIHsKICAgIGN1cnNvcjogZ3JhYmJpbmc7Cn0KCi5tanItd2dtLS1sYXJnZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tbWFwLXdyYXAgewogICAgZmxleDogMTsKICAgIGhlaWdodDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBtYXJnaW46IDA7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiAwOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tc3RhdHVzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICB0b3A6IDEwcHg7CiAgICB6LWluZGV4OiAyOwogICAgbWF4LXdpZHRoOiBtaW4oNDIwcHgsIGNhbGMoMTAwJSAtIDIwcHgpKTsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7Cn0KCi5tanItd2dtLXRvb2xiYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTBweDsKICAgIHRvcDogNDZweDsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogNnB4OwogICAgbWF4LXdpZHRoOiBtaW4oNDIwcHgsIGNhbGMoMTAwJSAtIDIwcHgpKTsKfQoKLm1qci13Z20tbW9kZSB7CiAgICBtaW4taGVpZ2h0OiAyNnB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1tb2RlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxNDksIDE4MywgMjU1LCAwLjQ1KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW1vZGUuaXMtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMjQsIDE4NiwgMjU1LCAwLjYyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDEyMywgMjE0LCAwLjI2KTsKICAgIGNvbG9yOiByZ2JhKDIzNSwgMjQ1LCAyNTUsIDAuOTYpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tZGV0YWlscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMTBweDsKICAgIHRvcDogMTBweDsKICAgIGJvdHRvbTogMTBweDsKICAgIHotaW5kZXg6IDI7CiAgICB3aWR0aDogbWluKDMyMHB4LCAzOCUpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjAsIDI2LCAwLjg0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWFjdGlvbiB7CiAgICBtaW4taGVpZ2h0OiAzMHB4Owp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tcGFyYW0gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1zdGF0dXMgewogICAgcGFkZGluZzogMCAxMHB4IDhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7Cn0KCi5tanItd2dtLWRldGFpbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDAgOHB4IDEwcHg7Cn0KCi5tanItd2dtLW5vZGUtdGl0bGUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLW1ldGEgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1hcmdpbi10b3A6IC00cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoKLm1qci13Z20tYnJlYWRjcnVtYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luOiAtMnB4IDAgMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41OCk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5tanItd2dtLWJyZWFkY3J1bWItaXRlbSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXgtd2lkdGg6IDE0MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tYnJlYWRjcnVtYi1zZXAgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zMik7Cn0KCi5tanItd2dtLWFjdGlvbnMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLWFjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzYpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1hY3Rpb246aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC40NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKfQoKLm1qci13Z20tYWN0aW9uLmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NiwgMTc1LCA4MCwgMC41NSk7CiAgICBjb2xvcjogcmdiYSgxOTAsIDI1NSwgMTk2LCAwLjk2KTsKfQoKLm1qci13Z20tcGFyYW1zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG1hcmdpbi10b3A6IDJweDsKfQoKLm1qci13Z20tcGFyYW0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDY0cHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLXdnbS1wYXJhbTpob3ZlciwKLm1qci13Z20tcGFyYW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tcGFyYW0uaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tcGFyYW0uaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLXBhcmFtLWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7Cn0KCi5tanItd2dtLXBhcmFtLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDExNSwgMTU1LCAyNTUsIDAuODgpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTE1LCAxNTUsIDI1NSwgMC4yMik7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudCkgMzQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdCkgMTAwJSwgdHJhbnNwYXJlbnQpLCByZ2JhKDQ0LCA1NiwgODgsIDAuMikpLAogICAgICAgIHJnYmEoMTMsIDE2LCAyNCwgMC44NSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGhlaWdodDogMnB4OwogICAgbWFyZ2luOiAtOHB4IC04cHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbW9kZWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDEyNCwgMTg2LCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg3MCwgMTIzLCAxODEsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1zYW1wbGVyIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxNDMsIDIyOCwgMTY3LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoNjQsIDEzMywgODgsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy10ZXh0IHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgyNTUsIDE5MiwgMTE0LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTU0LCAxMDIsIDQ5LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbWVkaWEgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDE1NCwgMTcwLCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg4MywgOTMsIDE2NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWNvbnRyb2wgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDI1NSwgMTM5LCAxNjksIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSgxNDUsIDcwLCA5NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWxvZ2ljIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxODgsIDE2OCwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTA1LCA4NiwgMTUzLCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50KSAyNSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC10eXBlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0NCwgMjU1LCAwLjk0KTsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLWlkIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDE5NCwgMjEzLCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBnYXA6IDhweDsKfQoKLm1qci13Z20tbm9kZS1wb3J0cy1jb2wgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzLXRpdGxlIHsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40NSk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiAzcHg7Cn0KCi5tanItd2dtLW5vZGUtcG9ydCwKLm1qci13Z20tbm9kZS1wb3J0LWVtcHR5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjQpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNik7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1kb3QgewogICAgd2lkdGg6IDhweDsKICAgIGhlaWdodDogOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpIGluc2V0Owp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZG90LmlzLWluIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTM1LCAxOTYsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWRvdC5pcy1vdXQgewogICAgYmFja2dyb3VuZDogcmdiYSgxNDQsIDIzOCwgMTc0LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtbmFtZSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtdHlwZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1heC13aWR0aDogNDUlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBwYWRkaW5nOiAxcHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGNvbG9yOiByZ2JhKDIyNCwgMjM2LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cy10aXRsZSB7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCwKLm1qci13Z20tbm9kZS13aWRnZXQtZW1wdHkgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDcwcHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQ6aG92ZXIsCi5tanItd2dtLW5vZGUtd2lkZ2V0OmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWVtcHR5IHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41Mik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSAubWpyLXdnbS1ub2RlLXdpZGdldC1rZXkgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIC5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWF4LWhlaWdodDogOS4yZW07CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZy1yaWdodDogMnB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUuaXMtdGV4dC1maWVsZCAubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICBtYXgtaGVpZ2h0OiAxNmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQtbW9yZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ2KTsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgpAbWVkaWEgKG1heC13aWR0aDogODIwcHgpIHsKICAgIC5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1kZXRhaWxzIHsKICAgICAgICB3aWR0aDogbWluKDM4MHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICB9CgogICAgLm1qci13Z20tbm9kZS1wb3J0cyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9Cn0KCi5tanItd3Mtc2VhcmNoLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItd3Mtc2VhcmNoLWljb24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci13cy1zZWFyY2ggewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IDRweCAyOHB4IDRweCAyNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci13cy1zZWFyY2g6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC41KTsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDE0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXdzLXNlYXJjaC1jbGVhcjpob3ZlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13cy1ub2Rlcy1saXN0IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi5tanItd3Mtbm9kZS1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItd3Mtbm9kZS1yb3ctdHlwZSB7CiAgICBmbGV4OiAxOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgoubWpyLXdzLW5vZGUtcm93LXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWF4LXdpZHRoOiA4MHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgZmxleC1zaHJpbms6IDA7CiAgICB3aWR0aDogMjJweDsKICAgIGhlaWdodDogMjJweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjFzLAogICAgICAgIGNvbG9yIDAuMXMsCiAgICAgICAgYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIC5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci13cy1ub2RlLWxvY2F0ZTpob3ZlciB7CiAgICBjb2xvcjogIzYzOWJmZjsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKfQoKLyogLS0gTm9kZSBzZWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy10cmVlLWl0ZW0gewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci5tanItd3MtdHJlZS1pdGVtID4gLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KLm1qci13cy10cmVlLWl0ZW0tLXN1YmdyYXBoIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA0JSwgdHJhbnNwYXJlbnQgOTYlKTsKfQoubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9Ci8qIFN1YnRsZSBoaWdobGlnaHQgd2hlbiB0aGlzIG5vZGUgbWF0Y2hlcyB0aGUgY3VycmVudCBncmFwaCBzZWxlY3Rpb24uICovCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyMTAsIDkwLCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDJweCAwIDAgMCByZ2JhKDI1NSwgMjEwLCA5MCwgMC43NSk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2ZmZDQ1YSAxOCUsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDgyJSk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXR5cGUgewogICAgY29sb3I6ICNmZmQ0NWE7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXRpdGxlIHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjI0LCAxMzAsIDAuODgpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10b2dnbGUsCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3MtbG9jYXRlLAoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUta2luZCB7CiAgICBjb2xvcjogI2ZmZDQ1YTsKfQoubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMTRweDsKICAgIHotaW5kZXg6IDI7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9CgoubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogNHB4OwogICAgaGVpZ2h0OiA1NnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xNXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDAuMTVzIGVhc2U7Cn0KCi5tanItd3Mtc2lkZWJhci5vcGVuOmhvdmVyIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci5pcy1yZXNpemluZyAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplci5pcy1kcmFnZ2luZzo6YmVmb3JlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItd3Mtc2lkZWJhci5pcy1yZXNpemluZyAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplcjpob3Zlcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXItcmVzaXplci5pcy1kcmFnZ2luZzo6YmVmb3JlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJyaWdodCJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIHJpZ2h0OiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIGxlZnQ6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgNDAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDYwJQogICAgKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjEycyBlYXNlOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZSAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSAyOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgNzIlCiAgICApOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZS5pcy1jb2xsYXBzZWQgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA4JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5MiUKICAgICk7Cn0KLm1qci13cy1ub2RlLXRvZ2dsZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoubWpyLXdzLW5vZGUtdGl0bGUtd3JhcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDFweDsKfQoubWpyLXdzLW5vZGUtdHlwZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLW5vZGUtdGl0bGUgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtbm9kZS1raW5kIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBtYXgtd2lkdGg6IDExMHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAzOCUsIHRyYW5zcGFyZW50IDYyJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsIHRyYW5zcGFyZW50IDg4JSk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDc4JSwgI2ZmZmZmZiAyMiUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItd3Mtbm9kZS1raW5kIC5waSB7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KLm1qci13cy1ub2RlLWtpbmQtY291bnQgewogICAgbWluLXdpZHRoOiAxNHB4OwogICAgcGFkZGluZzogMCAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2VkIC5tanItd3Mtbm9kZS1ib2R5IHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci13cy1ub2RlLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4Owp9Ci5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi8qIC0tIE5lc3RlZCBub2RlcyAoaW5zaWRlIHN1YmdyYXBocykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci13cy1ub2RlLS1uZXN0ZWQgewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4zNSk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA1JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NSUKICAgICk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTAlCiAgICApOwp9CgovKiAtLSBTdWJncmFwaCBjaGlsZHJlbiBncm91cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMjBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDYlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDk0JQogICAgKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBvcGFjaXR5OiAwLjg7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMC4xcyBlYXNlOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlLS1uZXN0ZWQgewogICAgcGFkZGluZy1sZWZ0OiAyOHB4Owp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgODglCiAgICApOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAxOwp9Ci5tanItd3MtY2hpbGRyZW4gewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4yNSk7CiAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgcGFkZGluZy1sZWZ0OiA2cHg7Cn0KCi5tanItd3Mtd2lkZ2V0LXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IG5vbmU7CiAgICBwYWRkaW5nLXRvcDogMDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IDAgMCA4MHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjU1KSk7CiAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLXdpZGdldC1pbnB1dCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItd3MtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KLm1qci13cy10ZXh0YXJlYSB7CiAgICByZXNpemU6IG5vbmU7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKfQoubWpyLXdzLXRleHQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLXdzLXRleHQtd3JhcHBlciAubWpyLXdzLXRleHRhcmVhIHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3MtZXhwYW5kLWJ0biB7CiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG9wYWNpdHk6IDAuODsKfQoubWpyLXdzLWV4cGFuZC1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9Ci5tanItd3MtcmVhZG9ubHkgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5tanItd3MtY2hlY2tib3ggewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgbWFyZ2luLXRvcDogNHB4Owp9Ci5tanItd3MtdG9nZ2xlLWxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgovKiAtLSBMb2NhdGUgYnV0dG9uIGluc2lkZSBub2RlIGhlYWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLXdzLWxvY2F0ZSB7CiAgICB3aWR0aDogMjRweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjU7Cn0KLm1qci13cy1sb2NhdGU6aG92ZXIgewogICAgb3BhY2l0eTogMTsKfQoKLyogLS0gUnVuIGJ1dHRvbiBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtcnVuLWNvbnRyb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4Owp9Ci5tanItbWZ2LXJ1bi1idG4gLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApOwp9Ci5tanItbWZ2LXJ1bi1idG4ucnVubmluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KLm1qci1tZnYtcnVuLWJ0bi5zdG9wcGluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmYTcyNik7Cn0KLm1qci1tZnYtcnVuLWJ0bi5lcnJvciAucGkgewogICAgY29sb3I6ICNmNDQzMzY7Cn0KCi5tanItbWZ2LXN0b3AtYnRuIC5waSB7CiAgICBjb2xvcjogI2VmNTM1MDsKfQoubWpyLW1mdi1zdG9wLWJ0bi5hY3RpdmUgLnBpIHsKICAgIGNvbG9yOiAjZmY4YTY1Owp9Ci5tanItbWZ2LXN0b3AtYnRuLnN0b3BwaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KTsKfQoKLyogLS0gRmxvYXRpbmcgVmlld2VyIHNpbXBsZSB2aWRlbyBwbGF5ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1zaW1wbGUtcGxheWVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIuaXMtYXVkaW8gewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyMCUgMjAlLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yKSwgcmdiYSgxOCwgMjAsIDI4LCAwLjk1KSk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYXVkaW8tYmFja2Ryb3AgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4ycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBwYWRkaW5nOiAxOHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWNvbnRyb2xzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEycHg7CiAgICByaWdodDogMTJweDsKICAgIGJvdHRvbTogMTJweDsKICAgIHotaW5kZXg6IDMwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2JhKDEwLCAxMCwgMTQsIDAuNzYpLCByZ2JhKDE2LCAxNiwgMjQsIDAuNTUpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItcm93IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWsgewogICAgLS1tanItc2Vlay1wY3Q6IDAlOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgdG8gcmlnaHQsCiAgICAgICAgI2ZmMmY1MiAwJSwKICAgICAgICAjZmYyZjUyIHZhcigtLW1qci1zZWVrLXBjdCksCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSB2YXIoLS1tanItc2Vlay1wY3QpLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgMTAwJQogICAgKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0bi5pcy1kaXNhYmxlZCwKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrLmlzLWRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNDU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItdGltZSB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1mcmFtZSB7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0LS1hdWRpbyB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDIwJSAyMCUsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjIpLCByZ2JhKDE4LCAyMCwgMjgsIDAuOTUpKTsKfQoKLm1qci1tZnYtcGxheWVyLWF1ZGlvLWJhY2tkcm9wIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4OwogICAgdGV4dC1zaGFkb3c6IDAgMnB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogMThweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgIHotaW5kZXg6IDMwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIHsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tcm93LS10b3AsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICBnYXA6IDhweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXRpbWVncm91cCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJvdy0tYm90dG9tLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1ib3R0b20sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1ib3R0b20gewogICAgZmxleC1zaHJpbms6IDE7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXRyYW5zcG9ydCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWdyb3VwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tZ3JvdXAgewogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1zZWVrLXdyYXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgbWluLXdpZHRoOiAwOwp9CgovKiBUaGUgTUZWIHVzZXMgdGhlICItLXZpZXdlciIgY29udHJvbCB2YXJpYW50LCB3aGljaCAodW5saWtlICItLXZpZXdlcmJhciIpCiAgIGRvZXMgbm90IHNpemUgdGhlIG5hdGl2ZSBzZWVrIGlucHV0IGFuZCBwYWNrcyBmcmFtZS9pbi9zZWVrL291dC90aW1lIGludG8gYQogICBzaW5nbGUgcm93LiBJbiB0aGUgbmFycm93IE1GViB0aGUgc2VlayB3cmFwIHRoZW4gY29sbGFwc2VzIHRvIH4wcHggd2lkZSBhbmQKICAgdGhlIG5hdGl2ZSBpbnB1dCB0byAwcHggdGFsbCwgbGVhdmluZyBhbG1vc3Qgbm8gY2xpY2sgLyBkcmFnIHRhcmdldCBmb3IKICAgc2NydWJiaW5nLiBHaXZlIHRoZSBzZWVrIGl0cyBvd24gZnVsbC13aWR0aCByb3cgd2l0aCBhIHVzYWJsZSBoaXQgYXJlYS4gKi8KLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICByb3ctZ2FwOiA0MnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXIgLm1qci12aWRlby1yb3ctLXRvcCAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBvcmRlcjogMTA7CiAgICBmbGV4OiAxIDEgMTAwJTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogNDJweDsKICAgIHBhZGRpbmctdG9wOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjBweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyIC5tanItdmlkZW8tc2Vlay16b25lcyB7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlciAubWpyLXZpZGVvLXNlZWstaGFuZGxlIHsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgdG9wOiAyMHB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tc2Vlay13cmFwLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG9yZGVyOiAtMTsKICAgIGZsZXg6IDEgMSAxMDAlOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0tb3V0LAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLW91dCB7CiAgICBmbGV4OiAwIDEgYXV0bzsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJhbmdlLWNvdW50LAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiBhdXRvOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tZnJhbWUgewogICAgbWluLXdpZHRoOiBhdXRvOwogICAgcGFkZGluZzogM3B4IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLW91dCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0tbWFyayB7CiAgICBtaW4td2lkdGg6IDMycHg7Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogOTAwcHgpIHsKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgICAgIGxlZnQ6IDhweDsKICAgICAgICByaWdodDogOHB4OwogICAgICAgIGJvdHRvbTogOHB4OwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgICAgICBnYXA6IDhweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1ib3R0b20gewogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWdyb3VwIHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhcgogICAgICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAgICAgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgICAgIG9yZGVyOiAtMTsKICAgICAgICBmbGV4OiAxIDEgMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgIH0KfQoKQGNvbnRhaW5lciAobWF4LXdpZHRoOiA2ODBweCkgewogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICAgICAgcGFkZGluZzogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tYnRuIHsKICAgICAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLW51bSB7CiAgICAgICAgcGFkZGluZzogNHB4IDZweDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10aW1lLAogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1mcmFtZSwKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIH0KfQoKLyogLS0gU2V0dGluZ3MgYnV0dG9uIGFjdGl2ZSBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKQogICAgKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDcwJSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxOCUKICAgICk7Cn0KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9CgovKiAtLSBDbG9zZSBidXR0b24gKHJlZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5tanItbWZ2IC5tanItbWZ2LWNsb3NlLWJ0biB7CiAgICBjb2xvcjogI2U4NTA1MDsKfQoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG46aG92ZXIgewogICAgY29sb3I6ICNmZjZiNmI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIzMiwgODAsIDgwLCAwLjE1KTsKfQoKLyogLS0gRW1wdHkgc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1lbXB0eSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMTJweDsKfQoKLyogLS0gQ29tcGFyZSBsYWJlbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41OCk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBwYWRkaW5nOiAycHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKfQoKLm1qci1tZnYtbGFiZWwubGFiZWwtbGVmdCB7CiAgICBsZWZ0OiA4cHg7Cn0KLm1qci1tZnYtbGFiZWwubGFiZWwtcmlnaHQgewogICAgcmlnaHQ6IDhweDsKfQoKLyogLS0gQUIgZGl2aWRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubWpyLW1mdi1hYi1kaXZpZGVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAwLjVweDsKICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgIHotaW5kZXg6IDEwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgMC41cHggcmdiYSgwLCAwLCAwLCAwLjQpLAogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEwMG1zIGVhc2U7Cn0KCi5tanItbWZ2LWFiLWRpdmlkZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLW1mdi1hYi1kaXZpZGVyOmhvdmVyLAoubWpyLW1mdi1hYi1kaXZpZGVyOmFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgTUZWIEdlb21ldHJ5ICYgTGF5b3V0IENsYXNzZXMgKHJlcGxhY2VzIGlubGluZSBzdHlsZXMgaW4gRmxvYXRpbmdWaWV3ZXIuanMpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBNYWluIE1GViBjb250YWluZXIgZ2VvbWV0cnkgKi8KLm1qci1tZnYgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiB2YXIoLS1tanItbWZ2LXRvcC1vZmZzZXQsIDYwcHgpOwogICAgcmlnaHQ6IDIwcHg7CiAgICB3aWR0aDogNjQwcHg7CiAgICBoZWlnaHQ6IDM2MHB4OwogICAgbWluLXdpZHRoOiAyMjBweDsKICAgIG1pbi1oZWlnaHQ6IDE2MHB4OwogICAgLyogQWx3YXlzIGZsZXg7IHZpc2liaWxpdHkgKyBvcGFjaXR5IGNvbnRyb2wgc2hvdy9oaWRlIHNvIENTUyB0cmFuc2l0aW9ucyB3b3JrLgogICAgICAgcG9pbnRlci1ldmVudHM6bm9uZSB3aGlsZSBoaWRkZW4gcHJldmVudHMgYWNjaWRlbnRhbCBpbnRlcmFjdGlvbi4gKi8KICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgcmVzaXplOiBib3RoOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHotaW5kZXg6IDEwMDAwOwogICAgLyogSGlkZGVuIHN0YXRlICovCiAgICBvcGFjaXR5OiAwOwogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTZweCkgc2NhbGUoMC45OCk7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMThzIGVhc2Utb3V0LAogICAgICAgIHZpc2liaWxpdHkgMHMgbGluZWFyIDAuMThzOwp9CgoubWpyLW1mdi5tanItbWZ2LS1yZXNpemluZyB7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1tZnYuaXMtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDEpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMThzIGVhc2Utb3V0LAogICAgICAgIHRyYW5zZm9ybSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB2aXNpYmlsaXR5IDBzIGxpbmVhciAwczsKfQoKLyogTWVkaWEgZWxlbWVudHMgKGltZy92aWRlbykgc2l6aW5nIHZhcmlhbnRzICovCi5tanItbWZ2LW1lZGlhIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwp9CgoubWpyLW1mdi1tZWRpYS0tZml0LWhlaWdodCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7Cn0KCi5tanItbWZ2LW1lZGlhLS1maWxsIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgovKiBBdWRpbyBjYXJkIGluc2lkZSBNRlYgKi8KLm1qci1tZnYtYXVkaW8tY2FyZCB7CiAgICB3aWR0aDogbWluKDkyJSwgNTYwcHgpOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKTsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKLm1qci1tZnYtYXVkaW8taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLW1mdi1hdWRpby1pY29uIHsKICAgIGNvbG9yOiB2YXIoLS1tanItYmFkZ2UtYXVkaW8sICNmZjk4MDApOwogICAgb3BhY2l0eTogMC45NTsKfQoKLm1qci1tZnYtYXVkaW8tdGl0bGUgewogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7Cn0KCi5tanItbWZ2LWF1ZGlvLXBsYXllciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZnYtc2lkZS1wYW5lbCAubWpyLW1mdi1hdWRpby1jYXJkLAoubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1hdWRpby1jYXJkLAoubWpyLW1mdi1ncmlkLWNlbGwgLm1qci1tZnYtYXVkaW8tY2FyZCB7CiAgICB3aWR0aDogY2FsYygxMDAlIC0gMjBweCk7Cn0KCi8qIFZpZGVvIGVsZW1lbnQgc3BlY2lmaWMgc3R5bGVzICovCi5tanItbWZ2LW1lZGlhLXZpZGVvIHsKICAgIC8qIEluaGVyaXRzIGZyb20gLm1qci1tZnYtbWVkaWEgb3IgLm1qci1tZnYtbWVkaWEtLWZpbGwgKi8KfQoKLyogTm9kZSBTdHJlYW0gLSBjdXJyZW50bHktc3RyZWFtZWQgbm9kZSBiYWRnZSAodG9wLWxlZnQgb2YgY29udGVudCBhcmVhLAogICBmb2xsb3dpbmcgdGhlIHNhbWUgb3ZlcmxheSBwYXR0ZXJuIGFzIC5tanItbWZ2LWdlbmluZm8pLiAqLwoubWpyLW1mdi1ub2RlLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBsZWZ0OiA4cHg7CiAgICB6LWluZGV4OiAxMjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgY29sb3I6ICNlNmYzZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE3MCwgMjQwLCAwLjQ1KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDE2cHgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQovKiBHZW4gaW5mbyBvdmVybGF5IC0gYWxsIG1vZGVzIHNoYXJlIGJhc2UgbGF5b3V0ICovCi5tanItbWZ2LWdlbmluZm8sCi5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgY29sb3I6ICNmZmY7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwp9CgovKiBLZWVwIEdlbiBJbmZvIGFib3ZlIGN1c3RvbSBzaW1wbGUtcGxheWVyIGNvbnRyb2xzIHdoZW4gcHJlc2VudC4gKi8KLm1qci1tZnYtZ2VuaW5mby5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciwKLm1qci1tZnYtZ2VuaW5mby1hLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyLAoubWpyLW1mdi1nZW5pbmZvLWIubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBGYWxsYmFjazogd2hlbiBzaW1wbGUtcGxheWVyIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgZ2VuaW5mbyBvdmVybGF5LAogICBtb3ZlIGl0IHVwIGV2ZW4gaWYgdGhlIG1vZGlmaWVyIGNsYXNzIHdhcyBub3QgYXR0YWNoZWQuICovCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogQUIgbW9kZSBvdmVybGF5cyBhcmUgYXR0YWNoZWQgYXQgY29udGFpbmVyIGxldmVsOyBzaGlmdCB0aGVtIHdoZW4gQUIgbGF5ZXJzIHVzZSBzaW1wbGUtcGxheWVyLiAqLwoubWpyLW1mdi1hYi1jb250YWluZXI6aGFzKC5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LXNpbXBsZS1wbGF5ZXIpIC5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtYWItY29udGFpbmVyOmhhcygubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1zaW1wbGUtcGxheWVyKSAubWpyLW1mdi1nZW5pbmZvLWIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBTaGFyZWQgc3R5bGUgZm9yIGFsbCBnZW4gaW5mbyBvdmVybGF5IHZhcmlhbnRzICovCi5tanItbWZ2LWdlbmluZm8gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOyAvKiBkZWZhdWx0IC0gb3ZlcnJpZGRlbiBwZXIgZmllbGQgYmVsb3cgKi8KfQoKLyogUGVyLWZpZWxkIGxhYmVsIGNvbG9ycyAqLwoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdlYzhmZjsKfSAvKiBibHVlICAgLSBQcm9tcHQgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9IC8qIGFtYmVyICAtIFNlZWQgICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0gLyogZ3JlZW4gIC0gTW9kZWwgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfSAvKiB2aW9sZXQgLSBMb1JBICAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9IC8qIG9yYW5nZSAtIFNhbXBsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY3YTlmOwp9IC8qIHBpbmsgICAtIFNjaGVkdWxlciAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0gLyogaW5kaWdvIC0gQ0ZHICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfSAvKiB0ZWFsICAgLSBTdGVwICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2UwZmY3YTsKfSAvKiBsaW1lICAgLSBHZW4gVGltZSAqLwoKLm1qci1tZnYtZ2VuaW5mbyBkaXYsCi5tanItbWZ2LWdlbmluZm8tYSBkaXYsCi5tanItbWZ2LWdlbmluZm8tYiBkaXYgewogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBtYXJnaW4tYm90dG9tOiAzcHg7Cn0KCi5tanItbWZ2LWdlbmluZm8gZGl2Omxhc3QtY2hpbGQsCi5tanItbWZ2LWdlbmluZm8tYSBkaXY6bGFzdC1jaGlsZCwKLm1qci1tZnYtZ2VuaW5mby1iIGRpdjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi8qIFNpbXBsZSBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1zaW1wbGUtY29udGFpbmVyIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi8qIEFCIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LWFiLWNvbnRhaW5lciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiAjMDAwOwp9CgovKiBBQiBtb2RlIGxheWVycyAqLwoubWpyLW1mdi1hYi1sYXllciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItbWZ2LWFiLWxheWVyLS1iIHsKICAgIC8qIGNsaXAtcGF0aCBhcHBsaWVkIGlubGluZSBmb3IgZHluYW1pYyBkaXZpZGVyIHBvc2l0aW9uICovCn0KCi8qIFNpZGUtYnktc2lkZSBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1zaWRlLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBnYXA6IDJweDsKICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBTaWRlLWJ5LXNpZGUgaGFsZiBwYW5lbHMgKi8KLm1qci1tZnYtc2lkZS1wYW5lbCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBkOwp9CgovKiBHcmlkIGNvbXBhcmUgKDItMikgY29udGFpbmVyICovCi5tanItbWZ2LWdyaWQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmciAxZnI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGdhcDogMnB4OwogICAgYmFja2dyb3VuZDogIzExMTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIEdyaWQgY2VsbHMgKi8KLm1qci1tZnYtZ3JpZC1jZWxsIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIEdlbiBpbmZvIG92ZXJsYXlzIGZvciBncmlkIGNlbGxzIEMgYW5kIEQgKi8KLm1qci1tZnYtZ2VuaW5mby1jLAoubWpyLW1mdi1nZW5pbmZvLWQgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbWF4LWhlaWdodDogNDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7Cn0KCi5tanItbWZ2LWdlbmluZm8tYyBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgZm9yIEMvRCBnZW4gaW5mbyBvdmVybGF5cyAqLwoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2FmZmQ0Owp9CgovKiBHZW4gaW5mbyBhY3RpdmUgc3RhdGUgLSBidXR0b24gZ2xvd3Mgd2hlbiBhdCBsZWFzdCBvbmUgZmllbGQgaXMgc2VsZWN0ZWQgKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0bi5pcy1vbiB7CiAgICBib3JkZXItY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCwgOTUsIDE3OSwgMjU1KSwgMC41NSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgODAlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxNSUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5pcy1vcGVuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDYyJSwgI2ZmZmZmZiAxMiUpOwogICAgY29sb3I6ICNlZWY3ZmY7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yOCksIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE0KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMjYlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLmlzLW9wZW4gewogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKfQoKLyogR2VuIGluZm8gZHJvcGRvd24gcGFuZWwgKi8KLm1qci1tZnYtZ2VuLWRyb3Bkb3duIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDAxOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDk2JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgcGFkZGluZzogNnB4IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xOCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjU1KSwKICAgICAgICAwIDJweCA2cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgZGlzcGxheTogbm9uZTsKICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJHRU4gSU5GTyI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgcGFkZGluZzogMnB4IDEwcHggNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4xKTsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLmlzLXZpc2libGUgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAxMDBtcyBlYXNlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3c6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA3KTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdyBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIHdpZHRoOiAxM3B4OwogICAgaGVpZ2h0OiAxM3B4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBUcmFuc2Zvcm0gZm9yIHBhbi96b29tIC0gYXBwbGllZCBpbmxpbmUgZm9yIGR5bmFtaWMgdmFsdWVzICovCi5tanItbWZ2LW1lZGlhLS10cmFuc2Zvcm0gewogICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyOwp9CgovKiBDdXJzb3IgZmVlZGJhY2sgZm9yIHBhbi96b29tIGludGVyYWN0aW9ucyAqLwoubWpyLW1mdi1jb250ZW50LS1ncmFiIHsKICAgIGN1cnNvcjogZ3JhYjsKfQoKLm1qci1tZnYtY29udGVudC0tZ3JhYmJpbmcgewogICAgY3Vyc29yOiBncmFiYmluZzsKfQoKLyogU2lkZWJhciB0YWIgYnV0dG9uOiBhbGxvdyAyLWxpbmUgbGFiZWwgdmlhIFxuIGluIGxhYmVsIHN0cmluZyAqLwoubWFqb29yLWFzc2V0cy10YWItYnV0dG9uIC5zaWRlLWJhci1idXR0b24tbGFiZWwgewogICAgd2hpdGUtc3BhY2U6IHByZS1saW5lOwp9CgovKiBCb3R0b20tcGFuZWwgZ2VuZXJhdGVkIGZlZWQ6IGNvbXBhY3QgY2FyZHMgd2l0aCBvbmx5IHRoZSBnZW5lcmF0aW9uLXRpbWUgcGlsbCAqLwoubWpyLWJvdHRvbS1mZWVkIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGF1dG87CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKQogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciwKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQgewogICAgZ2FwOiA2cHggIWltcG9ydGFudDsKICAgIG1hcmdpbi10b3A6IDAgIWltcG9ydGFudDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KG1pbigxMDAlLCAxMzJweCksIDFmcikpICFpbXBvcnRhbnQ7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgaGVpZ2h0OiBhdXRvOwogICAgYWxpZ24tY29udGVudDogc3RhcnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZCB7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4ICFpbXBvcnRhbnQ7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgIzAwMCA4JSkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgNnB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjIyKSAhaW1wb3J0YW50OwogICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkOmhvdmVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IDAgMTBweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC4yOCkgIWltcG9ydGFudDsKCiAgICAubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZC5pcy1zZWxlY3RlZCB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgICAgICAwIDAgMCA2cHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgMzAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgICAgIDAgMCAyMHB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDQwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpICFpbXBvcnRhbnQ7CiAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgIWltcG9ydGFudDsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0sCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWIgewogICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IC0xOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTQwbXMgZWFzZSwKICAgICAgICBvcGFjaXR5IDE0MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNXB4LCA1cHgpIHNjYWxlKDAuOTg1KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzIwMjQyYikgODQlLCAjMDAwIDE2JSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm94LXNoYWRvdzogMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTYpOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMHB4LCAxMHB4KSBzY2FsZSgwLjk3KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDgyJSwgIzAwMCAxOCUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCk7CiAgICBvcGFjaXR5OiAwLjc1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDZweCwgNnB4KSBzY2FsZSgwLjk4NSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDEycHgsIDEycHgpIHNjYWxlKDAuOTcpOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAwLjk1IC8gMSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDcyJSwgIzAwMCAyOCUpICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYi1wbGF5IHsKICAgIGJhY2tncm91bmQ6IHJhZGlhbC1ncmFkaWVudCgKICAgICAgICBjaXJjbGUgYXQgY2VudGVyLAogICAgICAgIHJnYmEoMCwgMCwgMCwgMC4xOCksCiAgICAgICAgcmdiYSgwLCAwLCAwLCAwLjA0KSAzOCUsCiAgICAgICAgdHJhbnNwYXJlbnQgNzAlCiAgICApOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtZXh0LAoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtcmF0aW5nLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYmFkZ2UtdGFncyB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTIpOwogICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIGxlZnQ7Cn0KCi8qIC0tIEZlZWQgY2FyZCBpbmZvOiBkZWZhdWx0IGhpZGRlbiwgdG9nZ2xlZCB2aWEgbWpyLWZlZWQtc2hvdy0qIGNsYXNzZXMgb24gLm1qci1ncmlkIC0tICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogNHB4IDZweCAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctaW5mbyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGZpbGVuYW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWZpbGVuYW1lIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGRpbWVuc2lvbnMgLyBkdXJhdGlvbiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRpbWVuc2lvbnMgLm1qci1tZXRhLXJlcywKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkYXRlL3RpbWUgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kYXRlIC5tanItbWV0YS10aW1lLXZhbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBnZW5lcmF0aW9uIHRpbWUgYmFkZ2UgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1nZW50aW1lIC5tanItbWV0YS1nZW50aW1lIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgd29ya2Zsb3cgZG90ICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRvdCAubWpyLWNhcmQtZG90LXdyYXBwZXIgewogICAgZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBiYWRnZXMgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtZXh0IC5tanItYmFkZ2UtZXh0IHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtcmF0aW5nIC5tanItYmFkZ2UtcmF0aW5nIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXRhZ3MgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBtZXRhIHJvdyBzdHlsaW5nIC0gZmxleCBsYXlvdXQgc28gdmlzaWJsZSBpdGVtcyBzdGF5IHNlcGFyYXRlZCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7CiAgICBmbGV4LXdyYXA6IG5vd3JhcCAhaW1wb3J0YW50OwogICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgZ2FwOiA1cHggIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMCAhaW1wb3J0YW50OwogICAgcGFkZGluZy1yaWdodDogMCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC43OCAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjhlbSAhaW1wb3J0YW50OwogICAgLyogdGV4dC1vdmVyZmxvdyBlbGxpcHNpcyBkb2Vzbid0IGFwcGx5IG9uIGEgZmxleCBjb250YWluZXIgaXRzZWxmICovCn0KLyogRWFjaCBtZXRhIHNwYW4gdHJ1bmNhdGVzIGluZGl2aWR1YWxseSBpZiB0b28gbG9uZyAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IHNwYW4gewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtc2hyaW5rOiAxOwp9Ci8qIEdlbnRpbWUgYmFkZ2UgYW5kIHRpbWUgdmFsdWUgc2hvdWxkIHN0YXkgdmlzaWJsZSAoZG9uJ3Qgc2hyaW5rIGF3YXkpICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLWdlbnRpbWUsCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWdlbnRpbWUgLm1qci1tZXRhLWdlbnRpbWUgewogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogM3B4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45OCk7CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7Cn0KCi8qIC0tIEF1ZGlvIC8gM0QgcGxhY2Vob2xkZXIgdGh1bWJuYWlscyBpbiB0aGUgZmVlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBBdWRpbyBjYXJkcyBzaG93IHRoZSB3YXZlZm9ybSBzcHJpdGU7IGdpdmUgaXQgYSBkaXN0aW5jdCBiYWNrZ3JvdW5kIHNvIGl0CiAgIGRvZXNuJ3QgbG9vayBsaWtlIGEgYnJva2VuIGltYWdlIHBsYWNlaG9sZGVyIGluIHRoZSBmZWVkLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJhdWRpbyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ibXAzIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJ3YXYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9nZyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmxhYyJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDYwJSwgIzFhMWYyYiA0MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIDNEIG1vZGVsIGNhcmRzIHVzZSBhbiBpY29uIHBsYWNlaG9sZGVyIC0gYWRkIGEgc3VidGxlIGdyYWRpZW50IHNvIHRoZXkgcmVhZAogICBhcyBpbnRlbnRpb25hbCByYXRoZXIgdGhhbiBtaXNzaW5nLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJtb2RlbDNkIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJnbGIiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImdsdGYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9iaiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmJ4Il0gLm1qci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNTAlLCAjMGQxMTE3IDUwJSkgIWltcG9ydGFudDsKfQoKLyogLS0gRmVlZCBncm91cCBidXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoubWpyLWJvdHRvbS1mZWVkIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1mZWVkLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24taWNvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiAtLSBGZWVkIGdyb3VwIHBvcG92ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyMjIpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yLCAjM2EzYTNhKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnLCA4cHgpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItdGl0bGUgewogICAgcGFkZGluZzogOHB4IDEwcHggNHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQgewogICAgcGFkZGluZzogNHB4IDhweCAxMHB4OwogICAgbWF4LWhlaWdodDogMzYwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwp9CgoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWljb24sCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDM0cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDI0LCAzNCwgMC45KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiA+ICogewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNHB4OwogICAgaGVpZ2h0OiA0cHg7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKfQoKLm1qci1maWxtc3RyaXA6aG92ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXRodW1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHBhZGRpbmc6IDdweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgMjQlIDI0JSwgcmdiYSg3OCwgMTg0LCAyNTUsIDAuMjgpLCB0cmFuc3BhcmVudCA0MiUpLAogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgODQlIDcwJSwgcmdiYSg4MiwgMjIwLCAxNTYsIDAuMTgpLCB0cmFuc3BhcmVudCA0MCUpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMTgsIDI1LCAzNSwgMC45NiksIHJnYmEoNywgMTAsIDE1LCAwLjk4KSk7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXdhdmVmb3JtIHsKICAgIHdpZHRoOiA3NiU7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiAycHg7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLXdhdmVmb3JtIHNwYW4gewogICAgd2lkdGg6IDJweDsKICAgIG1pbi1oZWlnaHQ6IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KSwgcmdiYSgxNDgsIDIxOCwgMjU1LCAwLjY4KSk7Cn0KCi5tanItZmlsbXN0cmlwLWF1ZGlvLWxhYmVsIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBwYWRkaW5nOiAycHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgZm9udC1zaXplOiA3cHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiAtLSBEdXBsaWNhdGUgc3RhY2sgYnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBTaG93cyBvbiB0aGUgcHJpbWFyeSBjYXJkIHdoZW4gc2FtZS1maWxlbmFtZSBkdXBsaWNhdGVzIGV4aXN0LiAgICAgICAgICAgICAqLwovKiBQb3NpdGlvbmVkIGF0IGJvdHRvbS1yaWdodCB0byBub3Qgb3ZlcmxhcCB0aGUgc3RhY2stZ3JvdXAgYnV0dG9uICh0b3AtcmlnaHQpLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDMwcHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMTgwLCAwLCAwLjM4KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgzMCwgMTgsIDAsIDAuODIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyMDAsIDYwLCAwLjk2KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzIpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDUwLCAzMCwgMCwgMC45NCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxODAsIDAsIDAuNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uID4gKiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWR1cC1zdGFja2VkPSJ0cnVlIl0gLm1qci1kdXAtc3RhY2stYnV0dG9uIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zMiksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAxODAsIDAsIDAuMik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1kdXAtc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiAtLSBWaXN1YWwgc3RhY2tpbmcgZWZmZWN0IC0gbGF5ZXJlZCBjYXJkcyBiZWhpbmQgdGhlIG1haW4gY2FyZCAtLS0tLS0tLS0tLS0gKi8KLyogQ3JlYXRlcyBwc2V1ZG8tZWxlbWVudCAiY2FyZHMiIG9mZnNldCBiZWhpbmQgdGhlIHByaW1hcnkgY2FyZCB0byB2aXN1YWxseSAgICAqLwovKiBjb21tdW5pY2F0ZSB0aGF0IHRoaXMgY2FyZCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbXVsdGlwbGUgaW1hZ2VzLiAgICAgICAgICAgICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMxYTFhMmUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogLTE7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxODBtcyBlYXNlLAogICAgICAgIG9wYWNpdHkgMTgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoM3B4LCAzcHgpIHJvdGF0ZSgxZGVnKTsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCA2cHgpIHJvdGF0ZSgyLjJkZWcpOwogICAgb3BhY2l0eTogMC4yNTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNHB4LCA0cHgpIHJvdGF0ZSgxLjVkZWcpOwogICAgb3BhY2l0eTogMC41NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg4cHgsIDhweCkgcm90YXRlKDNkZWcpOwogICAgb3BhY2l0eTogMC4zNTsKfQoKLm1qci1zdGFjay1ncm91cC1wb3BvdmVyIHsKICAgIHdpZHRoOiBtaW4oNDQwcHgsIDkydncpOwp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBMaWdodCBtb2RlIG92ZXJyaWRlcyAoQ29tZnlVSSB2MS40MisgaW1wcm92ZWQgbGlnaHQgdGhlbWUpCiAqIFVzZXMgQ29tZnlVSSBkYXRhLXRoZW1lIGF0dHJpYnV0ZSB3aGVuIHNldCwgd2l0aAogKiBwcmVmZXJzLWNvbG9yLXNjaGVtZSBhcyBhIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucy4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiBDb21meVVJIHNldHMgZGF0YS10aGVtZT0ibGlnaHQiIG9uIDxodG1sPiBvciA8Ym9keT4gKi8KOmlzKFtkYXRhLXRoZW1lPSJsaWdodCJdLCBbZGF0YS1jb2xvci1zY2hlbWU9ImxpZ2h0Il0pIC5tanItYXNzZXRzLW1hbmFnZXIsCjppcyhbZGF0YS10aGVtZT0ibGlnaHQiXSwgW2RhdGEtY29sb3Itc2NoZW1lPSJsaWdodCJdKSAubWpyLXBvcG92ZXIgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsICNmYWZhZmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2U4ZThlOCk7CiAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCByZ2JhKDAsIDAsIDAsIDAuMTQpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCByZ2JhKDAsIDAsIDAsIDAuNTUpKTsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKICAgIC8qIEZhbGxiYWNrOiBvbmx5IGFwcGx5IGlmIENvbWZ5VUkgaGFzbid0IHNldCBhbiBleHBsaWNpdCBkYXRhLXRoZW1lICovCiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyOm5vdChbZGF0YS10aGVtZS1hcHBsaWVkXSksCiAgICAubWpyLXBvcG92ZXI6bm90KFtkYXRhLXRoZW1lLWFwcGxpZWRdKSB7CiAgICAgICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAgICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCAjZmFmYWZhKTsKICAgICAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZThlOGU4KTsKICAgICAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAgICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgcmdiYSgwLCAwLCAwLCAwLjE0KSk7CiAgICAgICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHJnYmEoMCwgMCwgMCwgMC41NSkpOwogICAgICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKICAgIH0KfQoKLyogLS0tIFNrZWxldG9uIGxvYWRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi5tanItY2FyZC1za2VsZXRvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsICMzYTNhM2EpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcsIDhweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogTWF0Y2ggLm1qci10aHVtYiBhc3BlY3QgcmF0aW8gc28gc2tlbGV0b25zIGhhdmUgdGhlIHNhbWUgZm9vdHByaW50IGFzIHJlYWwgY2FyZHMuICovCiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwp9CgovKiBTaGltbWVyIHN3ZWVwICovCi5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICB0cmFuc3BhcmVudCAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzNhM2EzYSkgODAlLCB0cmFuc3BhcmVudCkgNTAlLAogICAgICAgIHRyYW5zcGFyZW50IDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1zaGltbWVyIDEuNHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwp9CgpAa2V5ZnJhbWVzIG1qci1zaGltbWVyIHsKICAgIGZyb20gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgfQp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci1jYXJkLXNrZWxldG9uOjphZnRlciB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lOwogICAgfQp9CgovKiAtLS0gUmVzcG9uc2l2ZSBzdW1tYXJ5IGJhciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogRW5hYmxlIGNvbnRhaW5lciBxdWVyaWVzIG9uIHRoZSBzdW1tYXJ5IGJhciBzbyBjaGlsZHJlbiBjYW4gcmVzcG9uZCB0byBpdHMKICogYWN0dWFsIHJlbmRlcmVkIHdpZHRoIChlLmcuIHdoZW4gdGhlIHBhbmVsIGlzIGRvY2tlZCBpbiBhIG5hcnJvdyBzaWRlYmFyKS4KICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5IHsKICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTsKICAgIGNvbnRhaW5lci1uYW1lOiBtanItc3VtbWFyeS1iYXI7Cn0KCi8qIEJlbG93IH4zODAgcHg6IGhpZGUgdGhlIHBpbGxzL3JpZ2h0IHNlY3Rpb24gdG8gcHJldmVudCBvdmVyZmxvdy4gKi8KQGNvbnRhaW5lciBtanItc3VtbWFyeS1iYXIgKG1heC13aWR0aDogMzgwcHgpIHsKICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXJpZ2h0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktdGV4dCB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgfQp9Cg==", "" + import.meta.url).toString(), n = document.createElement("link"); n.id = t, n.rel = "stylesheet", n.type = "text/css", n.href = e, n.onerror = () => { @@ -295,7 +295,7 @@ function li({ enabled: e = !0 } = {}) { } }, document.head.appendChild(n), n.onload = () => { try { - document.documentElement.dataset.mjrThemeComfy = "1", ci(); + document.documentElement.dataset.mjrThemeComfy = "1", ui(); } catch (e) { console.debug?.(e); } @@ -304,29 +304,29 @@ function li({ enabled: e = !0 } = {}) { console.warn("Majoor: failed to load Comfy theme CSS", e); } } -ci(); +ui(); // ui/features/grid/gridApi.ts -function ui() { +function fi() { let e = "mjr-grid-settings-styles"; if (document.getElementById(e)) return; let t = document.createElement("style"); t.id = e, t.textContent = "\n .mjr-grid .mjr-asset-card,\n .mjr-grid .mjr-card {\n display: flex;\n flex-direction: column;\n }\n .mjr-grid .mjr-thumb {\n flex: 0 0 auto;\n width: 100%;\n aspect-ratio: 1 / 1;\n min-height: 0;\n position: relative;\n overflow: hidden;\n }\n .mjr-grid .mjr-thumb-media {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n\n .mjr-grid .mjr-asset-card:hover {\n background-color: var(--mjr-card-hover-color) !important;\n }\n\n .mjr-grid .mjr-asset-card.is-selected {\n outline: 2px solid var(--mjr-card-selection-color) !important;\n box-shadow: 0 0 0 2px var(--mjr-card-selection-color) !important;\n }\n\n .mjr-grid .mjr-card-filename { display: none; }\n .mjr-grid.mjr-show-filename .mjr-card-filename { display: block; }\n\n .mjr-grid .mjr-card-dot-wrapper { display: none; }\n .mjr-grid.mjr-show-dot .mjr-card-dot-wrapper { display: inline-flex; }\n .mjr-grid .mjr-asset-status-dot {\n transition: color 0.3s ease, opacity 0.3s ease;\n }\n .mjr-grid .mjr-asset-status-dot.mjr-pulse-animation {\n animation: mjr-pulse 1.5s infinite;\n }\n @keyframes mjr-pulse {\n 0% { opacity: 1; }\n 50% { opacity: 0.4; }\n 100% { opacity: 1; }\n }\n\n .mjr-grid .mjr-meta-res { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-res { display: inline; }\n\n .mjr-grid .mjr-meta-duration { display: none; }\n .mjr-grid.mjr-show-dimensions .mjr-meta-duration { display: inline; }\n\n .mjr-grid .mjr-meta-date { display: none; }\n .mjr-grid.mjr-show-date .mjr-meta-date { display: inline; }\n\n .mjr-grid .mjr-meta-gentime { display: none; }\n .mjr-grid.mjr-show-gentime .mjr-meta-gentime { display: inline; }\n\n .mjr-grid .mjr-badge-ext { display: none !important; }\n .mjr-grid.mjr-show-badges-ext .mjr-badge-ext { display: flex !important; }\n\n .mjr-grid .mjr-badge-rating { display: none !important; }\n .mjr-grid.mjr-show-badges-rating .mjr-badge-rating { display: flex !important; }\n\n .mjr-grid .mjr-badge-tags { display: none !important; }\n .mjr-grid.mjr-show-badges-tags .mjr-badge-tags { display: flex !important; }\n\n .mjr-grid .mjr-card-info { display: none !important; }\n .mjr-grid.mjr-show-details .mjr-card-info { display: block !important; }\n\n .mjr-card-meta-row > span + span::before {\n content: \" \"¢ \";\n opacity: 0.5;\n margin: 0 4px;\n }\n .mjr-card-meta-row > span[style*=\"display: none\"] + span::before {\n display: none;\n }\n ", document.head.appendChild(t); } -function di(e) { +function pi(e) { if (!e) return; - ui(); + fi(); let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; t("mjr-show-filename", B.GRID_SHOW_DETAILS_FILENAME), t("mjr-show-dimensions", B.GRID_SHOW_DETAILS_DIMENSIONS), t("mjr-show-date", B.GRID_SHOW_DETAILS_DATE), t("mjr-show-gentime", B.GRID_SHOW_DETAILS_GENTIME), t("mjr-show-hover-info", B.GRID_SHOW_HOVER_INFO), t("mjr-show-dot", B.GRID_SHOW_WORKFLOW_DOT), t("mjr-show-badges-ext", B.GRID_SHOW_BADGES_EXTENSION), t("mjr-show-badges-rating", B.GRID_SHOW_BADGES_RATING), t("mjr-show-badges-tags", B.GRID_SHOW_BADGES_TAGS), t("mjr-show-details", B.GRID_SHOW_DETAILS), e.style.setProperty("--mjr-grid-min-size", `${B.GRID_MIN_SIZE}px`), e.style.setProperty("--mjr-grid-gap", `${B.GRID_GAP}px`), e.style.setProperty("--mjr-star-active", B.BADGE_STAR_COLOR), e.style.setProperty("--mjr-badge-image", B.BADGE_IMAGE_COLOR), e.style.setProperty("--mjr-badge-video", B.BADGE_VIDEO_COLOR), e.style.setProperty("--mjr-badge-audio", B.BADGE_AUDIO_COLOR), e.style.setProperty("--mjr-badge-model3d", B.BADGE_MODEL3D_COLOR), e.style.setProperty("--mjr-badge-duplicate-alert", B.BADGE_DUPLICATE_ALERT_COLOR), e.style.setProperty("--mjr-card-hover-color", B.UI_CARD_HOVER_COLOR), e.style.setProperty("--mjr-card-selection-color", B.UI_CARD_SELECTION_COLOR), e.style.setProperty("--mjr-rating-color", B.UI_RATING_COLOR), e.style.setProperty("--mjr-tag-color", B.UI_TAG_COLOR); } -function fi(e, { applySettingsClasses: t = !0 } = {}) { +function mi(e, { applySettingsClasses: t = !0 } = {}) { if (!e) return null; if (e.id = "mjr-assets-grid", e.classList.add("mjr-grid"), e.tabIndex = 0, e.setAttribute("role", "grid"), t) { - di(e); + pi(e); let t = () => { requestAnimationFrame(() => { - di(e); + pi(e); }); }; try { @@ -344,7 +344,7 @@ function fi(e, { applySettingsClasses: t = !0 } = {}) { } return e; } -function pi(e, t, ...n) { +function hi(e, t, ...n) { let r = { _mjrCaptureAnchor: "captureAnchor", _mjrDispose: "dispose", @@ -367,56 +367,56 @@ function pi(e, t, ...n) { console.debug?.(e); } } -function mi(e, t = {}, n = {}) { - return pi(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; +function gi(e, t = {}, n = {}) { + return hi(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; } -function hi(e, t = "*", n = {}) { - return pi(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ +function _i(e, t = "*", n = {}) { + return hi(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function gi(e, t, n = {}) { - return pi(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ +function vi(e, t, n = {}) { + return hi(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function _i(e) { - return pi(e, "_mjrPrepareForScopeSwitch"); +function yi(e) { + return hi(e, "_mjrPrepareForScopeSwitch"); } -function vi(e) { +function bi(e) { try { e?._mjrSettingsChangedCleanup?.(); } catch (e) { console.debug?.(e); } - return pi(e, "_mjrDispose"); + return hi(e, "_mjrDispose"); } -function yi(e) { - return pi(e, "_mjrRefreshGrid"); +function xi(e) { + return hi(e, "_mjrRefreshGrid"); } -function bi(e) { - return pi(e, "_mjrCaptureAnchor") ?? null; +function Si(e) { + return hi(e, "_mjrCaptureAnchor") ?? null; } -function xi(e, t) { - return pi(e, "_mjrRestoreAnchor", t); +function Ci(e, t) { + return hi(e, "_mjrRestoreAnchor", t); } -function Si(e, t, n = {}) { - return pi(e, "_mjrRemoveAssets", t, n) ?? { +function wi(e, t, n = {}) { + return hi(e, "_mjrRemoveAssets", t, n) ?? { ok: !1, removed: 0, selectedIds: [] }; } -function Ci(e, t) { - return !!pi(e, "_mjrUpsertAsset", t); +function Ti(e, t) { + return !!hi(e, "_mjrUpsertAsset", t); } -function wi(e, t) { - return !!pi(e, "_mjrUpsertAssetNow", t); +function Ei(e, t) { + return !!hi(e, "_mjrUpsertAssetNow", t); } // ui/features/panel/views/popoverManager.ts -function Ti(e, t) { +function Di(e, t) { if (!e || !t?.size) return !1; for (let n of t.values()) { let t = n?.popover || null; @@ -431,7 +431,7 @@ function Ti(e, t) { } return !1; } -function Ei(e) { +function Oi(e) { if (!e || e === document?.body) return !1; try { if (typeof e.matches == "function" && e.matches("[data-pc-name],[role='listbox'],[role='dialog'],[role='menu'],[role='tree'],[role='grid']")) return !0; @@ -445,7 +445,7 @@ function Ei(e) { ].join(" ").toLowerCase(); return /\b(p-|p_)?(select|listbox|multiselect|datepicker|calendar|overlay|panel|menu|dialog|tooltip|popover)\b/.test(t); } -function Di(e) { +function ki(e) { let t = /* @__PURE__ */ new Map(), n = null, r = 0, i = [], a = !1, o = !1, s = !1, c = new AbortController(), l = new AbortController(), u = !1, d = null, f = (e, t = "y") => { if (!e) return !1; let n = globalThis.getComputedStyle?.(e), r = String(t === "x" ? n?.overflowX || n?.overflow || "" : n?.overflowY || n?.overflow || ""); @@ -531,7 +531,7 @@ function Di(e) { for (let e of t.values()) _(e.popover, e.anchor); })); }, y = (e) => { - Ti(e?.target, t) || v(); + Di(e?.target, t) || v(); }, b = () => { if (t.size) { try { @@ -689,7 +689,7 @@ function Di(e) { try { let e = n; for (; e && e !== document.body && e.parentNode && e.parentNode !== document.body;) e = e.parentNode; - if (e && e !== document.body && e.parentNode === document.body && Ei(e)) for (let e of t.values()) try { + if (e && e !== document.body && e.parentNode === document.body && Oi(e)) for (let e of t.values()) try { if (!e?.popover) continue; if (e.popover.querySelector("[data-pc-name][aria-expanded='true']") || e.popover.querySelector("[aria-expanded='true'][role='combobox']")) return; } catch (e) { @@ -751,7 +751,7 @@ function Di(e) { }; } // ui/features/grid/GridKeyboard.ts -var Oi = { +var Ai = { OPEN_VIEWER: { key: "Enter", description: "Open selected in viewer" @@ -867,29 +867,29 @@ var Oi = { key: "ArrowRight", description: "Navigate right" } -}, ki = null; -function Ai() { - return ki ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), ki; +}, ji = null; +function Mi() { + return ji ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), ji; } -function ji(e) { +function Ni(e) { if (!e) return ""; let t = []; e.ctrl && t.push("Ctrl"), e.shift && t.push("Shift"), e.alt && t.push("Alt"); let n = e.key; return n === " " && (n = "Space"), n === "Delete" && (n = "Del"), n === "ArrowUp" && (n = "<-‘"), n === "ArrowDown" && (n = "<-“"), n === "ArrowLeft" && (n = "<-"), n === "ArrowRight" && (n = "->"), t.push(n.length === 1 ? n.toUpperCase() : n), t.join("+"); } -function Mi(e, t) { +function Pi(e, t) { if (!t || !e) return !1; let n = e.key.toLowerCase() === t.key.toLowerCase() || e.key === t.key, r = !!t.ctrl === (e.ctrlKey || e.metaKey), i = !!t.shift === e.shiftKey, a = !!t.alt === e.altKey; return n && r && i && a; } -var Ni = /* @__PURE__ */ new Map(); -function Pi(t, n, r) { +var Fi = /* @__PURE__ */ new Map(); +function Ii(t, n, r) { let i = t?.id; if (!i) return; let a = String(i); try { - let e = Ni.get(a); + let e = Fi.get(a); e && clearTimeout(e); } catch (e) { console.debug?.(e); @@ -901,7 +901,7 @@ function Pi(t, n, r) { } let o = setTimeout(async () => { try { - Ni.delete(a); + Fi.delete(a); let t = await _(i, n); if (!t?.ok) { e(t?.error || R("toast.ratingUpdateFailed"), "error"); @@ -915,23 +915,23 @@ function Pi(t, n, r) { console.error("[GridKeyboard] Rating update failed:", t), e(R("toast.ratingUpdateError"), "error"); } }, 350); - Ni.set(a, o); + Fi.set(a, o); } -function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = () => [], getActiveAsset: i = () => null, onOpenDetails: a = () => {}, onOpenTagsEditor: o = () => {}, onSelectionChanged: s = () => {}, onAssetChanged: c = () => {} } = {}) { +function Li({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = () => [], getActiveAsset: i = () => null, onOpenDetails: a = () => {}, onOpenTagsEditor: o = () => {}, onSelectionChanged: s = () => {}, onAssetChanged: c = () => {} } = {}) { if (!t) return { bind: () => {}, unbind: () => {}, dispose: () => {} }; let u = null, d = null, f = null, p = null, m = !1, h = !1, g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => { - Ai().then((r) => r.requestViewerOpen({ + Mi().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); }, _ = () => { try { - $n(t); + tr(t); } catch (e) { console.debug?.(e); } @@ -968,7 +968,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } }, x = (t) => { if (!t?.filepath) return !1; - let n = qe(t.filepath), r = document.createElement("a"); + let n = ct(t.filepath), r = document.createElement("a"); return r.href = n, r.download = t.filename || "download", document.body.appendChild(r), r.click(), document.body.removeChild(r), e(R("toast.downloadingFile", "Downloading {filename}...", { filename: t.filename }), "info", 3e3), !0; }, S = () => { try { @@ -1069,7 +1069,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = let e = document.activeElement, n = t.contains(e), r = e && e.contains && e.contains(t), i = e?.closest?.(".mjr-asset-card"); if (!n && !r && !i) return; } else { - let e = Xn(); + let e = Qn(); if (e && e !== t) return; } let u = () => { @@ -1084,38 +1084,38 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } let d = v(), f = b(), p = n(); - if (Mi(r, Oi.DOWNLOAD) && f?.filepath) { + if (Pi(r, Ai.DOWNLOAD) && f?.filepath) { u(), h = !0; return; } let m = !!fe().ratingHotkeysActive; if (!r.ctrlKey && !r.altKey && !r.metaKey && !r.shiftKey) { - if (!m && Mi(r, Oi.RATING_1) && f?.id) { - u(), Pi(f, 1, c); + if (!m && Pi(r, Ai.RATING_1) && f?.id) { + u(), Ii(f, 1, c); return; } - if (!m && Mi(r, Oi.RATING_2) && f?.id) { - u(), Pi(f, 2, c); + if (!m && Pi(r, Ai.RATING_2) && f?.id) { + u(), Ii(f, 2, c); return; } - if (!m && Mi(r, Oi.RATING_3) && f?.id) { - u(), Pi(f, 3, c); + if (!m && Pi(r, Ai.RATING_3) && f?.id) { + u(), Ii(f, 3, c); return; } - if (!m && Mi(r, Oi.RATING_4) && f?.id) { - u(), Pi(f, 4, c); + if (!m && Pi(r, Ai.RATING_4) && f?.id) { + u(), Ii(f, 4, c); return; } - if (!m && Mi(r, Oi.RATING_5) && f?.id) { - u(), Pi(f, 5, c); + if (!m && Pi(r, Ai.RATING_5) && f?.id) { + u(), Ii(f, 5, c); return; } - if (!m && Mi(r, Oi.RATING_RESET) && f?.id) { - u(), Pi(f, 0, c); + if (!m && Pi(r, Ai.RATING_RESET) && f?.id) { + u(), Ii(f, 0, c); return; } } - if ((Mi(r, Oi.OPEN_VIEWER) || Mi(r, Oi.OPEN_VIEWER_ALT)) && d.length > 0) { + if ((Pi(r, Ai.OPEN_VIEWER) || Pi(r, Ai.OPEN_VIEWER_ALT)) && d.length > 0) { u(); try { if (d.length >= 2 && d.length <= 4) g({ @@ -1138,8 +1138,8 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } catch (e) { console.error("[GridKeyboard] Open viewer failed:", e); } - } else if (Mi(r, Oi.METADATA_PANEL) && f) u(), a(f); - else if (Mi(r, Oi.COMPARE_AB) && d.length === 2) { + } else if (Pi(r, Ai.METADATA_PANEL) && f) u(), a(f); + else if (Pi(r, Ai.COMPARE_AB) && d.length === 2) { u(); try { g({ @@ -1150,7 +1150,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } catch (e) { console.debug?.(e); } - } else if (Mi(r, Oi.SIDE_BY_SIDE) && d.length >= 2 && d.length <= 4) { + } else if (Pi(r, Ai.SIDE_BY_SIDE) && d.length >= 2 && d.length <= 4) { u(); try { g({ @@ -1161,8 +1161,8 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = } catch (e) { console.debug?.(e); } - } else if (Mi(r, Oi.EDIT_TAGS) && f?.id) u(), o(f); - else if (Mi(r, Oi.ADD_TO_COLLECTION) && (d.length > 0 || f)) { + } else if (Pi(r, Ai.EDIT_TAGS) && f?.id) u(), o(f); + else if (Pi(r, Ai.ADD_TO_COLLECTION) && (d.length > 0 || f)) { u(); let e = d.length > 0 ? d : [f], n = t.getBoundingClientRect(); await Rt({ @@ -1171,7 +1171,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = assets: e }); } else { - if (Mi(r, Oi.REMOVE_FROM_COLLECTION)) { + if (Pi(r, Ai.REMOVE_FROM_COLLECTION)) { let t = p?.collectionId; if (t && (d.length > 0 || f)) { u(); @@ -1198,18 +1198,18 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = return; } } - if (Mi(r, Oi.COPY_PATH) && f?.filepath) { + if (Pi(r, Ai.COPY_PATH) && f?.filepath) { u(); try { await navigator.clipboard.writeText(f.filepath), e(R("toast.pathCopied"), "success", 2e3); } catch { e(R("toast.pathCopyFailed"), "error"); } - } else if (Mi(r, Oi.OPEN_IN_FOLDER) && f?.id) { + } else if (Pi(r, Ai.OPEN_IN_FOLDER) && f?.id) { u(); let t = await ne(f.id); t?.ok ? e(R("toast.openedInFolder"), "info", 2e3) : e(t?.error || R("toast.openFolderFailed"), "error"); - } else if (Mi(r, Oi.RENAME) && f?.id) { + } else if (Pi(r, Ai.RENAME) && f?.id) { u(); let t = f.filename || "", n = await wt(R("dialog.rename.title", "Rename file"), t), r = vt(n, t); if (r && r !== t) { @@ -1234,7 +1234,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = e(R("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); } } - } else if ((Mi(r, Oi.DELETE) || Mi(r, Oi.DELETE_ALT)) && (f?.id || d.length > 0)) { + } else if ((Pi(r, Ai.DELETE) || Pi(r, Ai.DELETE_ALT)) && (f?.id || d.length > 0)) { u(); let n = d.length > 0 ? d : [f], r = 0, i = 0, a = []; for (let e of n) if (e?.id) try { @@ -1262,7 +1262,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } s(); - } else if (Mi(r, Oi.SELECT_ALL)) { + } else if (Pi(r, Ai.SELECT_ALL)) { u(); let e = []; try { @@ -1287,7 +1287,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } s(); - } else if (Mi(r, Oi.DESELECT_ALL)) { + } else if (Pi(r, Ai.DESELECT_ALL)) { u(); try { typeof t?._mjrSetSelection == "function" ? t._mjrSetSelection([], "") : (y().filter((e) => e?.classList?.contains?.("is-selected")).forEach((e) => { @@ -1311,7 +1311,7 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = if (m && u) { document.removeEventListener("keydown", u, !0), d && document.removeEventListener("keyup", d, !0), f && document.removeEventListener("dragstart", f, !0), p && (t.removeEventListener("pointerdown", p, !0), t.removeEventListener("focusin", p, !0)), u = null, d = null, f = null, p = null, h = !1; try { - Yn(t); + Zn(t); } catch (e) { console.debug?.(e); } @@ -1321,12 +1321,12 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = console.debug?.(e); } m = !1; - for (let e of Ni.values()) try { + for (let e of Fi.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - Ni.clear(); + Fi.clear(); } }; return { @@ -1334,63 +1334,63 @@ function Fi({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = unbind: M, dispose: () => { M(); - for (let e of Ni.values()) try { + for (let e of Fi.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - Ni.clear(); + Fi.clear(); } }; } -function Ii(e) { - let t = Oi[e]; - return t ? ji(t) : ""; +function Ri(e) { + let t = Ai[e]; + return t ? Ni(t) : ""; } // ui/features/workflows/workflowInfoState.ts -var Li = xr({ +var zi = Cr({ open: !1, workflow: null }); -function Ri(e) { - Li.workflow = e || null, Li.open = !0; +function Bi(e) { + zi.workflow = e || null, zi.open = !0; } -function zi() { - Li.open = !1, Li.workflow = null; +function Vi() { + zi.open = !1, zi.workflow = null; } // ui/features/contextmenu/GridContextMenu.ts -var Bi = 1, Vi = null, Hi = null; -function Ui() { - return Vi ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), Vi; +var Hi = 1, Ui = null, Wi = null; +function Gi() { + return Ui ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), Ui; } -function Wi() { - return Hi ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), Hi; +function Ki() { + return Wi ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), Wi; } -function Gi(e) { +function qi(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.includes("open graph map") ? "graph-map" : t.includes("open in floating viewer") || t.includes("open floating viewer") ? "floating-viewer" : t.includes("rename") ? "rename" : t.includes("delete") ? "delete" : "" : ""; } function $(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = null } = {}) { return { - id: `mjr-grid-menu-item-${Bi++}`, + id: `mjr-grid-menu-item-${Hi++}`, type: "item", label: String(e || ""), iconClass: t ? String(t) : "", rightHint: n ? String(n) : "", - tone: Gi(e), + tone: qi(e), disabled: !!i, closeOnSelect: a, submenu: Array.isArray(o) && o.length ? o : null, action: typeof r == "function" ? r : null }; } -function Ki() { +function Ji() { return { - id: `mjr-grid-menu-separator-${Bi++}`, + id: `mjr-grid-menu-separator-${Hi++}`, type: "separator" }; } -var qi = (e) => { +var Yi = (e) => { let t = /* @__PURE__ */ new Set(); if (!e) return t; try { @@ -1412,7 +1412,7 @@ var qi = (e) => { console.debug?.(e); } return t; -}, Ji = (e) => { +}, Xi = (e) => { let t = []; if (!e) return t; try { @@ -1448,7 +1448,7 @@ var qi = (e) => { } return t; }; -async function Yi(e) { +async function Zi(e) { let t = String(e?.filepath || e?.path || e?.full_path || "").trim(); if (!t) return e; try { @@ -1467,53 +1467,53 @@ async function Yi(e) { return console.debug?.(t), e; } } -var Xi = (e) => { +var Qi = (e) => { try { let t = e?.filepath || e?.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; } catch { return ""; } -}, Zi = (e) => { +}, $i = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), - root_id: Me(e) || void 0, + root_id: ze(e) || void 0, kind: String(e.kind || "").toLowerCase() } : null; -}, Qi = (e) => { +}, ea = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || e.name || "").trim(); return t ? { filename: t, subfolder: e.subfolder || "", type: String(e.type || e.source || "output").toLowerCase(), - root_id: Me(e) || void 0 + root_id: ze(e) || void 0 } : null; }; -function $i(e, t = "") { +function ta(e, t = "") { if (!e) return; let n = document.createElement("a"); n.href = e, t && (n.download = t), document.body.appendChild(n), n.click(), document.body.removeChild(n); } -async function ea(t) { - let n = (Array.isArray(t) ? t.filter((e) => !ma(e)) : []).map(Qi).filter(Boolean); +async function na(t) { + let n = (Array.isArray(t) ? t.filter((e) => !ga(e)) : []).map(ea).filter(Boolean); if (n.length < 2) { e("Select at least two files to download a ZIP.", "warning", 2600); return; } let r = ""; try { - r = Ke("mjr_", 24); + r = Re("mjr_", 24); } catch (t) { P(t, "[GridContextMenu] Batch ZIP token", { showToast: B.DEBUG_VERBOSE_ERRORS }), e("Could not create a secure ZIP token.", "error"); return; } e(`Preparing ZIP for ${n.length} files...`, "info", 1800); - let i = await L(st.BATCH_ZIP_CREATE, { + let i = await L(it.BATCH_ZIP_CREATE, { token: r, items: n, strip_metadata: !1 @@ -1523,15 +1523,15 @@ async function ea(t) { return; } let a = i?.data?.filename || `Majoor_Batch_${n.length}.zip`; - $i(Qe(r), a), e(`Downloading ${a}...`, "info", 3e3); + ta(tt(r), a), e(`Downloading ${a}...`, "info", 3e3); } -async function ta(e) { +async function ra(e) { let t = Array.isArray(e) ? e.filter(Boolean) : [], n = await Promise.all(t.map(async (e) => { - let t = Zi(e); + let t = $i(e); if (!t) return null; - let n = (await Vn({ + let n = (await Un({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: t, index: !1 }))?.relativePath; @@ -1542,12 +1542,12 @@ async function ta(e) { } : null; })); return mn({ - app: $e(), + app: Ze(), items: n.filter(Boolean), event: null }); } -var na = (e) => { +var ia = (e) => { if (e) { try { if (typeof e?._mjrSetSelection == "function") e._mjrSetSelection([], ""); @@ -1564,10 +1564,10 @@ var na = (e) => { warnPrefix: "[GridContextMenu]" }); } -}, ra = (e, t, n, r) => { +}, aa = (e, t, n, r) => { if (!e) return; try { - na(e); + ia(e); } catch (e) { console.debug?.(e); } @@ -1587,7 +1587,7 @@ var na = (e) => { } catch (e) { console.debug?.(e); } -}, ia = (e) => { +}, oa = (e) => { let t = []; if (!e) return t; try { @@ -1609,7 +1609,7 @@ var na = (e) => { console.debug?.(e); } return t; -}, aa = (e, t) => { +}, sa = (e, t) => { try { let n = String(t ?? ""); return (e || []).findIndex((e) => String(e?.id ?? "") === n); @@ -1617,7 +1617,7 @@ var na = (e) => { return -1; } }; -function oa(e) { +function ca(e) { if (e == null) return null; try { return document.querySelector(`[data-mjr-asset-id="${yt(e)}"]`); @@ -1625,8 +1625,8 @@ function oa(e) { return console.debug?.(e), null; } } -function sa(e, t = null) { - let n = oa(e?.id); +function la(e, t = null) { + let n = ca(e?.id); if (!n || !n._mjrAsset || typeof n._mjrAsset != "object") return n; try { t && typeof t == "object" ? Object.assign(n._mjrAsset, t) : e && typeof e == "object" && Object.assign(n._mjrAsset, e); @@ -1635,7 +1635,7 @@ function sa(e, t = null) { } return n; } -var ca = (e) => { +var ua = (e) => { try { let t = e ? "grid-contextmenu" : "grid-contextmenu-global"; window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: t } })); @@ -1643,7 +1643,7 @@ var ca = (e) => { console.debug?.(e); } }; -async function la(e, t) { +async function da(e, t) { if (!e) return { ok: !1, error: "Missing asset" @@ -1658,7 +1658,7 @@ async function la(e, t) { ok: !1, error: "Missing filename" }; - let r = await L(st.INDEX_FILES, { + let r = await L(it.INDEX_FILES, { files: [n], incremental: !1 }); @@ -1670,7 +1670,7 @@ async function la(e, t) { let t = await I(e.id); if (t?.ok && t?.data && typeof t.data == "object") { Object.assign(e, t.data); - let n = sa(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); + let n = la(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); if (r) { let e = Et(n._mjrAsset); e && r.replaceWith(e); @@ -1679,12 +1679,12 @@ async function la(e, t) { } catch (e) { console.debug?.(e); } - return ca(t), { + return ua(t), { ok: !0, data: { refreshed: !0 } }; } -function ua(e, t, n) { +function fa(e, t, n) { let r = e?.id; try { e.rating = t; @@ -1713,29 +1713,29 @@ function ua(e, t, n) { P(e, "[GridContextMenu] Rating update", { showToast: B.DEBUG_VERBOSE_ERRORS }); }); } -function da(e) { +function pa(e) { let t = String(e?.scope || "").toLowerCase(); return t === "custom" || t === "input" || t === "output"; } -function fa() { +function ma() { try { - return !!(Jt()?.browser?.showFolders ?? !1); + return !!(Vn()?.browser?.showFolders ?? !1); } catch { return !1; } } -function pa(e) { +function ha(e) { return String(e?.scope || "").toLowerCase() === "workflow"; } -function ma(e) { +function ga(e) { return String(e?.kind || "").toLowerCase() === "folder"; } -function ha(e) { +function _a(e) { return String(e?.kind || "").toLowerCase() === "workflow"; } -function ga(e) { - if (!e || ma(e) || ha(e)) return !1; - let t = Xi(e); +function va(e) { + if (!e || ga(e) || _a(e)) return !1; + let t = Qi(e); if (!t) return !1; let n = String(e?.kind || "").toLowerCase(); if (n === "image" || n === "video") return !0; @@ -1754,27 +1754,27 @@ function ga(e) { "m4v" ].includes(r); } -async function _a(e) { - if (!e || ma(e)) return null; - let t = Kn(e); +async function ya(e) { + if (!e || ga(e)) return null; + let t = Jn(e); if (t) return t; let n = e?.id; if (n == null || n === "") return null; try { let t = await I(n, { timeoutMs: 3e4 }), r = t?.data; - if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Kn(e); + if (t?.ok && r && typeof r == "object") return Object.assign(e, r), Jn(e); } catch (e) { console.debug?.(e); } return null; } -async function va(t) { - let n = await _a(t); +async function ba(t) { + let n = await ya(t); if (!n || typeof n != "object") { e(R("toast.assetWorkflowMissing", "No embedded ComfyUI workflow was found for this asset."), "warn", 2600); return; } - let r = $e(), i = Ne(n, r); + let r = Ze(), i = Ne(n, r); if (!i.ok) { e(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); return; @@ -1782,14 +1782,14 @@ async function va(t) { let a = i.mode === "new-tab" ? R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab.") : R("toast.workflowLoaded", "Workflow loaded"); e(a, "success", 1800); } -async function ya(t) { +async function xa(t) { let n = String(t?.filepath || t?.path || t?.full_path || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let r = $e(); - if (Le(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; + let r = Ze(); + if (Ie(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let i = await y(n, { timeoutMs: 3e4 }), o = i?.data?.workflow || i?.workflow || null; if (!i?.ok || !o || typeof o != "object") { e(i?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); @@ -1804,7 +1804,7 @@ async function ya(t) { } e(R("toast.workflowLoaded", "Workflow loaded"), "success", 1800); } else { - let t = qe(n, { inline: !0 }); + let t = ct(n, { inline: !0 }); try { t && typeof window < "u" && window.open(t, "_blank", "noopener,noreferrer"); } catch (e) { @@ -1813,36 +1813,36 @@ async function ya(t) { e(R("toast.workflowImportFallback", "ComfyUI workflow import is unavailable in this frontend. Opened workflow JSON for manual import."), "warn"), s.mode === "new-tab" && e(R("toast.workflowLoadedNewTab", "Workflow loaded in a new ComfyUI tab."), "success"); } } -function ba(e) { +function Sa(e) { try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: e } })); } catch (e) { console.debug?.(e); } } -async function xa(t) { +async function Ca(t) { let n = String(t?.filepath || "").trim(), r = await le({ filepath: n }, { timeoutMs: 3e4 }); - r?.ok ? (e(R("toast.workflowSaved", "Workflow saved"), "success", 1800), ba("workflow-duplicate")) : e(r?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + r?.ok ? (e(R("toast.workflowSaved", "Workflow saved"), "success", 1800), Sa("workflow-duplicate")) : e(r?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Sa(t) { +async function wa(t) { let n = String(t?.filepath || "").trim(), r = String(t?.display_name || t?.filename || "").replace(/\.json$/i, ""), i = await wt(R("ctx.renameWorkflow", "Rename workflow"), r, R("tab.workflow", "Workflow")), a = String(i || "").trim(); if (!a) return; let o = await g({ filepath: n, name: a }, { timeoutMs: 3e4 }); - o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), ba("workflow-rename")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-rename")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Ca(t) { +async function Ta(t) { let n = String(t?.filepath || "").trim(), r = String(t?.subfolder || "").trim(), i = await wt(R("dialog.workflowCategory", "Workflow category"), r, R("tab.workflow", "Workflow")); if (i == null) return; let a = await g({ filepath: n, category: String(i || "") }, { timeoutMs: 3e4 }); - a?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), ba("workflow-categorize")) : e(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + a?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-categorize")) : e(a?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function wa(t) { +async function Ea(t) { let n = String(t?.filepath || "").trim(); if (!n) { e(R("toast.noFilePath"), "error"); @@ -1871,9 +1871,9 @@ async function wa(t) { filepath: n, source_filepath: a.filepath }, { timeoutMs: 3e4 }); - o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), ba("workflow-thumbnail")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-thumbnail")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Ta(t) { +async function Da(t) { let n = String(t?.filepath || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); @@ -1897,7 +1897,7 @@ async function Ta(t) { setTimeout(() => URL.revokeObjectURL(s), 5e3); } } -async function Ea(t) { +async function Oa(t) { let n = String(t?.filepath || "").trim(); if (!n) { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); @@ -1906,8 +1906,8 @@ async function Ea(t) { let r = await ne({ filepath: n }); r?.ok ? e(R("toast.openedInFolder", "Opened in folder"), "success", 1600) : e(r?.error || R("toast.openFolderFailed", "Failed to open folder."), "error"); } -async function Da(t) { - let n = Xi(t); +async function ka(t) { + let n = Qi(t); if (!n) { e(R("toast.noFilePath"), "error"); return; @@ -1923,16 +1923,16 @@ async function Da(t) { filepath: i, source_filepath: n }, { timeoutMs: a ? 75e3 : 3e4 }); - o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), ba("workflow-thumbnail-assign")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); + o?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), Sa("workflow-thumbnail-assign")) : e(o?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } -async function Oa(t) { +async function Aa(t) { let n = String(t?.filepath || "").trim(); if (!await Ut(R("dialog.deleteWorkflowConfirm", "Delete this workflow JSON and its adjacent thumbnail files?"), R("ctx.deleteWorkflow", "Delete workflow"))) return; let r = await te({ filepath: n }, { timeoutMs: 3e4 }); - r?.ok ? (e(R("toast.workflowDeleted", "Workflow deleted"), "success", 1800), ba("workflow-delete")) : e(r?.error || R("toast.fileDeleteFailed", "Failed to delete file."), "error"); + r?.ok ? (e(R("toast.workflowDeleted", "Workflow deleted"), "success", 1800), Sa("workflow-delete")) : e(r?.error || R("toast.fileDeleteFailed", "Failed to delete file."), "error"); } -function ka(e) { - let t = qi(e), n = Ji(e), r = n.length || t.size; +function ja(e) { + let t = Yi(e), n = Xi(e), r = n.length || t.size; return { selectedIds: t, selectedAssetsNow: n, @@ -1941,59 +1941,59 @@ function ka(e) { hasSelection: r > 0 }; } -function Aa(e, t) { +function Ma(e, t) { let n = (e) => "*".repeat(e) + "o".repeat(Math.max(0, 5 - e)), r = (t) => { - sa(e, { rating: t }); + la(e, { rating: t }); }; return [ $(n(5), "pi pi-star", null, async () => { - ua(e, 5, () => r(5)); + fa(e, 5, () => r(5)); }, { disabled: !t }), $(n(4), "pi pi-star", null, async () => { - ua(e, 4, () => r(4)); + fa(e, 4, () => r(4)); }, { disabled: !t }), $(n(3), "pi pi-star", null, async () => { - ua(e, 3, () => r(3)); + fa(e, 3, () => r(3)); }, { disabled: !t }), $(n(2), "pi pi-star", null, async () => { - ua(e, 2, () => r(2)); + fa(e, 2, () => r(2)); }, { disabled: !t }), $(n(1), "pi pi-star", null, async () => { - ua(e, 1, () => r(1)); + fa(e, 1, () => r(1)); }, { disabled: !t }), - Ki(), + Ji(), $(R("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { - ua(e, 0, () => r(0)); + fa(e, 0, () => r(0)); }, { disabled: !t }) ]; } -function ja(e, t) { +function Na(e, t) { let n = String(t?.dataset?.mjrScope || "").toLowerCase(); if (n !== "input" && n !== "output") return e; let r = String(e || "").trim().replaceAll("\\", "/"); return r ? `mjr://${n}/${r}` : `mjr://${n}`; } -function Ma({ currentPath: t, gridContainer: n } = {}) { +function Pa({ currentPath: t, gridContainer: n } = {}) { return [$(R("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => { try { let r = await wt(R("dialog.newFolderName", "New folder name"), ""), i = String(r || "").trim(); if (!i) return; let a = await Oe({ op: "create", - path: ja(t, n), + path: Na(t, n), name: i }); if (!a?.ok) { e(a?.error || "Failed to create folder", "error"); return; } - ca(n), e(R("toast.folderCreated", "Folder created: {name}", { name: i }), "success"); + ua(n), e(R("toast.folderCreated", "Folder created: {name}", { name: i }), "success"); } catch (t) { e(R("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: t?.message || String(t || "") }), "error"); } })]; } -function Na({ asset: t, gridContainer: n, panelState: r } = {}) { +function Fa({ asset: t, gridContainer: n, panelState: r } = {}) { let i = String(t?.filepath || "").trim(), a = [$(R("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => { try { n.dispatchEvent(new CustomEvent("mjr:open-folder-asset", { @@ -2008,7 +2008,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(R("toast.unableResolveFolderPath"), "error"); return; } - let n = await wt(R("dialog.browserRootLabelOptional"), String(t?.filename || "")), r = await L(st.CUSTOM_ROOTS, { + let n = await wt(R("dialog.browserRootLabelOptional"), String(t?.filename || "")), r = await L(it.CUSTOM_ROOTS, { path: i, label: String(n || "").trim() || void 0 }); @@ -2022,7 +2022,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { } } })]; - return da(r) && i && a.push(Ki(), $(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { + return pa(r) && i && a.push(Ji(), $(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { try { let t = await wt(R("dialog.newFolderName"), ""), r = String(t || "").trim(); if (!r) return; @@ -2035,7 +2035,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(a?.error || R("toast.createFolderFailed"), "error"); return; } - ca(n), e(R("toast.folderCreated", { name: r }), "success"); + ua(n), e(R("toast.folderCreated", { name: r }), "success"); } catch (t) { e(R("toast.createFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } @@ -2052,7 +2052,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(s?.error || R("toast.renameFolderFailed"), "error"); return; } - ca(n), e(R("toast.folderRenamed"), "success"); + ua(n), e(R("toast.folderRenamed"), "success"); } catch (t) { e(R("toast.renameFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } @@ -2069,7 +2069,7 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(a?.error || R("toast.moveFolderFailed"), "error"); return; } - ca(n), e(R("toast.folderMoved"), "success"); + ua(n), e(R("toast.folderMoved"), "success"); } catch (t) { e(R("toast.moveFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } @@ -2086,22 +2086,22 @@ function Na({ asset: t, gridContainer: n, panelState: r } = {}) { e(a?.error || R("toast.deleteFolderFailed"), "error"); return; } - ca(n), e(R("toast.folderDeleted"), "success"); + ua(n), e(R("toast.folderDeleted"), "success"); } catch (t) { e(R("toast.deleteFolderFailedDetail", { error: t?.message || String(t || "") }), "error"); } })), a; } -function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, pointerY: s, selection: c } = {}) { - let { selectedAssetsNow: u, effectiveSelectionCount: d, isMultiSelected: f, hasSelection: p } = c, m = [], h = pa(a), g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => Ui().then((r) => r.requestViewerOpen({ +function Ia({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, pointerY: s, selection: c } = {}) { + let { selectedAssetsNow: u, effectiveSelectionCount: d, isMultiSelected: f, hasSelection: p } = c, m = [], h = ha(a), g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => Gi().then((r) => r.requestViewerOpen({ assets: e, index: t, mode: n })).catch((e) => console.debug?.(e)); - if (ha(t)) { - if (m.push($(R("ctx.loadWorkflow", "Load workflow"), "pi pi-sitemap", null, () => ya(t)), $(R("ctx.duplicateWorkflow", "Duplicate workflow"), "pi pi-copy", null, () => xa(t)), $(R("ctx.renameWorkflow", "Rename workflow"), "pi pi-pencil", null, () => Sa(t)), $(R("ctx.categorizeWorkflow", "Set workflow category"), "pi pi-folder", null, () => Ca(t)), $(R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), "pi pi-image", null, () => wa(t)), $(R("ctx.editWorkflowInfo", "Edit infos"), "pi pi-info-circle", null, () => Ri(t)), $(R("ctx.exportWorkflow", "Export workflow"), "pi pi-download", null, () => Ta(t)), $(R("ctx.showInExplorer", "Show in Explorer"), "pi pi-folder-open", null, () => Ea(t)), $(R("ctx.deleteWorkflow", "Delete workflow"), "pi pi-trash", null, () => Oa(t)), Ki()), h) return m.push($("Open Graph Map", "pi pi-sitemap", null, async () => { + if (_a(t)) { + if (m.push($(R("ctx.loadWorkflow", "Load workflow"), "pi pi-sitemap", null, () => xa(t)), $(R("ctx.duplicateWorkflow", "Duplicate workflow"), "pi pi-copy", null, () => Ca(t)), $(R("ctx.renameWorkflow", "Rename workflow"), "pi pi-pencil", null, () => wa(t)), $(R("ctx.categorizeWorkflow", "Set workflow category"), "pi pi-folder", null, () => Ta(t)), $(R("ctx.setWorkflowThumbnail", "Set workflow thumbnail"), "pi pi-image", null, () => Ea(t)), $(R("ctx.editWorkflowInfo", "Edit infos"), "pi pi-info-circle", null, () => Bi(t)), $(R("ctx.exportWorkflow", "Export workflow"), "pi pi-download", null, () => Da(t)), $(R("ctx.showInExplorer", "Show in Explorer"), "pi pi-folder-open", null, () => Oa(t)), $(R("ctx.deleteWorkflow", "Delete workflow"), "pi pi-trash", null, () => Aa(t)), Ji()), h) return m.push($("Open Graph Map", "pi pi-sitemap", null, async () => { try { - let e = await Yi(t), { floatingViewerManager: n } = await Wi(); + let e = await Zi(t), { floatingViewerManager: n } = await Ki(); await n.openAssets({ assets: [e], index: 0, @@ -2112,9 +2112,9 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } })), m; } else if (h) return m; - m.push($("Open As New Tab", "pi pi-external-link", null, () => va(t)), $("Open Viewer", "pi pi-image", Ii("OPEN_VIEWER"), () => { + m.push($("Open As New Tab", "pi pi-external-link", null, () => ba(t)), $("Open Viewer", "pi pi-image", Ri("OPEN_VIEWER"), () => { try { - let e = (p ? Ji(i) : []).filter((e) => !ma(e)), n = e.length; + let e = (p ? Xi(i) : []).filter((e) => !ga(e)), n = e.length; if (n >= 2 && n <= 4) { g({ assets: e, @@ -2122,7 +2122,7 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p }); return; } - let r = ia(i).filter((e) => !ma(e)), a = aa(r, t?.id); + let r = oa(i).filter((e) => !ga(e)), a = sa(r, t?.id); if (!r.length || a < 0) return; g({ assets: r, @@ -2131,9 +2131,9 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - }), $("Open in Floating Viewer", "pi pi-window-maximize", Ii("OPEN_FLOATING_VIEWER"), async () => { + }), $("Open in Floating Viewer", "pi pi-window-maximize", Ri("OPEN_FLOATING_VIEWER"), async () => { try { - let { floatingViewerManager: e } = await Wi(), n = (p ? Ji(i) : []).filter((e) => !ma(e)); + let { floatingViewerManager: e } = await Ki(), n = (p ? Xi(i) : []).filter((e) => !ga(e)); if (n.length) { await e.openAssets({ assets: n, @@ -2149,11 +2149,11 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p console.debug?.(e); } }), $("Load Asset", "pi pi-upload", "L / L+Drop", async () => { - let n = (p ? Ji(i) : []).filter((e) => !ma(e)); - await ta(n.length ? n : [t]) || e("Failed to create a loader node for this asset.", "error"); + let n = (p ? Xi(i) : []).filter((e) => !ga(e)); + await ra(n.length ? n : [t]) || e("Failed to create a loader node for this asset.", "error"); }), $("Open Graph Map", "pi pi-sitemap", null, async () => { try { - let e = await Yi(t), { floatingViewerManager: n } = await Wi(); + let e = await Zi(t), { floatingViewerManager: n } = await Ki(); await n.openAssets({ assets: [e], index: 0, @@ -2162,17 +2162,17 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - }), $(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", Ii("METADATA_PANEL"), () => { + }), $(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", Ri("METADATA_PANEL"), () => { try { - ra(i, r, t, a); + aa(i, r, t, a); let e = i?._mjrOpenDetails; typeof e == "function" && e(); } catch (e) { console.debug?.(e); } - })), ga(t) && m.push($(R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), "pi pi-image", null, () => Da(t))); - let _ = (p ? u : []).filter((e) => !ma(e)), v = _.length; - v === 2 && m.push($("Compare A/B (2 selected)", "pi pi-clone", Ii("COMPARE_AB"), () => { + })), va(t) && m.push($(R("ctx.assignAsWorkflowThumbnail", "Use as workflow thumbnail"), "pi pi-image", null, () => ka(t))); + let _ = (p ? u : []).filter((e) => !ga(e)), v = _.length; + v === 2 && m.push($("Compare A/B (2 selected)", "pi pi-clone", Ri("COMPARE_AB"), () => { try { g({ assets: _, @@ -2182,7 +2182,7 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - })), v >= 2 && v <= 4 && m.push($(`Side-by-side (2x2) (${v} selected)`, "pi pi-table", Ii("SIDE_BY_SIDE"), () => { + })), v >= 2 && v <= 4 && m.push($(`Side-by-side (2x2) (${v} selected)`, "pi pi-table", Ri("SIDE_BY_SIDE"), () => { try { g({ assets: _, @@ -2192,10 +2192,10 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (e) { console.debug?.(e); } - })), m.push($(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", Ii("OPEN_IN_FOLDER"), async () => { + })), m.push($(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", Ri("OPEN_IN_FOLDER"), async () => { let n = await ne(t); n?.ok ? e(R("toast.openedInFolder"), "info", 2e3) : e(n?.error || R("toast.openFolderFailed"), "error"); - }, { disabled: !(t?.id || Xi(t)) }), $(R("ctx.collectFiles", "Collect files"), "pi pi-box", null, async () => { + }, { disabled: !(t?.id || Qi(t)) }), $(R("ctx.collectFiles", "Collect files"), "pi pi-box", null, async () => { e(R("toast.collectingFiles", "Collecting files..."), "info", 2500); let r = await n(t); if (!r?.ok) { @@ -2207,7 +2207,7 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p where: o }); a > 0 && (s += ` — ${a} ${R("toast.collectMissingInputs", "input(s) missing")}`), e(s, a > 0 ? "warning" : "success", 6e3); - }, { disabled: !Xi(t) }), $(R("ctx.copyPath", "Copy path"), "pi pi-copy", Ii("COPY_PATH"), async () => { + }, { disabled: !Qi(t) }), $(R("ctx.copyPath", "Copy path"), "pi pi-copy", Ri("COPY_PATH"), async () => { let n = t?.filepath ? String(t.filepath) : ""; if (!n) e(R("toast.noFilePath"), "error"); else try { @@ -2215,14 +2215,14 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p } catch (t) { console.warn(R("log.clipboardCopyFailed", "Clipboard copy failed"), t), e(R("toast.pathCopyFailed"), "error"); } - }), $(R("ctx.download", "Download"), "pi pi-download", Ii("DOWNLOAD"), () => { + }), $(R("ctx.download", "Download"), "pi pi-download", Ri("DOWNLOAD"), () => { if (!t?.filepath) return; - let n = qe(t.filepath), r = t.filename || "download"; - $i(n, r), e(R("toast.downloadingFile", "Downloading {filename}...", { filename: r }), "info", 3e3); + let n = ct(t.filepath), r = t.filename || "download"; + ta(n, r), e(R("toast.downloadingFile", "Downloading {filename}...", { filename: r }), "info", 3e3); }, { disabled: !t?.filepath }), $(`Download selected as ZIP (${v})`, "pi pi-file-zip", null, async () => { - await ea(_); - }, { disabled: v < 2 }), $("Add to collection...", "pi pi-bookmark", Ii("ADD_TO_COLLECTION"), async () => { - let e = Ji(i), n = e.length ? e : [t]; + await na(_); + }, { disabled: v < 2 }), $("Add to collection...", "pi pi-bookmark", Ri("ADD_TO_COLLECTION"), async () => { + let e = Xi(i), n = e.length ? e : [t]; await Rt({ x: o, y: s, @@ -2231,37 +2231,37 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p })); let y = String(a?.collectionId || "").trim(); if (y) { - let n = Ji(i), r = (n.length ? n : [t]).map(Xi).filter(Boolean), a = r.length > 1 ? `Remove from collection (${r.length})` : "Remove from collection"; + let n = Xi(i), r = (n.length ? n : [t]).map(Qi).filter(Boolean), a = r.length > 1 ? `Remove from collection (${r.length})` : "Remove from collection"; m.push($(a, "pi pi-bookmark", null, async () => { if (!r.length) { e(R("toast.noFilePath"), "error"); return; } let t = await k(y, r); - t?.ok ? ca(i) : e(t?.error || R("toast.removeFromCollectionFailed"), "error"); + t?.ok ? ua(i) : e(t?.error || R("toast.removeFromCollectionFailed"), "error"); })); } - let b = !!(t?.id || Xi(t)); - return m.push(Ki(), $(R("ctx.editTags", "Edit tags"), "pi pi-tags", Ii("EDIT_TAGS"), () => { - Fa(o + 6, s + 6, t, () => { - sa(t, { tags: Array.isArray(t?.tags) ? [...t.tags] : [] }); + let b = !!(t?.id || Qi(t)); + return m.push(Ji(), $(R("ctx.editTags", "Edit tags"), "pi pi-tags", Ri("EDIT_TAGS"), () => { + La(o + 6, s + 6, t, () => { + la(t, { tags: Array.isArray(t?.tags) ? [...t.tags] : [] }); }); - }, { closeOnSelect: !1 }), Ki(), $(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { + }, { closeOnSelect: !1 }), Ji(), $(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { disabled: !b, closeOnSelect: !1, - submenu: Aa(t, b) - }), Ki(), $(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { + submenu: Ma(t, b) + }), Ji(), $(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { if (t?.filename || t?.id) { e(R("toast.rescanningFile", "Rescanning file..."), "info", 1600); try { - let n = await la(t, i); + let n = await da(t, i); n?.ok ? e(R("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : e(n?.error || R("toast.resetFailed", "Failed to reset index"), "error"); } catch (t) { e(`${R("toast.resetFailed", "Failed to reset index")}: ${t?.message || String(t || "")}`, "error"); } } - }, { disabled: !(t?.filename || t?.id) }), $("Rename...", "pi pi-pencil", Ii("RENAME"), async () => { - if (!(t?.id || Xi(t))) return; + }, { disabled: !(t?.filename || t?.id) }), $("Rename...", "pi pi-pencil", Ri("RENAME"), async () => { + if (!(t?.id || Qi(t))) return; let n = t.filename || "", r = await wt(R("dialog.rename.title", "Rename file"), n), a = vt(r, n); if (!a || a === n) return; let o = Ot(a); @@ -2273,33 +2273,33 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p return; } let r = n?.data?.asset; - r && typeof r == "object" ? (Object.assign(t, r), sa(t, r)) : (t.filename = a, t.filepath &&= String(t.filepath).replace(/[^\\/]+$/, a), t.path &&= String(t.path).replace(/[^\\/]+$/, a), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = a, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, a)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, a))), sa(t, { + r && typeof r == "object" ? (Object.assign(t, r), la(t, r)) : (t.filename = a, t.filepath &&= String(t.filepath).replace(/[^\\/]+$/, a), t.path &&= String(t.path).replace(/[^\\/]+$/, a), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = a, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, a)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, a))), la(t, { filename: t.filename, filepath: t.filepath, path: t.path, file_info: t.file_info })); - let o = oa(t.id)?.querySelector?.(".mjr-filename"); - o && (o.textContent = t.filename || a), e(R("toast.fileRenamedSuccess"), "success"), ca(i); + let o = ca(t.id)?.querySelector?.(".mjr-filename"); + o && (o.textContent = t.filename || a), e(R("toast.fileRenamedSuccess"), "success"), ua(i); } catch (t) { e(R("toast.errorRenaming", "Error renaming file: {error}", { error: t?.message || String(t || "") }), "error"); } - }, { disabled: !(t?.id || Xi(t)) })), f ? m.push($(`Delete ${d} files...`, "pi pi-trash", Ii("DELETE"), async () => { + }, { disabled: !(t?.id || Qi(t)) })), f ? m.push($(`Delete ${d} files...`, "pi pi-trash", Ri("DELETE"), async () => { if (await _t(Number(d) || 0)) try { let n = 0, r = 0, o = [], s = 0, c = u.length ? u : [t]; for (let e of c) (await l(e))?.ok ? (n += 1, e?.id == null ? s += 1 : o.push(String(e.id))) : r += 1; if (o.length) { - let e = Si(i, o); + let e = wi(i, o); a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || ""); } - s > 0 && ca(i), r === 0 ? e(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n }), "success") : e(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { + s > 0 && ua(i), r === 0 ? e(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n }), "success") : e(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { success: n, failed: r }), "warning"); } catch (t) { e(R("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); } - })) : m.push($(R("ctx.delete", "Delete"), "pi pi-trash", Ii("DELETE"), async () => { + })) : m.push($(R("ctx.delete", "Delete"), "pi pi-trash", Ri("DELETE"), async () => { if (await _t(1, t?.filename)) try { let n = await l(t); if (!n?.ok) { @@ -2307,24 +2307,24 @@ function Pa({ asset: t, card: r, gridContainer: i, panelState: a, pointerX: o, p return; } if (t?.id) { - let e = Si(i, [String(t.id)]); + let e = wi(i, [String(t.id)]); a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || ""); - } else ca(i); + } else ua(i); e(R("toast.fileDeletedSuccess"), "success"); } catch (t) { e(R("toast.errorDeleting", "Error deleting file: {error}", { error: t?.message || String(t || "") }), "error"); } - }, { disabled: !(t?.id || Xi(t)) })), m; + }, { disabled: !(t?.id || Qi(t)) })), m; } -function Fa(e, t, n, r) { - n && Ln({ +function La(e, t, n, r) { + n && Rn({ x: e, y: t, asset: n, onChanged: r }); } -function Ia({ gridContainer: e, getState: t = () => ({}) } = {}) { +function Ra({ gridContainer: e, getState: t = () => ({}) } = {}) { if (!e) return; if (e._mjrGridContextMenuBound && typeof e._mjrGridContextMenuUnbind == "function") return e._mjrGridContextMenuUnbind; let n = async (n) => { @@ -2336,13 +2336,13 @@ function Ia({ gridContainer: e, getState: t = () => ({}) } = {}) { } })(), i = Mt(n.target, ".mjr-asset-card"); if (!i) { - if (!da(r)) return; - let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && fa(); + if (!pa(r)) return; + let t = String(e?.dataset?.mjrScope || "").toLowerCase(), i = String(e?.dataset?.mjrSubfolder || "").trim(), a = (t === "input" || t === "output") && ma(); if (!i && !a) return; n.preventDefault(), n.stopPropagation(), tn({ x: n.clientX, y: n.clientY, - items: Ma({ + items: Pa({ currentPath: i, gridContainer: e }) @@ -2352,11 +2352,11 @@ function Ia({ gridContainer: e, getState: t = () => ({}) } = {}) { n.preventDefault(), n.stopPropagation(); let a = i._mjrAsset; if (!a) return; - let o = ka(e), s = ma(a) ? Na({ + let o = ja(e), s = ga(a) ? Fa({ asset: a, gridContainer: e, panelState: r - }) : Pa({ + }) : Ia({ asset: a, card: i, gridContainer: e, @@ -2407,8 +2407,8 @@ function Ia({ gridContainer: e, getState: t = () => ({}) } = {}) { return e._mjrGridContextMenuUnbind = r, r; } // ui/features/panel/controllers/ratingHotkeysController.ts -var La = ot; -function Ra(e) { +var za = ot; +function Ba(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -2417,10 +2417,10 @@ function Ra(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function za(e, t = null) { +function Va(e, t = null) { if (!e) return []; try { - let t = Array.from(Jn(e)); + let t = Array.from(Xn(e)); if (t.length) return t; } catch (e) { console.debug?.(e); @@ -2433,14 +2433,14 @@ function za(e, t = null) { } return []; } -function Ba(e, t) { +function Ha(e, t) { try { - return e?.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ra(t)}"]`); + return e?.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ba(t)}"]`); } catch (e) { return console.debug?.(e), null; } } -function Va(e, t, n) { +function Ua(e, t, n) { if (!e) return; let r = e._mjrAsset; r && (r.rating = n); @@ -2453,7 +2453,7 @@ function Va(e, t, n) { console.debug?.(e); } } -async function Ha(e, t, n = 5) { +async function Wa(e, t, n = 5) { let r = Math.max(1, Number(n) || 1), i = 0, a = [], o = async () => { for (; i < e.length;) { let n = i; @@ -2468,7 +2468,7 @@ async function Ha(e, t, n = 5) { for (let t = 0; t < Math.min(r, e.length); t += 1) a.push(o()); await Promise.all(a); } -function Ua({ gridContainer: t, createRatingBadge: n } = {}) { +function Ga({ gridContainer: t, createRatingBadge: n } = {}) { let r = !1, i = null, a = null, o = async (t, n) => { if (t != null) { try { @@ -2483,7 +2483,7 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { return; } try { - window.dispatchEvent(new CustomEvent(La, { detail: { + window.dispatchEvent(new CustomEvent(za, { detail: { assetId: String(t), rating: n } })); @@ -2507,13 +2507,13 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { if (!a && !s && !c) return; let l = r === "0" ? 0 : Number(r); if (!Number.isFinite(l)) return; - let u = za(t, e.target); - u.length && (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation?.(), await Ha(u, (e) => o(e, l), 5)); + let u = Va(t, e.target); + u.length && (e.preventDefault(), e.stopPropagation(), e.stopImmediatePropagation?.(), await Wa(u, (e) => o(e, l), 5)); }, a = (e) => { let r = e?.detail || {}, i = r.assetId ?? r.id ?? null, a = Number(r.rating); if (!i || !Number.isFinite(a)) return; - let o = Ba(t, i); - o && Va(o, n, a); + let o = Ha(t, i); + o && Ua(o, n, a); }; try { window.addEventListener("keydown", i, { capture: !0 }); @@ -2521,7 +2521,7 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { console.debug?.(e); } try { - window.addEventListener(La, a); + window.addEventListener(za, a); } catch (e) { console.debug?.(e); } @@ -2536,7 +2536,7 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { console.debug?.(e); } try { - window.removeEventListener(La, a); + window.removeEventListener(za, a); } catch (e) { console.debug?.(e); } @@ -2546,7 +2546,7 @@ function Ua({ gridContainer: t, createRatingBadge: n } = {}) { }; } // ui/features/grid/StackGroupCards.ts -function Wa(e) { +function Ka(e) { if (!e || e.dataset?.mjrOverlayButtonBound === "1") return e; try { e.dataset.mjrOverlayButtonBound = "1"; @@ -2565,7 +2565,7 @@ function Wa(e) { }; return e.addEventListener("pointerdown", t), e.addEventListener("mousedown", n), e.addEventListener("touchstart", t, { passive: !0 }), e.addEventListener("dblclick", t), e.addEventListener("keydown", t), e.addEventListener("dragstart", n), e; } -function Ga(e, t, n = null, r = "mjr-stack-group-button-count") { +function qa(e, t, n = null, r = "mjr-stack-group-button-count") { e.textContent = ""; let i = document.createElement("span"); if (i.className = t, e.appendChild(i), n != null) { @@ -2573,24 +2573,24 @@ function Ga(e, t, n = null, r = "mjr-stack-group-button-count") { t.className = r, t.textContent = String(n), e.appendChild(t); } } -function Ka(e) { +function Ja(e) { return String(e?.dataset?.mjrGroupStacks || "") === "1"; } -function qa(e) { +function Ya(e) { let t = String(e?.stack_id || "").trim(); return t ? `stack:${t}` : ""; } -function Ja(e, t, n) { - return Ka(e) && qa(t) || n; +function Xa(e, t, n) { + return Ja(e) && Ya(t) || n; } -function Ya(e) { +function Za(e) { try { e._mjrStackMembersCache?.clear?.(); } catch (e) { console.debug?.(e); } } -function Xa(e, t, n) { +function Qa(e, t, n) { if (!t || !n || t._mjrIsVue) return; let r = !!n._mjrDupStack, i = Number(n._mjrDupCount || 0) || 0; if (!r || i < 2) { @@ -2600,7 +2600,7 @@ function Xa(e, t, n) { } t.dataset.mjrDupStacked = "true", t.dataset.mjrDupCount = String(i); let a = t.querySelector(".mjr-dup-stack-button"); - a || (a = document.createElement("button"), a.type = "button", a.className = "mjr-dup-stack-button", a.setAttribute("aria-label", "Show all duplicates"), Wa(a), a.addEventListener("click", (e) => { + a || (a = document.createElement("button"), a.type = "button", a.className = "mjr-dup-stack-button", a.setAttribute("aria-label", "Show all duplicates"), Ka(a), a.addEventListener("click", (e) => { if (e.preventDefault(), e.stopPropagation(), a.dataset?.mjrStackOpening !== "1") try { a.dataset.mjrStackOpening = "1", a.disabled = !0; let e = a?._mjrGridContainer, t = a?._mjrAsset; @@ -2626,21 +2626,21 @@ function Xa(e, t, n) { } }), t.appendChild(a)), a._mjrGridContainer = e, a._mjrAsset = n; let o = `${i} duplicate${i > 1 ? "s" : ""}`; - a.title = `${o} - click to compare all copies`, Ga(a, "pi pi-copy", i, "mjr-dup-stack-count"); + a.title = `${o} - click to compare all copies`, qa(a, "pi pi-copy", i, "mjr-dup-stack-count"); } // ui/features/dnd/utils/log.ts -var Za = () => { +var $a = () => { try { return !!window?.MJR_DND_DEBUG; } catch { return !1; } -}, Qa = (...e) => { - Za() && console.debug("[Majoor.DnD]", ...e); -}, $a = (e, { buildCustomViewURL: t, buildViewURL: n }) => { +}, eo = (...e) => { + $a() && console.debug("[Majoor.DnD]", ...e); +}, to = (e, { buildCustomViewURL: t, buildViewURL: n }) => { let r = String(e?.type || "output").toLowerCase(); - return r === "custom" ? t(e?.filename || "", e?.subfolder || "", Me(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); -}, eo = (e) => { + return r === "custom" ? t(e?.filename || "", e?.subfolder || "", ze(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); +}, no = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t || t.includes("/") || t.includes("\\") || t.includes("\0")) return null; @@ -2653,41 +2653,41 @@ var Za = () => { kind: o || void 0, filepath: o === "workflow" && s ? s : void 0 }; -}, to = eo, no = (e, t) => { +}, ro = no, io = (e, t) => { let n = e?.dataTransfer?.getData?.(t); if (!n) return null; try { - return eo(JSON.parse(n)); + return no(JSON.parse(n)); } catch { return null; } -}, ro = /* @__PURE__ */ new WeakMap(), io = !1; -function ao(e) { - return e && ro.get(e) || null; -} -function oo(e, t) { - return e ? typeof t == "function" ? (ro.set(e, t), t) : (ro.delete(e), null) : null; -} +}, ao = /* @__PURE__ */ new WeakMap(), oo = !1; function so(e) { - e && ro.delete(e); + return e && ao.get(e) || null; } -function co() { - io = !0; +function co(e, t) { + return e ? typeof t == "function" ? (ao.set(e, t), t) : (ao.delete(e), null) : null; } -function lo() { - return io ? (io = !1, !0) : !1; +function lo(e) { + e && ao.delete(e); } function uo() { - io = !1; + oo = !0; +} +function fo() { + return oo ? (oo = !1, !0) : !1; +} +function po() { + oo = !1; } // ui/features/dnd/out/DragOut.ts -var fo = (e) => { +var mo = (e) => { try { return new URL(String(e || ""), window.location.href).href; } catch { return String(e || ""); } -}, po = () => Ke("mjr_", 24), mo = (e) => { +}, ho = () => Re("mjr_", 24), go = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return null; let n = t.filename || t.name; @@ -2695,9 +2695,9 @@ var fo = (e) => { filename: n, subfolder: t.subfolder || "", type: String(t.type || "output").toLowerCase(), - root_id: Me(t) || void 0 + root_id: ze(t) || void 0 } : null; -}, ho = (e, t) => { +}, _o = (e, t) => { let n = []; if (!e || !t) return n; let r = t?.dataset?.mjrAssetId ? String(t.dataset.mjrAssetId) : ""; @@ -2747,25 +2747,25 @@ var fo = (e) => { t && typeof t == "object" && n.push(t); } return n; -}, go = (e) => { +}, vo = (e) => { if (!e || typeof e != "object") return ""; let t = e.filepath || e.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; -}, _o = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { +}, yo = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { if (!e || !t) return; - let o = ho(n, r); + let o = _o(n, r); if (Array.isArray(o) && o.length > 1) { - let t = o.map(mo).filter(Boolean); + let t = o.map(go).filter(Boolean); if (t.length > 1) { let n = ""; try { - n = po(); + n = ho(); } catch (e) { console.warn("[DragOut] failed to create secure batch token", e); } if (n) { try { - L(st.BATCH_ZIP_CREATE, { + L(it.BATCH_ZIP_CREATE, { token: n, items: t, strip_metadata: !!a @@ -2773,7 +2773,7 @@ var fo = (e) => { } catch (e) { console.debug?.(e); } - let r = fo(Qe(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; + let r = mo(tt(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; try { e.setData("text/uri-list", r), e.setData("DownloadURL", `application/zip:${i}:${r}`), e.effectAllowed = "copyMove"; } catch (e) { @@ -2785,38 +2785,38 @@ var fo = (e) => { } let s = t.filename || t.name; if (!s) return; - let c = a ? go(t) : "", l = fo((c ? Ge(c) : "") || i), u = en(s); + let c = a ? vo(t) : "", l = mo((c ? at(c) : "") || i), u = en(s); try { e.setData("text/uri-list", l), e.setData("DownloadURL", `${u}:${s}:${l}`), e.effectAllowed = "copyMove"; } catch (e) { console.debug?.(e); } -}, vo = (e, { asset: t, containerEl: n, card: r }) => { +}, bo = (e, { asset: t, containerEl: n, card: r }) => { if (e && t) try { let t = e?.dataTransfer?.dropEffect; - !t || t === "none" || lo(); + !t || t === "none" || fo(); return; } catch (e) { console.debug?.(e); } -}, yo = () => { - let e = $e(); +}, xo = () => { + let e = Ze(); return e && typeof e == "object" ? e : null; -}, bo = (e) => $a(e, { - buildCustomViewURL: tt, - buildViewURL: nt -}), xo = !1, So = !1, Co = (e) => { +}, So = (e) => to(e, { + buildCustomViewURL: Ge, + buildViewURL: Xe +}), Co = !1, wo = !1, To = (e) => { try { return !!e?.closest?.("input, textarea, select, [contenteditable='true']"); } catch { return !1; } -}, wo = () => xo === !0, To = () => So === !0, Eo = (e) => [ +}, Eo = () => Co === !0, Do = () => wo === !0, Oo = (e) => [ String(e?.type || "output"), String(e?.filename || ""), String(e?.subfolder || ""), - String(Me(e) || "") -].join("\n"), Do = (e, t) => { + String(ze(e) || "") +].join("\n"), ko = (e, t) => { if (String(e?.type || e?.file_info?.type || "").toLowerCase() === "custom") return null; let n = ut(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "")).trim(); if (!n || !t) return null; @@ -2846,20 +2846,20 @@ var fo = (e) => { }; } return null; -}, Oo = (e) => { +}, Ao = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t) return null; - let n = Do(e, t); + let n = ko(e, t); return { filename: t, subfolder: n?.subfolder ?? e.subfolder ?? "", type: n?.type ?? String(e.type || "output").toLowerCase(), - root_id: Me(e) || void 0, + root_id: ze(e) || void 0, kind: String(e.kind || "").toLowerCase(), filepath: String(e.filepath || e.path || e?.file_info?.filepath || "").trim() || void 0 }; -}, ko = (e, t, n) => { +}, jo = (e, t, n) => { if (!e || !t || n == null) return !1; let r = String(n); try { @@ -2873,10 +2873,10 @@ var fo = (e) => { console.debug?.(e); } return !1; -}, Ao = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { +}, Mo = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { if (!e || !t || !n) return; let i = String(n.kind || "").toLowerCase() === "model3d" ? "3D" : n.kind, a = { - id: t.id == null ? Eo(n) : String(t.id), + id: t.id == null ? Oo(n) : String(t.id), name: t.filename || n.filename, display_name: t.filename || n.filename, filename: n.filename, @@ -2892,46 +2892,46 @@ var fo = (e) => { }, tags: Array.isArray(t.tags) ? t.tags : [] }; - ko(e, sn, JSON.stringify(a)), r && ko(e, "text/uri-list", r); -}, jo = (e) => { + jo(e, sn, JSON.stringify(a)), r && jo(e, "text/uri-list", r); +}, No = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return []; try { let e = window?.__MJR_LAST_SELECTION_GRID__, n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (Array.isArray(n) && n.length > 1) { - let e = n.map(Oo).filter(rn), r = Eo(t); - if (e.some((e) => Eo(e) === r)) return e; + let e = n.map(Ao).filter(rn), r = Oo(t); + if (e.some((e) => Oo(e) === r)) return e; } } catch (e) { console.debug?.(e); } return [t]; -}, Mo = (e, t) => { +}, Po = (e, t) => { try { let n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (!Array.isArray(n) || n.length <= 1) return []; - let r = n.map(Oo).filter(rn), i = Eo(t); - return r.some((e) => Eo(e) === i) ? r : []; + let r = n.map(Ao).filter(rn), i = Oo(t); + return r.some((e) => Oo(e) === i) ? r : []; } catch (e) { return console.debug?.(e), []; } -}, No = (e, t) => { +}, Fo = (e, t) => { try { let t = e?.dataTransfer?.getData?.("application/x-mjr-assets") || ""; if (t) { - let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(to).filter(rn); + let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(ro).filter(rn); if (n.length) return n; } } catch (e) { console.debug?.(e); } - return jo(t); -}, Po = async (e) => { + return No(t); +}, Io = async (e) => { let t = Array.isArray(e) ? e.filter(Boolean) : []; return t.length ? (await Promise.all(t.map(async (e) => { - let t = (await Vn({ + let t = (await Un({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: e, index: !1 }))?.relativePath; @@ -2941,43 +2941,43 @@ var fo = (e) => { droppedExt: String(e?.filename || "").split(".").pop() || "" } : null; }))).filter(Boolean) : []; -}, Fo = /* @__PURE__ */ new Map(), Io = 6e4, Lo = 20, Ro = 5242880, zo = 5e3, Bo = 2e4, Vo = 256, Ho = 5e5, Uo = /[\u0000-\u001f\u007f]/, Wo = /\u0000/, Go = (e) => Uo.test(String(e || "")), Ko = (e) => Wo.test(String(e || "")), qo = (e) => { +}, Lo = /* @__PURE__ */ new Map(), Ro = 6e4, zo = 20, Bo = 5242880, Vo = 5e3, Ho = 2e4, Uo = 256, Wo = 5e5, Go = /[\u0000-\u001f\u007f]/, Ko = /\u0000/, qo = (e) => Go.test(String(e || "")), Jo = (e) => Ko.test(String(e || "")), Yo = (e) => { if (!e || typeof e != "object" || Array.isArray(e)) return !1; let t = Number(e.id); if (!Number.isFinite(t)) return !1; let n = e.type == null ? "" : String(e.type); - if (n && (n.length > Vo || Go(n))) return !1; + if (n && (n.length > Uo || qo(n))) return !1; let r = e.widgets_values; if (Array.isArray(r)) { - for (let e of r) if (typeof e == "string" && (e.length > Ho || Ko(e))) return !1; + for (let e of r) if (typeof e == "string" && (e.length > Wo || Jo(e))) return !1; } return !0; -}, Jo = (e) => { +}, Xo = (e) => { if (Array.isArray(e)) return e.length >= 4; if (e && typeof e == "object") { let t = Number(e.id); return !!Number.isFinite(t); } return !1; -}, Yo = (e) => { - if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > zo || e.links.length > Bo || !e.nodes.every(qo) || !e.links.every(Jo)) return !1; +}, Zo = (e) => { + if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > Vo || e.links.length > Ho || !e.nodes.every(Yo) || !e.links.every(Xo)) return !1; try { let t = JSON.stringify(e).length; - if (!Number.isFinite(t) || t <= 0 || t > Ro) return !1; + if (!Number.isFinite(t) || t <= 0 || t > Bo) return !1; } catch { return !1; } return !0; -}, Xo = () => { +}, Qo = () => { let e = Date.now(); - for (let [t, n] of Fo.entries()) e - (n?.at || 0) > Io && Fo.delete(t); - Fo.size > Lo && Array.from(Fo.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, Fo.size - Lo).forEach(([e]) => Fo.delete(e)); -}, Zo = async (e, t = null) => { - let n = e && typeof e == "object" ? e : null, r = Me(n), i = yo(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; + for (let [t, n] of Lo.entries()) e - (n?.at || 0) > Ro && Lo.delete(t); + Lo.size > zo && Array.from(Lo.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, Lo.size - zo).forEach(([e]) => Lo.delete(e)); +}, $o = async (e, t = null) => { + let n = e && typeof e == "object" ? e : null, r = ze(n), i = xo(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; if (a) { - let e = Fo.get(a); - if (e && Date.now() - (e.at || 0) < Io) { - if (e.workflow && Yo(e.workflow)) try { + let e = Lo.get(a); + if (e && Date.now() - (e.at || 0) < Ro) { + if (e.workflow && Zo(e.workflow)) try { if (typeof i?.loadGraphData == "function") return i.loadGraphData(e.workflow), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(e.workflow); @@ -3001,19 +3001,19 @@ var fo = (e) => { let e = await y(String(n.filepath), { timeoutMs: 3e4 }); o = e?.ok && (e?.data?.workflow || e?.workflow) || null; } else if (n?.filename) { - let t = `${st.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""), i = await re(t); - i?.ok && i.workflow && (o = i.workflow), o || (e = `${st.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); - } else t && (e = `${st.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); + let t = `${it.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : ""), i = await re(t); + i?.ok && i.workflow && (o = i.workflow), o || (e = `${it.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); + } else t && (e = `${it.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); if (!o && e) { let t = await re(e); if (!t?.ok || !t.data) return !1; o = t.data?.workflow; } - if (!Yo(o)) return !1; - if (a && (Fo.set(a, { + if (!Zo(o)) return !1; + if (a && (Lo.set(a, { workflow: o, at: Date.now() - }), Xo()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; + }), Qo()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(o); try { @@ -3029,7 +3029,7 @@ var fo = (e) => { } return !1; }; -function Qo(e) { +function es(e) { return (t) => { let n = t?.dataTransfer; if (!n) return; @@ -3037,26 +3037,26 @@ function Qo(e) { if (!r) return; let i = r._mjrAsset; if (!i || typeof i != "object") return; - let a = String(i?.kind || "").toLowerCase(), o = Do(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { + let a = String(i?.kind || "").toLowerCase(), o = ko(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { filename: i.filename, subfolder: o?.subfolder ?? i.subfolder ?? "", type: s, - root_id: Me(i) || void 0, + root_id: ze(i) || void 0, kind: a, filepath: String(i.filepath || i.path || i?.file_info?.filepath || "").trim() || void 0 }; try { - let t = wo(); - ko(n, pn, JSON.stringify(c)); - let o = Mo(e, c); - o.length > 1 && ko(n, Hn, JSON.stringify({ items: o })), ko(n, "text/plain", String(i.filename || "")); - let s = a === "workflow" ? "" : bo(c); - Ao({ + let t = Eo(); + jo(n, pn, JSON.stringify(c)); + let o = Po(e, c); + o.length > 1 && jo(n, Wn, JSON.stringify({ items: o })), jo(n, "text/plain", String(i.filename || "")); + let s = a === "workflow" ? "" : So(c); + Mo({ dt: n, asset: i, payload: c, viewUrl: s - }), _o({ + }), yo({ dt: n, asset: i, containerEl: e, @@ -3069,7 +3069,7 @@ function Qo(e) { } try { r.addEventListener("dragend", (t) => { - vo(t, { + bo(t, { asset: i, containerEl: e, card: r @@ -3086,30 +3086,30 @@ function Qo(e) { } }; } -var $o = (e) => { +var ts = (e) => { if (!e) return () => {}; - let t = ao(e); + let t = so(e); if (typeof t == "function") return t; - let n = Qo(e); - return e.addEventListener("dragstart", n, !0), oo(e, () => { + let n = es(e); + return e.addEventListener("dragstart", n, !0), co(e, () => { try { e.removeEventListener("dragstart", n, !0); } catch (e) { console.debug?.(e); } - so(e); + lo(e); }); -}, es = null, ts = 0; -function ns() { +}, ns = null, rs = 0; +function is() { let t = (e) => { - if (Co(e?.target)) return; + if (To(e?.target)) return; let t = String(e?.key || "").toLowerCase(); - t === "s" ? xo = !0 : t === "l" && (So = !0); + t === "s" ? Co = !0 : t === "l" && (wo = !0); }, n = (e) => { let t = String(e?.key || "").toLowerCase(); - t === "s" ? xo = !1 : t === "l" && (So = !1); + t === "s" ? Co = !1 : t === "l" && (wo = !1); }, r = () => { - xo = !1, So = !1; + Co = !1, wo = !1; }, i = /* @__PURE__ */ new Set([ "mp3", "wav", @@ -3183,9 +3183,9 @@ function ns() { e && (a = e.resolvedStart === void 0 ? e.start : e.resolvedStart); } t._ghostSegmentId = null, t._ghostTrack = null, t._ghostInitialTimeline = null, t._previewSegments = null, t.render?.(); - let c = String(r || "").toLowerCase(), l = i.has(c), u = await Vn({ + let c = String(r || "").toLowerCase(), l = i.has(c), u = await Un({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: n, index: !1 }); @@ -3228,10 +3228,10 @@ function ns() { waveformPeaks: u }; if (!t.timeline?.audioSegments) { - Qa("ltxdirector inject: no audioSegments", {}); + eo("ltxdirector inject: no audioSegments", {}); return; } - t.timeline.audioSegments.push(g), t.timeline.audioSegments.sort((e, t) => e.start - t.start), t.selectionType = "audio", t.selectedIndex = t.timeline.audioSegments.findIndex((e) => e.id === h), t.updateUIFromSelection?.(), t.commitChanges?.(!0), t.render?.(), e(`Added audio to LTX Director: ${d}`, "success", 3e3), Qa("drop ltxdirector inject audio", { + t.timeline.audioSegments.push(g), t.timeline.audioSegments.sort((e, t) => e.start - t.start), t.selectionType = "audio", t.selectedIndex = t.timeline.audioSegments.findIndex((e) => e.id === h), t.updateUIFromSelection?.(), t.commitChanges?.(!0), t.render?.(), e(`Added audio to LTX Director: ${d}`, "success", 3e3), eo("drop ltxdirector inject audio", { file: d, start: f }); @@ -3274,7 +3274,7 @@ function ns() { imageB64: m }; if (!t.timeline?.segments) { - Qa("ltxdirector inject: no timeline", {}); + eo("ltxdirector inject: no timeline", {}); return; } if (t.timeline.segments.push(b), t.timeline.segments.sort((e, t) => e.start - t.start), g) try { @@ -3289,7 +3289,7 @@ function ns() { }, e.src = m; } let x = t.timeline.segments.findIndex((e) => e.id === y), S = g ? t.timeline.segments.findIndex((e) => e.id === b.id) : x; - S >= 0 && (t.selectionType = "image", t.selectedIndex = S, t.updateUIFromSelection?.()), t.commitChanges?.(!0), t.render?.(), e(`Added ${g ? "video" : "image"} to LTX Director: ${d}`, "success", 3e3), Qa("drop ltxdirector inject", { + S >= 0 && (t.selectionType = "image", t.selectedIndex = S, t.updateUIFromSelection?.()), t.commitChanges?.(!0), t.render?.(), e(`Added ${g ? "video" : "image"} to LTX Director: ${d}`, "success", 3e3), eo("drop ltxdirector inject", { file: d, start: v, ext: c, @@ -3301,34 +3301,34 @@ function ns() { onKeyUp: n, onWindowBlur: r, onDragOver: (e) => { - let t = yo(); + let t = xo(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; - let n = no(e, pn); + let n = io(e, pn); if (!rn(n)) return; let r = ln(t, e.clientX, e.clientY), i = r ? cn(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? dn(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; - r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Yt(t, r, jn), e.dataTransfer.dropEffect = "copy", i ? Qa("dragover slot", { + r && (i || o || s) ? (e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), Yt(t, r, jn), e.dataTransfer.dropEffect = "copy", i ? eo("dragover slot", { node: r?.title, slot: i.input?.name - }) : s ? Qa("dragover ltxdirector", { node: r?.title }) : Qa("dragover widget", { + }) : s ? eo("dragover ltxdirector", { node: r?.title }) : eo("dragover widget", { node: r?.title, widget: o?.name })) : (An(t, jn), un(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy")); }, onDrop: async (t) => { - let n = yo(); + let n = xo(); if (!Array.from(t?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; try { if ((t?.target)?.closest?.(".mjr-folder-card")) return; } catch {} - let r = no(t, pn); + let r = io(t, pn); if (!rn(r) || !un(n, t)) return; - co(); - let i = To(), a = i ? No(t, r) : [r], o = ln(n, t.clientX, t.clientY), s = o ? cn(n, o, t.clientX, t.clientY) : null, l = String(r?.filename || "").split(".").pop() || "", u = o && !s ? dn(o, r, l) : null; + uo(); + let i = Do(), a = i ? Fo(t, r) : [r], o = ln(n, t.clientX, t.clientY), s = o ? cn(n, o, t.clientX, t.clientY) : null, l = String(r?.filename || "").split(".").pop() || "", u = o && !s ? dn(o, r, l) : null; if (o && s) { t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn); let i = await Zt({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: r, index: !1 }); @@ -3341,7 +3341,7 @@ function ns() { inputSlotIndex: s.index, event: t })) { - Qa("drop slot created and connected loader", { + eo("drop slot created and connected loader", { node: o?.title, slot: s.input?.name, value: i @@ -3357,42 +3357,42 @@ function ns() { } if (!o || !u) { if (An(n, jn), t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), i) { - let i = await Po(a), o = mn({ + let i = await Io(a), o = mn({ app: n, items: i, event: t }); if (o > 0) { - Qa("drop canvas created loaders", { count: o }); + eo("drop canvas created loaders", { count: o }); return; } e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); return; } if (String(r?.kind || "").toLowerCase() === "workflow") { - if (await Zo(r)) { - Qa("drop canvas loaded workflow", { file: r?.filename }); + if (await $o(r)) { + eo("drop canvas loaded workflow", { file: r?.filename }); return; } e(`Failed to load workflow: "${r?.filename}".`, "error"); return; } - let s = !o && !i, c = Vn({ + let s = !o && !i, c = Un({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: r, index: !1 - }), u = s ? Zo(r) : Promise.resolve(!1), [d, f] = await Promise.all([u, c]); + }), u = s ? $o(r) : Promise.resolve(!1), [d, f] = await Promise.all([u, c]); if (d) { - Qa("drop canvas loaded workflow", { file: r?.filename }); + eo("drop canvas loaded workflow", { file: r?.filename }); return; } let p = f?.relativePath; if (!p) { - Qa("drop canvas stage failed"), e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); + eo("drop canvas stage failed"), e(`Failed to load file: "${r?.filename}". Staging failed.`, "error"); return; } - if (Qa("drop canvas staged", { value: p }), mn({ + if (eo("drop canvas staged", { value: p }), mn({ app: n, items: [{ payload: r, @@ -3401,7 +3401,7 @@ function ns() { }], event: t })) { - Qa("drop canvas created loader", { value: p }); + eo("drop canvas created loader", { value: p }); return; } e(`Staged to input: ${p}`, "success", 4e3); @@ -3410,62 +3410,62 @@ function ns() { t.preventDefault(), t.stopImmediatePropagation?.(), t.stopPropagation(), An(n, jn); let d = await Zt({ post: L, - endpoint: st.STAGE_TO_INPUT, + endpoint: it.STAGE_TO_INPUT, payload: r, index: !1 }); - d && (Qt(u, d), jn(n), Qa("drop inject", { + d && (Qt(u, d), jn(n), eo("drop inject", { node: o?.title, widget: u?.name, value: d })); }, onDragLeave: () => { - let e = yo(); - An(e, jn), Qa("dragleave"); + let e = xo(); + An(e, jn), eo("dragleave"); } }; } -function rs() { +function as() { if (typeof window > "u" || !window?.addEventListener) return { dispose() {} }; - let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = ns(); + let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = is(); return window.addEventListener("keydown", e, !0), window.addEventListener("keyup", t, !0), window.addEventListener("blur", n, !0), window.addEventListener("dragover", r, !0), window.addEventListener("drop", i, !0), window.addEventListener("dragleave", a, !0), { dispose: () => { try { window.removeEventListener("keydown", e, !0), window.removeEventListener("keyup", t, !0), window.removeEventListener("blur", n, !0), window.removeEventListener("dragover", r, !0), window.removeEventListener("drop", i, !0), window.removeEventListener("dragleave", a, !0); } catch (e) { console.debug?.(e); } - xo = !1, So = !1; + Co = !1, wo = !1; try { - An(yo(), jn); + An(xo(), jn); } catch (e) { console.debug?.(e); } } }; } -function is() { - es || (es = rs(), ts = 0), ts += 1; +function os() { + ns || (ns = as(), rs = 0), rs += 1; let e = !1; return ({ force: t = !1 } = {}) => { - e || (e = !0, as({ force: t })); + e || (e = !0, ss({ force: t })); }; } -function as({ force: e = !1 } = {}) { - if (!es) ts = 0, uo(); - else if (!e && ts > 1) --ts; +function ss({ force: e = !1 } = {}) { + if (!ns) rs = 0, po(); + else if (!e && rs > 1) --rs; else { - ts = 0; + rs = 0; try { - es.dispose?.(); + ns.dispose?.(); } catch (e) { console.debug?.(e); } - es = null, uo(); + ns = null, po(); } } // ui/features/grid/MediaBlobCache.ts -var os = "__MJR_MEDIA_BLOB_CACHE__", ss = 384, cs = 3e5, ls = 3e4, us = 15e3, ds = 6, fs = 192, ps = 3; -function ms() { +var cs = "__MJR_MEDIA_BLOB_CACHE__", ls = 384, us = 3e5, ds = 3e4, fs = 15e3, ps = 6, ms = 192, hs = 3; +function gs() { let e = /* @__PURE__ */ new Map(), t = null, n = 0, r = []; function i() { try { @@ -3477,10 +3477,10 @@ function ms() { return !1; } function a() { - return i() ? fs : ss; + return i() ? ms : ls; } function o() { - return i() ? ps : ds; + return i() ? hs : ps; } async function s(e) { n >= o() && await new Promise((e) => r.push(e)), n += 1; @@ -3493,7 +3493,7 @@ function ms() { } } function c() { - t ||= setInterval(l, us); + t ||= setInterval(l, fs); } function l() { try { @@ -3515,7 +3515,7 @@ function ms() { for (let [r, i] of e) i.refcount > 0 || i.expiresAt < n && (n = i.expiresAt, t = r); t && (u(e.get(t)), e.delete(t)); } - function f(e, t = cs) { + function f(e, t = us) { e.expiresAt = Date.now() + t; } function p() { @@ -3539,7 +3539,7 @@ function ms() { r ? (r.hasError = !0, f(r)) : (e.size >= a() && d(), e.set(n, { blobUrl: null, refcount: 0, - expiresAt: Date.now() + ls, + expiresAt: Date.now() + ds, hasError: !0 }), p(), c()); } catch (e) { @@ -3573,7 +3573,7 @@ function ms() { return e.size >= a() && d(), e.set(r, { blobUrl: g, refcount: 1, - expiresAt: Date.now() + cs, + expiresAt: Date.now() + us, hasError: !1 }), p(), c(), g; } catch (e) { @@ -3585,7 +3585,7 @@ function ms() { let n = m(t); if (!n) return; let r = e.get(n); - r && (r.refcount = Math.max(0, r.refcount - 1), r.refcount <= 0 && f(r, ls)), l(), p(); + r && (r.refcount = Math.max(0, r.refcount - 1), r.refcount <= 0 && f(r, ds)), l(), p(); } catch (e) { console.debug?.(e); } @@ -3612,26 +3612,26 @@ function ms() { dispose: y }; } -function hs() { +function _s() { try { - if (window[os]) return window[os]; + if (window[cs]) return window[cs]; } catch (e) { console.debug?.(e); } try { - window[os]?.dispose?.(); + window[cs]?.dispose?.(); } catch (e) { console.debug?.(e); } - let e = ms(); + let e = gs(); try { - window[os] = e; + window[cs] = e; } catch (e) { console.debug?.(e); } return e; } -var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ +var vs = _s(), ys = ["title"], bs = /* @__PURE__ */ dr({ __name: "RatingBadge", props: { rating: { type: [Number, String], @@ -3647,15 +3647,15 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ key: 0, class: "mjr-rating-badge", title: i.value - }, [(q(!0), X(H, null, pr(n.value, (e) => (q(), X("span", { + }, [(q(!0), X(H, null, hr(n.value, (e) => (q(), X("span", { key: e, - style: yr({ + style: xr({ color: "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", marginRight: e < n.value ? "2px" : "0" }) - }, " ★ ", 4))), 128))], 8, _s)) : G("", !0); + }, " ★ ", 4))), 128))], 8, ys)) : G("", !0); } -}), ys = ["title"], bs = /* @__PURE__ */ lr({ +}), xs = ["title"], Ss = /* @__PURE__ */ dr({ __name: "TagsBadge", props: { tags: { type: [Array, String], @@ -3684,9 +3684,9 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ class: "mjr-tags-badge", title: i.value, style: { color: "var(--mjr-tag-color, #90CAF9)" } - }, J(a.value), 9, ys)) : G("", !0); + }, J(a.value), 9, xs)) : G("", !0); } -}), xs = ["title"], Ss = /* @__PURE__ */ lr({ +}), Cs = ["title"], ws = /* @__PURE__ */ dr({ __name: "GenTimeBadge", props: { genTimeMs: { default: 0 } }, setup(e) { @@ -3695,23 +3695,23 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ key: 0, class: "mjr-gentime-badge", title: i.value.title, - style: yr({ color: a.value }) - }, J(i.value.text), 13, xs)) : G("", !0); + style: xr({ color: a.value }) + }, J(i.value.text), 13, Cs)) : G("", !0); } -}), Cs = { +}), Ts = { key: 0, class: "mjr-live-placeholder-wash", "aria-hidden": "true" -}, ws = ["title", "aria-label"], Ts = ["alt", "src"], Es = { class: "mjr-workflow-thumb-title" }, Ds = { class: "mjr-workflow-thumb-meta" }, Os = { key: 0 }, ks = { key: 1 }, As = { key: 2 }, js = { +}, Es = ["title", "aria-label"], Ds = ["alt", "src"], Os = { class: "mjr-workflow-thumb-title" }, ks = { class: "mjr-workflow-thumb-meta" }, As = { key: 0 }, js = { key: 1 }, Ms = { key: 2 }, Ns = { key: 3, class: "mjr-workflow-missing-chip" -}, Ms = ["alt", "src"], Ns = { +}, Ps = ["alt", "src"], Fs = { key: 1, class: "mjr-media-error-placeholder" -}, Ps = ["data-src", "poster"], Fs = ["src"], Is = { class: "mjr-audio-thumb-head" }, Ls = { class: "mjr-audio-thumb-kind" }, Rs = { +}, Is = ["data-src", "poster"], Ls = ["src"], Rs = { class: "mjr-audio-thumb-head" }, zs = { class: "mjr-audio-thumb-kind" }, Bs = { class: "mjr-audio-thumb-waveform", "aria-hidden": "true" -}, zs = { class: "mjr-audio-thumb-meta" }, Bs = { class: "mjr-audio-thumb-title" }, Vs = { class: "mjr-audio-thumb-subtitle" }, Hs = ["src", "alt"], Us = { +}, Vs = { class: "mjr-audio-thumb-meta" }, Hs = { class: "mjr-audio-thumb-title" }, Us = { class: "mjr-audio-thumb-subtitle" }, Ws = ["src", "alt"], Gs = { key: 1, class: "mjr-model3d-thumb-icon", style: { @@ -3722,23 +3722,23 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "justify-content": "center", color: "rgba(255,255,255,0.7)" } -}, Ws = [ +}, Ks = [ "data-mjr-ext", "data-mjr-badge-bg", "title" -], Gs = ["title"], Ks = { +], qs = ["title"], Js = { key: 7, class: "mjr-card-hover-info" -}, qs = { +}, Ys = { key: 0, class: "mjr-hover-prompt" -}, Js = { +}, Xs = { key: 1, class: "mjr-hover-prompt mjr-hover-workflow-notes" -}, Ys = { +}, Zs = { key: 2, class: "mjr-hover-gentime" -}, Xs = ["data-mjr-kind"], Zs = ["title"], Qs = { +}, Qs = ["data-mjr-kind"], $s = ["title"], ec = { class: "mjr-card-meta-row", style: { "font-size": "0.85em", @@ -3749,7 +3749,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "text-overflow": "ellipsis", "padding-right": "16px" } -}, $s = ["title"], ec = ["title"], tc = ["title"], nc = { +}, tc = ["title"], nc = ["title"], rc = ["title"], ic = { key: 0, class: "mjr-meta-separator", "aria-hidden": "true", @@ -3757,7 +3757,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ opacity: "0.55", margin: "0 3px" } -}, rc = ["title"], ic = { class: "mjr-stack-group-button-count" }, ac = { class: "mjr-dup-stack-count" }, oc = /* @__PURE__ */ lr({ +}, ac = ["title"], oc = { class: "mjr-stack-group-button-count" }, sc = { class: "mjr-dup-stack-count" }, cc = /* @__PURE__ */ dr({ __name: "AssetCardInner", props: { asset: {} }, emits: ["workflow-action"], @@ -3782,7 +3782,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ async function i(e, t = {}) { if (!e) return null; try { - return gs.hasError(e) ? null : await gs.acquireUrl(e, t) || null; + return vs.hasError(e) ? null : await vs.acquireUrl(e, t) || null; } catch { return null; } @@ -3795,13 +3795,13 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ let t = String(e.dataset?.src || "").trim(); if (!t || e.getAttribute("src")) return; let n = (Number(e._mjrVideoLoadRequestId || 0) || 0) + 1; - if (e._mjrVideoLoadRequestId = n, gs.hasError(t)) { + if (e._mjrVideoLoadRequestId = n, vs.hasError(t)) { e.src = t, e._mjrSourceKey = t; return; } - let r = await gs.acquireUrl(t); + let r = await vs.acquireUrl(t); if (e._mjrVideoLoadRequestId !== n || !e.isConnected) { - r && gs.releaseUrl(t); + r && vs.releaseUrl(t); return; } r ? (e.src = r, e._mjrCachedSrc = t, e._mjrSourceKey = t) : (e.src = t, e._mjrSourceKey = t), e.load?.(); @@ -3822,7 +3822,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ } try { let t = String(e._mjrCachedSrc || "").trim(); - t && gs.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; + t && vs.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; } catch (e) { console.debug?.(e); } @@ -3893,7 +3893,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ function f(e) { e && (u(e), s(e)); } - let p = e, m = t, h = K(() => String(p.asset.kind || "image").toLowerCase()), g = K(() => h.value === "workflow"), _ = K(() => h.value === "image"), v = K(() => h.value === "video"), y = K(() => h.value === "audio"), b = K(() => h.value === "model3d"), x = K(() => it(p.asset) || ""), S = K(() => String(p.asset.thumbnail_url || p.asset.graph_map_thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), C = K(() => !!String(p.asset.thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), w = K(() => g.value && !C.value && !!String(p.asset.graph_map_thumbnail_url || "").trim()), T = K(() => String(p.asset.preview_url || p.asset.previewUrl || p.asset.url || "").trim()), E = K(() => x.value), D = K(() => T.value || x.value), O = K(() => !v.value && !g.value ? "" : Xe(p.asset, 384)), k = K(() => S.value || O.value), A = K(() => String(p.asset.filename || "")), j = K(() => String(p.asset.display_name || p.asset.displayName || p.asset.name || A.value || "").trim()), M = K(() => { + let p = e, m = t, h = K(() => String(p.asset.kind || "image").toLowerCase()), g = K(() => h.value === "workflow"), _ = K(() => h.value === "image"), v = K(() => h.value === "video"), y = K(() => h.value === "audio"), b = K(() => h.value === "model3d"), x = K(() => We(p.asset) || ""), S = K(() => String(p.asset.thumbnail_url || p.asset.graph_map_thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), C = K(() => !!String(p.asset.thumbnail_url || p.asset.thumb_url || p.asset.poster || "").trim()), w = K(() => g.value && !C.value && !!String(p.asset.graph_map_thumbnail_url || "").trim()), T = K(() => String(p.asset.preview_url || p.asset.previewUrl || p.asset.url || "").trim()), E = K(() => x.value), D = K(() => T.value || x.value), O = K(() => !v.value && !g.value ? "" : $e(p.asset, 384)), k = K(() => S.value || O.value), A = K(() => String(p.asset.filename || "")), j = K(() => String(p.asset.display_name || p.asset.displayName || p.asset.name || A.value || "").trim()), M = K(() => { let e = A.value; return e.includes(".") ? e.split(".").pop().toUpperCase() : ""; }), N = K(() => { @@ -3912,7 +3912,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ if (!xe.value) return ""; let e = []; return ye.value > 0 && e.push(`${ye.value} node`), be.value > 0 && e.push(`${be.value} model`), `Missing: ${e.join(" / ")}`; - }), Ce = K(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), we = K(() => Ce.value ? Rn(Ce.value) : ""), Te = K(() => Ce.value ? Mn(Ce.value) : ""), Ee = K(() => [ + }), Ce = K(() => p.asset.generation_time || p.asset.file_creation_time || p.asset.mtime || p.asset.created_at), we = K(() => Ce.value ? zn(Ce.value) : ""), Te = K(() => Ce.value ? Mn(Ce.value) : ""), Ee = K(() => [ de.value ? { key: "resolution", className: "mjr-meta-res", @@ -3952,7 +3952,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ video: "var(--mjr-badge-video, #F44336)", audio: "var(--mjr-badge-audio, #4CAF50)", model3d: "var(--mjr-badge-model3d, #9C27B0)" - }[h.value] || "var(--mjr-badge-image, #888)"), ke = ar("mjrStackService", null), Ae = K(() => !ke || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), je = K(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Me = K(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Ne = K(() => Number(p.asset._mjrDupCount || 0) || 0), Pe = K(() => Me.value && !Ae.value), Fe = Q(!1), Ie = Q(!1); + }[h.value] || "var(--mjr-badge-image, #888)"), ke = sr("mjrStackService", null), Ae = K(() => !ke || !String(p.asset.stack_id || "").trim() ? !1 : Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) > 1), je = K(() => Number(p.asset.stack_asset_count || p.asset._mjrFeedGroupCount || 0) || 0), Me = K(() => !!p.asset._mjrDupStack && Number(p.asset._mjrDupCount || 0) >= 2), Ne = K(() => Number(p.asset._mjrDupCount || 0) || 0), Pe = K(() => Me.value && !Ae.value), Fe = Q(!1), Ie = Q(!1); async function Le(e) { if (e.preventDefault(), e.stopPropagation(), !Fe.value) { Fe.value = !0; @@ -3977,70 +3977,70 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ } } } - let ze = Q(null), Be = Q(null), Ve = Q(null), He = Q(null), Ue = Q(!1), We = Q(!1), Ge = Q(""), Ke = 0, qe = "", Je = "", Ye = ""; + let ze = Q(null), Be = Q(null), Ve = Q(null), He = Q(null), Ue = Q(!1), Ge = Q(!1), Ke = Q(""), qe = 0, Je = "", Ye = "", Xe = ""; function Ze() { try { - qe && gs.releaseUrl(qe); + Je && vs.releaseUrl(Je); } catch (e) { console.debug?.(e); } - qe = ""; + Je = ""; } - or(() => g.value ? S.value : _.value ? E.value : "", (e) => { + cr(() => g.value ? S.value : _.value ? E.value : "", (e) => { let t = String(e || "").trim(); - t && t !== Je && (Ue.value = !1, Je = ""); - }, { immediate: !0 }), or(() => b.value ? k.value : "", (e) => { + t && t !== Ye && (Ue.value = !1, Ye = ""); + }, { immediate: !0 }), cr(() => b.value ? k.value : "", (e) => { let t = String(e || "").trim(); - t && t !== Ye && (We.value = !1, Ye = ""); - }, { immediate: !0 }), or(() => [_.value ? Ve.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { + t && t !== Xe && (Ge.value = !1, Xe = ""); + }, { immediate: !0 }), cr(() => [_.value ? Ve.value : null, _.value ? E.value : ""], async ([e, t], n, r) => { if (!e || !t || Ue.value) return; - let o = Ke += 1, s = new AbortController(), c = !1; + let o = qe += 1, s = new AbortController(), c = !1; r(() => { c = !0, s.abort(); }); try { - let n = qe || String(e.dataset?.mjrSourceKey || ""); - if (Ge.value && n === t || (e.dataset.mjrSourceKey = t, await a(), c || o !== Ke || !e.isConnected)) return; + let n = Je || String(e.dataset?.mjrSourceKey || ""); + if (Ke.value && n === t || (e.dataset.mjrSourceKey = t, await a(), c || o !== qe || !e.isConnected)) return; let r = await i(t, { signal: s.signal }); - if (c || o !== Ke || !e.isConnected) { - r && r !== t && gs.releaseUrl(t); + if (c || o !== qe || !e.isConnected) { + r && r !== t && vs.releaseUrl(t); return; } - if (r && r !== Ge.value) { - let e = qe; - Ge.value = r, qe = r === t ? "" : t, e && e !== qe && gs.releaseUrl(e); - } else !r && qe && qe !== t && (Ze(), Ge.value = ""); + if (r && r !== Ke.value) { + let e = Je; + Ke.value = r, Je = r === t ? "" : t, e && e !== Je && vs.releaseUrl(e); + } else !r && Je && Je !== t && (Ze(), Ke.value = ""); } catch {} }, { immediate: !0 }); let Qe = Q(B.GRID_VIDEO_AUTOPLAY_MODE || "hover"); - function $e() { + function R() { Qe.value = B.GRID_VIDEO_AUTOPLAY_MODE || "hover"; } - kr(() => { - window.addEventListener("mjr-settings-changed", $e); - }), or(Be, (e, t) => { + jr(() => { + window.addEventListener("mjr-settings-changed", R); + }), cr(Be, (e, t) => { if (t) try { f(t); } catch {} if (e && ze.value) try { d(ze.value, e, Qe.value); } catch {} - }), or(Qe, (e) => { + }), cr(Qe, (e) => { let t = Be.value, n = ze.value; t && n && d(n, t, e); - }), or(D, (e, t) => { + }), cr(D, (e, t) => { if (e === t) return; let n = Be.value, r = ze.value; n && r && (f(n), d(r, n, Qe.value)); - }, { flush: "post" }), dr(() => { - window.removeEventListener("mjr-settings-changed", $e), Ke += 1, Ze(); + }, { flush: "post" }), pr(() => { + window.removeEventListener("mjr-settings-changed", R), qe += 1, Ze(); let e = Be.value; if (e) try { f(e); } catch {} - }), tr(() => { - window.removeEventListener("mjr-settings-changed", $e); - }), Sr(() => { + }), rr(() => { + window.removeEventListener("mjr-settings-changed", R); + }), wr(() => { let e = He.value; if (!e) return; let t = p.asset; @@ -4055,13 +4055,13 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ Ue.value = !0; try { let e = g.value ? S.value : E.value; - Je = String(e || "").trim(), gs.markError(e); + Ye = String(e || "").trim(), vs.markError(e); } catch {} } - function R() { - We.value = !0, Ye = String(k.value || "").trim(); + function z() { + Ge.value = !0, Xe = String(k.value || "").trim(); } - function z(e) { + function tt(e) { if (!De.value) return; e.preventDefault(), e.stopPropagation(); let t = e.target?.closest?.(".mjr-asset-card"); @@ -4075,7 +4075,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ } })); } - function tt(e, t) { + function nt(e, t) { try { t?.preventDefault?.(), t?.stopPropagation?.(); } catch (e) { @@ -4088,46 +4088,46 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ }); } return (t, n) => { - let r = rr("MButton"); + let r = ar("MButton"); return q(), X(H, null, [ U("div", { - class: wr(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), + class: Er(["mjr-thumb", { "mjr-thumb-workflow": g.value }]), ref_key: "thumbRef", ref: ze }, [ - ce.value ? (q(), X("div", Cs)) : G("", !0), + ce.value ? (q(), X("div", Ts)) : G("", !0), g.value ? (q(), X(H, { key: 1 }, [ U("div", { class: "mjr-workflow-card-actions", - onClick: n[1] ||= fr(() => {}, ["stop"]), - onDblclick: n[2] ||= fr(() => {}, ["stop"]) + onClick: n[1] ||= mr(() => {}, ["stop"]), + onDblclick: n[2] ||= mr(() => {}, ["stop"]) }, [U("button", { type: "button", - class: wr(["mjr-workflow-action-btn", { "is-active": _e.value }]), + class: Er(["mjr-workflow-action-btn", { "is-active": _e.value }]), title: _e.value ? "Remove favorite" : "Add favorite", "aria-label": _e.value ? "Remove favorite" : "Add favorite", - onClick: n[0] ||= (e) => tt("favorite", e) - }, [U("i", { class: wr(_e.value ? "pi pi-star-fill" : "pi pi-star") }, null, 2)], 10, ws)], 32), + onClick: n[0] ||= (e) => nt("favorite", e) + }, [U("i", { class: Er(_e.value ? "pi pi-star-fill" : "pi pi-star") }, null, 2)], 10, Es)], 32), k.value && !Ue.value ? (q(), X("img", { key: 0, - class: wr(["mjr-thumb-media", { "mjr-workflow-graph-map-preview": w.value }]), + class: Er(["mjr-thumb-media", { "mjr-workflow-graph-map-preview": w.value }]), alt: A.value, decoding: "async", loading: "lazy", src: k.value, onError: et - }, null, 42, Ts)) : G("", !0), - U("div", { class: wr(["mjr-workflow-thumb", { + }, null, 42, Ds)) : G("", !0), + U("div", { class: Er(["mjr-workflow-thumb", { "has-thumbnail": k.value && !Ue.value, "has-graph-map": w.value && !Ue.value }]) }, [ n[15] ||= U("i", { class: "pi pi-sitemap" }, null, -1), - U("div", Es, J(pe.value || "Workflow"), 1), - U("div", Ds, [ - me.value ? (q(), X("span", Os, J(me.value), 1)) : G("", !0), - he.value ? (q(), X("span", ks, J(he.value), 1)) : G("", !0), - ge.value ? (q(), X("span", As, J(ge.value) + " nodes", 1)) : G("", !0), - xe.value ? (q(), X("span", js, J(Se.value), 1)) : G("", !0) + U("div", Os, J(pe.value || "Workflow"), 1), + U("div", ks, [ + me.value ? (q(), X("span", As, J(me.value), 1)) : G("", !0), + he.value ? (q(), X("span", js, J(he.value), 1)) : G("", !0), + ge.value ? (q(), X("span", Ms, J(ge.value) + " nodes", 1)) : G("", !0), + xe.value ? (q(), X("span", Ns, J(Se.value), 1)) : G("", !0) ]) ], 2) ], 64)) : _.value ? (q(), X(H, { key: 2 }, [Ue.value ? G("", !0) : (q(), X("img", { @@ -4138,9 +4138,9 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ alt: A.value, decoding: "async", loading: "lazy", - src: Ge.value || E.value || void 0, + src: Ke.value || E.value || void 0, onError: et - }, null, 40, Ms)), Ue.value ? (q(), X("div", Ns, [...n[16] ||= [U("i", { class: "pi pi-image" }, null, -1)]])) : G("", !0)], 64)) : v.value ? (q(), X(H, { key: 3 }, [U("video", { + }, null, 40, Ps)), Ue.value ? (q(), X("div", Fs, [...n[16] ||= [U("i", { class: "pi pi-image" }, null, -1)]])) : G("", !0)], 64)) : v.value ? (q(), X(H, { key: 3 }, [U("video", { ref_key: "videoRef", ref: Be, class: "mjr-thumb-media", @@ -4154,30 +4154,30 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ draggable: !1, tabindex: -1, style: { "pointer-events": "none" } - }, null, 8, Ps), n[17] ||= U("div", { class: "mjr-thumb-play" }, [U("i", { class: "pi pi-play" })], -1)], 64)) : y.value ? (q(), X(H, { key: 4 }, [k.value ? (q(), X("img", { + }, null, 8, Is), n[17] ||= U("div", { class: "mjr-thumb-play" }, [U("i", { class: "pi pi-play" })], -1)], 64)) : y.value ? (q(), X(H, { key: 4 }, [k.value ? (q(), X("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: "" - }, null, 8, Fs)) : G("", !0), U("div", { class: wr(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ - U("div", Is, [n[18] ||= U("span", { class: "mjr-audio-thumb-icon" }, [U("i", { class: "pi pi-volume-up" })], -1), U("span", Ls, J(M.value || "AUDIO"), 1)]), - U("div", Rs, [(q(!0), X(H, null, pr(ee.value, (e, t) => (q(), X("span", { + }, null, 8, Ls)) : G("", !0), U("div", { class: Er(["mjr-audio-thumb", { "has-poster": k.value }]) }, [ + U("div", Rs, [n[18] ||= U("span", { class: "mjr-audio-thumb-icon" }, [U("i", { class: "pi pi-volume-up" })], -1), U("span", zs, J(M.value || "AUDIO"), 1)]), + U("div", Bs, [(q(!0), X(H, null, hr(ee.value, (e, t) => (q(), X("span", { key: t, - style: yr({ + style: xr({ height: `${e.height}%`, opacity: e.opacity }) }, null, 4))), 128))]), - U("div", zs, [U("span", Bs, J(te.value), 1), U("span", Vs, J(F.value), 1)]) - ], 2)], 64)) : b.value ? (q(), X(H, { key: 5 }, [k.value && !We.value ? (q(), X("img", { + U("div", Vs, [U("span", Hs, J(te.value), 1), U("span", Us, J(F.value), 1)]) + ], 2)], 64)) : b.value ? (q(), X(H, { key: 5 }, [k.value && !Ge.value ? (q(), X("img", { key: 0, class: "mjr-thumb-media", src: k.value, draggable: !1, alt: A.value, - onError: R - }, null, 40, Hs)) : (q(), X("div", Us, [...n[19] ||= [U("i", { + onError: z + }, null, 40, Ws)) : (q(), X("div", Gs, [...n[19] ||= [U("i", { class: "pi pi-box", style: { "font-size": "2.5rem" } }, null, -1)]]))], 64)) : G("", !0), @@ -4185,7 +4185,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ class: "mjr-file-badge mjr-badge-ext", "data-mjr-ext": M.value, "data-mjr-badge-bg": Oe.value, - style: yr({ + style: xr({ position: "absolute", top: "6px", left: "6px", @@ -4200,17 +4200,17 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ cursor: De.value ? "pointer" : "default" }), title: De.value ? `${M.value} - duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${M.value} file`, - onClick: z - }, J(M.value) + J(De.value ? "+" : ""), 13, Ws), - Y(vs, { + onClick: tt + }, J(M.value) + J(De.value ? "+" : ""), 13, Ks), + Y(bs, { rating: ne.value, class: "mjr-badge-rating" }, null, 8, ["rating"]), - Y(bs, { + Y(Ss, { tags: re.value, class: "mjr-badge-tags" }, null, 8, ["tags"]), - Y(Ss, { "gen-time-ms": ie.value }, null, 8, ["gen-time-ms"]), + Y(ws, { "gen-time-ms": ie.value }, null, 8, ["gen-time-ms"]), ce.value ? (q(), X("div", { key: 6, class: "mjr-live-pill", @@ -4218,11 +4218,11 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ }, [n[20] ||= U("span", { class: "mjr-live-pill-dot", "aria-hidden": "true" - }, null, -1), U("span", null, J(le.value), 1)], 8, Gs)) : G("", !0), - L.value || g.value && P.value || ae.value ? (q(), X("div", Ks, [ - L.value ? (q(), X("div", qs, J(L.value), 1)) : G("", !0), - g.value && P.value ? (q(), X("div", Js, J(P.value), 1)) : G("", !0), - ae.value ? (q(), X("div", Ys, "Time " + J(oe.value.text), 1)) : G("", !0) + }, null, -1), U("span", null, J(le.value), 1)], 8, qs)) : G("", !0), + L.value || g.value && P.value || ae.value ? (q(), X("div", Js, [ + L.value ? (q(), X("div", Ys, J(L.value), 1)) : G("", !0), + g.value && P.value ? (q(), X("div", Xs, J(P.value), 1)) : G("", !0), + ae.value ? (q(), X("div", Zs, "Time " + J(oe.value.text), 1)) : G("", !0) ])) : G("", !0) ], 2), U("div", { @@ -4244,28 +4244,28 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "margin-bottom": "4px", "padding-right": "12px" } - }, J(N.value), 9, Zs), - U("div", Qs, [g.value ? (q(), X(H, { key: 0 }, [ + }, J(N.value), 9, $s), + U("div", ec, [g.value ? (q(), X(H, { key: 0 }, [ pe.value ? (q(), X("span", { key: 0, class: "mjr-meta-workflow-task", title: `Task: ${pe.value}` - }, J(pe.value), 9, $s)) : G("", !0), + }, J(pe.value), 9, tc)) : G("", !0), ve.value ? (q(), X("span", { key: 1, class: "mjr-meta-workflow-subgraphs", title: `${ve.value} subgraph${ve.value > 1 ? "s" : ""}` - }, J(ve.value) + " sub", 9, ec)) : G("", !0), + }, J(ve.value) + " sub", 9, nc)) : G("", !0), xe.value ? (q(), X("span", { key: 2, class: "mjr-meta-workflow-missing", title: Se.value - }, J(Se.value), 9, tc)) : G("", !0) - ], 64)) : G("", !0), (q(!0), X(H, null, pr(Ee.value, (e, t) => (q(), X(H, { key: e.key }, [t > 0 ? (q(), X("span", nc, "/")) : G("", !0), U("span", { - class: wr(e.className), - style: yr(e.style || null), + }, J(Se.value), 9, rc)) : G("", !0) + ], 64)) : G("", !0), (q(!0), X(H, null, hr(Ee.value, (e, t) => (q(), X(H, { key: e.key }, [t > 0 ? (q(), X("span", ic, "/")) : G("", !0), U("span", { + class: Er(e.className), + style: xr(e.style || null), title: e.title - }, J(e.text), 15, rc)], 64))), 128))]), + }, J(e.text), 15, ac)], 64))), 128))]), U("div", { ref_key: "dotWrapperRef", ref: He, @@ -4277,8 +4277,8 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "z-index": "2" } }, null, 512) - ], 8, Xs), - Ae.value ? (q(), nr(r, { + ], 8, Qs), + Ae.value ? (q(), ir(r, { key: 0, type: "button", class: "mjr-stack-group-button", @@ -4290,14 +4290,14 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "aria-label": `Open generation group in grid (${je.value} assets)`, title: `Open generation group in grid (${je.value} assets)`, onClick: Le, - onPointerdown: n[3] ||= fr(() => {}, ["stop"]), - onMousedown: n[4] ||= fr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[5] ||= fr(() => {}, ["stop"]), - onDblclick: n[6] ||= fr(() => {}, ["stop"]), - onKeydown: n[7] ||= fr(() => {}, ["stop"]), - onDragstart: n[8] ||= fr(() => {}, ["stop", "prevent"]) + onPointerdown: n[3] ||= mr(() => {}, ["stop"]), + onMousedown: n[4] ||= mr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[5] ||= mr(() => {}, ["stop"]), + onDblclick: n[6] ||= mr(() => {}, ["stop"]), + onKeydown: n[7] ||= mr(() => {}, ["stop"]), + onDragstart: n[8] ||= mr(() => {}, ["stop", "prevent"]) }, { - default: W(() => [n[21] ||= U("span", { class: "pi pi-clone" }, null, -1), U("span", ic, J(je.value), 1)]), + default: W(() => [n[21] ||= U("span", { class: "pi pi-clone" }, null, -1), U("span", oc, J(je.value), 1)]), _: 1 }, 8, [ "disabled", @@ -4305,7 +4305,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "aria-label", "title" ])) : G("", !0), - Pe.value ? (q(), nr(r, { + Pe.value ? (q(), ir(r, { key: 1, type: "button", class: "mjr-dup-stack-button", @@ -4317,14 +4317,14 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "aria-label": `${Ne.value} duplicate${Ne.value > 1 ? "s" : ""} - click to compare all copies`, title: `${Ne.value} duplicate${Ne.value > 1 ? "s" : ""} - click to compare all copies`, onClick: Re, - onPointerdown: n[9] ||= fr(() => {}, ["stop"]), - onMousedown: n[10] ||= fr(() => {}, ["stop", "prevent"]), - onTouchstartPassive: n[11] ||= fr(() => {}, ["stop"]), - onDblclick: n[12] ||= fr(() => {}, ["stop"]), - onKeydown: n[13] ||= fr(() => {}, ["stop"]), - onDragstart: n[14] ||= fr(() => {}, ["stop", "prevent"]) + onPointerdown: n[9] ||= mr(() => {}, ["stop"]), + onMousedown: n[10] ||= mr(() => {}, ["stop", "prevent"]), + onTouchstartPassive: n[11] ||= mr(() => {}, ["stop"]), + onDblclick: n[12] ||= mr(() => {}, ["stop"]), + onKeydown: n[13] ||= mr(() => {}, ["stop"]), + onDragstart: n[14] ||= mr(() => {}, ["stop", "prevent"]) }, { - default: W(() => [n[22] ||= U("span", { class: "pi pi-copy" }, null, -1), U("span", ac, J(Ne.value), 1)]), + default: W(() => [n[22] ||= U("span", { class: "pi pi-copy" }, null, -1), U("span", sc, J(Ne.value), 1)]), _: 1 }, 8, [ "disabled", @@ -4335,23 +4335,23 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ ], 64); }; } -}), sc = [ +}), lc = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-stem", "aria-label", "aria-selected" -], cc = { +], uc = { class: "mjr-card-info mjr-card-meta", style: { padding: "6px 8px", "min-width": "0" } -}, lc = ["title"], uc = /*#__PURE__*/ ((e, t) => { +}, dc = ["title"], fc = /*#__PURE__*/ ((e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -})(/* @__PURE__ */ lr({ +})(/* @__PURE__ */ dr({ __name: "FolderCard", props: { asset: {}, @@ -4381,16 +4381,16 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ }); } return (t, n) => (q(), X("div", { - class: wr(["mjr-asset-card mjr-card mjr-folder-card", { + class: Er(["mjr-asset-card mjr-card mjr-folder-card", { "is-selected": e.selected, "drop-active": i.value }]), role: "button", tabindex: 0, draggable: "true", - onDragover: fr(a, ["prevent"]), + onDragover: mr(a, ["prevent"]), onDragleave: o, - onDrop: fr(s, ["stop", "prevent"]), + onDrop: mr(s, ["stop", "prevent"]), "data-mjr-asset-id": String(e.asset.id ?? ""), "data-mjr-filename-key": String(e.asset.filename || "").toLowerCase(), "data-mjr-ext": "FOLDER", @@ -4416,7 +4416,7 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ }), U("path", { fill: "#D9A730", d: "M20 6H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2z" - })])], -1), U("div", cc, [U("div", { + })])], -1), U("div", uc, [U("div", { class: "mjr-card-filename", title: e.asset.filename, style: { @@ -4425,15 +4425,15 @@ var gs = hs(), _s = ["title"], vs = /* @__PURE__ */ lr({ "white-space": "nowrap", "margin-bottom": "4px" } - }, J(e.asset.filename), 9, lc), n[0] ||= U("div", { class: "mjr-card-meta-row" }, null, -1)])], 42, sc)); + }, J(e.asset.filename), 9, dc), n[0] ||= U("div", { class: "mjr-card-meta-row" }, null, -1)])], 42, lc)); } }), [["__scopeId", "data-v-252fa951"]]); // ui/vue/composables/useGridState.ts -function dc(e) { +function pc(e) { return Array.from(e || []).map((e) => String(e || "").trim()).filter(Boolean); } -function fc() { - let e = br({ +function mc() { + let e = Sr({ query: "*", offset: 0, cursor: null, @@ -4462,7 +4462,7 @@ function fc() { e.virtualGrid = { setItems(t) { e.assets = Array.isArray(t) ? t.slice() : []; } }; - let t = K(() => new Set(dc(e.selectedIds))); + let t = K(() => new Set(pc(e.selectedIds))); function n(t = "", { error: n = !1 } = {}) { e.statusMessage = String(t || ""), e.statusError = !!n; } @@ -4482,14 +4482,14 @@ function fc() { e.query = String(t || "*") || "*", e.offset = 0, e.cursor = null, e.total = n == null ? null : Number(n) || 0, e.done = !!r, e.assets = [], o(); } function c(t, n = "", { preserveAnchor: r = !1 } = {}) { - let i = Array.from(new Set(dc(t))), a = String(n || i[0] || "").trim(); + let i = Array.from(new Set(pc(t))), a = String(n || i[0] || "").trim(); return e.selectedIds = i, e.activeId = a, r || (a ? e.selectionAnchorId = a : i.length || (e.selectionAnchorId = "")), { selectedIds: i, activeId: a }; } function l(t, { activeId: n = "" } = {}) { - let r = new Set(dc(t)), i = dc(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); + let r = new Set(pc(t)), i = pc(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); return c(i, r.has(a) ? a : i[0] || "", { preserveAnchor: !0 }); } function u() { @@ -4520,14 +4520,14 @@ function fc() { }; } // ui/vue/composables/gridVisibility.ts -function pc(e) { +function hc(e) { try { return typeof e?.getClientRects != "function" || e.getClientRects().length > 0; } catch (e) { return console.debug?.(e), !1; } } -function mc(e, { requireClientRect: t = !0 } = {}) { +function gc(e, { requireClientRect: t = !0 } = {}) { if (!e || typeof e != "object") return !1; try { if (typeof document < "u" && document.hidden) return !1; @@ -4552,14 +4552,14 @@ function mc(e, { requireClientRect: t = !0 } = {}) { } catch (e) { console.debug?.(e); } - return !t || pc(e); + return !t || hc(e); } -function hc(e) { - return mc(e, { requireClientRect: !0 }); +function _c(e) { + return gc(e, { requireClientRect: !0 }); } -function gc(e, t = null) { +function vc(e, t = null) { let n = t || e; - if (!hc(n) || e && e !== n && !mc(e, { requireClientRect: !1 })) return !1; + if (!_c(n) || e && e !== n && !gc(e, { requireClientRect: !1 })) return !1; try { let e = Number(n?.clientWidth || 0) || 0, t = Number(n?.clientHeight || 0) || 0; return e > 0 && t > 0; @@ -4568,50 +4568,50 @@ function gc(e, t = null) { } } // ui/vue/grid/useGridQuery.ts -function _c(e, t = "") { +function yc(e, t = "") { return String(e ?? t).trim() || String(t); } -function vc(e, t = 0) { +function bc(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function yc(e) { +function xc(e) { return e === !0 || e === 1 || String(e || "") === "1"; } -function bc(e = {}) { - let t = _c(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; +function Sc(e = {}) { + let t = yc(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; return Object.freeze({ - scope: _c(e.scope, "output").toLowerCase(), + scope: yc(e.scope, "output").toLowerCase(), q: t, query: t, - customRootId: _c(e.customRootId), - subfolder: _c(e.subfolder), - collectionId: _c(e.collectionId), - viewScope: _c(e.viewScope), - kind: _c(e.kind).toLowerCase(), - workflowOnly: yc(e.workflowOnly), - minRating: vc(e.minRating, 0), - minSizeMB: vc(e.minSizeMB, 0), - maxSizeMB: vc(e.maxSizeMB, 0), + customRootId: yc(e.customRootId), + subfolder: yc(e.subfolder), + collectionId: yc(e.collectionId), + viewScope: yc(e.viewScope), + kind: yc(e.kind).toLowerCase(), + workflowOnly: xc(e.workflowOnly), + minRating: bc(e.minRating, 0), + minSizeMB: bc(e.minSizeMB, 0), + maxSizeMB: bc(e.maxSizeMB, 0), resolutionCompare: r, - minWidth: vc(e.minWidth, 0), - minHeight: vc(e.minHeight, 0), - maxWidth: vc(e.maxWidth, 0), - maxHeight: vc(e.maxHeight, 0), - workflowType: _c(e.workflowType).toUpperCase(), - workflowId: _c(e.workflowId), - workflowModel: _c(e.workflowModel), - workflowRunsOn: _c(e.workflowRunsOn).toLowerCase(), - dateRange: _c(e.dateRange).toLowerCase(), - dateExact: _c(e.dateExact), - metadataSearchMode: _c(e.metadataSearchMode), - sort: _c(e.sort, "mtime_desc").toLowerCase(), - semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : yc(e.semanticMode), - groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : yc(e.groupStacks) + minWidth: bc(e.minWidth, 0), + minHeight: bc(e.minHeight, 0), + maxWidth: bc(e.maxWidth, 0), + maxHeight: bc(e.maxHeight, 0), + workflowType: yc(e.workflowType).toUpperCase(), + workflowId: yc(e.workflowId), + workflowModel: yc(e.workflowModel), + workflowRunsOn: yc(e.workflowRunsOn).toLowerCase(), + dateRange: yc(e.dateRange).toLowerCase(), + dateExact: yc(e.dateExact), + metadataSearchMode: yc(e.metadataSearchMode), + sort: yc(e.sort, "mtime_desc").toLowerCase(), + semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : xc(e.semanticMode), + groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : xc(e.groupStacks) }); } -function xc(e = {}, t = {}) { - return bc({ +function Cc(e = {}, t = {}) { + return Sc({ scope: e.mjrScope, q: e.mjrQuery, customRootId: e.mjrCustomRootId, @@ -4641,16 +4641,16 @@ function xc(e = {}, t = {}) { ...t }); } -function Sc(e = null, t = "*") { +function wc(e = null, t = "*") { let n = e?.dataset || {}; - return xc(n, { q: n.mjrQuery ?? t }).q; + return Cc(n, { q: n.mjrQuery ?? t }).q; } -function Cc(e = null, t = "mtime_desc") { +function Tc(e = null, t = "mtime_desc") { let n = e?.dataset || {}; - return xc(n, { sort: n.mjrSort ?? t }).sort; + return Cc(n, { sort: n.mjrSort ?? t }).sort; } -function wc(e = {}) { - let t = bc(e); +function Ec(e = {}) { + let t = Sc(e); return [ t.scope, t.q, @@ -4676,30 +4676,30 @@ function wc(e = {}) { t.dateExact ].join("|"); } -function Tc(e = {}) { - let t = bc(e), n = t.viewScope && t.viewScope !== t.scope ? t.viewScope : ""; +function Dc(e = {}) { + let t = Sc(e), n = t.viewScope && t.viewScope !== t.scope ? t.viewScope : ""; return !!(t.subfolder || t.customRootId || t.collectionId || n || t.kind || t.workflowOnly || t.minRating > 0 || t.minSizeMB > 0 || t.maxSizeMB > 0 || t.minWidth > 0 || t.minHeight > 0 || t.maxWidth > 0 || t.maxHeight > 0 || t.workflowType || t.workflowId || t.workflowModel || t.workflowRunsOn || t.dateRange || t.dateExact); } -function Ec(e = {}) { - let t = bc(e); - return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Tc(t); +function Oc(e = {}) { + let t = Sc(e); + return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Dc(t); } // ui/features/grid/PersistentAssetCache.ts -var Dc = "mjr-asset-cache", Oc = 1, kc = "snapshots", Ac = 24, jc = 500, Mc = 27e5, Nc = null; -function Pc() { - return Nc || (Nc = new Promise((e) => { +var kc = "mjr-asset-cache", Ac = 1, jc = "snapshots", Mc = 24, Nc = 500, Pc = 27e5, Fc = null; +function Ic() { + return Fc || (Fc = new Promise((e) => { try { - let t = indexedDB.open(Dc, Oc); + let t = indexedDB.open(kc, Ac); t.onupgradeneeded = () => { let e = t.result; - e.objectStoreNames.contains(kc) || e.createObjectStore(kc, { keyPath: "key" }); + e.objectStoreNames.contains(jc) || e.createObjectStore(jc, { keyPath: "key" }); }, t.onsuccess = () => e(t.result), t.onerror = () => e(null); } catch { e(null); } - }), Nc); + }), Fc); } -function Fc(e) { +function Lc(e) { return !e || typeof e != "object" ? null : { id: e.id, filename: e.filename, @@ -4724,39 +4724,39 @@ function Fc(e) { positive_prompt: e.positive_prompt }; } -function Ic(e) { +function Rc(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0); - if (!t || Date.now() - t > Mc) return null; - let n = Array.isArray(e.assets) ? e.assets.map(Fc).filter(Boolean) : []; + if (!t || Date.now() - t > Pc) return null; + let n = Array.isArray(e.assets) ? e.assets.map(Lc).filter(Boolean) : []; return n.length ? { ...e, assets: n } : null; } -async function Lc(e) { - let t = await Pc(); +async function zc(e) { + let t = await Ic(); if (!t) return null; try { - return t.transaction(kc, e).objectStore(kc); + return t.transaction(jc, e).objectStore(jc); } catch { return null; } } -var Rc = { +var Bc = { async get(e) { - let t = await Lc("readonly"); + let t = await zc("readonly"); return !t || !e ? null : await new Promise((n) => { let r = t.get(e); - r.onsuccess = () => n(Ic(r.result)), r.onerror = () => n(null); + r.onsuccess = () => n(Rc(r.result)), r.onerror = () => n(null); }); }, async put(e, t) { - let n = await Lc("readwrite"), r = Ic({ + let n = await zc("readwrite"), r = Rc({ ...t, key: e, at: t?.at || Date.now(), - assets: Array.isArray(t?.assets) ? t.assets.slice(0, jc) : [] + assets: Array.isArray(t?.assets) ? t.assets.slice(0, Nc) : [] }); return !n || !e || !r ? !1 : (await new Promise((e) => { let t = n.put(r); @@ -4764,7 +4764,7 @@ var Rc = { }), this.prune(), !0); }, async prune() { - let e = await Lc("readwrite"); + let e = await zc("readwrite"); if (!e) return; let t = await new Promise((t) => { let n = [], r = e.openCursor(); @@ -4773,175 +4773,175 @@ var Rc = { if (!e) return t(n); n.push(e.value), e.continue(); }, r.onerror = () => t(n); - }), n = t.filter((e) => !Ic(e)).map((e) => e.key), r = t.filter((e) => !n.includes(e.key)).sort((e, t) => Number(e.at || 0) - Number(t.at || 0)).slice(0, Math.max(0, t.length - Ac)).map((e) => e.key); + }), n = t.filter((e) => !Rc(e)).map((e) => e.key), r = t.filter((e) => !n.includes(e.key)).sort((e, t) => Number(e.at || 0) - Number(t.at || 0)).slice(0, Math.max(0, t.length - Mc)).map((e) => e.key); for (let t of [...n, ...r]) e.delete(t); } -}, zc = /* @__PURE__ */ new Map(), Bc = !0, Vc = 8, Hc = 200, Uc = "mjr_grid_snapshot_cache_v2", Wc = 18e5, Gc = 1500, Kc = !1, qc = null, Jc = !1; -function Yc() { - return Bc; +}, Vc = /* @__PURE__ */ new Map(), Hc = !0, Uc = 8, Wc = 200, Gc = "mjr_grid_snapshot_cache_v2", Kc = 18e5, qc = 1500, Jc = !1, Yc = null, Xc = !1; +function Zc() { + return Hc; } -function Xc() { +function Qc() { try { - zc.clear(), nl()?.removeItem?.(Uc), globalThis?.sessionStorage?.removeItem?.(Uc); + Vc.clear(), il()?.removeItem?.(Gc), globalThis?.sessionStorage?.removeItem?.(Gc); } catch (e) { console.debug?.(e); } } -var Zc = /* @__PURE__ */ "id.filename.name.display_name.filepath.path.fullpath.full_path.file_info.subfolder.source.type.root_id.custom_root_id.kind.ext.size.mtime.generation_time.file_creation_time.created_at.updated_at.indexed_at.width.height.duration.thumbnail_url.thumb_url.preview_url.poster.url.rating.tags.has_workflow.hasWorkflow.has_generation_data.hasGenerationData.workflow_type.workflowType.workflow_id.workflowId.generation_time_ms.positive_prompt.enhanced_caption.auto_tags.has_ai_info.has_ai_vector.has_ai_auto_tags.has_ai_enhanced_caption.job_id.stack_id.source_node_id.source_node_type.date.date_exact".split("."); -function Qc(e, t = "") { +var $c = /* @__PURE__ */ "id.filename.name.display_name.filepath.path.fullpath.full_path.file_info.subfolder.source.type.root_id.custom_root_id.kind.ext.size.mtime.generation_time.file_creation_time.created_at.updated_at.indexed_at.width.height.duration.thumbnail_url.thumb_url.preview_url.poster.url.rating.tags.has_workflow.hasWorkflow.has_generation_data.hasGenerationData.workflow_type.workflowType.workflow_id.workflowId.generation_time_ms.positive_prompt.enhanced_caption.auto_tags.has_ai_info.has_ai_vector.has_ai_auto_tags.has_ai_enhanced_caption.job_id.stack_id.source_node_id.source_node_type.date.date_exact".split("."); +function el(e, t = "") { try { return String(e ?? t).trim(); } catch { return String(t); } } -function $c(e = {}) { +function tl(e = {}) { return JSON.stringify({ - scope: Qc(e.scope || "output", "output"), - query: Qc(e.query || e.q || "*", "*"), - customRootId: Qc(e.customRootId || ""), - subfolder: Qc(e.subfolder || ""), - collectionId: Qc(e.collectionId || ""), - viewScope: Qc(e.viewScope || ""), - kind: Qc(e.kind || ""), - workflowOnly: Qc(e.workflowOnly ? "1" : ""), - minRating: Qc(e.minRating || ""), - minSizeMB: Qc(e.minSizeMB || ""), - maxSizeMB: Qc(e.maxSizeMB || ""), - resolutionCompare: Qc(e.resolutionCompare || ""), - minWidth: Qc(e.minWidth || ""), - minHeight: Qc(e.minHeight || ""), - maxWidth: Qc(e.maxWidth || ""), - maxHeight: Qc(e.maxHeight || ""), - workflowType: Qc(e.workflowType || "").toUpperCase(), - workflowId: Qc(e.workflowId || ""), - workflowModel: Qc(e.workflowModel || ""), - workflowRunsOn: Qc(e.workflowRunsOn || "").toLowerCase(), - dateRange: Qc(e.dateRange || ""), - dateExact: Qc(e.dateExact || ""), - sort: Qc(e.sort || "mtime_desc", "mtime_desc"), - semanticMode: Qc(e.semanticMode ? "1" : "") + scope: el(e.scope || "output", "output"), + query: el(e.query || e.q || "*", "*"), + customRootId: el(e.customRootId || ""), + subfolder: el(e.subfolder || ""), + collectionId: el(e.collectionId || ""), + viewScope: el(e.viewScope || ""), + kind: el(e.kind || ""), + workflowOnly: el(e.workflowOnly ? "1" : ""), + minRating: el(e.minRating || ""), + minSizeMB: el(e.minSizeMB || ""), + maxSizeMB: el(e.maxSizeMB || ""), + resolutionCompare: el(e.resolutionCompare || ""), + minWidth: el(e.minWidth || ""), + minHeight: el(e.minHeight || ""), + maxWidth: el(e.maxWidth || ""), + maxHeight: el(e.maxHeight || ""), + workflowType: el(e.workflowType || "").toUpperCase(), + workflowId: el(e.workflowId || ""), + workflowModel: el(e.workflowModel || ""), + workflowRunsOn: el(e.workflowRunsOn || "").toLowerCase(), + dateRange: el(e.dateRange || ""), + dateExact: el(e.dateExact || ""), + sort: el(e.sort || "mtime_desc", "mtime_desc"), + semanticMode: el(e.semanticMode ? "1" : "") }); } -function el(e) { +function nl(e) { if (!e || typeof e != "object") return null; let t = {}; - for (let n of Zc) e[n] !== void 0 && (t[n] = e[n]); + for (let n of $c) e[n] !== void 0 && (t[n] = e[n]); return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= e.kind || "image", Array.isArray(t.tags) && (t.tags = t.tags.slice(0, 80)), Array.isArray(t.auto_tags) && (t.auto_tags = t.auto_tags.slice(0, 80)), t; } -function tl(e) { +function rl(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0) || 0; - if (!t || Date.now() - t > Wc) return null; - let n = Array.isArray(e.assets) ? e.assets.map(el).filter(Boolean) : []; + if (!t || Date.now() - t > Kc) return null; + let n = Array.isArray(e.assets) ? e.assets.map(nl).filter(Boolean) : []; if (!n.length) return null; let r = Number(e.total ?? n.length), i = Number(e.offset ?? n.length); return { assets: n, - title: Qc(e.title || "Cached", "Cached"), + title: el(e.title || "Cached", "Cached"), at: t, total: Number.isFinite(r) ? Math.max(0, r) : n.length, offset: Number.isFinite(i) ? Math.max(n.length, i) : n.length, done: !!e.done, - query: Qc(e.query || "*", "*") + query: el(e.query || "*", "*") }; } -function nl() { +function il() { try { return globalThis?.localStorage || null; } catch { return null; } } -Yc() || Xc(); -function rl(e) { +Zc() || Qc(); +function al(e) { try { let t = globalThis?.sessionStorage; if (!t || !e) return; - let n = t.getItem?.(Uc); + let n = t.getItem?.(Gc); if (!n) return; - e.getItem?.(Uc) || e.setItem(Uc, n), t.removeItem(Uc); + e.getItem?.(Gc) || e.setItem(Gc, n), t.removeItem(Gc); } catch (e) { console.debug?.(e); } } -function il() { +function ol() { let e = Date.now(); - for (let [t, n] of zc.entries()) { + for (let [t, n] of Vc.entries()) { let r = Number(n?.at || 0) || 0; - (!r || e - r > Wc) && zc.delete(t); + (!r || e - r > Kc) && Vc.delete(t); } - for (; zc.size > Vc;) { - let e = zc.keys().next().value; + for (; Vc.size > Uc;) { + let e = Vc.keys().next().value; if (!e) break; - zc.delete(e); + Vc.delete(e); } } -function al() { - if (!Yc()) Kc = !0, Xc(); - else if (!Kc) { - Kc = !0; +function sl() { + if (!Zc()) Jc = !0, Qc(); + else if (!Jc) { + Jc = !0; try { - let e = nl(); - rl(e); - let t = e?.getItem?.(Uc); + let e = il(); + al(e); + let t = e?.getItem?.(Gc); if (!t) return; let n = JSON.parse(t), r = Array.isArray(n?.entries) ? n.entries : []; for (let e of r) { if (!Array.isArray(e) || e.length < 2) continue; - let t = String(e[0] || ""), n = tl(e[1]); - t && n && zc.set(t, n); + let t = String(e[0] || ""), n = rl(e[1]); + t && n && Vc.set(t, n); } - il(); + ol(); } catch (e) { console.debug?.(e); } } } -function ol() { - if (!Yc()) Xc(); +function cl() { + if (!Zc()) Qc(); else try { - il(); - let e = nl(); + ol(); + let e = il(); if (!e) return; - let t = Array.from(zc.entries()).map(([e, t]) => [e, { + let t = Array.from(Vc.entries()).map(([e, t]) => [e, { ...t, - assets: Array.isArray(t?.assets) ? t.assets.slice(0, Hc) : [] + assets: Array.isArray(t?.assets) ? t.assets.slice(0, Wc) : [] }]); - e.setItem(Uc, JSON.stringify({ entries: t })); + e.setItem(Gc, JSON.stringify({ entries: t })); } catch (e) { console.debug?.(e); } } -function sl() { - Yc() ? (Jc = !0, !qc && (qc = setTimeout(() => { - qc = null, Jc && (Jc = !1, ol()); - }, Gc))) : (Xc(), Jc = !1); +function ll() { + Zc() ? (Xc = !0, !Yc && (Yc = setTimeout(() => { + Yc = null, Xc && (Xc = !1, cl()); + }, qc))) : (Qc(), Xc = !1); } -function cl() { - qc &&= (clearTimeout(qc), null), Jc && (Jc = !1, ol()); +function ul() { + Yc &&= (clearTimeout(Yc), null), Xc && (Xc = !1, cl()); } -function ll(e) { - if (!Yc()) return null; - al(); - let t = tl(zc.get(e)); - return t ? (zc.delete(e), zc.set(e, t), sl(), t) : (zc.delete(e), sl(), null); +function dl(e) { + if (!Zc()) return null; + sl(); + let t = rl(Vc.get(e)); + return t ? (Vc.delete(e), Vc.set(e, t), ll(), t) : (Vc.delete(e), ll(), null); } -function ul(e) { - return Yc() ? (al(), !!tl(zc.get(e))) : !1; +function fl(e) { + return Zc() ? (sl(), !!rl(Vc.get(e))) : !1; } -function dl(e, t) { - if (!Yc() || !e || !t || typeof t != "object") return !1; - let n = tl({ +function pl(e, t) { + if (!Zc() || !e || !t || typeof t != "object") return !1; + let n = rl({ ...t, at: t.at || Date.now() }); - return n ? (zc.delete(e), zc.set(e, n), sl(), Rc.put(String(e || ""), n).catch((e) => { + return n ? (Vc.delete(e), Vc.set(e, n), ll(), Bc.put(String(e || ""), n).catch((e) => { console.debug?.(e); }), !0) : !1; } // ui/vue/grid/useAssetCollection.ts -function fl(e) { +function ml(e) { return !e || typeof e != "object" ? "" : [ e.source || e.type || "output", e.root_id || e.custom_root_id || "", @@ -4949,7 +4949,7 @@ function fl(e) { e.filename || e.filepath || e.path || e.fullpath || e.full_path || "" ].join("|").trim().toLowerCase(); } -function pl(e = [], { assetKey: t = fl } = {}) { +function hl(e = [], { assetKey: t = ml } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(); for (let i of Array.isArray(e) ? e : []) { if (!i || typeof i != "object") continue; @@ -4961,12 +4961,12 @@ function pl(e = [], { assetKey: t = fl } = {}) { byKey: r }; } -function ml(e, { assetKey: t = fl } = {}) { +function gl(e, { assetKey: t = ml } = {}) { if (!e || typeof e != "object") return e; - let n = pl(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); + let n = hl(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); return e.assetIdSet = new Set(n.byId.keys()), e.seenKeys = new Set(n.byKey.keys()), e; } -function hl(e, t = [], { assetKey: n = fl } = {}) { +function _l(e, t = [], { assetKey: n = ml } = {}) { if (!e || typeof e != "object") return 0; let r = new Set((Array.isArray(t) ? t : [t]).map((e) => e == null ? "" : typeof e == "object" && e?.id != null ? String(e.id) : String(e)).map((e) => e.trim()).filter(Boolean)); if (!r.size) return 0; @@ -4974,10 +4974,10 @@ function hl(e, t = [], { assetKey: n = fl } = {}) { return e.assets = (Array.isArray(e.assets) ? e.assets : []).filter((e) => { let t = e?.id == null ? "" : String(e.id); return !t || !r.has(t) || (i += 1, !1); - }), i > 0 && ml(e, { assetKey: n }), i; + }), i > 0 && gl(e, { assetKey: n }), i; } // ui/vue/grid/usePagedAssets.ts -function gl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { +function vl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { let a = Array.isArray(e) ? e.length : 0, o = t == null ? a : Math.max(0, Number(t) || 0); if (o <= 0) return 0; let s = Math.max(0, Number(n) || 0), c = Math.max(0, Number(r) || 0), l = i == null ? null : Math.max(0, Number(i) || 0), u = l == null ? null : Math.max(0, l - c); @@ -4986,7 +4986,7 @@ function gl({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, tota let d = Math.min(s, u ?? 0); return d <= 0 ? o : Math.max(o, d); } -async function _l({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { +async function yl({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { if (typeof e != "function" || typeof t != "function") return { ok: !1, error: /* @__PURE__ */ Error("fetchPage and applyPage are required") @@ -5042,8 +5042,8 @@ async function _l({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = nu lastResult: l }; } -function vl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { - let a = xr({ +function bl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { + let a = Cr({ offset: 0, cursor: null, total: null, @@ -5073,7 +5073,7 @@ function vl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi }; } function f(e, { limit: n = l() } = {}) { - let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = gl({ + let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = vl({ assets: r, count: e?.count, limit: Number(e?.limit || n) || n, @@ -5138,7 +5138,7 @@ function vl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi let u = a.requestId; a.loading = !0, a.error = null; try { - let n = await _l({ + let n = await yl({ maxEmptyPages: o, canContinue: t, getLimit: e, @@ -5198,12 +5198,12 @@ function vl({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi }; } // ui/vue/composables/useVirtualGrid.ts -function yl(e, t) { +function xl(e, t) { if (!t || typeof t != "object") return !1; - let n = xc(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = String(n.workflowId || "").trim(), u = n.dateExact, d = String(t?.subfolder || "").trim().toLowerCase(), f = String(t?.type || t?.source || "output").trim().toLowerCase(), p = String(t?.kind || "").trim().toLowerCase(), m = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), h = String(t?.workflow_id || t?.workflowId || t?.metadata?.workflow_id || t?.metadata?.workflow?.id || "").trim(), g = String(t?.date_exact || t?.date || "").trim(), _ = t?.has_workflow ?? t?.hasWorkflow ?? null; + let n = Cc(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = String(n.workflowId || "").trim(), u = n.dateExact, d = String(t?.subfolder || "").trim().toLowerCase(), f = String(t?.type || t?.source || "output").trim().toLowerCase(), p = String(t?.kind || "").trim().toLowerCase(), m = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), h = String(t?.workflow_id || t?.workflowId || t?.metadata?.workflow_id || t?.metadata?.workflow?.id || "").trim(), g = String(t?.date_exact || t?.date || "").trim(), _ = t?.has_workflow ?? t?.hasWorkflow ?? null; return !(r && r !== "all" && f && f !== r || i && d !== i || a && p && p !== a || o && _ !== null && !_ || s > 0 && (Number(t?.rating || 0) || 0) < s || c && m !== c || l && h && h !== l || u && g && g !== u); } -async function bl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { +async function Sl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { let c = (e) => { if (typeof e == "string") return e; if (e && typeof e == "object") { @@ -5211,9 +5211,9 @@ async function bl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s if (typeof e.target?.value == "string") return e.target.value; } return String(e || ""); - }, l = xc(e?.dataset || {}), { scope: u, customRootId: d, subfolder: f, kind: p, workflowOnly: m, minRating: h, minSizeMB: g, maxSizeMB: _, resolutionCompare: v, minWidth: y, minHeight: b, maxWidth: x, maxHeight: S, workflowType: C, workflowId: w, workflowModel: T, workflowRunsOn: E, dateRange: D, dateExact: O, metadataSearchMode: k } = l, A = l.sort || "mtime_desc", j = c(t).trim() || "*", M = /^\[object\s+HTML.*Element\]$/i.test(j) ? "*" : j, N = i.sanitizeQuery(M) || M; + }, l = Cc(e?.dataset || {}), { scope: u, customRootId: d, subfolder: f, kind: p, workflowOnly: m, minRating: h, minSizeMB: g, maxSizeMB: _, resolutionCompare: v, minWidth: y, minHeight: b, maxWidth: x, maxHeight: S, workflowType: C, workflowId: w, workflowModel: T, workflowRunsOn: E, dateRange: D, dateExact: O, metadataSearchMode: k } = l, A = l.sort || "mtime_desc", j = c(t).trim() || "*", M = /^\[object\s+HTML.*Element\]$/i.test(j) ? "*" : j, N = i.sanitizeQuery(M) || M; try { - let t = String(u || "").toLowerCase() === "output", c = Tc({ + let t = String(u || "").toLowerCase() === "output", c = Dc({ ...l, q: N }), j = t && Number(r ?? 0) === 0 && N === "*" && !c && String(A || "mtime_desc").toLowerCase() === "mtime_desc", M = !(t && (Number(r ?? 0) > 0 || j)), P = !!l.groupStacks, ee = Number(r ?? 0) > 0 ? null : s || null, te = i.buildListURL({ @@ -5302,7 +5302,7 @@ async function bl(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s }; } } -function xl(e, t) { +function Cl(e, t) { switch (t) { case "mtime_desc": return -(Number(e?.mtime) || 0); case "mtime_asc": return Number(e?.mtime) || 0; @@ -5311,23 +5311,23 @@ function xl(e, t) { default: return -(Number(e?.mtime) || 0); } } -function Sl(e, t, n) { +function wl(e, t, n) { if (n === "name_desc") { let n = String(e?.filename || "").toLowerCase(), r = String(t?.filename || "").toLowerCase(); return n > r ? -1 : +(n < r); } - let r = xl(e, n), i = xl(t, n); + let r = Cl(e, n), i = Cl(t, n); return r < i ? -1 : +(r > i); } -function Cl(e, t, n) { +function Tl(e, t, n) { return n === "name_asc" ? String(e) < String(t) : n === "name_desc" ? String(e) > String(t) : Number(e) < Number(t); } -function wl(e, t, n) { - let r = xl(t, n); - for (let t = 0; t < e.length; t++) if (Cl(r, xl(e[t], n), n)) return t; +function El(e, t, n) { + let r = Cl(t, n); + for (let t = 0; t < e.length; t++) if (Tl(r, Cl(e[t], n), n)) return t; return e.length; } -function Tl(e, t) { +function Dl(e, t) { let n = t.get(e); return n || (n = { pending: /* @__PURE__ */ new Map(), @@ -5335,13 +5335,13 @@ function Tl(e, t) { flushing: !1 }, t.set(e, n)), n; } -function El(e) { +function Ol(e) { return String(e ?? "").trim().toLowerCase(); } -function Dl(e) { +function kl(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function Ol(e) { +function Al(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -5350,24 +5350,24 @@ function Ol(e) { } return e; } -function kl(e) { +function jl(e) { if (!e || typeof e != "object") return ""; - let t = El(e?.type || e?.source || "output"), n = El(e?.root_id || e?.custom_root_id || ""), r = El(e?.subfolder || ""), i = El(e?.filename || ""); + let t = Ol(e?.type || e?.source || "output"), n = Ol(e?.root_id || e?.custom_root_id || ""), r = Ol(e?.subfolder || ""), i = Ol(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = El(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = Ol(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function Al(e, t, n) { +function Ml(e, t, n) { let r = Array.isArray(e?.assets) ? e.assets : []; if (t) { let e = r.findIndex((e) => String(e?.id || "") === t); if (e > -1) return e; } - let i = kl(n); - return i ? r.findIndex((e) => kl(e) === i) : -1; + let i = jl(n); + return i ? r.findIndex((e) => jl(e) === i) : -1; } -function jl(e, t) { - return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : Dl(t) ? !0 : ![ +function Nl(e, t) { + return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : kl(t) ? !0 : ![ "filename", "filepath", "path", @@ -5386,7 +5386,7 @@ function jl(e, t) { "date" ].some((t) => Object.prototype.hasOwnProperty.call(e, t)); } -function Ml(e, t) { +function Pl(e, t) { let n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Map(), a = []; for (let o of Array.isArray(e?.assets) ? e.assets : []) { let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = At(o?.filename); @@ -5402,9 +5402,9 @@ function Ml(e, t) { e && n.add(e), s && r.add(s), c && i.set(c, o), o._mjrNameCollision = !1, delete o._mjrNameCollisionCount, delete o._mjrNameCollisionPaths, a.push(o); } } - e.assets = a, ml(e, { assetKey: t.assetKey }); + e.assets = a, gl(e, { assetKey: t.assetKey }); } -function Nl(e, t) { +function Fl(e, t) { let n = t.upsertState.get(e); if (!n || n.pending.size === 0 || n.flushing) return; n.flushing = !0, n.timer &&= (clearTimeout(n.timer), null); @@ -5414,7 +5414,7 @@ function Nl(e, t) { try { let n = !1; for (let [a, o] of r.entries()) { - let r = Dl(o); + let r = kl(o); i.assetKeyFn = t.assetKey; let s = St(o, i, t.loadMajoorSettings); if (Array.isArray(s?.removed) && s.removed.length) { @@ -5441,14 +5441,14 @@ function Nl(e, t) { let c = i.assets.findIndex((e) => String(e.id) === a), l = c > -1 ? i.assets[c] : null, u = l ? { ...l, ...o - } : o, d = c > -1 ? c : Al(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { + } : o, d = c > -1 ? c : Ml(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { ...f, ...o } : u, m = t.assetKey(u); - if (!yl(e, p)) { + if (!xl(e, p)) { if (d > -1) { - if (jl(o, f)) { - Object.assign(f, o), r || Ol(f), i.assets[d] = { ...f }, n = !0; + if (Nl(o, f)) { + Object.assign(f, o), r || Al(f), i.assets[d] = { ...f }, n = !0; continue; } let [e] = i.assets.splice(d, 1); @@ -5456,16 +5456,16 @@ function Nl(e, t) { } } else if (d > -1) { let e = t.assetKey(f); - Object.assign(f, o), r || Ol(f); + Object.assign(f, o), r || Al(f); let a = { ...f }, s = t.assetKey(a); i.assets[d] = a, e && e !== s && (i.seenKeys?.delete?.(e), s && i.seenKeys?.add?.(s)), n = !0; } else if (!(i.seenKeys.has(m) || o.id != null && i.assetIdSet?.has?.(a))) { - let t = xc(e?.dataset || {}).sort || "mtime_desc", s = r ? u : Ol({ ...u }), c = wl(i.assets, s, t); + let t = Cc(e?.dataset || {}).sort || "mtime_desc", s = r ? u : Al({ ...u }), c = El(i.assets, s, t); i.seenKeys.add(m), o.id != null && i.assetIdSet?.add?.(a), i.assets.splice(c, 0, s), n = !0; } } if (n && a) { - Ml(i, t); + Pl(i, t); try { e.dataset.mjrHiddenPngSiblings = String(Number(i.hiddenPngSiblings || 0) || 0); } catch (e) { @@ -5477,22 +5477,22 @@ function Nl(e, t) { if (n.flushing = !1, n.pending.size > 0 && !n.timer) { let r = Math.min(16, t.debounceMs); n.timer = setTimeout(() => { - n.timer = null, Nl(e, t); + n.timer = null, Fl(e, t); }, r); } } } -function Pl(e, t, n) { +function Il(e, t, n) { if (!t || !t.id) return !1; let r = n.getOrCreateState(e), i = String(t.id); if (!n.ensureVirtualGrid(e, r)) return !1; - let a = Tl(e, n.upsertState); - return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Nl(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { - a.timer = null, Nl(e, n); + let a = Dl(e, n.upsertState); + return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Fl(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { + a.timer = null, Fl(e, n); }, n.debounceMs)), !0; } // ui/vue/components/grid/gridDomBridge.ts -function Fl(e) { +function Ll(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -5501,7 +5501,7 @@ function Fl(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Il(e) { +function Rl(e) { if (!e) return []; try { return Array.from(e.querySelectorAll?.(".mjr-asset-card") || []); @@ -5509,7 +5509,7 @@ function Il(e) { return console.debug?.(e), []; } } -function Ll(e) { +function zl(e) { if (!e) return null; try { return e.querySelector?.(".mjr-asset-card.is-selected") || null; @@ -5517,46 +5517,46 @@ function Ll(e) { return console.debug?.(e), null; } } -function Rl(e, t) { +function Bl(e, t) { if (!e) return null; let n = String(t || "").trim(); if (!n) return null; try { - return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Fl(n)}"]`) || null; + return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ll(n)}"]`) || null; } catch (e) { return console.debug?.(e), null; } } -function zl(e, t = 0) { +function Vl(e, t = 0) { let n = e?.dataset?.mjrShown, r = Number(n); return Number.isFinite(r) ? Math.max(0, r) : Math.max(0, Number(t) || 0); } // ui/vue/composables/useGridLoader.ts -var Bl = 200, Vl = 50, Hl = /* @__PURE__ */ new WeakMap(), Ul = /* @__PURE__ */ new Set([ +var Hl = 200, Ul = 50, Wl = /* @__PURE__ */ new WeakMap(), Gl = /* @__PURE__ */ new Set([ "collection", "filter", "initial", "scope", "search", "sort" -]), Wl = 0; -function Gl(e) { +]), Kl = 0; +function ql(e) { return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0))); } -function Kl(e) { +function Jl(e) { if (!e || typeof e != "object") return ""; if (e.id != null && String(e.id).trim()) return `id:${String(e.id).trim()}`; - let t = String(e?.type || e?.source || "output").trim().toLowerCase(), n = String(Me(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); + let t = String(e?.type || e?.source || "output").trim().toLowerCase(), n = String(ze(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); if (i) return `${t}|${n}|${r}|${i}`; let a = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(); return a ? `${t}|${n}|path|${a}` : ""; } -function ql(e) { +function Yl(e) { if (e == null) return e; let t = String(e); return t.trim() === "" ? t : t.trim() === "*" ? "*" : t.replace(/[\u0000-\u001f\u007f]+/g, " ").replace(/[<>]/g, " ").replace(/\s+/g, " ").trim() || t; } -function Jl(e) { +function Xl(e) { if (typeof e == "string") return e; if (e && typeof e == "object") { if (typeof e.value == "string") return e.value; @@ -5572,13 +5572,13 @@ function Jl(e) { } return String(e || ""); } -function Yl(e) { +function Zl(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } -async function Xl() { - await sr(); +async function Ql() { + await lr(); } -function Zl(e, t) { +function $l(e, t) { let n = String(e || "Failed to load"); try { let e = String(t?.message || t || "").trim(), r = e.toLowerCase(); @@ -5587,13 +5587,13 @@ function Zl(e, t) { return n; } } -function Ql(e, t) { +function eu(e, t) { let n = Math.max(1, Math.min(B.MAX_PAGE_SIZE, Number(e) || 1)), r = Math.max(0, Number(t) || 0); if (r <= 0) return n; let i = 2 ** Math.min(r, 5); return Math.max(1, Math.min(B.MAX_PAGE_SIZE, n * i)); } -function $l() { +function tu() { try { let e = typeof navigator < "u" ? navigator : null, t = Number(e?.deviceMemory || 0) || 0; if (t > 0 && t <= 4 || e?.connection?.saveData === !0) return !0; @@ -5602,10 +5602,10 @@ function $l() { } return !1; } -function eu() { - return B.PREFETCH_NEXT_PAGE ? !$l() : !1; +function nu() { + return B.PREFETCH_NEXT_PAGE ? !tu() : !1; } -function tu(e, t = {}) { +function ru(e, t = {}) { let n = Array.isArray(e.assets) ? e.assets : []; t.rebuildFromVisible && n.length ? gt(e, n, { assetKey: t.assetKey || e.assetKeyFn, @@ -5615,7 +5615,7 @@ function tu(e, t = {}) { preserveHiddenCount: !1 }); } -function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingMessage: r, setStatusMessage: i, clearStatusMessage: a, resetAssets: o, setSelection: s, reconcileSelection: c, readScrollElement: l = () => null, readRenderedCards: u = () => [], scrollToAssetId: d = () => {}, canLoadMore: f = null } = {}) { +function iu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingMessage: r, setStatusMessage: i, clearStatusMessage: a, resetAssets: o, setSelection: s, reconcileSelection: c, readScrollElement: l = () => null, readRenderedCards: u = () => [], scrollToAssetId: d = () => {}, canLoadMore: f = null } = {}) { let p = !1, m = null, h = null, g = { pagesRequested: 0, assetsReceived: 0, @@ -5642,7 +5642,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM g.lastOperation = String(e || ""), t.reloadReason && (g.lastReloadReason = String(t.reloadReason || "")), t.appendReason && (g.lastAppendReason = String(t.appendReason || "")); } function y() { - return Yl(e); + return Zl(e); } function b() { return C(); @@ -5678,7 +5678,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM ...e, counts: { loaded: e.assets.length, - visible: zl(y(), e.assets.length), + visible: Vl(y(), e.assets.length), total: e.pagination.total }, metrics: { ...g } @@ -5686,8 +5686,8 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function C() { let e = y(); - return xc(e?.dataset || {}, { - q: Sc(e, t.query || "*"), + return Cc(e?.dataset || {}, { + q: wc(e, t.query || "*"), resolutionCompare: e?.dataset?.mjrFilterResolutionCompare || "" }); } @@ -5725,7 +5725,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; } function D(e) { - return Ul.has(String(e || "").toLowerCase()); + return Gl.has(String(e || "").toLowerCase()); } function O(e = null) { try { @@ -5743,7 +5743,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return gc(y(), l()); + return vc(y(), l()); } function j() { if (!B.DEFER_GRID_FETCH_DURING_EXECUTION) return !1; @@ -5780,7 +5780,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM h = null; } function P(e, n = B.PREFETCH_NEXT_PAGE_DELAY_MS) { - if (!eu()) return; + if (!nu()) return; N(); let r = Math.max(0, Number(n) || 0); h = setTimeout(() => { @@ -5793,7 +5793,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM M(); let n = (() => { try { - return $c(C()); + return tl(C()); } catch (e) { return console.debug?.(e), null; } @@ -5814,7 +5814,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (n) { let e = null; try { - e = $c(C()); + e = tl(C()); } catch (e) { console.debug?.(e); } @@ -5823,7 +5823,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM return; } } - let a = Sc(i, e); + let a = wc(i, e); Promise.resolve().then(() => _e(a, { ...t || {}, reset: !0, @@ -5844,16 +5844,16 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function te(e, t = null) { if (!e || typeof e != "object") return ""; - let n = e.id == null ? `${e.type || ""}|${Me(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; + let n = e.id == null ? `${e.type || ""}|${ze(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; try { - return Ja(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); + return Xa(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); } catch (e) { return console.debug?.(e), n; } } function F() { try { - let e = Jt?.() || {}, t = e.grid || {}; + let e = Vn?.() || {}, t = e.grid || {}; return t.snapshotCacheEnabled === !0 || t.enableSnapshotCache === !0 || e.snapshotCacheEnabled === !0 || e.enableSnapshotCache === !0; } catch (e) { return console.debug?.(e), !1; @@ -5864,14 +5864,14 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (!F()) return; let n = y(), r = Array.isArray(t.assets) ? t.assets : []; if (!n || !r.length) return; - let i = r.map(el).filter(Boolean); + let i = r.map(nl).filter(Boolean); if (!i.length) return; - let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = xc(n.dataset || {}, { - q: Sc(n, t.query || "*"), + let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = Cc(n.dataset || {}, { + q: wc(n, t.query || "*"), resolutionCompare: n.dataset?.mjrFilterResolutionCompare || "" - }), l = $c(c); + }), l = tl(c); if (!l) return; - dl(l, { + pl(l, { assets: i, title: String(e || "").trim(), query: String(t.query || c.query || "*").trim() || "*", @@ -5886,7 +5886,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM function ne() { let e = y(); if (e) try { - let t = Hl.get(e); + let t = Wl.get(e); if (!t) return; t.timer &&= (clearTimeout(t.timer), null), t.pending.clear(), t.flushing = !1; } catch (e) { @@ -5895,24 +5895,24 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function ie(e, n) { let r = _(), i = Array.isArray(n) ? n.length : 0, o = Tt(e, n, t, { - loadMajoorSettings: Jt, + loadMajoorSettings: Vn, clearGridMessage: () => { a(); }, ensureVirtualGrid: () => t.virtualGrid, setFileBadgeCollision: Ct, assetKey: (t) => te(t, e), - ensureDupStackCard: (e, t, n) => Xa(e, t, n) + ensureDupStackCard: (e, t, n) => Qa(e, t, n) }); return g.renderTimeMs += Math.max(0, _() - r), g.assetsReceived += i, g.visibleAssetsAdded += Number(o || 0) || 0, g.hiddenOrDedupedAssets += Math.max(0, i - (Number(o || 0) || 0)), o; } function ae(e, t) { let n = String(t || "*").trim() || "*"; - return wc(xc(e?.dataset || {}, { q: n })); + return Ec(Cc(e?.dataset || {}, { q: n })); } function oe(e) { - let t = C(), n = ql(Jl(e).trim() || "*") || "*"; - return Ec({ + let t = C(), n = Yl(Xl(e).trim() || "*") || "*"; + return Oc({ ...t, q: n }); @@ -5932,9 +5932,9 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM error: "Grid unavailable" }; if (r === 0) { - let s = ae(o, e), c = Fr(); + let s = ae(o, e), c = Lr(); if (c && c === s) { - let o = Pr(s); + let o = Ir(s); if (o) try { let s = await o; if (Number(t.requestId) !== Number(i)) return { @@ -5970,9 +5970,9 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } } } - return se(await bl(o, e, n, r, { - sanitizeQuery: ql, - buildListURL: et, + return se(await Sl(o, e, n, r, { + sanitizeQuery: Yl, + buildListURL: Ke, get: re, getGridState: () => t }, { @@ -5985,7 +5985,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM offset: r }); } - let ce = vl({ + let ce = bl({ query: { get value() { return t.query || "*"; @@ -6056,7 +6056,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(e); } let f = Array.isArray(t.selectedIds) ? t.selectedIds.join("|") : "", m = String(t.activeId || ""); - if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && eu() && P(t.requestId, 400), { + if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && nu() && P(t.requestId, 400), { ok: !0, skipped: !0, hidden: !0 @@ -6079,7 +6079,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM let n = t.requestId, r = await ce.loadUntilVisible({ maxEmptyPages: 6, canContinue: () => A(), - getLimit: (e) => Ql(h, e), + getLimit: (e) => eu(h, e), beforeApplyPage: (e) => { if (t.requestId !== n) return { ok: !1, @@ -6097,7 +6097,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: null, done: !1 - }), tu(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (xe("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { + }), ru(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (xe("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { offset: t.offset, query: t.query }), { @@ -6111,15 +6111,15 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM e.emptyPageIndex <= 0 || xe(`[Grid LoadPage] fetched adaptive page with no visible additions: offset=${t.offset}, fetched=${e.count}, consumed=${e.advanced}, added=${e.added}, limit=${e.limit}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`); } }); - if (de(), fe(), !r.ok) return r.aborted || r.stale || (ue({ done: !0 }), i(Zl("Failed to load assets", r?.error || "Unknown error"), { error: !0 })), r; + if (de(), fe(), !r.ok) return r.aborted || r.stale || (ue({ done: !0 }), i($l("Failed to load assets", r?.error || "Unknown error"), { error: !0 })), r; if (r.preservedCached) return r; - if (t.done || r.added > 0) return I(t.query || Sc(e, "*")), { + if (t.done || r.added > 0) return I(t.query || wc(e, "*")), { ok: !0, count: r.count, total: t.total }; let a = r.lastResult || r.firstResult || r; - return xe(`[Grid LoadPage] fetched one page with no visible additions: offset=${t.offset}, fetched=${r.count}, consumed=${a.advanced}, added=${a.added}, limit=${a.limit || h}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`), !t.done && eu() && P(Number(t.requestId ?? 0) || 0, Math.min(B.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { + return xe(`[Grid LoadPage] fetched one page with no visible additions: offset=${t.offset}, fetched=${r.count}, consumed=${a.advanced}, added=${a.added}, limit=${a.limit || h}, done=${t.done}, visibleCount=${t.assets.length}, total=${t.total}`), !t.done && nu() && P(Number(t.requestId ?? 0) || 0, Math.min(B.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { ok: !0, count: r.count, total: t.total, @@ -6141,7 +6141,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return i(Zl("Failed to load assets", e), { error: !0 }), { + return i($l("Failed to load assets", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; @@ -6163,7 +6163,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } try { let e = Date.now() - _; - e < Wl && await Gl(Wl - e); + e < Kl && await ql(Kl - e); } catch (e) { console.debug?.(e); } @@ -6180,7 +6180,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } let n = t.requestId, r = null; try { - r = $c(C()); + r = tl(C()); } catch (e) { console.debug?.(e); } @@ -6189,7 +6189,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (r) { let e = null; try { - e = $c(C()); + e = tl(C()); } catch (e) { console.debug?.(e); } @@ -6208,7 +6208,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (r) { let e = null; try { - e = $c(C()); + e = tl(C()); } catch (e) { console.debug?.(e); } @@ -6243,7 +6243,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - let d = Jl(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = ql(f) || f; + let d = Xl(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = Yl(f) || f; t.query = m; let h = c ? E(m, i) : { reason: "append", @@ -6254,8 +6254,8 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM try { let n = C(); n.query = m; - let r = $c(n); - if (F() && ul(r) && (e = await Te(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { + let r = tl(n); + if (F() && fl(r) && (e = await Te(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { ok: !1, aborted: !0 }; @@ -6294,7 +6294,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: null, done: !1 - }), tu(t, { + }), ru(t, { rebuildFromVisible: !0, preserveHiddenCount: !0, assetKey: (e) => te(e, u) @@ -6307,10 +6307,10 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: null, done: !1 - }), tu(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); + }), ru(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); } let _ = await me(); - return fe(), eu() && _?.ok && !_?.skipped && !t.done && !_?.aborted && P(t.requestId), c && (pe({ + return fe(), nu() && _?.ok && !_?.skipped && !t.done && !_?.aborted && P(t.requestId), c && (pe({ title: m, showEmptyMessage: !(_?.skipped || _?.hidden || _?.aborted || _?.stale || _?.preservedCached || _?.busy) }), O(h.nextContext)), { @@ -6359,15 +6359,15 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM cursor: null, total: p.length, done: !0 - }), tu(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); + }), ru(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); } try { - let e = Cc(f, "mtime_desc"), n = p.sort((t, n) => Sl(t, n, e)); + let e = Tc(f, "mtime_desc"), n = p.sort((t, n) => wl(t, n, e)); return l && h && (o({ query: String(c || "Collection"), total: p.length, done: !0 - }), tu(t), g.resetCount += 1), ie(f, n), ue({ + }), ru(t), g.resetCount += 1), ie(f, n), ue({ offset: n.length, cursor: null, total: n.length, @@ -6378,14 +6378,14 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM total: n.length }; } catch (e) { - return i(Zl("Failed to load collection", e), { error: !0 }), { + return i($l("Failed to load collection", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; } finally { if (u) try { let e = Date.now() - m; - e < Wl && await Gl(Wl - e); + e < Kl && await ql(Kl - e); } catch (e) { console.debug?.(e); } @@ -6395,7 +6395,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM function ye() { v("reload", { reloadReason: "scopeSwitch" }); try { - Ya(y()); + Za(y()); } catch (e) { console.debug?.(e); } @@ -6415,7 +6415,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM t.virtualGrid?.setItems?.(t.assets || []); } function Se(e, { updateSelection: n = !0 } = {}) { - let r = hl(t, e, { assetKey: (e) => te(e, y()) }); + let r = _l(t, e, { assetKey: (e) => te(e, y()) }); return r ? (Number.isFinite(Number(t.total)) && ue({ total: Math.max(0, Number(t.total || 0) - r) }), n && c(t.assets.map((e) => String(e?.id || "")).filter(Boolean), { activeId: t.activeId }), !t.assets.length && !t.loading && i("No assets found"), { ok: !0, removed: r, @@ -6437,7 +6437,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { return !1; } - }, r = Ll(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; + }, r = zl(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; if (!o) return null; try { let e = o.getBoundingClientRect(), n = t.getBoundingClientRect(); @@ -6453,14 +6453,14 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM async function we(e) { let t = y(), n = l(); if (!t || !n || !e) return; - await Xl(); + await Ql(); let r = String(e.id || "").trim(); if (!r) { n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; return; } - d(r, { align: "start" }), await Xl(); - let i = Rl(t, r); + d(r, { align: "start" }), await Ql(); + let i = Bl(t, r); if (!i) n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; else try { let t = i.getBoundingClientRect(), r = n.getBoundingClientRect(), a = t.top - r.top - Number(e.top || 0); @@ -6472,7 +6472,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM async function Te(e = {}, n = {}) { let i = y(); if (!i || !F()) return !1; - let s = $c(e), c = ll(s); + let s = tl(e), c = dl(s); if (!c || !Array.isArray(c.assets) || !c.assets.length || !n.allowReplaceExisting && Array.isArray(t.assets) && t.assets.length) return !1; g.lastResetReason = "snapshot"; try { @@ -6489,7 +6489,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM query: c.query || n.title || "Cached", total: Number(c.total ?? c.assets.length) || c.assets.length, done: !!c.done - }), tu(t), g.resetCount += 1, a(), r(), t.loading = !1, ie(i, c.assets), ue({ + }), ru(t), g.resetCount += 1, a(), r(), t.loading = !1, ie(i, c.assets), ue({ offset: Math.max(Number(c.assets.length || 0) || 0, Number(c.offset || c.assets.length) || c.assets.length), cursor: c.cursor || null, total: Number(c.total ?? c.assets.length) || c.assets.length, @@ -6503,34 +6503,34 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM return { getOrCreateState: () => t, ensureVirtualGrid: () => t.virtualGrid, - upsertState: Hl, - maxBatchSize: Vl, - debounceMs: Bl, - assetKey: (t) => Kl(t) || te(t, e), - loadMajoorSettings: Jt + upsertState: Wl, + maxBatchSize: Ul, + debounceMs: Hl, + assetKey: (t) => Jl(t) || te(t, e), + loadMajoorSettings: Vn }; } function De(e) { v("upsertRealtime", { appendReason: "realtime" }); let t = y(); - return !t || !e || !e.id ? !1 : Pl(t, e, Ee(t)); + return !t || !e || !e.id ? !1 : Il(t, e, Ee(t)); } let Oe = !1; function ke(e) { v("upsertRealtime", { appendReason: "realtimeImmediate" }); let t = y(); if (!t || !e || !e.id) return !1; - let n = Pl(t, e, Ee(t)); + let n = Il(t, e, Ee(t)); return n && !Oe && (Oe = !0, queueMicrotask(() => { Oe = !1; let e = y(); - e && Nl(e, Ee(e)); + e && Fl(e, Ee(e)); })), n; } function Ae() { I(t.query || "Cached"); try { - cl(); + ul(); } catch (e) { console.debug?.(e); } @@ -6542,7 +6542,7 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } let e = y(); if (e) try { - let t = Tl(e, Hl); + let t = Dl(e, Wl); t?.timer && (clearTimeout(t.timer), t.timer = null), t?.pending?.clear?.(); } catch (e) { console.debug?.(e); @@ -6580,10 +6580,10 @@ function nu({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; } // node_modules/@tanstack/virtual-core/dist/esm/lazy-measurements.js -function ru(e) { +function au(e) { return typeof e == "object" ? e.key : e; } -function iu(e, t) { +function ou(e, t) { let n = e.length; return new Proxy(e, { get(e, r, i) { if (typeof r == "string") { @@ -6612,7 +6612,7 @@ function iu(e, t) { } }); } // node_modules/@tanstack/virtual-core/dist/esm/utils.js -function au(e, t, n) { +function su(e, t, n) { let r = n.initialDeps ?? [], i, a = !0; function o() { let o = e(); @@ -6622,34 +6622,34 @@ function au(e, t, n) { r = e; }, o; } -function ou(e, t) { +function cu(e, t) { if (e === void 0) throw Error(`Unexpected undefined${t ? `: ${t}` : ""}`); return e; } -var su = (e, t) => Math.abs(e - t) < 1.01, cu = (e, t, n) => { +var lu = (e, t) => Math.abs(e - t) < 1.01, uu = (e, t, n) => { let r; return Object.assign(function(...i) { e.clearTimeout(r), r = e.setTimeout(() => t.apply(this, i), n); }, { cancel: () => { e.clearTimeout(r); } }); -}, lu, uu = () => { - if (lu !== void 0) return lu; - if (typeof navigator > "u") return lu = !1; - if (/iP(hone|od|ad)/.test(navigator.userAgent)) return lu = !0; +}, du, fu = () => { + if (du !== void 0) return du; + if (typeof navigator > "u") return du = !1; + if (/iP(hone|od|ad)/.test(navigator.userAgent)) return du = !0; let e = navigator.maxTouchPoints; - return lu = navigator.platform === "MacIntel" && e !== void 0 && e > 0; -}, du = (e) => { + return du = navigator.platform === "MacIntel" && e !== void 0 && e > 0; +}, pu = (e) => { let { offsetWidth: t, offsetHeight: n } = e; return { width: t, height: n }; -}, fu = (e) => e, pu = (e) => { +}, mu = (e) => e, hu = (e) => { let t = Math.max(e.startIndex - e.overscan, 0), n = Math.min(e.endIndex + e.overscan, e.count - 1) - t + 1, r = Array(n); for (let e = 0; e < n; e++) r[e] = t + e; return r; -}, mu = (e, t) => { +}, gu = (e, t) => { let n = e.scrollElement; if (!n) return; let r = e.targetWindow; @@ -6661,7 +6661,7 @@ var su = (e, t) => Math.abs(e - t) < 1.01, cu = (e, t, n) => { height: Math.round(r) }); }; - if (i(du(n)), !r.ResizeObserver) return () => {}; + if (i(pu(n)), !r.ResizeObserver) return () => {}; let a = new r.ResizeObserver((t) => { let r = () => { let e = t[0]; @@ -6675,28 +6675,28 @@ var su = (e, t) => Math.abs(e - t) < 1.01, cu = (e, t, n) => { return; } } - i(du(n)); + i(pu(n)); }; e.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(r) : r(); }); return a.observe(n, { box: "border-box" }), () => { a.unobserve(n); }; -}, hu = { passive: !0 }, gu = typeof window > "u" || "onscrollend" in window, _u = (e, t, n) => { +}, _u = { passive: !0 }, vu = typeof window > "u" || "onscrollend" in window, yu = (e, t, n) => { let r = e.scrollElement; if (!r) return; let i = e.targetWindow; if (!i) return; - let a = e.options.useScrollendEvent && gu, o = 0, s = a ? null : cu(i, () => t(n(r), !1), e.options.isScrollingResetDelay), c = (e) => () => { + let a = e.options.useScrollendEvent && vu, o = 0, s = a ? null : uu(i, () => t(n(r), !1), e.options.isScrollingResetDelay), c = (e) => () => { o = n(r), s?.(), t(o, e); }, l = c(!0), u = c(!1); - return r.addEventListener("scroll", l, hu), a && r.addEventListener("scrollend", u, hu), () => { + return r.addEventListener("scroll", l, _u), a && r.addEventListener("scrollend", u, _u), () => { r.removeEventListener("scroll", l), a && r.removeEventListener("scrollend", u), s?.cancel(); }; -}, vu = (e, t) => _u(e, t, (t) => { +}, bu = (e, t) => yu(e, t, (t) => { let { horizontal: n, isRtl: r } = e.options; return n ? t.scrollLeft * (r && -1 || 1) : t.scrollTop; -}), yu = (e, t, n) => { +}), xu = (e, t, n) => { if (n.options.useCachedMeasurements) { let t = n.indexFromElement(e), r = n.options.getItemKey(t); return n.itemSizeCache.get(r) ?? n.options.estimateSize(t); @@ -6710,14 +6710,14 @@ var su = (e, t) => Math.abs(e - t) < 1.01, cu = (e, t, n) => { if (i !== void 0) return i; } return e[n.options.horizontal ? "offsetWidth" : "offsetHeight"]; -}, bu = (e, { adjustments: t = 0, behavior: n }, r) => { +}, Su = (e, { adjustments: t = 0, behavior: n }, r) => { var i, a; (a = (i = r.scrollElement)?.scrollTo) == null || a.call(i, { [r.options.horizontal ? "left" : "top"]: e + t, behavior: n }); }; -function xu(e, t, n, r) { +function Cu(e, t, n, r) { if (t === 0) return !1; let i = r(0), a = /* @__PURE__ */ new Set(), o = 0; for (; o < e;) { @@ -6731,7 +6731,7 @@ function xu(e, t, n, r) { for (let e = s; e < t; e++) if (a.has(r(e))) return !1; return !0; } -var Su = class { +var wu = class { constructor(e) { this.unsubs = [], this.scrollElement = null, this.targetWindow = null, this.isScrolling = !1, this.scrollState = null, this.measurementsCache = [], this._singleLaneMeasurements = null, this.itemSizeCache = /* @__PURE__ */ new Map(), this.itemSizeCacheVersion = 0, this.laneAssignments = /* @__PURE__ */ new Map(), this.pendingMin = null, this.prevLanes = void 0, this.lanesChangedFlag = !1, this.lanesSettling = !1, this.pendingScrollAnchor = null, this.scrollRect = null, this.scrollOffset = null, this.scrollDirection = null, this.scrollAdjustments = 0, this._iosDeferredAdjustment = 0, this._iosTouching = !1, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._intendedScrollOffset = null, this._clampedAdjustment = null, this.elementsCache = /* @__PURE__ */ new Map(), this.now = () => { var e; @@ -6771,10 +6771,10 @@ var Su = class { scrollPaddingStart: 0, scrollPaddingEnd: 0, horizontal: !1, - getItemKey: fu, - rangeExtractor: pu, + getItemKey: mu, + rangeExtractor: hu, onChange: () => {}, - measureElement: yu, + measureElement: xu, initialRect: { width: 0, height: 0 @@ -6801,13 +6801,13 @@ var Su = class { } let n = this.options, r = null, i = null, a = !1; if (n !== void 0 && n.enabled && t.enabled && t.anchorTo === "end" && this.scrollElement !== null) { - let e = n.count, o = t.count, s = this.getMeasurements(), c = this._singleLaneMeasurements?.items ?? s, l = (e) => ru(c[e]), u = e > 0 ? l(0) : null, d = e > 0 ? l(e - 1) : null; + let e = n.count, o = t.count, s = this.getMeasurements(), c = this._singleLaneMeasurements?.items ?? s, l = (e) => au(c[e]), u = e > 0 ? l(0) : null, d = e > 0 ? l(e - 1) : null; if (o !== e || e > 0 && o > 0 && (t.getItemKey(0) !== u || t.getItemKey(o - 1) !== d)) { a = !0; let c = e > 0 ? this.getVirtualItemForOffset(this.getScrollOffset()) ?? s[0] : null; c && (r = [c.key, this.getScrollOffset() - c.start]); let u = t.followOnAppend === !0 ? "auto" : t.followOnAppend || null; - u && o > 0 && this.isAtEnd(n.scrollEndThreshold) && (e === 0 || t.getItemKey(o - 1) !== d) && (o > e || xu(e, o, l, t.getItemKey)) && (i = u); + u && o > 0 && this.isAtEnd(n.scrollEndThreshold) && (e === 0 || t.getItemKey(o - 1) !== d) && (o > e || Cu(e, o, l, t.getItemKey)) && (i = u); } } this.options = t, a && (this.pendingMin = 0, this.itemSizeCacheVersion++); @@ -6832,7 +6832,7 @@ var Su = class { }, this.notify = (e) => { var t, n; (n = (t = this.options).onChange) == null || n.call(t, this, e); - }, this.maybeNotify = au(() => (this.calculateRange(), [ + }, this.maybeNotify = su(() => (this.calculateRange(), [ this.isScrolling, this.range ? this.range.startIndex : null, this.range ? this.range.endIndex : null @@ -6870,11 +6870,11 @@ var Su = class { let e = this.scrollElement, t = () => { this._iosTouching = !0, this._iosJustTouchEnded = !1, this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }, n = () => { - this._iosTouching = !1, uu() && this.targetWindow != null && (this._iosJustTouchEnded = !0, this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => { + this._iosTouching = !1, fu() && this.targetWindow != null && (this._iosJustTouchEnded = !0, this._iosTouchEndTimerId = this.targetWindow.setTimeout(() => { this._iosJustTouchEnded = !1, this._iosTouchEndTimerId = null, this._flushIosDeferredIfReady(); }, 150)); }; - e.addEventListener("touchstart", t, hu), e.addEventListener("touchend", n, hu), this.unsubs.push(() => { + e.addEventListener("touchstart", t, _u), e.addEventListener("touchend", n, _u), this.unsubs.push(() => { e.removeEventListener("touchstart", t), e.removeEventListener("touchend", n), this._iosTouchEndTimerId !== null && this.targetWindow != null && (this.targetWindow.clearTimeout(this._iosTouchEndTimerId), this._iosTouchEndTimerId = null); }); } @@ -6886,7 +6886,7 @@ var Su = class { let t = this.pendingScrollAnchor; if (this.pendingScrollAnchor = null, t && this.scrollElement && this.options.enabled) { let [e, n, r, i] = t; - e !== null && !r && (uu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? i !== 0 && (this._iosDeferredAdjustment += i) : this.scrollState?.behavior === "smooth" && !su(this.getScrollOffset() - i, this.scrollState.lastTargetOffset) || this._scrollToOffset(this.getScrollOffset(), { + e !== null && !r && (fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded) ? i !== 0 && (this._iosDeferredAdjustment += i) : this.scrollState?.behavior === "smooth" && !lu(this.getScrollOffset() - i, this.scrollState.lastTargetOffset) || this._scrollToOffset(this.getScrollOffset(), { adjustments: void 0, behavior: void 0 })), r && this.scrollToEnd({ behavior: r }); @@ -6915,7 +6915,7 @@ var Su = class { adjustments: this.scrollAdjustments += n, behavior: void 0 }); - }, this.rafId = null, this.getSize = () => this.options.enabled ? (this.scrollRect = this.scrollRect ?? this.options.initialRect, this.scrollRect[this.options.horizontal ? "width" : "height"]) : (this.scrollRect = null, 0), this.getScrollOffset = () => this.options.enabled ? (this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset == "function" ? this.options.initialOffset() : this.options.initialOffset), this.scrollOffset) : (this.scrollOffset = null, 0), this.getMeasurementOptions = au(() => [ + }, this.rafId = null, this.getSize = () => this.options.enabled ? (this.scrollRect = this.scrollRect ?? this.options.initialRect, this.scrollRect[this.options.horizontal ? "width" : "height"]) : (this.scrollRect = null, 0), this.getScrollOffset = () => this.options.enabled ? (this.scrollOffset = this.scrollOffset ?? (typeof this.options.initialOffset == "function" ? this.options.initialOffset() : this.options.initialOffset), this.scrollOffset) : (this.scrollOffset = null, 0), this.getMeasurementOptions = su(() => [ this.options.count, this.options.paddingStart, this.options.scrollMargin, @@ -6933,7 +6933,7 @@ var Su = class { lanes: a, laneAssignmentMode: o, gap: s - }), { key: !1 }), this.isIndexInRange = (e) => e >= 0 && e < this.options.count, this.getMeasurements = au(() => [this.getMeasurementOptions(), this.itemSizeCacheVersion], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }, c) => { + }), { key: !1 }), this.isIndexInRange = (e) => e >= 0 && e < this.options.count, this.getMeasurements = su(() => [this.getMeasurementOptions(), this.itemSizeCacheVersion], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o, gap: s }, c) => { let l = this.itemSizeCache; if (!i) return this.measurementsCache = [], this._singleLaneMeasurements = null, this.itemSizeCache.clear(), this.laneAssignments.clear(), []; if (this.laneAssignments.size > e) for (let t of this.laneAssignments.keys()) t >= e && this.laneAssignments.delete(t); @@ -6963,7 +6963,7 @@ var Su = class { flat: a, items: o }; - let d = iu(o, a); + let d = ou(o, a); return this.measurementsCache = d, d; } let d = this.measurementsCache.slice(0, u), f = Array(a).fill(void 0), p = new Float64Array(a), m = 0; @@ -6999,15 +6999,15 @@ var Su = class { }, { key: !1, debug: () => this.options.debug - }), this.calculateRange = au(() => [ + }), this.calculateRange = su(() => [ this.getMeasurements(), this.getSize(), this.getScrollOffset(), this.options.lanes - ], (e, t, n, r) => e.length === 0 || t === 0 ? (this.range = null, null) : (this.range = Tu(e, t, n, r, r === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null), this.range), { + ], (e, t, n, r) => e.length === 0 || t === 0 ? (this.range = null, null) : (this.range = Du(e, t, n, r, r === 1 && this._singleLaneMeasurements !== null ? this._singleLaneMeasurements.flat : null), this.range), { key: !1, debug: () => this.options.debug - }), this.getVirtualIndexes = au(() => { + }), this.getVirtualIndexes = su(() => { let e = null, t = null, n = this.calculateRange(); return n && (e = n.startIndex, t = n.endIndex), this.maybeNotify.updateDeps([ this.isScrolling, @@ -7073,7 +7073,7 @@ var Su = class { let f = !1; a ? f = this.applyScrollAdjustment(this.getTotalSize() - c) : d && (f = this.applyScrollAdjustment(s)), this.notify(f), this._retryClampedAdjustment(); } - }, this.getVirtualItems = au(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { + }, this.getVirtualItems = su(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { let n = []; for (let r = 0, i = e.length; r < i; r++) { let i = t[e[r]]; @@ -7087,7 +7087,7 @@ var Su = class { let t = this.getMeasurements(); if (t.length === 0) return; let n = this._singleLaneMeasurements?.flat, r = this.options.lanes === 1 && n != null; - return ou(t[Cu(0, t.length - 1, r ? (e) => n[e * 2] : (e) => ou(t[e]).start, e)]); + return cu(t[Tu(0, t.length - 1, r ? (e) => n[e * 2] : (e) => cu(t[e]).start, e)]); }, this.getMaxScrollOffset = () => { if (!this.scrollElement) return 0; if ("scrollHeight" in this.scrollElement) return this.options.horizontal ? this.scrollElement.scrollWidth - this.scrollElement.clientWidth : this.scrollElement.scrollHeight - this.scrollElement.clientHeight; @@ -7200,7 +7200,7 @@ var Su = class { } applyScrollAdjustment(e, t) { if (e === 0) return !1; - if (uu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) return this._iosDeferredAdjustment += e, !1; + if (fu() && (this.isScrolling || this._iosTouching || this._iosJustTouchEnded)) return this._iosDeferredAdjustment += e, !1; { let n = this.getScrollOffset() + this.scrollAdjustments + e, r = this.scrollElement, i = r !== null && ("scrollHeight" in r || "document" in r) ? this.getMaxScrollOffset() : null; return this._clampedAdjustment = i !== null && n > i + .5 ? { @@ -7224,7 +7224,7 @@ var Su = class { return; } let e = this.scrollState.index == null ? void 0 : this.getOffsetForIndex(this.scrollState.index, this.scrollState.align), t = e ? e[0] : this.scrollState.lastTargetOffset, n = t !== this.scrollState.lastTargetOffset; - if (!n && su(t, this.getScrollOffset())) { + if (!n && lu(t, this.getScrollOffset())) { if (this.scrollState.stableFrames++, this.scrollState.stableFrames >= 1) { this.getScrollOffset() !== t && this._scrollToOffset(t, { adjustments: void 0, @@ -7241,7 +7241,7 @@ var Su = class { } this.scheduleScrollReconcile(); } -}, Cu = (e, t, n, r) => { +}, Tu = (e, t, n, r) => { for (; e <= t;) { let i = (e + t) / 2 | 0, a = n(i); if (a < r) e = i + 1; @@ -7250,7 +7250,7 @@ var Su = class { } return e > 0 ? e - 1 : 0; }; -function wu(e, t, n) { +function Eu(e, t, n) { let r = 0; for (; r <= t;) { let i = (r + t) / 2 | 0, a = e[i * 2]; @@ -7260,21 +7260,21 @@ function wu(e, t, n) { } return r > 0 ? r - 1 : 0; } -function Tu(e, t, n, r, i) { +function Du(e, t, n, r, i) { let a = e.length - 1; if (e.length <= r) return { startIndex: 0, endIndex: a }; if (r === 1 && i !== null) { - let e = wu(i, a, n), r = e, o = n + t; + let e = Eu(i, a, n), r = e, o = n + t; for (; r < a && i[r * 2] + i[r * 2 + 1] < o;) r++; return { startIndex: e, endIndex: r }; } - let o = Cu(0, a, (t) => e[t].start, n), s = o; + let o = Tu(0, a, (t) => e[t].start, n), s = o; if (r === 1) for (; s < a && e[s].end < n + t;) s++; else if (r > 1) { let i = Array(r).fill(0); @@ -7295,34 +7295,34 @@ function Tu(e, t, n, r, i) { }; } // node_modules/@tanstack/vue-virtual/dist/esm/index.js -function Eu(e) { - let t = new Su(Z(e)), n = gr(t), r = t._didMount(); - return or(() => Z(e).getScrollElement(), (e) => { +function Ou(e) { + let t = new wu(Z(e)), n = vr(t), r = t._didMount(); + return cr(() => Z(e).getScrollElement(), (e) => { e && t._willUpdate(); - }, { immediate: !0 }), or(() => Z(e), (e) => { + }, { immediate: !0 }), cr(() => Z(e), (e) => { t.setOptions({ ...e, onChange: (t, r) => { var i; - vr(n), (i = e.onChange) == null || i.call(e, t, r); + br(n), (i = e.onChange) == null || i.call(e, t, r); } - }), t._willUpdate(), vr(n); - }, { immediate: !0 }), Cr(r), n; + }), t._willUpdate(), br(n); + }, { immediate: !0 }), Tr(r), n; } -function Du(e) { - return Eu(K(() => ({ - observeElementRect: mu, - observeElementOffset: vu, - scrollToFn: bu, +function ku(e) { + return Ou(K(() => ({ + observeElementRect: gu, + observeElementOffset: bu, + scrollToFn: Su, ...Z(e) }))); } // ui/vue/grid/useGridVirtualRows.ts -function Ou(e, t = 0) { +function Au(e, t = 0) { let n = Number(Z(e)); return Number.isFinite(n) ? n : t; } -function ku(e = [], t = 1) { +function ju(e = [], t = 1) { let n = Array.isArray(e) ? e : [], r = Math.max(1, Number(t) || 1), i = []; for (let e = 0; e < n.length; e += r) i.push({ index: Math.floor(e / r), @@ -7330,22 +7330,22 @@ function ku(e = [], t = 1) { }); return i; } -function Au(e = [], t = 0, n = 1) { +function Mu(e = [], t = 0, n = 1) { let r = Array.isArray(e) ? e : [], i = Math.max(1, Number(n) || 1), a = Math.max(0, Number(t) || 0) * i; return r.slice(a, a + i); } -function ju({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight: i, overscan: a = 8, enabled: o = !0, measure: s = yu } = {}) { +function Nu({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight: i, overscan: a = 8, enabled: o = !0, measure: s = xu } = {}) { let c = K(() => { if (!Z(o)) return 0; let e = Z(n); if (Array.isArray(e)) return e.length; - let i = Z(t) || [], a = Math.max(1, Ou(r, 1)); + let i = Z(t) || [], a = Math.max(1, Au(r, 1)); return Math.ceil((Array.isArray(i) ? i.length : 0) / a); - }), l = Du(K(() => ({ + }), l = ku(K(() => ({ count: c.value, getScrollElement: () => Z(e) || null, - estimateSize: () => Math.max(1, Ou(i, 120)), - overscan: Math.max(0, Ou(a, 8)), + estimateSize: () => Math.max(1, Au(i, 120)), + overscan: Math.max(0, Au(a, 8)), measureElement: s }))); return { @@ -7365,27 +7365,27 @@ function ju({ scrollRef: e, items: t, rows: n, columnCount: r, estimateRowHeight groupKey: String(n?.groupKey || "") }; }); - let i = Z(t) || [], a = Math.max(1, Ou(r, 1)); + let i = Z(t) || [], a = Math.max(1, Au(r, 1)); return l.value.getVirtualItems().map((e) => ({ key: e.key, index: e.index, virtual: e, - items: Au(i, e.index, a), + items: Mu(i, e.index, a), kind: "assets", title: "", groupKey: "" })); }), totalSize: K(() => l.value.getTotalSize()), - getRowItems: (e) => Au(Z(t) || [], e, Ou(r, 1)) + getRowItems: (e) => Mu(Z(t) || [], e, Au(r, 1)) }; } // ui/vue/grid/useInfiniteTrigger.ts -function Mu(e, t = !0) { +function Pu(e, t = !0) { let n = Z(e); return n == null ? t : !!n; } -function Nu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { +function Fu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { let o = Q(null), s = null, c = !1; function l() { try { @@ -7396,7 +7396,7 @@ function Nu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar s = null; } async function u() { - if (!c && Mu(t, !0) && Mu(n, !0) && typeof r == "function") { + if (!c && Pu(t, !0) && Pu(n, !0) && typeof r == "function") { c = !0; try { await r(); @@ -7416,7 +7416,7 @@ function Nu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar threshold: a }), s.observe(t)); } - return ur() && (kr(d), dr(l), or(() => [Z(e), o.value], () => d(), { flush: "post" })), { + return fr() && (jr(d), pr(l), cr(() => [Z(e), o.value], () => d(), { flush: "post" })), { sentinelRef: o, connect: d, disconnect: l, @@ -7424,18 +7424,18 @@ function Nu({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar }; } // ui/vue/grid/useGridDisplayAssets.ts -function Pu(e) { +function Iu(e) { let t = At(e?.filename); return t ? `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}|${t}` : ""; } -function Fu(e) { +function Lu(e) { return !!e; } -function Iu(e) { +function Ru(e) { let t = Array.isArray(e) ? e : [], n = /* @__PURE__ */ new Map(), r = []; for (let e of t) { if (!e) continue; - let t = Pu(e); + let t = Iu(e); if (!t) { e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0, r.push(e); continue; @@ -7453,7 +7453,7 @@ function Iu(e) { return r; } // ui/vue/components/grid/VirtualAssetGridHost.vue?vue&type=script&setup=true&lang.ts -var Lu = { +var zu = { key: 0, class: "mjr-grid-loading-overlay", style: { @@ -7468,19 +7468,19 @@ var Lu = { background: "rgba(20,22,28,0.55)", "backdrop-filter": "blur(2px)" } -}, Ru = { style: { width: "100%" } }, zu = { style: { +}, Bu = { style: { width: "100%" } }, Vu = { style: { "margin-top": "10px", "font-size": "12px", opacity: "0.68", "text-align": "center" -} }, Bu = ["data-index"], Vu = [ +} }, Hu = ["data-index"], Uu = [ "aria-expanded", "title", "onClick" -], Hu = { +], Wu = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Uu = { class: "mjr-grid-group-separator-title" }, Wu = [ +}, Gu = { class: "mjr-grid-group-separator-title" }, Ku = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7496,21 +7496,21 @@ var Lu = { "onMousedown", "onClick", "onDblclick" -], Gu = { +], qu = { key: 3, style: { display: "flex", "flex-direction": "column", width: "100%" } -}, Ku = [ +}, Ju = [ "aria-expanded", "title", "onClick" -], qu = { +], Yu = { class: "mjr-grid-group-separator-chevron", "aria-hidden": "true" -}, Ju = { class: "mjr-grid-group-separator-title" }, Yu = [ +}, Xu = { class: "mjr-grid-group-separator-title" }, Zu = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -7526,7 +7526,7 @@ var Lu = { "onMousedown", "onClick", "onDblclick" -], Xu = 501, Zu = /* @__PURE__ */ lr({ +], Qu = 501, $u = /* @__PURE__ */ dr({ __name: "VirtualAssetGridHost", props: { scrollElement: { default: null }, @@ -7556,10 +7556,10 @@ var Lu = { Q(!0); let s = Q(0), c = Q(0), l = /* @__PURE__ */ new WeakMap(), u = 0, d = 0, f = 0, p = 0, m = 0, h = /* @__PURE__ */ new Map(), g = null, _ = null; function v() { - return g ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), g; + return g ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), g; } function b() { - return _ ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), _; + return _ ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), _; } function x(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { @@ -7567,7 +7567,7 @@ var Lu = { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }); } - ir("mjrStackService", { + or("mjrStackService", { openStackGroup: async (e) => { let t = i.value; if (!t || !e) return; @@ -7578,7 +7578,7 @@ var Lu = { let a = t._mjrStackMembersCache.get(r); if (!Array.isArray(a)) { let e = h.get(r); - e || (e = re(Je(n, { limit: Xu }), { timeoutMs: 3e4 }).finally(() => { + e || (e = re(nt(n, { limit: Qu }), { timeoutMs: 3e4 }).finally(() => { h.delete(r); }), h.set(r, e)); let i = await e; @@ -7611,13 +7611,13 @@ var Lu = { })); } }); - let { state: S, selectedIdSet: C, setLoadingMessage: w, clearLoadingMessage: T, setStatusMessage: E, clearStatusMessage: D, resetAssets: O, setSelection: k, reconcileSelection: A, getSelectedAssets: j, getActiveAsset: M } = fc(); + let { state: S, selectedIdSet: C, setLoadingMessage: w, clearLoadingMessage: T, setStatusMessage: E, clearStatusMessage: D, resetAssets: O, setSelection: k, reconcileSelection: A, getSelectedAssets: j, getActiveAsset: M } = mc(); function N(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } let P = K(() => N(r.scrollElement)); function ee() { - return Il(i.value); + return Rl(i.value); } function te(e, { align: t = "auto" } = {}) { let n = String(e || "").trim(); @@ -7627,7 +7627,7 @@ var Lu = { if (r.virtualize) { let e = Math.floor(i / Math.max(1, ze.value)); try { - Xe.value.scrollToIndex(e, { align: t }); + Ye.value.scrollToIndex(e, { align: t }); } catch (e) { console.debug?.(e); } @@ -7642,9 +7642,9 @@ var Lu = { } } function F() { - return gc(i.value, P.value); + return vc(i.value, P.value); } - let I = nu({ + let I = iu({ gridContainerRef: i, state: S, setLoadingMessage: w, @@ -7658,7 +7658,7 @@ var Lu = { readRenderedCards: ee, scrollToAssetId: te, canLoadMore: F - }), { sentinelRef: ne } = Nu({ + }), { sentinelRef: ne } = Fu({ rootRef: P, enabled: !0, canLoad: K(() => !S.loading && !S.done && F()), @@ -7751,7 +7751,7 @@ var Lu = { let e = i.value; if (!e) return; let t = new Set((Array.isArray(S.selectedIds) ? S.selectedIds : []).map((e) => String(e || "").trim()).filter(Boolean)); - Zn(e, t, S.activeId || ""); + $n(e, t, S.activeId || ""); try { t.size ? e.dataset.mjrSelectedAssetId = String(S.activeId || Array.from(t)[0] || "") : delete e.dataset.mjrSelectedAssetId; } catch (e) { @@ -7781,7 +7781,7 @@ var Lu = { } } ve._lastSelectionKey = ""; - let ye = K(() => Iu(S.assets)), be = K(() => (Array.isArray(ye.value) ? ye.value : []).filter((e) => Fu(e))), xe = Q(/* @__PURE__ */ new Set()), Se = Q(""), Ce = K(() => { + let ye = K(() => Ru(S.assets)), be = K(() => (Array.isArray(ye.value) ? ye.value : []).filter((e) => Lu(e))), xe = Q(/* @__PURE__ */ new Set()), Se = Q(""), Ce = K(() => { s.value; let e = ue(B.WORKFLOW_GRID_GROUP_BY); return e === "none" || Se.value !== "workflow" ? "none" : e; @@ -7791,7 +7791,7 @@ var Lu = { let t = Ce.value; return t === "none" ? [] : me(e, ze.value, t); }); - or(() => `${Ce.value}::${we.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { + cr(() => `${Ce.value}::${we.value.map((e) => `${e.kind}:${e.groupKey}`).join("|")}`, () => { if (Ce.value === "none") { xe.value = /* @__PURE__ */ new Set(); return; @@ -7822,7 +7822,7 @@ var Lu = { let ke = K(() => { let e = Array.isArray(be.value) ? be.value : []; if (!e.length) return []; - if (Ce.value === "none") return ku(e, ze.value); + if (Ce.value === "none") return ju(e, ze.value); let t = Array.isArray(we.value) ? we.value : [], n = []; for (let e of t) e?.kind === "header" ? n.push(e) : Te(String(e?.groupKey || "")) || n.push(e); return n; @@ -7874,7 +7874,7 @@ var Lu = { let t = e?.detail || {}, n = String(t.assetId ?? t.id ?? "").trim(); n && (Array.isArray(be.value) ? be.value : []).some((e) => String(e?.id || "") === n) && (k([n], n), _e(), ve(), te(n, { align: "center" }), setTimeout(() => Pe(n), 0)); } - function Ie(e) { + function Le(e) { if (!e) return; e._mjrSelectionManagedByVue = !0; try { @@ -7887,9 +7887,9 @@ var Lu = { } catch (e) { console.debug?.(e); } - fi(e, { applySettingsClasses: r.applyDefaultSettingsClasses }); + mi(e, { applySettingsClasses: r.applyDefaultSettingsClasses }); try { - pt = $o(e); + pt = ts(e); } catch (e) { console.debug?.(e), pt = null; } @@ -7904,7 +7904,7 @@ var Lu = { e._mjrRemoveAssets = t, e._mjrGetRenderedCards = () => ee(), e._mjrScrollToAssetId = (e, t = {}) => { te(e, t); }, e._mjrHasAssetId = (e) => (Array.isArray(S.assets) ? S.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => S, e._mjrGetSelectedAssets = () => j(), e._mjrGetActiveAsset = () => M(), e._mjrOnKeyboardAssetChanged = (e) => je(e), e._mjrOpenKeyboardDetails = () => Me(); - let n = () => (r.applyDefaultSettingsClasses && (di(e), s.value += 1), I.refreshGrid()), i = () => { + let n = () => (r.applyDefaultSettingsClasses && (pi(e), s.value += 1), I.refreshGrid()), i = () => { I.prepareGridForScopeSwitch(), I.dispose(), S.cardElements.clear(), e._mjrGridApi = null; }; e._mjrGridApi = { @@ -7925,11 +7925,11 @@ var Lu = { getDebugSnapshot: () => I.getDebugSnapshot() }, e._mjrLoadAssets = (...e) => I.loadAssets(...e), e._mjrLoadAssetsFromList = (...e) => I.loadAssetsFromList(...e), e._mjrPrepareForScopeSwitch = () => I.prepareGridForScopeSwitch(), e._mjrRefreshGrid = n, e._mjrCaptureAnchor = () => I.captureAnchor(), e._mjrRestoreAnchor = (e) => I.restoreAnchor(e), e._mjrHydrateFromSnapshot = (...e) => I.hydrateFromSnapshot(...e), e._mjrUpsertAsset = (e) => I.upsertAsset(e), e._mjrUpsertAssetNow = (e) => I.upsertAssetNow(e), e._mjrGetCanonicalState = () => I.getCanonicalState(), e._mjrGetDebugSnapshot = () => I.getDebugSnapshot(), e._mjrDispose = i; } - or(i, (e) => { - e && (Ie(e), _e(), Ae()); - }, { immediate: !0 }), or(() => `${(S.selectedIds || []).join("|")}::${String(S.activeId || "")}`, () => { + cr(i, (e) => { + e && (Le(e), _e(), Ae()); + }, { immediate: !0 }), cr(() => `${(S.selectedIds || []).join("|")}::${String(S.activeId || "")}`, () => { i.value && (_e(), ve()); - }, { flush: "post" }), or(() => `${Array.isArray(be.value) ? be.value.length : 0}::${Number(S.total || 0)}::${Number(S.hiddenPngSiblings || 0)}`, () => { + }, { flush: "post" }), cr(() => `${Array.isArray(be.value) ? be.value.length : 0}::${Number(S.total || 0)}::${Number(S.hiddenPngSiblings || 0)}`, () => { i.value && Ae(); }, { flush: "post", @@ -7987,7 +7987,7 @@ var Lu = { } c.value = 0; } - let qe = ju({ + let qe = Nu({ scrollRef: P, items: be, rows: ke, @@ -8000,14 +8000,14 @@ var Lu = { return Math.max(3, Math.min(30, n + r)); }), enabled: K(() => r.virtualize) - }), Ye = qe.rowCount, Xe = qe.virtualizer, Ze = qe.virtualRows, Qe = qe.totalSize, et = K(() => { + }), Je = qe.rowCount, Ye = qe.virtualizer, Xe = qe.virtualRows, Qe = qe.totalSize, $e = K(() => { let e = /* @__PURE__ */ new Map(); - for (let t of Ze.value) e.set(t.index, t.virtual || t); + for (let t of Xe.value) e.set(t.index, t.virtual || t); return e; - }), z = K(() => (s.value, !!B.GRID_SHOW_DETAILS)), tt = K(() => { + }), et = K(() => (s.value, !!B.GRID_SHOW_DETAILS)), z = K(() => { let e = Math.max(1, Number(ze.value || 1)); return Math.max(12, Math.min(36, e * 4)); - }), nt = K(() => Array.from({ length: Number(tt.value || 12) }, (e, t) => t)), rt = K(() => { + }), tt = K(() => Array.from({ length: Number(z.value || 12) }, (e, t) => t)), rt = K(() => { let e = Math.max(80, Number(Ue.value || 0) - Number(Ve.value || 0)), t = Math.max(80, Number(He.value || 0)); return Math.max(0, e - t); }), it = K(() => ({ @@ -8049,7 +8049,7 @@ var Lu = { backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" })), lt = K(() => ({ - display: z.value ? "block" : "none", + display: et.value ? "block" : "none", minHeight: `${Math.max(0, Number(rt.value || 0))}px` })); function ut() { @@ -8079,9 +8079,9 @@ var Lu = { 400 ]) setTimeout(e, t); } - kr(() => { + jr(() => { gt(), window.addEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Fe); - }), or(i, (e) => { + }), cr(i, (e) => { try { ft?.disconnect?.(); } catch (e) { @@ -8100,7 +8100,7 @@ var Lu = { console.debug?.(e), ft = null; } } - }, { immediate: !0 }), or(P, (e, t) => { + }, { immediate: !0 }), cr(P, (e, t) => { try { dt?.disconnect?.(); } catch (e) { @@ -8116,14 +8116,14 @@ var Lu = { console.debug?.(e), dt = null; } } - }, { immediate: !0 }), or(() => Ye.value, async () => { - Be.value && (await sr(), bt(), Bt()); - }), or(() => S.assets, async (e) => { + }, { immediate: !0 }), cr(() => Je.value, async () => { + Be.value && (await lr(), bt(), Bt()); + }), cr(() => S.assets, async (e) => { if (!Array.isArray(e) || e.length === 0) { let e = i.value; e?._mjrStackMembersCache && e._mjrStackMembersCache.clear(); } - await sr(), bt(); + await lr(), bt(); }); function _t(e, t) { let n = String(t?.filename || "").trim().toLowerCase(), r = l.get(e); @@ -8327,8 +8327,8 @@ var Lu = { e(R("toast.workflowMissingPath", "Workflow file path is missing."), "error"); return; } - let r = $e(); - if (Le(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; + let r = Ze(); + if (Ie(r) === !0 && !await Ut(R("dialog.workflowLoadReplaceDirty", "Current canvas has unsaved changes. Replace it with this workflow?"), R("tab.workflow", "Workflow"))) return; let i = await y(n, { timeoutMs: 3e4 }), o = i?.data?.workflow || i?.workflow || null; if (!i?.ok || !o || typeof o != "object") e(i?.error || R("toast.workflowLoadFailed", "Failed to load workflow."), "error"); else if (!Ne(o, r).ok) e(R("toast.workflowImportUnavailable", "ComfyUI workflow import is unavailable in this frontend."), "error"); @@ -8381,7 +8381,7 @@ var Lu = { function zt() { ut(); try { - Xe.value?.measure?.(); + Ye.value?.measure?.(); } catch (e) { console.debug?.(e); } @@ -8391,7 +8391,7 @@ var Lu = { u = requestAnimationFrame(() => { u = 0; try { - Xe.value?.measure?.(); + Ye.value?.measure?.(); } catch (e) { console.debug?.(e); } @@ -8399,7 +8399,7 @@ var Lu = { } catch (e) { console.debug?.(e), u = 0; try { - Xe.value?.measure?.(); + Ye.value?.measure?.(); } catch (e) { console.debug?.(e); } @@ -8438,7 +8438,7 @@ var Lu = { Ke(); }; } - or(P, (e) => { + cr(P, (e) => { try { Ft?.(); } catch (e) { @@ -8462,7 +8462,7 @@ var Lu = { let e = P.value; if (!e) return; let t = Array.isArray(S.assets) ? S.assets.length : 0, n = `${t}::${ze.value}`; - if (!It && !(n === Rt && Date.now() - Lt < 500) && (await sr(), (Number(e.scrollHeight || 0) || 0) <= Wt(e) + 40)) { + if (!It && !(n === Rt && Date.now() - Lt < 500) && (await lr(), (Number(e.scrollHeight || 0) || 0) <= Wt(e) + 40)) { let e = t; It = Promise.resolve(I.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { let t = Array.isArray(S.assets) ? S.assets.length : 0; @@ -8472,12 +8472,12 @@ var Lu = { }); } } - or(() => `${Array.isArray(S.assets) ? S.assets.length : 0}::${ze.value}::${S.loading}::${S.done}`, () => { + cr(() => `${Array.isArray(S.assets) ? S.assets.length : 0}::${ze.value}::${S.loading}::${S.done}`, () => { Gt(); }, { flush: "post" }); function Kt(e) { if (e && r.virtualize) try { - Xe.value.measureElement(e); + Ye.value.measureElement(e); } catch (e) { console.debug?.(e); } @@ -8490,7 +8490,7 @@ var Lu = { }; } function Yt(e) { - return et.value.get(e) || null; + return $e.value.get(e) || null; } function Xt(e) { let t = Yt(e); @@ -8515,11 +8515,11 @@ var Lu = { }; } function Qt() { - s.value += 1, r.applyDefaultSettingsClasses && i.value && di(i.value); + s.value += 1, r.applyDefaultSettingsClasses && i.value && pi(i.value); } - return or(() => r.applyDefaultSettingsClasses, () => { - i.value && r.applyDefaultSettingsClasses && di(i.value); - }, { immediate: !0 }), dr(() => { + return cr(() => r.applyDefaultSettingsClasses, () => { + i.value && r.applyDefaultSettingsClasses && pi(i.value); + }, { immediate: !0 }), pr(() => { try { window.removeEventListener(V.VIEWER_ACTIVE_ASSET_CHANGED, Fe); } catch (e) { @@ -8577,7 +8577,7 @@ var Lu = { } catch (e) { console.debug?.(e); } - }), or(i, (e) => { + }), cr(i, (e) => { e && (mt ||= (window.addEventListener("mjr-settings-changed", Qt), window.addEventListener("mjr:keepalive-attached", Vt), !0)); }, { immediate: !0 }), n({ get gridContainer() { @@ -8645,27 +8645,27 @@ var Lu = { "min-height": "100%" } }, [ - Z(S).loading && !Z(S).assets.length ? (q(), X("div", Lu, [U("div", Ru, [U("div", { + Z(S).loading && !Z(S).assets.length ? (q(), X("div", zu, [U("div", Bu, [U("div", { class: "mjr-grid-skeleton-layout", - style: yr(it.value) - }, [(q(!0), X(H, null, pr(nt.value, (e) => (q(), X("div", { + style: xr(it.value) + }, [(q(!0), X(H, null, hr(tt.value, (e) => (q(), X("div", { key: `sk-${e}`, class: "mjr-grid-skeleton-card", - style: yr(at.value) + style: xr(at.value) }, [U("div", { class: "mjr-grid-skeleton-thumb mjr-grid-skeleton-shimmer", - style: yr(ot.value) - }, null, 4), U("div", { style: yr(lt.value) }, [U("div", { + style: xr(ot.value) + }, null, 4), U("div", { style: xr(lt.value) }, [U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--title mjr-grid-skeleton-shimmer", - style: yr(st.value) + style: xr(st.value) }, null, 4), U("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--meta mjr-grid-skeleton-shimmer", - style: yr(ct.value) - }, null, 4)], 4)], 4))), 128))], 4), U("div", zu, J(Z(S).loadingMessage || "Loading assets..."), 1)])])) : G("", !0), + style: xr(ct.value) + }, null, 4)], 4)], 4))), 128))], 4), U("div", Vu, J(Z(S).loadingMessage || "Loading assets..."), 1)])])) : G("", !0), Z(S).statusMessage && !Z(S).assets.length && !Z(S).loading ? (q(), X("div", { key: 1, class: "mjr-grid-message", - style: yr({ + style: xr({ position: "absolute", inset: "0", zIndex: 3, @@ -8683,35 +8683,35 @@ var Lu = { }, J(Z(S).statusMessage), 5)) : G("", !0), t.virtualize ? (q(), X("div", { key: 2, - style: yr({ + style: xr({ height: `${Z(Qe)}px`, position: "relative", width: "100%", gridColumn: "1 / -1" }) - }, [(q(!0), X(H, null, pr(Z(Ze), (e) => (q(), X("div", { + }, [(q(!0), X(H, null, hr(Z(Xe), (e) => (q(), X("div", { key: e.key, ref_for: !0, ref: Kt, "data-index": e.index, - style: yr(Xt(e.index)) + style: xr(Xt(e.index)) }, [e.kind === "header" ? (q(), X("button", { key: 0, type: "button", - class: wr(["mjr-grid-group-separator", De(e)]), + class: Er(["mjr-grid-group-separator", De(e)]), "aria-expanded": Te(e.groupKey) ? "false" : "true", title: `${Te(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => Ee(e.groupKey) - }, [U("span", Hu, [U("i", { class: wr(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Uu, J(e.title), 1)], 10, Vu)) : e.items.length ? (q(!0), X(H, { key: 1 }, pr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), nr(uc, { + }, [U("span", Wu, [U("i", { class: Er(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Gu, J(e.title), 1)], 10, Uu)) : e.items.length ? (q(!0), X(H, { key: 1 }, hr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ir(fc, { key: 0, ref_for: !0, ref: St(e), asset: e, selected: se(e), - style: yr(Jt()), - onMousedown: fr((t) => Et(t, e), ["left"]), + style: xr(Jt()), + onMousedown: mr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: fr((t) => Mt(e), ["stop"]), + onDblclick: mr((t) => Mt(e), ["stop"]), onDropAsset: Nt }, null, 8, [ "asset", @@ -8724,14 +8724,14 @@ var Lu = { key: 1, ref_for: !0, ref: St(e), - class: wr(["mjr-asset-card mjr-card", { + class: Er(["mjr-asset-card mjr-card", { "is-selected": se(e), "mjr-live-placeholder": ge(e) }]), role: "button", tabindex: "0", draggable: "true", - style: yr(Jt()), + style: xr(Jt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": ie(e), @@ -8744,32 +8744,32 @@ var Lu = { "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": se(e) ? "true" : "false", - onMousedown: fr((t) => Et(t, e), ["left"]), + onMousedown: mr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: fr((t) => Mt(e), ["stop"]) - }, [Y(oc, { + onDblclick: mr((t) => Mt(e), ["stop"]) + }, [Y(cc, { asset: e, onWorkflowAction: (t) => At(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, Wu))], 64))), 128)) : G("", !0)], 12, Bu))), 128))], 4)) : (q(), X("div", Gu, [(q(!0), X(H, null, pr(We.value, (e) => (q(), X("div", { + }, null, 8, ["asset", "onWorkflowAction"])], 46, Ku))], 64))), 128)) : G("", !0)], 12, Hu))), 128))], 4)) : (q(), X("div", qu, [(q(!0), X(H, null, hr(We.value, (e) => (q(), X("div", { key: `${e.kind || "assets"}-${e.groupKey || ""}-${e.index ?? ""}`, - style: yr(Zt()) + style: xr(Zt()) }, [e.kind === "header" ? (q(), X("button", { key: 0, type: "button", - class: wr(["mjr-grid-group-separator", De(e)]), + class: Er(["mjr-grid-group-separator", De(e)]), "aria-expanded": Te(e.groupKey) ? "false" : "true", title: `${Te(e.groupKey) ? "Open" : "Close"} group`, onClick: (t) => Ee(e.groupKey) - }, [U("span", qu, [U("i", { class: wr(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Ju, J(e.title), 1)], 10, Ku)) : (q(!0), X(H, { key: 1 }, pr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), nr(uc, { + }, [U("span", Yu, [U("i", { class: Er(["pi", Te(e.groupKey) ? "pi-chevron-down" : "pi-chevron-up"]) }, null, 2)]), U("span", Xu, J(e.title), 1)], 10, Ju)) : (q(!0), X(H, { key: 1 }, hr(e.items, (e) => (q(), X(H, { key: String(e.id) }, [L(e) ? (q(), ir(fc, { key: 0, ref_for: !0, ref: St(e), asset: e, selected: se(e), - style: yr(Jt()), - onMousedown: fr((t) => Et(t, e), ["left"]), + style: xr(Jt()), + onMousedown: mr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: fr((t) => Mt(e), ["stop"]), + onDblclick: mr((t) => Mt(e), ["stop"]), onDropAsset: Nt }, null, 8, [ "asset", @@ -8782,14 +8782,14 @@ var Lu = { key: 1, ref_for: !0, ref: St(e), - class: wr(["mjr-asset-card mjr-card", { + class: Er(["mjr-asset-card mjr-card", { "is-selected": se(e), "mjr-live-placeholder": ge(e) }]), role: "button", tabindex: "0", draggable: "true", - style: yr(Jt()), + style: xr(Jt()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": ie(e), @@ -8802,13 +8802,13 @@ var Lu = { "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": se(e) ? "true" : "false", - onMousedown: fr((t) => Et(t, e), ["left"]), + onMousedown: mr((t) => Et(t, e), ["left"]), onClick: (t) => Tt(t, e), - onDblclick: fr((t) => Mt(e), ["stop"]) - }, [Y(oc, { + onDblclick: mr((t) => Mt(e), ["stop"]) + }, [Y(cc, { asset: e, onWorkflowAction: (t) => At(t, e) - }, null, 8, ["asset", "onWorkflowAction"])], 46, Yu))], 64))), 128))], 4))), 128))])), + }, null, 8, ["asset", "onWorkflowAction"])], 46, Zu))], 64))), 128))], 4))), 128))])), U("div", { ref_key: "infiniteSentinelRef", ref: ne, @@ -8822,14 +8822,14 @@ var Lu = { }, null, 512) ], 512)); } -}), Qu = 240, $u = 120, ed = 80, td = null, nd = null; -function rd() { - return td ||= import("./chunks/viewerOpenRequest-CCFPrnGk.js").then((e) => e.n), td; +}), ed = 240, td = 120, nd = 80, rd = null, id = null; +function ad() { + return rd ||= import("./chunks/viewerOpenRequest-Crw9UWH5.js").then((e) => e.n), rd; } -function id() { - return nd ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), nd; +function od() { + return id ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), id; } -function ad(e) { +function sd(e) { let t = document.createElement("button"); t.type = "button", t.className = "mjr-asset-card mjr-card mjr-feed-group-member-card", t.style.cssText = "display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-end;min-height:110px;padding:8px;border:1px solid var(--mjr-border,#444);border-radius:8px;background:var(--mjr-surface,#202020);color:inherit;text-align:left;overflow:hidden;"; try { @@ -8840,7 +8840,7 @@ function ad(e) { let n = document.createElement("div"); return n.className = "mjr-feed-group-member-name", n.style.cssText = "font-size:11px;font-weight:600;line-height:1.3;word-break:break-word;", n.textContent = String(e?.filename || "Asset"), t.appendChild(n), t; } -function od(e) { +function cd(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -8855,11 +8855,11 @@ function od(e) { return console.debug?.(e), []; } } -function sd(e, t, n = "") { +function ld(e, t, n = "") { let r = Array.isArray(t) ? t.map(String).filter(Boolean) : []; - return Qn(e, r, { activeId: n || r[0] || "" }, od); + return er(e, r, { activeId: n || r[0] || "" }, cd); } -function cd(e) { +function ud(e) { let t = e?.grid; if (!t) return; let n = (e) => { @@ -8875,16 +8875,16 @@ function cd(e) { } catch (e) { console.debug?.(e); } - let a = od(t), o = a.indexOf(n), s = Jn(t); + let a = cd(t), o = a.indexOf(n), s = Xn(t); if (e.shiftKey && o >= 0) { let n = Number.isFinite(Number(t._mjrLastSelectedIndex)) ? Number(t._mjrLastSelectedIndex) : o, r = Math.min(n, o), s = Math.max(n, o), c = a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean); - sd(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); + ld(t, c, i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); } else if (e.ctrlKey || e.metaKey) { s.has(i) ? s.delete(i) : s.add(i); let n = Array.from(s); - sd(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); + ld(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); } else { - sd(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); + ld(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); try { n.focus?.({ preventScroll: !0 }); } catch (e) { @@ -8901,23 +8901,23 @@ function cd(e) { } }; } -var ld = { +var dd = { hosts: /* @__PURE__ */ new Set(), pendingAssets: /* @__PURE__ */ new Map() }; -function ud(e) { - if (!B.EXECUTION_GROUPING_ENABLED) return Td(e); +function fd(e) { + if (!B.EXECUTION_GROUPING_ENABLED) return Dd(e); let t = String(e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.job_id || "").trim(); - return n ? `job:${n}` : Td(e); + return n ? `job:${n}` : Dd(e); } -function dd(e) { +function pd(e) { let t = /* @__PURE__ */ new Map(); for (let n of Array.isArray(e) ? e : []) { - let e = Dd(n); + let e = kd(n); if (!e) continue; - let r = ud(e), i = t.get(r); + let r = fd(e), i = t.get(r); i || (i = { key: r, members: [] @@ -8942,16 +8942,16 @@ function dd(e) { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }), n; } -function fd(e) { +function md(e) { return Array.from(e?.assetsByKey?.values?.() || []); } -function pd(e) { +function hd(e) { return String(e ?? "").trim().toLowerCase(); } -function md(e) { +function gd(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function hd(e) { +function _d(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -8960,19 +8960,19 @@ function hd(e) { } return e; } -function gd(e) { +function vd(e) { if (!e || typeof e != "object") return ""; - let t = pd(e?.type || e?.source || "output"), n = pd(e?.root_id || e?.custom_root_id || ""), r = pd(e?.subfolder || ""), i = pd(e?.filename || ""); + let t = hd(e?.type || e?.source || "output"), n = hd(e?.root_id || e?.custom_root_id || ""), r = hd(e?.subfolder || ""), i = hd(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = pd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = hd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function _d(e, t) { - let n = Dd(t); +function yd(e, t) { + let n = kd(t); if (!e || typeof e.set != "function" || !n) return null; - let r = Td(n), i = gd(n), a = ""; + let r = Dd(n), i = vd(n), a = ""; if (i) { - for (let [t, n] of e.entries()) if (gd(n) === i) { + for (let [t, n] of e.entries()) if (vd(n) === i) { a = t; break; } @@ -8981,17 +8981,17 @@ function _d(e, t) { ...o, ...n } : n; - return md(n) || hd(s), a && a !== r && e.delete(a), e.set(r, s), s; + return gd(n) || _d(s), a && a !== r && e.delete(a), e.set(r, s), s; } -function vd(e, t) { - return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), _d(e.assetsByKey, t)) : null; +function bd(e, t) { + return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), yd(e.assetsByKey, t)) : null; } -function yd(e) { +function xd(e) { e?.grid && e.loaded && (e._renderTimer ||= setTimeout(() => { - e._renderTimer = null, wd(e); - }, ed)); + e._renderTimer = null, Ed(e); + }, nd)); } -function bd(e, t, n = 0) { +function Sd(e, t, n = 0) { let r = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets.filter(Boolean) : [t].filter(Boolean); if (!r.length) return; let i = Math.max(0, Math.min(n, r.length - 1)), a = r[i] || null, o = String(a?.id || "").trim(); @@ -9001,14 +9001,14 @@ function bd(e, t, n = 0) { } catch (e) { console.debug?.(e); } - sd(e.grid, [o], o); + ld(e.grid, [o], o); } - rd().then((e) => e.requestViewerOpen({ + ad().then((e) => e.requestViewerOpen({ assets: r, index: i })).catch((e) => console.debug?.(e)); } -function xd(e, t) { +function Cd(e, t) { let n = document.createElement("div"); n.className = "mjr-popover mjr-feed-group-popover", n.style.cssText = "display:none; width:min(440px, 92vw); padding:10px;"; let r = document.createElement("div"); @@ -9017,14 +9017,14 @@ function xd(e, t) { i.className = "mjr-feed-group-popover-grid", i.style.cssText = "display:grid; grid-template-columns:repeat(auto-fill, minmax(110px, 1fr)); gap:8px; max-height:360px; overflow-y:auto; overscroll-behavior:contain;"; let a = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets : []; for (let r = 0; r < a.length; r += 1) { - let o = a[r], s = ad(o); + let o = a[r], s = sd(o); s.classList.add("mjr-feed-group-member-card"), r === 0 && s.classList.add("mjr-feed-group-member-card--cover"), s.addEventListener("click", (i) => { - i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), bd(e, t, r); + i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Sd(e, t, r); }), i.appendChild(s); } return n.appendChild(i), e.root.appendChild(n), n; } -function Sd(e, t, n) { +function wd(e, t, n) { if (!t || !n) return; let r = Number(n?._mjrFeedGroupCount || 0) || 0; if (r <= 1 || (t.dataset.mjrFeedGrouped = "true", t.dataset.mjrFeedGroupCount = String(r), t.dataset.mjrStacked = "true", t.dataset.mjrStackCount = String(r), t.querySelector(".mjr-feed-group-button"))) return; @@ -9033,20 +9033,20 @@ function Sd(e, t, n) { let a = document.createElement("span"); a.className = "mjr-feed-group-button-icon pi pi-clone", i.appendChild(a); let o = document.createElement("span"); - o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", Wa(i); - let s = xd(e, n); + o.className = "mjr-feed-group-button-count", o.textContent = String(r), i.appendChild(o), i.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", Ka(i); + let s = Cd(e, n); i.addEventListener("click", (t) => { t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(s, i); }), t.appendChild(i); } -function Cd(e, t) { +function Td(e, t) { let n = new Map((Array.isArray(t) ? t : []).map((e) => [String(e?.id || "").trim(), e]).filter(([e]) => !!e)); - for (let t of od(e?.grid)) { + for (let t of cd(e?.grid)) { let r = String(t?.dataset?.mjrAssetId || "").trim(), i = n.get(r); - i && Sd(e, t, i); + i && wd(e, t, i); } } -async function wd(e) { +async function Ed(e) { if (!e?.grid) return; try { e.popoverManager?.closeAll?.(); @@ -9059,19 +9059,19 @@ async function wd(e) { } catch (e) { console.debug?.(e); } - let t = dd(fd(e)), n = await gi(e.grid, t, { + let t = pd(md(e)), n = await vi(e.grid, t, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Cd(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + Td(e, t), Number(n?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } -function Td(e) { +function Dd(e) { let t = String(e?.id || "").trim(); if (t) return `id:${t}`; let n = String(e?.filename || "").trim(), r = String(e?.subfolder || "").trim(); return `file:${String(e?.source || e?.type || "").trim()}:${r}:${n}`; } -function Ed(e) { +function Od(e) { let t = String(e || "").split(".").pop()?.toUpperCase() ?? "", n = /* @__PURE__ */ new Set([ "MP4", "WEBM", @@ -9098,41 +9098,41 @@ function Ed(e) { ]); return n.has(t) ? "video" : r.has(t) ? "audio" : i.has(t) ? "model3d" : "image"; } -function Dd(e) { +function kd(e) { if (!e || typeof e != "object") return null; let t = { ...e }; - return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= Ed(t.ext || t.filename || ""), t; + return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= Od(t.ext || t.filename || ""), t; } -function Od(e) { - let t = Dd(e); +function Ad(e) { + let t = kd(e); if (!t) return null; - let n = Td(t); + let n = Dd(t); if (!n) return null; - let r = gd(t), i = null; - if (r) for (let [e, t] of ld.pendingAssets.entries()) e !== n && gd(t) === r && (i = t, ld.pendingAssets.delete(e)); - let a = ld.pendingAssets.get(n) || i || null, o = a ? { + let r = vd(t), i = null; + if (r) for (let [e, t] of dd.pendingAssets.entries()) e !== n && vd(t) === r && (i = t, dd.pendingAssets.delete(e)); + let a = dd.pendingAssets.get(n) || i || null, o = a ? { ...a, ...t } : t; - if (md(t) || hd(o), ld.pendingAssets.set(n, o), ld.pendingAssets.size > 64) { - let e = ld.pendingAssets.keys().next().value; - e && ld.pendingAssets.delete(e); + if (gd(t) || _d(o), dd.pendingAssets.set(n, o), dd.pendingAssets.size > 64) { + let e = dd.pendingAssets.keys().next().value; + e && dd.pendingAssets.delete(e); } return o; } -function kd() { - return Array.from(ld.pendingAssets.values()); +function jd() { + return Array.from(dd.pendingAssets.values()); } -async function Ad(e) { +async function Md(e) { if (e?.grid) { e.empty.style.display = "none", e.empty.textContent = R("bottomFeed.loading", "Loading recent assets..."); try { e.assetsByKey = /* @__PURE__ */ new Map(); let t = [], n = 0; - for (; n < Qu;) { - let r = et({ + for (; n < ed;) { + let r = Ke({ q: "*", - limit: Math.min($u, Qu - n), + limit: Math.min(td, ed - n), offset: n, scope: "output", sort: "mtime_desc", @@ -9142,19 +9142,19 @@ async function Ad(e) { let a = Array.isArray(i?.data?.assets) ? i.data.assets : []; if (!a.length) break; for (let n of a) { - let r = vd(e, n); + let r = bd(e, n); r && t.push(r); } - if (a.length < $u) break; + if (a.length < td) break; n += a.length; } - for (let t of kd()) vd(e, t); - ld.pendingAssets.clear(); - let r = dd(fd(e)), i = await gi(e.grid, r, { + for (let t of jd()) bd(e, t); + dd.pendingAssets.clear(); + let r = pd(md(e)), i = await vi(e.grid, r, { title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Cd(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + Td(e, r), Number(i?.count || 0) <= 0 ? (e.empty.textContent = R("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; } catch (t) { console.debug?.(t), e.empty.textContent = R("bottomFeed.loadFailed", "Failed to load generated assets."), e.empty.style.display = ""; } finally { @@ -9162,21 +9162,21 @@ async function Ad(e) { } } } -async function jd() { - for (let e of Array.from(ld.hosts)) try { - await Ad(e); +async function Nd() { + for (let e of Array.from(dd.hosts)) try { + await Md(e); } catch (e) { console.debug?.(e); } } -function Md() { - jd(); +function Pd() { + Nd(); } -function Nd(e) { +function Fd(e) { let t = document.createElement("div"); t.textContent = R("bottomFeed.loading", "Loading recent assets..."), t.style.cssText = "font-size:11px; opacity:0.65; padding:4px 2px 8px 2px;", e.root.appendChild(t), e.empty = t; } -function Pd(e) { +function Id(e) { if (!e) return; let t = [ e, @@ -9194,14 +9194,14 @@ function Pd(e) { console.debug?.(e); } } -function Fd(e) { +function Ld(e) { if (!e) return; let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; t("mjr-feed-show-info", B.FEED_SHOW_INFO), t("mjr-feed-show-filename", B.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", B.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", B.FEED_SHOW_DATE), t("mjr-feed-show-gentime", B.FEED_SHOW_GENTIME), t("mjr-show-hover-info", B.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", B.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", B.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", B.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", B.FEED_SHOW_BADGES_TAGS); } -function Id(e, t = null) { +function Rd(e, t = null) { let n = t || document.createElement("div"); n.classList.add("mjr-am-grid-scroll"), n.style.position = "relative", n.style.flex = "1 1 auto", n.style.minHeight = "0", n.style.height = "100%", n.style.overflow = "auto", n.style.scrollbarGutter = "stable", n.style.overscrollBehavior = "contain", n.style.webkitOverflowScrolling = "touch"; let r = () => { @@ -9219,14 +9219,14 @@ function Id(e, t = null) { } }, a = document.createElement("div"); n.appendChild(a), e.root.appendChild(n); - let { app: o } = Bn(Zu, { + let { app: o } = Hn($u, { scrollElement: n, virtualize: !1, applyDefaultSettingsClasses: !1, emitWindowSelectionEvents: !0, onCardRendered: (t, n) => { try { - Sd(e, t, n); + wd(e, t, n); } catch (e) { console.debug?.(e); } @@ -9245,7 +9245,7 @@ function Id(e, t = null) { else if (t === "c") { e.preventDefault?.(), e.stopPropagation?.(), r(); try { - id().then(async ({ floatingViewerManager: e }) => { + od().then(async ({ floatingViewerManager: e }) => { await e.open(), e.toggleCompareAB(); }).catch((e) => console.debug?.(e)); } catch (e) { @@ -9266,19 +9266,19 @@ function Id(e, t = null) { } }; } -function Ld(e) { +function zd(e) { let t = e?.grid; if (!t) return []; - let n = Jn(t); - return n.size ? fd(e).filter((e) => n.has(String(e?.id || ""))) : []; + let n = Xn(t); + return n.size ? md(e).filter((e) => n.has(String(e?.id || ""))) : []; } -function Rd(e) { +function Bd(e) { let t = e?.grid; if (!t) return null; let n = String(t.dataset?.mjrSelectedAssetId || "").trim(); - return n ? fd(e).find((e) => String(e?.id || "") === n) || null : Ld(e)[0] || null; + return n ? md(e).find((e) => String(e?.id || "") === n) || null : zd(e)[0] || null; } -function zd(e) { +function Vd(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -9287,39 +9287,39 @@ function zd(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Bd(e) { +function Hd(e) { let t = e?.grid; if (!t) return; let n = () => { try { - yd(e); + xd(e); } catch (e) { console.debug?.(e); } }; - e.keyboard = Fi({ + e.keyboard = Li({ gridContainer: t, - getState: () => ({ assets: dd(fd(e)) }), - getSelectedAssets: () => Ld(e), - getActiveAsset: () => Rd(e), + getState: () => ({ assets: pd(md(e)) }), + getSelectedAssets: () => zd(e), + getActiveAsset: () => Bd(e), onOpenTagsEditor: (e) => { - let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${zd(e?.id || "")}"]`) || null, i = null; + let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Vd(e?.id || "")}"]`) || null, i = null; try { i = r?.getBoundingClientRect?.() || t.getBoundingClientRect(); } catch (e) { console.debug?.(e); } - Fa(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), e, n); + La(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), e, n); }, onAssetChanged: n - }), e.keyboard.bind(), e.ratingHotkeys = Ua({ + }), e.keyboard.bind(), e.ratingHotkeys = Ga({ gridContainer: t, createRatingBadge: ht }), e.ratingHotkeys.bind(); } -var Vd = 60, Hd = 600, Ud = 10; -function Wd(e, t) { - let n = Math.max(Vd, Math.min(Hd, Math.round(Number(t) / Ud) * Ud)); +var Ud = 60, Wd = 600, Gd = 10; +function Kd(e, t) { + let n = Math.max(Ud, Math.min(Wd, Math.round(Number(t) / Gd) * Gd)); if (e?.grid) try { e.grid.style.setProperty("--mjr-grid-min-size", `${n}px`); } catch (e) { @@ -9327,8 +9327,8 @@ function Wd(e, t) { } B.FEED_GRID_MIN_SIZE = n; try { - let e = Jt(); - e.feed.minSize = n, Tn(e), fn(e); + let e = Vn(); + e.feed.minSize = n, Fn(e), Tn(e); } catch (e) { console.debug?.(e); } @@ -9345,27 +9345,27 @@ function Wd(e, t) { } return n; } -function Gd(e) { - let t = Math.max(Vd, Number(B.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); +function qd(e) { + let t = Math.max(Ud, Number(B.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); n.className = "mjr-feed-toolbar", n.style.cssText = "display:flex; align-items:center; gap:5px; padding:0 2px 5px 2px; flex-shrink:0; user-select:none;"; let r = document.createElement("span"); r.textContent = R("bottomFeed.cardSize", "Cards:"), r.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; flex-shrink:0;", n.appendChild(r); let i = document.createElement("button"); i.type = "button", i.className = "mjr-feed-size-btn", i.textContent = "-", i.title = R("bottomFeed.cardSizeDecrease", "Decrease card size"), i.style.cssText = "width:20px; height:20px; padding:0; border:1px solid var(--mjr-border,#555); border-radius:4px; background:var(--mjr-surface,#2a2a2a); color:inherit; cursor:pointer; font-size:14px; line-height:1; flex-shrink:0; display:flex; align-items:center; justify-content:center;", n.appendChild(i); let a = document.createElement("input"); - a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(Vd), a.max = String(Hd), a.step = String(Ud), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); + a.type = "range", a.className = "mjr-feed-size-slider", a.min = String(Ud), a.max = String(Wd), a.step = String(Gd), a.value = String(t), a.title = R("bottomFeed.cardSizeSlider", "Card size"), a.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(a); let o = document.createElement("button"); o.type = "button", o.className = "mjr-feed-size-btn", o.textContent = "+", o.title = R("bottomFeed.cardSizeIncrease", "Increase card size"), o.style.cssText = i.style.cssText, n.appendChild(o); let s = document.createElement("span"); s.className = "mjr-feed-size-display", s.textContent = `${t}px`, s.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; min-width:36px; text-align:right; flex-shrink:0; font-variant-numeric:tabular-nums;", n.appendChild(s), i.addEventListener("click", () => { - Wd(e, Number(a.value) - Ud); + Kd(e, Number(a.value) - Gd); }), o.addEventListener("click", () => { - Wd(e, Number(a.value) + Ud); + Kd(e, Number(a.value) + Gd); }), a.addEventListener("input", () => { - Wd(e, Number(a.value)); + Kd(e, Number(a.value)); }), e.root.appendChild(n), e._sizeToolbar = n; } -function Kd(e, t = {}) { +function Jd(e, t = {}) { let n = document.createElement("div"); n.className = "mjr-assets-manager mjr-bottom-feed", n.style.cssText = "padding:6px; height:100%; min-height:0; box-sizing:border-box; display:flex; flex-direction:column; overflow:hidden;", e.replaceChildren(n); let r = { @@ -9377,13 +9377,13 @@ function Kd(e, t = {}) { assetsByKey: /* @__PURE__ */ new Map(), popoverManager: null }; - Gd(r), Nd(r), Id(r, t.gridWrapper ?? null), cd(r), r.popoverManager = Di(n), r._disposeContextMenu = Ia({ + qd(r), Fd(r), Rd(r, t.gridWrapper ?? null), ud(r), r.popoverManager = ki(n), r._disposeContextMenu = Ra({ gridContainer: r.grid, getState: () => ({ scope: "output" }) - }), Bd(r), Fd(r.grid); + }), Hd(r), Ld(r.grid); let i = () => { try { - Fd(r.grid); + Ld(r.grid); } catch (e) { console.debug?.(e); } @@ -9396,26 +9396,26 @@ function Kd(e, t = {}) { } }, r; } -function qd(e) { - let t = Od(e); - if (t) for (let e of Array.from(ld.hosts)) try { - if (!e?.grid || (vd(e, t), !e.loaded)) continue; - e.empty.style.display = "none", yd(e); +function Yd(e) { + let t = Ad(e); + if (t) for (let e of Array.from(dd.hosts)) try { + if (!e?.grid || (bd(e, t), !e.loaded)) continue; + e.empty.style.display = "none", xd(e); } catch (e) { console.debug?.(e); } } -function Jd(e, t = {}) { - Pd(e); - let n = Kd(e, t); +function Xd(e, t = {}) { + Id(e); + let n = Jd(e, t); try { e._mjrGeneratedFeedHost = n; } catch (e) { console.debug?.(e); } - return ld.hosts.add(n), Ad(n), n; + return dd.hosts.add(n), Md(n), n; } -function Yd(e) { +function Zd(e) { let t = e?._mjrGeneratedFeedHost || e || null; if (!t) return; let n = t.container || null; @@ -9429,7 +9429,7 @@ function Yd(e) { } console.debug?.(e); } - ld.hosts.delete(t); + dd.hosts.delete(t); try { t._disposeSelection?.(); } catch (e) { @@ -9476,7 +9476,7 @@ function Yd(e) { console.debug?.(e); } try { - vi(t.grid); + bi(t.grid); } catch (e) { console.debug?.(e); } @@ -9487,24 +9487,24 @@ function Yd(e) { } } // ui/features/stacks/executionAssetBuffer.ts -function Xd(e) { +function Qd(e) { return String(e || "").trim(); } -function Zd(e) { +function $d(e) { let t = String(e?.filename || "").trim(), n = String(e?.subfolder || "").trim(); return `${String(e?.type || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${n}|${t}`; } -function Qd() { +function ef() { let e = /* @__PURE__ */ new Map(); function t(t, n) { - let r = Xd(t); + let r = Qd(t); if (!r) return []; let i = Array.isArray(n) ? n : []; if (!i.length) return []; let a = e.get(r); a || (a = /* @__PURE__ */ new Map(), e.set(r, a)); for (let e of i) { - let t = Zd(e); + let t = $d(e); t && a.set(t, { ...a.get(t) || {}, ...e || {} @@ -9513,13 +9513,13 @@ function Qd() { return Array.from(a.values()); } function n(t) { - let n = Xd(t); + let n = Qd(t); if (!n) return []; let r = e.get(n); return e.delete(n), Array.from(r?.values?.() || []); } function r(t) { - let n = Xd(t); + let n = Qd(t); n && e.delete(n); } return { @@ -9530,7 +9530,7 @@ function Qd() { }; } // ui/features/stacks/finalizeQueue.ts -function $d({ defaultDelayMs: e = 900, postJob: t } = {}) { +function tf({ defaultDelayMs: e = 900, postJob: t } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), i = !1; async function a() { if (!i) { @@ -9567,27 +9567,27 @@ function $d({ defaultDelayMs: e = 900, postJob: t } = {}) { }; } // ui/features/stacks/liveAssetGate.ts -function ef(e) { +function nf(e) { return String(e || "").trim(); } -function tf(e) { +function rf(e) { let t = String(e?.filename || "").trim(), n = String(e?.filepath || "").trim(), r = String(e?.subfolder || "").trim(); return `${String(e?.type || e?.source || "output").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim()}|${r}|${t || n}`; } -function nf(e, t) { +function af(e, t) { return !t || String(e?.job_id || "").trim() === t ? e : { ...e || {}, job_id: t }; } -function rf() { +function of() { let e = /* @__PURE__ */ new Map(); function t(t, { files: n = [], expectedCount: r = null } = {}) { - let i = ef(t); + let i = nf(t); if (!i) return; let a = /* @__PURE__ */ new Set(); for (let e of Array.isArray(n) ? n : []) { - let t = tf(e); + let t = rf(e); t && a.add(t); } e.set(i, { @@ -9597,13 +9597,13 @@ function rf() { }); } function n(t) { - let n = ef(t); + let n = nf(t); n && e.delete(n); } function r(t) { - let n = ef(t?.job_id); + let n = nf(t?.job_id); if (n) return n; - let r = tf(t); + let r = rf(t); if (!r) return ""; let i = "", a = Infinity; for (let [t, n] of e.entries()) n?.fileKeys?.has?.(r) && (n.markedAt ?? Infinity) < a && (a = n.markedAt ?? Infinity, i = t); @@ -9616,7 +9616,7 @@ function rf() { jobId: "", defer: !1 }; - let i = nf(t, n), a = e.get(n); + let i = af(t, n), a = e.get(n); if (!a) return { detail: i, jobId: n, @@ -9638,20 +9638,20 @@ function rf() { }; } // ui/features/stacks/executionRuntimeController.ts -var af = 2e3, of = 2e3, sf = /* @__PURE__ */ new Set([ +var sf = 2e3, cf = 2e3, lf = /* @__PURE__ */ new Set([ "DB_MAINTENANCE", "TIMEOUT", "NETWORK_ERROR", "SERVICE_UNAVAILABLE" -]), cf = 8, lf = 1200, uf = 15e3, df = 6e5, ff = 500, pf = 6, mf = 3e4, hf = 500; -function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { +]), uf = 8, df = 1200, ff = 15e3, pf = 6e5, mf = 500, hf = 6, gf = 3e4, _f = 500; +function vf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { let c = pe({ - ttlMs: af, - maxSize: of + ttlMs: sf, + maxSize: cf }), l = pe({ - ttlMs: df, - maxSize: ff - }), u = Math.max(0, Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = Qd(), p = rf(), m = "", h = 0, g = null; + ttlMs: pf, + maxSize: mf + }), u = Math.max(0, Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = ef(), p = of(), m = "", h = 0, g = null; function _() { try { return typeof window > "u" ? !1 : window.__MJR_DEBUG_JOB_TRACKING__ === !0 || String(window.localStorage?.getItem("mjr.debug.jobTracking") || "").trim() === "1"; @@ -9723,7 +9723,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu console.debug?.(e); } } - let S = $d({ + let S = tf({ defaultDelayMs: 900, async postJob(r) { v("auto-stack:start", { job_id: r }); @@ -9761,7 +9761,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function T(e) { let t = Math.max(1, Number(e) || 1), n = Math.min(6, t - 1); - return Math.min(uf, lf * 2 ** n); + return Math.min(ff, df * 2 ** n); } function E() { g &&= (clearTimeout(g), null); @@ -9779,7 +9779,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } function O(e) { let t = String(e?.code || "").trim().toUpperCase(); - return sf.has(t); + return lf.has(t); } function k(r, i = 1, a = {}) { let o = Array.isArray(r) ? r : []; @@ -9794,7 +9794,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu files: o.map((e) => String(e?.filename || e?.filepath || "")) }), e(t.INDEX_FILES, s).then((e) => { if (!e?.ok) { - if (O(e) && i < cf) { + if (O(e) && i < uf) { let e = T(i); setTimeout(() => k(o, i + 1, a), e); } else try { @@ -9829,7 +9829,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu let a = d.get(i); a?.timer && clearTimeout(a.timer); let o = a?.firstAttemptAt ?? Date.now(); - if (Date.now() - o >= mf) { + if (Date.now() - o >= gf) { k(r, 1, t); return; } @@ -9874,7 +9874,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu file_count: Array.isArray(e) ? e.length : 0, files: Array.isArray(e) ? e.map((e) => String(e?.filename || e?.filepath || "")) : [] }), !r) { - if (n < pf) { + if (n < hf) { M(e, t, n); return; } @@ -10008,7 +10008,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu reason: String(e?.type || "") }), E(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), P()), String(e?.type || "") === "execution_success" && D(() => { r && N(r), F(r); - }, I(r) ? Math.min(u, hf) : u); + }, I(r) ? Math.min(u, _f) : u); } function se(e) { if (!y()) return; @@ -10033,7 +10033,7 @@ function gf({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu }; } // ui/utils/extractOutputFiles.ts -function _f(e) { +function yf(e) { let t = [], n = /* @__PURE__ */ new Set(), r = 2e3, i = /\.(png|jpe?g|webp|gif|bmp|tiff?|avif|heic|heif|apng|hdr|svg|mp4|webm|mov|mkv|avi|m4v|mp3|wav|flac|ogg|glb|gltf|obj|fbx|ply|stl)$/i, a = typeof WeakSet < "u" ? /* @__PURE__ */ new WeakSet() : null, o = ({ type: e, subfolder: t, filename: n, path: r }) => r ? `path|${String(r).trim().toLowerCase()}` : `${e || ""}|${t || ""}|${n || ""}`.toLowerCase(), s = (e) => { if (!e) return; let r = e.path || e.filepath || e.fullpath || e.fullPath || e.full_path, i = e.filename; @@ -10114,15 +10114,15 @@ function _f(e) { return u(e, 0), t; } // ui/features/runtime/sidebarAssetBadge.ts -var vf = "mjr-sidebar-asset-badge", yf = "mjr-sidebar-tab-has-badge", bf = "mjr-sidebar-asset-badge-style", xf = 99, Sf = 0, Cf = "majoor-assets", wf = !1, Tf = /* @__PURE__ */ new Set(); -function Ef() { - if (typeof document > "u" || document.getElementById(bf)) return; +var bf = "mjr-sidebar-asset-badge", xf = "mjr-sidebar-tab-has-badge", Sf = "mjr-sidebar-asset-badge-style", Cf = 99, wf = 0, Tf = "majoor-assets", Ef = !1, Df = /* @__PURE__ */ new Set(); +function Of() { + if (typeof document > "u" || document.getElementById(Sf)) return; let e = document.createElement("style"); - e.id = bf, e.textContent = ` - .${yf} { + e.id = Sf, e.textContent = ` + .${xf} { position: relative !important; } - .${vf} { + .${bf} { position: absolute; top: 3px; right: 3px; @@ -10146,7 +10146,7 @@ function Ef() { } `, document.head?.appendChild(e); } -function Df(e) { +function kf(e) { let t = String(e || "").trim(); if (!t) return []; let n = (() => { @@ -10165,91 +10165,91 @@ function Df(e) { `[href="#${n}"]` ]; } -function Of(e) { +function Af(e) { let t = `${e?.textContent || ""} ${e?.title || ""} ${e?.getAttribute?.("aria-label") || ""}`; return /assets\s*manager|majoor/i.test(t); } -function kf(e) { +function jf(e) { return !e || typeof e != "object" ? !1 : typeof HTMLElement < "u" ? e instanceof HTMLElement : typeof e.querySelector == "function" && typeof e.appendChild == "function"; } -function Af() { +function Mf() { if (typeof document > "u") return null; - for (let e of Df(Cf)) { + for (let e of kf(Tf)) { let t = document.querySelector(e); - if (kf(t)) return t; + if (jf(t)) return t; } let e = Array.from(document.querySelectorAll(".pi-folder, .pi-folder-open")); for (let t of e) { let e = t.closest?.("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab"); - if (kf(e) && Of(e)) return e; + if (jf(e) && Af(e)) return e; } - return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => kf(e) && Of(e)) || null; -} -function jf() { - Ef(); - let e = Af(); - if (!e) return !1; - let t = e.querySelector(`:scope > .${vf}`); - return !Nf() || Sf <= 0 ? (t?.remove(), e.classList.remove(yf), !0) : (t || (t = document.createElement("span"), t.className = vf, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(yf), t.textContent = Sf > xf ? `${xf}+` : String(Sf), !0); -} -function Mf() { - jf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => jf()), setTimeout(() => jf(), 250), setTimeout(() => jf(), 1e3); + return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => jf(e) && Af(e)) || null; } function Nf() { + Of(); + let e = Mf(); + if (!e) return !1; + let t = e.querySelector(`:scope > .${bf}`); + return !Ff() || wf <= 0 ? (t?.remove(), e.classList.remove(xf), !0) : (t || (t = document.createElement("span"), t.className = bf, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(xf), t.textContent = wf > Cf ? `${Cf}+` : String(wf), !0); +} +function Pf() { + Nf(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => Nf()), setTimeout(() => Nf(), 250), setTimeout(() => Nf(), 1e3); +} +function Ff() { return B.SIDEBAR_ASSET_BADGE_ENABLED !== !1; } -function Pf(e = null) { +function If(e = null) { let t = String(e?.id || e?.asset_id || "").trim(); if (t) return `id:${t}`; let n = String(e?.type || e?.source || "output").trim().toLowerCase(), r = String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim().toLowerCase(), a = String(e?.filename || "").trim().toLowerCase(), o = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(), s = a || o; return s ? `file:${n}|${r}|${i}|${s}` : ""; } -function Ff(e) { +function Lf(e) { if (!e) return !0; - if (Tf.has(e)) return !1; - if (Tf.add(e), Tf.size > 1e3) { - let e = Array.from(Tf).slice(-500); - Tf.clear(); - for (let t of e) Tf.add(t); + if (Df.has(e)) return !1; + if (Df.add(e), Df.size > 1e3) { + let e = Array.from(Df).slice(-500); + Df.clear(); + for (let t of e) Df.add(t); } return !0; } -function If({ sidebarTabId: e } = {}) { +function Rf({ sidebarTabId: e } = {}) { let t = String(e || "").trim(); - t && (Cf = t), !wf && typeof window < "u" && (wf = !0, window.addEventListener?.("mjr-settings-changed", (e) => { - e?.detail?.key === "sidebar.assetBadgeEnabled" && (Nf() || (Sf = 0, Tf.clear()), Mf()); - })), Mf(); + t && (Tf = t), !Ef && typeof window < "u" && (Ef = !0, window.addEventListener?.("mjr-settings-changed", (e) => { + e?.detail?.key === "sidebar.assetBadgeEnabled" && (Ff() || (wf = 0, Df.clear()), Pf()); + })), Pf(); } -function Lf(e = null) { - Nf() && Ff(Pf(e)) && (Sf += 1, Mf()); +function zf(e = null) { + Ff() && Lf(If(e)) && (wf += 1, Pf()); } -function Rf() { - Sf = 0, Tf.clear(), Mf(); +function Bf() { + wf = 0, Df.clear(), Pf(); } // ui/features/runtime/pendingGeneratedAssets.ts -var zf = 0; -function Bf(e = 1) { +var Vf = 0; +function Hf(e = 1) { let t = Math.max(1, Number(e) || 1); - zf += t; + Vf += t; try { - window.__mjrPendingGeneratedAssetCount = zf; + window.__mjrPendingGeneratedAssetCount = Vf; } catch {} - return zf; + return Vf; } -function Vf() { - let e = zf; - zf = 0; +function Uf() { + let e = Vf; + Vf = 0; try { window.__mjrPendingGeneratedAssetCount = 0; } catch {} return e; } // ui/features/runtime/registerRealtimeListeners.ts -var Hf = 3e4, Uf = /* @__PURE__ */ new Map(), Wf = "live"; -function Gf(e) { +var Wf = 3e4, Gf = /* @__PURE__ */ new Map(), Kf = "live"; +function qf(e) { return e === !0 || e === 1 || e === "1" ? !0 : e === !1 || e === 0 || e === "0" ? !1 : null; } -function Kf(e) { +function Jf(e) { let t = [ e?.has_ai_vector, e?.hasAiVector, @@ -10259,25 +10259,25 @@ function Kf(e) { e?.vectorIndexed ]; for (let e of t) { - let t = Gf(e); + let t = qf(e); if (t !== null) return t; } return !1; } -function qf(e) { - let t = Date.now(), n = Number(Uf.get(e) || 0); - if (n > 0 && t - n < Hf) return !0; - if (Uf.set(e, t), Uf.size > 500) { - let e = t - 5 * Hf; - for (let [t, n] of Uf.entries()) Number(n) < e && Uf.delete(t); +function Yf(e) { + let t = Date.now(), n = Number(Gf.get(e) || 0); + if (n > 0 && t - n < Wf) return !0; + if (Gf.set(e, t), Gf.size > 500) { + let e = t - 5 * Wf; + for (let [t, n] of Gf.entries()) Number(n) < e && Gf.delete(t); } return !1; } -function Jf(e) { +function Xf(e) { let t = String(e?.id || "").trim(); - t && (Kf(e) || qf(t) || ge(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); + t && (Jf(e) || Yf(t) || ge(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); } -function Yf(e) { +function Zf(e) { let t = String(e?.kind || "").trim().toLowerCase(); if (t) return t; let n = String(e?.filename || e?.filepath || e?.path || e?.fullpath || "").trim(), r = n.includes(".") && n.split(".").pop()?.toLowerCase?.() || ""; @@ -10325,8 +10325,8 @@ function Yf(e) { "spz" ].includes(r) ? "model3d" : "unknown" : ""; } -function Xf(e, { jobId: t = "" } = {}) { - let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = Yf(e); +function Qf(e, { jobId: t = "" } = {}) { + let n = String(e?.filename || "").trim(), r = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim(), i = String(e?.subfolder || e?.sub_folder || e?.subFolder || "").trim(), a = String(e?.type || e?.source || "output").trim().toLowerCase(), o = String(e?.root_id || e?.custom_root_id || "").trim(), s = Zf(e); if (!s || !n && !r) return null; let c = n || r.split(/[/\\]/).filter(Boolean).pop() || ""; if (!c) return null; @@ -10337,7 +10337,7 @@ function Xf(e, { jobId: t = "" } = {}) { c ].map((e) => String(e || "").trim().toLowerCase()).join("|"), d = Date.now() / 1e3, f = String(e?.job_id || t || "").trim(); return { - id: `${Wf}:${u || l.toLowerCase()}`, + id: `${Kf}:${u || l.toLowerCase()}`, filename: c, filepath: l, path: l, @@ -10360,7 +10360,7 @@ function Xf(e, { jobId: t = "" } = {}) { _mjrLiveLabel: "In progress" }; } -function Zf(e) { +function $f(e) { let t = String(e || ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -10369,11 +10369,11 @@ function Zf(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Qf(e, t) { +function ep(e, t) { let n = String(e || "").trim().toLowerCase(); return n === "delete_db" ? t("btn.deleteDb", "Delete DB") : n === "reset_index" ? t("btn.resetIndex", "Reset index") : n === "restore_db" ? t("btn.dbRestore", "Restore DB") : t("btn.maintenance", "Maintenance"); } -function $f(e, t) { +function tp(e, t) { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = { delete_db: [ "started", @@ -10407,7 +10407,7 @@ function $f(e, t) { label: r.replace(/[_-]+/g, " ") }; } -async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { +async function np({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStreamModule: i, ensureExecutionRuntime: a, emitRuntimeStatus: o, getActiveGridContainer: s, pushGeneratedAsset: c, upsertAsset: l, upsertAssetNow: u, removeAssetsFromGrid: d, getEnrichmentState: f, setEnrichmentState: p, comfyToast: m, t: h, reportError: g, registerCleanableListener: _, syncExecutionBackendState: v }) { e._mjrExecutedHandler = (e) => { try { n.handleExecutedEvent(e, { appRef: r }); @@ -10471,7 +10471,7 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre function b(e, t, { immediate: n = !1, force: r = !1 } = {}) { let i = String(t?.id || "").trim(), a = String(t?.kind || "").trim(), o = String(t?.filename || "").trim(), s = String(t?.filepath || "").trim(), c = !!a && (!!o || !!s), d = !1; if (i) try { - d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Zf(i)}"]`); + d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${$f(i)}"]`); } catch (e) { console.debug?.(e); } @@ -10500,7 +10500,7 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (n !== "output" && n !== "all") return; let r = Array.isArray(e?.detail?.files) ? e.detail.files : [], i = String(e?.detail?.prompt_id || e?.detail?.promptId || "").trim(); for (let e of r) { - let n = Xf(e, { jobId: i }); + let n = Qf(e, { jobId: i }); n && b(t, n, { immediate: !0, force: !0 @@ -10515,19 +10515,19 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; if (t?.defer) return; let i = n.isRenderableLiveAsset(r); - i && c(r), Jf(r); + i && c(r), Xf(r); let a = s(); if (!a) { - i && Bf(); + i && Hf(); return; } let o = a.dataset?.mjrScope || "output"; if (o !== "output" && o !== "all") { - i && Bf(); + i && Hf(); return; } let l = a.dataset?.mjrQuery || "*"; - String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || Bf() : i && Bf(); + String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || Hf() : i && Hf(); } catch (e) { g(e, "entry.asset_added"); } @@ -10590,7 +10590,7 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (window.dispatchEvent(new CustomEvent(V.ASSET_INDEXED, { detail: t })), !t) return; let r = n.prepareLiveAssetEvent(t), i = r?.detail || t; if (r?.defer) return; - n.isRenderableLiveAsset(i) && (c(i), Lf(i)), Jf(i); + n.isRenderableLiveAsset(i) && (c(i), zf(i)), Xf(i); let a = s(); if (!a) return; b(a, i, { @@ -10625,11 +10625,11 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre if (!s) return; let c = r === "error" || n === "failed" ? "error" : n === "done" ? "success" : "info", l = { history: { trackId: `maintenance:${String(i || "db_restore").trim().toLowerCase() || "db_restore"}`, - title: Qf(i, h), + title: ep(i, h), detail: s, status: n, operation: String(i || "db_restore").trim().toLowerCase(), - progress: $f(i, n), + progress: tp(i, n), source: String(t?.name || "").trim() || "maintenance", forceStore: !0 } }; @@ -10659,7 +10659,7 @@ async function ep({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre _(t, window, V.ASSETS_DELETED, x), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = x), console.debug("[Majoor] Real-time listener registered"); } // ui/features/runtime/entryDebugApi.ts -function tp({ resolveNodeStreamModule: e }) { +function rp({ resolveNodeStreamModule: e }) { typeof window < "u" && (window.MajoorDebug = { exportMetrics: () => window.MajoorMetrics?.exportMetrics?.(), getMetrics: () => window.MajoorMetrics?.getMetricsReport?.(), @@ -10674,16 +10674,16 @@ function tp({ resolveNodeStreamModule: e }) { }, console.debug?.("[Majoor] NodeStream API: window.MajoorNodeStream.mode, .listAdapters(), .getKnownNodeSets()")); } // ui/features/runtime/benignConsoleNoise.ts -var np = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; -function rp(e) { +var ip = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; +function ap(e) { try { let t = String(e?.message || e || ""); - return np.some((e) => t.includes(e)); + return ip.some((e) => t.includes(e)); } catch { return !1; } } -function ip() { +function op() { if (typeof window > "u") return null; try { window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__?.abort?.(); @@ -10698,7 +10698,7 @@ function ip() { } let t = (e) => { try { - if (!rp(e?.message || e?.error)) return; + if (!ap(e?.message || e?.error)) return; e.preventDefault?.(), e.stopImmediatePropagation?.(); } catch (e) { console.debug?.(e); @@ -10723,7 +10723,7 @@ function ip() { return window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__ = r, r; } // ui/features/geninfo/genInfoOverridePicker.ts -var ap = "Majoor.GenInfoOverridePicker", op = "MajoorGenInfoOverride", sp = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), cp = R("genInfoOverride.pick", "Pick"), lp = { +var sp = "Majoor.GenInfoOverridePicker", cp = "MajoorGenInfoOverride", lp = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), up = R("genInfoOverride.pick", "Pick"), dp = { positive_prompt: [ "positive_prompt", "prompt", @@ -10746,7 +10746,7 @@ var ap = "Majoor.GenInfoOverridePicker", op = "MajoorGenInfoOverride", sp = R("g ], vae: ["vae", "vae_name"], clip: ["clip", "clip_name"] -}, up = [ +}, fp = [ { field: "positive_prompt", label: "prompt" @@ -10791,14 +10791,14 @@ var ap = "Majoor.GenInfoOverridePicker", op = "MajoorGenInfoOverride", sp = R("g field: "denoise", label: "denoise" } -], dp = 0x10000000000000000, fp = !1, pp = !1; -function mp(e, t) { +], pp = 0x10000000000000000, mp = !1, hp = !1; +function gp(e, t) { let n = (e.widgets ?? []).find((e) => e?.name === t); if (n && n.value !== void 0 && n.value !== null && String(n.value).trim() !== "") return n.value; let r = Array.isArray(e.widgets_values) ? e.widgets_values : [], i = (Array.isArray(e.widgets) ? e.widgets : []).findIndex((e) => e?.name === t); return i >= 0 ? r[i] : void 0; } -function hp(e, t, n, r, i) { +function _p(e, t, n, r, i) { if (r == null || String(r).trim() === "") return; let a = `${n}:${String(r).trim()}`; t.has(a) || (t.add(a), e.push({ @@ -10808,42 +10808,42 @@ function hp(e, t, n, r, i) { source: i })); } -function gp(e, t, n) { +function vp(e, t, n) { let r = t.toLowerCase(); - return !!((lp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); + return !!((dp[e] ?? [e]).some((e) => r === e || r.includes(e)) || e === "positive_prompt" && r === "text" && n.toLowerCase().includes("positive") || e === "negative_prompt" && (r.includes("negative") || n.toLowerCase().includes("negative"))); } -function _p(e, t = null) { +function yp(e, t = null) { let n = [], r = /* @__PURE__ */ new Set(); for (let { graph: i, label: a } of mt(e)) for (let e of ft(i)) { - if (String(e?.comfyClass || e?.type || "") === op) continue; + if (String(e?.comfyClass || e?.type || "") === cp) continue; let i = String(e?.title || e?.comfyClass || e?.type || `Node ${e?.id ?? ""}`).trim(), o = a === "Workflow" ? i : `${a} / ${i}`; - for (let [t, i] of Object.entries(lp)) for (let a of i) hp(n, r, t, mp(e, a), o); + for (let [t, i] of Object.entries(dp)) for (let a of i) _p(n, r, t, gp(e, a), o); let s = Array.isArray(e.widgets) ? e.widgets : [], c = Array.isArray(e.widgets_values) ? e.widgets_values : []; s.forEach((e, a) => { let s = String(e?.name || "").toLowerCase(), l = e?.value ?? c[a]; - s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? hp(n, r, "positive_prompt", l, o) : s.includes("negative") && hp(n, r, "negative_prompt", l, o), t && gp(t, s, i) && hp(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); + s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? _p(n, r, "positive_prompt", l, o) : s.includes("negative") && _p(n, r, "negative_prompt", l, o), t && vp(t, s, i) && _p(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); }); } return t ? n.filter((e) => e.field === t).slice(0, 120) : n.slice(0, 80); } -function vp(e, t) { +function bp(e, t) { return (e.widgets ?? []).find((e) => e?.name === t); } -function yp(e) { - let t = vp(e, "seed"); +function xp(e) { + let t = bp(e, "seed"); t && (t.options = { ...t.options ?? {}, min: -1, - max: dp, + max: pp, control_after_generate: !1 }); } -function bp(e, t) { +function Sp(e, t) { return t === "positive_prompt" ? e?.prompt ?? e?.positive_prompt : t === "negative_prompt" ? e?.negative_prompt ?? e?.negative : t === "loras_json" && Array.isArray(e?.loras) ? JSON.stringify(e.loras) : t === "custom_info_json" && Array.isArray(e?.custom_info) ? JSON.stringify(e.custom_info) : e?.[t]; } -function xp(e, t) { +function Cp(e, t) { if (!e || !t || typeof t != "object") return 0; - yp(e); + xp(e); let n = 0; for (let r of [ "positive_prompt", @@ -10861,16 +10861,16 @@ function xp(e, t) { "workflow_notes", "custom_info_json" ]) { - let i = bp(t, r); + let i = Sp(t, r); if (i == null) continue; - let a = vp(e, r); - a && (Sp(a, i, e, r), Cp(a, i), n += 1); + let a = bp(e, r); + a && (wp(a, i, e, r), Tp(a, i), n += 1); } return n; } -function Sp(e, t, n, r) { +function wp(e, t, n, r) { if (r !== "seed") { - Wn(e, t, n); + Kn(e, t, n); return; } let i = Number(t); @@ -10878,15 +10878,15 @@ function Sp(e, t, n, r) { e.options = { ...e.options ?? {}, min: -1, - max: dp, + max: pp, control_after_generate: !1 }, e.value = Math.trunc(i); try { - e.callback?.(e.value, $e()?.canvas ?? null, n, null, e); + e.callback?.(e.value, Ze()?.canvas ?? null, n, null, e); } catch {} } } -function Cp(e, t) { +function Tp(e, t) { let n = String(t ?? ""), r = [ e?.inputEl, e?.element, @@ -10899,26 +10899,26 @@ function Cp(e, t) { e.value = n; } catch {} } -function wp(e, t, n) { - let r = kp({ detail: { output: t } }); - if (r && xp(e, r)) try { +function Ep(e, t, n) { + let r = jp({ detail: { output: t } }); + if (r && Cp(e, r)) try { e.setSize?.(e.computeSize?.()), e.graph?.setDirtyCanvas?.(!0, !0), e.graph?.change?.(), n?.graph?.setDirtyCanvas?.(!0, !0), n?.graph?.change?.(), n?.canvas?.setDirty?.(!0, !0), n?.canvas?.draw?.(!0, !0); } catch {} } -function Tp(e, t, n = null) { - let r = n || t.field, i = vp(e, r); - i && (Sp(i, t.value, e, r), Cp(i, t.value)); +function Dp(e, t, n = null) { + let r = n || t.field, i = bp(e, r); + i && (wp(i, t.value, e, r), Tp(i, t.value)); } -function Ep(e) { +function Op(e) { return !e || e.value === void 0 || e.value === null || String(e.value).trim() === ""; } -function Dp(e, t) { - let n = _p(t), r = 0; - for (let t of Object.keys(lp)) { - let i = vp(e, t); - if (!i || !Ep(i)) continue; +function kp(e, t) { + let n = yp(t), r = 0; + for (let t of Object.keys(dp)) { + let i = bp(e, t); + if (!i || !Op(i)) continue; let a = n.find((e) => e.field === t); - a && (Sp(i, a.value, e, t), Cp(i, a.value), r += 1); + a && (wp(i, a.value, e, t), Tp(i, a.value), r += 1); } return t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), t?.extensionManager?.toast?.add?.({ severity: r ? "success" : "warn", @@ -10927,34 +10927,34 @@ function Dp(e, t) { life: 3e3 }), r; } -function Op(e, t) { - if (e && String(e?.comfyClass || e?.type || "") === op && (yp(e), !(e.widgets ?? []).some((e) => e?.name === sp) && typeof e.addWidget == "function")) { - e.addWidget("button", sp, null, () => Dp(e, t)); - for (let n of up) { - let r = `${cp} ${n.label}`; - (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => jp(e, t, n.field)); +function Ap(e, t) { + if (e && String(e?.comfyClass || e?.type || "") === cp && (xp(e), !(e.widgets ?? []).some((e) => e?.name === lp) && typeof e.addWidget == "function")) { + e.addWidget("button", lp, null, () => kp(e, t)); + for (let n of fp) { + let r = `${up} ${n.label}`; + (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => Np(e, t, n.field)); } try { e.setSize?.(e.computeSize?.()), t?.graph?.setDirtyCanvas?.(!0, !0); } catch {} } } -function kp(e) { +function jp(e) { let t = e?.detail?.output, n = t?.majoor_geninfo_override ?? t?.ui?.majoor_geninfo_override, r = Array.isArray(n) ? n[0] : n; return r && typeof r == "object" ? r : null; } -function Ap(e) { - if (pp) return; +function Mp(e) { + if (hp) return; let t = e?.api; - t && typeof t.addEventListener == "function" && (pp = !0, t.addEventListener("executed", (t) => { + t && typeof t.addEventListener == "function" && (hp = !0, t.addEventListener("executed", (t) => { let n = t?.detail?.node ?? t?.detail?.display_node; if (!n) return; let r = pt(e, n); - r && String(r?.comfyClass || r?.type || "") === op && wp(r, t?.detail?.output, e); + r && String(r?.comfyClass || r?.type || "") === cp && Ep(r, t?.detail?.output, e); })); } -function jp(e, t, n = null) { - let r = _p(t, n); +function Np(e, t, n = null) { + let r = yp(t, n); if (!r.length) { t?.extensionManager?.toast?.add?.({ severity: "warn", @@ -10977,60 +10977,60 @@ function jp(e, t, n = null) { for (let t of r) { let r = document.createElement("button"); r.type = "button", r.style.cssText = "width:100%;display:grid;grid-template-columns:130px 1fr 150px;gap:8px;text-align:left;background:#2b2b2b;color:#eee;border:1px solid #3d3d3d;border-radius:5px;padding:7px;margin:5px 0;cursor:pointer", r.innerHTML = `${t.label}`, r.children[1].textContent = String(t.value), r.children[2].textContent = t.source, r.onclick = () => { - Tp(e, t, n), i.remove(); + Dp(e, t, n), i.remove(); }, a.appendChild(r); } i.appendChild(a), a.querySelector("[data-close]")?.addEventListener("click", () => i.remove()), i.addEventListener("click", (e) => { e.target === i && i.remove(); }), document.body.appendChild(i); } -function Mp(e, t) { - if (String(e?.comfyClass || e?.type || "") !== op) return []; +function Pp(e, t) { + if (String(e?.comfyClass || e?.type || "") !== cp) return []; let n = [{ content: R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"), - callback: () => jp(e, t) + callback: () => Np(e, t) }]; - for (let r of up) n.push({ + for (let r of fp) n.push({ content: `Pick ${r.label}`, - callback: () => jp(e, t, r.field) + callback: () => Np(e, t, r.field) }); return n.push({ - content: sp, - callback: () => Dp(e, t) + content: lp, + callback: () => kp(e, t) }), n; } -function Np(e = null) { - if (fp) return; - let t = e || $e(); - !t || typeof t.registerExtension != "function" ? setTimeout(() => Np(e), 100) : (fp = !0, Ap(t), t.registerExtension({ - name: ap, +function Fp(e = null) { + if (mp) return; + let t = e || Ze(); + !t || typeof t.registerExtension != "function" ? setTimeout(() => Fp(e), 100) : (mp = !0, Mp(t), t.registerExtension({ + name: sp, async nodeCreated(e) { - Op(e, t); + Ap(e, t); }, getNodeMenuItems(e) { - return Mp(e, t); + return Pp(e, t); } }), setTimeout(() => { - for (let { graph: e } of mt(t)) for (let n of ft(e)) Op(n, t); + for (let { graph: e } of mt(t)) for (let n of ft(e)) Ap(n, t); }, 0)); } // ui/vue/composables/useDragDrop.ts -function Pp() { +function Ip() { let e = null; - kr(() => { + jr(() => { try { - e = is() ?? null; + e = os() ?? null; } catch (e) { console.warn("[Majoor] useDragDrop: init failed", e); } - }), tr(() => { + }), rr(() => { try { e?.({ force: !0 }); } catch (e) { console.debug?.(e); } try { - as({ force: !0 }); + ss({ force: !0 }); } catch (e) { console.debug?.(e); } @@ -11038,10 +11038,10 @@ function Pp() { }); } // ui/vue/GlobalRuntime.vue -var Fp = /* @__PURE__ */ lr({ +var Lp = /* @__PURE__ */ dr({ __name: "GlobalRuntime", setup(e) { - let t = cr(() => import("./chunks/ViewerPortal-uNjS7OxV.js")), n = Q(!1), r = [ + let t = ur(() => import("./chunks/ViewerPortal-BStxU0ID.js")), n = Q(!1), r = [ V.OPEN_VIEWER, V.MFV_OPEN, V.MFV_TOGGLE, @@ -11054,7 +11054,7 @@ var Fp = /* @__PURE__ */ lr({ if (n.value) return; n.value = !0; let t = String(e?.type || ""), r = e?.detail ?? null; - t && t !== V.OPEN_VIEWER && sr(() => { + t && t !== V.OPEN_VIEWER && lr(() => { try { window.dispatchEvent(new CustomEvent(t, { detail: r })); } catch (e) { @@ -11062,21 +11062,21 @@ var Fp = /* @__PURE__ */ lr({ } }); } - return Pp(), kr(() => { + return Ip(), jr(() => { for (let e of r) try { window.addEventListener(e, i, { once: !1 }); } catch (e) { console.debug?.(e); } - }), tr(() => { + }), rr(() => { for (let e of r) try { window.removeEventListener(e, i); } catch (e) { console.debug?.(e); } - }), (e, r) => n.value ? (q(), nr(Z(t), { key: 0 })) : G("", !0); + }), (e, r) => n.value ? (q(), ir(Z(t), { key: 0 })) : G("", !0); } -}), Ip = { +}), Rp = { gridRenderCount: 0, gridRenderTotalMs: 0, searchQueryCount: 0, @@ -11087,20 +11087,20 @@ var Fp = /* @__PURE__ */ lr({ thumbnailLoadCount: 0, thumbnailLoadFailures: 0, errorCounts: {} -}, Lp = /* @__PURE__ */ new Map(); -function Rp(e) { +}, zp = /* @__PURE__ */ new Map(); +function Bp(e) { let t = performance.now(); - Lp.set(e, t); + zp.set(e, t); try { performance.mark(`${e}-start`); } catch {} } -function zp(e, t) { - let n = Lp.get(e); +function Vp(e, t) { + let n = zp.get(e); if (!n) return console.warn(`[Majoor Metrics] Timer not found: ${e}`), 0; let r = performance.now() - n; - if (Lp.delete(e), t) { - let e = `${t}Count`, n = `${t}TotalMs`, i = Ip; + if (zp.delete(e), t) { + let e = `${t}Count`, n = `${t}TotalMs`, i = Rp; typeof i[e] == "number" && (i[e]++, i[n] += r); } r > 100 && console.log(`[Majoor Metrics] ${e}: ${r.toFixed(2)}ms`); @@ -11109,15 +11109,15 @@ function zp(e, t) { } catch {} return r; } -function Bp(e) { - return Lp.has(e); +function Hp(e) { + return zp.has(e); } -function Vp(e) { +function Up(e) { try { performance.mark(`${e}-start`); } catch {} } -function Hp(e) { +function Wp(e) { try { performance.mark(`${e}-end`), performance.measure(e, `${e}-start`, `${e}-end`); let t = performance.getEntriesByName(e)[0]?.duration || 0; @@ -11126,47 +11126,47 @@ function Hp(e) { return null; } } -function Up(e, t = !1) { - Ip.apiCallCount++, Ip.apiCallTotalMs += e, t && Ip.apiErrorCount++; -} -function Wp(e) { - Ip.gridRenderCount++, Ip.gridRenderTotalMs += e; -} -function Gp(e) { - Ip.searchQueryCount++, Ip.searchQueryTotalMs += e; +function Gp(e, t = !1) { + Rp.apiCallCount++, Rp.apiCallTotalMs += e, t && Rp.apiErrorCount++; } function Kp(e) { - Ip.thumbnailLoadCount++, e || Ip.thumbnailLoadFailures++; + Rp.gridRenderCount++, Rp.gridRenderTotalMs += e; } -function qp(e, t) { - Ip.errorCounts[e] = (Ip.errorCounts[e] || 0) + 1; +function qp(e) { + Rp.searchQueryCount++, Rp.searchQueryTotalMs += e; } -function Jp() { +function Jp(e) { + Rp.thumbnailLoadCount++, e || Rp.thumbnailLoadFailures++; +} +function Yp(e, t) { + Rp.errorCounts[e] = (Rp.errorCounts[e] || 0) + 1; +} +function Xp() { return { - ...Ip, + ...Rp, averages: { - gridRenderMs: Ip.gridRenderCount > 0 ? Ip.gridRenderTotalMs / Ip.gridRenderCount : 0, - searchQueryMs: Ip.searchQueryCount > 0 ? Ip.searchQueryTotalMs / Ip.searchQueryCount : 0, - apiCallMs: Ip.apiCallCount > 0 ? Ip.apiCallTotalMs / Ip.apiCallCount : 0 + gridRenderMs: Rp.gridRenderCount > 0 ? Rp.gridRenderTotalMs / Rp.gridRenderCount : 0, + searchQueryMs: Rp.searchQueryCount > 0 ? Rp.searchQueryTotalMs / Rp.searchQueryCount : 0, + apiCallMs: Rp.apiCallCount > 0 ? Rp.apiCallTotalMs / Rp.apiCallCount : 0 }, rates: { - apiErrorRate: Ip.apiCallCount > 0 ? (Ip.apiErrorCount / Ip.apiCallCount * 100).toFixed(2) + "%" : "0%", - thumbnailFailureRate: Ip.thumbnailLoadCount > 0 ? (Ip.thumbnailLoadFailures / Ip.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" + apiErrorRate: Rp.apiCallCount > 0 ? (Rp.apiErrorCount / Rp.apiCallCount * 100).toFixed(2) + "%" : "0%", + thumbnailFailureRate: Rp.thumbnailLoadCount > 0 ? (Rp.thumbnailLoadFailures / Rp.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" } }; } -function Yp(e) { - let t = `${e}Count`, n = `${e}TotalMs`, r = Ip, i = r[t], a = r[n]; +function Zp(e) { + let t = `${e}Count`, n = `${e}TotalMs`, r = Rp, i = r[t], a = r[n]; return i > 0 ? a / i : 0; } -function Xp() { - let e = Ip; +function Qp() { + let e = Rp; Object.keys(e).forEach((t) => { typeof e[t] == "number" ? e[t] = 0 : typeof e[t] == "object" && (e[t] = {}); - }), Lp.clear(), console.log("[Majoor Metrics] Metrics reset"); + }), zp.clear(), console.log("[Majoor Metrics] Metrics reset"); } -function Zp() { - let e = Jp(); +function $p() { + let e = Xp(); console.group("[Majoor Assets Manager] Performance Metrics"), console.table({ "Grid Renders": e.gridRenderCount, "Avg Grid Render": `${e.averages.gridRenderMs.toFixed(2)}ms`, @@ -11179,26 +11179,26 @@ function Zp() { "Thumbnail Loads": e.thumbnailLoadCount, "Thumbnail Failures": e.thumbnailLoadFailures, "Failure Rate": e.rates.thumbnailFailureRate - }), Object.keys(Ip.errorCounts).length > 0 && console.log("Error Counts:", Ip.errorCounts), console.groupEnd(); + }), Object.keys(Rp.errorCounts).length > 0 && console.log("Error Counts:", Rp.errorCounts), console.groupEnd(); } typeof window < "u" && (window.MajoorMetrics = { - startTimer: Rp, - endTimer: zp, - hasTimer: Bp, - mark: Vp, - measure: Hp, - trackApiCall: Up, - trackGridRender: Wp, - trackSearchQuery: Gp, - trackThumbnailLoad: Kp, - trackError: qp, - getMetricsReport: Jp, - getAverageDuration: Yp, - resetMetrics: Xp, - exportMetrics: Zp + startTimer: Bp, + endTimer: Vp, + hasTimer: Hp, + mark: Up, + measure: Wp, + trackApiCall: Gp, + trackGridRender: Kp, + trackSearchQuery: qp, + trackThumbnailLoad: Jp, + trackError: Yp, + getMetricsReport: Xp, + getAverageDuration: Zp, + resetMetrics: Qp, + exportMetrics: $p }); // ui/features/status/StatusDot.ts -var Qp = [{ +var em = [{ key: "exiftool", labelKey: "tool.exiftool", hintKey: "tool.exiftool.hint" @@ -11206,24 +11206,24 @@ var Qp = [{ key: "ffprobe", labelKey: "tool.ffprobe", hintKey: "tool.ffprobe.hint" -}], $p = !1, em = null, tm = null, nm = "__MJR_STATUS_DOT_CACHE__", rm = { +}], tm = !1, nm = null, rm = null, im = "__MJR_STATUS_DOT_CACHE__", am = { ACTIVE: "active", COOLDOWN: "cooldown", IDLE: "idle" -}, im = { - [rm.ACTIVE]: 2e3, - [rm.COOLDOWN]: 1e4, - [rm.IDLE]: 6e4 +}, om = { + [am.ACTIVE]: 2e3, + [am.COOLDOWN]: 1e4, + [am.IDLE]: 6e4 }; -function am(e) { - $p = !!e; +function sm(e) { + tm = !!e; try { - globalThis._mjrMaintenanceActive = $p; + globalThis._mjrMaintenanceActive = tm; } catch (e) { console.debug?.(e); } } -function om(e) { +function cm(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return "0 B"; let n = [ @@ -11237,7 +11237,7 @@ function om(e) { let a = r >= 100 ? 0 : r >= 10 ? 1 : 2; return `${r.toFixed(a)} ${n[i]}`; } -function sm(e, t, n = null) { +function lm(e, t, n = null) { if (e && (e.replaceChildren(), (Array.isArray(t) ? t.filter((e) => e != null && String(e).trim() !== "") : []).forEach((t, n) => { n > 0 && e.appendChild(document.createElement("br")), e.appendChild(document.createTextNode(String(t))); }), n != null && String(n).trim() !== "")) { @@ -11246,7 +11246,7 @@ function sm(e, t, n = null) { t.style.fontSize = "11px", t.style.opacity = "0.6", t.textContent = String(n), e.appendChild(t); } } -function cm(e, t = []) { +function um(e, t = []) { if (!e) return; let n = Array.isArray(t) ? t.filter((e) => e && String(e.label || "").trim()) : []; if (!n.length) return; @@ -11266,7 +11266,7 @@ function cm(e, t = []) { } e.appendChild(r); } -function lm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { +function dm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { let i = Math.max(0, Number(t || e?.total_assets || 0) || 0); if (i <= 0) return []; let a = (e, t = i) => { @@ -11312,13 +11312,13 @@ function lm(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r } : null ].filter(Boolean); } -function um(e, t, n) { +function fm(e, t, n) { if (!e) return; e.replaceChildren(), e.appendChild(document.createTextNode(String(t || ""))), e.appendChild(document.createElement("br")); let r = document.createElement("span"); r.style.fontSize = "11px", r.style.opacity = "0.7", r.textContent = String(n || ""), e.appendChild(r); } -function dm(t, n = "neutral", r = {}) { +function pm(t, n = "neutral", r = {}) { if (!t) return; let i = r?.toast !== !1, a = { neutral: { @@ -11384,23 +11384,23 @@ function dm(t, n = "neutral", r = {}) { } } } -function fm(e) { +function mm(e) { let t = String(e || "").toLowerCase(); return t === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : t === "input" || t === "inputs" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Browser") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); } -function pm(e, t = "") { - if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: fm(t) }) : R("status.watcher.disabled", "Watcher: disabled"); +function hm(e, t = "") { + if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: mm(t) }) : R("status.watcher.disabled", "Watcher: disabled"); let n = !!e.enabled, r = e.scope ? String(e.scope) : ""; - return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: fm(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: fm(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); + return n ? r ? R("status.watcher.enabledScoped", `Watcher: enabled (${r})`, { scope: mm(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: mm(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); } -function mm(e = "status-action") { +function gm(e = "status-action") { try { window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } -function hm(e = "status-action", t = {}) { +function _m(e = "status-action", t = {}) { try { window?.dispatchEvent?.(new CustomEvent("mjr-grid-dirty", { detail: { reason: String(e || "status-action"), @@ -11410,21 +11410,21 @@ function hm(e = "status-action", t = {}) { console.debug?.(e); } } -function gm(e = "") { +function vm(e = "") { try { window?.dispatchEvent?.(new CustomEvent(V.OPEN_MESSAGE_HISTORY, { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } -async function _m(e = "") { +async function ym(e = "") { return await Ut(R("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || R("dialog.vectorsReset.title", "AI vectors")); } -function vm(t = {}) { +function bm(t = {}) { let n = typeof t?.getScanContext == "function" ? t.getScanContext : null; - am(!1); + sm(!1); let r = document.createElement("div"); - r.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", dm(r, "info", { toast: !1 }); + r.style.cssText = "margin-bottom: 20px; padding: 12px; background: var(--bg-color, #1a1a1a); border-radius: 6px; border: 1px solid var(--border-color, #333); cursor: pointer; transition: all 0.2s;", pm(r, "info", { toast: !1 }); let i = document.createElement("div"); i.style.cssText = "display: flex; align-items: center; gap: 10px; margin-bottom: 8px;"; let a = document.createElement("span"); @@ -11470,7 +11470,7 @@ function vm(t = {}) { for (let t of n) { let n = String(t?.name || ""); if (!n) continue; - let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${om(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); + let i = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = i > 0 ? (/* @__PURE__ */ new Date(i * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${cm(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); c.value = n, c.textContent = s, e && e === n && (c.selected = !0, r = !0), h.appendChild(c); } g = h.childNodes.length > 0, h.disabled = !g, g && !r && h.childNodes[0] && (h.value = String(h.childNodes[0]?.value || "")), _ && (_.disabled = !g); @@ -11481,16 +11481,16 @@ function vm(t = {}) { y(), m.appendChild(h); let b = document.createElement("button"); b.type = "button", b.textContent = R("btn.dbSave", "Save DB"), b.title = R("status.dbSaveHint", "Save a DB snapshot into archive folder"), b.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(120,200,255,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", b.onclick = async (t) => { - t.stopPropagation(), am(!0); + t.stopPropagation(), sm(!0); let i = b.textContent, o = !!_?.disabled; - b.disabled = !0, _ && (_.disabled = !0), b.textContent = R("btn.saving", "Saving..."), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + b.disabled = !0, _ && (_.disabled = !0), b.textContent = R("btn.saving", "Saving..."), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { let t = await Te(); if (t?.ok) { let n = String(t?.data?.name || "").trim(), r = Number(t?.data?.size_bytes || 0); e(R("toast.dbSaveSuccess", "Database backup saved"), "success", 2200, { history: { title: R("btn.dbSave", "Save DB"), - detail: n ? `${n}${r > 0 ? ` | ${om(r)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), + detail: n ? `${n}${r > 0 ? ` | ${cm(r)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), operation: "save_db", source: n || "archive", forceStore: !0 @@ -11499,10 +11499,10 @@ function vm(t = {}) { } catch (t) { e(t?.message || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } finally { - am(!1), b.disabled = !1, _ && (_.disabled = o || !g), b.textContent = i; + sm(!1), b.disabled = !1, _ && (_.disabled = o || !g), b.textContent = i; try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11523,9 +11523,9 @@ function vm(t = {}) { source: i, status: "started", forceStore: !0 - } }), am(!0); + } }), sm(!0); let o = _.textContent, s = !!b.disabled; - _.disabled = !0, b.disabled = !0, h.disabled = !0, _.textContent = R("btn.restoring", "Restoring..."), a.style.background = "var(--mjr-status-warning, #FFA726)", dm(r, "warning"); + _.disabled = !0, b.disabled = !0, h.disabled = !0, _.textContent = R("btn.restoring", "Restoring..."), a.style.background = "var(--mjr-status-warning, #FFA726)", pm(r, "warning"); try { let t = await M({ name: i, @@ -11535,10 +11535,10 @@ function vm(t = {}) { } catch (t) { e(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } finally { - am(!1), _.disabled = !g, b.disabled = s, h.disabled = !g, _.textContent = o, mm("db-restore"); + sm(!1), _.disabled = !g, b.disabled = s, h.disabled = !g, _.textContent = o, gm("db-restore"); try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11558,11 +11558,11 @@ function vm(t = {}) { D.style.borderColor = "rgba(255,255,255,0.25)", D.style.background = "transparent"; }, D.onclick = async (e) => { e.stopPropagation(); - let t = await _m(R("btn.resetIndex", "Reset index")); + let t = await ym(R("btn.resetIndex", "Reset index")); if (!await Ut(t ? R("dialog.resetIndex.confirmKeepVectors", "This will reset index data and rescan files while keeping existing AI vectors.\n\nContinue?") : R("dialog.resetIndex.msg", "This will delete the database and rescan all files. Continue?"), R("dialog.resetIndex.title", "Reset index?"))) return; - gm("reset-index"), am(!0); + vm("reset-index"), sm(!0); let i = D.textContent; - D.disabled = !0, E.disabled = !0, D.textContent = R("btn.resetting"), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + D.disabled = !0, E.disabled = !0, D.textContent = R("btn.resetting"), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { let e = n ? n() : {}, i = String(e?.scope || "output").toLowerCase(), o = e?.customRootId || e?.custom_root_id || e?.root_id || null, s = i === "custom" && !o; (await De({ @@ -11577,14 +11577,14 @@ function vm(t = {}) { clear_assets: !t, preserve_vectors: t, rebuild_fts: !0 - }))?.ok ? (a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error")); + }))?.ok ? (a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error")); } catch { - a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } finally { - am(!1), D.disabled = !1, E.disabled = !1, D.textContent = i, mm("index-reset"); + sm(!1), D.disabled = !1, E.disabled = !1, D.textContent = i, gm("index-reset"); try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11602,8 +11602,8 @@ function vm(t = {}) { e(R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans"), "warning", 2600), T("Backfill skipped - Browser scope has no selected custom root.", "warning"); return; } - let c = o || "output", l = fm(c); - gm("vector-backfill"); + let c = o || "output", l = mm(c); + vm("vector-backfill"); let u = { history: { trackId: `vector-backfill:status:${c}:${s || "default"}`, title: "Vector Backfill", @@ -11611,7 +11611,7 @@ function vm(t = {}) { operation: "vector_backfill", forceStore: !0 } }; - am(!0); + sm(!0); let p = O.textContent, m = D.textContent; O.disabled = !0, D.disabled = !0, E.disabled = !0, O.textContent = "Backfilling...", T(`Backfill started (${l})...`, "info"), ee({ summary: "Vector Backfill", @@ -11620,7 +11620,7 @@ function vm(t = {}) { ...u.history, status: "started", detail: `Started (${l})` - } }), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + } }), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { let t = { scope: c, @@ -11687,7 +11687,7 @@ function vm(t = {}) { errors: d, label: "running" } - } }), T(`Backfill running in background - candidates ${s}, indexed ${c}, skipped ${l}, errors ${d}`, "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + } }), T(`Backfill running in background - candidates ${s}, indexed ${c}, skipped ${l}, errors ${d}`, "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); } else e(R("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { processed: s, indexed: c, @@ -11705,7 +11705,7 @@ function vm(t = {}) { errors: d, label: "done" } - } }), T(`Backfill OK - processed ${s}, indexed ${c}, skipped ${l}`, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success"); + } }), T(`Backfill OK - processed ${s}, indexed ${c}, skipped ${l}`, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success"); } else { let t = String(n?.error || R("toast.vectorBackfillFailedGeneric", "Backfill failed")), i = String(n?.code || "").trim(), o = Number(n?.status || 0) || 0, s = [ i ? `code=${i}` : "", @@ -11720,7 +11720,7 @@ function vm(t = {}) { label: "failed", errors: 1 } - } }), T(`Backfill ? - ${s}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", n), a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + } }), T(`Backfill ? - ${s}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", n), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } } catch (t) { let n = String(t?.message || t || "Backfill failed"); @@ -11732,12 +11732,12 @@ function vm(t = {}) { label: "failed", errors: 1 } - } }), T(`Backfill EXCEPTION - ${n}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", t), a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + } }), T(`Backfill EXCEPTION - ${n}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", t), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } finally { - am(!1), O.disabled = !1, D.disabled = !1, E.disabled = !1, O.textContent = p, D.textContent = m, mm("vector-backfill"); + sm(!1), O.disabled = !1, D.disabled = !1, E.disabled = !1, O.textContent = p, D.textContent = m, gm("vector-backfill"); try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11749,24 +11749,24 @@ function vm(t = {}) { }, E.onclick = async (t) => { t.stopPropagation(); let i = E.textContent; - E.disabled = !0, O.disabled = !0, D.disabled = !0, E.textContent = R("btn.memoryPurging", "Purging..."), T(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + E.disabled = !0, O.disabled = !0, D.disabled = !0, E.textContent = R("btn.memoryPurging", "Purging..."), T(R("status.memoryPurgeStarted", "Memory purge started..."), "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { let t = await C(); if (t?.ok) { let n = t?.data?.comfy_models ? R("toast.memoryPurgeComplete", "Memory purge complete. Majoor AI and ComfyUI model caches were released.") : R("toast.memoryPurgeCompleteMajoorOnly", "Memory purge complete. Majoor AI caches were released."); - e(n, "success", 3200), T(n, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success"); + e(n, "success", 3200), T(n, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success"); } else { let n = String(t?.error || "Memory purge failed"); - e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } } catch (t) { let n = String(t?.message || t || "Memory purge failed"); - e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + e(n, "error", 4500), T(n, "error"), a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } finally { E.disabled = !1, O.disabled = !1, D.disabled = !1, E.textContent = i; try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11779,11 +11779,11 @@ function vm(t = {}) { k.style.borderColor = "rgba(255,80,80,0.4)", k.style.background = "transparent"; }, k.onclick = async (e) => { e.stopPropagation(); - let t = await _m(R("btn.deleteDb", "Delete DB")); + let t = await ym(R("btn.deleteDb", "Delete DB")); if (!await Ut(t ? R("dialog.dbDelete.keepVectorsConfirm", "This will reset index data and keep existing AI vectors. Database files will not be force-deleted.\n\nContinue?") : R("dialog.dbDelete.confirm", "This will permanently delete the index database and rebuild it from scratch. All ratings, tags, and cached metadata will be lost.\n\nContinue?"), R("btn.deleteDb", "Delete DB"))) return; - am(!0); + sm(!0); let i = k.textContent; - k.disabled = !0, k.textContent = t ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), D.disabled = !0, E.disabled = !0, a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info"); + k.disabled = !0, k.textContent = t ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), D.disabled = !0, E.disabled = !0, a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info"); try { (t ? await De({ scope: "all", @@ -11796,14 +11796,14 @@ function vm(t = {}) { clear_assets: !1, preserve_vectors: !0, rebuild_fts: !0 - }) : await c())?.ok ? (globalThis._mjrCorruptToastShown = !1, a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error")); + }) : await c())?.ok ? (globalThis._mjrCorruptToastShown = !1, a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error")); } catch { - a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error"); } finally { - am(!1), k.disabled = !1, k.textContent = i, D.disabled = !1, E.disabled = !1, mm(t ? "index-reset-preserve-vectors" : "db-force-delete"); + sm(!1), k.disabled = !1, k.textContent = i, D.disabled = !1, E.disabled = !1, gm(t ? "index-reset-preserve-vectors" : "db-force-delete"); try { let e = n ? n() : null; - await Dm(a, d, f, e, null, { force: !0 }); + await km(a, d, f, e, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -11815,34 +11815,34 @@ function vm(t = {}) { let t = r.querySelector("#mjr-status-body"); if (!t) return; let n = t.style.display === "none"; - wm(r, !n); - }), wm(r, !0), r.onmouseenter = () => { + Em(r, !n); + }), Em(r, !0), r.onmouseenter = () => { r.style.transform = "translateY(-1px)"; }, r.onmouseleave = () => { - r.style.transform = "", dm(r, r.dataset?.mjrStatusTone || "neutral", { toast: !1 }); + r.style.transform = "", pm(r, r.dataset?.mjrStatusTone || "neutral", { toast: !1 }); }; let j = async (e) => { try { let t = e?.detail || {}, i = String(t?.step || ""); if (!i) return; let o = i === "started" || i === "stopping_workers" || i === "resetting_db" || i === "delete_db" || i === "recreate_db" || i === "replacing_files" || i === "restarting_scan"; - if (o ? am(!0) : (i === "failed" || i === "done") && am(!1), !r?.isConnected || !a?.isConnected || !d?.isConnected) return; + if (o ? sm(!0) : (i === "failed" || i === "done") && sm(!1), !r?.isConnected || !a?.isConnected || !d?.isConnected) return; if (o) { - a.style.background = "var(--mjr-status-info, #64B5F6)", dm(r, "info", { toast: !1 }), um(d, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); + a.style.background = "var(--mjr-status-info, #64B5F6)", pm(r, "info", { toast: !1 }), fm(d, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); return; } if (i === "failed") { - a.style.background = "var(--mjr-status-error, #f44336)", dm(r, "error", { toast: !1 }), sm(d, [R("status.error", "Error"), String(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); + a.style.background = "var(--mjr-status-error, #f44336)", pm(r, "error", { toast: !1 }), lm(d, [R("status.error", "Error"), String(t?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); return; } if (i === "done") { - a.style.background = "var(--mjr-status-success, #4CAF50)", dm(r, "success", { toast: !1 }); + a.style.background = "var(--mjr-status-success, #4CAF50)", pm(r, "success", { toast: !1 }); let e = String(t?.operation || ""), i = e === "delete_db" ? R("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed.") : e === "reset_index" ? R("toast.resetStarted", "Index reset started. Files will be reindexed in the background.") : R("toast.dbRestoreSuccess", "Database backup restored"); - um(d, R("status.ready", "Ready"), i); + fm(d, R("status.ready", "Ready"), i); try { let e = n ? n() : null; setTimeout(() => { - Dm(a, d, f, e, null, { force: !0 }); + km(a, d, f, e, null, { force: !0 }); }, 600); } catch (e) { console.debug?.(e); @@ -11853,8 +11853,8 @@ function vm(t = {}) { } }; try { - let e = em; - typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), em = j, r._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); + let e = nm; + typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), nm = j, r._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); } catch (e) { console.debug?.(e); } @@ -11871,27 +11871,27 @@ function vm(t = {}) { ].filter(Boolean); if (!s.length) return; let c = d?.querySelector?.("span"); - c ? c.textContent = s.join(" | ") : um(d, R("status.ready", "Ready"), s.join(" | ")); + c ? c.textContent = s.join(" | ") : fm(d, R("status.ready", "Ready"), s.join(" | ")); } catch (e) { console.debug?.(e); } }; try { - let e = tm; - typeof e == "function" && window.removeEventListener(V.RUNTIME_STATUS, e), tm = N, window.addEventListener(V.RUNTIME_STATUS, N); + let e = rm; + typeof e == "function" && window.removeEventListener(V.RUNTIME_STATUS, e), rm = N, window.addEventListener(V.RUNTIME_STATUS, N); } catch (e) { console.debug?.(e); } return r; } -async function ym(t, n, r = null, i = null) { - if ($p) { +async function xm(t, n, r = null, i = null) { + if (tm) { e(R("status.maintenanceBusy", "Database maintenance in progress. Please wait."), "warning", 2200); return; } let a = n?.closest?.("#mjr-status-body")?.parentElement || n?.closest?.("div"), o = String(i?.scope || "output").toLowerCase(), s = i?.customRootId || i?.custom_root_id || i?.root_id || null; if (o === "custom" && !s) { - t.style.background = "var(--mjr-status-info, #64B5F6)", dm(a, "info"), um(n, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); + t.style.background = "var(--mjr-status-info, #64B5F6)", pm(a, "info"), fm(n, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); return; } try { @@ -11899,7 +11899,7 @@ async function ym(t, n, r = null, i = null) { if (t && typeof t == "object") { let r = e - Number(t.at || 0); if (r >= 0 && r < 6e5) { - um(n, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); + fm(n, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); return; } } @@ -11919,15 +11919,15 @@ async function ym(t, n, r = null, i = null) { } }, l = null; try { - let e = await re(st.ROOTS); + let e = await re(it.ROOTS); e.ok && (l = e.data); } catch (e) { console.debug?.(e); } if (!l) { - let e = await re(st.CONFIG); + let e = await re(it.CONFIG); if (!e.ok) { - t.style.background = "var(--mjr-status-error, #f44336)", dm(a, "error"), n.textContent = R("status.errorGetConfig"), c(); + t.style.background = "var(--mjr-status-error, #f44336)", pm(a, "error"), n.textContent = R("status.errorGetConfig"), c(); return; } l = { output_directory: e.data.output_directory }; @@ -11938,7 +11938,7 @@ async function ym(t, n, r = null, i = null) { let e = Array.isArray(l?.custom_roots) ? l.custom_roots : [], t = s ? e.find((e) => e?.id === s) : null; d = t?.path ? ` (${t.path})` : ""; } else o === "output" && (d = l?.output_directory ? ` (${l.output_directory})` : ""); - t.style.background = "var(--mjr-status-info, #64B5F6)", dm(a, "info"), um(n, R("status.scanningScope", `Scanning ${u}${d}...`, { + t.style.background = "var(--mjr-status-info, #64B5F6)", pm(a, "info"), fm(n, R("status.scanningScope", `Scanning ${u}${d}...`, { scope: u, detail: d }), R("status.scanningHint", "This may take a while")); @@ -11946,91 +11946,91 @@ async function ym(t, n, r = null, i = null) { scope: o, recursive: !0, incremental: !0, - fast: !!(Jt()?.scan?.fastMode ?? !0), + fast: !!(Vn()?.scan?.fastMode ?? !0), background_metadata: !0 }; if (o === "custom") { if (!s) { - t.style.background = "var(--mjr-status-error, #f44336)", dm(a, "error"), n.textContent = R("status.selectCustomFolder"), c(); + t.style.background = "var(--mjr-status-error, #f44336)", pm(a, "error"), n.textContent = R("status.selectCustomFolder"), c(); return; } f.custom_root_id = s; } let p; try { - p = await L(st.SCAN, f); + p = await L(it.SCAN, f); } finally { c(); } if (p?.ok) { let e = p.data; - t.style.background = "var(--mjr-status-success, #4CAF50)", dm(a, "success"), um(n, R("toast.scanComplete"), R("status.scanStats", `Added: ${e.added || 0} - Updated: ${e.updated || 0} - Skipped: ${e.skipped || 0}`, { + t.style.background = "var(--mjr-status-success, #4CAF50)", pm(a, "success"), fm(n, R("toast.scanComplete"), R("status.scanStats", `Added: ${e.added || 0} - Updated: ${e.updated || 0} - Skipped: ${e.skipped || 0}`, { added: e.added || 0, updated: e.updated || 0, skipped: e.skipped || 0 - })), hm("scan-complete", { stats: { + })), _m("scan-complete", { stats: { added: e.added || 0, updated: e.updated || 0, skipped: e.skipped || 0 } }), setTimeout(() => { - Dm(t, n, r); + km(t, n, r); }, 2e3); - } else t.style.background = "var(--mjr-status-error, #f44336)", dm(a, "error"), sm(n, [R("toast.scanFailed") + `: ${p?.error || "Unknown error"}`]), setTimeout(() => { - Dm(t, n, r); + } else t.style.background = "var(--mjr-status-error, #f44336)", pm(a, "error"), lm(n, [R("toast.scanFailed") + `: ${p?.error || "Unknown error"}`]), setTimeout(() => { + km(t, n, r); }, 3e3); } -function bm(e, t, n) { +function Sm(e, t, n) { let r = document.createElement("span"); return r.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 6px;\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.05);\n border: 1px solid rgba(255, 255, 255, 0.1);\n ", r.textContent = `${t ? "OK" : "ERR"} ${e}`, r.title = t ? R("status.toolAvailable", `${e} available`, { tool: e }) : n || R("status.toolUnavailable", `${e} unavailable`, { tool: e }), r.style.opacity = t ? "1" : "0.75", r; } -function xm(e, t = {}, n = {}) { +function Cm(e, t = {}, n = {}) { if (!e) return; if (e.replaceChildren(), !t || Object.keys(t).length === 0) { e.textContent = R("status.discoveringTools"); return; } let r = document.createElement("div"); - r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", Qp.forEach(({ key: e, labelKey: i, hintKey: a }) => { + r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", em.forEach(({ key: e, labelKey: i, hintKey: a }) => { let o = !!t[e], s = n[e], c = R(i, e), l = R(a, ""); - r.appendChild(Cm({ + r.appendChild(Tm({ label: c, hint: l }, o, s)); }), e.appendChild(r); } -function Sm(e, t = null, n = {}) { +function wm(e, t = null, n = {}) { if (!e) return; let r = e.parentElement; if (!r) return; let i = r.querySelector("#mjr-tools-status"); if (!i) return; let a = n && Object.keys(n).length > 0; - i.textContent = !t && !a ? R("status.toolStatusChecking", "Tool status: checking...") : Qp.map(({ key: e, labelKey: r }) => { + i.textContent = !t && !a ? R("status.toolStatusChecking", "Tool status: checking...") : em.map(({ key: e, labelKey: r }) => { let i = R(r, e), a = t && e in t ? t[e] : void 0, o = e in n ? n[e] : void 0, s = a === void 0 ? o : a, c = s == null ? R("status.unknown", "unknown") : s ? R("status.available", "available") : R("status.missing", "missing"), l = t?.versions?.[e]; return l ? `${i}: ${c} - ${l}` : `${i}: ${c}`; }).join(" | "); } -function Cm({ label: e, hint: t }, n, r) { +function Tm({ label: e, hint: t }, n, r) { let i = document.createElement("div"); i.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 3px;\n padding: 6px 8px;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.03);\n border: 1px solid rgba(255, 255, 255, 0.08);\n min-width: 170px;\n "; - let a = bm(e, n, t); + let a = Sm(e, n, t); a.style.fontWeight = "500", i.appendChild(a); let o = document.createElement("span"); return o.style.fontSize = "10px", o.style.opacity = "0.7", o.style.wordBreak = "break-all", o.textContent = R("status.path", "Path") + `: ${r || R("status.pathAuto", "auto / not configured")}`, i.appendChild(o), i; } -function wm(e, t) { +function Em(e, t) { let n = e.querySelector("#mjr-status-body"), r = e.querySelector("#mjr-status-title-indicator"); n && r && (t ? (n.style.display = "none", r.textContent = ">") : (n.style.display = "", r.textContent = "v")); } -function Tm(e, t) { +function Dm(e, t) { let n = !!e?.database?.available, r = t?.diagnostics || {}, i = !!r?.malformed, a = !!r?.locked; return !n || i ? R("status.dbHealthError", "DB health: error") : a ? R("status.dbHealthLocked", "DB health: locked") : R("status.dbHealthOk", "DB health: ok"); } -function Em(e, t) { +function Om(e, t) { let n = Number(e?.total_assets || 0), r = e?.last_index_end, i = e?.last_scan_end, a = t === "all" ? R("scope.all", "Inputs + Outputs") : t === "input" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Custom") : t === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); return !Number.isFinite(n) || n <= 0 ? `${R("status.indexHealthEmpty", "Index health: empty")} (${a})` : !r && !i ? `${R("status.indexHealthPartial", "Index health: partial")} (${a})` : `${R("status.indexHealthOk", "Index health: ok")} (${a})`; } -async function Dm(t, n, r = null, i = null, a = null, o = {}) { +async function km(t, n, r = null, i = null, a = null, o = {}) { let s = n?.closest?.("#mjr-status-body")?.parentElement || n?.closest?.("div"), c = o?.signal || null, l = !!o?.force; try { if (!t?.isConnected || !n?.isConnected) return null; @@ -12038,17 +12038,17 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { console.debug?.(e); } try { - if (!l && $p) return null; + if (!l && tm) return null; } catch (e) { console.debug?.(e); } a && typeof a == "object" && (a.lastCode = null, a.lastStatus = null); - let u = String(i?.scope || "output").toLowerCase(), d = u === "workflow" ? "all" : u, f = i?.customRootId || i?.custom_root_id || i?.root_id || null, p = u === "custom" && !f, m = p ? `${st.HEALTH_COUNTERS}?scope=all` : d === "custom" ? `${st.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(f || ""))}` : `${st.HEALTH_COUNTERS}?scope=${encodeURIComponent(d || "output")}`, h = !!o?.lightweight, g = !(!l && a && typeof a == "object" && Number(a._scanAuxBackoffUntil || 0) > Date.now()) && (l || !h || !(a && typeof a == "object" && a._auxCached)), _, v, y, b = null; + let u = String(i?.scope || "output").toLowerCase(), d = u === "workflow" ? "all" : u, f = i?.customRootId || i?.custom_root_id || i?.root_id || null, p = u === "custom" && !f, m = p ? `${it.HEALTH_COUNTERS}?scope=all` : d === "custom" ? `${it.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(f || ""))}` : `${it.HEALTH_COUNTERS}?scope=${encodeURIComponent(d || "output")}`, h = !!o?.lightweight, g = !(!l && a && typeof a == "object" && Number(a._scanAuxBackoffUntil || 0) > Date.now()) && (l || !h || !(a && typeof a == "object" && a._auxCached)), _, v, y, b = null; if (g) { let [e, t, n] = await Promise.all([ re(m, c ? { signal: c } : void 0), - re(st.HEALTH, c ? { signal: c } : void 0), - re(st.HEALTH_DB, c ? { signal: c } : void 0) + re(it.HEALTH, c ? { signal: c } : void 0), + re(it.HEALTH_DB, c ? { signal: c } : void 0) ]); _ = e, v = t, y = n; try { @@ -12072,8 +12072,8 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { if (a && typeof a == "object" && (a.lastCode = _?.code || null, a.lastStatus = typeof _?.status == "number" ? _.status : null), _.ok) { let e = _.data; a && typeof a == "object" && (a._scanAuxBackoffUntil = e?.scan_active ? Date.now() + 3e4 : 0); - let i = e.total_assets || 0, o = e.with_workflows - 0, l = e.with_generation_data - 0, d = Math.max(0, Number(o || 0) || 0), m = e.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = e.tool_availability || {}, x = e.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: om(e.db_size_bytes || 0) }), C = v?.ok && v?.data && v.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Tm(v?.data || null, y?.data || null), A = Em(e, p ? "all" : u), j = !!(v?.ok && v?.data?.database?.available), M = y?.ok && y?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, ee = !!M?.maintenance_active; - am(ee); + let i = e.total_assets || 0, o = e.with_workflows - 0, l = e.with_generation_data - 0, d = Math.max(0, Number(o || 0) || 0), m = e.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = e.tool_availability || {}, x = e.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: cm(e.db_size_bytes || 0) }), C = v?.ok && v?.data && v.data.vector || {}, w = C?.enabled !== !1, T = !!C?.loaded, E = !!C?.degraded, D = String(C?.last_error || "").trim(), O = w ? E ? `AI vector: degraded${D ? ` (${D})` : ""}` : T ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", k = Dm(v?.data || null, y?.data || null), A = Om(e, p ? "all" : u), j = !!(v?.ok && v?.data?.database?.available), M = y?.ok && y?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, ee = !!M?.maintenance_active; + sm(ee); let te = Math.max(0, Number(e?.enrichment_queue_length || 0) || 0), F = Ft().active || te > 0; xt(F, te); let I = Number(i) > 0, ne = !!(e?.last_index_end || e?.last_scan_end), re = I && ne, ie = "success"; @@ -12091,15 +12091,15 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { } catch (e) { console.debug?.(e); } - let L = ae ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : p ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : pm(se, u), ce = F ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: te }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); - xm(r, g, x), Sm(r, b, g); + let L = ae ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.workflow", "Workflow") }) : p ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : hm(se, u), ce = F ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: te }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); + Cm(r, g, x), wm(r, b, g); let le = u === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : u === "input" ? R("scope.input", "Inputs") : u === "custom" ? R("scope.customBrowser", "Browser") : u === "workflow" ? R("scope.workflow", "Workflow") : R("scope.output", "Outputs"); - return ie === "error" ? (t.style.background = "var(--mjr-status-error, #f44336)", dm(s, "error"), um(n, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ + return ie === "error" ? (t.style.background = "var(--mjr-status-error, #f44336)", pm(s, "error"), fm(n, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ k, A, S, L - ].filter(Boolean).join(" | ")), e) : p ? (t.style.background = "var(--mjr-status-browser, #26A69A)", dm(s, "browser"), um(n, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), L].filter(Boolean).join(" | ")), e) : ae ? (t.style.background = "#d481c3", dm(s, oe), sm(n, [ + ].filter(Boolean).join(" | ")), e) : p ? (t.style.background = "var(--mjr-status-browser, #26A69A)", pm(s, "browser"), fm(n, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), L].filter(Boolean).join(" | ")), e) : ae ? (t.style.background = "#d481c3", pm(s, oe), lm(n, [ R("status.workflowsIndexed", `${d.toLocaleString()} workflows indexed (${le})`, { count: d.toLocaleString(), scope: le @@ -12111,19 +12111,19 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { A, S, L - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), e) : (i === 0 ? (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", dm(s, oe), um(n, R("status.noAssets", `No assets indexed yet (${le})`, { scope: le }), [ + ], R("status.lastScan", `Last scan: ${h}`, { date: h })), e) : (i === 0 ? (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", pm(s, oe), fm(n, R("status.noAssets", `No assets indexed yet (${le})`, { scope: le }), [ R("status.clickToScan", "Click the dot to start a scan"), O, k, A, S, L - ].filter(Boolean).join(" | "))) : (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", dm(s, oe), sm(n, [ + ].filter(Boolean).join(" | "))) : (t.style.background = oe === "browser" ? "var(--mjr-status-browser, #26A69A)" : ie === "info" ? "var(--mjr-status-info, #64B5F6)" : ie === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", pm(s, oe), lm(n, [ R("status.assetsIndexed", `${i.toLocaleString()} assets indexed (${le})`, { count: i.toLocaleString(), scope: le }), - Nm(e), + Fm(e), R("status.withWorkflows", `With workflows: ${o} - Generation data: ${l}`, { workflows: o, gendata: l @@ -12134,34 +12134,34 @@ async function Dm(t, n, r = null, i = null, a = null, o = {}) { A, S, L - ], R("status.lastScan", `Last scan: ${h}`, { date: h })), cm(n, lm(e, { + ], R("status.lastScan", `Last scan: ${h}`, { date: h })), um(n, dm(e, { totalAssets: i, withWorkflows: o, withGenerationData: l }))), e); } - if (xm(r, {}, {}), Sm(r, b), t.style.background = "var(--mjr-status-error, #f44336)", dm(s, "error"), _?.code === "INVALID_RESPONSE" && _?.status === 404) um(n, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); + if (Cm(r, {}, {}), wm(r, b), t.style.background = "var(--mjr-status-error, #f44336)", pm(s, "error"), _?.code === "INVALID_RESPONSE" && _?.status === 404) fm(n, R("status.apiNotFound", "Majoor API endpoints not found (404)"), R("status.apiNotFoundHint", "Backend routes are not loaded. Restart ComfyUI and check the terminal for Majoor import errors.")); else { let t = String(_?.error || "").toLowerCase(); - t.includes("malform") || t.includes("corrupt") || t.includes("disk image") ? (um(n, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, e(R("toast.resetFailedCorrupt"), "error", 8e3))) : sm(n, [_.error || R("status.errorChecking", "Error checking status")]); + t.includes("malform") || t.includes("corrupt") || t.includes("disk image") ? (fm(n, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, e(R("toast.resetFailedCorrupt"), "error", 8e3))) : lm(n, [_.error || R("status.errorChecking", "Error checking status")]); } if (_.code === "SERVICE_UNAVAILABLE") { - let e = Om(t, n, r, i); + let e = Am(t, n, r, i); n.appendChild(document.createElement("br")), n.appendChild(e); } return null; } -function Om(e, t, n = null, r = null) { +function Am(e, t, n = null, r = null) { let i = document.createElement("button"); return i.textContent = R("btn.retryServices"), i.style.cssText = "\n padding: 4px 10px;\n margin-top: 6px;\n font-size: 11px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.3);\n background: transparent;\n color: white;\n cursor: pointer;\n ", i.onclick = async () => { i.disabled = !0, i.textContent = R("btn.retrying"); - let a = await L(st.RETRY_SERVICES, {}); - i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? Dm(e, t, n, r) : (sm(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); + let a = await L(it.RETRY_SERVICES, {}); + i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? km(e, t, n, r) : (lm(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); }, i; } -function km() { +function jm() { try { - let e = localStorage?.getItem?.(nm); + let e = localStorage?.getItem?.(im); if (!e) return null; let t = JSON.parse(e); return t && typeof t == "object" ? t : null; @@ -12169,15 +12169,15 @@ function km() { return console.debug?.(e), null; } } -function Am(e) { +function Mm(e) { try { if (!e || typeof e != "object") return; - localStorage?.setItem?.(nm, JSON.stringify(e)); + localStorage?.setItem?.(im, JSON.stringify(e)); } catch (e) { console.debug?.(e); } } -function jm(e) { +function Nm(e) { let t = [], n = (e, r = 0) => { if (!(!e || r > 2)) { if (typeof e == "number" && Number.isFinite(e)) t.push(e); @@ -12190,23 +12190,23 @@ function jm(e) { }; return n(e, 0), t; } -function Mm(e) { +function Pm(e) { if (!e || typeof e != "object") return !1; - if ($p) return !0; + if (tm) return !0; try { if (Ft()?.active) return !0; } catch (e) { console.debug?.(e); } - return jm(e).some((e) => Number(e) > 0); + return Nm(e).some((e) => Number(e) > 0); } -function Nm(e) { +function Fm(e) { let t = []; e.images && t.push(`Images: ${e.images}`), e.videos && t.push(`Videos: ${e.videos}`), e.audio && t.push(`Audio: ${e.audio}`); let n = e.model3d || e.by_kind?.model3d || 0; return n && t.push(`3D: ${n}`), t.length ? t.join(" - ") : "Images: 0 - Videos: 0"; } -function Pm(e) { +function Im(e) { if (!e || typeof e != "object") return ""; let t = (e) => e == null ? null : typeof e == "number" ? Number.isFinite(e) ? e : null : typeof e == "boolean" || typeof e == "string" ? e : null; return JSON.stringify({ @@ -12224,23 +12224,23 @@ function Pm(e) { } }); } -function Fm(e, t, n) { - let r = km(); +function Lm(e, t, n) { + let r = jm(); if (!r) return !1; try { - xm(n, r.tool_availability || {}, r.tool_paths || {}); + Cm(n, r.tool_availability || {}, r.tool_paths || {}); } catch (e) { console.debug?.(e); } try { - return e.style.background = "var(--mjr-status-info, #64B5F6)", um(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; + return e.style.background = "var(--mjr-status-info, #64B5F6)", fm(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; } catch (e) { return console.debug?.(e), !1; } } -function Im(e, t, n) { - let r = Pm(t), i = r && r !== String(n?.lastSignature || ""), a = Mm(t), o = e || rm.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; - return a || i ? (o = rm.ACTIVE, s = 0) : o === rm.ACTIVE ? (o = rm.COOLDOWN, s = 0) : o === rm.COOLDOWN ? (s += 1, s >= 3 && (o = rm.IDLE, s = 0)) : (o = i ? rm.ACTIVE : rm.IDLE, s = 0), { +function Rm(e, t, n) { + let r = Im(t), i = r && r !== String(n?.lastSignature || ""), a = Pm(t), o = e || am.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; + return a || i ? (o = am.ACTIVE, s = 0) : o === am.ACTIVE ? (o = am.COOLDOWN, s = 0) : o === am.COOLDOWN ? (s += 1, s >= 3 && (o = am.IDLE, s = 0)) : (o = i ? am.ACTIVE : am.IDLE, s = 0), { nextState: o, signature: r, hasChange: i, @@ -12248,14 +12248,14 @@ function Im(e, t, n) { cooldownStablePolls: s }; } -function Lm(e, t, n, r = null, i = null, a = null) { +function zm(e, t, n, r = null, i = null, a = null) { let o = "__MJR_STATUS_POLL_DISPOSE__", s = { lastCode: null, lastStatus: null, _pollTick: 0, _auxCached: !1 }, c = { - mode: rm.ACTIVE, + mode: am.ACTIVE, cooldownStablePolls: 0, lastSignature: "" }, l = typeof AbortController < "u" ? new AbortController() : null, u = async () => { @@ -12265,14 +12265,14 @@ function Lm(e, t, n, r = null, i = null, a = null) { console.debug?.(e); } s._pollTick = Number(s._pollTick || 0) + 1; - let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await Dm(e, t, r, typeof a == "function" ? a() : null, s, { + let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await km(e, t, r, typeof a == "function" ? a() : null, s, { signal: l?.signal || null, lightweight: n, - force: !!$p || s._pollTick <= 1 + force: !!tm || s._pollTick <= 1 }); if (o && typeof o == "object") { - Am(o); - let e = Im(c.mode, o, c); + Mm(o); + let e = Rm(c.mode, o, c); c.mode = e.nextState, c.lastSignature = e.signature, c.cooldownStablePolls = e.cooldownStablePolls; } if (o && typeof i == "function") try { @@ -12282,7 +12282,7 @@ function Lm(e, t, n, r = null, i = null, a = null) { } return o; }; - Fm(e, t, r), u(); + Lm(e, t, r), u(); try { n._mjrStatusPollDispose?.(); } catch (e) { @@ -12303,7 +12303,7 @@ function Lm(e, t, n, r = null, i = null, a = null) { } return 1; }, h = () => { - let e = im[c.mode] || Math.max(250, Number(B.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); + let e = om[c.mode] || Math.max(250, Number(B.STATUS_POLL_INTERVAL) || 2e3), t = p ? Math.max(3e4, e) : f > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + f))) : e, r = Math.min(12e4, Math.round(t * m())); d = setTimeout(async () => { try { if (l?.signal?.aborted) return; @@ -12311,7 +12311,7 @@ function Lm(e, t, n, r = null, i = null, a = null) { console.debug?.(e); } let e = await u(); - if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = rm.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { + if (p = s.lastCode === "INVALID_RESPONSE" && s.lastStatus === 404, e ? f = 0 : p ? f = Math.min(999, f + 1) : (f = Math.min(999, f + 1), c.mode = am.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) try { n._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); @@ -12334,54 +12334,54 @@ function Lm(e, t, n, r = null, i = null, a = null) { } h(); for (let i of n.querySelectorAll("#mjr-status-dot, #mjr-status-scan")) i.onclick = (n) => { - n.stopPropagation(), ym(e, t, r, typeof a == "function" ? a() : null); + n.stopPropagation(), xm(e, t, r, typeof a == "function" ? a() : null); }, i.title = R("btn.scan", "Scan"); } // ui/vue/composables/useActiveAsset.ts -var Rm = gr(null), zm = gr(null); -function Bm() { +var Bm = vr(null), Vm = vr(null); +function Hm() { return { - activeAsset: Rm, - onUpdateCallback: zm + activeAsset: Bm, + onUpdateCallback: Vm }; } -function Vm(e, t) { - zm.value = typeof t == "function" ? t : null, Rm.value = e ?? null; -} -function Hm() { - Rm.value = null, zm.value = null; -} function Um(e, t) { - if (Rm.value && e) { - Rm.value = { - ...Rm.value, + Vm.value = typeof t == "function" ? t : null, Bm.value = e ?? null; +} +function Wm() { + Bm.value = null, Vm.value = null; +} +function Gm(e, t) { + if (Bm.value && e) { + Bm.value = { + ...Bm.value, ...e }; try { - let e = t ?? zm.value; - typeof e == "function" && e(Rm.value); + let e = t ?? Vm.value; + typeof e == "function" && e(Bm.value); } catch {} } } // ui/components/sidebar/SidebarView.ts -var Wm = 360, Gm = 240, Km = 640; -function qm() { +var Km = 360, qm = 240, Jm = 640; +function Ym() { try { - let e = Jt(), t = Number(e?.sidebar?.widthPx); - return Number.isFinite(t) ? Math.max(Gm, Math.min(Km, Math.round(t))) : Wm; + let e = Vn(), t = Number(e?.sidebar?.widthPx); + return Number.isFinite(t) ? Math.max(qm, Math.min(Jm, Math.round(t))) : Km; } catch { - return Wm; + return Km; } } -function Jm(e, t) { +function Xm(e, t) { if (!e) return; let n = String(e?.dataset?.position || "right").toLowerCase() === "left", r = "var(--mjr-border, rgba(255,255,255,0.12))"; if (t) { - let t = `${qm()}px`; + let t = `${Ym()}px`; e.style.flex = `0 0 ${t}`, e.style.width = t, e.style.maxWidth = t, e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = n ? "none" : `1px solid ${r}`, e.style.borderRight = n ? `1px solid ${r}` : "none"; } else e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none"; } -function Ym(e) { +function Zm(e) { if (e == null) return !1; let t = e; if (typeof e == "string") { @@ -12400,10 +12400,10 @@ function Ym(e) { } return !1; } -function Xm(e) { - return e ? !!(e.geninfo || e.prompt || Ym(e.metadata_raw)) : !1; +function Qm(e) { + return e ? !!(e.geninfo || e.prompt || Zm(e.metadata_raw)) : !1; } -async function Zm(e, t, n) { +async function $m(e, t, n) { if (!e || !t) return; let r = String(t?.kind || "").toLowerCase() === "folder"; try { @@ -12412,7 +12412,7 @@ async function Zm(e, t, n) { console.debug?.(e); } let i = e._requestSeq = (e._requestSeq || 0) + 1; - e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), Jm(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, Vm(t, n); + e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), Xm(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, Um(t, n); let a = () => { e._currentFetchAbortController?.abort?.(); let t = typeof AbortController < "u" ? new AbortController() : null; @@ -12421,7 +12421,7 @@ async function Zm(e, t, n) { e._requestSeq === i && e._currentAsset === t && (e._currentFullAsset = { ...e._currentFullAsset ?? t, ...r - }, Um(r, n)); + }, Gm(r, n)); }; (async () => { if (e._requestSeq !== i || e._currentAsset !== t) return; @@ -12443,7 +12443,7 @@ async function Zm(e, t, n) { } let c = () => e._currentFullAsset ?? t; try { - if (t.id && !Xm(c())) { + if (t.id && !Qm(c())) { let e = await I(t.id, n); if (s?.aborted) return; e?.ok && e.data && o(e.data); @@ -12452,7 +12452,7 @@ async function Zm(e, t, n) { s?.aborted || console.warn("Failed to load full asset metadata:", e); } if (!s?.aborted) { - if (!Xm(c())) { + if (!Qm(c())) { let e = String(c()?.filename || "").trim(), t = String(c()?.type || "output").trim().toLowerCase(), r = String(c()?.subfolder || "").trim(), i = String(c()?.root_id || c()?.rootId || "").trim(); if (e) try { let a = await Ee({ @@ -12481,9 +12481,9 @@ async function Zm(e, t, n) { } })(); } -function Qm(e) { +function eh(e) { if (e) { - e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), Jm(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, Hm(); + e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), Xm(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, Wm(); try { e.dispatchEvent?.(new CustomEvent("mjr:sidebar-closed", { bubbles: !0 })); } catch (e) { @@ -12492,14 +12492,14 @@ function Qm(e) { } } // ui/stores/usePanelStore.ts -var $m = "mjr_panel_state", eh = /* @__PURE__ */ new Set([ +var th = "mjr_panel_state", nh = /* @__PURE__ */ new Set([ "output", "input", "all", "custom", "workflow" ]); -function th(e, t = !1) { +function rh(e, t = !1) { if (typeof e == "boolean") return e; if (typeof e == "string") { let t = e.trim().toLowerCase(); @@ -12518,71 +12518,71 @@ function th(e, t = !1) { } return !!t; } -function nh(e, t = 0) { +function ih(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function rh(e, t = "") { +function ah(e, t = "") { return e == null ? t : String(e); } -function ih(e, t = 0, n = Infinity) { - return Math.max(t, Math.min(n, Math.floor(nh(e, t)))); +function oh(e, t = 0, n = Infinity) { + return Math.max(t, Math.min(n, Math.floor(ih(e, t)))); } -function ah(e) { - let t = rh(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; - return eh.has(n) ? n : "output"; +function sh(e) { + let t = ah(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; + return nh.has(n) ? n : "output"; } -function oh(e) { +function ch(e) { if (!e || typeof e != "object") return {}; let t = e; return { - scope: ah(t.scope), - customRootId: rh(t.customRootId), - customRootLabel: rh(t.customRootLabel), - currentFolderRelativePath: rh(t.currentFolderRelativePath || t.subfolder), - collectionId: rh(t.collectionId), - collectionName: rh(t.collectionName), - kindFilter: rh(t.kindFilter), - dateRangeFilter: rh(t.dateRangeFilter), - dateExactFilter: rh(t.dateExactFilter), - workflowOnly: th(t.workflowOnly, !1), - minRating: ih(t.minRating, 0, 5), - minSizeMB: Math.max(0, nh(t.minSizeMB, 0)), - maxSizeMB: Math.max(0, nh(t.maxSizeMB, 0)), + scope: sh(t.scope), + customRootId: ah(t.customRootId), + customRootLabel: ah(t.customRootLabel), + currentFolderRelativePath: ah(t.currentFolderRelativePath || t.subfolder), + collectionId: ah(t.collectionId), + collectionName: ah(t.collectionName), + kindFilter: ah(t.kindFilter), + dateRangeFilter: ah(t.dateRangeFilter), + dateExactFilter: ah(t.dateExactFilter), + workflowOnly: rh(t.workflowOnly, !1), + minRating: oh(t.minRating, 0, 5), + minSizeMB: Math.max(0, ih(t.minSizeMB, 0)), + maxSizeMB: Math.max(0, ih(t.maxSizeMB, 0)), resolutionCompare: t.resolutionCompare === "lte" ? "lte" : "gte", - minWidth: ih(t.minWidth), - minHeight: ih(t.minHeight), - maxWidth: ih(t.maxWidth), - maxHeight: ih(t.maxHeight), - workflowType: rh(t.workflowType), - workflowId: rh(t.workflowId || t.workflow_id), - workflowModelFilter: rh(t.workflowModelFilter || t.workflowModel || t.workflow_model), - workflowRunsOnFilter: rh(t.workflowRunsOnFilter || t.workflowRunsOn || t.runs_on), - sort: rh(t.sort || "mtime_desc"), - searchQuery: rh(t.searchQuery), + minWidth: oh(t.minWidth), + minHeight: oh(t.minHeight), + maxWidth: oh(t.maxWidth), + maxHeight: oh(t.maxHeight), + workflowType: ah(t.workflowType), + workflowId: ah(t.workflowId || t.workflow_id), + workflowModelFilter: ah(t.workflowModelFilter || t.workflowModel || t.workflow_model), + workflowRunsOnFilter: ah(t.workflowRunsOnFilter || t.workflowRunsOn || t.runs_on), + sort: ah(t.sort || "mtime_desc"), + searchQuery: ah(t.searchQuery), metadataSearchMode: String(t.metadataSearchMode || "AND").toUpperCase() === "OR" ? "OR" : "AND", - scrollTop: ih(t.scrollTop), - activeAssetId: rh(t.activeAssetId), - selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => rh(e).trim()).filter(Boolean).slice(0, 5e3) : [], - sidebarOpen: th(t.sidebarOpen, !1) + scrollTop: oh(t.scrollTop), + activeAssetId: ah(t.activeAssetId), + selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => ah(e).trim()).filter(Boolean).slice(0, 5e3) : [], + sidebarOpen: rh(t.sidebarOpen, !1) }; } -function sh() { +function lh() { try { - let e = localStorage.getItem($m); - if (e) return oh(JSON.parse(e)); + let e = localStorage.getItem(th); + if (e) return ch(JSON.parse(e)); } catch {} return {}; } -function ch(e) { +function uh(e) { try { let t = { ...e }; - delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem($m, JSON.stringify(t)); + delete t.lastGridCount, delete t.lastGridTotal, delete t.viewScope, delete t.similarResults, delete t.similarTitle, delete t.similarSourceAssetId, localStorage.setItem(th, JSON.stringify(t)); } catch {} } -var lh = Ar("mjr-panel", () => { - let e = sh(), t = Q(e.scope || "output"), n = Q(e.customRootId || ""), r = Q(e.customRootLabel || ""), i = Q(e.currentFolderRelativePath || ""), a = Q(e.collectionId || ""), o = Q(e.collectionName || ""), s = Q(e.kindFilter || ""), c = Q(e.dateRangeFilter || ""), l = Q(e.dateExactFilter || ""), u = Q(e.workflowOnly || !1), d = Q(e.minRating || 0), f = Q(e.minSizeMB || 0), p = Q(e.maxSizeMB || 0), m = Q(e.resolutionCompare || "gte"), h = Q(e.minWidth || 0), g = Q(e.minHeight || 0), _ = Q(e.maxWidth || 0), v = Q(e.maxHeight || 0), y = Q(e.workflowType || ""), b = Q(e.workflowId || ""), x = Q(e.workflowModelFilter || ""), S = Q(e.workflowRunsOnFilter || ""), C = Q(e.sort || "mtime_desc"), w = Q(e.searchQuery || ""), T = Q(e.metadataSearchMode || "AND"), E = Q(e.scrollTop || 0), D = Q(e.activeAssetId || ""), O = Q(e.selectedAssetIds || []), k = Q(e.sidebarOpen || !1), A = Q(0), j = Q(0), M = Q(""), N = Q([]), P = Q(""), ee = Q(""), te = null; - or([ +var dh = Mr("mjr-panel", () => { + let e = lh(), t = Q(e.scope || "output"), n = Q(e.customRootId || ""), r = Q(e.customRootLabel || ""), i = Q(e.currentFolderRelativePath || ""), a = Q(e.collectionId || ""), o = Q(e.collectionName || ""), s = Q(e.kindFilter || ""), c = Q(e.dateRangeFilter || ""), l = Q(e.dateExactFilter || ""), u = Q(e.workflowOnly || !1), d = Q(e.minRating || 0), f = Q(e.minSizeMB || 0), p = Q(e.maxSizeMB || 0), m = Q(e.resolutionCompare || "gte"), h = Q(e.minWidth || 0), g = Q(e.minHeight || 0), _ = Q(e.maxWidth || 0), v = Q(e.maxHeight || 0), y = Q(e.workflowType || ""), b = Q(e.workflowId || ""), x = Q(e.workflowModelFilter || ""), S = Q(e.workflowRunsOnFilter || ""), C = Q(e.sort || "mtime_desc"), w = Q(e.searchQuery || ""), T = Q(e.metadataSearchMode || "AND"), E = Q(e.scrollTop || 0), D = Q(e.activeAssetId || ""), O = Q(e.selectedAssetIds || []), k = Q(e.sidebarOpen || !1), A = Q(0), j = Q(0), M = Q(""), N = Q([]), P = Q(""), ee = Q(""), te = null; + cr([ t, n, r, @@ -12614,7 +12614,7 @@ var lh = Ar("mjr-panel", () => { k ], () => { te && clearTimeout(te), te = setTimeout(() => { - te = null, ch({ + te = null, uh({ scope: t.value, customRootId: n.value, customRootLabel: r.value, @@ -12648,15 +12648,15 @@ var lh = Ar("mjr-panel", () => { }, 750); }, { deep: !0 }); let F = (e) => { - if (e.key === $m && e.newValue) try { - let n = oh(JSON.parse(e.newValue)); + if (e.key === th && e.newValue) try { + let n = ch(JSON.parse(e.newValue)); n.scope !== void 0 && (t.value = n.scope), n.customRootLabel !== void 0 && (r.value = n.customRootLabel), n.searchQuery !== void 0 && (w.value = n.searchQuery), n.metadataSearchMode !== void 0 && (T.value = n.metadataSearchMode), n.sort !== void 0 && (C.value = n.sort), n.sidebarOpen !== void 0 && (k.value = n.sidebarOpen); } catch {} }; try { window.addEventListener("storage", F); } catch {} - Cr(() => { + Tr(() => { try { window.removeEventListener("storage", F); } catch {} @@ -12729,16 +12729,16 @@ var lh = Ar("mjr-panel", () => { }; }); // ui/stores/getOptionalPanelStore.ts -function uh() { +function fh() { try { - return jr() ? lh() : null; + return Nr() ? dh() : null; } catch { return null; } } // ui/stores/panelStateBridge.ts -function dh(e, t = []) { - let n = uh(); +function ph(e, t = []) { + let n = fh(); return { panelStore: n, hydrateStoreFromLegacy: () => {}, @@ -12765,12 +12765,12 @@ function dh(e, t = []) { }; } // ui/features/panel/messages/messageCenter.ts -var fh = "mjr_panel_messages_v1", ph = "mjr_panel_messages_last_read_v1", mh = "mjr_panel_messages_dismissed_builtin_ids_v1", hh = 120, gh = "/mjr/am/user-guide", _h = /* @__PURE__ */ new Set([ +var mh = "mjr_panel_messages_v1", hh = "mjr_panel_messages_last_read_v1", gh = "mjr_panel_messages_dismissed_builtin_ids_v1", _h = 120, vh = "/mjr/am/user-guide", yh = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" -]), vh = "mjr:panel-messages-changed", yh = !1, bh = [], xh = Object.freeze([ +]), bh = "mjr:panel-messages-changed", xh = !1, Sh = [], Ch = Object.freeze([ { id: "whats-new-2026-07-09-version-2-5-0", title: "New Version 2.5.0", @@ -12893,7 +12893,7 @@ var fh = "mjr_panel_messages_v1", ph = "mjr_panel_messages_last_read_v1", mh = " bodyKey: "msg.whatsNew.body.localUserGuide", actionLabel: "User Guide", actionLabelKey: "label.userGuide", - actionUrl: gh + actionUrl: vh }, { id: "tip-2026-04-07-output-folder-override", @@ -13075,27 +13075,27 @@ var fh = "mjr_panel_messages_v1", ph = "mjr_panel_messages_last_read_v1", mh = " actionLabelKey: "label.settingsGuide", actionUrl: "docs/SETTINGS_CONFIGURATION.md" } -]), Sh = new Set(xh.map((e) => String(e?.id || "").trim()).filter(Boolean)); -function Ch(e, t = 0) { +]), wh = new Set(Ch.map((e) => String(e?.id || "").trim()).filter(Boolean)); +function Th(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function wh() { +function Eh() { return Date.now(); } -function Th() { - return lt(`msg-${wh()}-`, 6); +function Dh() { + return Me(`msg-${Eh()}-`, 6); } -function Eh(e) { +function Oh(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : _h.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : yh.has(t) ? t : "info"; } -function Dh(e) { - return Sh.has(String(e || "").trim()); +function kh(e) { + return wh.has(String(e || "").trim()); } -function Oh(e = {}) { +function Ah(e = {}) { return { - id: String(e?.id || "").trim() || Th(), + id: String(e?.id || "").trim() || Dh(), title: String(e?.title || "").trim() || "Info", titleKey: String(e?.titleKey || "").trim(), emoji: String(e?.emoji || "").trim(), @@ -13103,14 +13103,14 @@ function Oh(e = {}) { bodyKey: String(e?.bodyKey || "").trim(), category: String(e?.category || "").trim() || "Info", categoryKey: String(e?.categoryKey || "").trim(), - createdAt: Ch(e?.createdAt, wh()), - level: Eh(e?.level), + createdAt: Th(e?.createdAt, Eh()), + level: Oh(e?.level), actionLabel: String(e?.actionLabel || "").trim(), actionLabelKey: String(e?.actionLabelKey || "").trim(), actionUrl: String(e?.actionUrl || "").trim() }; } -function kh(e, t) { +function jh(e, t) { try { let n = localStorage.getItem(e); return n ? JSON.parse(n) : t; @@ -13118,87 +13118,87 @@ function kh(e, t) { return t; } } -function Ah(e, t) { +function Mh(e, t) { try { localStorage.setItem(e, JSON.stringify(t)); } catch {} } -function jh() { +function Nh() { try { - return Ch(localStorage.getItem(ph), 0); + return Th(localStorage.getItem(hh), 0); } catch { return 0; } } -function Mh(e) { +function Ph(e) { try { - localStorage.setItem(ph, String(Ch(e, wh()))); + localStorage.setItem(hh, String(Th(e, Eh()))); } catch {} } -function Nh() { - let e = kh(mh, []); - return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => Dh(e))); -} -function Ph() { - bh.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), bh.length > hh && (bh = bh.slice(0, hh)); -} function Fh() { - Ah(fh, bh); + let e = jh(gh, []); + return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => kh(e))); } function Ih() { - let e = Nh(), t = !1; - for (let n of xh) { - let r = Oh(n); - if (e.has(r.id)) continue; - let i = bh.findIndex((e) => e.id === r.id); - if (i < 0) { - bh.push(r), t = !0; - continue; - } - let a = bh[i], o = { - ...a, - ...r, - createdAt: Ch(a?.createdAt, r.createdAt) - }; - JSON.stringify(a) !== JSON.stringify(o) && (bh[i] = o, t = !0); - } - return t ? (Ph(), Fh(), !0) : !1; + Sh.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), Sh.length > _h && (Sh = Sh.slice(0, _h)); } function Lh() { + Mh(mh, Sh); +} +function Rh() { + let e = Fh(), t = !1; + for (let n of Ch) { + let r = Ah(n); + if (e.has(r.id)) continue; + let i = Sh.findIndex((e) => e.id === r.id); + if (i < 0) { + Sh.push(r), t = !0; + continue; + } + let a = Sh[i], o = { + ...a, + ...r, + createdAt: Th(a?.createdAt, r.createdAt) + }; + JSON.stringify(a) !== JSON.stringify(o) && (Sh[i] = o, t = !0); + } + return t ? (Ih(), Lh(), !0) : !1; +} +function zh() { try { - window.dispatchEvent(new CustomEvent(vh, { detail: { - total: bh.length, - unread: Vh() + window.dispatchEvent(new CustomEvent(bh, { detail: { + total: Sh.length, + unread: Uh() } })); } catch (e) { console.debug?.(e); } } -function Rh() { - if (yh) return; - yh = !0; - let e = kh(fh, []); - bh = (Array.isArray(e) ? e : []).map(Oh), Ph(); -} -function zh() { - Rh(), Ih() && Lh(); -} function Bh() { - return Rh(), bh.map((e) => ({ ...e })); + if (xh) return; + xh = !0; + let e = jh(mh, []); + Sh = (Array.isArray(e) ? e : []).map(Ah), Ih(); } function Vh() { - Rh(); - let e = jh(); - return bh.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); + Bh(), Rh() && zh(); } function Hh() { - return Rh(), jh(); + return Bh(), Sh.map((e) => ({ ...e })); } -function Uh({ upTo: e = wh() } = {}) { - Rh(), Mh(Ch(e, wh())), Lh(); +function Uh() { + Bh(); + let e = Nh(); + return Sh.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); +} +function Wh() { + return Bh(), Nh(); +} +function Gh({ upTo: e = Eh() } = {}) { + Bh(), Ph(Th(e, Eh())), zh(); } // ui/features/panel/messages/shortcutGuide.ts -var Wh = Object.freeze([ +var Kh = Object.freeze([ { id: "panel", titleKey: "msg.shortcuts.section.panel", @@ -13407,18 +13407,18 @@ var Wh = Object.freeze([ ]) } ]); -function Gh() { - return Wh.map((e) => ({ +function qh() { + return Kh.map((e) => ({ ...e, items: Array.isArray(e.items) ? e.items.map((e) => ({ ...e })) : [] })); } -function Kh() { +function Jh() { let e = document.createElement("div"); e.className = "mjr-shortcut-guide"; let t = document.createElement("div"); t.className = "mjr-shortcut-guide-intro", t.textContent = R("msg.shortcuts.intro", "Current keyboard shortcuts grouped by section for quick reference."), e.appendChild(t); - for (let t of Gh()) { + for (let t of qh()) { let n = document.createElement("section"); n.className = "mjr-shortcut-section"; let r = document.createElement("div"); @@ -13438,18 +13438,18 @@ function Kh() { return e; } // ui/features/panel/messages/messagePopoverController.ts -var qh = /* @__PURE__ */ new Set([ +var Yh = /* @__PURE__ */ new Set([ "info", "success", "warning", "error" -]), Jh = 2200, Yh = /* @__PURE__ */ new Set([ +]), Xh = 2200, Zh = /* @__PURE__ */ new Set([ "started", "queued", "running", "pending", "in_progress" -]), Xh = /* @__PURE__ */ new Set([ +]), Qh = /* @__PURE__ */ new Set([ "succeeded", "success", "complete", @@ -13460,7 +13460,7 @@ var qh = /* @__PURE__ */ new Set([ "cancelled", "canceled" ]); -function Zh(e) { +function $h(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return ""; try { @@ -13475,15 +13475,15 @@ function Zh(e) { return ""; } } -function Qh(e, t, n, r) { +function eg(e, t, n, r) { let i = String(e?.[t] || "").trim(), a = String(e?.[n] || r || "").trim() || String(r || ""); return i ? R(i, a) : a; } -function $h(e) { +function tg(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : qh.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : Yh.has(t) ? t : "info"; } -function eg(e) { +function ng(e) { let t = String(e || "").trim(); if (!t) return ""; try { @@ -13493,13 +13493,13 @@ function eg(e) { return ""; } } -function tg(e) { +function rg(e) { let t = String(e?.emoji || "").trim(); if (t) return t; - let n = $h(e?.level); + let n = tg(e?.level); return n === "success" ? "OK" : n === "warning" ? "WARN" : n === "error" ? "ERR" : "INFO"; } -function ng(e) { +function ig(e) { switch (String(e || "").toLowerCase()) { case "success": return "OK"; case "warning": return "WARN"; @@ -13507,22 +13507,22 @@ function ng(e) { default: return "Tip"; } } -function rg(e) { +function ag(e) { if (e?.persistent) return "persistent"; let t = Number(e?.durationMs); return !Number.isFinite(t) || t <= 0 ? "" : t < 1e4 ? `${(t / 1e3).toFixed(1)}s` : `${Math.round(t / 1e3)}s`; } -function ig(e) { +function og(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.replace(/[_-]+/g, " ") : ""; } -function ag(e) { +function sg(e) { let t = e?.progress; if (!t || typeof t != "object") return ""; let n = String(t.label || "").trim(), r = Number(t.current), i = Number(t.total), a = Number(t.indexed), o = Number(t.skipped), s = Number(t.errors), c = []; return n && c.push(n), Number.isFinite(r) && Number.isFinite(i) && i > 0 && c.push(`${r}/${i}`), Number.isFinite(a) && c.push(`indexed ${a}`), Number.isFinite(o) && c.push(`skipped ${o}`), Number.isFinite(s) && s > 0 && c.push(`errors ${s}`), c.join(" | "); } -function og(e) { +function cg(e) { let t = e?.progress; if (!t || typeof t != "object") return null; let n = Number(t.percent); @@ -13530,14 +13530,14 @@ function og(e) { let r = Number(t.current), i = Number(t.total); return Number.isFinite(r) && Number.isFinite(i) && i > 0 ? Math.max(0, Math.min(100, Math.round(r / i * 100))) : null; } -function sg(e) { +function lg(e) { return String(e?.trackId || "").trim() || [ String(e?.operation || "").trim(), String(e?.source || "").trim(), String(e?.title || "").trim() ].filter(Boolean).join(":"); } -function cg({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: r = null, historyTabBtn: i = null, shortcutsTabBtn: a = null, messageList: o = null, historyPanel: s = null, shortcutsPanel: c = null, markReadBtn: l = null } = {}) { +function ug({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: r = null, historyTabBtn: i = null, shortcutsTabBtn: a = null, messageList: o = null, historyPanel: s = null, shortcutsPanel: c = null, markReadBtn: l = null } = {}) { let u = e === "messages", d = e === "history", f = e === "shortcuts", p = u ? R("label.messages", "Messages") : d ? R("label.toastHistory", "History") : R("msg.shortcuts.title", "Shortcut Guide"); try { r?.classList.toggle("is-active", u), r?.setAttribute("aria-selected", u ? "true" : "false"), r?.setAttribute("tabindex", u ? "0" : "-1"), i?.classList.toggle("is-active", d), i?.setAttribute("aria-selected", d ? "true" : "false"), i?.setAttribute("tabindex", d ? "0" : "-1"), a?.classList.toggle("is-active", f), a?.setAttribute("aria-selected", f ? "true" : "false"), a?.setAttribute("tabindex", f ? "0" : "-1"); @@ -13550,8 +13550,8 @@ function cg({ activeTab: e = "messages", title: t = null, messagePopover: n = nu console.debug?.(e); } } -function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, messageList: r = null, historyTabBtn: i = null, historyTabBadge: a = null, historyTabCount: o = null, historyPanel: s = null, shortcutsPanel: c = null, messageTabBtn: l = null, messageTabBadge: u = null, shortcutsTabBtn: d = null, markReadBtn: f = null, popovers: p = null, onBeforeToggle: m = null, signal: h = null } = {}) { - zh(); +function dg({ messageBtn: e = null, messagePopover: t = null, title: n = null, messageList: r = null, historyTabBtn: i = null, historyTabBadge: a = null, historyTabCount: o = null, historyPanel: s = null, shortcutsPanel: c = null, messageTabBtn: l = null, messageTabBadge: u = null, shortcutsTabBtn: d = null, markReadBtn: f = null, popovers: p = null, onBeforeToggle: m = null, signal: h = null } = {}) { + Vh(); let g = "messages", _ = !1, v = null, y = /* @__PURE__ */ new Set(), b = () => { if (v) { try { @@ -13565,13 +13565,13 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m if (!_ || g !== "history" || t?.style?.display !== "block") return; let e = ae(); for (let n of e) { - let e = sg(n); + let e = lg(n); if (!e || !y.has(e)) continue; let r = String(n?.status || "").trim().toLowerCase(); - if (Xh.has(r)) { + if (Qh.has(r)) { b(), v = setTimeout(() => { v = null, _ && g === "history" && t?.style?.display === "block" && (p?.close?.(t), _ = !1, y.clear(), S(), k()); - }, Jh); + }, Xh); return; } } @@ -13589,14 +13589,14 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } }, C = () => { if (!r) return; - let e = Bh(), t = Hh(); + let e = Hh(), t = Wh(); if (r.replaceChildren(), !e.length) { let e = document.createElement("div"); e.className = "mjr-messages-empty", e.textContent = R("msg.noMessages", "No messages for now."), r.appendChild(e); } else for (let n of e) { let e = document.createElement("article"); e.className = "mjr-message-item"; - let i = $h(n?.level); + let i = tg(n?.level); e.classList.add(`mjr-message-item--${i}`); let a = Number(n?.createdAt || 0); a > Number(t || 0) && e.classList.add("mjr-message-item--unread"); @@ -13605,16 +13605,16 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let s = document.createElement("div"); s.className = "mjr-message-item-title-wrap"; let c = document.createElement("span"); - c.className = "mjr-message-item-emoji", c.textContent = tg(n), c.setAttribute("aria-hidden", "true"); + c.className = "mjr-message-item-emoji", c.textContent = rg(n), c.setAttribute("aria-hidden", "true"); let l = document.createElement("div"); - l.className = "mjr-message-item-title", l.textContent = Qh(n, "titleKey", "title", R("label.info", "Info")); + l.className = "mjr-message-item-title", l.textContent = eg(n, "titleKey", "title", R("label.info", "Info")); let u = document.createElement("span"); - u.className = "mjr-message-item-category", u.textContent = Qh(n, "categoryKey", "category", R("label.info", "Info")), s.appendChild(c), s.appendChild(l), o.appendChild(s), o.appendChild(u); + u.className = "mjr-message-item-category", u.textContent = eg(n, "categoryKey", "category", R("label.info", "Info")), s.appendChild(c), s.appendChild(l), o.appendChild(s), o.appendChild(u); let d = document.createElement("div"); - d.className = "mjr-message-item-meta", d.textContent = Zh(a); + d.className = "mjr-message-item-meta", d.textContent = $h(a); let f = document.createElement("div"); - f.className = "mjr-message-item-body", f.textContent = Qh(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); - let p = eg(n?.actionUrl), m = Qh(n, "actionLabelKey", "actionLabel", R("label.readMe", "Read Me")); + f.className = "mjr-message-item-body", f.textContent = eg(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); + let p = ng(n?.actionUrl), m = eg(n, "actionLabelKey", "actionLabel", R("label.readMe", "Read Me")); if (p && m) { let t = document.createElement("a"); t.className = "mjr-message-item-action", t.href = p, t.target = "_blank", t.rel = "noopener noreferrer", t.textContent = m, e.appendChild(t); @@ -13641,7 +13641,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let e = document.createElement("div"); e.className = `mjr-history-item mjr-history-item--${String(n.type || "info")}`; let r = document.createElement("span"); - r.className = "mjr-history-item-icon", r.textContent = ng(n.type), r.setAttribute("aria-hidden", "true"); + r.className = "mjr-history-item-icon", r.textContent = ig(n.type), r.setAttribute("aria-hidden", "true"); let i = document.createElement("div"); i.className = "mjr-history-item-content"; let a = String(n.title || "").trim(), o = String(n.detail || "").trim(), s = String(n.message || "").trim(), c = a || s, l = a && o ? o : a ? "" : o, u = document.createElement("div"); @@ -13651,14 +13651,14 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let f = document.createElement("div"); f.className = "mjr-history-item-meta"; let p = document.createElement("span"); - p.className = "mjr-history-item-time", p.textContent = Zh(n.createdAt); + p.className = "mjr-history-item-time", p.textContent = $h(n.createdAt); let m = document.createElement("span"); - m.className = "mjr-history-item-chip", m.textContent = rg(n); + m.className = "mjr-history-item-chip", m.textContent = ag(n); let h = document.createElement("span"); h.className = "mjr-history-item-chip", h.textContent = String(n.source || "").trim(); let g = document.createElement("span"); - g.className = "mjr-history-item-chip", g.textContent = ig(n.status), i.appendChild(u), d.textContent && i.appendChild(d), p.textContent && f.appendChild(p), m.textContent && f.appendChild(m), g.textContent && f.appendChild(g), h.textContent && f.appendChild(h), f.childNodes.length && i.appendChild(f); - let _ = ag(n), v = og(n); + g.className = "mjr-history-item-chip", g.textContent = og(n.status), i.appendChild(u), d.textContent && i.appendChild(d), p.textContent && f.appendChild(p), m.textContent && f.appendChild(m), g.textContent && f.appendChild(g), h.textContent && f.appendChild(h), f.childNodes.length && i.appendChild(f); + let _ = sg(n), v = cg(n); if (_ || v !== null) { let e = document.createElement("div"); if (e.className = "mjr-history-item-progress", _) { @@ -13673,7 +13673,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } i.appendChild(e); } - let y = eg(n?.actionUrl), b = String(n?.actionLabel || "").trim(); + let y = ng(n?.actionUrl), b = String(n?.actionLabel || "").trim(); if (y && b) { let e = document.createElement("a"); e.className = "mjr-history-item-action", e.href = y, e.target = "_blank", e.rel = "noopener noreferrer", e.textContent = b, i.appendChild(e); @@ -13688,13 +13688,13 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m let e = _e(); a && (a.style.display = e > 0 ? "inline-block" : "none"), T(o, e); }, D = () => { - c && (c.childNodes.length > 0 || c.replaceChildren(Kh())); + c && (c.childNodes.length > 0 || c.replaceChildren(Jh())); }, O = () => { if (!f) return; - let e = Math.max(0, Number(Vh() || 0) || 0); + let e = Math.max(0, Number(Uh() || 0) || 0); f.disabled = e <= 0, f.title = e > 0 ? R("tooltip.markMessagesRead", "Mark all messages as read") : R("tooltip.noUnreadMessages", "No unread messages"); }, k = () => { - let t = Math.max(0, Number(Vh() || 0) || 0); + let t = Math.max(0, Number(Uh() || 0) || 0); if (e) { let n = e.querySelector(".mjr-message-badge"), r = t > 0 ? R("tooltip.openMessagesUnread", "Messages ({count} unread)", { count: t }) : R("tooltip.openMessages", "Messages and updates"); e.classList.toggle("mjr-message-has-unread", t > 0), e.title = r, e.setAttribute("aria-label", r), n && (t <= 0 ? (n.style.display = "none", n.textContent = "") : (n.style.display = "inline-flex", n.textContent = t > 9 ? "9+" : String(t))); @@ -13704,7 +13704,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m k(), E(), t?.style?.display === "block" && (g === "messages" && C(), g === "history" && w()); }, M = h ? { signal: h } : void 0; try { - window.addEventListener(vh, j, M); + window.addEventListener(bh, j, M); } catch (e) { console.debug?.(e); } @@ -13712,8 +13712,8 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m window.addEventListener(be, () => { if (E(), t?.style?.display === "block" && g === "history" && w(), _) { for (let e of ae()) { - let t = String(e?.status || "").trim().toLowerCase(), n = sg(e); - n && Yh.has(t) && y.add(n); + let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); + n && Zh.has(t) && y.add(n); } x(); } @@ -13740,7 +13740,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } catch (e) { console.debug?.(e); } - k(), E(), S(), cg({ + k(), E(), S(), ug({ activeTab: g, title: n, messagePopover: t, @@ -13753,7 +13753,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m markReadBtn: f }); let P = () => { - g = "messages", cg({ + g = "messages", ug({ activeTab: g, title: n, messagePopover: t, @@ -13764,9 +13764,9 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m historyPanel: s, shortcutsPanel: c, markReadBtn: f - }), C(), Uh(), k(); + }), C(), Gh(), k(); }, ee = () => { - g = "history", cg({ + g = "history", ug({ activeTab: g, title: n, messagePopover: t, @@ -13779,7 +13779,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m markReadBtn: f }), w(), A(), E(); }, te = () => { - g = "shortcuts", cg({ + g = "shortcuts", ug({ activeTab: g, title: n, messagePopover: t, @@ -13805,8 +13805,8 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } ee(), _ = !0, b(), y.clear(); for (let e of ae()) { - let t = String(e?.status || "").trim().toLowerCase(), n = sg(e); - n && Yh.has(t) && y.add(n); + let t = String(e?.status || "").trim().toLowerCase(), n = lg(e); + n && Zh.has(t) && y.add(n); } x(), S(), k(); } @@ -13838,7 +13838,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m }; return e?.addEventListener("click", (a) => { if (t && p && e) { - a.stopPropagation(), _ = !1, y.clear(), b(), g = "messages", C(), D(), cg({ + a.stopPropagation(), _ = !1, y.clear(), b(), g = "messages", C(), D(), ug({ activeTab: g, title: n, messagePopover: t, @@ -13855,7 +13855,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m } catch (e) { console.debug?.(e); } - p.toggle(t, e), t?.style?.display === "block" && Uh(), S(), k(); + p.toggle(t, e), t?.style?.display === "block" && Gh(), S(), k(); } }, M), l?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), P(); @@ -13864,7 +13864,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m }, M), i?.addEventListener("keydown", (e) => re(e, "history"), M), d?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), te(); }, M), d?.addEventListener("keydown", (e) => re(e, "shortcuts"), M), f?.addEventListener("click", (e) => { - e.preventDefault(), e.stopPropagation(), Uh(), C(), k(); + e.preventDefault(), e.stopPropagation(), Gh(), C(), k(); }, M), { refresh: j, render: C, @@ -13879,7 +13879,7 @@ function lg({ messageBtn: e = null, messagePopover: t = null, title: n = null, m }; } // ui/features/panel/controllers/query.ts -function ug(e) { +function fg(e) { let t = e; for (let e = 0; e < 3 && t && typeof t == "object" && "value" in t; e += 1) { let e = t.value; @@ -13888,8 +13888,8 @@ function ug(e) { } return t; } -function dg(e) { - let t = ug(e); +function pg(e) { + let t = fg(e); if (!t) return null; let n = String(t?.tagName || "").toUpperCase(); if (n === "INPUT" || n === "TEXTAREA") return t; @@ -13903,13 +13903,13 @@ function dg(e) { } return null; } -function fg(e) { - let t = dg(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; +function mg(e) { + let t = pg(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; return String(n || "").trim() || "*"; } // ui/features/panel/controllers/gridController.ts -function pg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollectionAssets: i, disposeGrid: a, getQuery: o, searchInputEl: s, state: c }) { - let { read: l, write: u } = dh(c, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), f = !1, p = !1, m = {}, h = 0, g = 0, _ = 3e4, v = async (e, t = _) => { +function hg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollectionAssets: i, disposeGrid: a, getQuery: o, searchInputEl: s, state: c }) { + let { read: l, write: u } = ph(c, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), f = !1, p = !1, m = {}, h = 0, g = 0, _ = 3e4, v = async (e, t = _) => { let n = null; try { let r = new Promise((e, r) => { @@ -13930,7 +13930,7 @@ function pg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollect } }, b = () => { try { - return !!(Jt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -14134,8 +14134,8 @@ function pg({ gridContainer: t, loadAssets: n, loadAssetsFromList: r, getCollect }) }; } // ui/features/panel/controllers/browserNavigationController.ts -function mg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: r = null, customSelect: i, reloadGrid: a, clearSelection: o = null, onContextChanged: s = null, lifecycleSignal: c = null } = {}) { - let { read: l, write: u } = dh(e, [ +function gg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: r = null, customSelect: i, reloadGrid: a, clearSelection: o = null, onContextChanged: s = null, lifecycleSignal: c = null } = {}) { + let { read: l, write: u } = ph(e, [ "scope", "customRootId", "currentFolderRelativePath" @@ -14368,8 +14368,8 @@ function mg({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbC }; } // ui/features/panel/controllers/scopeController.ts -function hg({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popovers: i, reloadGrid: a, reconcileSelection: o = null, onChanged: s = null, onScopeChanged: c = null, onBeforeReload: l = null }) { - let u = 0, { panelStore: d, read: f, write: p, controllerState: m } = dh(e, [ +function _g({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popovers: i, reloadGrid: a, reconcileSelection: o = null, onChanged: s = null, onScopeChanged: c = null, onBeforeReload: l = null }) { + let u = 0, { panelStore: d, read: f, write: p, controllerState: m } = ph(e, [ "scope", "customRootId", "currentFolderRelativePath", @@ -14484,21 +14484,21 @@ function hg({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popov }; } // ui/features/panel/controllers/contextController.ts -var gg = (e, t) => { +var vg = (e, t) => { if (e) try { e.value = t; } catch (e) { console.debug?.(e); } -}, _g = (e, t) => { +}, yg = (e, t) => { if (e) try { e.checked = !!t; } catch (e) { console.debug?.(e); } }; -function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, workflowModelInput: u, workflowRunsOnSelect: d, ratingSelect: f, minSizeInput: p, maxSizeInput: m, minWidthInput: h, minHeightInput: g, maxWidthInput: _, maxHeightInput: v, resolutionPresetSelect: y, dateRangeSelect: b, dateExactInput: x, scopeController: S, sortController: C, updateSummaryBar: w, reloadGrid: T, extraActions: E = null, getExtraContext: D = null } = {}) { - let O = e && typeof e == "object" ? e : {}, { read: k, write: A, controllerState: j } = dh(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), M = (e, t) => { +function bg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, workflowModelInput: u, workflowRunsOnSelect: d, ratingSelect: f, minSizeInput: p, maxSizeInput: m, minWidthInput: h, minHeightInput: g, maxWidthInput: _, maxHeightInput: v, resolutionPresetSelect: y, dateRangeSelect: b, dateExactInput: x, scopeController: S, sortController: C, updateSummaryBar: w, reloadGrid: T, extraActions: E = null, getExtraContext: D = null } = {}) { + let O = e && typeof e == "object" ? e : {}, { read: k, write: A, controllerState: j } = ph(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.workflowModelFilter.workflowRunsOnFilter.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), M = (e, t) => { A(e, t); }, N = (e, t = "") => k(e, t), P = () => ({ ...O || {}, @@ -14521,7 +14521,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, F = { clearQuery: async () => { try { - gg(a, ""), M("searchQuery", ""); + vg(a, ""), M("searchQuery", ""); } catch (e) { console.debug?.(e); } @@ -14590,7 +14590,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearKind: async () => { try { - M("kindFilter", ""), gg(o, ""); + M("kindFilter", ""), vg(o, ""); } catch (e) { console.debug?.(e); } @@ -14602,7 +14602,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearMinRating: async () => { try { - M("minRating", 0), gg(f, "0"); + M("minRating", 0), vg(f, "0"); } catch (e) { console.debug?.(e); } @@ -14614,7 +14614,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowOnly: async () => { try { - M("workflowOnly", !1), _g(s, !1); + M("workflowOnly", !1), yg(s, !1); } catch (e) { console.debug?.(e); } @@ -14626,7 +14626,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowType: async () => { try { - M("workflowType", ""), gg(c, ""); + M("workflowType", ""), vg(c, ""); } catch (e) { console.debug?.(e); } @@ -14638,7 +14638,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowId: async () => { try { - M("workflowId", ""), gg(l, ""); + M("workflowId", ""), vg(l, ""); } catch (e) { console.debug?.(e); } @@ -14650,7 +14650,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowModel: async () => { try { - M("workflowModelFilter", ""), gg(u, ""); + M("workflowModelFilter", ""), vg(u, ""); } catch (e) { console.debug?.(e); } @@ -14662,7 +14662,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearWorkflowRunsOn: async () => { try { - M("workflowRunsOnFilter", ""), gg(d, ""); + M("workflowRunsOnFilter", ""), vg(d, ""); } catch (e) { console.debug?.(e); } @@ -14674,7 +14674,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearSize: async () => { try { - M("minSizeMB", 0), M("maxSizeMB", 0), gg(p, ""), gg(m, ""); + M("minSizeMB", 0), M("maxSizeMB", 0), vg(p, ""), vg(m, ""); } catch (e) { console.debug?.(e); } @@ -14686,7 +14686,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearResolution: async () => { try { - M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), gg(h, ""), gg(g, ""), gg(_, ""), gg(v, ""), gg(y, ""); + M("minWidth", 0), M("minHeight", 0), M("maxWidth", 0), M("maxHeight", 0), vg(h, ""), vg(g, ""), vg(_, ""), vg(v, ""), vg(y, ""); } catch (e) { console.debug?.(e); } @@ -14698,7 +14698,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearDateRange: async () => { try { - M("dateRangeFilter", ""), gg(b, ""); + M("dateRangeFilter", ""), vg(b, ""); } catch (e) { console.debug?.(e); } @@ -14710,7 +14710,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }, clearDateExact: async () => { try { - M("dateExactFilter", ""), gg(x, ""); + M("dateExactFilter", ""), vg(x, ""); } catch (e) { console.debug?.(e); } @@ -14735,7 +14735,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB clearAll: async () => { let e = !1; try { - gg(a, ""); + vg(a, ""); } catch (e) { console.debug?.(e); } @@ -14751,7 +14751,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB console.debug?.(e); } try { - gg(o, ""), _g(s, !1), gg(c, ""), gg(l, ""), gg(u, ""), gg(d, ""), gg(f, "0"), gg(p, ""), gg(m, ""), gg(h, ""), gg(g, ""), gg(_, ""), gg(v, ""), gg(y, ""), gg(b, ""), gg(x, ""); + vg(o, ""), yg(s, !1), vg(c, ""), vg(l, ""), vg(u, ""), vg(d, ""), vg(f, "0"), vg(p, ""), vg(m, ""), vg(h, ""), vg(g, ""), vg(_, ""), vg(v, ""), vg(y, ""), vg(b, ""), vg(x, ""); } catch (e) { console.debug?.(e); } @@ -14777,7 +14777,7 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB } return { update: () => { - let e = String(a?.value || "").trim(), o = fg(a), s = P(), c = !!(N("kindFilter", "") || N("workflowOnly", !1) || (Number(N("minRating", 0) || 0) || 0) > 0 || (Number(N("minSizeMB", 0) || 0) || 0) > 0 || (Number(N("maxSizeMB", 0) || 0) || 0) > 0 || (Number(N("minWidth", 0) || 0) || 0) > 0 || (Number(N("minHeight", 0) || 0) || 0) > 0 || (Number(N("maxWidth", 0) || 0) || 0) > 0 || (Number(N("maxHeight", 0) || 0) || 0) > 0 || String(N("workflowType", "") || "").trim().length > 0 || String(N("workflowId", "") || "").trim().length > 0 || String(N("workflowModelFilter", "") || "").trim().length > 0 || String(N("workflowRunsOnFilter", "") || "").trim().length > 0 || N("dateRangeFilter", "") || N("dateExactFilter", "")), l = String(N("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!N("collectionId", ""); + let e = String(a?.value || "").trim(), o = mg(a), s = P(), c = !!(N("kindFilter", "") || N("workflowOnly", !1) || (Number(N("minRating", 0) || 0) || 0) > 0 || (Number(N("minSizeMB", 0) || 0) || 0) > 0 || (Number(N("maxSizeMB", 0) || 0) || 0) > 0 || (Number(N("minWidth", 0) || 0) || 0) > 0 || (Number(N("minHeight", 0) || 0) || 0) > 0 || (Number(N("maxWidth", 0) || 0) || 0) > 0 || (Number(N("maxHeight", 0) || 0) || 0) > 0 || String(N("workflowType", "") || "").trim().length > 0 || String(N("workflowId", "") || "").trim().length > 0 || String(N("workflowModelFilter", "") || "").trim().length > 0 || String(N("workflowRunsOnFilter", "") || "").trim().length > 0 || N("dateRangeFilter", "") || N("dateExactFilter", "")), l = String(N("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!N("collectionId", ""); try { n?.classList?.toggle?.("mjr-context-active", c), r?.classList?.toggle?.("mjr-context-active", l), i?.classList?.toggle?.("mjr-context-active", u); } catch (e) { @@ -14803,8 +14803,8 @@ function vg({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB }; } // ui/features/panel/controllers/customRootsController.ts -function yg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, comfyPrompt: i, comfyToast: a, get: o, post: s, ENDPOINTS: c, reloadGrid: l, onRootChanged: u = null }) { - let d = e && typeof e == "object" ? e : {}, { read: f, write: p } = dh(e, [ +function xg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, comfyPrompt: i, comfyToast: a, get: o, post: s, ENDPOINTS: c, reloadGrid: l, onRootChanged: u = null }) { + let d = e && typeof e == "object" ? e : {}, { read: f, write: p } = ph(e, [ "customRootId", "customRootLabel", "currentFolderRelativePath" @@ -14936,8 +14936,8 @@ function yg({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: r, co }; } // ui/features/panel/controllers/sortController.ts -function bg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { - let { read: s, write: c } = dh(e, ["sort"]), l = () => [ +function Sg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { + let { read: s, write: c } = ph(e, ["sort"]), l = () => [ { key: "mtime_desc", label: R("sort.newest") @@ -15022,13 +15022,13 @@ function bg({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, re }; } // ui/features/panel/controllers/sidebarController.ts -var xg = "_mjrRescanning", Sg = 1500, Cg = (e) => /^\d+$/.test(String(e ?? "").trim()); -async function wg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { +var Cg = "_mjrRescanning", wg = 1500, Tg = (e) => /^\d+$/.test(String(e ?? "").trim()); +async function Eg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { if (!t || !n || globalThis._mjrMaintenanceActive) return; try { let e = Date.now(); - if (e - (Number(t[xg] || 0) || 0) < Sg) return; - t[xg] = e; + if (e - (Number(t[Cg] || 0) || 0) < wg) return; + t[Cg] = e; } catch (e) { console.debug?.(e); } @@ -15047,13 +15047,13 @@ async function wg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { filename: n.filename, subfolder: n.subfolder || "", type: String(n.type || "output").toLowerCase(), - root_id: Me(n) || void 0 + root_id: ze(n) || void 0 }, s = null, c = !1, l = !1, u = !1; try { - if (c = !!(await L(st.INDEX_FILES, { + if (c = !!(await L(it.INDEX_FILES, { files: [o], incremental: !1 - }))?.ok, !c && a && (Ht(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""), Cg(n?.id)) { + }))?.ok, !c && a && (Ht(a, "error", "Error: metadata refresh failed", { asset: n }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""), Tg(n?.id)) { l = !0; try { u = !!(await ge(n.id))?.ok; @@ -15108,7 +15108,7 @@ async function wg({ card: t, asset: n, sidebar: r, onAssetUpdated: i }) { } return s; } -function Tg(e, t) { +function Dg(e, t) { if (e) { try { let n = e.querySelector(".mjr-asset-card.is-selected"); @@ -15144,7 +15144,7 @@ function Tg(e, t) { } } } -var Eg = (e) => { +var Og = (e) => { if (e == null) return ""; try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(String(e)); @@ -15153,32 +15153,32 @@ var Eg = (e) => { } return String(e).replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); }; -function Dg(e, t) { +function kg(e, t) { if (!e || !t) return null; try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Eg(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(t)}"]`); } catch (e) { console.debug?.(e); } try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Eg(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(t)}"]`); } catch (e) { console.debug?.(e); } return null; } -function Og(e) { +function Ag(e) { if (!e) return null; let t = e.dataset?.mjrSelectedAssetId; if (t) { - let n = Dg(e, t); + let n = kg(e, t); if (n) return n; } let n = e.dataset?.mjrSelectedAssetIds; if (n) try { let t = JSON.parse(n); if (Array.isArray(t) && t.length) { - let n = Dg(e, t[0]); + let n = kg(e, t[0]); if (n) return n; } } catch (e) { @@ -15186,7 +15186,7 @@ function Og(e) { } return e.querySelector(".mjr-asset-card.is-selected"); } -function kg(e, { preventScroll: t = !0 } = {}) { +function jg(e, { preventScroll: t = !0 } = {}) { if (e) try { e.focus?.({ preventScroll: t }); } catch { @@ -15197,14 +15197,14 @@ function kg(e, { preventScroll: t = !0 } = {}) { } } } -function Ag(e, { force: t = !1 } = {}) { +function Mg(e, { force: t = !1 } = {}) { if (!e || !t && !e._mjrFocusWithin) return; - let n = Og(e); - n && (kg(n), e._mjrFocusWithin = !0); + let n = Ag(e); + n && (jg(n), e._mjrFocusWithin = !0); } -function jg(e) { +function Ng(e) { if (e) try { - let t = Og(e); + let t = Ag(e); if (!t) return; let n = e.parentElement; if (n && typeof n.getBoundingClientRect == "function" && typeof t.getBoundingClientRect == "function") { @@ -15219,7 +15219,7 @@ function jg(e) { console.debug?.(e); } } -function Mg(e) { +function Pg(e) { if (e) try { e._mjrAutoRevealSelectionUntil = Date.now() + 900; } catch (e) { @@ -15227,12 +15227,12 @@ function Mg(e) { } let t = () => { try { - jg(e); + Ng(e); } catch (e) { console.debug?.(e); } try { - Ag(e); + Mg(e); } catch (e) { console.debug?.(e); } @@ -15247,10 +15247,10 @@ function Mg(e) { t(); } } -function Ng(e, t) { +function Fg(e, t) { e && (t ? (e.classList.add("is-selected"), e.setAttribute?.("aria-selected", "true")) : (e.classList.remove("is-selected"), e.setAttribute?.("aria-selected", "false"))); } -function Pg(e) { +function Ig(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -15265,15 +15265,15 @@ function Pg(e) { return []; } } -function Fg(e) { +function Lg(e) { if (e) try { - let t = Pg(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); + let t = Ig(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), !e.dataset.mjrSelectedAssetId && t[0] && (e.dataset.mjrSelectedAssetId = String(t[0]))) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } } -function Ig(e, t, n = "") { +function Rg(e, t, n = "") { if (!e) return []; let r = Array.from(t || []).map(String).filter(Boolean); try { @@ -15287,9 +15287,9 @@ function Ig(e, t, n = "") { console.debug?.(e); } try { - for (let t of Pg(e)) { + for (let t of Ig(e)) { let e = t?.dataset?.mjrAssetId; - Ng(t, !!(e && r.includes(String(e)))); + Fg(t, !!(e && r.includes(String(e)))); } } catch (e) { console.debug?.(e); @@ -15304,7 +15304,7 @@ function Ig(e, t, n = "") { } return r; } -function Lg({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { +function zg({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { if ((t || i) && e) try { let a = []; if (e.dataset?.mjrSelectedAssetIds) try { @@ -15313,7 +15313,7 @@ function Lg({ gridContainer: e, state: t, activeId: n, readState: r = null, writ } catch (e) { console.debug?.(e); } - else a = e.dataset?.mjrSelectedAssetId ? [String(e.dataset.mjrSelectedAssetId)].filter(Boolean) : Pg(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean).map(String); + else a = e.dataset?.mjrSelectedAssetId ? [String(e.dataset.mjrSelectedAssetId)].filter(Boolean) : Ig(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean).map(String); typeof i == "function" ? i("selectedAssetIds", a) : t.selectedAssetIds = a; let o = String(typeof r == "function" ? r("activeAssetId", "") || "" : t?.activeAssetId || ""); n == null ? o && a.includes(o) || (typeof i == "function" ? i("activeAssetId", a[0] || "") : t.activeAssetId = a[0] || "") : typeof i == "function" ? i("activeAssetId", String(n)) : t.activeAssetId = String(n); @@ -15321,8 +15321,8 @@ function Lg({ gridContainer: e, state: t, activeId: n, readState: r = null, writ console.debug?.(e); } } -function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { - let { read: s, write: c } = dh(o, [ +function Bg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { + let { read: s, write: c } = ph(o, [ "activeAssetId", "selectedAssetIds", "sidebarOpen" @@ -15357,9 +15357,9 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } }, a = () => { n && cancelAnimationFrame(n), r && clearTimeout(r), n = requestAnimationFrame(() => { - n = null, i() && jg(e); + n = null, i() && Ng(e); }), r = setTimeout(() => { - r = null, i() && jg(e); + r = null, i() && Ng(e); }, 160); }, o = new ResizeObserver(() => a()); t && o.observe(t), o.observe(e), e._mjrSelectionResizeObserver = o; @@ -15399,14 +15399,14 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg if (!a) return; n.preventDefault(), n.stopPropagation(); let l = r?.dataset?.mjrAssetId || ""; - Ig(e, l ? [l] : [], l), Lg({ + Rg(e, l ? [l] : [], l), zg({ gridContainer: e, state: o, activeId: l, readState: s, writeState: c }); - let u = await wg({ + let u = await Eg({ card: r, asset: a, sidebar: t, @@ -15425,7 +15425,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let u = r._mjrAsset; if (u) { if (e?._mjrSelectionManagedByVue) { - Lg({ + zg({ gridContainer: e, state: o, activeId: String(r?.dataset?.mjrAssetId || "").trim(), @@ -15445,7 +15445,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg console.debug?.(e); } } else if (n.preventDefault(), n.stopPropagation(), n.ctrlKey || n.metaKey || n.shiftKey) { - let t = Pg(e), i = t.indexOf(r); + let t = Ig(e), i = t.indexOf(r); if (n.shiftKey) { let t = []; try { @@ -15457,7 +15457,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let n = r?.dataset?.mjrAssetId || "", i = t.findIndex((e) => String(e?.id || "") === String(n)), a = Number(e._mjrLastSelectedIndex), l = Number.isFinite(a) ? a : i; if (i >= 0 && l >= 0) { let r = Math.min(l, i), a = Math.max(l, i), u = t.slice(r, a + 1).map((e) => String(e?.id || "")).filter(Boolean); - Ig(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, Lg({ + Rg(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, zg({ gridContainer: e, state: o, activeId: n || "", @@ -15492,7 +15492,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } a && (l.has(a) ? l.delete(a) : l.add(a)); let u = Array.from(l), d = l.has(a) ? a : u[0] || ""; - Ig(e, u, d), Lg({ + Rg(e, u, d), zg({ gridContainer: e, state: o, activeId: d, @@ -15502,7 +15502,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } else { { if (r.classList.contains("is-selected")) { - Ig(e, [], ""), Lg({ + Rg(e, [], ""), zg({ gridContainer: e, state: o, activeId: "", @@ -15512,7 +15512,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg return; } let n = r?.dataset?.mjrAssetId; - Ig(e, n ? [n] : [], n || ""), Lg({ + Rg(e, n ? [n] : [], n || ""), zg({ gridContainer: e, state: o, activeId: n || "", @@ -15526,7 +15526,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } } try { - jg(e), r?.focus?.({ preventScroll: !0 }); + Ng(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -15537,10 +15537,10 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let p = async () => { let n = String(s("activeAssetId", "") || ""), r = null; if (n) try { - r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Eg(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(n)}"]`); } catch { try { - r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Eg(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Og(n)}"]`); } catch (e) { console.debug?.(e); } @@ -15548,7 +15548,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg r ||= e.querySelector(".mjr-asset-card.is-selected"); let l = r?._mjrAsset; if (l) { - Tg(e, r), Fg(e), Lg({ + Dg(e, r), Lg(e), zg({ gridContainer: e, state: o, activeId: r?.dataset?.mjrAssetId, @@ -15564,7 +15564,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - Ag(e, { force: !0 }), Mg(e); + Mg(e, { force: !0 }), Pg(e); return; } } catch (e) { @@ -15577,7 +15577,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - Mg(e), r?.focus?.({ preventScroll: !0 }); + Pg(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -15592,7 +15592,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg if (!n) return !1; let r = null; try { - r = Dg(e, n); + r = kg(e, n); } catch (e) { console.debug?.(e); } @@ -15629,7 +15629,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let _ = (t) => { if (t.defaultPrevented || (t.key?.toLowerCase?.() || "") !== "d" || t.ctrlKey || t.metaKey || t.altKey || t.target?.isContentEditable || t.target?.closest?.("input, textarea, select, [contenteditable='true']")) return; let n = Mt(t.target, ".mjr-asset-card"); - n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), Tg(e, n), Fg(e), Lg({ + n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), Dg(e, n), Lg(e), zg({ gridContainer: e, state: o, activeId: n?.dataset?.mjrAssetId, @@ -15715,7 +15715,7 @@ function Rg({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg }; } // ui/features/panel/controllers/panelHotkeysController.ts -function zg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { +function Vg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { let s = !1, c = !1, l = null, u = o instanceof Set ? o : /* @__PURE__ */ new Set([ " ", "ArrowUp", @@ -15750,7 +15750,7 @@ function zg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF console.debug?.(e); } try { - let e = Xn(); + let e = Qn(); return e && (document.activeElement === document.body || e.contains?.(document.activeElement)) || !1; } catch (e) { return console.debug?.(e), !1; @@ -15869,17 +15869,17 @@ function zg({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF }; } // ui/vue/composables/useGridSelection.ts -function Bg(e) { +function Hg(e) { return Array.isArray(e) ? e.map((e) => String(e || "").trim()).filter(Boolean) : []; } -function Vg({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { +function Ug({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { if (!e) return { restoreSelectionState() {}, dispose() {} }; let s = (e) => { try { - let t = e?.detail || {}, n = Bg(t.selectedIds); + let t = e?.detail || {}, n = Hg(t.selectedIds); r(n), i(String(t.activeId || n[0] || "").trim()); } catch (e) { console.debug?.(e); @@ -15897,7 +15897,7 @@ function Vg({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs } return { restoreSelectionState: ({ scrollTop: r = 0 } = {}) => { - let i = Bg(t()), a = String(n() || i[0] || "").trim(); + let i = Hg(t()), a = String(n() || i[0] || "").trim(); if (i.length || a) { try { typeof e?._mjrSetSelection == "function" && e._mjrSetSelection(i, a); @@ -15914,7 +15914,7 @@ function Vg({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs console.debug?.(e); } try { - Rl(e, a)?.scrollIntoView?.({ + Bl(e, a)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -15934,7 +15934,7 @@ function Vg({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs }; } // ui/vue/composables/useAssetsQuery.ts -function Hg(e) { +function Wg(e) { try { if (typeof requestAnimationFrame == "function") { requestAnimationFrame(e); @@ -15945,13 +15945,13 @@ function Hg(e) { } setTimeout(e, 0); } -function Ug(e = {}, t = "*") { +function Gg(e = {}, t = "*") { return e.scope === "output" && !e.collectionId && t === "*" && !e.kindFilter && !e.workflowOnly && !(Number(e.minRating || 0) > 0) && !(Number(e.minSizeMB || 0) > 0) && !(Number(e.maxSizeMB || 0) > 0) && !(Number(e.minWidth || 0) > 0) && !(Number(e.minHeight || 0) > 0) && !(Number(e.maxWidth || 0) > 0) && !(Number(e.maxHeight || 0) > 0) && !String(e.workflowType || "").trim() && !String(e.workflowId || "").trim() && !e.dateRangeFilter && !e.dateExactFilter; } -function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: p = () => "output", loadAssets: m = null, lifecycleSignal: h = null } = {}) { +function Kg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => null, gridController: r, captureAnchor: i, restoreAnchor: a, restoreGridUiState: o = null, readScrollTop: s = () => 0, restoreSelectionState: c = () => {}, readActiveAssetId: l = () => "", isSidebarOpen: u = () => !1, toggleSidebarDetails: d = () => {}, getQuery: f = () => "*", getScope: p = () => "output", loadAssets: m = null, lifecycleSignal: h = null } = {}) { let g = 0, _ = !1, v = null, y = null, b = null, x = 0, S = !0, C = "", w = Date.now(), T = () => { try { - return gc(e, (typeof n == "function" ? n() : t) || t || null); + return vc(e, (typeof n == "function" ? n() : t) || t || null); } catch (e) { return console.debug?.(e), !1; } @@ -16040,7 +16040,7 @@ function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } catch (e) { console.debug?.(e); } - Hg(() => { + Wg(() => { let e = Number(s() || 0) || 0; if (e > 0) try { t.scrollTop = e; @@ -16067,7 +16067,7 @@ function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul if (e && typeof m == "function" && !h?.aborted) { if (!E()) b = t, x = 50; else if (!D() && !O() && String(p() || "output") === "output" && String(f() || "*") === "*") try { - let t = await re(`${st.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); + let t = await re(`${it.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); t?.ok && (t.data?.total_assets || 0) > 0 && await m(e); } catch (e) { console.debug?.(e); @@ -16087,7 +16087,7 @@ function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul c = !0, a = e.last_scan_end, o = e.last_index_end, s = Number(e.total_assets ?? null); return; } - let l = e.last_scan_end && e.last_scan_end !== a, u = e.last_index_end && e.last_index_end !== o, d = Number(e.total_assets ?? null), f = Ug(t, String(n() || "*").trim() || "*"), p = Date.now() - w < 8e3, m = Number.isFinite(d) && Number.isFinite(s) ? d - s : 0, h = Math.max(0, Number(i?.__mjrLastAssetUpsertCount || 0) || 0), g = m >= 20; + let l = e.last_scan_end && e.last_scan_end !== a, u = e.last_index_end && e.last_index_end !== o, d = Number(e.total_assets ?? null), f = Gg(t, String(n() || "*").trim() || "*"), p = Date.now() - w < 8e3, m = Number.isFinite(d) && Number.isFinite(s) ? d - s : 0, h = Math.max(0, Number(i?.__mjrLastAssetUpsertCount || 0) || 0), g = m >= 20; if (Number.isFinite(d) && (s = d), !f || p && D() && !u && !g) { a = e.last_scan_end, o = e.last_index_end; return; @@ -16197,7 +16197,7 @@ function Wg({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul }; } // ui/features/panel/panelBootstrap.ts -function Gg(e, { useComfyThemeUI: t }) { +function qg(e, { useComfyThemeUI: t }) { t ? e.classList.add("mjr-assets-manager") : e.classList.remove("mjr-assets-manager"); let n = e.parentElement || null, r = n ? { height: n.style.height, @@ -16209,7 +16209,7 @@ function Gg(e, { useComfyThemeUI: t }) { } catch (e) { console.debug?.(e); } - Yn(); + Zn(); for (let t of [ () => e._eventCleanup?.(), () => e._mjrPopoverManager?.dispose?.(), @@ -16223,7 +16223,7 @@ function Gg(e, { useComfyThemeUI: t }) { console.debug?.(e); } e.replaceChildren(), e.classList.add("mjr-am-container"); - let i = Di(e); + let i = ki(e); try { e._mjrPopoverManager = i; } catch (e) { @@ -16236,10 +16236,10 @@ function Gg(e, { useComfyThemeUI: t }) { }; } // ui/features/panel/panelSettingsSync.ts -function Kg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: a, similarBtn: o, setSemanticEnabled: s, similarEnabledTitle: c, similarDisabledTitle: l, refreshGridFn: u, isSidebarOpen: d, readActiveAssetId: f, getSidebarController: m, panelLifecycleAC: h }) { +function Jg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: a, similarBtn: o, setSemanticEnabled: s, similarEnabledTitle: c, similarDisabledTitle: l, refreshGridFn: u, isSidebarOpen: d, readActiveAssetId: f, getSidebarController: m, panelLifecycleAC: h }) { let g = "", _ = () => { try { - return !!(Jt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -16298,7 +16298,7 @@ function Kg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: } } }, b = async (e) => { - let n = String(e || t.scope || "output").toLowerCase(), i = !!Jt()?.watcher?.enabled; + let n = String(e || t.scope || "output").toLowerCase(), i = !!Vn()?.watcher?.enabled; if (n === "custom") try { await r(!1); } catch (e) { @@ -16322,9 +16322,9 @@ function Kg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: }, x = (e) => { let n = String(e?.detail?.key || "").trim(), r = n === "__init__", i = r || n.startsWith("grid.") || n.startsWith("infiniteScroll.") || n.startsWith("siblings.") || n.startsWith("search.") || n.startsWith("rtHydrate.") || n.startsWith("workflowMinimap."), a = r || n.startsWith("sidebar.") || n.startsWith("ai."), o = r || n.startsWith("watcher."); try { - let e = Jt(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), l = String(e?.ui?.tagColor || "").trim(); + let e = Vn(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), l = String(e?.ui?.tagColor || "").trim(); if (/^#[0-9a-fA-F]{3,8}$/.test(o) && document.documentElement.style.setProperty("--mjr-card-hover-color", o), /^#[0-9a-fA-F]{3,8}$/.test(s) && document.documentElement.style.setProperty("--mjr-card-selection-color", s), /^#[0-9a-fA-F]{3,8}$/.test(c) && document.documentElement.style.setProperty("--mjr-rating-color", c), /^#[0-9a-fA-F]{3,8}$/.test(l) && document.documentElement.style.setProperty("--mjr-tag-color", l), y(e.sidebar?.position || "right"), v(t), i) { - let e = Xn() || null; + let e = Qn() || null; if (!r && n.startsWith("siblings.")) try { e?.dispatchEvent(new CustomEvent("mjr:reload-grid")); } catch { @@ -16361,7 +16361,7 @@ function Kg({ container: e, state: t, sidebar: n, browseSection: i, gridWrapper: }; } // ui/features/panel/panelGridEventBindings.ts -function qg({ gridContainer: t, panelLifecycleAC: n, requestQueuedReload: r, notifyContextChanged: i, markUserInteraction: a, writePanelValue: o, popovers: s, collectionsPopover: c, gridController: l, registerSummaryDispose: u }) { +function Yg({ gridContainer: t, panelLifecycleAC: n, requestQueuedReload: r, notifyContextChanged: i, markUserInteraction: a, writePanelValue: o, popovers: s, collectionsPopover: c, gridController: l, registerSummaryDispose: u }) { let d = null; try { d = () => r(), t.addEventListener("mjr:reload-grid", d, { signal: n?.signal }), u(() => { @@ -16454,34 +16454,34 @@ function qg({ gridContainer: t, panelLifecycleAC: n, requestQueuedReload: r, not } } // ui/features/panel/panelSimilarSearch.ts -var Jg = 500; -function Yg(e) { +var Xg = 500; +function Zg(e) { return Number(e?.status || 0) === 404 && String(e?.error || "").toLowerCase().includes("non-json"); } -function Xg(e, t = "") { +function Qg(e, t = "") { let n = Array.isArray(e) ? e : []; - return n.length <= Jg ? { + return n.length <= Xg ? { list: n, title: t, truncated: !1, total: n.length } : { - list: n.slice(0, Jg), - title: `${String(t || "").trim() || "Generation group"} - showing first ${Jg}/${n.length}`, + list: n.slice(0, Xg), + title: `${String(t || "").trim() || "Generation group"} - showing first ${Xg}/${n.length}`, truncated: !0, total: n.length }; } -function Zg(e = {}) { +function $g(e = {}) { let t = String(e?.stackId || e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.asset?.id || "").trim(); return e?.isDupGroup ? n ? `duplicates:${n}` : "duplicates" : n ? `group:${n}` : "group"; } -function Qg(e, t) { +function e_(e, t) { return String(e?.[t] ?? e?.file_info?.[t] ?? "").trim(); } -function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplicatesBtn: i, similarSameNodeBtn: a, similarSameWorkflowBtn: o, gridContainer: s, state: c, panelLifecycleAC: l, isAiEnabled: u, similarDisabledTitle: d, readActiveAssetId: f, readSelectedAssetIds: p, readPanelValue: m, writePanelValue: h, scopeController: g, closePopovers: _, closePeerPopovers: v, popovers: y, workflowIdInput: b, reloadGrid: x, getDuplicatesAlert: S }) { +function t_({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplicatesBtn: i, similarSameNodeBtn: a, similarSameWorkflowBtn: o, gridContainer: s, state: c, panelLifecycleAC: l, isAiEnabled: u, similarDisabledTitle: d, readActiveAssetId: f, readSelectedAssetIds: p, readPanelValue: m, writePanelValue: h, scopeController: g, closePopovers: _, closePeerPopovers: v, popovers: y, workflowIdInput: b, reloadGrid: x, getDuplicatesAlert: S }) { let C = () => String(f() || p()[0] || "").trim(), w = () => { let e = Number(C()); return Number.isFinite(e) && e > 0 ? e : 0; @@ -16507,7 +16507,7 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } catch (e) { return console.debug?.(e), null; } - }, k = async (e, t) => e && t.some((t) => Qg(e, t)) ? e : await O() || e, A = (e = {}) => (Array.isArray(e?.files) ? e.files : []).map((e) => ({ + }, k = async (e, t) => e && t.some((t) => e_(e, t)) ? e : await O() || e, A = (e = {}) => (Array.isArray(e?.files) ? e.files : []).map((e) => ({ filename: String(e?.filename || "").trim(), subfolder: String(e?.subfolder || "").trim().replace(/\\/g, "/"), type: String(e?.type || "").trim().toLowerCase() @@ -16516,7 +16516,7 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic for (let e of n.slice(0, 4)) { let t = e.type === "input" ? "input" : "output"; try { - let n = await re(et({ + let n = await re(Ke({ q: e.filename, scope: t, limit: 50, @@ -16555,13 +16555,13 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } if (!n) await j(t, r); else try { - let i = await re(ct(n, { + let i = await re(Je(n, { jobId: t?.jobId || t?.job_id || "", latest: t?.latest !== !1, limit: 500 }), { timeoutMs: 3e4 }); if (!i?.ok) { - if (Yg(i)) { + if (Zg(i)) { if (r.length) { await j(t, r); return; @@ -16646,12 +16646,12 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic let i = (S?.() || {})?.firstGroup; i && Array.isArray(i.assets) && i.assets.length >= 2 ? (h("similarResults", i.assets), h("similarSourceAssetId", "duplicates"), h("similarTitle", R("search.duplicateResults", "Duplicates ({n} assets)", { n: i.assets.length })), await g?.setScope?.("similar")) : e(R("search.noKnownDuplicates", "No duplicate group is available yet. Run duplicate analysis from the duplicate alert first."), "info", 3200); }, ee = async () => { - let t = await k(await D(), ["source_node_id", "source_node_type"]), n = Qg(t, "source_node_id"); + let t = await k(await D(), ["source_node_id", "source_node_type"]), n = e_(t, "source_node_id"); n ? await M({ sourceNodeId: n, - sourceNodeType: Qg(t, "source_node_type"), - jobId: Qg(t, "job_id"), - title: Qg(t, "source_node_type") || n + sourceNodeType: e_(t, "source_node_type"), + jobId: e_(t, "job_id"), + title: e_(t, "source_node_type") || n }) : e(R("search.noSourceNode", "Selected asset has no persisted source node id."), "info", 2600); }, te = async () => { try { @@ -16659,7 +16659,7 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } catch (e) { console.debug?.(e); } - let t = Qg(await k(await D(), ["workflow_id"]), "workflow_id"); + let t = e_(await k(await D(), ["workflow_id"]), "workflow_id"); if (!t) e(R("search.noWorkflowId", "Selected asset has no persisted workflow id."), "info", 2600); else { h("workflowId", t); @@ -16692,8 +16692,8 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic }; F(r, N), F(i, P), F(a, ee), F(o, te), s?.addEventListener(V.OPEN_STACK_GROUP, async (t) => { try { - let n = t?.detail || {}, r = Array.isArray(n?.members) ? n.members : [], i = `Generation group (${r.length} assets)`, a = Xg(r, String(n?.title || "").trim() || i); - a.truncated && e(`Large stack truncated to ${Jg}/${a.total} assets to keep the grid responsive.`, "warn", 5e3), h("similarResults", a.list), h("similarSourceAssetId", Zg(n)), h("similarTitle", a.title || i), await Promise.resolve(), await g?.setScope?.("similar"); + let n = t?.detail || {}, r = Array.isArray(n?.members) ? n.members : [], i = `Generation group (${r.length} assets)`, a = Qg(r, String(n?.title || "").trim() || i); + a.truncated && e(`Large stack truncated to ${Xg}/${a.total} assets to keep the grid responsive.`, "warn", 5e3), h("similarResults", a.list), h("similarSourceAssetId", $g(n)), h("similarTitle", a.title || i), await Promise.resolve(), await g?.setScope?.("similar"); } catch (e) { console.debug?.(e); } @@ -16716,7 +16716,7 @@ function $g({ similarBtn: t, similarPopover: n, similarFindBtn: r, similarDuplic } } // ui/features/panel/panelPinnedFolders.ts -function e_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFoldersMenu: r = null, pinnedFoldersPopover: i, popovers: a, closeOtherPopovers: o, state: s, gridContainer: c, customSelect: l, scopeController: u, customRootsController: d, gridController: f, applyWatcherForScope: p, refreshDuplicateAlerts: m, notifyContextChanged: h, panelLifecycleAC: g }) { +function n_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFoldersMenu: r = null, pinnedFoldersPopover: i, popovers: a, closeOtherPopovers: o, state: s, gridContainer: c, customSelect: l, scopeController: u, customRootsController: d, gridController: f, applyWatcherForScope: p, refreshDuplicateAlerts: m, notifyContextChanged: h, panelLifecycleAC: g }) { let _ = (e) => { let t = String(e?.id || "").trim(); if (!t) return null; @@ -16728,7 +16728,7 @@ function e_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold }; }, v = async () => { try { - let e = await re(st.CUSTOM_ROOTS, g?.signal ? { signal: g.signal } : void 0); + let e = await re(it.CUSTOM_ROOTS, g?.signal ? { signal: g.signal } : void 0); return e?.ok && Array.isArray(e.data) ? e.data.map(_).filter(Boolean) : []; } catch (e) { return console.debug?.(e), []; @@ -16776,7 +16776,7 @@ function e_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold if (!r) return; let i = String(t?.label || t?.path || r).trim(); if (!await Ut(R("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: i }))) return; - let a = await L(st.CUSTOM_ROOTS_REMOVE, { id: r }); + let a = await L(it.CUSTOM_ROOTS_REMOVE, { id: r }); if (!a?.ok) e(a?.error || R("toast.unpinFolderFailed", "Failed to unpin folder"), "error"); else { String(s.customRootId || "") === r && (s.customRootId = "", s.customRootLabel = "", s.currentFolderRelativePath = ""); @@ -16836,8 +16836,8 @@ function e_({ pinnedFoldersBtn: t, pinnedFoldersController: n = null, pinnedFold }, { signal: g?.signal }); } // ui/features/filters/calendar/AgendaCalendar.ts -var t_ = (e) => String(e).padStart(2, "0"); -function n_(e) { +var r_ = (e) => String(e).padStart(2, "0"); +function i_(e) { try { let t = String(e || "").trim(); if (!/^\d{4}-\d{2}-\d{2}$/.test(t)) return null; @@ -16849,50 +16849,50 @@ function n_(e) { return null; } } -function r_(e) { +function a_(e) { try { let t = e.getFullYear(), n = e.getMonth() + 1, r = e.getDate(); - return `${t}-${t_(n)}-${t_(r)}`; + return `${t}-${r_(n)}-${r_(r)}`; } catch { return ""; } } -function i_(e) { +function o_(e) { try { - return `${e.getFullYear()}-${t_(e.getMonth() + 1)}`; + return `${e.getFullYear()}-${r_(e.getMonth() + 1)}`; } catch { return ""; } } -function a_(e) { +function s_(e) { try { return new Date(e.getFullYear(), e.getMonth(), 1); } catch { return /* @__PURE__ */ new Date(); } } -function o_(e, t) { +function c_(e, t) { try { return new Date(e.getFullYear(), e.getMonth() + t, 1); } catch { return /* @__PURE__ */ new Date(); } } -function s_(e) { +function l_(e) { try { return new Date(e.getFullYear(), e.getMonth() + 1, 0).getDate(); } catch { return 31; } } -function c_(e) { +function u_(e) { try { return (e.getDay() + 6) % 7; } catch { return 0; } } -function l_(e, t) { +function d_(e, t) { if (e) try { let n = String(e.value || ""); e.value = t || "", n !== e.value && e.dispatchEvent?.(new Event("change", { bubbles: !0 })); @@ -16900,14 +16900,14 @@ function l_(e, t) { console.debug?.(e); } } -async function u_({ state: e, monthKey: t }) { +async function f_({ state: e, monthKey: t }) { try { let n = String(e?.scope || "output"); if (n === "collection") return { ok: !0, days: {} }; - let r = String(e?.currentFolderRelativePath || "").trim(), i = n === "custom" && !e?.customRootId ? null : r || null, a = at({ + let r = String(e?.currentFolderRelativePath || "").trim(), i = n === "custom" && !e?.customRootId ? null : r || null, a = Qe({ scope: n, customRootId: e?.customRootId || null, subfolder: i, @@ -16939,7 +16939,7 @@ async function u_({ state: e, monthKey: t }) { }; } } -function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { +function p_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { if (!e || !(e instanceof HTMLElement) || !t) return { dispose() {}, refresh() {} @@ -16962,7 +16962,7 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n d.type = "button", d.className = "mjr-btn mjr-agenda-clear", d.textContent = R("action.clear", "Clear"); let f = document.createElement("button"); f.type = "button", f.className = "mjr-btn mjr-agenda-refresh", f.textContent = R("action.refresh", "Refresh"), u.appendChild(d), u.appendChild(f), i.appendChild(a), i.appendChild(l), i.appendChild(u), e.appendChild(i); - let p = a_(n_(t.value) || /* @__PURE__ */ new Date()), m = {}, h = 0, g = !1, _ = () => { + let p = s_(i_(t.value) || /* @__PURE__ */ new Date()), m = {}, h = 0, g = !1, _ = () => { if (g) return; let e = p.getFullYear(), n = p.getMonth(); s.textContent = p.toLocaleString(void 0, { @@ -16982,13 +16982,13 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n let t = document.createElement("div"); t.className = "mjr-agenda-weekday", t.textContent = e, l.appendChild(t); } - let i = c_(new Date(e, n, 1)), a = s_(p), o = n_(t.value), c = o ? r_(o) : ""; + let i = u_(new Date(e, n, 1)), a = l_(p), o = i_(t.value), c = o ? a_(o) : ""; for (let e = 0; e < i; e++) { let e = document.createElement("div"); e.className = "mjr-agenda-day mjr-agenda-day--blank", l.appendChild(e); } for (let r = 1; r <= a; r++) { - let i = r_(new Date(e, n, r)), a = Number(m?.[i] || 0) || 0, o = document.createElement("button"); + let i = a_(new Date(e, n, r)), a = Number(m?.[i] || 0) || 0, o = document.createElement("button"); if (o.type = "button", o.className = "mjr-agenda-day", o.textContent = String(r), o.dataset.date = i, a > 0) { o.classList.add("mjr-agenda-day--has-assets"); let e = R(a === 1 ? "tooltip.assetsDaySingular" : "tooltip.assetsDayPlural", a === 1 ? "{count} asset" : "{count} assets", { count: a }); @@ -16997,26 +16997,26 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n t.className = "mjr-agenda-day-badge", t.textContent = a > 99 ? "99+" : String(a), t.setAttribute("aria-label", e), o.appendChild(t); } else o.title = R("tooltip.noAssetsDay", "No assets on this day"); i === c && o.classList.add("mjr-agenda-day--selected"), o.addEventListener("click", () => { - l_(t, String(t.value || "").trim() === i ? "" : i); + d_(t, String(t.value || "").trim() === i ? "" : i); }), l.appendChild(o); } }, v = async () => { if (g) return; - let e = i_(p); + let e = o_(p); if (!e) return; h += 1; - let t = h, r = await u_({ + let t = h, r = await f_({ state: n, monthKey: e }); g || t === h && (m = r.ok && r.days || {}, _()); }; return o.addEventListener("click", async () => { - p = o_(p, -1), await v(); + p = c_(p, -1), await v(); }), c.addEventListener("click", async () => { - p = o_(p, 1), await v(); + p = c_(p, 1), await v(); }), d.addEventListener("click", () => { - l_(t, ""); + d_(t, ""); try { r?.(); } catch (e) { @@ -17025,9 +17025,9 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n }), f.addEventListener("click", async () => { await v(); }), t.addEventListener("change", () => { - let e = n_(t.value); + let e = i_(t.value); if (e) { - let t = a_(e); + let t = s_(e); (t.getFullYear() !== p.getFullYear() || t.getMonth() !== p.getMonth()) && (p = t); } _(); @@ -17044,14 +17044,14 @@ function d_({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = n }; } // ui/features/panel/controllers/filtersController.ts -var f_ = (e) => { +var m_ = (e) => { let t = String(e ?? "").trim(); if (!t) return 0; let n = t.replace(",", "."), r = Number(n); return Number.isFinite(r) ? r : 0; }; -function p_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, workflowModelInput: a, workflowRunsOnSelect: o, ratingSelect: s, minSizeInput: c, maxSizeInput: l, resolutionPresetSelect: u, minWidthInput: d, minHeightInput: f, maxWidthInput: p, maxHeightInput: m, dateRangeSelect: h, dateExactInput: g, reloadGrid: _, reconcileSelection: v = null, onFiltersChanged: y = null, lifecycleSignal: b = null }) { - let { write: x } = dh(e, [ +function h_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, workflowModelInput: a, workflowRunsOnSelect: o, ratingSelect: s, minSizeInput: c, maxSizeInput: l, resolutionPresetSelect: u, minWidthInput: d, minHeightInput: f, maxWidthInput: p, maxHeightInput: m, dateRangeSelect: h, dateExactInput: g, reloadGrid: _, reconcileSelection: v = null, onFiltersChanged: y = null, lifecycleSignal: b = null }) { + let { write: x } = ph(e, [ "kindFilter", "workflowOnly", "minRating", @@ -17163,7 +17163,7 @@ function p_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor C(); }, b ? { signal: b } : void 0); let E = () => { - let e = f_(c?.value || 0), t = f_(l?.value || 0), n = Number.isFinite(e) && e > 0 ? e : 0, r = Number.isFinite(t) && t > 0 ? t : 0; + let e = m_(c?.value || 0), t = m_(l?.value || 0), n = Number.isFinite(e) && e > 0 ? e : 0, r = Number.isFinite(t) && t > 0 ? t : 0; r > 0 && n > 0 && r < n && (r = n, l && (l.value = String(r))), x("minSizeMB", n), x("maxSizeMB", r); try { y?.(); @@ -17174,7 +17174,7 @@ function p_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor }; T(c, "change", E, b ? { signal: b } : void 0), T(l, "change", E, b ? { signal: b } : void 0); let D = () => { - let e = f_(d?.value || 0), t = f_(f?.value || 0), n = f_(p?.value || 0), r = f_(m?.value || 0), i = Number.isFinite(e) && e > 0 ? Math.round(e) : 0, a = Number.isFinite(t) && t > 0 ? Math.round(t) : 0, o = Number.isFinite(n) && n > 0 ? Math.round(n) : 0, s = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; + let e = m_(d?.value || 0), t = m_(f?.value || 0), n = m_(p?.value || 0), r = m_(m?.value || 0), i = Number.isFinite(e) && e > 0 ? Math.round(e) : 0, a = Number.isFinite(t) && t > 0 ? Math.round(t) : 0, o = Number.isFinite(n) && n > 0 ? Math.round(n) : 0, s = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; o > 0 && i > 0 && o < i && (o = i, p && (p.value = String(o))), s > 0 && a > 0 && s < a && (s = a, m && (m.value = String(s))), x("minWidth", i), x("minHeight", a), x("maxWidth", o), x("maxHeight", s); try { u && (u.value = { @@ -17258,7 +17258,7 @@ function p_({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, wor }; } // ui/features/panel/panelFiltersInit.ts -function m_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, agendaContainer: v, gridController: y, reconcileVisibleSelection: b, exitSimilarViewIfActive: x, notifyContextChanged: S, panelLifecycleAC: C, popovers: w = null, filterPopover: T = null }) { +function g_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, workflowModelInput: o, workflowRunsOnSelect: s, ratingSelect: c, minSizeInput: l, maxSizeInput: u, resolutionPresetSelect: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, dateRangeSelect: g, dateExactInput: _, agendaContainer: v, gridController: y, reconcileVisibleSelection: b, exitSimilarViewIfActive: x, notifyContextChanged: S, panelLifecycleAC: C, popovers: w = null, filterPopover: T = null }) { let E = null; try { try { @@ -17268,7 +17268,7 @@ function m_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo } catch (e) { console.debug?.(e); } - E = d_({ + E = p_({ container: v, hiddenInput: _, state: e, @@ -17309,7 +17309,7 @@ function m_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo D = () => { e &&= (clearTimeout(e), null); }; - } else D = p_({ + } else D = h_({ state: e, kindSelect: n, wfCheckbox: r, @@ -17346,7 +17346,7 @@ function m_({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, wo }; } // ui/features/panel/panelContextMenuExtraActions.ts -function h_({ state: t, scopeController: n, browserNav: r, gridController: i, getDuplicatesAlert: a, refreshDuplicateAlerts: o }) { +function __({ state: t, scopeController: n, browserNav: r, gridController: i, getDuplicatesAlert: a, refreshDuplicateAlerts: o }) { return { clearSimilarScope: async () => { try { @@ -17396,15 +17396,15 @@ function h_({ state: t, scopeController: n, browserNav: r, gridController: i, ge }; } // ui/features/panel/panelRuntime.ts -async function g_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { - return __(e, { +async function v_(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { + return y_(e, { useComfyThemeUI: t, external: n }); } -async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { - Rp("panelRender"), Vp("panelRender"); - let i = typeof AbortController < "u" ? new AbortController() : null, { popovers: a, hostWrapper: o, hostWrapperPrevStyle: s } = Gg(t, { useComfyThemeUI: n }), c = uh(); +async function y_(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { + Bp("panelRender"), Up("panelRender"); + let i = typeof AbortController < "u" ? new AbortController() : null, { popovers: a, hostWrapper: o, hostWrapperPrevStyle: s } = qg(t, { useComfyThemeUI: n }), c = fh(); if (!c) throw Error("[Majoor] mountAssetsManagerPanelRuntime requires an active Pinia panel store"); for (let e of [ "statusSection", @@ -17420,7 +17420,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { "gridContainer", "sidebar" ]) if (!r?.[e]) throw Error(`[Majoor] mountAssetsManagerPanelRuntime now requires external.${e}`); - let l = dh(null, [ + let l = ph(null, [ "searchQuery", "scrollTop", "scope", @@ -17449,7 +17449,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { l.write("searchQuery", e.target.value); }, { signal: i?.signal }); let Ue = r.summaryBar, We = r.updateSummaryBar, Ge = r.folderBreadcrumb, Ke = r.folderBreadcrumbController || null, qe = r.statusSection, Je = r.statusDot, Ye = r.statusText, Xe = r.capabilitiesSection, Ze = r.browseSection, Qe = r.gridWrapper, $e = r.sidebar; - Jt(); + Vn(); let et = document.createElement("div"); et.classList.add("mjr-am-content"); let z = null, B = null; @@ -17460,9 +17460,9 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch { nt = 0; } - }, it = typeof r?.bindGridHostState == "function" && typeof r?.restoreGridUiState == "function", at = !it; + }, at = typeof r?.bindGridHostState == "function" && typeof r?.restoreGridUiState == "function", ot = !at; Qe.addEventListener("scroll", () => { - rt(), at && (tt && clearTimeout(tt), tt = setTimeout(() => { + rt(), ot && (tt && clearTimeout(tt), tt = setTimeout(() => { try { l.write("scrollTop", Qe.scrollTop); } catch (e) { @@ -17472,17 +17472,17 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }, { passive: !0, signal: i?.signal - }), z = r.gridContainer, z.parentElement !== Qe && Qe.appendChild(z), $n(z); + }), z = r.gridContainer, z.parentElement !== Qe && Qe.appendChild(z), tr(z); try { z.dataset.mjrScope = String(d("scope", c.scope || "output") || "output"); } catch (e) { console.debug?.(e); } - let ot = [], ct = (e) => { - typeof e == "function" && ot.push(e); + let st = [], ct = (e) => { + typeof e == "function" && st.push(e); }; z._mjrSummaryBarDispose = () => { - for (let e of ot.splice(0)) try { + for (let e of st.splice(0)) try { e(); } catch (e) { console.debug?.(e); @@ -17509,17 +17509,17 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - let lt = r.loadAssets ?? hi, ut = r.loadAssetsFromList ?? gi, dt = r.prepareGridForScopeSwitch ?? _i, ft = r.disposeGrid ?? vi, pt = r.refreshGrid ?? yi, mt = r.captureAnchor ?? bi, gt = r.restoreAnchor ?? xi, _t = r.hydrateGridFromSnapshot ?? mi; + let lt = r.loadAssets ?? _i, ut = r.loadAssetsFromList ?? vi, dt = r.prepareGridForScopeSwitch ?? yi, ft = r.disposeGrid ?? bi, pt = r.refreshGrid ?? xi, mt = r.captureAnchor ?? Si, gt = r.restoreAnchor ?? Ci, _t = r.hydrateGridFromSnapshot ?? gi; if (typeof r?.onGridContainerReady == "function") try { r.onGridContainerReady(z, { getState: () => c }); } catch (e) { console.debug?.(e); } - else t._mjrGridContextMenuUnbind = Ia({ + else t._mjrGridContextMenuUnbind = Ra({ gridContainer: z, getState: () => c }); - let vt = R("search.findSimilar", "Find Similar"), yt = R("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: bt, isAiEnabled: xt } = Kg({ + let vt = R("search.findSimilar", "Find Similar"), yt = R("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: bt, isAiEnabled: xt } = Jg({ container: t, state: c, sidebar: $e, @@ -17542,7 +17542,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } t._mjrVersionUpdateCleanup = Ve || g._mjrVersionUpdateCleanup, t.appendChild(et); - let St = () => fg(Ne), Ct = pg({ + let St = () => mg(Ne), Ct = hg({ gridContainer: z, loadAssets: lt, loadAssetsFromList: ut, @@ -17583,7 +17583,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } It(); }; - it || (Mt = Vg({ + at || (Mt = Ug({ gridContainer: z, readSelectedAssetIds: p, readActiveAssetId: () => m(), @@ -17593,7 +17593,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { rt(), Lt(); }, lifecycleSignal: i?.signal || null - })), At = mg({ + })), At = gg({ state: c, gridContainer: z, folderBreadcrumb: Ge, @@ -17643,7 +17643,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } }, zt = null; - qg({ + Yg({ gridContainer: z, panelLifecycleAC: i, requestQueuedReload: () => { @@ -17653,7 +17653,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } zt = setTimeout(() => { - zt = null, tn().catch((e) => { + zt = null, en().catch((e) => { try { console.warn("[Majoor] queuedReload failed", e); } catch (e) { @@ -17670,7 +17670,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { gridController: Ct, registerSummaryDispose: ct }); - let Bt = yg({ + let Bt = xg({ state: c, customSelect: E, customRemoveBtn: O, @@ -17679,7 +17679,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { comfyToast: e, get: re, post: L, - ENDPOINTS: st, + ENDPOINTS: it, reloadGrid: Ct.reloadGrid, onRootChanged: async () => { try { @@ -17722,7 +17722,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } }; - Tt = hg({ + Tt = _g({ state: c, tabButtons: _, customMenuBtn: v, @@ -17763,7 +17763,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - await Dm(Je, Ye, Xe, { + await km(Je, Ye, Xe, { scope: d("scope", c.scope || "output"), customRootId: d("customRootId", c.customRootId || "") }, null, { signal: i?.signal || null }); @@ -17782,7 +17782,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }; Object.values(_).forEach((e) => { e.addEventListener("click", () => Tt.setScope(e.dataset.scope), { signal: i?.signal }); - }), lg({ + }), dg({ messageBtn: C, messagePopover: xe, title: be, @@ -17818,7 +17818,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { Pe ]), a.setOnVisibilityChanged?.(() => It()); try { - window.addEventListener(Gn, (e) => { + window.addEventListener(qn, (e) => { Pt = !!e?.detail?.open, It(); }, { signal: i?.signal }); } catch (e) { @@ -17831,7 +17831,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { }, { signal: i?.signal }), x.addEventListener("click", (e) => { e.stopPropagation(), a.close(T), a.close(k), a.close(pe), a.close(xe), a.close(Fe), a.toggle(ge, x); }, { signal: i?.signal }); - let Kt = He ? null : bg({ + let Kt = He ? null : Sg({ state: c, sortBtn: b, sortMenu: me, @@ -17844,7 +17844,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { a.close(T), a.close(k), a.close(ge), a.close(xe), a.close(Fe); } }) : b.addEventListener("click", (e) => { e.stopPropagation(), a.close(T), a.close(k), a.close(ge), a.close(xe), a.close(Fe), a.toggle(pe, b); - }, { signal: i?.signal }), $g({ + }, { signal: i?.signal }), t_({ similarBtn: Pe, similarPopover: Fe, similarFindBtn: Ie, @@ -17871,7 +17871,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { workflowIdInput: P, reloadGrid: () => Ct.reloadGrid(), getDuplicatesAlert: () => Dt - }), e_({ + }), n_({ pinnedFoldersBtn: S, pinnedFoldersController: ve, pinnedFoldersMenu: ye, @@ -17891,7 +17891,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { notifyContextChanged: Lt, panelLifecycleAC: i }); - let { agendaCalendar: qt, disposeFilters: Yt } = m_({ + let { agendaCalendar: qt, disposeFilters: Jt } = g_({ state: c, hasVueHeaderSection: He, kindSelect: A, @@ -17918,7 +17918,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { panelLifecycleAC: i, popovers: a, filterPopover: k - }), Xt = h_({ + }), Yt = __({ state: c, scopeController: Tt, browserNav: At, @@ -17927,7 +17927,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { refreshDuplicateAlerts: Rt }); try { - Et = vg({ + Et = bg({ state: c, gridContainer: z, filterBtn: y, @@ -17955,13 +17955,13 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { updateSummaryBar: We, reloadGrid: () => Ct.reloadGrid(), getExtraContext: () => ({ duplicatesAlert: Dt }), - extraActions: Xt + extraActions: Yt }); } catch (e) { console.debug?.(e); } try { - if (Lt(), it) ct(r.bindGridHostState({ + if (Lt(), at) ct(r.bindGridHostState({ onContextChanged: Lt, markUserInteraction: rt })); @@ -18001,20 +18001,20 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - B = Rg({ + B = Bg({ gridContainer: z, sidebar: $e, createRatingBadge: ht, createTagsBadge: Vt, - showAssetInSidebar: Zm, - closeSidebar: Qm, + showAssetInSidebar: $m, + closeSidebar: eh, state: c }); - let Zt = { + let Xt = { gridController: Ct, captureAnchor: mt, restoreAnchor: gt, - restoreGridUiState: it ? (e) => r.restoreGridUiState(e, { onRestoreSidebar: () => { + restoreGridUiState: at ? (e) => r.restoreGridUiState(e, { onRestoreSidebar: () => { try { B?.toggleDetails?.(); } catch (e) { @@ -18035,14 +18035,14 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { loadAssets: lt, lifecycleSignal: i?.signal || null }; - Nt = typeof r?.initAssetsQueryController == "function" ? r.initAssetsQueryController(Zt) : Wg({ + Nt = typeof r?.initAssetsQueryController == "function" ? r.initAssetsQueryController(Xt) : Kg({ gridContainer: z, gridWrapper: Qe, - ...Zt + ...Xt }); - let Qt = zg({ + let Zt = Vg({ onTriggerScan: (e) => { - ym(Je, Ye, Xe, e || {}); + xm(Je, Ye, Xe, e || {}); }, onToggleDetails: () => { B?.toggleDetails?.(); @@ -18075,18 +18075,18 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { scope: l.read("scope", c.scope), customRootId: l.read("customRootId", c.customRootId) }) - }), $t = Ua({ + }), Qt = Ga({ gridContainer: z, createRatingBadge: ht - }), en = null; + }), $t = null; if (t._eventCleanup) try { t._eventCleanup(); } catch (e) { console.debug?.(e); } - Qt.bind(et), $t.bind(), N("grid"); + Zt.bind(et), Qt.bind(), N("grid"); try { - t._mjrHotkeys = Qt, t._mjrRatingHotkeys = $t, t._mjrSidebarController = B; + t._mjrHotkeys = Zt, t._mjrRatingHotkeys = Qt, t._mjrSidebarController = B; } catch (e) { console.debug?.(e); } @@ -18113,12 +18113,12 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - Qt.dispose(); + Zt.dispose(); } catch (e) { console.debug?.(e); } try { - $t.dispose(); + Qt.dispose(); } catch (e) { console.debug?.(e); } @@ -18129,16 +18129,16 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } try { - Yt?.(); + Jt?.(); } catch (e) { console.debug?.(e); } try { - en?.(); + $t?.(); } catch (e) { console.debug?.(e); } - en = null; + $t = null; try { $e?.dispose?.(); } catch (e) { @@ -18201,7 +18201,7 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - Yn(z), z = null; + Zn(z), z = null; try { a.dispose(); } catch (e) { @@ -18218,19 +18218,19 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { console.debug?.(e); } }; - let tn = async () => { + let en = async () => { await Nt?.queuedReload?.(); }; - Lm(Je, Ye, qe, Xe, Nt?.createCountersUpdateHandler?.({ + zm(Je, Ye, qe, Xe, Nt?.createCountersUpdateHandler?.({ state: c, getStableQuery: () => String(z?.dataset?.mjrQuery || "*").trim() || "*", getRecentUserInteractionAt: () => Number(nt || 0) }) ?? (async () => { - await tn(); + await en(); }), () => ({ scope: l.read("scope", c.scope), customRootId: l.read("customRootId", c.customRootId) - })), Tt.setActiveTabStyles(), At?.renderBreadcrumb?.(), Bt.refreshCustomRoots().catch(() => {}), en = Nt?.bindSearchInput?.({ + })), Tt.setActiveTabStyles(), At?.renderBreadcrumb?.(), Bt.refreshCustomRoots().catch(() => {}), $t = Nt?.bindSearchInput?.({ searchInputEl: Ne, lifecycleSignal: i?.signal || null, debounceMs: 120, @@ -18241,17 +18241,17 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { Gt({ reload: !1 }), Lt(); }, startSearchTimer: () => { - Rp("searchQuery"); + Bp("searchQuery"); }, reloadGrid: () => { Ct.reloadGrid(); } }); - let nn = !1; + let tn = !1; try { - nn = await _t(z, { + tn = await _t(z, { scope: d("scope", c.scope || "output") || "output", - query: String(fg(l.read("searchQuery", c.searchQuery || "*") || "*") || "*"), + query: String(mg(l.read("searchQuery", c.searchQuery || "*") || "*") || "*"), customRootId: d("customRootId", c.customRootId || "") || "", subfolder: d("currentFolderRelativePath", c.currentFolderRelativePath || "") || "", collectionId: d("collectionId", c.collectionId || "") || "", @@ -18277,21 +18277,21 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - let rn = !1; + let nn = !1; try { - rn = !!z?.querySelector?.(".mjr-asset-card"); + nn = !!z?.querySelector?.(".mjr-asset-card"); } catch (e) { console.debug?.(e); } - let an = Vf(), on = !an && (nn || rn) ? Promise.resolve({ + let rn = Uf(), an = !rn && (tn || nn) ? Promise.resolve({ ok: !0, - hydrated: !!nn, - cached: !!rn + hydrated: !!tn, + cached: !!nn }) : Ct.reloadGrid({ - reason: an ? "pending-generated-assets" : "initial-load", - preserveVisibleUntilReady: !an + reason: rn ? "pending-generated-assets" : "initial-load", + preserveVisibleUntilReady: !rn }); - if (nn) try { + if (tn) try { setTimeout(() => { try { if (i?.signal?.aborted) return; @@ -18316,20 +18316,20 @@ async function __(t, { useComfyThemeUI: n = !0, external: r = {} } = {}) { } catch (e) { console.debug?.(e); } - Nt?.restoreUiState?.(on); + Nt?.restoreUiState?.(an); try { window.__mjrLastAssetUpsert = 0, window.__mjrLastAssetUpsertCount = 0; } catch (e) { console.debug?.(e); } - return Wp(zp("panelRender", "gridRender") ?? 0), { gridContainer: z }; + return Kp(Vp("panelRender", "gridRender") ?? 0), { gridContainer: z }; } // ui/vue/components/status/StatusSection.vue -var v_ = /* @__PURE__ */ lr({ +var b_ = /* @__PURE__ */ dr({ __name: "StatusSection", setup(e, { expose: t }) { - let n = vm({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); - return tr(() => { + let n = bm({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); + return rr(() => { try { n?._mjrStatusPollDispose?.(); } catch {} @@ -18340,25 +18340,25 @@ var v_ = /* @__PURE__ */ lr({ capabilitiesSection: a }), (e, t) => null; } -}), y_ = xr({ +}), x_ = Cr({ open: !1, initial: null, resolve: null }); -function b_(e = {}) { - return y_.open = !0, y_.initial = e || {}, new Promise((e) => { - y_.resolve = e; +function S_(e = {}) { + return x_.open = !0, x_.initial = e || {}, new Promise((e) => { + x_.resolve = e; }); } -function x_(e = null) { - let t = y_.resolve; - y_.open = !1, y_.initial = null, y_.resolve = null, t && t(e); +function C_(e = null) { + let t = x_.resolve; + x_.open = !1, x_.initial = null, x_.resolve = null, t && t(e); } // ui/vue/components/panel/SimilarSearchPopover.vue?vue&type=script&setup=true&lang.ts -var S_ = { +var w_ = { class: "mjr-popover mjr-similar-popover", style: { display: "none" } -}, C_ = { class: "mjr-menu mjr-similar-menu" }, w_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, T_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, E_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, D_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, O_ = /* @__PURE__ */ lr({ +}, T_ = { class: "mjr-menu mjr-similar-menu" }, E_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, D_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, O_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, k_ = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, A_ = /* @__PURE__ */ dr({ __name: "SimilarSearchPopover", setup(e, { expose: t }) { let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = (e) => e?.$el || e || null; @@ -18376,8 +18376,8 @@ var S_ = { return o(a.value); } }), (e, t) => { - let o = rr("MButton"); - return q(), X("div", S_, [U("div", C_, [ + let o = ar("MButton"); + return q(), X("div", w_, [U("div", T_, [ Y(o, { ref_key: "findSimilarBtnRef", ref: n, @@ -18387,7 +18387,7 @@ var S_ = { text: "", title: Z(R)("search.findSimilarWarning", "Find similar assets. This may be heavy on very large libraries.") }, { - default: W(() => [U("span", w_, [t[0] ||= U("i", { + default: W(() => [U("span", E_, [t[0] ||= U("i", { class: "pi pi-sparkles", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.findSimilar", "Find Similar")), 1)])]), @@ -18401,7 +18401,7 @@ var S_ = { severity: "secondary", text: "" }, { - default: W(() => [U("span", T_, [t[1] ||= U("i", { + default: W(() => [U("span", D_, [t[1] ||= U("i", { class: "pi pi-clone", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.findDuplicates", "Find Duplicate")), 1)])]), @@ -18416,7 +18416,7 @@ var S_ = { severity: "secondary", text: "" }, { - default: W(() => [U("span", E_, [t[2] ||= U("i", { + default: W(() => [U("span", O_, [t[2] ||= U("i", { class: "pi pi-share-alt", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.generatedWithSameSaveNode", "Generated with same save node")), 1)])]), @@ -18430,7 +18430,7 @@ var S_ = { severity: "secondary", text: "" }, { - default: W(() => [U("span", D_, [t[3] ||= U("i", { + default: W(() => [U("span", k_, [t[3] ||= U("i", { class: "pi pi-sitemap", "aria-hidden": "true" }, null, -1), U("span", null, J(Z(R)("search.generatedFromSameWorkflow", "Generated from same workflow")), 1)])]), @@ -18439,11 +18439,11 @@ var S_ = { ])]); }; } -}), k_ = { class: "mjr-am-search-pill" }, A_ = ["id"], j_ = { class: "mjr-am-search-tools" }, M_ = { class: "mjr-popover-anchor" }, N_ = { class: "mjr-popover-anchor" }, P_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", F_ = "AND", I_ = /* @__PURE__ */ lr({ +}), j_ = { class: "mjr-am-search-pill" }, M_ = ["id"], N_ = { class: "mjr-am-search-tools" }, P_ = { class: "mjr-popover-anchor" }, F_ = { class: "mjr-popover-anchor" }, I_ = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", L_ = "AND", R_ = /* @__PURE__ */ dr({ __name: "SearchBar", emits: ["search-change"], setup(e, { expose: t, emit: n }) { - let r = n, i = lh(), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = lt("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Q(!1), h = Q(!0), g = Q(F_), _ = null, v = null, y = K(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = K(() => m.value ? Bt(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), P_) : Bt(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), P_)), x = K(() => m.value ? { + let r = n, i = dh(), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Me("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(o.value), m = Q(!1), h = Q(!0), g = Q(L_), _ = null, v = null, y = K(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), b = K(() => m.value ? Bt(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), I_) : Bt(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), I_)), x = K(() => m.value ? { background: "rgba(0, 188, 212, 0.2)", borderColor: "rgba(0, 188, 212, 0.6)", color: "#00BCD4", @@ -18480,13 +18480,13 @@ var S_ = { } }, T = async (e) => { let t = e.target?.value || ""; - i.searchQuery = t, i.metadataSearchMode = F_, S(), C({ query: t }), await j(); + i.searchQuery = t, i.metadataSearchMode = L_, S(), C({ query: t }), await j(); }, E = (e) => { let t = String(e || "").split(/\s+/); return t[t.length - 1] || ""; }; async function D() { - return _ || (v ||= re(st.METADATA_KEYS, { limit: 600 }).then((e) => { + return _ || (v ||= re(it.METADATA_KEYS, { limit: 600 }).then((e) => { let t = e?.data || {}; return _ = t, t; }), v); @@ -18502,11 +18502,11 @@ var S_ = { return Object.keys(i).filter((e) => e.startsWith(t)).slice(0, 12).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${t}:`)); } let [a, o = ""] = r.split(/:(.*)/s); - if (!Fn(a)) return []; + if (!In(a)) return []; let s = o.toLowerCase(), c = Array.isArray(t?.keys) ? t.keys : [], l = t?.workflow_nodes || {}; return [...c, ...Object.keys(l).flatMap((e) => (l[e] || []).map((t) => `workflow_nodes.${e}.${t}`))].filter((e) => String(e || "").toLowerCase().includes(s)).slice(0, 16).map((t) => O(e, `${n.startsWith("-") ? "-" : ""}${a}:${t}`)); } - let A = 0, j = bn(async () => { + let A = 0, j = Jt(async () => { let e = (p()?.value || "").trim(); if (m.value || e.length < 1) return; let t = ++A; @@ -18526,19 +18526,19 @@ var S_ = { })); } catch {} }, 300); - return or(() => i.searchQuery, (e) => { + return cr(() => i.searchQuery, (e) => { let t = p(); t && t.value !== e && (t.value = e); - }), or(h, (e) => { + }), cr(h, (e) => { !e && m.value && (m.value = !1), S(); - }), or(m, () => { + }), cr(m, () => { S(); - }), or(() => i.metadataSearchMode, (e) => { - String(e || "").toUpperCase() !== F_ && (i.metadataSearchMode = F_), g.value !== F_ && (g.value = F_), S(); - }), kr(() => { + }), cr(() => i.metadataSearchMode, (e) => { + String(e || "").toUpperCase() !== L_ && (i.metadataSearchMode = L_), g.value !== L_ && (g.value = L_), S(); + }), jr(() => { try { let e = p(); - e && (e.value = i.searchQuery || ""), i.metadataSearchMode = F_; + e && (e.value = i.searchQuery || ""), i.metadataSearchMode = L_; } catch (e) { console.debug?.(e); } @@ -18575,12 +18575,12 @@ var S_ = { h.value = !!e, S(); } }), (e, t) => { - let n = rr("MInputText"), r = rr("MButton"); + let n = ar("MInputText"), r = ar("MButton"); return q(), X("div", { ref_key: "searchSectionRef", ref: a, class: "mjr-am-search" - }, [U("div", k_, [ + }, [U("div", j_, [ t[0] ||= U("span", { class: "mjr-am-search-icon" }, [U("i", { class: "pi pi-search" })], -1), Y(n, { ref_key: "searchInputRef", @@ -18601,9 +18601,9 @@ var S_ = { ref_key: "dataListRef", ref: s, id: Z(d) - }, null, 8, A_) - ]), U("div", j_, [ - U("div", M_, [Y(r, { + }, null, 8, M_) + ]), U("div", N_, [ + U("div", P_, [Y(r, { ref_key: "semanticBtnRef", ref: u, type: "button", @@ -18614,7 +18614,7 @@ var S_ = { disabled: !h.value, "aria-disabled": !h.value, title: h.value ? Z(R)("search.semanticToggle", "Toggle AI semantic search (CLIP-based)") : Z(R)("search.semanticDisabled", "AI semantic search is disabled in settings"), - style: yr(x.value), + style: xr(x.value), onClick: w }, { default: W(() => [...t[1] ||= [U("i", { class: "pi pi-sparkles" }, null, -1)]]), @@ -18625,7 +18625,7 @@ var S_ = { "title", "style" ])]), - U("div", N_, [Y(r, { + U("div", F_, [Y(r, { ref_key: "similarBtnRef", ref: c, type: "button", @@ -18637,24 +18637,24 @@ var S_ = { }, { default: W(() => [...t[2] ||= [U("i", { class: "pi pi-search" }, null, -1)]]), _: 1 - }, 8, ["title"]), Y(O_, { + }, 8, ["title"]), Y(A_, { ref_key: "similarPopoverRef", ref: l }, null, 512)]), - mr(e.$slots, "filter-anchor"), - mr(e.$slots, "sort-anchor"), - mr(e.$slots, "collections-anchor"), - mr(e.$slots, "pinned-folders-anchor") + gr(e.$slots, "filter-anchor"), + gr(e.$slots, "sort-anchor"), + gr(e.$slots, "collections-anchor"), + gr(e.$slots, "pinned-folders-anchor") ])], 512); }; } -}), L_ = { +}), z_ = { class: "mjr-popover mjr-sort-popover", style: { display: "none" } -}, R_ = { class: "mjr-menu-item-label" }, z_ = /* @__PURE__ */ lr({ +}, B_ = { class: "mjr-menu-item-label" }, V_ = /* @__PURE__ */ dr({ __name: "SortPopover", setup(e) { - let t = lh(), n = K(() => t.sort || "mtime_desc"), r = (e) => { + let t = dh(), n = K(() => t.sort || "mtime_desc"), r = (e) => { t.sort = e; try { window.dispatchEvent(new CustomEvent("mjr:sort-changed", { detail: { sort: e } })); @@ -18703,33 +18703,33 @@ var S_ = { command: () => r(e.key) }))); return (e, t) => { - let r = rr("MMenu"); - return q(), X("div", L_, [Y(r, { + let r = ar("MMenu"); + return q(), X("div", z_, [Y(r, { model: i.value, class: "mjr-menu mjr-prime-menu mjr-sort-menu", pt: { list: { class: "mjr-menu mjr-prime-menu-list" } } }, { - item: W(({ item: e }) => [U("div", { class: wr(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [U("span", R_, J(e.label), 1), U("i", { - class: wr([e.icon, "mjr-menu-item-check"]), - style: yr({ opacity: +(n.value === e.key) }) + item: W(({ item: e }) => [U("div", { class: Er(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [U("span", B_, J(e.label), 1), U("i", { + class: Er([e.icon, "mjr-menu-item-check"]), + style: xr({ opacity: +(n.value === e.key) }) }, null, 6)], 2)]), _: 1 }, 8, ["model"])]); }; } -}), B_ = { class: "mjr-popover mjr-filter-popover mjr-popover--hidden" }, V_ = { class: "mjr-filter-head" }, H_ = { class: "mjr-filter-head-left" }, U_ = { class: "mjr-filter-kicker" }, W_ = { class: "mjr-filter-subtitle" }, G_ = { class: "mjr-filter-head-actions" }, K_ = { class: "mjr-filter-active-count" }, q_ = { class: "mjr-filter-group-title" }, J_ = { +}), H_ = { class: "mjr-popover mjr-filter-popover mjr-popover--hidden" }, U_ = { class: "mjr-filter-head" }, W_ = { class: "mjr-filter-head-left" }, G_ = { class: "mjr-filter-kicker" }, K_ = { class: "mjr-filter-subtitle" }, q_ = { class: "mjr-filter-head-actions" }, J_ = { class: "mjr-filter-active-count" }, Y_ = { class: "mjr-filter-group-title" }, X_ = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Y_ = { class: "mjr-filter-group-body" }, X_ = { class: "mjr-filter-card" }, Z_ = { class: "mjr-popover-row" }, Q_ = { class: "mjr-popover-label" }, $_ = { class: "mjr-popover-row" }, ev = { class: "mjr-popover-label" }, tv = ["title"], nv = { class: "mjr-filter-card" }, rv = { class: "mjr-popover-row" }, iv = { class: "mjr-popover-label" }, av = { class: "mjr-popover-row" }, ov = { class: "mjr-popover-label" }, sv = { class: "mjr-popover-row" }, cv = { class: "mjr-popover-label" }, lv = { class: "mjr-filter-stack" }, uv = { class: "mjr-popover-row" }, dv = { class: "mjr-popover-label" }, fv = { class: "mjr-popover-row" }, pv = { class: "mjr-popover-label" }, mv = { class: "mjr-filter-group-title" }, hv = { +}, Z_ = { class: "mjr-filter-group-body" }, Q_ = { class: "mjr-filter-card" }, $_ = { class: "mjr-popover-row" }, ev = { class: "mjr-popover-label" }, tv = { class: "mjr-popover-row" }, nv = { class: "mjr-popover-label" }, rv = ["title"], iv = { class: "mjr-filter-card" }, av = { class: "mjr-popover-row" }, ov = { class: "mjr-popover-label" }, sv = { class: "mjr-popover-row" }, cv = { class: "mjr-popover-label" }, lv = { class: "mjr-popover-row" }, uv = { class: "mjr-popover-label" }, dv = { class: "mjr-filter-stack" }, fv = { class: "mjr-popover-row" }, pv = { class: "mjr-popover-label" }, mv = { class: "mjr-popover-row" }, hv = { class: "mjr-popover-label" }, gv = { class: "mjr-filter-group-title" }, _v = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, gv = { class: "mjr-filter-group-body" }, _v = { class: "mjr-filter-card" }, vv = { class: "mjr-popover-row mjr-popover-row--3col" }, yv = { class: "mjr-popover-label" }, bv = { class: "mjr-popover-row" }, xv = { class: "mjr-popover-label" }, Sv = { class: "mjr-popover-row mjr-popover-row--3col" }, Cv = { class: "mjr-popover-label" }, wv = { class: "mjr-popover-row mjr-popover-row--3col" }, Tv = { class: "mjr-popover-label" }, Ev = { class: "mjr-filter-group-title" }, Dv = { +}, vv = { class: "mjr-filter-group-body" }, yv = { class: "mjr-filter-card" }, bv = { class: "mjr-popover-row mjr-popover-row--3col" }, xv = { class: "mjr-popover-label" }, Sv = { class: "mjr-popover-row" }, Cv = { class: "mjr-popover-label" }, wv = { class: "mjr-popover-row mjr-popover-row--3col" }, Tv = { class: "mjr-popover-label" }, Ev = { class: "mjr-popover-row mjr-popover-row--3col" }, Dv = { class: "mjr-popover-label" }, Ov = { class: "mjr-filter-group-title" }, kv = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Ov = { class: "mjr-filter-group-body" }, kv = { class: "mjr-filter-card mjr-filter-card--agenda" }, Av = { class: "mjr-popover-row" }, jv = { class: "mjr-popover-label" }, Mv = { class: "mjr-popover-row" }, Nv = { class: "mjr-popover-label" }, Pv = /* @__PURE__ */ lr({ +}, Av = { class: "mjr-filter-group-body" }, jv = { class: "mjr-filter-card mjr-filter-card--agenda" }, Mv = { class: "mjr-popover-row" }, Nv = { class: "mjr-popover-label" }, Pv = { class: "mjr-popover-row" }, Fv = { class: "mjr-popover-label" }, Iv = /* @__PURE__ */ dr({ __name: "FilterPopover", setup(e, { expose: t }) { - let n = lh(), r = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = Q(null), m = Q([{ + let n = dh(), r = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = Q(null), m = Q([{ label: R("filter.any", "Any"), value: "" }]), h = (e) => e?.$el || e || null, g = (e) => h(e.value)?.value || "", _ = (e, t) => { @@ -18939,7 +18939,7 @@ var S_ = { console.debug?.(e); } }; - kr(() => { + jr(() => { A(); }); let j = (e, { emit: t = !0 } = {}) => { @@ -19093,9 +19093,9 @@ var S_ = { return u.value; } }), (e, t) => { - let i = rr("MButton"), m = rr("MSelect"), h = rr("MCheckbox"), g = rr("MInputText"); - return q(), X("div", B_, [ - U("div", V_, [U("div", H_, [U("div", U_, J(Z(R)("label.filters", "Filters")), 1), U("div", W_, J(Z(R)("label.refineResults", "Refine your results")), 1)]), U("div", G_, [U("span", K_, J(ve.value), 1), Y(i, { + let i = ar("MButton"), m = ar("MSelect"), h = ar("MCheckbox"), g = ar("MInputText"); + return q(), X("div", H_, [ + U("div", U_, [U("div", W_, [U("div", G_, J(Z(R)("label.filters", "Filters")), 1), U("div", K_, J(Z(R)("label.refineResults", "Refine your results")), 1)]), U("div", q_, [U("span", J_, J(ve.value), 1), Y(i, { type: "button", class: "mjr-filter-clear-all", severity: "secondary", @@ -19103,10 +19103,10 @@ var S_ = { disabled: ve.value === 0, onClick: ye }, { - default: W(() => [er(J(Z(R)("action.clearAll", "Clear all")), 1)]), + default: W(() => [nr(J(Z(R)("action.clearAll", "Clear all")), 1)]), _: 1 }, 8, ["disabled"])])]), - U("div", { class: wr(["mjr-filter-group mjr-filter-group--core", { "is-open": se("core") }]) }, [Y(i, { + U("div", { class: Er(["mjr-filter-group mjr-filter-group--core", { "is-open": se("core") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", @@ -19114,9 +19114,9 @@ var S_ = { "aria-expanded": String(se("core")), onClick: t[0] ||= (e) => oe("core") }, { - default: W(() => [U("span", q_, J(Z(R)("group.core", "Core")), 1), U("span", J_, J(se("core") ? "▾" : "▸"), 1)]), + default: W(() => [U("span", Y_, J(Z(R)("group.core", "Core")), 1), U("span", X_, J(se("core") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), hr(U("div", Y_, [U("div", X_, [U("div", Z_, [U("div", Q_, J(Z(R)("label.type")), 1), Y(m, { + }, 8, ["aria-expanded"]), _r(U("div", Z_, [U("div", Q_, [U("div", $_, [U("div", ev, J(Z(R)("label.type")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterByFileType", "Filter by file type"), @@ -19129,7 +19129,7 @@ var S_ = { "title", "model-value", "options" - ])]), U("div", $_, [U("div", ev, J(Z(R)("label.workflow")), 1), U("label", { + ])]), U("div", tv, [U("div", nv, J(Z(R)("label.workflow")), 1), U("label", { class: "mjr-popover-toggle", title: Z(R)("tooltip.filterWorkflowOnly", "Show only assets with embedded workflow data") }, [Y(h, { @@ -19137,8 +19137,8 @@ var S_ = { "model-value": !!Z(n).workflowOnly, binary: "", "onUpdate:modelValue": M - }, null, 8, ["model-value"]), U("span", null, J(Z(R)("filter.onlyWithWorkflow")), 1)], 8, tv)])]), U("div", nv, [ - U("div", rv, [U("div", iv, J(Z(R)("label.workflowType", "Workflow type")), 1), Y(m, { + }, null, 8, ["model-value"]), U("span", null, J(Z(R)("filter.onlyWithWorkflow")), 1)], 8, rv)])]), U("div", iv, [ + U("div", av, [U("div", ov, J(Z(R)("label.workflowType", "Workflow type")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(Z(n).workflowType || "").trim().toUpperCase(), @@ -19147,7 +19147,7 @@ var S_ = { "option-value": "value", "onUpdate:modelValue": N }, null, 8, ["model-value", "options"])]), - U("div", av, [U("div", ov, J(Z(R)("label.sameWorkflow", "Generated with Same Workflow")), 1), Y(g, { + U("div", sv, [U("div", cv, J(Z(R)("label.sameWorkflow", "Generated with Same Workflow")), 1), Y(g, { ref_key: "workflowIdInputRef", ref: f, class: "mjr-input", @@ -19161,7 +19161,7 @@ var S_ = { "placeholder", "model-value" ])]), - U("div", sv, [U("div", cv, J(Z(R)("label.workflowModelFamily", "Model family")), 1), U("div", lv, [Y(m, { + U("div", lv, [U("div", uv, J(Z(R)("label.workflowModelFamily", "Model family")), 1), U("div", dv, [Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(Z(n).workflowModelFilter || ""), @@ -19178,7 +19178,7 @@ var S_ = { "onUpdate:modelValue": ee, onChange: t[2] ||= (e) => ee(e?.target?.value) }, null, 8, ["placeholder", "model-value"])])]), - U("div", uv, [U("div", dv, J(Z(R)("label.workflowRunsOn", "Runs on")), 1), Y(m, { + U("div", fv, [U("div", pv, J(Z(R)("label.workflowRunsOn", "Runs on")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": String(Z(n).workflowRunsOnFilter || "").trim().toLowerCase(), @@ -19187,7 +19187,7 @@ var S_ = { "option-value": "value", "onUpdate:modelValue": te }, null, 8, ["model-value", "options"])]), - U("div", fv, [U("div", pv, J(Z(R)("label.rating")), 1), Y(m, { + U("div", mv, [U("div", hv, J(Z(R)("label.rating")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterMinRating", "Filter by minimum rating"), @@ -19201,8 +19201,8 @@ var S_ = { "model-value", "options" ])]) - ])], 512), [[_r, se("core")]])], 2), - U("div", { class: wr(["mjr-filter-group mjr-filter-group--media", { "is-open": se("media") }]) }, [Y(i, { + ])], 512), [[yr, se("core")]])], 2), + U("div", { class: Er(["mjr-filter-group mjr-filter-group--media", { "is-open": se("media") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", @@ -19210,11 +19210,11 @@ var S_ = { "aria-expanded": String(se("media")), onClick: t[3] ||= (e) => oe("media") }, { - default: W(() => [U("span", mv, J(Z(R)("group.media", "Media")), 1), U("span", hv, J(se("media") ? "▾" : "▸"), 1)]), + default: W(() => [U("span", gv, J(Z(R)("group.media", "Media")), 1), U("span", _v, J(se("media") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), hr(U("div", gv, [U("div", _v, [ - U("div", vv, [ - U("div", yv, J(Z(R)("label.fileSizeMB", "File size (MB)")), 1), + }, 8, ["aria-expanded"]), _r(U("div", vv, [U("div", yv, [ + U("div", bv, [ + U("div", xv, J(Z(R)("label.fileSizeMB", "File size (MB)")), 1), Y(g, { ref_key: "minSizeInputRef", ref: r, @@ -19238,7 +19238,7 @@ var S_ = { onChange: I }, null, 8, ["placeholder", "value"]) ]), - U("div", bv, [U("div", xv, J(Z(R)("label.resolutionPx", "Resolution (px)")), 1), Y(m, { + U("div", Sv, [U("div", Cv, J(Z(R)("label.resolutionPx", "Resolution (px)")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": E.value, @@ -19247,8 +19247,8 @@ var S_ = { "option-value": "value", "onUpdate:modelValue": re }, null, 8, ["model-value", "options"])]), - U("div", Sv, [ - U("div", Cv, J(Z(R)("label.resolutionMinWxH", "Min WxH (px)")), 1), + U("div", wv, [ + U("div", Tv, J(Z(R)("label.resolutionMinWxH", "Min WxH (px)")), 1), Y(g, { ref_key: "minWidthInputRef", ref: o, @@ -19282,8 +19282,8 @@ var S_ = { "value" ]) ]), - U("div", wv, [ - U("div", Tv, J(Z(R)("label.resolutionMaxWxH", "Max WxH (px)")), 1), + U("div", Ev, [ + U("div", Dv, J(Z(R)("label.resolutionMaxWxH", "Max WxH (px)")), 1), Y(g, { ref_key: "maxWidthInputRef", ref: c, @@ -19317,8 +19317,8 @@ var S_ = { "value" ]) ]) - ])], 512), [[_r, se("media")]])], 2), - U("div", { class: wr(["mjr-filter-group mjr-filter-group--time", { "is-open": se("time") }]) }, [Y(i, { + ])], 512), [[yr, se("media")]])], 2), + U("div", { class: Er(["mjr-filter-group mjr-filter-group--time", { "is-open": se("time") }]) }, [Y(i, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", @@ -19326,9 +19326,9 @@ var S_ = { "aria-expanded": String(se("time")), onClick: t[4] ||= (e) => oe("time") }, { - default: W(() => [U("span", Ev, J(Z(R)("group.time", "Time")), 1), U("span", Dv, J(se("time") ? "▾" : "▸"), 1)]), + default: W(() => [U("span", Ov, J(Z(R)("group.time", "Time")), 1), U("span", kv, J(se("time") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), hr(U("div", Ov, [U("div", kv, [U("div", Av, [U("div", jv, J(Z(R)("label.dateRange")), 1), Y(m, { + }, 8, ["aria-expanded"]), _r(U("div", Av, [U("div", jv, [U("div", Mv, [U("div", Nv, J(Z(R)("label.dateRange")), 1), Y(m, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", title: Z(R)("tooltip.filterByDateRange", "Filter by date range"), @@ -19341,7 +19341,7 @@ var S_ = { "title", "model-value", "options" - ])]), U("div", Mv, [U("div", Nv, J(Z(R)("label.agenda")), 1), U("div", { + ])]), U("div", Pv, [U("div", Fv, J(Z(R)("label.agenda")), 1), U("div", { ref_key: "agendaContainerRef", ref: u, class: "mjr-agenda-container" @@ -19349,14 +19349,14 @@ var S_ = { ref_key: "dateExactInputRef", ref: d, type: "date", - class: wr(["mjr-input mjr-agenda-input", D.value]), + class: Er(["mjr-input mjr-agenda-input", D.value]), value: Z(n).dateExactFilter, onChange: ae - }, null, 8, ["class", "value"])], 512)])])], 512), [[_r, se("time")]])], 2) + }, null, 8, ["class", "value"])], 512)])])], 512), [[yr, se("time")]])], 2) ]); }; } -}), Fv = 128, Iv = Object.freeze([ +}), Lv = 128, Rv = Object.freeze([ { key: "portraits", label: "Portraits", @@ -19394,10 +19394,10 @@ var S_ = { iconClass: "pi pi-circle" } ]); -function Lv(e) { +function zv(e) { try { let t = String(e ?? "").trim(); - if (!t || t.length > Fv || t.includes("\0")) return ""; + if (!t || t.length > Lv || t.includes("\0")) return ""; for (let e = 0; e < t.length; e += 1) { let n = t.charCodeAt(e); if (n <= 31 || n === 127) return ""; @@ -19407,7 +19407,7 @@ function Lv(e) { return ""; } } -function Rv(e) { +function Bv(e) { if (!e || typeof e != "object") return null; let t = String(e.filepath || "").trim(); return t ? { @@ -19419,10 +19419,10 @@ function Rv(e) { root_id: String(e.root_id || e.rootId || e.custom_root_id || "").trim() || void 0 } : null; } -function zv(e) { +function Vv(e) { let t = [], n = [], r = /* @__PURE__ */ new Set(); for (let i of Array.isArray(e) ? e : []) { - let e = Rv(i); + let e = Bv(i); if (e?.filepath) { let n = e.filepath.toLowerCase(); if (r.has(n)) continue; @@ -19437,7 +19437,7 @@ function zv(e) { missingIds: n }; } -async function Bv(e) { +async function Hv(e) { let t = Array.from(new Set((Array.isArray(e) ? e : []).map((e) => Number(e)).filter((e) => Number.isFinite(e) && e > 0))); if (!t.length) return { ok: !0, @@ -19448,13 +19448,13 @@ async function Bv(e) { ok: !1, error: String(n?.error || "Failed to fetch assets") }; - let { assets: r } = zv(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); + let { assets: r } = Vv(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); return { ok: !0, data: r }; } -function Vv(e) { +function Uv(e) { let t = String(e?.label || "").trim(); if (t && !/^group\b/i.test(t)) return t; let n = (Array.isArray(e?.dominant_tags) ? e.dominant_tags : []).map((e) => String(e || "").trim()).filter(Boolean); @@ -19472,43 +19472,43 @@ function Vv(e) { let s = Object.entries(o).sort((e, t) => t[1] - e[1])[0]?.[0] || "other", c = s === "image" ? "Images" : s === "video" ? "Videos" : s === "audio" ? "Audio" : "Media", l = Number(e?.cluster_id), u = Number.isFinite(l) ? ` ${l + 1}` : ""; return a ? `${a} - ${c}` : `${c} Cluster${u}`; } -function Hv() { +function Wv() { try { - return !!(Jt()?.ai?.vectorSearchEnabled ?? !0); + return !!(Vn()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } } // ui/vue/components/panel/CollectionsPopover.vue?vue&type=script&setup=true&lang.ts -var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-item-label" }, Gv = { class: "mjr-menu-item-label" }, Kv = { class: "mjr-menu-item-right" }, qv = { +var Gv = { class: "mjr-menu mjr-collections-menu" }, Kv = { class: "mjr-menu-item-label" }, qv = { class: "mjr-menu-item-label" }, Jv = { class: "mjr-menu-item-right" }, Yv = { key: 0, class: "mjr-menu-item-hint" -}, Jv = { +}, Xv = { key: 1, class: "mjr-muted" -}, Yv = { +}, Zv = { key: 2, class: "mjr-state-block is-error" -}, Xv = { +}, Qv = { key: 3, class: "mjr-muted" -}, Zv = { class: "mjr-collection-row" }, Qv = { class: "mjr-menu-item-label" }, $v = { class: "mjr-menu-item-right" }, ey = { +}, $v = { class: "mjr-collection-row" }, ey = { class: "mjr-menu-item-label" }, ty = { class: "mjr-menu-item-right" }, ny = { key: 0, class: "mjr-menu-item-hint" -}, ty = { class: "mjr-state-block" }, ny = { class: "mjr-section-title mjr-section-title--cyan" }, ry = { class: "mjr-section-hint" }, iy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, ay = { class: "mjr-section-title mjr-section-title--violet" }, oy = { class: "mjr-section-hint" }, sy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, cy = { +}, ry = { class: "mjr-state-block" }, iy = { class: "mjr-section-title mjr-section-title--cyan" }, ay = { class: "mjr-section-hint" }, oy = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, sy = { class: "mjr-section-title mjr-section-title--violet" }, cy = { class: "mjr-section-hint" }, ly = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, uy = { key: 0, class: "mjr-state-block is-error" -}, ly = { class: "mjr-cluster-thumbs" }, uy = ["src", "alt"], dy = { class: "mjr-cluster-info" }, fy = ["title"], py = { class: "mjr-cluster-count" }, my = "mjr:collections-changed", hy = /* @__PURE__ */ lr({ +}, dy = { class: "mjr-cluster-thumbs" }, fy = ["src", "alt"], py = { class: "mjr-cluster-info" }, my = ["title"], hy = { class: "mjr-cluster-count" }, gy = "mjr:collections-changed", _y = /* @__PURE__ */ dr({ __name: "CollectionsPopover", setup(t, { expose: n }) { - let r = lh(), i = Q(null), a = Q([]), o = Q(!1), s = Q(""), c = Q(!1), l = Q(!0), u = Q(!1), p = Q(!1), m = Q(!1), h = Q([]), g = Q(""), _ = Q(""), v = 0, y = null, b = !1, x = K(() => String(r.collectionId || "").trim()), C = K(() => String(r.collectionName || "").trim()), T = K(() => !!x.value), O = K(() => !l.value || p.value), k = K(() => l.value && u.value), A = K(() => `${Math.max(1, Math.min(a.value.length, 6)) * 48}px`); + let r = dh(), i = Q(null), a = Q([]), o = Q(!1), s = Q(""), c = Q(!1), l = Q(!0), u = Q(!1), p = Q(!1), m = Q(!1), h = Q([]), g = Q(""), _ = Q(""), v = 0, y = null, b = !1, x = K(() => String(r.collectionId || "").trim()), C = K(() => String(r.collectionName || "").trim()), T = K(() => !!x.value), O = K(() => !l.value || p.value), k = K(() => l.value && u.value), A = K(() => `${Math.max(1, Math.min(a.value.length, 6)) * 48}px`); function j() { let e = i.value; return !!e && String(e.style.display || "").toLowerCase() !== "none"; } function M({ collectionId: e = x.value, collectionName: t = C.value, close: n = !0, reload: r = !0 } = {}) { try { - window.dispatchEvent(new CustomEvent(my, { detail: { + window.dispatchEvent(new CustomEvent(gy, { detail: { collectionId: String(e || ""), collectionName: String(t || ""), close: n !== !1, @@ -19520,13 +19520,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } function N(e) { try { - return it(e) || ""; + return We(e) || ""; } catch (e) { return console.debug?.(e), ""; } } async function P() { - if (!Hv()) return { + if (!Wv()) return { enabled: !1, vectorAvailable: !1, vectorDisabled: !1 @@ -19583,7 +19583,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite let I = F("create", async () => { let t = await wt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "Collection name")); if (!t) return; - let n = Lv(t); + let n = zv(t); if (!n) { e(R("toast.invalidCollectionName", "Invalid collection name"), "error"); return; @@ -19629,9 +19629,9 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite if (!i) return; let a = await d(String(t?.query || ""), 50); if (a?.ok && Array.isArray(a?.data) && a.data.length > 0) { - let t = zv(a.data), r = t.assets; + let t = Vv(a.data), r = t.assets; if (t.missingIds.length) { - let e = await Bv(t.missingIds); + let e = await Hv(t.missingIds); e.ok && Array.isArray(e.data) && (r = ee(r, e.data)); } if (r.length) { @@ -19677,7 +19677,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } h.value = t.data.map((e) => ({ ...e, - _label: Vv(e) + _label: Uv(e) })); } catch (t) { console.error("[Majoor] Discover groups failed:", t), g.value = R("toast.clusterAnalysisFailed", "Cluster analysis failed"), e(R("toast.clusterAnalysisFailed", "Cluster analysis failed"), "error"); @@ -19691,7 +19691,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite if (!_.value) { _.value = n; try { - let n = String(t?._label || Vv(t) || "").trim(); + let n = String(t?._label || Uv(t) || "").trim(); if (!n) return; let r = await S(n); if (!r?.ok) { @@ -19700,7 +19700,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } let i = String(r?.data?.id || ""), a = Array.isArray(t?.all_asset_ids) ? t.all_asset_ids : []; if (i && a.length) { - let t = await Bv(a); + let t = await Hv(a); if (!t.ok) { e(t.error || R("toast.failedLoadClusterAssets", "Failed to load cluster assets"), "error"); return; @@ -19731,12 +19731,12 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite let e = j(); e && !b && te().catch(() => {}), b = e; } - return kr(() => { + return jr(() => { ce(), typeof MutationObserver < "u" && i.value && (y = new MutationObserver(() => ce()), y.observe(i.value, { attributes: !0, attributeFilter: ["style"] })); - }), tr(() => { + }), rr(() => { try { y?.disconnect?.(); } catch (e) { @@ -19744,13 +19744,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } y = null; }), n({ refresh: te }), (e, t) => { - let n = rr("MButton"), r = rr("MVirtualScroller"); + let n = ar("MButton"), r = ar("MVirtualScroller"); return q(), X("div", { ref_key: "rootRef", ref: i, class: "mjr-popover mjr-collections-popover", style: { display: "none" } - }, [U("div", Uv, [ + }, [U("div", Gv, [ Y(n, { type: "button", class: "mjr-menu-item", @@ -19759,10 +19759,10 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: Z(I) }, { - default: W(() => [U("span", Wv, J(Z(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: W(() => [U("span", Kv, J(Z(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 1 }, 8, ["disabled", "onClick"]), - T.value ? (q(), nr(n, { + T.value ? (q(), ir(n, { key: 0, type: "button", class: "mjr-menu-item", @@ -19771,11 +19771,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: Z(ne) }, { - default: W(() => [U("span", Gv, J(Z(R)("ctx.exitCollection", "Exit collection")), 1), U("span", Kv, [C.value ? (q(), X("span", qv, J(C.value), 1)) : G("", !0), t[1] ||= U("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), + default: W(() => [U("span", qv, J(Z(R)("ctx.exitCollection", "Exit collection")), 1), U("span", Jv, [C.value ? (q(), X("span", Yv, J(C.value), 1)) : G("", !0), t[1] ||= U("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), _: 1 }, 8, ["disabled", "onClick"])) : G("", !0), t[9] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - o.value ? (q(), X("div", Jv, J(Z(R)("label.loading", "Loading...")), 1)) : s.value ? (q(), X("div", Yv, J(s.value), 1)) : a.value.length ? (q(), nr(r, { + o.value ? (q(), X("div", Xv, J(Z(R)("label.loading", "Loading...")), 1)) : s.value ? (q(), X("div", Zv, J(s.value), 1)) : a.value.length ? (q(), ir(r, { key: 4, items: a.value, "item-size": 48, @@ -19783,15 +19783,15 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "num-tolerated-items": 4, class: "mjr-collections-virtual-list" }, { - item: W(({ item: e }) => [U("div", Zv, [Y(n, { + item: W(({ item: e }) => [U("div", $v, [Y(n, { type: "button", - class: wr(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), + class: Er(["mjr-menu-item", { "is-active": x.value === String(e.id || "") }]), severity: "secondary", text: "", disabled: _.value !== "", onClick: (t) => Z(re)(e) }, { - default: W(() => [U("span", Qv, J(e.name || e.id), 1), U("span", $v, [Number(e.count || 0) ? (q(), X("span", ey, J(Number(e.count || 0)), 1)) : G("", !0), t[2] ||= U("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), + default: W(() => [U("span", ey, J(e.name || e.id), 1), U("span", ty, [Number(e.count || 0) ? (q(), X("span", ny, J(Number(e.count || 0)), 1)) : G("", !0), t[2] ||= U("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), _: 2 }, 1032, [ "class", @@ -19804,7 +19804,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite text: "", disabled: _.value !== "", title: Z(R)("tooltip.deleteCollection", "Delete collection"), - onClick: fr((t) => Z(ie)(e), ["stop", "prevent"]) + onClick: mr((t) => Z(ie)(e), ["stop", "prevent"]) }, { default: W(() => [...t[3] ||= [U("i", { class: "pi pi-trash" }, null, -1)]]), _: 1 @@ -19814,13 +19814,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "onClick" ])])]), _: 1 - }, 8, ["items", "scroll-height"])) : (q(), X("div", Xv, J(Z(R)("msg.noCollections", "No collections yet")), 1)), - !c.value && O.value ? (q(), X(H, { key: 5 }, [t[4] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", ty, J(l.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : G("", !0), + }, 8, ["items", "scroll-height"])) : (q(), X("div", Qv, J(Z(R)("msg.noCollections", "No collections yet")), 1)), + !c.value && O.value ? (q(), X(H, { key: 5 }, [t[4] ||= U("div", { class: "mjr-menu-divider" }, null, -1), U("div", ry, J(l.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : G("", !0), !c.value && k.value ? (q(), X(H, { key: 6 }, [ t[7] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - U("div", ny, J(Z(R)("label.smartSuggestions", "Smart Suggestions")), 1), - U("div", ry, J(Z(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), - (q(!0), X(H, null, pr(Z(Iv), (e) => (q(), nr(n, { + U("div", iy, J(Z(R)("label.smartSuggestions", "Smart Suggestions")), 1), + U("div", ay, J(Z(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), + (q(!0), X(H, null, hr(Z(Rv), (e) => (q(), ir(n, { key: e.key, type: "button", class: "mjr-menu-item mjr-menu-item--smart", @@ -19829,12 +19829,12 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite disabled: _.value !== "", onClick: (t) => oe(e) }, { - default: W(() => [U("span", iy, [U("i", { class: wr(e.iconClass) }, null, 2), U("span", null, J(e.label), 1)]), t[5] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: W(() => [U("span", oy, [U("i", { class: Er(e.iconClass) }, null, 2), U("span", null, J(e.label), 1)]), t[5] ||= U("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 2 }, 1032, ["disabled", "onClick"]))), 128)), t[8] ||= U("div", { class: "mjr-menu-divider" }, null, -1), - U("div", ay, J(Z(R)("label.discoverGroups", "Discover Groups")), 1), - U("div", oy, J(Z(R)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), + U("div", sy, J(Z(R)("label.discoverGroups", "Discover Groups")), 1), + U("div", cy, J(Z(R)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), Y(n, { type: "button", class: "mjr-menu-item mjr-menu-item--cluster", @@ -19843,25 +19843,25 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite disabled: m.value || _.value !== "", onClick: se }, { - default: W(() => [U("span", sy, [t[6] ||= U("i", { class: "pi pi-search" }, null, -1), U("span", null, J(m.value ? Z(R)("label.analyzing", "Analyzing...") : Z(R)("label.analyzeLibrary", "Analyze library")), 1)])]), + default: W(() => [U("span", ly, [t[6] ||= U("i", { class: "pi pi-search" }, null, -1), U("span", null, J(m.value ? Z(R)("label.analyzing", "Analyzing...") : Z(R)("label.analyzeLibrary", "Analyze library")), 1)])]), _: 1 }, 8, ["disabled"]), - g.value ? (q(), X("div", cy, J(g.value), 1)) : G("", !0), - (q(!0), X(H, null, pr(h.value, (e) => (q(), X("div", { + g.value ? (q(), X("div", uy, J(g.value), 1)) : G("", !0), + (q(!0), X(H, null, hr(h.value, (e) => (q(), X("div", { key: e.cluster_id, class: "mjr-cluster-row" }, [ - U("div", ly, [(q(!0), X(H, null, pr(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (q(), X("img", { + U("div", dy, [(q(!0), X(H, null, hr(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (q(), X("img", { key: `${e.cluster_id}-${n}`, class: "mjr-cluster-thumb", src: N(t), alt: String(t?.filename || e._label || ""), loading: "lazy" - }, null, 8, uy))), 128))]), - U("div", dy, [U("div", { + }, null, 8, fy))), 128))]), + U("div", py, [U("div", { class: "mjr-cluster-name", title: e._label - }, J(e._label), 9, fy), U("div", py, J(Number(e.size || 0)) + " " + J(Z(R)("label.assets", "assets")), 1)]), + }, J(e._label), 9, my), U("div", hy, J(Number(e.size || 0)) + " " + J(Z(R)("label.assets", "assets")), 1)]), Y(n, { type: "button", class: "mjr-cluster-create-btn", @@ -19870,7 +19870,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite title: Z(R)("ctx.createCollection", "Create collection"), onClick: (t) => L(e) }, { - default: W(() => [er(J(_.value === `cluster:${String(e.cluster_id ?? "")}` ? Z(R)("label.loading", "Loading...") : Z(R)("label.create", "Create")), 1)]), + default: W(() => [nr(J(_.value === `cluster:${String(e.cluster_id ?? "")}` ? Z(R)("label.loading", "Loading...") : Z(R)("label.create", "Create")), 1)]), _: 2 }, 1032, [ "disabled", @@ -19882,16 +19882,16 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite ])], 512); }; } -}), gy = { class: "mjr-popover mjr-pinned-folders-popover mjr-popover--hidden" }, _y = { +}), vy = { class: "mjr-popover mjr-pinned-folders-popover mjr-popover--hidden" }, yy = { key: 0, class: "mjr-muted mjr-pinned-folders-empty" -}, vy = { +}, by = { key: 1, class: "mjr-muted mjr-pinned-folders-empty" -}, yy = { class: "mjr-pinned-folder-label" }, by = { +}, xy = { class: "mjr-pinned-folder-label" }, Sy = { key: 0, class: "mjr-menu-item-hint mjr-pinned-folder-path" -}, xy = /* @__PURE__ */ lr({ +}, Cy = /* @__PURE__ */ dr({ __name: "PinnedFoldersPopover", setup(e, { expose: t }) { let n = Q(null), r = Q([]), i = Q(!1), a = Q("No pinned folders"), o = Q("Loading..."), s = Q("Unpin folder"), c = Q(null), l = Q(null); @@ -19922,13 +19922,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite setPinnedFolders: d, setPinnedFoldersLoading: f }), (e, t) => { - let c = rr("MButton"); - return q(), X("div", gy, [U("div", { + let c = ar("MButton"); + return q(), X("div", vy, [U("div", { ref_key: "menuRef", ref: n, class: "mjr-menu mjr-pinned-folders-menu", role: "menu" - }, [i.value ? (q(), X("div", _y, J(o.value), 1)) : r.value.length ? (q(!0), X(H, { key: 2 }, pr(r.value, (e) => (q(), X("div", { + }, [i.value ? (q(), X("div", yy, J(o.value), 1)) : r.value.length ? (q(!0), X(H, { key: 2 }, hr(r.value, (e) => (q(), X("div", { key: e.id, class: "mjr-pinned-folder-row" }, [Y(c, { @@ -19938,7 +19938,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite severity: "secondary", onClick: (t) => p(e) }, { - default: W(() => [U("span", yy, J(e.label), 1), e.path ? (q(), X("span", by, J(e.path), 1)) : G("", !0)]), + default: W(() => [U("span", xy, J(e.label), 1), e.path ? (q(), X("span", Sy, J(e.path), 1)) : G("", !0)]), _: 2 }, 1032, ["onClick"]), Y(c, { type: "button", @@ -19958,13 +19958,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "title", "aria-label", "onClick" - ])]))), 128)) : (q(), X("div", vy, J(a.value), 1))], 512)]); + ])]))), 128)) : (q(), X("div", by, J(a.value), 1))], 512)]); }; } -}), Sy = { +}), wy = { class: "mjr-popover mjr-custom-popover", style: { display: "none" } -}, Cy = { class: "mjr-popover-row" }, wy = { class: "mjr-popover-label" }, Ty = { class: "mjr-popover-row mjr-popover-row--actions" }, Ey = /* @__PURE__ */ lr({ +}, Ty = { class: "mjr-popover-row" }, Ey = { class: "mjr-popover-label" }, Dy = { class: "mjr-popover-row mjr-popover-row--actions" }, Oy = /* @__PURE__ */ dr({ __name: "CustomRootsPopover", setup(e, { expose: t }) { let n = Q([{ @@ -20047,8 +20047,8 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite return s(o.value); } }), (e, t) => { - let s = rr("MSelect"), c = rr("MButton"); - return q(), X("div", Sy, [U("div", Cy, [U("div", wy, J(Z(R)("label.folder")), 1), Y(s, { + let s = ar("MSelect"), c = ar("MButton"); + return q(), X("div", wy, [U("div", Ty, [U("div", Ey, J(Z(R)("label.folder")), 1), Y(s, { class: "mjr-select", "model-value": r.value, options: n.value, @@ -20060,14 +20060,14 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "model-value", "options", "disabled" - ])]), U("div", Ty, [Y(c, { + ])]), U("div", Dy, [Y(c, { ref_key: "customAddBtnRef", ref: a, type: "button", class: "mjr-btn", severity: "secondary" }, { - default: W(() => [er(J(Z(R)("btn.add")), 1)]), + default: W(() => [nr(J(Z(R)("btn.add")), 1)]), _: 1 }, 512), Y(c, { ref_key: "customRemoveBtnRef", @@ -20077,15 +20077,15 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite severity: "secondary", disabled: "" }, { - default: W(() => [er(J(Z(R)("btn.remove")), 1)]), + default: W(() => [nr(J(Z(R)("btn.remove")), 1)]), _: 1 }, 512)])]); }; } -}), Dy = ["aria-label"], Oy = { class: "mjr-messages-head" }, ky = { class: "mjr-messages-actions" }, Ay = ["title"], jy = { class: "mjr-messages-star-label" }, My = { +}), ky = ["aria-label"], Ay = { class: "mjr-messages-head" }, jy = { class: "mjr-messages-actions" }, My = ["title"], Ny = { class: "mjr-messages-star-label" }, Py = { class: "mjr-messages-tabs", role: "tablist" -}, Ny = { class: "mjr-messages-panels" }, Py = { class: "mjr-messages-empty" }, Fy = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Iy = /* @__PURE__ */ lr({ +}, Fy = { class: "mjr-messages-panels" }, Iy = { class: "mjr-messages-empty" }, Ly = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Ry = /* @__PURE__ */ dr({ __name: "MessagePopover", setup(e, { expose: t }) { let n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = Q(null), c = Q(null), l = Q(null), u = Q(null), d = Q(null), f = Q(null), p = (e) => e?.$el || e || null; @@ -20124,7 +20124,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite return f.value; } }), (e, t) => { - let p = rr("MButton"), m = rr("MDialog"); + let p = ar("MButton"), m = ar("MDialog"); return q(), X("div", { class: "mjr-popover mjr-messages-popover", id: "mjr-messages-popover", @@ -20150,12 +20150,12 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } }, { default: W(() => [ - U("div", Oy, [U("div", { + U("div", Ay, [U("div", { ref_key: "titleRef", ref: n, class: "mjr-messages-title" - }, J(Z(R)("label.messages", "Messages")), 513), U("div", ky, [U("a", { - href: Fy, + }, J(Z(R)("label.messages", "Messages")), 513), U("div", jy, [U("a", { + href: Ly, target: "_blank", rel: "noopener noreferrer", class: "mjr-btn mjr-messages-star-link", @@ -20163,7 +20163,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, [t[0] ||= U("span", { class: "mjr-messages-star-icon", "aria-hidden": "true" - }, "★", -1), U("span", jy, J(Z(R)("btn.giveStar", "Give a star")), 1)], 8, Ay), Y(p, { + }, "★", -1), U("span", Ny, J(Z(R)("btn.giveStar", "Give a star")), 1)], 8, My), Y(p, { ref_key: "markReadBtnRef", ref: r, type: "button", @@ -20171,10 +20171,10 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite severity: "secondary", title: Z(R)("tooltip.markMessagesRead", "Mark all messages as read") }, { - default: W(() => [er(J(Z(R)("btn.markAllRead", "Mark all read")), 1)]), + default: W(() => [nr(J(Z(R)("btn.markAllRead", "Mark all read")), 1)]), _: 1 }, 8, ["title"])])]), - U("div", My, [ + U("div", Py, [ Y(p, { ref_key: "messageTabBtnRef", ref: i, @@ -20239,11 +20239,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-controls": "mjr-shortcuts-panel", id: "mjr-shortcuts-tab" }, { - default: W(() => [er(J(Z(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), + default: W(() => [nr(J(Z(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), _: 1 }, 512) ]), - U("div", Ny, [ + U("div", Fy, [ U("div", { ref_key: "messageListRef", ref: u, @@ -20251,7 +20251,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite id: "mjr-messages-panel", role: "tabpanel", "aria-labelledby": "mjr-messages-tab" - }, [U("div", Py, J(Z(R)("msg.noMessages", "No messages for now.")), 1)], 512), + }, [U("div", Iy, J(Z(R)("msg.noMessages", "No messages for now.")), 1)], 512), U("div", { ref_key: "historyPanelRef", ref: d, @@ -20273,13 +20273,13 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite ]) ]), _: 1 - })], 8, Dy); + })], 8, ky); }; } -}), Ly = { class: "mjr-am-header-row" }, Ry = { class: "mjr-am-header-left" }, zy = { class: "mjr-am-header-title" }, By = ["data-mjr-version-channel", "title"], Vy = { class: "mjr-tabs" }, Hy = { class: "mjr-am-header-tools" }, Uy = { +}), zy = { class: "mjr-am-header-row" }, By = { class: "mjr-am-header-left" }, Vy = { class: "mjr-am-header-title" }, Hy = ["data-mjr-version-channel", "title"], Uy = { class: "mjr-tabs" }, Wy = { class: "mjr-am-header-tools" }, Gy = { class: "mjr-popover-anchor", style: { display: "none" } -}, Wy = { class: "mjr-popover-anchor" }, Gy = { class: "mjr-popover-anchor" }, Ky = { class: "mjr-popover-anchor" }, qy = { class: "mjr-popover-anchor" }, Jy = { class: "mjr-popover-anchor" }, Yy = "mjr-am-version-badge-label", Xy = "V", Zy = /* @__PURE__ */ lr({ +}, Ky = { class: "mjr-popover-anchor" }, qy = { class: "mjr-popover-anchor" }, Jy = { class: "mjr-popover-anchor" }, Yy = { class: "mjr-popover-anchor" }, Xy = { class: "mjr-popover-anchor" }, Zy = "mjr-am-version-badge-label", Qy = "V", $y = /* @__PURE__ */ dr({ __name: "HeaderSection", setup(n, { expose: r }) { let i = null; @@ -20317,7 +20317,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite rating_desc: "pi pi-star-fill", size_desc: "pi pi-sort-numeric-down-alt", size_asc: "pi pi-sort-numeric-up-alt" - }, l = lh(), u = s() === "nightly", d = Q(null), f = Q(null), p = Q(null), m = Q(null), h = Q(null), g = Q(null), _ = Q(null), y = Q(null), b = Q(null), x = Q(null), S = Q(null), C = Q(null), w = Q(null), T = Q(null), E = Q(null), D = Q(null), O = Q(null), k = Q(null), A = Q(null), j = Q(null), M = Q(null), N = Q(null), P = Q(null), ee = Q(null), te = Q(null), F = Q(null), I = (e) => e?.$el || e || null, ne = Q(u ? "nightly" : "v?"), ie = Q(u ? "nightly" : "stable"), ae = Q(!1), oe = Q(!1), se = K(() => c[l.sort] ?? "pi pi-sort-amount-down"), ce = K(() => String(l.viewScope || l.scope || "output").toLowerCase()), le = K(() => ce.value === "similar" || Array.isArray(l.similarResults) && l.similarResults.length > 0 || !!l.similarTitle), ue = K(() => { + }, l = dh(), u = s() === "nightly", d = Q(null), f = Q(null), p = Q(null), m = Q(null), h = Q(null), g = Q(null), _ = Q(null), y = Q(null), b = Q(null), x = Q(null), S = Q(null), C = Q(null), w = Q(null), T = Q(null), E = Q(null), D = Q(null), O = Q(null), k = Q(null), A = Q(null), j = Q(null), M = Q(null), N = Q(null), P = Q(null), ee = Q(null), te = Q(null), F = Q(null), I = (e) => e?.$el || e || null, ne = Q(u ? "nightly" : "v?"), ie = Q(u ? "nightly" : "stable"), ae = Q(!1), oe = Q(!1), se = K(() => c[l.sort] ?? "pi pi-sort-amount-down"), ce = K(() => String(l.viewScope || l.scope || "output").toLowerCase()), le = K(() => ce.value === "similar" || Array.isArray(l.similarResults) && l.similarResults.length > 0 || !!l.similarTitle), ue = K(() => { let e = String(l.similarSourceAssetId || ""); return e.startsWith("stack:") || e.startsWith("duplicates:") || e.startsWith("group:") || e.startsWith("node:") ? "group" : "similar"; }), de = K(() => ue.value === "group" ? R("tab.group", "Group") : R("tab.similar", "Similar")), fe = K(() => ue.value === "group" ? R("tooltip.tab.group", "Browse current grouped assets") : R("tooltip.tab.similar", "Browse current similar findings")), pe = { @@ -20354,12 +20354,12 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite verticalAlign: "middle" })), he = K(() => oe.value ? R("tooltip.closeMFV", "Close Majoor Floating Viewer") : R("tooltip.openMFV", "Open Majoor Floating Viewer")), ge = K(() => "pi pi-eye"), _e = K(() => R("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings")); async function ve() { - let n = Pe(); + let n = rt(); if (!n || typeof n != "object") { e(R("toast.workflowSerializeFailed", "Could not read the current ComfyUI workflow."), "error"); return; } - let r = await b_({ + let r = await S_({ workflow: n, name: String(n?.name || n?.title || "workflow").trim() }), i = String(r?.name || "").trim(); @@ -20386,7 +20386,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite async function ye() { let t = ""; try { - let e = await L(st.BROWSE_FOLDER, {}); + let e = await L(it.BROWSE_FOLDER, {}); e?.ok && (t = String(e?.data?.path || "").trim()); } catch (e) { console.debug?.(e); @@ -20400,8 +20400,8 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite if (!n?.ok) e(n?.error || R("toast.failedSetWorkflowRoots", "Failed to set workflow roots"), "error"); else { try { - let e = Jt(); - e.paths = e.paths || {}, e.paths.workflowRoots = String(n?.data?.workflow_roots_text || t).trim(), Tn(e), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { + let e = Vn(); + e.paths = e.paths || {}, e.paths.workflowRoots = String(n?.data?.workflow_roots_text || t).trim(), Fn(e), window.dispatchEvent(new CustomEvent("mjr-settings-changed", { detail: { key: "paths.workflowRoots", value: t } })), window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-root-pick" } })); @@ -20478,7 +20478,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } async function Te(e) { try { - let t = await re(st.VERSION, { cache: "no-cache" }); + let t = await re(it.VERSION, { cache: "no-cache" }); if (!t?.ok) return; let n = String(t.data?.version || "").trim(); if (o(n, String(t.data?.branch || "").trim().toLowerCase()) || e) { @@ -20490,7 +20490,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } function Ee() { try { - Lt(I(y.value), he.value, Xy); + Lt(I(y.value), he.value, Qy); } catch (e) { console.debug?.(e); } @@ -20510,7 +20510,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite window.dispatchEvent(new CustomEvent(V.MFV_TOGGLE)); } function Ae() { - qn(); + Yn(); } function je() { try { @@ -20519,10 +20519,10 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite console.debug?.(e); } } - return or(oe, () => { + return cr(oe, () => { Ee(); - }), kr(async () => { - await sr(), De(), Ee(), we(u), Te(u); + }), jr(async () => { + await lr(), De(), Ee(), we(u), Te(u); try { typeof window < "u" && window.addEventListener(V.MFV_VISIBILITY_CHANGED, Oe); } catch (e) { @@ -20533,7 +20533,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite } catch (e) { console.debug?.(e); } - }), tr(() => { + }), rr(() => { je(); }), r({ isVueHeader: !0, @@ -20717,17 +20717,17 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, _headerDispose: je }), (e, t) => { - let n = rr("MButton"); + let n = ar("MButton"); return q(), X(H, null, [U("div", { ref_key: "headerRef", ref: d, class: "mjr-am-header" - }, [U("div", Ly, [U("div", Ry, [ + }, [U("div", zy, [U("div", By, [ t[2] ||= U("i", { class: "mjr-am-header-icon pi pi-folder", "aria-hidden": "true" }, null, -1), - U("div", zy, J(Z(R)("manager.title")), 1), + U("div", Vy, J(Z(R)("manager.title")), 1), U("a", { href: "https://ko-fi.com/majoorwaldi", target: "_blank", @@ -20735,100 +20735,100 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite class: "mjr-am-version-badge", "data-mjr-version-channel": ie.value, title: Z(R)("tooltip.supportKofi"), - style: yr(me.value), + style: xr(me.value), onMouseenter: t[0] ||= (e) => ae.value = !0, onMouseleave: t[1] ||= (e) => ae.value = !1 - }, [U("span", { class: wr(Yy) }, J(ne.value), 1)], 44, By) + }, [U("span", { class: Er(Zy) }, J(ne.value), 1)], 44, Hy) ]), U("div", { ref_key: "headerActionsRef", ref: f, class: "mjr-am-header-actions" - }, [U("div", Vy, [ + }, [U("div", Uy, [ Y(n, { ref_key: "tabAllRef", ref: M, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "all" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "all" }]), severity: "secondary", text: "", "data-scope": "all", title: Z(R)("tooltip.tab.all") }, { - default: W(() => [er(J(Z(R)("tab.all")), 1)]), + default: W(() => [nr(J(Z(R)("tab.all")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabInputsRef", ref: N, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "input" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "input" }]), severity: "secondary", text: "", "data-scope": "input", title: Z(R)("tooltip.tab.input") }, { - default: W(() => [er(J(Z(R)("tab.input")), 1)]), + default: W(() => [nr(J(Z(R)("tab.input")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabOutputsRef", ref: P, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "output" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "output" }]), severity: "secondary", text: "", "data-scope": "output", title: Z(R)("tooltip.tab.output") }, { - default: W(() => [er(J(Z(R)("tab.output")), 1)]), + default: W(() => [nr(J(Z(R)("tab.output")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabCustomRef", ref: ee, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "custom" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "custom" }]), severity: "secondary", text: "", "data-scope": "custom", title: Z(R)("tooltip.tab.custom") }, { - default: W(() => [er(J(Z(R)("tab.custom")), 1)]), + default: W(() => [nr(J(Z(R)("tab.custom")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabWorkflowRef", ref: te, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "workflow" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "workflow" }]), severity: "secondary", text: "", "data-scope": "workflow", title: Z(R)("tooltip.tab.workflow", "Browse saved workflows") }, { - default: W(() => [er(J(Z(R)("tab.workflow", "Workflow")), 1)]), + default: W(() => [nr(J(Z(R)("tab.workflow", "Workflow")), 1)]), _: 1 }, 8, ["class", "title"]), Y(n, { ref_key: "tabSimilarRef", ref: F, type: "button", - class: wr(["mjr-tab", { "is-active": ce.value === "similar" }]), + class: Er(["mjr-tab", { "is-active": ce.value === "similar" }]), severity: "secondary", text: "", "data-scope": "similar", - style: yr({ display: le.value ? "" : "none" }), + style: xr({ display: le.value ? "" : "none" }), title: fe.value }, { - default: W(() => [er(J(de.value), 1)]), + default: W(() => [nr(J(de.value), 1)]), _: 1 }, 8, [ "class", "style", "title" ]) - ]), U("div", Hy, [ - ce.value === "workflow" ? (q(), nr(n, { + ]), U("div", Wy, [ + ce.value === "workflow" ? (q(), ir(n, { key: 0, ref_key: "saveWorkflowBtnRef", ref: S, @@ -20847,7 +20847,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : G("", !0), - ce.value === "workflow" ? (q(), nr(n, { + ce.value === "workflow" ? (q(), ir(n, { key: 1, ref_key: "pickWorkflowRootBtnRef", ref: C, @@ -20866,7 +20866,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"])) : G("", !0), - ce.value === "workflow" ? (q(), nr(n, { + ce.value === "workflow" ? (q(), ir(n, { key: 2, type: "button", class: "mjr-icon-btn mjr-import-workflow-btn", @@ -20892,7 +20892,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite style: { display: "none" }, onChange: Se }, null, 544), - U("div", Uy, [Y(n, { + U("div", Gy, [Y(n, { ref_key: "customMenuBtnRef", ref: p, type: "button", @@ -20908,7 +20908,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Ey, { + }, 8, ["title", "aria-label"]), Y(Oy, { ref_key: "customPopoverRef", ref: A }, null, 512)]), @@ -20916,7 +20916,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite ref_key: "mfvBtnRef", ref: y, type: "button", - class: wr(["mjr-icon-btn", { "mjr-mfv-btn-active": oe.value }]), + class: Er(["mjr-icon-btn", { "mjr-mfv-btn-active": oe.value }]), severity: "secondary", text: "", rounded: "", @@ -20925,7 +20925,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite onClick: ke }, { default: W(() => [U("i", { - class: wr(ge.value), + class: Er(ge.value), "aria-hidden": "true" }, null, 2)]), _: 1 @@ -20934,7 +20934,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "title", "aria-label" ]), - U("div", Wy, [Y(n, { + U("div", Ky, [Y(n, { ref_key: "messageBtnRef", ref: b, type: "button", @@ -20954,7 +20954,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Iy, { + }, 8, ["title", "aria-label"]), Y(Ry, { ref_key: "messagePopoverRef", ref: j }, null, 512)]), @@ -20976,11 +20976,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]) - ])], 512)])], 512), Y(I_, { + ])], 512)])], 512), Y(R_, { ref_key: "searchBarRef", ref: T }, { - "filter-anchor": W(() => [U("div", Gy, [Y(n, { + "filter-anchor": W(() => [U("div", qy, [Y(n, { ref_key: "filterBtnRef", ref: m, type: "button", @@ -20996,11 +20996,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(Pv, { + }, 8, ["title", "aria-label"]), Y(Iv, { ref_key: "filterPopoverRef", ref: D }, null, 512)])]), - "sort-anchor": W(() => [U("div", Ky, [Y(n, { + "sort-anchor": W(() => [U("div", Jy, [Y(n, { ref_key: "sortBtnRef", ref: h, type: "button", @@ -21012,15 +21012,15 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-label": Z(R)("label.sort") }, { default: W(() => [U("i", { - class: wr(se.value), + class: Er(se.value), "aria-hidden": "true" }, null, 2)]), _: 1 - }, 8, ["title", "aria-label"]), Y(z_, { + }, 8, ["title", "aria-label"]), Y(V_, { ref_key: "sortPopoverRef", ref: E }, null, 512)])]), - "collections-anchor": W(() => [U("div", qy, [Y(n, { + "collections-anchor": W(() => [U("div", Yy, [Y(n, { ref_key: "collectionsBtnRef", ref: g, type: "button", @@ -21036,11 +21036,11 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(hy, { + }, 8, ["title", "aria-label"]), Y(_y, { ref_key: "collectionsPopoverRef", ref: O }, null, 512)])]), - "pinned-folders-anchor": W(() => [U("div", Jy, [Y(n, { + "pinned-folders-anchor": W(() => [U("div", Xy, [Y(n, { ref_key: "pinnedFoldersBtnRef", ref: _, type: "button", @@ -21056,7 +21056,7 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), Y(xy, { + }, 8, ["title", "aria-label"]), Y(Cy, { ref_key: "pinnedFoldersPopoverRef", ref: k }, null, 512)])]), @@ -21064,20 +21064,20 @@ var Uv = { class: "mjr-menu mjr-collections-menu" }, Wv = { class: "mjr-menu-ite }, 512)], 64); }; } -}), Qy = (e) => { +}), eb = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, $y = (e) => { +}, tb = (e) => { let t = String(e || ""); return R(t === "name_asc" ? "sort.nameAZ" : t === "name_desc" ? "sort.nameZA" : t === "mtime_asc" ? "sort.oldest" : "sort.newest"); -}, eb = (e) => { +}, nb = (e) => { let t = String(e || "").toLowerCase(); return t === "similar" ? R("scope.similar", "Similar") : t === "custom" ? R("scope.customBrowser") : t === "workflow" ? R("scope.workflow", "Workflow") : R(t === "all" ? "tab.all" : t === "input" || t === "inputs" ? "scope.input" : "scope.output"); }; -function tb({ label: e, value: t, onClear: n } = {}) { +function rb({ label: e, value: t, onClear: n } = {}) { let r = document.createElement("div"); r.className = "mjr-context-pill"; let i = document.createElement("span"); @@ -21098,69 +21098,69 @@ function tb({ label: e, value: t, onClear: n } = {}) { } return r; } -function nb() { +function ib() { let e = document.createElement("div"); return e.className = "mjr-am-context-pills", { wrap: e, update: ({ state: t, rawQuery: n = "", actions: r = null } = {}) => { - let i = r && typeof r == "object" ? r : {}, a = Qy(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(Qy(t?.kindFilter || "").trim() || t?.workflowOnly || (Number(t?.minRating || 0) || 0) > 0 || (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0 || (Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0 || Qy(t?.workflowType || "").trim() || Qy(t?.workflowId || "").trim() || Qy(t?.workflowModelFilter || "").trim() || Qy(t?.workflowRunsOnFilter || "").trim() || Qy(t?.dateRangeFilter || "").trim() || Qy(t?.dateExactFilter || "").trim()), c = Qy(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = Qy(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = Qy(t?.similarSourceAssetId || "").trim(); + let i = r && typeof r == "object" ? r : {}, a = eb(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(eb(t?.kindFilter || "").trim() || t?.workflowOnly || (Number(t?.minRating || 0) || 0) > 0 || (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0 || (Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0 || eb(t?.workflowType || "").trim() || eb(t?.workflowId || "").trim() || eb(t?.workflowModelFilter || "").trim() || eb(t?.workflowRunsOnFilter || "").trim() || eb(t?.dateRangeFilter || "").trim() || eb(t?.dateExactFilter || "").trim()), c = eb(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = eb(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = eb(t?.similarSourceAssetId || "").trim(); if (o || s || c || l || p || d || e.childElementCount) { try { e.replaceChildren(); } catch (e) { console.debug?.(e); } - if (!f && l && e.appendChild(tb({ + if (!f && l && e.appendChild(rb({ label: R("label.collections"), - value: Qy(t?.collectionName || t?.collectionId || "").trim(), + value: eb(t?.collectionName || t?.collectionId || "").trim(), onClear: () => i?.clearCollection?.() - })), d && e.appendChild(tb({ + })), d && e.appendChild(rb({ label: R("search.findSimilar", "Find Similar"), value: m ? R("search.similarReference", "Reference #{id}", { id: m }) : R("scope.similar", "Similar"), onClear: () => i?.clearSimilarScope?.() - })), p && e.appendChild(tb({ + })), p && e.appendChild(rb({ label: R("label.scope"), - value: eb(u || "output"), + value: nb(u || "output"), onClear: () => d ? i?.clearSimilarScope?.() : i?.clearScope?.() - })), o && e.appendChild(tb({ + })), o && e.appendChild(rb({ label: R("label.query"), value: a, onClear: () => i?.clearQuery?.() - })), Qy(t?.kindFilter || "").trim() && e.appendChild(tb({ + })), eb(t?.kindFilter || "").trim() && e.appendChild(rb({ label: R("label.type"), - value: Qy(t?.kindFilter || "").trim(), + value: eb(t?.kindFilter || "").trim(), onClear: () => i?.clearKind?.() - })), Number(t?.minRating || 0) > 0 && e.appendChild(tb({ + })), Number(t?.minRating || 0) > 0 && e.appendChild(rb({ label: R("label.rating"), value: `>= ${Number(t?.minRating || 0)}`, onClear: () => i?.clearMinRating?.() - })), t?.workflowOnly && e.appendChild(tb({ + })), t?.workflowOnly && e.appendChild(rb({ label: R("label.workflow"), value: R("label.only"), onClear: () => i?.clearWorkflowOnly?.() - })), Qy(t?.workflowType || "").trim() && e.appendChild(tb({ + })), eb(t?.workflowType || "").trim() && e.appendChild(rb({ label: R("label.workflowType"), - value: Qy(t?.workflowType || "").trim(), + value: eb(t?.workflowType || "").trim(), onClear: () => i?.clearWorkflowType?.() - })), Qy(t?.workflowId || "").trim()) { - let n = Qy(t?.workflowId || "").trim(); - e.appendChild(tb({ + })), eb(t?.workflowId || "").trim()) { + let n = eb(t?.workflowId || "").trim(); + e.appendChild(rb({ label: R("label.sameWorkflow", "Generated with Same Workflow"), value: n.length > 18 ? `${n.slice(0, 8)}...${n.slice(-6)}` : n, onClear: () => i?.clearWorkflowId?.() })); } - if (Qy(t?.workflowModelFilter || "").trim() && e.appendChild(tb({ + if (eb(t?.workflowModelFilter || "").trim() && e.appendChild(rb({ label: R("label.workflowModelFamily", "Model family"), - value: Qy(t?.workflowModelFilter || "").trim(), + value: eb(t?.workflowModelFilter || "").trim(), onClear: () => i?.clearWorkflowModel?.() - })), Qy(t?.workflowRunsOnFilter || "").trim() && e.appendChild(tb({ + })), eb(t?.workflowRunsOnFilter || "").trim() && e.appendChild(rb({ label: R("label.workflowRunsOn", "Runs on"), - value: Qy(t?.workflowRunsOnFilter || "").trim(), + value: eb(t?.workflowRunsOnFilter || "").trim(), onClear: () => i?.clearWorkflowRunsOn?.() })), (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0) { let n = Number(t?.minSizeMB || 0) || 0, r = Number(t?.maxSizeMB || 0) || 0, a = n > 0 && r > 0 ? `${n}-${r} MB` : n > 0 ? `>= ${n} MB` : `<= ${r} MB`; - e.appendChild(tb({ + e.appendChild(rb({ label: R("sidebar.size"), value: a, onClear: () => i?.clearSize?.() @@ -21168,23 +21168,23 @@ function nb() { } if ((Number(t?.minWidth || 0) || 0) > 0 || (Number(t?.minHeight || 0) || 0) > 0 || (Number(t?.maxWidth || 0) || 0) > 0 || (Number(t?.maxHeight || 0) || 0) > 0) { let n = String(t?.resolutionCompare || "gte") === "lte", r = Number(n ? t?.maxWidth : t?.minWidth || 0) || 0, a = Number(n ? t?.maxHeight : t?.minHeight || 0) || 0; - e.appendChild(tb({ + e.appendChild(rb({ label: R("label.resolution"), value: `${n ? "<=" : ">="} ${r || 0}x${a || 0} px`, onClear: () => i?.clearResolution?.() })); } - Qy(t?.dateRangeFilter || "").trim() && e.appendChild(tb({ + eb(t?.dateRangeFilter || "").trim() && e.appendChild(rb({ label: R("sidebar.date"), - value: Qy(t?.dateRangeFilter || "").trim(), + value: eb(t?.dateRangeFilter || "").trim(), onClear: () => i?.clearDateRange?.() - })), Qy(t?.dateExactFilter || "").trim() && e.appendChild(tb({ + })), eb(t?.dateExactFilter || "").trim() && e.appendChild(rb({ label: R("label.day"), - value: Qy(t?.dateExactFilter || "").trim(), + value: eb(t?.dateExactFilter || "").trim(), onClear: () => i?.clearDateExact?.() - })), c && e.appendChild(tb({ + })), c && e.appendChild(rb({ label: R("label.sort"), - value: $y(t?.sort), + value: tb(t?.sort), onClear: () => i?.clearSort?.() })); } @@ -21192,17 +21192,17 @@ function nb() { }; } // ui/vue/components/panel/summaryBarState.ts -var rb = (e, t = "") => R(e, t, void 0), ib = (e) => { +var ab = (e, t = "") => R(e, t, void 0), ob = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, ab = (e) => { +}, sb = (e) => { let t = String(e || "").toLowerCase(); - return t === "similar" ? rb("scope.similar", "Similar") : t === "workflow" ? rb("scope.workflow", "Workflow") : rb(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); + return t === "similar" ? ab("scope.similar", "Similar") : t === "workflow" ? ab("scope.workflow", "Workflow") : ab(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); }; -function ob(e) { +function cb(e) { try { let t = e?._mjrGetRenderedCards; if (typeof t == "function") { @@ -21214,7 +21214,7 @@ function ob(e) { } return []; } -function sb(e) { +function lb(e) { try { let t = String(e?.dataset?.mjrSelectedAssetIds || "").trim(); if (t) { @@ -21231,8 +21231,8 @@ function sb(e) { } return 0; } -function cb({ state: e, gridContainer: t, context: n = null } = {}) { - let r = ob(t), i = (() => { +function ub({ state: e, gridContainer: t, context: n = null } = {}) { + let r = cb(t), i = (() => { try { let e = 0; for (let t of r) String(t?._mjrAsset?.kind || "").toLowerCase() === "folder" && (e += 1); @@ -21253,12 +21253,12 @@ function cb({ state: e, gridContainer: t, context: n = null } = {}) { } catch (e) { console.debug?.(e); } - return sb(t); - })(), s = Number(t?.dataset?.mjrTotal || 0) || Math.max(0, Number(e?.lastGridTotal ?? 0) || 0), c = Number(t?.dataset?.mjrShown || 0) || Math.max(0, Number(e?.lastGridCount ?? 0) || 0) || a, l = String(e?.viewScope || e?.scope || t?.dataset?.mjrScope || "output").toLowerCase(), u = s && s >= c ? `${c}/${s}` : `${c}`, d = [`${c > 0 && i.total > 0 && i.folders === i.total ? rb("summary.folders") : rb("summary.assets")}: ${u}`]; - o > 0 && d.push(`${rb("summary.selected")}: ${o}`), d.push(ab(l)); + return lb(t); + })(), s = Number(t?.dataset?.mjrTotal || 0) || Math.max(0, Number(e?.lastGridTotal ?? 0) || 0), c = Number(t?.dataset?.mjrShown || 0) || Math.max(0, Number(e?.lastGridCount ?? 0) || 0) || a, l = String(e?.viewScope || e?.scope || t?.dataset?.mjrScope || "output").toLowerCase(), u = s && s >= c ? `${c}/${s}` : `${c}`, d = [`${c > 0 && i.total > 0 && i.folders === i.total ? ab("summary.folders") : ab("summary.assets")}: ${u}`]; + o > 0 && d.push(`${ab("summary.selected")}: ${o}`), d.push(sb(l)); try { let e = Number(t?.dataset?.mjrHiddenPngSiblings || 0) || 0; - String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${rb("summary.hidden")}: ${e}`); + String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${ab("summary.hidden")}: ${e}`); } catch (e) { console.debug?.(e); } @@ -21268,22 +21268,22 @@ function cb({ state: e, gridContainer: t, context: n = null } = {}) { total: s, activeScope: l, summaryText: d.filter(Boolean).join(" | "), - duplicateText: h ? `${rb("summary.duplicates")}: ${p} | ${rb("summary.similar")}: ${m}` : "", + duplicateText: h ? `${ab("summary.duplicates")}: ${p} | ${ab("summary.similar")}: ${m}` : "", showDuplicates: h, - rawQuery: ib(n?.rawQuery || "").trim() + rawQuery: ob(n?.rawQuery || "").trim() }; } // ui/vue/components/panel/SummaryBarSection.vue?vue&type=script&setup=true&lang.ts -var lb = { +var db = { key: 2, class: "mjr-folder-breadcrumb-separator" -}, ub = { +}, fb = { key: 0, class: "mjr-folder-breadcrumb-separator" -}, db = { class: "mjr-am-summary-left" }, fb = { class: "mjr-am-summary-text" }, pb = { class: "mjr-am-summary-right" }, mb = ["aria-label"], hb = /* @__PURE__ */ lr({ +}, pb = { class: "mjr-am-summary-left" }, mb = { class: "mjr-am-summary-text" }, hb = { class: "mjr-am-summary-right" }, gb = ["aria-label"], _b = /* @__PURE__ */ dr({ __name: "SummaryBarSection", setup(e, { expose: t }) { - let n = lh(), r = Q(null), i = Q(null), a = Q(null), o = Q(""), s = Q(""), c = Q(!1), l = Q(!1), u = Q(null), d = Q(null), f = Q([]), p = nb(), m = K(() => String(n.kindFilter || "").trim().toLowerCase()), h = K(() => { + let n = dh(), r = Q(null), i = Q(null), a = Q(null), o = Q(""), s = Q(""), c = Q(!1), l = Q(!1), u = Q(null), d = Q(null), f = Q([]), p = ib(), m = K(() => String(n.kindFilter || "").trim().toLowerCase()), h = K(() => { let e = R("label.type", "Type"); return [ { @@ -21330,7 +21330,7 @@ var lb = { t && (n.kindFilter = v(t) ? "" : t, y()); } function x({ state: e, gridContainer: t, context: r = null, actions: i = null } = {}) { - let a = cb({ + let a = ub({ state: e, gridContainer: t, context: r @@ -21368,7 +21368,7 @@ var lb = { console.debug?.(e); } } - return kr(() => { + return jr(() => { try { a.value?.appendChild?.(p.wrap); } catch (e) { @@ -21380,14 +21380,14 @@ var lb = { folderBreadcrumb: i, setFolderBreadcrumb: S }), (e, t) => { - let n = rr("MButton"); + let n = ar("MButton"); return q(), X(H, null, [U("div", { ref_key: "folderBreadcrumb", ref: i, - class: wr(["mjr-folder-breadcrumb", { "is-visible": l.value }]), + class: Er(["mjr-folder-breadcrumb", { "is-visible": l.value }]), "aria-label": "Folder breadcrumb" }, [ - u.value ? (q(), nr(n, { + u.value ? (q(), ir(n, { key: 0, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21396,10 +21396,10 @@ var lb = { disabled: u.value.disabled, onClick: t[0] ||= (e) => C(u.value) }, { - default: W(() => [er(J(u.value.label), 1)]), + default: W(() => [nr(J(u.value.label), 1)]), _: 1 }, 8, ["disabled"])) : G("", !0), - d.value ? (q(), nr(n, { + d.value ? (q(), ir(n, { key: 1, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -21408,19 +21408,19 @@ var lb = { disabled: d.value.disabled, onClick: t[1] ||= (e) => C(d.value) }, { - default: W(() => [er(J(d.value.label), 1)]), + default: W(() => [nr(J(d.value.label), 1)]), _: 1 }, 8, ["disabled"])) : G("", !0), - u.value || d.value ? (q(), X("span", lb, " | ")) : G("", !0), - (q(!0), X(H, null, pr(f.value, (e, t) => (q(), X(H, { key: `${e.target}:${t}` }, [t > 0 ? (q(), X("span", ub, "/")) : G("", !0), Y(n, { + u.value || d.value ? (q(), X("span", db, " | ")) : G("", !0), + (q(!0), X(H, null, hr(f.value, (e, t) => (q(), X(H, { key: `${e.target}:${t}` }, [t > 0 ? (q(), X("span", fb, "/")) : G("", !0), Y(n, { type: "button", - class: wr(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), + class: Er(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), severity: "secondary", text: "", disabled: e.current, onClick: (t) => C(e) }, { - default: W(() => [er(J(e.label), 1)]), + default: W(() => [nr(J(e.label), 1)]), _: 2 }, 1032, [ "class", @@ -21432,15 +21432,15 @@ var lb = { ref: r, class: "mjr-am-summary", "aria-live": "polite" - }, [U("div", db, [U("div", fb, J(o.value), 1)]), U("div", pb, [ + }, [U("div", pb, [U("div", mb, J(o.value), 1)]), U("div", hb, [ U("div", { class: "mjr-media-shortcuts", "aria-label": Z(R)("label.type", "Type"), role: "group" - }, [(q(!0), X(H, null, pr(h.value, (e) => (q(), nr(n, { + }, [(q(!0), X(H, null, hr(h.value, (e) => (q(), ir(n, { key: e.kind, type: "button", - class: wr(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), + class: Er(["mjr-icon-btn mjr-media-shortcut-btn", { "mjr-context-active": v(e.kind) }]), severity: "secondary", text: "", rounded: "", @@ -21450,7 +21450,7 @@ var lb = { onClick: (t) => b(e.kind) }, { default: W(() => [U("i", { - class: wr(e.icon), + class: Er(e.icon), "aria-hidden": "true" }, null, 2)]), _: 2 @@ -21460,8 +21460,8 @@ var lb = { "aria-pressed", "class", "onClick" - ]))), 128))], 8, mb), - c.value ? (q(), nr(n, { + ]))), 128))], 8, gb), + c.value ? (q(), ir(n, { key: 0, type: "button", class: "mjr-am-dup-alert", @@ -21470,7 +21470,7 @@ var lb = { title: s.value, onClick: _ }, { - default: W(() => [er(J(s.value), 1)]), + default: W(() => [nr(J(s.value), 1)]), _: 1 }, 8, ["title"])) : G("", !0), U("div", { @@ -21482,11 +21482,11 @@ var lb = { } }); // ui/vue/composables/useGridContextMenu.ts -function gb(e, t) { +function vb(e, t) { let n = null; function r(e) { if (e && !e._mjrGridContextMenuBound) try { - n = Ia({ + n = Ra({ gridContainer: e, getState: t }); @@ -21500,16 +21500,16 @@ function gb(e, t) { } catch {} n = null; } - or(e, (e, t) => { + cr(e, (e, t) => { t && i(), e && r(e); - }, { immediate: !0 }), tr(i); + }, { immediate: !0 }), rr(i); } // ui/vue/composables/useGridKeyboard.ts -function _b(e) { +function yb(e) { if (!e) return () => {}; let t = e; try { - let n = Fi({ + let n = Li({ gridContainer: e, getState: () => t._mjrGetGridState?.() || {}, getSelectedAssets: () => t._mjrGetSelectedAssets?.() || [], @@ -21527,7 +21527,7 @@ function _b(e) { } catch (e) { console.debug?.("[useGridKeyboard] rect lookup failed", e); } - Fa(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), n, () => { + La(Math.round((i?.left || 0) + Math.min((i?.width || 0) * .5, 160)), Math.round((i?.top || 0) + Math.min((i?.height || 0) * .5, 120)), n, () => { t._mjrOnKeyboardAssetChanged?.(n); }); } @@ -21544,7 +21544,7 @@ function _b(e) { return console.debug?.("[useGridKeyboard] bind failed", e), () => {}; } } -function vb(e) { +function bb(e) { let t = null, n = () => { try { t?.(); @@ -21553,13 +21553,13 @@ function vb(e) { } t = null; }; - or(e, (e, r) => { - r && n(), e && (t = _b(e)); - }, { immediate: !0 }), tr(n); + cr(e, (e, r) => { + r && n(), e && (t = yb(e)); + }, { immediate: !0 }), rr(n); } // ui/vue/components/grid/assetsGridHostState.ts -function yb() {} -function bb() { +function xb() {} +function Sb() { return new Promise((e) => { try { if (typeof requestAnimationFrame == "function") { @@ -21572,7 +21572,7 @@ function bb() { e(); }); } -function xb(e, ...t) { +function Cb(e, ...t) { try { return typeof e == "function" ? e(...t) : void 0; } catch (e) { @@ -21580,21 +21580,21 @@ function xb(e, ...t) { return; } } -function Sb(e = {}) { +function wb(e = {}) { let t = Array.isArray(e.selectedIds) ? e.selectedIds.map(String).filter(Boolean) : []; return { ids: t, activeId: String(e.activeId || t[0] || "").trim() }; } -function Cb(e, t = {}, n = null) { +function Tb(e, t = {}, n = null) { return { count: Number(t.count ?? t.shown ?? e?.dataset?.mjrShown ?? n?.lastGridCount ?? 0) || 0, total: Number(t.total ?? e?.dataset?.mjrTotal ?? n?.lastGridTotal ?? 0) || 0 }; } -function wb(e, t = uh()) { - if (!e || !t) return yb; +function Eb(e, t = fh()) { + if (!e || !t) return xb; let n = 0, r = () => { if (!n) try { n = requestAnimationFrame(() => { @@ -21620,8 +21620,8 @@ function wb(e, t = uh()) { } }; } -function Tb(e, { panelStore: t = uh(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { - if (!e) return yb; +function Db(e, { panelStore: t = fh(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { + if (!e) return xb; let i = 0, a = () => { if (i) try { cancelAnimationFrame(i); @@ -21630,24 +21630,24 @@ function Tb(e, { panelStore: t = uh(), onContextChanged: n = null, markUserInter } try { i = requestAnimationFrame(() => { - i = 0, xb(n); + i = 0, Cb(n); }); } catch (e) { - console.debug?.(e), i = 0, xb(n); + console.debug?.(e), i = 0, Cb(n); } }, o = (r) => { let i = r?.detail || {}; if (t) { - let { count: n, total: r } = Cb(e, i, t); + let { count: n, total: r } = Tb(e, i, t); t.lastGridCount = n, t.lastGridTotal = r; } - xb(n); + Cb(n); }, s = (e) => { - if (xb(r), t) { - let { ids: n, activeId: r } = Sb(e?.detail || {}); + if (Cb(r), t) { + let { ids: n, activeId: r } = wb(e?.detail || {}); t.selectedAssetIds = n, t.activeAssetId = r; } - xb(n); + Cb(n); }; e.addEventListener("mjr:grid-stats", o), e.addEventListener("mjr:selection-changed", s); try { @@ -21695,14 +21695,14 @@ function Tb(e, { panelStore: t = uh(), onContextChanged: n = null, markUserInter } }; } -async function Eb({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = uh(), onRestoreSidebar: i = null } = {}) { +async function Ob({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = fh(), onRestoreSidebar: i = null } = {}) { if (!t || !n || !r) return; try { await e; } catch (e) { console.debug?.(e); } - await bb(); + await Sb(); let a = Number(r.scrollTop || 0) || 0; if (a > 0) try { t.scrollTop = a; @@ -21719,7 +21719,7 @@ async function Eb({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan if (s) { let e = () => { try { - typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : Rl(n, s)?.scrollIntoView?.({ + typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : Bl(n, s)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -21730,13 +21730,13 @@ async function Eb({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan e(), setTimeout(e, 160); } } - r.sidebarOpen && s && xb(i); + r.sidebarOpen && s && Cb(i); } // ui/vue/components/grid/AssetsGrid.vue -var Db = /* @__PURE__ */ lr({ +var kb = /* @__PURE__ */ dr({ __name: "AssetsGrid", setup(e, { expose: t }) { - let n = Q(null), r = Q(null), i = Q(null), a = lh(), o = K(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; + let n = Q(null), r = Q(null), i = Q(null), a = dh(), o = K(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; function d() { try { l?.setVisibility?.(); @@ -21747,7 +21747,7 @@ var Db = /* @__PURE__ */ lr({ function f() { try { let e = o.value; - e && $n(e); + e && tr(e); } catch (e) { console.debug?.(e); } @@ -21830,7 +21830,7 @@ var Db = /* @__PURE__ */ lr({ } }; } - ir("mjr-grid-container-ref", o), gb(o, () => a), vb(o); + or("mjr-grid-container-ref", o), vb(o, () => a), bb(o); function m() { return o.value || null; } @@ -21842,23 +21842,23 @@ var Db = /* @__PURE__ */ lr({ } catch (e) { console.debug?.(e); } - c = Tb(t, { + c = Db(t, { panelStore: a, ...e }); } } - return kr(() => { - s = wb(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); + return jr(() => { + s = Eb(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); try { window.addEventListener("mjr:keepalive-attached", f), document.addEventListener("visibilitychange", d); } catch (e) { console.debug?.(e); } d(); - }), dr(() => { + }), pr(() => { try { - Yn(m()); + Zn(m()); } catch (e) { console.debug?.(e); } @@ -21891,14 +21891,14 @@ var Db = /* @__PURE__ */ lr({ } catch (e) { console.debug?.(e); } - }), or(o, (e, t) => { + }), cr(o, (e, t) => { try { - t && t !== e && Yn(t); + t && t !== e && Zn(t); } catch (e) { console.debug?.(e); } try { - e && $n(e); + e && tr(e); } catch (e) { console.debug?.(e); } @@ -21926,7 +21926,7 @@ var Db = /* @__PURE__ */ lr({ }; }, restoreGridUiState(e, t = {}) { - return Eb({ + return Ob({ initialLoadPromise: e, gridWrapper: r.value, gridContainer: m(), @@ -21942,7 +21942,7 @@ var Db = /* @__PURE__ */ lr({ } catch (e) { console.debug?.(e); } - return l = Wg({ + return l = Kg({ gridContainer: t, gridWrapper: r.value, ...e @@ -21997,13 +21997,13 @@ var Db = /* @__PURE__ */ lr({ overflow: "auto", position: "relative" } - }, [Y(Zu, { + }, [Y($u, { ref_key: "gridHostRef", ref: i, "scroll-element": r.value }, null, 8, ["scroll-element"])], 512)], 512)); } -}), Ob = { +}), Ab = { class: "mjr-sidebar-header", style: { display: "flex", @@ -22014,15 +22014,15 @@ var Db = /* @__PURE__ */ lr({ "flex-shrink": "0", background: "var(--mjr-surface-2,#2e2e2e)" } -}, kb = ["title"], Ab = /* @__PURE__ */ lr({ +}, jb = ["title"], Mb = /* @__PURE__ */ dr({ __name: "SidebarHeaderSection", props: { asset: {} }, emits: ["close"], setup(e, { emit: t }) { let n = t; return (t, r) => { - let i = rr("MButton"); - return q(), X("div", Ob, [U("div", { + let i = ar("MButton"); + return q(), X("div", Ab, [U("div", { class: "mjr-sidebar-filename", title: e.asset.filename, style: { @@ -22035,7 +22035,7 @@ var Db = /* @__PURE__ */ lr({ "min-width": "0", "padding-right": "8px" } - }, J(e.asset.filename), 9, kb), Y(i, { + }, J(e.asset.filename), 9, jb), Y(i, { type: "button", class: "mjr-sidebar-close", severity: "secondary", @@ -22059,21 +22059,21 @@ var Db = /* @__PURE__ */ lr({ onMouseenter: r[1] ||= (e) => (e.currentTarget.style.background = "rgba(255,255,255,0.1)") && (e.currentTarget.style.borderColor = "rgba(255,255,255,0.2)"), onMouseleave: r[2] ||= (e) => (e.currentTarget.style.background = "none") && (e.currentTarget.style.borderColor = "transparent") }, { - default: W(() => [...r[3] ||= [er("x", -1)]]), + default: W(() => [...r[3] ||= [nr("x", -1)]]), _: 1 })]); }; } }); // ui/components/sidebar/utils/format.ts -function jb(e) { +function Nb(e) { if (!e) return "Unknown"; let t = e / 1024; if (t < 1024) return `${t.toFixed(1)} KB`; let n = t / 1024; return n < 1024 ? `${n.toFixed(1)} MB` : `${(n / 1024).toFixed(2)} GB`; } -function Mb(e) { +function Pb(e) { if (!e) return ""; let t = /* @__PURE__ */ new Date(Number(e) * 1e3); if (Number.isNaN(t.getTime())) return ""; @@ -22081,13 +22081,13 @@ function Mb(e) { return `${t.getFullYear()}-${n(t.getMonth() + 1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`; } // ui/vue/components/panel/sidebar/SidebarPreviewSection.vue?vue&type=script&setup=true&lang.ts -var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["src"], Lb = { +var Fb = { class: "mjr-sidebar-preview" }, Ib = ["src"], Lb = ["src"], Rb = ["src"], zb = { key: 3, style: { color: "rgba(255, 255, 255, 0.4)", "font-size": "14px" } -}, Rb = { +}, Bb = { class: "mjr-sidebar-preview-meta", style: { "margin-top": "10px", @@ -22101,7 +22101,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "padding-bottom": "12px", "border-bottom": "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))" } -}, zb = /* @__PURE__ */ lr({ +}, Vb = /* @__PURE__ */ dr({ __name: "SidebarPreviewSection", props: { asset: {}, @@ -22111,15 +22111,15 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } }, setup(e) { - let t = e, n = Q(null), r = null, i = K(() => it(t.asset) || ""), a = K(() => { + let t = e, n = Q(null), r = null, i = K(() => We(t.asset) || ""), a = K(() => { let e = String(t.asset?.filename || ""), n = e.lastIndexOf("."); return n === -1 ? "" : e.slice(n + 1).toUpperCase(); }), o = K(() => { let e = []; a.value && e.push(a.value), t.asset?.kind && e.push(String(t.asset.kind).toLowerCase()); - let n = jb(t.asset?.size); + let n = Nb(t.asset?.size); n && e.push(n); - let r = Mb(t.asset?.mtime); + let r = Pb(t.asset?.mtime); return r && e.push(r), e.join(" | "); }); function s() { @@ -22153,17 +22153,17 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } } } - return or(() => [t.asset, t.showPreviewThumb], () => { + return cr(() => [t.asset, t.showPreviewThumb], () => { s(); - }, { flush: "post" }), or(i, () => { + }, { flush: "post" }), cr(i, () => { setTimeout(() => { l(); }, 0); - }), kr(() => { + }), jr(() => { l(); - }), dr(() => { + }), pr(() => { s(); - }), (t, r) => (q(), X("div", Nb, [e.showPreviewThumb ? (q(), X("div", { + }), (t, r) => (q(), X("div", Fb, [e.showPreviewThumb ? (q(), X("div", { key: 0, ref_key: "previewContainerRef", ref: n, @@ -22186,7 +22186,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Pb)) : e.asset.kind === "video" ? (q(), X("video", { + }, null, 8, Ib)) : e.asset.kind === "video" ? (q(), X("video", { key: 1, src: i.value, muted: !0, @@ -22199,7 +22199,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Fb)) : e.asset.kind === "audio" ? (q(), X("audio", { + }, null, 8, Lb)) : e.asset.kind === "audio" ? (q(), X("audio", { key: 2, src: i.value, controls: "", @@ -22208,9 +22208,9 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr width: "92%", "max-width": "560px" } - }, null, 8, Ib)) : (q(), X("div", Lb, J(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : G("", !0), U("div", Rb, J(o.value), 1)])); + }, null, 8, Rb)) : (q(), X("div", zb, J(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : G("", !0), U("div", Bb, J(o.value), 1)])); } -}), Bb = { +}), Hb = { class: "mjr-sidebar-section", style: { background: "rgba(255, 255, 255, 0.03)", @@ -22218,22 +22218,22 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "border-radius": "8px", padding: "10px" } -}, Vb = { style: { +}, Ub = { style: { "font-size": "12px", "font-weight": "700", color: "#26a69a", "margin-bottom": "8px", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, Hb = { style: { +} }, Wb = { style: { display: "flex", "flex-direction": "column", gap: "6px" -} }, Ub = { style: { +} }, Gb = { style: { "font-size": "12px", opacity: "0.68", "min-width": "92px" -} }, Wb = ["title"], Gb = /* @__PURE__ */ lr({ +} }, Kb = ["title"], qb = /* @__PURE__ */ dr({ __name: "SidebarFolderSection", props: { asset: {} }, setup(e) { @@ -22276,17 +22276,17 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr ]; return u > 0 && f.push({ label: R("sidebar.folder.created", "Created"), - value: `${Rn(u) || "-"} ${Mn(u) || ""}`.trim() + value: `${zn(u) || "-"} ${Mn(u) || ""}`.trim() }), l > 0 && f.push({ label: R("sidebar.folder.modified", "Modified"), - value: `${Rn(l) || "-"} ${Mn(l) || ""}`.trim() + value: `${zn(l) || "-"} ${Mn(l) || ""}`.trim() }), d && f.push({ label: R("sidebar.folder.note", "Note"), value: R("sidebar.folder.scanTruncated", "Scan was truncated for performance"), valueStyle: "color:#FFB74D;font-weight:600;" }), f; }); - return (e, t) => (q(), X("div", Bb, [U("div", Vb, J(Z(R)("sidebar.folder.details", "Folder Details")), 1), U("div", Hb, [(q(!0), X(H, null, pr(r.value, (e) => (q(), X("div", { + return (e, t) => (q(), X("div", Hb, [U("div", Ub, J(Z(R)("sidebar.folder.details", "Folder Details")), 1), U("div", Wb, [(q(!0), X(H, null, hr(r.value, (e) => (q(), X("div", { key: e.label, style: { display: "flex", @@ -22294,18 +22294,18 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "align-items": "flex-start", "justify-content": "space-between" } - }, [U("div", Ub, J(e.label), 1), U("div", { - style: yr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), + }, [U("div", Gb, J(e.label), 1), U("div", { + style: xr(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") - }, J(e.value), 13, Wb)]))), 128))])])); + }, J(e.value), 13, Kb)]))), 128))])])); } -}), Kb = [ +}), Jb = [ "aria-busy", "aria-disabled", "aria-label", "aria-valuenow", "tabindex" -], qb = /* @__PURE__ */ lr({ +], Yb = /* @__PURE__ */ dr({ __name: "RatingEditor", props: { asset: {}, @@ -22357,7 +22357,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } try { let e = l?.data?.asset_id ?? null; - e != null && !ze(i.asset.id) && (i.asset.id = e); + e != null && !lt(i.asset.id) && (i.asset.id = e); } catch (e) { console.debug?.(e); } @@ -22425,21 +22425,21 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } t !== null && t !== s.value && C(t); } - return dr(() => { + return pr(() => { try { f?.abort?.(); } catch (e) { console.debug?.(e); } - }), or(() => i.modelValue, (e) => { + }), cr(() => i.modelValue, (e) => { b(e); - }), or(() => i.asset?.rating, (e) => { + }), cr(() => i.asset?.rating, (e) => { b(e); }), (e, n) => { - let r = rr("MButton"); + let r = ar("MButton"); return q(), X("div", { class: "mjr-rating-editor", - style: yr({ + style: xr({ display: "inline-flex", gap: "2px", pointerEvents: t.disabled ? "none" : "auto", @@ -22454,14 +22454,14 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "aria-valuenow": s.value, tabindex: t.disabled ? -1 : 0, onKeydown: D - }, [(q(), X(H, null, pr(5, (e) => Y(r, { + }, [(q(), X(H, null, hr(5, (e) => Y(r, { key: e, type: "button", class: "mjr-rating-star", severity: "secondary", text: "", rounded: "", - style: yr({ + style: xr({ color: m(e), transform: h(e), fontSize: g.value, @@ -22478,7 +22478,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr onMouseenter: (t) => T(e), onMouseleave: E }, { - default: W(() => [...n[0] ||= [er(" ★ ", -1)]]), + default: W(() => [...n[0] ||= [nr(" ★ ", -1)]]), _: 1 }, 8, [ "style", @@ -22487,22 +22487,22 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "disabled", "onClick", "onMouseenter" - ])), 64))], 44, Kb); + ])), 64))], 44, Jb); }; } -}), Jb = ["aria-label"], Yb = { class: "mjr-context-menu-title" }, Xb = { class: "mjr-context-menu-item-left" }, Zb = { +}), Xb = ["aria-label"], Zb = { class: "mjr-context-menu-title" }, Qb = { class: "mjr-context-menu-item-left" }, $b = { key: 0, class: "mjr-context-menu-note" -}, Qb = { +}, ex = { key: 1, class: "mjr-context-menu-note is-error" -}, $b = { +}, tx = { key: 2, class: "mjr-context-menu-note" -}, ex = { class: "mjr-context-menu-item-left" }, tx = { +}, nx = { class: "mjr-context-menu-item-left" }, rx = { key: 0, class: "mjr-context-menu-hint" -}, nx = /* @__PURE__ */ lr({ +}, ix = /* @__PURE__ */ dr({ __name: "AddToCollectionMenu", setup(t) { let n = Q(null), r = Q(!1), i = Q([]), a = Q(""), o = 0, s = null, c = K(() => ({ @@ -22537,7 +22537,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr i.value = [], a.value = R("toast.failedLoadCollections", "Failed to load collections."); } finally { if (e === o) { - r.value = !1, await sr(), p(); + r.value = !1, await lr(), p(); try { n.value?.querySelector?.(".mjr-context-menu-item:not([aria-disabled=\"true\"])")?.focus?.(); } catch (e) { @@ -22582,9 +22582,9 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr function y() { jt(); } - return or(() => Gt.open, async (e) => { + return cr(() => Gt.open, async (e) => { e && (i.value = [], await m()); - }), kr(() => { + }), jr(() => { s = new AbortController(); let e = { capture: !0, @@ -22598,7 +22598,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr passive: !0, signal: s.signal }), window.addEventListener("mjr-close-all-menus", y, { signal: s.signal }); - }), tr(() => { + }), rr(() => { try { s?.abort(); } catch (e) { @@ -22606,17 +22606,17 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } s = null, jt(); }), (e, t) => { - let o = rr("MButton"); - return q(), nr(Er, { to: "body" }, [Z(Gt).open ? (q(), X("div", { + let o = ar("MButton"); + return q(), ir(Or, { to: "body" }, [Z(Gt).open ? (q(), X("div", { key: 0, ref_key: "menuRef", ref: n, class: "mjr-add-to-collection-menu mjr-context-menu", - style: yr(c.value), + style: xr(c.value), role: "menu", "aria-label": u.value }, [ - U("div", Yb, J(u.value), 1), + U("div", Zb, J(u.value), 1), Y(o, { type: "button", class: "mjr-context-menu-item", @@ -22625,12 +22625,12 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr role: "menuitem", onClick: g }, { - default: W(() => [U("span", Xb, [t[0] ||= U("i", { class: "pi pi-plus" }, null, -1), U("span", null, J(Z(R)("dialog.createCollection", "Create collection")) + "...", 1)])]), + default: W(() => [U("span", Qb, [t[0] ||= U("i", { class: "pi pi-plus" }, null, -1), U("span", null, J(Z(R)("dialog.createCollection", "Create collection")) + "...", 1)])]), _: 1 }), t[2] ||= U("div", { class: "mjr-context-menu-separator" }, null, -1), - r.value ? (q(), X("div", Zb, J(Z(R)("msg.loadingCollections", "Loading collections...")), 1)) : a.value ? (q(), X("div", Qb, J(a.value), 1)) : i.value.length ? G("", !0) : (q(), X("div", $b, J(Z(R)("msg.noCollections", "No collections yet.")), 1)), - (q(!0), X(H, null, pr(i.value, (e) => (q(), nr(o, { + r.value ? (q(), X("div", $b, J(Z(R)("msg.loadingCollections", "Loading collections...")), 1)) : a.value ? (q(), X("div", ex, J(a.value), 1)) : i.value.length ? G("", !0) : (q(), X("div", tx, J(Z(R)("msg.noCollections", "No collections yet.")), 1)), + (q(!0), X(H, null, hr(i.value, (e) => (q(), ir(o, { key: String(e?.id || ""), type: "button", class: "mjr-context-menu-item", @@ -22639,28 +22639,28 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr role: "menuitem", onClick: (t) => h(String(e?.id || ""), String(e?.name || e?.id || "")) }, { - default: W(() => [U("span", ex, [t[1] ||= U("i", { class: "pi pi-bookmark" }, null, -1), U("span", null, J(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (q(), X("span", tx, J(Number(e?.count || 0)), 1)) : G("", !0)]), + default: W(() => [U("span", nx, [t[1] ||= U("i", { class: "pi pi-bookmark" }, null, -1), U("span", null, J(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (q(), X("span", rx, J(Number(e?.count || 0)), 1)) : G("", !0)]), _: 2 }, 1032, ["onClick"]))), 128)) - ], 12, Jb)) : G("", !0)]); + ], 12, Xb)) : G("", !0)]); }; } -}), rx = { +}), ax = { key: 0, class: "mjr-context-menu-separator" -}, ix = { class: "mjr-context-menu-item-left" }, ax = { class: "mjr-context-menu-item-right" }, ox = { +}, ox = { class: "mjr-context-menu-item-left" }, sx = { class: "mjr-context-menu-item-right" }, cx = { key: 0, class: "mjr-context-menu-hint" -}, sx = { +}, lx = { key: 1, class: "mjr-context-menu-submenu-arrow" -}, cx = { +}, ux = { key: 0, class: "mjr-context-menu-separator" -}, lx = { class: "mjr-context-menu-item-left" }, ux = { +}, dx = { class: "mjr-context-menu-item-left" }, fx = { key: 0, class: "mjr-context-menu-hint" -}, dx = /* @__PURE__ */ lr({ +}, px = /* @__PURE__ */ dr({ __name: "GridContextMenu", setup(e) { let t = Q(null), n = Q(null), r = Q(null), i = null, a = null, o = K(() => l(hn.main, 10031)), s = K(() => l(hn.submenu, 10032)), c = K(() => l(hn.tags, 10033)); @@ -22687,7 +22687,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr a + n.width > r && (a = Math.max(8, r - n.width - 10)), o + n.height > i && (o = Math.max(8, i - n.height - 10)), a < 8 && (a = 8), o < 8 && (o = 8), e.x = a, e.y = o; } async function p(e, t) { - await sr(), f(e, t?.value || null); + await lr(), f(e, t?.value || null); } function m(e) { try { @@ -22760,13 +22760,13 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr console.debug?.(e); } } - return or(() => hn.main.open, async (e) => { + return cr(() => hn.main.open, async (e) => { e && (await p(hn.main, t), m(t)); - }), or(() => hn.submenu.open, async (e) => { + }), cr(() => hn.submenu.open, async (e) => { e && (await p(hn.submenu, n), m(n)); - }), or(() => hn.tags.open, async (e) => { + }), cr(() => hn.tags.open, async (e) => { e && await p(hn.tags, r); - }), kr(() => { + }), jr(() => { a = new AbortController(); let e = { capture: !0, @@ -22780,7 +22780,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr passive: !0, signal: a.signal }), window.addEventListener("mjr-close-all-menus", w, { signal: a.signal }); - }), tr(() => { + }), rr(() => { u(); try { a?.abort(); @@ -22789,20 +22789,20 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } a = null, gn(); }), (e, i) => { - let a = rr("MButton"); - return q(), nr(Er, { to: "body" }, [ + let a = ar("MButton"); + return q(), ir(Or, { to: "body" }, [ Z(hn).main.open ? (q(), X("div", { key: 0, ref_key: "mainMenuRef", ref: t, class: "mjr-grid-context-menu mjr-context-menu", - style: yr(o.value), + style: xr(o.value), role: "menu", "aria-label": "Grid context menu" - }, [(q(!0), X(H, null, pr(Z(hn).main.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", rx)) : (q(), nr(a, { + }, [(q(!0), X(H, null, hr(Z(hn).main.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ax)) : (q(), ir(a, { key: 1, type: "button", - class: wr(["mjr-context-menu-item", { + class: Er(["mjr-context-menu-item", { "is-disabled": e.disabled, "has-submenu": Array.isArray(e.submenu) && e.submenu.length, "is-tone-graph-map": e.tone === "graph-map", @@ -22819,10 +22819,10 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr onMouseenter: (t) => _(e, t), onMouseleave: (t) => v(e) }, { - default: W(() => [U("span", ix, [e.iconClass ? (q(), X("i", { + default: W(() => [U("span", ox, [e.iconClass ? (q(), X("i", { key: 0, - class: wr(e.iconClass) - }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), U("span", ax, [e.rightHint ? (q(), X("span", ox, J(e.rightHint), 1)) : G("", !0), Array.isArray(e.submenu) && e.submenu.length ? (q(), X("span", sx, " > ")) : G("", !0)])]), + class: Er(e.iconClass) + }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), U("span", sx, [e.rightHint ? (q(), X("span", cx, J(e.rightHint), 1)) : G("", !0), Array.isArray(e.submenu) && e.submenu.length ? (q(), X("span", lx, " > ")) : G("", !0)])]), _: 2 }, 1032, [ "class", @@ -22837,15 +22837,15 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr ref_key: "submenuRef", ref: n, class: "mjr-grid-rating-submenu mjr-context-menu", - style: yr(s.value), + style: xr(s.value), role: "menu", "aria-label": "Grid context submenu", onMouseenter: y, onMouseleave: b - }, [(q(!0), X(H, null, pr(Z(hn).submenu.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", cx)) : (q(), nr(a, { + }, [(q(!0), X(H, null, hr(Z(hn).submenu.items, (e) => (q(), X(H, { key: e.id }, [e.type === "separator" ? (q(), X("div", ux)) : (q(), ir(a, { key: 1, type: "button", - class: wr(["mjr-context-menu-item", { + class: Er(["mjr-context-menu-item", { "is-disabled": e.disabled, "is-tone-graph-map": e.tone === "graph-map", "is-tone-rename": e.tone === "rename", @@ -22859,10 +22859,10 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr tabindex: e.disabled ? -1 : 0, onClick: (t) => g(e, t, "submenu") }, { - default: W(() => [U("span", lx, [e.iconClass ? (q(), X("i", { + default: W(() => [U("span", dx, [e.iconClass ? (q(), X("i", { key: 0, - class: wr(e.iconClass) - }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), e.rightHint ? (q(), X("span", ux, J(e.rightHint), 1)) : G("", !0)]), + class: Er(e.iconClass) + }, null, 2)) : G("", !0), U("span", null, J(e.label), 1)]), e.rightHint ? (q(), X("span", fx, J(e.rightHint), 1)) : G("", !0)]), _: 2 }, 1032, [ "class", @@ -22875,8 +22875,8 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr ref_key: "tagsPopoverRef", ref: r, class: "mjr-grid-popover", - style: yr(c.value) - }, [Y(Mr, { + style: xr(c.value) + }, [Y(Pr, { asset: Z(hn).tags.asset, "model-value": Z(hn).tags.asset?.tags || [], "onUpdate:modelValue": T, @@ -22885,23 +22885,23 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr ]); }; } -}), fx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, px = { class: "mjr-workflow-picker-header" }, mx = { class: "mjr-workflow-picker-title" }, hx = { class: "mjr-workflow-picker-subtitle" }, gx = { class: "mjr-workflow-info-form" }, _x = { class: "is-wide" }, vx = { class: "mjr-workflow-picker-footer" }, yx = /* @__PURE__ */ lr({ +}), mx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, hx = { class: "mjr-workflow-picker-header" }, gx = { class: "mjr-workflow-picker-title" }, _x = { class: "mjr-workflow-picker-subtitle" }, vx = { class: "mjr-workflow-info-form" }, yx = { class: "is-wide" }, bx = { class: "mjr-workflow-picker-footer" }, xx = /* @__PURE__ */ dr({ __name: "WorkflowInfoDialog", setup(t) { - let n = xr({ + let n = Cr({ task: "", model_family: "", provider: "", runs_on: "", notes: "" - }), r = K(() => Li.workflow || null), i = K(() => String(r.value?.display_name || r.value?.filename || "Workflow")); - or(() => Li.open, (e) => { + }), r = K(() => zi.workflow || null), i = K(() => String(r.value?.display_name || r.value?.filename || "Workflow")); + cr(() => zi.open, (e) => { if (!e) return; let t = r.value || {}; n.task = String(t.user_task || t.task || ""), n.model_family = String(t.user_model_family || t.model_family || ""), n.provider = String(t.user_provider || t.provider || ""), n.runs_on = String(t.user_runs_on || t.runs_on || ""), n.notes = String(t.notes || ""); }); function a() { - zi(); + Vi(); } async function o() { let t = String(r.value?.filepath || "").trim(); @@ -22915,45 +22915,45 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, { timeoutMs: 2e4 }); i?.ok ? (e(R("toast.workflowUpdated", "Workflow updated"), "success", 1800), window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: "workflow-info" } })), a()) : e(i?.error || R("toast.workflowSaveFailed", "Failed to save workflow."), "error"); } - return (e, t) => (q(), nr(Er, { to: "body" }, [Z(Li).open ? (q(), X("div", { + return (e, t) => (q(), ir(Or, { to: "body" }, [Z(zi).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: fr(a, ["self"]) - }, [U("section", fx, [ - U("header", px, [U("div", null, [U("div", mx, J(Z(R)("ctx.editWorkflowInfo", "Edit infos")), 1), U("div", hx, J(i.value), 1)]), U("button", { + onClick: mr(a, ["self"]) + }, [U("section", mx, [ + U("header", hx, [U("div", null, [U("div", gx, J(Z(R)("ctx.editWorkflowInfo", "Edit infos")), 1), U("div", _x, J(i.value), 1)]), U("button", { type: "button", class: "mjr-workflow-picker-close", onClick: a }, [...t[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), - U("div", gx, [ - U("label", null, [t[6] ||= U("span", null, "Task", -1), hr(U("input", { + U("div", vx, [ + U("label", null, [t[6] ||= U("span", null, "Task", -1), _r(U("input", { "onUpdate:modelValue": t[0] ||= (e) => n.task = e, type: "text", placeholder: "I2V, I2I, T2V, Image Edit..." - }, null, 512), [[Or, n.task]])]), - U("label", null, [t[7] ||= U("span", null, "Model family", -1), hr(U("input", { + }, null, 512), [[Ar, n.task]])]), + U("label", null, [t[7] ||= U("span", null, "Model family", -1), _r(U("input", { "onUpdate:modelValue": t[1] ||= (e) => n.model_family = e, type: "text", placeholder: "Flux, Qwen, Wan..." - }, null, 512), [[Or, n.model_family]])]), - U("label", null, [t[8] ||= U("span", null, "Provider", -1), hr(U("input", { + }, null, 512), [[Ar, n.model_family]])]), + U("label", null, [t[8] ||= U("span", null, "Provider", -1), _r(U("input", { "onUpdate:modelValue": t[2] ||= (e) => n.provider = e, type: "text", placeholder: "Google, ByteDance, local..." - }, null, 512), [[Or, n.provider]])]), - U("label", null, [t[10] ||= U("span", null, "Runs on", -1), hr(U("select", { "onUpdate:modelValue": t[3] ||= (e) => n.runs_on = e }, [...t[9] ||= [ + }, null, 512), [[Ar, n.provider]])]), + U("label", null, [t[10] ||= U("span", null, "Runs on", -1), _r(U("select", { "onUpdate:modelValue": t[3] ||= (e) => n.runs_on = e }, [...t[9] ||= [ U("option", { value: "" }, "Auto", -1), U("option", { value: "local" }, "local", -1), U("option", { value: "api" }, "api", -1), U("option", { value: "cloud" }, "cloud", -1) - ]], 512), [[Tr, n.runs_on]])]), - U("label", _x, [t[11] ||= U("span", null, "Notes", -1), hr(U("textarea", { + ]], 512), [[Dr, n.runs_on]])]), + U("label", yx, [t[11] ||= U("span", null, "Notes", -1), _r(U("textarea", { "onUpdate:modelValue": t[4] ||= (e) => n.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" - }, null, 512), [[Or, n.notes]])]) + }, null, 512), [[Ar, n.notes]])]) ]), - U("footer", vx, [U("button", { + U("footer", bx, [U("button", { type: "button", class: "mjr-workflow-picker-secondary", onClick: a @@ -22964,22 +22964,22 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, J(Z(R)("btn.apply", "Apply")), 1)]) ])])) : G("", !0)])); } -}), bx = { class: "mjr-workflow-picker-header" }, xx = { class: "mjr-workflow-picker-title" }, Sx = { +}), Sx = { class: "mjr-workflow-picker-header" }, Cx = { class: "mjr-workflow-picker-title" }, wx = { key: 0, class: "mjr-workflow-picker-source" -}, Cx = { class: "mjr-workflow-picker-toolbar" }, wx = { class: "mjr-workflow-picker-search" }, Tx = ["placeholder"], Ex = { value: "" }, Dx = ["value"], Ox = { value: "" }, kx = ["value"], Ax = { value: "" }, jx = ["value"], Mx = { class: "mjr-workflow-picker-body" }, Nx = { +}, Tx = { class: "mjr-workflow-picker-toolbar" }, Ex = { class: "mjr-workflow-picker-search" }, Dx = ["placeholder"], Ox = { value: "" }, kx = ["value"], Ax = { value: "" }, jx = ["value"], Mx = { value: "" }, Nx = ["value"], Px = { class: "mjr-workflow-picker-body" }, Fx = { key: 0, class: "mjr-workflow-picker-empty" -}, Px = { +}, Ix = { key: 1, class: "mjr-workflow-picker-empty is-error" -}, Fx = { +}, Lx = { key: 2, class: "mjr-workflow-picker-empty" -}, Ix = ["onClick"], Lx = { class: "mjr-workflow-picker-thumb" }, Rx = ["src", "alt"], zx = { +}, Rx = ["onClick"], zx = { class: "mjr-workflow-picker-thumb" }, Bx = ["src", "alt"], Vx = { key: 1, class: "pi pi-sitemap" -}, Bx = { class: "mjr-workflow-picker-card-info" }, Vx = ["disabled"], Hx = { class: "mjr-workflow-picker-card-info" }, Ux = { class: "mjr-workflow-picker-footer" }, Wx = ["disabled"], Gx = 120, Kx = /* @__PURE__ */ lr({ +}, Hx = { class: "mjr-workflow-picker-card-info" }, Ux = ["disabled"], Wx = { class: "mjr-workflow-picker-card-info" }, Gx = { class: "mjr-workflow-picker-footer" }, Kx = ["disabled"], qx = 120, Jx = /* @__PURE__ */ dr({ __name: "WorkflowPickerDialog", setup(e) { let t = Q(""), n = Q(!1), r = Q(!1), i = Q(""), a = Q([]), s = Q(""), c = Q(0), l = Q(!1), u = 0, d = K(() => xn.sourceAsset || null), f = K(() => xn.workflow || null), p = K(() => String(xn.mode || "") === "asset"), m = K(() => String(d.value?.filename || d.value?.display_name || f.value?.display_name || f.value?.filename || d.value?.filepath || f.value?.filepath || "")), h = K(() => x("task")), g = K(() => x("model_family")), _ = K(() => x("runs_on")), v = Q(""), y = Q(""), b = Q(""); @@ -23031,7 +23031,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } let n = await o({ q: "*", - limit: Gx, + limit: qx, offset: d, sort: "mtime" }, { timeoutMs: 2e4 }); @@ -23041,7 +23041,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr return; } let r = (Array.isArray(n?.data?.assets) ? n.data.assets : Array.isArray(n?.data) ? n.data : []).filter((e) => String(e?.filepath || "").trim()); - a.value = e ? r : [...a.value, ...r], c.value = d + r.length, l.value = r.length >= Gx, !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); + a.value = e ? r : [...a.value, ...r], c.value = d + r.length, l.value = r.length >= qx, !s.value && a.value[0]?.filepath && (s.value = String(a.value[0].filepath)); } catch (e) { t === u && (i.value = String(e?.message || e || "Failed to load workflows"), a.value = []); } finally { @@ -23063,7 +23063,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr function M(e) { e.key === "Escape" && (e.preventDefault(), j()); } - return or(() => xn.open, (e) => { + return cr(() => xn.open, (e) => { if (e) { s.value = "", c.value = 0, l.value = !1, t.value = "", v.value = "", y.value = "", b.value = "", O(); try { @@ -23072,80 +23072,80 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } else try { window.removeEventListener("keydown", M); } catch {} - }), dr(() => { + }), pr(() => { try { window.removeEventListener("keydown", M); } catch {} - }), (e, a) => (q(), nr(Er, { to: "body" }, [Z(xn).open ? (q(), X("div", { + }), (e, a) => (q(), ir(Or, { to: "body" }, [Z(xn).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onMousedown: fr(j, ["self"]) + onMousedown: mr(j, ["self"]) }, [U("section", { - class: wr(["mjr-workflow-picker-dialog", { "is-asset-mode": p.value }]), + class: Er(["mjr-workflow-picker-dialog", { "is-asset-mode": p.value }]), role: "dialog", "aria-modal": "true" }, [ - U("header", bx, [U("div", xx, [a[4] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("span", null, J(Z(xn).title), 1)]), U("button", { + U("header", Sx, [U("div", Cx, [a[4] ||= U("i", { class: "pi pi-sitemap" }, null, -1), U("span", null, J(Z(xn).title), 1)]), U("button", { class: "mjr-workflow-picker-icon-btn", type: "button", onClick: j }, [...a[5] ||= [U("i", { class: "pi pi-times" }, null, -1)]])]), - m.value ? (q(), X("div", Sx, [U("span", null, J(p.value ? Z(R)("tab.workflow", "Workflow") : Z(R)("dialog.workflowThumbnailSource", "Source")), 1), U("strong", null, J(m.value), 1)])) : G("", !0), - U("div", Cx, [ - U("label", wx, [a[6] ||= U("i", { class: "pi pi-search" }, null, -1), hr(U("input", { + m.value ? (q(), X("div", wx, [U("span", null, J(p.value ? Z(R)("tab.workflow", "Workflow") : Z(R)("dialog.workflowThumbnailSource", "Source")), 1), U("strong", null, J(m.value), 1)])) : G("", !0), + U("div", Tx, [ + U("label", Ex, [a[6] ||= U("i", { class: "pi pi-search" }, null, -1), _r(U("input", { "onUpdate:modelValue": a[0] ||= (e) => t.value = e, type: "search", placeholder: Z(R)("search.workflows", "Search workflows...") - }, null, 8, Tx), [[Or, t.value]])]), - p.value ? G("", !0) : hr((q(), X("select", { + }, null, 8, Dx), [[Ar, t.value]])]), + p.value ? G("", !0) : _r((q(), X("select", { key: 0, "onUpdate:modelValue": a[1] ||= (e) => v.value = e - }, [U("option", Ex, J(Z(R)("filter.task", "Task")), 1), (q(!0), X(H, null, pr(h.value, (e) => (q(), X("option", { + }, [U("option", Ox, J(Z(R)("filter.task", "Task")), 1), (q(!0), X(H, null, hr(h.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, Dx))), 128))], 512)), [[Tr, v.value]]), - p.value ? G("", !0) : hr((q(), X("select", { + }, J(e), 9, kx))), 128))], 512)), [[Dr, v.value]]), + p.value ? G("", !0) : _r((q(), X("select", { key: 1, "onUpdate:modelValue": a[2] ||= (e) => y.value = e - }, [U("option", Ox, J(Z(R)("filter.model", "Model")), 1), (q(!0), X(H, null, pr(g.value, (e) => (q(), X("option", { + }, [U("option", Ax, J(Z(R)("filter.model", "Model")), 1), (q(!0), X(H, null, hr(g.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, kx))), 128))], 512)), [[Tr, y.value]]), - p.value ? G("", !0) : hr((q(), X("select", { + }, J(e), 9, jx))), 128))], 512)), [[Dr, y.value]]), + p.value ? G("", !0) : _r((q(), X("select", { key: 2, "onUpdate:modelValue": a[3] ||= (e) => b.value = e - }, [U("option", Ax, J(Z(R)("filter.runsOn", "Runs on")), 1), (q(!0), X(H, null, pr(_.value, (e) => (q(), X("option", { + }, [U("option", Mx, J(Z(R)("filter.runsOn", "Runs on")), 1), (q(!0), X(H, null, hr(_.value, (e) => (q(), X("option", { key: e, value: e - }, J(e), 9, jx))), 128))], 512)), [[Tr, b.value]]) + }, J(e), 9, Nx))), 128))], 512)), [[Dr, b.value]]) ]), - U("div", Mx, [n.value ? (q(), X("div", Nx, J(Z(R)("status.loading", "Loading...")), 1)) : i.value ? (q(), X("div", Px, J(i.value), 1)) : S.value.length ? (q(), X(H, { key: 3 }, [(q(!0), X(H, null, pr(S.value, (e) => (q(), X("button", { + U("div", Px, [n.value ? (q(), X("div", Fx, J(Z(R)("status.loading", "Loading...")), 1)) : i.value ? (q(), X("div", Ix, J(i.value), 1)) : S.value.length ? (q(), X(H, { key: 3 }, [(q(!0), X(H, null, hr(S.value, (e) => (q(), X("button", { key: e.filepath, type: "button", - class: wr(["mjr-workflow-picker-card", { "is-selected": s.value === String(e.filepath || "") }]), + class: Er(["mjr-workflow-picker-card", { "is-selected": s.value === String(e.filepath || "") }]), onClick: (t) => s.value = String(e.filepath || ""), onDblclick: A - }, [U("div", Lx, [E(e) ? (q(), X("img", { + }, [U("div", zx, [E(e) ? (q(), X("img", { key: 0, src: E(e), alt: w(e), loading: "lazy" - }, null, 8, Rx)) : (q(), X("i", zx))]), U("div", Bx, [ + }, null, 8, Bx)) : (q(), X("i", Vx))]), U("div", Hx, [ U("strong", null, J(w(e)), 1), U("span", null, J(T(e)), 1), U("small", null, J(e.filename), 1) - ])], 42, Ix))), 128)), !p.value && l.value ? (q(), X("button", { + ])], 42, Rx))), 128)), !p.value && l.value ? (q(), X("button", { key: 0, type: "button", class: "mjr-workflow-picker-card mjr-workflow-picker-load-more", disabled: r.value, onClick: k - }, [a[7] ||= U("div", { class: "mjr-workflow-picker-thumb" }, [U("i", { class: "pi pi-angle-down" })], -1), U("div", Hx, [ + }, [a[7] ||= U("div", { class: "mjr-workflow-picker-thumb" }, [U("i", { class: "pi pi-angle-down" })], -1), U("div", Wx, [ U("strong", null, J(r.value ? Z(R)("status.loading", "Loading...") : Z(R)("action.loadMore", "Load more")), 1), U("span", null, J(Z(R)("tab.workflow", "Workflow")), 1), U("small", null, J(c.value) + " loaded", 1) - ])], 8, Vx)) : G("", !0)], 64)) : (q(), X("div", Fx, J(Z(R)("toast.noWorkflowsFound", "No workflows found.")), 1))]), - U("footer", Ux, [U("button", { + ])], 8, Ux)) : G("", !0)], 64)) : (q(), X("div", Lx, J(Z(R)("toast.noWorkflowsFound", "No workflows found.")), 1))]), + U("footer", Gx, [U("button", { type: "button", class: "mjr-workflow-picker-btn", onClick: j @@ -23154,31 +23154,31 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr class: "mjr-workflow-picker-btn is-primary", disabled: !C.value, onClick: A - }, J(Z(R)("action.apply", "Apply")), 9, Wx)]) + }, J(Z(R)("action.apply", "Apply")), 9, Kx)]) ], 2)], 32)) : G("", !0)])); } -}), qx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Jx = { class: "mjr-workflow-picker-header" }, Yx = { class: "mjr-workflow-picker-title" }, Xx = { class: "mjr-workflow-picker-subtitle" }, Zx = { class: "mjr-workflow-info-form" }, Qx = { class: "is-wide" }, $x = { class: "is-wide" }, eS = { class: "mjr-workflow-picker-footer" }, tS = /* @__PURE__ */ lr({ +}), Yx = { class: "mjr-workflow-picker-dialog mjr-workflow-info-dialog" }, Xx = { class: "mjr-workflow-picker-header" }, Zx = { class: "mjr-workflow-picker-title" }, Qx = { class: "mjr-workflow-picker-subtitle" }, $x = { class: "mjr-workflow-info-form" }, eS = { class: "is-wide" }, tS = { class: "is-wide" }, nS = { class: "mjr-workflow-picker-footer" }, rS = /* @__PURE__ */ dr({ __name: "WorkflowSaveInfoDialog", setup(e) { - let t = xr({ + let t = Cr({ name: "", task: "", model_family: "", provider: "", runs_on: "", notes: "" - }), n = K(() => y_.initial || {}), r = K(() => R("dialog.saveWorkflowWithInfo", "Save workflow")), i = K(() => R("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); - or(() => y_.open, (e) => { + }), n = K(() => x_.initial || {}), r = K(() => R("dialog.saveWorkflowWithInfo", "Save workflow")), i = K(() => R("dialog.workflowInfoAutoFallback", "Leave fields empty to use automatic workflow detection.")); + cr(() => x_.open, (e) => { if (!e) return; let r = n.value || {}; t.name = String(r.name || r.workflow?.name || r.workflow?.title || "workflow").trim(), t.task = String(r.task || ""), t.model_family = String(r.model_family || ""), t.provider = String(r.provider || ""), t.runs_on = String(r.runs_on || ""), t.notes = String(r.notes || ""); }); function a() { - x_(null); + C_(null); } function o() { let e = String(t.name || "").trim(); - e && x_({ + e && C_({ name: e, task: String(t.task || "").trim(), model_family: String(t.model_family || "").trim(), @@ -23188,13 +23188,13 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }); } return (e, n) => { - let s = rr("MButton"), c = rr("MInputText"), l = rr("MSelect"), u = rr("MTextarea"); - return q(), nr(Er, { to: "body" }, [Z(y_).open ? (q(), X("div", { + let s = ar("MButton"), c = ar("MInputText"), l = ar("MSelect"), u = ar("MTextarea"); + return q(), ir(Or, { to: "body" }, [Z(x_).open ? (q(), X("div", { key: 0, class: "mjr-workflow-picker-backdrop", - onClick: fr(a, ["self"]) - }, [U("section", qx, [ - U("header", Jx, [U("div", null, [U("div", Yx, J(r.value), 1), U("div", Xx, J(i.value), 1)]), Y(s, { + onClick: mr(a, ["self"]) + }, [U("section", Yx, [ + U("header", Xx, [U("div", null, [U("div", Zx, J(r.value), 1), U("div", Qx, J(i.value), 1)]), Y(s, { type: "button", class: "mjr-workflow-picker-close", onClick: a @@ -23202,13 +23202,13 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr default: W(() => [...n[6] ||= [U("i", { class: "pi pi-times" }, null, -1)]]), _: 1 })]), - U("div", Zx, [ - U("label", Qx, [U("span", null, J(Z(R)("dialog.workflowSaveName", "Workflow name")), 1), Y(c, { + U("div", $x, [ + U("label", eS, [U("span", null, J(Z(R)("dialog.workflowSaveName", "Workflow name")), 1), Y(c, { modelValue: t.name, "onUpdate:modelValue": n[0] ||= (e) => t.name = e, type: "text", placeholder: "workflow", - onKeydown: Dr(fr(o, ["prevent"]), ["enter"]) + onKeydown: kr(mr(o, ["prevent"]), ["enter"]) }, null, 8, ["modelValue", "onKeydown"])]), U("label", null, [n[7] ||= U("span", null, "Task", -1), Y(c, { modelValue: t.task, @@ -23253,19 +23253,19 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "option-value": "value", placeholder: "Auto" }, null, 8, ["modelValue"])]), - U("label", $x, [n[11] ||= U("span", null, "Notes", -1), Y(u, { + U("label", tS, [n[11] ||= U("span", null, "Notes", -1), Y(u, { modelValue: t.notes, "onUpdate:modelValue": n[5] ||= (e) => t.notes = e, rows: "5", placeholder: "Notes displayed on workflow hover" }, null, 8, ["modelValue"])]) ]), - U("footer", eS, [Y(s, { + U("footer", nS, [Y(s, { type: "button", class: "mjr-workflow-picker-secondary", onClick: a }, { - default: W(() => [er(J(Z(R)("btn.cancel", "Cancel")), 1)]), + default: W(() => [nr(J(Z(R)("btn.cancel", "Cancel")), 1)]), _: 1 }), Y(s, { type: "button", @@ -23273,29 +23273,29 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr disabled: !String(t.name || "").trim(), onClick: o }, { - default: W(() => [er(J(Z(R)("btn.save", "Save")), 1)]), + default: W(() => [nr(J(Z(R)("btn.save", "Save")), 1)]), _: 1 }, 8, ["disabled"])]) ])])) : G("", !0)]); }; } -}), nS = /* @__PURE__ */ lr({ +}), iS = /* @__PURE__ */ dr({ __name: "ContextMenuPortal", setup(e) { let t = Q(""), n = K(() => _n(t.value)); - return kr(() => { + return jr(() => { t.value = Xt(); - }), tr(() => { + }), rr(() => { an(t.value), t.value = ""; }), (e, t) => n.value ? (q(), X(H, { key: 0 }, [ - Y(dx), - Y(nx), - Y(Kx), - Y(yx), - Y(tS) + Y(px), + Y(ix), + Y(Jx), + Y(xx), + Y(rS) ], 64)) : G("", !0); } -}), rS = { +}), aS = { class: "mjr-sidebar-content", style: { flex: "1", @@ -23305,29 +23305,29 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "flex-direction": "column", gap: "16px" } -}, iS = { +}, oS = { class: "mjr-sidebar-rating-tags", style: { display: "flex", "flex-direction": "column", gap: "10px" } -}, aS = { style: { +}, sS = { style: { display: "flex", "align-items": "center", gap: "8px" -} }, oS = { style: { +} }, cS = { style: { "font-size": "0.8em", opacity: "0.6", "min-width": "44px" -} }, sS = { style: { +} }, lS = { style: { display: "flex", "flex-direction": "column", gap: "4px" -} }, cS = { style: { +} }, uS = { style: { "font-size": "0.8em", opacity: "0.6" -} }, lS = /* @__PURE__ */ lr({ +} }, dS = /* @__PURE__ */ dr({ __name: "AssetSidebarContent", props: { asset: {}, @@ -23341,14 +23341,14 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr return e === "workflow" || t === "workflow" || n.endsWith(".json"); }), c = K(() => Number(i.asset?.rating) || 0), l = K(() => i.asset?.tags || []), u = K(() => { try { - return !!(Jt()?.sidebar?.showPreviewThumb ?? !0); + return !!(Vn()?.sidebar?.showPreviewThumb ?? !0); } catch { return !0; } }); function d() { if (i.sidebar) try { - Qm(i.sidebar); + eh(i.sidebar); } catch (e) { console.debug?.(e); } @@ -23378,30 +23378,30 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } } return (e, n) => { - let r = rr("MButton"); + let r = ar("MButton"); return q(), X(H, null, [ - Y(Ab, { + Y(Mb, { asset: t.asset, onClose: d }, null, 8, ["asset"]), - U("div", rS, [o.value ? (q(), nr(Gb, { + U("div", aS, [o.value ? (q(), ir(qb, { key: 0, asset: t.asset }, null, 8, ["asset"])) : (q(), X(H, { key: 1 }, [s.value ? G("", !0) : (q(), X(H, { key: 0 }, [ - Y(zb, { + Y(Vb, { asset: t.asset, "show-preview-thumb": u.value }, null, 8, ["asset", "show-preview-thumb"]), - U("div", iS, [U("div", aS, [U("span", oS, J(Z(R)("sidebar.rating", "Rating")), 1), Y(qb, { + U("div", oS, [U("div", sS, [U("span", cS, J(Z(R)("sidebar.rating", "Rating")), 1), Y(Yb, { asset: t.asset, "model-value": c.value, size: 60 - }, null, 8, ["asset", "model-value"])]), U("div", sS, [U("span", cS, J(Z(R)("sidebar.tags", "Tags")), 1), Y(Mr, { + }, null, 8, ["asset", "model-value"])]), U("div", lS, [U("span", uS, J(Z(R)("sidebar.tags", "Tags")), 1), Y(Pr, { asset: t.asset, "model-value": l.value }, null, 8, ["asset", "model-value"])])]), Y(kn, { asset: t.asset }, null, 8, ["asset"]), - p.value ? (q(), nr(r, { + p.value ? (q(), ir(r, { key: 0, type: "button", class: "mjr-btn mjr-sidebar-collect-btn", @@ -23417,16 +23417,16 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, onClick: m }, { - default: W(() => [U("i", { class: wr(f.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), U("span", null, J(f.value ? Z(R)("sidebar.collectingFiles", "Collecting...") : Z(R)("sidebar.collectFiles", "Collect files")), 1)]), + default: W(() => [U("i", { class: Er(f.value ? "pi pi-spin pi-spinner" : "pi pi-box") }, null, 2), U("span", null, J(f.value ? Z(R)("sidebar.collectingFiles", "Collecting...") : Z(R)("sidebar.collectFiles", "Collect files")), 1)]), _: 1 }, 8, ["disabled", "title"])) : G("", !0), Y(Pn, { asset: t.asset }, null, 8, ["asset"]) - ], 64)), Y(zn, { asset: t.asset }, null, 8, ["asset"])], 64))]), - Y(nS) + ], 64)), Y(Bn, { asset: t.asset }, null, 8, ["asset"])], 64))]), + Y(iS) ], 64); }; } -}), uS = { +}), fS = { key: 1, class: "mjr-sidebar-placeholder", style: { @@ -23439,11 +23439,11 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "font-size": "0.85em", "text-align": "center" } -}, dS = /* @__PURE__ */ lr({ +}, pS = /* @__PURE__ */ dr({ __name: "SidebarSection", setup(e, { expose: t }) { - let n = Q(null), { activeAsset: r, onUpdateCallback: i } = Bm(); - return kr(() => { + let n = Q(null), { activeAsset: r, onUpdateCallback: i } = Hm(); + return jr(() => { let e = n.value; if (!e) return; e.style.flex = "0 0 0px", e.style.width = "0", e.style.maxWidth = "0", e.style.minWidth = "0", e.style.overflow = "hidden", e.style.borderLeft = "none", e.style.borderRight = "none", e._requestSeq = 0, e._currentAsset = null, e._currentFullAsset = null, e._ratingTagsSection = null; @@ -23453,7 +23453,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, a = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Number(r.rating); if (t(a) && Number.isFinite(o)) { - Um({ rating: o }, i.value); + Gm({ rating: o }, i.value); try { e._currentAsset && (e._currentAsset.rating = o), e._currentFullAsset && (e._currentFullAsset.rating = o); } catch (e) { @@ -23463,7 +23463,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, o = (n) => { let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Array.isArray(r.tags) ? r.tags : null; if (t(a) && o) { - Um({ tags: o }, i.value); + Gm({ tags: o }, i.value); try { e._currentAsset && (e._currentAsset.tags = o), e._currentFullAsset && (e._currentFullAsset.tags = o); } catch (e) { @@ -23485,16 +23485,16 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, e._dispose = e.dispose; let l = c ? { signal: c.signal } : void 0; try { - window.addEventListener(ot, a, l), window.addEventListener(z, o, l); + window.addEventListener(ot, a, l), window.addEventListener(et, o, l); } catch (e) { console.debug?.(e); try { - window.addEventListener(ot, a), window.addEventListener(z, o), s.push(() => window.removeEventListener(ot, a)), s.push(() => window.removeEventListener(z, o)); + window.addEventListener(ot, a), window.addEventListener(et, o), s.push(() => window.removeEventListener(ot, a)), s.push(() => window.removeEventListener(et, o)); } catch (e) { console.debug?.(e); } } - }), tr(() => { + }), rr(() => { try { n.value?.dispose?.(); } catch {} @@ -23515,7 +23515,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr transition: "width 140ms ease,max-width 140ms ease,flex-basis 140ms ease,border-color 140ms ease", contain: "layout paint style" } - }, [Z(r) ? (q(), nr(lS, { + }, [Z(r) ? (q(), ir(dS, { key: 0, asset: Z(r), "on-update": Z(i), @@ -23524,18 +23524,18 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr "asset", "on-update", "sidebar" - ])) : (q(), X("div", uS, J(Z(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); + ])) : (q(), X("div", fS, J(Z(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); } -}), fS = /* @__PURE__ */ lr({ +}), mS = /* @__PURE__ */ dr({ __name: "App", setup(e) { let t = Q(null), n = Q(null), r = Q(null), i = Q(null), a = Q(null), o = Q(null), s = null; - return kr(async () => { + return jr(async () => { if (!t.value) return; let e = {}; n.value && (e.statusSection = n.value.statusSection, e.statusDot = n.value.statusDot, e.statusText = n.value.statusText, e.capabilitiesSection = n.value.capabilitiesSection), r.value && (e.headerSection = r.value), i.value && (e.summaryBar = i.value.summaryBar, e.updateSummaryBar = i.value.updateSummaryBar, e.folderBreadcrumb = i.value.folderBreadcrumb, e.folderBreadcrumbController = i.value), a.value && (e.browseSection = a.value.browseSection, e.gridWrapper = a.value.gridWrapper, e.gridContainer = a.value.gridContainer, e.onGridContainerReady = (...e) => a.value?.onGridContainerReady?.(...e), e.bindGridHostState = (...e) => a.value?.bindGridHostState?.(...e), e.restoreGridUiState = (...e) => a.value?.restoreGridUiState?.(...e), e.initAssetsQueryController = (...e) => a.value?.initAssetsQueryController?.(...e), e.loadAssets = (e, t = "*", n = {}) => a.value?.loadAssets?.(t, n), e.loadAssetsFromList = (e, t = [], n = {}) => a.value?.loadAssetsFromList?.(t, n), e.prepareGridForScopeSwitch = (e) => a.value?.prepareGridForScopeSwitch?.(), e.refreshGrid = (e) => a.value?.refreshGrid?.(), e.captureAnchor = (e) => a.value?.captureAnchor?.(), e.restoreAnchor = (e, t) => a.value?.restoreAnchor?.(t), e.hydrateGridFromSnapshot = (e, t = {}, n = {}) => a.value?.hydrateGridFromSnapshot?.(t, n), e.upsertAsset = (e, t) => a.value?.upsertAsset?.(t), e.removeAssets = (e, t = [], n = {}) => a.value?.removeAssets?.(t, n), e.disposeGrid = (e) => a.value?.disposeGrid?.()), o.value && (e.sidebar = o.value.sidebar); try { - s = await g_(t.value, { + s = await v_(t.value, { useComfyThemeUI: !0, external: e }); @@ -23543,35 +23543,35 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr console.warn("[Majoor] App.vue: mountAssetsManagerPanelRuntime failed", e); } try { - lh().validatePersistedCustomRoot?.(); + dh().validatePersistedCustomRoot?.(); } catch {} - }), tr(() => { + }), rr(() => { try { s?.dispose?.(); } catch {} s = null; }), (e, s) => (q(), X(H, null, [ - Y(v_, { + Y(b_, { ref_key: "statusSectionRef", ref: n }, null, 512), - Y(Zy, { + Y($y, { ref_key: "headerSectionRef", ref: r }, null, 512), - Y(hb, { + Y(_b, { ref_key: "summaryBarSectionRef", ref: i }, null, 512), - Y(Db, { + Y(kb, { ref_key: "assetsGridRef", ref: a }, null, 512), - Y(dS, { + Y(pS, { ref_key: "sidebarSectionRef", ref: o }, null, 512), - Y(nS), + Y(iS), U("div", { ref_key: "containerRef", ref: t, @@ -23585,7 +23585,7 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr }, null, 512) ], 64)); } -}), pS = /* @__PURE__ */ lr({ +}), hS = /* @__PURE__ */ dr({ __name: "GeneratedFeedApp", setup(e) { let t = Q(null), n = null; @@ -23605,18 +23605,18 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } } } - return kr(() => { + return jr(() => { if (t.value) try { - r(t.value), n = Jd(t.value); + r(t.value), n = Xd(t.value); } catch (e) { console.warn("[Majoor] GeneratedFeedApp.vue: createGeneratedFeedHost failed", e); } - }), tr(() => { + }), rr(() => { try { - Yd(n); + Zd(n); } catch {} n = null; - }), (e, n) => (q(), X(H, null, [Y(nS), U("div", { + }), (e, n) => (q(), X(H, null, [Y(iS), U("div", { ref_key: "containerRef", ref: t, class: "mjr-vue-feed-root", @@ -23631,38 +23631,38 @@ var Nb = { class: "mjr-sidebar-preview" }, Pb = ["src"], Fb = ["src"], Ib = ["sr } }, null, 512)], 64)); } -}), mS = "data-mjr-topbar-mfv-host", hS = "data-mjr-topbar-mfv-button", gS = "data-mjr-topbar-mfv-slot", _S = "label.floatingViewer", vS = "Viewer", yS = "V", bS = "viewer.mfvTopbarButton", xS = null, SS = null, CS = null, wS = null, TS = null, ES = null, DS = null, OS = null, kS = !1, AS = null, jS = !1, MS = !1; -function NS(e) { +}), gS = "data-mjr-topbar-mfv-host", _S = "data-mjr-topbar-mfv-button", vS = "data-mjr-topbar-mfv-slot", yS = "label.floatingViewer", bS = "Viewer", xS = "V", SS = "viewer.mfvTopbarButton", CS = null, wS = null, TS = null, ES = null, DS = null, OS = null, kS = null, AS = null, jS = !1, MS = null, NS = !1, PS = !1; +function FS(e) { if (!e) { - !TS && typeof MutationObserver < "u" && (TS = new MutationObserver(() => { - PS() && (TS?.disconnect?.(), TS = null, JS()); - }), TS.observe(document.body, { + !DS && typeof MutationObserver < "u" && (DS = new MutationObserver(() => { + IS() && (DS?.disconnect?.(), DS = null, XS()); + }), DS.observe(document.body, { childList: !0, subtree: !0 })); return; } try { - TS?.disconnect?.(); + DS?.disconnect?.(); } catch {} - if (TS = null, SS !== e) { - try { - xS?.disconnect?.(); - } catch {} - xS = new MutationObserver(() => JS()), xS.observe(e, { childList: !0 }), SS = e; - } - let t = e.parentElement; - if (t && wS !== t) { + if (DS = null, wS !== e) { try { CS?.disconnect?.(); } catch {} - CS = new MutationObserver(() => JS()), CS.observe(t, { childList: !0 }), wS = t; + CS = new MutationObserver(() => XS()), CS.observe(e, { childList: !0 }), wS = e; + } + let t = e.parentElement; + if (t && ES !== t) { + try { + TS?.disconnect?.(); + } catch {} + TS = new MutationObserver(() => XS()), TS.observe(t, { childList: !0 }), ES = t; } } -function PS() { +function IS() { return typeof document > "u" ? null : document.querySelector(".actionbar-container"); } -function FS(e = PS()) { +function LS(e = IS()) { if (typeof document > "u") return; let t = document.documentElement?.style; if (!t) return; @@ -23673,90 +23673,84 @@ function FS(e = PS()) { let n = e.getBoundingClientRect(), r = Math.max(60, Math.ceil(n.bottom + 12)); t.setProperty("--mjr-mfv-top-offset", `${r}px`); } -function IS(e) { +function RS(e) { return e && e.querySelector(".queue-button-group") || null; } -function LS(e) { +function zS(e) { if (!e) return null; - let t = e.querySelector(`[${gS}]`); - t || (t = document.createElement("div"), t.setAttribute(gS, "1"), t.className = "flex h-full items-center pointer-events-auto", t.style.position = "relative", t.style.zIndex = "10030", t.style.padding = "0 4px"); - let n = IS(e), r = n?.parentElement || e; + let t = e.querySelector(`[${vS}]`); + t || (t = document.createElement("div"), t.setAttribute(vS, "1"), t.className = "flex h-full items-center pointer-events-auto", t.style.position = "relative", t.style.zIndex = "10030", t.style.padding = "0 4px"); + let n = RS(e), r = n?.parentElement || e; return t.parentElement === r ? n && r && t.previousElementSibling !== n ? r.insertBefore(t, n.nextSibling) : !n && t !== r.lastElementChild && r.appendChild(t) : n && r ? r.insertBefore(t, n.nextSibling) : r.appendChild(t), t; } -function RS(e = "pi pi-eye") { +function BS(e = "pi pi-eye") { let t = document.createElement("i"); return t.className = e, t.setAttribute("aria-hidden", "true"), t; } -function zS(e = "Viewer") { +function VS(e = "Viewer") { let t = document.createElement("span"); return t.className = "mjr-topbar-mfv-label", t.textContent = e, t; } -function BS(e) { +function HS(e) { if (!e) return; - let t = jS ? R("tooltip.closeMFV", "Close Floating Viewer") : R("tooltip.openMFV", "Open Floating Viewer"); - Lt(e, t, yS, { ariaLabel: t }), e.setAttribute("aria-pressed", jS ? "true" : "false"), e.classList.toggle("primary", jS), e.classList.toggle("mjr-topbar-mfv-active", jS), e.replaceChildren(RS(jS ? "pi pi-eye-slash" : "pi pi-eye"), zS(R(_S, vS))); + let t = NS ? R("tooltip.closeMFV", "Close Floating Viewer") : R("tooltip.openMFV", "Open Floating Viewer"); + Lt(e, t, xS, { ariaLabel: t }), e.setAttribute("aria-pressed", NS ? "true" : "false"), e.classList.toggle("primary", NS), e.classList.toggle("mjr-topbar-mfv-active", NS), e.replaceChildren(BS(NS ? "pi pi-eye-slash" : "pi pi-eye"), VS(R(yS, bS))); } -function VS() { +function US() { try { window.dispatchEvent(new Event(V.MFV_TOGGLE)); } catch (e) { console.debug?.("[Majoor] top bar MFV launch failed", e); } - JS(); -} -function HS() { - let e = document.createElement("button"); - return e.type = "button", e.setAttribute(hS, "1"), e.className = "comfyui-button mjr-topbar-mfv-button", e.style.position = "relative", e.style.zIndex = "10030", e.style.width = "auto", e.style.height = "32px", e.style.minWidth = "32px", e.style.padding = "0 10px", e.style.gap = "6px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", VS), BS(e), e; -} -function US() { - let e = document.createElement("div"); - return e.setAttribute(mS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(HS()), e; + XS(); } function WS() { - if (typeof document > "u" || MS) return; - let e = !!document.querySelector(".mjr-mfv.is-visible"); - jS !== e && (jS = e); + let e = document.createElement("button"); + return e.type = "button", e.setAttribute(_S, "1"), e.className = "comfyui-button mjr-topbar-mfv-button", e.style.position = "relative", e.style.zIndex = "10030", e.style.width = "auto", e.style.height = "32px", e.style.minWidth = "32px", e.style.padding = "0 10px", e.style.gap = "6px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", US), HS(e), e; } function GS() { - return B.MFV_TOPBAR_BUTTON !== !1; + let e = document.createElement("div"); + return e.setAttribute(gS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(WS()), e; } function KS() { - try { - document.querySelector(`[${mS}]`)?.remove?.(), document.querySelector(`[${gS}]`)?.remove?.(); - } catch (e) { - console.debug?.(e); - } + if (typeof document > "u" || PS) return; + let e = !!document.querySelector(".mjr-mfv.is-visible"); + NS !== e && (NS = e); } function qS() { - let e = PS(); - if (!e) return FS(null), null; - if (!GS()) return KS(), FS(e), null; - NS(e), WS(); - let t = LS(e); - if (!t) return FS(e), null; - let n = t.querySelector(`[${mS}]`); - return n ||= US(), n.parentElement !== t && t.replaceChildren(n), FS(e), BS(n.querySelector(`[${hS}]`)), t; + return B.MFV_TOPBAR_BUTTON !== !1; } function JS() { - kS || (kS = !0, AS = window.setTimeout(() => { - kS = !1, AS = null, qS(); - }, 32)); -} -function YS() { - return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (JS(), ES || (ES = (e) => { - jS = !!e?.detail?.visible, MS = !0, JS(); - }, window.addEventListener(V.MFV_VISIBILITY_CHANGED, ES)), DS || (DS = () => JS(), window.addEventListener("resize", DS)), OS || (OS = (e) => { - let t = e?.detail?.key; - (t === bS || t === "storage") && JS(); - }, window.addEventListener("mjr-settings-changed", OS)), NS(PS()), !0); -} -function XS() { try { - xS?.disconnect?.(); + document.querySelector(`[${gS}]`)?.remove?.(), document.querySelector(`[${vS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } - xS = null, SS = null; +} +function YS() { + let e = IS(); + if (!e) return LS(null), null; + if (!qS()) return JS(), LS(e), null; + FS(e), KS(); + let t = zS(e); + if (!t) return LS(e), null; + let n = t.querySelector(`[${gS}]`); + return n ||= GS(), n.parentElement !== t && t.replaceChildren(n), LS(e), HS(n.querySelector(`[${_S}]`)), t; +} +function XS() { + jS || (jS = !0, MS = window.setTimeout(() => { + jS = !1, MS = null, YS(); + }, 32)); +} +function ZS() { + return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (XS(), OS || (OS = (e) => { + NS = !!e?.detail?.visible, PS = !0, XS(); + }, window.addEventListener(V.MFV_VISIBILITY_CHANGED, OS)), kS || (kS = () => XS(), window.addEventListener("resize", kS)), AS || (AS = (e) => { + let t = e?.detail?.key; + (t === SS || t === "storage") && XS(); + }, window.addEventListener("mjr-settings-changed", AS)), FS(IS()), !0); +} +function QS() { try { CS?.disconnect?.(); } catch (e) { @@ -23768,72 +23762,78 @@ function XS() { } catch (e) { console.debug?.(e); } - TS = null; + TS = null, ES = null; try { - AS && window.clearTimeout(AS); + DS?.disconnect?.(); } catch (e) { console.debug?.(e); } - AS = null, ES && typeof window < "u" && window.removeEventListener(V.MFV_VISIBILITY_CHANGED, ES), ES = null, DS && typeof window < "u" && window.removeEventListener("resize", DS), DS = null, OS && typeof window < "u" && window.removeEventListener("mjr-settings-changed", OS), OS = null, kS = !1, jS = !1, MS = !1; + DS = null; try { - document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${mS}]`)?.remove?.(), document.querySelector(`[${gS}]`)?.remove?.(); + MS && window.clearTimeout(MS); + } catch (e) { + console.debug?.(e); + } + MS = null, OS && typeof window < "u" && window.removeEventListener(V.MFV_VISIBILITY_CHANGED, OS), OS = null, kS && typeof window < "u" && window.removeEventListener("resize", kS), kS = null, AS && typeof window < "u" && window.removeEventListener("mjr-settings-changed", AS), AS = null, jS = !1, NS = !1, PS = !1; + try { + document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${gS}]`)?.remove?.(), document.querySelector(`[${vS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } } // ui/features/runtime/entryUiRegistration.ts -var ZS = "mjr-global-runtime-root", QS = "_mjrGlobalRuntimeVueApp", $S = "_mjrSidebarVueApp", eC = "_mjrFeedVueApp", tC = "majoor-generated-feed", nC = null; -function rC() { +var $S = "mjr-global-runtime-root", eC = "_mjrGlobalRuntimeVueApp", tC = "_mjrSidebarVueApp", nC = "_mjrFeedVueApp", rC = "majoor-generated-feed", iC = null; +function aC() { if (typeof document > "u" || !document?.body) return null; - let e = document.getElementById(ZS); - return e || (e = document.createElement("div"), e.id = ZS, e.setAttribute("role", "presentation"), e.style.cssText = "position:fixed;inset:0;overflow:visible;pointer-events:none;z-index:10020;", document.body.appendChild(e), e); + let e = document.getElementById($S); + return e || (e = document.createElement("div"), e.id = $S, e.setAttribute("role", "presentation"), e.style.cssText = "position:fixed;inset:0;overflow:visible;pointer-events:none;z-index:10020;", document.body.appendChild(e), e); } -function iC() { +function oC() { try { - let e = rC(); + let e = aC(); if (!e) return !1; - let t = !!En(e, Fp, QS); - return YS(), t; + let t = !!En(e, Lp, eC); + return ZS(), t; } catch { return !1; } } -function aC() { +function sC() { try { - XS(); - let e = document.getElementById(ZS); + QS(); + let e = document.getElementById($S); if (!e) return; - In(e, QS), e.remove?.(); + Ln(e, eC), e.remove?.(); } catch {} } -function oC(e, t) { - let n = We(e, t); - if (Rf(), !n) try { +function cC(e, t) { + let n = Ue(e, t); + if (Bf(), !n) try { window.dispatchEvent(new Event(V.OPEN_ASSETS_MANAGER)); } catch (e) { console.debug?.(e); } return n; } -function sC() { +function lC() { try { window.dispatchEvent(new CustomEvent(V.RELOAD_GRID, { detail: { reason: "command" } })); } catch (e) { console.debug?.(e); } } -function cC(e) { - let t = Ze(e, tC); +function uC(e) { + let t = Ye(e, rC); if (!t) try { - Md(); + Pd(); } catch (e) { console.debug?.(e); } return t; } -async function lC() { +async function dC() { try { - let t = await L(st.BROWSE_FOLDER, {}); + let t = await L(it.BROWSE_FOLDER, {}); if (t?.ok) return String(t?.data?.path || "").trim(); let n = String(t?.code || "").trim(); n && n !== "CANCELLED" && e(t?.error || R("toast.nativeFolderBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), "warning", 3500); @@ -23842,14 +23842,14 @@ async function lC() { } return ""; } -async function uC(t, { settingId: n, settingsPathKey: r, save: i, successMessage: a, restartRequired: o = !1 }) { - let s = await lC(); +async function fC(t, { settingId: n, settingsPathKey: r, save: i, successMessage: a, restartRequired: o = !1 }) { + let s = await dC(); if (!s) return !1; let c = await i(s); if (!c?.ok) return e(c?.error || R("toast.settingsPathSaveFailed", "Failed to save path"), "error"), !1; try { - let e = Jt(); - e.paths = e.paths || {}, e.paths[r] = s, Tn(e), Ie(t, n, s), window.dispatchEvent(new CustomEvent(V.SETTINGS_CHANGED, { detail: { + let e = Vn(); + e.paths = e.paths || {}, e.paths[r] = s, Fn(e), Pe(t, n, s), window.dispatchEvent(new CustomEvent(V.SETTINGS_CHANGED, { detail: { key: `paths.${r}`, value: s } })); @@ -23858,10 +23858,10 @@ async function uC(t, { settingId: n, settingsPathKey: r, save: i, successMessage } return e(o ? `${a} ${R("toast.restartComfyUiToApply", "Restart ComfyUI to apply.")}` : a, "success", 2800), !0; } -function dC(e) { - return PC(e).find(NC) || null; +function pC(e) { + return IC(e).find(FC) || null; } -function fC(e) { +function mC(e) { let t = String(e?.id ?? e?.nodeId ?? e?.node_id ?? "").trim(); if (!t) return null; let n = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); @@ -23873,7 +23873,7 @@ function fC(e) { title: String(e?.title || e?.properties?.title || e?.properties?.name || n || "").trim() }; } -async function pC(e) { +async function hC(e) { if (!e) return []; try { let t = (await import("./chunks/NodeStreamController-CIKDDXJT.js")).extractNodeFileData?.(e), n = String(t?.filename || "").trim(); @@ -23887,7 +23887,7 @@ async function pC(e) { return console.debug?.(e), []; } } -function mC(e) { +function gC(e) { try { if (typeof window > "u") return; window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.pendingNodeContext = e, window.dispatchEvent(new CustomEvent(V.OPEN_NODE_CONTEXT, { detail: e })); @@ -23895,18 +23895,18 @@ function mC(e) { console.debug?.(e); } } -async function hC(t, n, r) { - oC(t, n); - let i = fC(r) || {}, a = await pC(r); +async function _C(t, n, r) { + cC(t, n); + let i = mC(r) || {}, a = await hC(r); a.length && (i.files = a); let o = String(r?.comfyClass || r?.type || "").toLowerCase(); - return a.length && /load|upload/.test(o) && (delete i.source_node_id, delete i.sourceNodeId), !i.source_node_id && !a.length ? (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1) : (mC(i), !0); + return a.length && /load|upload/.test(o) && (delete i.source_node_id, delete i.sourceNodeId), !i.source_node_id && !a.length ? (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1) : (gC(i), !0); } -async function gC(e) { +async function vC(e) { try { - let t = await pC(e); + let t = await hC(e); if (t.length) { - let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n); + let { floatingViewerManager: e } = await import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n); if (await e.openAssets({ assets: t, index: 0 @@ -23922,11 +23922,11 @@ async function gC(e) { } return !1; } -function _C(t, n) { - let r = nC; - return r ? (hC(t, n, r), !0) : (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1); +function yC(t, n) { + let r = iC; + return r ? (_C(t, n, r), !0) : (e(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1); } -function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function bC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [ { id: "mjr.openAssetsManager", @@ -23935,7 +23935,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), description: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), icon: "pi pi-folder-open", - function: () => oC(e, t) + function: () => cC(e, t) }, { id: "mjr.scanAssets", @@ -23959,7 +23959,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { id: "mjr.refreshAssetsGrid", label: R("command.refreshAssetsGrid", "Refresh assets grid"), icon: "pi pi-sync", - function: () => sC() + function: () => lC() }, { id: "mjr.openFloatingViewer", @@ -23983,13 +23983,13 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), description: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), icon: "pi pi-list", - function: () => cC(e) + function: () => uC(e) }, { id: "mjr.openSettings", label: R("command.openSettings", "Open Majoor settings"), icon: "pi pi-cog", - function: () => qn(e) + function: () => Yn(e) }, { id: "mjr.pickOutputDirectory", @@ -23998,7 +23998,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), description: R("tooltip.pickOutputDirectory", "Use the native folder browser to set Majoor's generation output directory"), icon: "pi pi-folder", - function: () => uC(e, { + function: () => fC(e, { settingId: "Majoor.Paths.OutputDirectory", settingsPathKey: "outputDirectory", save: se, @@ -24012,7 +24012,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), description: R("tooltip.pickIndexDirectory", "Use the native folder browser to set Majoor's index database directory"), icon: "pi pi-database", - function: () => uC(e, { + function: () => fC(e, { settingId: "Majoor.Paths.IndexDirectory", settingsPathKey: "indexDirectory", save: s, @@ -24027,7 +24027,7 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { title: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), description: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), icon: "pi pi-sitemap", - function: () => _C(e, t) + function: () => yC(e, t) }, { id: "mjr.openNodeInFloatingViewer", @@ -24037,12 +24037,12 @@ function vC(e, { sidebarTabId: t, triggerStartupScan: n }) { description: R("tooltip.openNodeInFloatingViewer", "Open this node's media in the Majoor floating viewer"), icon: "pi pi-window-maximize", function: () => { - gC(nC); + vC(iC); } } ]; } -function yC() { +function xC() { return [{ combo: { alt: !0, @@ -24059,7 +24059,7 @@ function yC() { commandId: "mjr.toggleFloatingViewer" }]; } -function bC() { +function SC() { return [{ path: ["Extensions", "Majoor Assets Manager"], commands: [ @@ -24074,13 +24074,13 @@ function bC() { ] }]; } -function xC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function CC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [null, { content: "Majoor Assets Manager", submenu: { options: [ { content: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), - callback: () => oC(e, t) + callback: () => cC(e, t) }, { content: R("command.openFloatingViewer", "Open floating viewer"), @@ -24094,12 +24094,12 @@ function xC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { content: R("command.openGeneratedFeed", "Open generated feed"), - callback: () => cC(e) + callback: () => uC(e) }, null, { content: R("command.refreshAssetsGrid", "Refresh assets grid"), - callback: () => sC() + callback: () => lC() }, { content: R("command.scanAssets", "Scan assets"), @@ -24107,12 +24107,12 @@ function xC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { content: R("command.openSettings", "Open Majoor settings"), - callback: () => qn(e) + callback: () => Yn(e) } ] } }]; } -function SC() { +function wC() { return [ { label: "Majoor Assets Manager", @@ -24129,14 +24129,20 @@ function SC() { } ]; } -function CC(e, t) { - for (let n of vC(e, t)) Fe(e, n); +function TC(e, t) { + for (let n of bC(e, t)) Be(e, n); } -function wC(e) { - for (let t of yC()) Be(e, t); +function EC(e) { + for (let t of xC()) Ve(e, t); } -function TC(e, { sidebarTabId: t }) { - return If({ sidebarTabId: t }), Ve(e, { +function DC(e, { sidebarTabId: t }) { + Rf({ sidebarTabId: t }); + try { + Vn()?.integration?.hideNativeAssetsTab && bn(!0); + } catch (e) { + console.debug?.(e); + } + return Fe(e, { id: t, icon: "pi pi-folder", title: R("manager.title"), @@ -24144,8 +24150,8 @@ function TC(e, { sidebarTabId: t }) { tooltip: R("tooltip.sidebarTab"), type: "custom", render(e) { - Rf(), ai({ idleOnly: !0 }).catch(() => null), En(e, fS, $S), setTimeout(() => { - let e = Vf(); + Bf(), si({ idleOnly: !0 }).catch(() => null), En(e, mS, tC), setTimeout(() => { + let e = Uf(); if (e) try { window.dispatchEvent(new CustomEvent(V.RELOAD_GRID, { detail: { reason: "pending-generated-assets", @@ -24159,77 +24165,80 @@ function TC(e, { sidebarTabId: t }) { destroy(e) {} }); } -function EC() { +function OC() { try { - In(null, $S); + fn(); } catch {} - DC = !1; try { - document.getElementById(OC)?.remove?.(); + Ln(null, tC); + } catch {} + kC = !1; + try { + document.getElementById(AC)?.remove?.(); } catch {} } -var DC = !1, OC = "mjr-sidebar-prewarm-host"; -function kC() { - if (DC || typeof document > "u" || !document?.body || wn($S)) return !1; - DC = !0; +var kC = !1, AC = "mjr-sidebar-prewarm-host"; +function jC() { + if (kC || typeof document > "u" || !document?.body || wn(tC)) return !1; + kC = !0; try { - let e = document.getElementById(OC); - return e || (e = document.createElement("div"), e.id = OC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), En(e, fS, $S, { attachIfExists: !1 }), !0; + let e = document.getElementById(AC); + return e || (e = document.createElement("div"), e.id = AC, e.style.cssText = "position:fixed;left:-99999px;top:0;width:360px;height:600px;overflow:hidden;visibility:hidden;pointer-events:none;contain:strict;", e.setAttribute("aria-hidden", "true"), document.body.appendChild(e)), En(e, mS, tC, { attachIfExists: !1 }), !0; } catch (e) { - return console.debug?.(e), DC = !1, !1; + return console.debug?.(e), kC = !1, !1; } } -function AC() { +function MC() { return { - id: tC, + id: rC, title: R("bottomFeed.title", "Generated Feed"), icon: "pi pi-images", type: "custom", render(e) { - En(e, pS, eC); + En(e, hS, nC); }, destroy(e) {} }; } -function jC() { - return [AC()]; +function NC() { + return [MC()]; } -function MC() { +function PC() { try { - In(null, eC); + Ln(null, nC); } catch {} } -function NC(e) { +function FC(e) { let t = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); return t ? /save|load|preview/i.test(t) : !1; } -function PC(e) { +function IC(e) { return e ? Array.isArray(e) ? e.filter(Boolean) : e instanceof Set ? Array.from(e).filter(Boolean) : e instanceof Map ? Array.from(e.values()).filter(Boolean) : Array.isArray(e?.items) ? e.items.filter(Boolean) : Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : [e] : []; } -function FC(e) { - return nC = dC(e), nC ? [ +function LC(e) { + return iC = pC(e), iC ? [ "mjr.openNodeContext", "mjr.openAssetsManager", "mjr.openNodeInFloatingViewer" ] : []; } -function IC(e, t) { +function RC(e, t) { return { content: e, callback: t }; } -function LC(t, n, { sidebarTabId: r }) { - return NC(t) ? [ - IC("View in Assets Manager", () => { - hC(n, r, t); +function zC(t, n, { sidebarTabId: r }) { + return FC(t) ? [ + RC("View in Assets Manager", () => { + _C(n, r, t); }), - IC("Open in Floating Viewer", () => { - gC(t); + RC("Open in Floating Viewer", () => { + vC(t); }), - IC("Index Output", () => { + RC("Index Output", () => { try { - sC(), e(R("toast.rescanningFile", "Rescanning file..."), "info", 1800); + lC(), e(R("toast.rescanningFile", "Rescanning file..."), "info", 1800); } catch (e) { console.debug?.(e); } @@ -24237,15 +24246,15 @@ function LC(t, n, { sidebarTabId: r }) { ] : []; } // ui/features/runtime/entryRuntimeLifecycle.ts -var RC = "__MJR_ENTRY_RUNTIME__"; -function zC(e, t) { +var BC = "__MJR_ENTRY_RUNTIME__"; +function VC(e, t) { if (e) try { e._mjrAssetUpdateReloadTimer &&= (clearTimeout(e._mjrAssetUpdateReloadTimer), null), e._mjrExecutedHandler && e.removeEventListener("executed", e._mjrExecutedHandler), e._mjrAssetAddedHandler && e.removeEventListener("mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler && e.removeEventListener("mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler && e.removeEventListener(V.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(V.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrScanProgressHandler && e.removeEventListener(V.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(V.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(V.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrExecutionStartHandler && e.removeEventListener("execution_start", e._mjrExecutionStartHandler), e._mjrExecutionEndHandler && (e.removeEventListener("execution_success", e._mjrExecutionEndHandler), e.removeEventListener("execution_error", e._mjrExecutionEndHandler), e.removeEventListener("execution_interrupted", e._mjrExecutionEndHandler)), e._mjrStacksUpdatedHandler && e.removeEventListener("mjr.stacks.updated", e._mjrStacksUpdatedHandler), e._mjrEnrichmentStatusHandler && e.removeEventListener(V.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(V.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(V.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); } catch (e) { t?.(e, "entry.removeApiHandlers"); } } -function BC(e, t) { +function HC(e, t) { try { let t = e?.assetsDeletedHandler; t && typeof window < "u" && window.removeEventListener(V.ASSETS_DELETED, t); @@ -24253,7 +24262,7 @@ function BC(e, t) { t?.(e, "entry.removeRuntimeWindowHandlers"); } } -function VC(e, { reportError: t } = {}) { +function UC(e, { reportError: t } = {}) { if (e && typeof e == "object") { try { let t = Array.isArray(e._listenerCleanupFns) ? e._listenerCleanupFns : []; @@ -24278,13 +24287,13 @@ function VC(e, { reportError: t } = {}) { console.warn("[MJR teardown]", e); } try { - zC(e.api || null, t), BC(e, t); + VC(e.api || null, t), HC(e, t); } catch (e) { console.warn("[MJR teardown]", e); } } } -function HC(e, t, n, r, i = void 0) { +function WC(e, t, n, r, i = void 0) { if (!e || !t?.addEventListener || typeof r != "function") return null; let a = i && typeof i == "object" ? { ...i } : i; if (typeof AbortController < "u") try { @@ -24304,11 +24313,11 @@ function HC(e, t, n, r, i = void 0) { } }), null; } -function UC({ cleanupEntryRuntimeFn: e = VC, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { +function GC({ cleanupEntryRuntimeFn: e = UC, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { try { if (typeof window < "u") { try { - let t = window[RC]; + let t = window[BC]; e(t, { reportError: c }); } catch (e) { console.warn("[MJR teardown]", e); @@ -24348,7 +24357,7 @@ function UC({ cleanupEntryRuntimeFn: e = VC, teardownLiveStreamTracker: t, teard } catch (e) { console.warn("[MJR teardown]", e); } - window[RC] = { + window[BC] = { api: null, assetsDeletedHandler: null, _cleanupControllers: [], @@ -24360,42 +24369,42 @@ function UC({ cleanupEntryRuntimeFn: e = VC, teardownLiveStreamTracker: t, teard } } // ui/entry.ts -var WC = null, GC = null, KC = null; -function qC() { - return KC ||= import("./chunks/floatingViewerManager-DKOeP6-T.js").then((e) => e.n), KC; +var KC = null, qC = null, JC = null; +function YC() { + return JC ||= import("./chunks/floatingViewerManager-Gv7MTmpu.js").then((e) => e.n), JC; } -function JC() { - KC && KC.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); +function XC() { + JC && JC.then((e) => e?.teardownFloatingViewerManager?.()).catch((e) => console.debug?.("[Majoor] MFV teardown skipped", e)); } -var YC = "majoor-assets", XC = "__MJR_EXECUTION_RUNTIME__", ZC = "Majoor.AssetsManager", QC = { +var ZC = "majoor-assets", QC = "__MJR_EXECUTION_RUNTIME__", $C = "Majoor.AssetsManager", ew = { active: null, promptId: "" -}, $C = null, ew = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, tw = /^[0-9a-f]{20,}$/i; -function nw(...e) { +}, tw = null, nw = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, rw = /^[0-9a-f]{20,}$/i; +function iw(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function rw(e) { - let t = String(e || "").trim(); - return ew.test(t) || tw.test(t); -} -function iw(e) { - return nw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); -} function aw(e) { + let t = String(e || "").trim(); + return nw.test(t) || rw.test(t); +} +function ow(e) { + return iw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); +} +function sw(e) { if (!e || typeof e != "object") return []; if (Array.isArray(e.nodes)) return e.nodes.filter(Boolean); if (Array.isArray(e._nodes)) return e._nodes.filter(Boolean); let t = e._nodes_by_id ?? e.nodes_by_id ?? null; return t instanceof Map ? Array.from(t.values()).filter(Boolean) : t && typeof t == "object" ? Object.values(t).filter(Boolean) : []; } -function ow(e) { - return aw(e).length > 0; +function cw(e) { + return sw(e).length > 0; } -function sw(e) { +function lw(e) { return !e || typeof e != "object" ? !1 : [ e.subgraph, e._subgraph, @@ -24406,13 +24415,13 @@ function sw(e) { e.subgraph_instance?.graph, e.inner_graph, e.subgraph_graph - ].some(ow) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : rw(e.type) && !!iw(e); + ].some(cw) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : aw(e.type) && !!ow(e); } -function cw(e, t) { - let n = String(e?.type || t || "").trim(), r = iw(e); - return rw(n) ? r || "Subgraph" : n || r || "Node"; +function uw(e, t) { + let n = String(e?.type || t || "").trim(), r = ow(e); + return aw(n) ? r || "Subgraph" : n || r || "Node"; } -function lw() { +function dw() { try { return typeof window > "u" ? { active_prompt_id: null, @@ -24421,35 +24430,35 @@ function lw() { progress_value: null, progress_max: null, cached_nodes: [] - } : (window[XC] && typeof window[XC] == "object" || (window[XC] = { + } : (window[QC] && typeof window[QC] == "object" || (window[QC] = { active_prompt_id: null, queue_remaining: null, progress_node: null, progress_value: null, progress_max: null, cached_nodes: [] - }), window[XC]); + }), window[QC]); } catch (e) { return console.debug?.(e), {}; } } -function uw(e = {}) { +function fw(e = {}) { try { - let t = lw(); + let t = dw(); Object.assign(t, e || {}), window.dispatchEvent(new CustomEvent(V.RUNTIME_STATUS, { detail: { ...t } })); } catch (e) { console.debug?.(e); } } -async function dw({ active: e, promptId: t = "" } = {}) { +async function pw({ active: e, promptId: t = "" } = {}) { let n = !!e, r = String(t || "").trim(); - if (QC.active !== n || QC.promptId !== r) { - QC = { + if (ew.active !== n || ew.promptId !== r) { + ew = { active: n, promptId: r }; try { - await L(st.RUNTIME_EXECUTION, { + await L(it.RUNTIME_EXECUTION, { active: n, prompt_id: r || void 0, cooldown_ms: Number(B.EXECUTION_IDLE_GRACE_MS) || 6e3 @@ -24459,49 +24468,49 @@ async function dw({ active: e, promptId: t = "" } = {}) { } } } -function fw() { +function mw() { try { - return !!String(lw()?.active_prompt_id || "").trim(); + return !!String(dw()?.active_prompt_id || "").trim(); } catch (e) { return console.debug?.(e), !1; } } -function pw(e = 1200) { +function hw(e = 1200) { try { - $C && clearTimeout($C); + tw && clearTimeout(tw); } catch (e) { console.debug?.(e); } - $C = setTimeout(() => { - if ($C = null, fw()) { - pw(e); + tw = setTimeout(() => { + if (tw = null, mw()) { + hw(e); return; } - let t = Xn(); - t && hi(t); + let t = Qn(); + t && _i(t); }, Math.max(250, Number(e) || 0)); } -function mw(e) { - import("./chunks/LiveStreamTracker-CXkc1cyF.js").then((t) => { - WC = t; +function gw(e) { + import("./chunks/LiveStreamTracker-C8HwFSOT.js").then((t) => { + KC = t; try { t.initLiveStreamTracker(e); } catch (e) { console.warn("[MJR setup] initLiveStreamTracker failed:", e); } }).catch((e) => console.warn("[MJR setup] LiveStreamTracker load failed:", e)), import("./chunks/NodeStreamController-CIKDDXJT.js").then((t) => { - GC = t; + qC = t; try { t.initNodeStream({ app: e, onOutput: (e) => { - qC().then((t) => t?.floatingViewerManager?.feedNodeStream?.(e)).catch((e) => console.debug?.("[NodeStream] MFV output failed", e)); + YC().then((t) => t?.floatingViewerManager?.feedNodeStream?.(e)).catch((e) => console.debug?.("[NodeStream] MFV output failed", e)); }, onStatus: (t, n) => { try { - let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = sw(r), a = iw(r), o = i ? "Subgraph" : cw(r, n); - qC().then((e) => { - e?.floatingViewerManager?.setNodeStreamSelection?.(t, o, i ? a || cw(r, n) : a); + let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = lw(r), a = ow(r), o = i ? "Subgraph" : uw(r, n); + YC().then((e) => { + e?.floatingViewerManager?.setNodeStreamSelection?.(t, o, i ? a || uw(r, n) : a); }).catch((e) => console.debug?.("[NodeStream] MFV status failed", e)); } catch (e) { console.debug?.("[NodeStream] onStatus failed", e); @@ -24513,16 +24522,16 @@ function mw(e) { } }).catch((e) => console.warn("[MJR setup] NodeStream load failed:", e)); } -async function hw(t, n) { - let r = await Ae({ +async function _w(t, n) { + let r = await st({ app: t, timeoutMs: 4e3 - }) || He(t); - if (Ue(r || null), !r) { + }) || Le(t); + if (Ae(r || null), !r) { console.warn("Majoor API not available, real-time updates disabled"); return; } - Un({ + Gn({ api: r, app: t }).catch((e) => console.debug?.("[Majoor] MFV progress tracking init failed", e)); @@ -24532,78 +24541,78 @@ async function hw(t, n) { } catch (e) { console.debug?.(e); } - zC(i?.api || null, P), r !== i?.api && zC(r, P), BC(i, P), await ep({ + VC(i?.api || null, P), r !== i?.api && VC(r, P), HC(i, P), await np({ api: r, runtime: i, executionRuntime: n, - appRef: Nr, - liveStreamModule: WC, - ensureExecutionRuntime: lw, - emitRuntimeStatus: uw, - getActiveGridContainer: Xn, - pushGeneratedAsset: qd, - upsertAsset: Ci, - upsertAssetNow: wi, - removeAssetsFromGrid: Si, + appRef: Fr, + liveStreamModule: KC, + ensureExecutionRuntime: dw, + emitRuntimeStatus: fw, + getActiveGridContainer: Qn, + pushGeneratedAsset: Yd, + upsertAsset: Ti, + upsertAssetNow: Ei, + removeAssetsFromGrid: wi, getEnrichmentState: Ft, setEnrichmentState: xt, comfyToast: e, t: R, reportError: P, - registerCleanableListener: HC, - syncExecutionBackendState: dw + registerCleanableListener: WC, + syncExecutionBackendState: pw }); } -var gw = gf({ +var vw = vf({ post: L, - ENDPOINTS: st, + ENDPOINTS: it, reportError: P, - extractOutputFiles: _f, - ensureExecutionRuntime: lw, - emitRuntimeStatus: uw, - refreshGeneratedFeedHosts: Md, - getActiveGridContainer: Xn -}), _w = { - name: ZC, - settings: yn(Nr), - commands: vC(Nr, { - sidebarTabId: YC, - triggerStartupScan: ri + extractOutputFiles: yf, + ensureExecutionRuntime: dw, + emitRuntimeStatus: fw, + refreshGeneratedFeedHosts: Pd, + getActiveGridContainer: Qn +}), yw = { + name: $C, + settings: yn(Fr), + commands: bC(Fr, { + sidebarTabId: ZC, + triggerStartupScan: ai }), - keybindings: yC(), - menuCommands: bC(), - aboutPageBadges: SC(), - bottomPanelTabs: jC(), + keybindings: xC(), + menuCommands: SC(), + aboutPageBadges: wC(), + bottomPanelTabs: NC(), async setup() { - UC({ - cleanupEntryRuntimeFn: VC, - teardownLiveStreamTracker: (e) => WC?.teardownLiveStreamTracker(e), - teardownNodeStream: (e) => GC?.teardownNodeStream(e), - teardownFloatingViewerManager: JC, - teardownGeneratedFeed: MC, - teardownAssetsSidebar: EC, - teardownGlobalRuntime: aC, - teardownTopBarMfvButton: XS, + GC({ + cleanupEntryRuntimeFn: UC, + teardownLiveStreamTracker: (e) => KC?.teardownLiveStreamTracker(e), + teardownNodeStream: (e) => qC?.teardownNodeStream(e), + teardownFloatingViewerManager: XC, + teardownGeneratedFeed: PC, + teardownAssetsSidebar: OC, + teardownGlobalRuntime: sC, + teardownTopBarMfvButton: QS, reportError: P - }), ip(), Re(Nr); - let e = await Ye({ timeoutMs: 12e3 }) || Nr; - Re(e), Np(e); + }), op(), qe(Fr); + let e = await z({ timeoutMs: 12e3 }) || Fr; + qe(e), Fp(e); try { typeof window < "u" && (window.__MJR_RUNTIME_APP__ = e); } catch (e) { console.debug?.(e); } - si(), li({ enabled: !0 }), iC(), mw(e), vn(e, () => { - let e = Xn(); - e && (B.DEFER_GRID_FETCH_DURING_EXECUTION && fw() ? pw() : hi(e)); - }), CC(e, { - sidebarTabId: YC, - triggerStartupScan: ri - }), wC(e), hw(e, gw).catch((e) => P(e, "entry.api_setup")), TC(e, { sidebarTabId: YC }) ? xe("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); + li(), di({ enabled: !0 }), oC(), gw(e), vn(e, () => { + let e = Qn(); + e && (B.DEFER_GRID_FETCH_DURING_EXECUTION && mw() ? hw() : _i(e)); + }), TC(e, { + sidebarTabId: ZC, + triggerStartupScan: ai + }), EC(e), _w(e, vw).catch((e) => P(e, "entry.api_setup")), DC(e, { sidebarTabId: ZC }) ? xe("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); try { let e = typeof window < "u" ? window.requestIdleCallback : null, t = () => { try { - kC(); + jC(); } catch (e) { console.debug?.(e); } @@ -24612,30 +24621,30 @@ var gw = gf({ } catch (e) { console.debug?.(e); } - tp({ resolveNodeStreamModule: async () => (GC ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), GC) }); + rp({ resolveNodeStreamModule: async () => (qC ||= await import("./chunks/NodeStreamController-CIKDDXJT.js"), qC) }); }, onNodeOutputsUpdated(e) { try { - gw.handleNodeOutputsUpdated(e); + vw.handleNodeOutputsUpdated(e); } catch (e) { console.debug?.("[Majoor] onNodeOutputsUpdated error", e); } }, getNodeMenuItems(e) { - return LC(e, Nr, { sidebarTabId: YC }); + return zC(e, Fr, { sidebarTabId: ZC }); }, getCanvasMenuItems(e) { - return xC(Nr, { - sidebarTabId: YC, - triggerStartupScan: ri + return CC(Fr, { + sidebarTabId: ZC, + triggerStartupScan: ai }); }, getSelectionToolboxCommands(e) { - return FC(e); + return LC(e); } }; try { - Nr.registerExtension(_w); + Fr.registerExtension(yw); } catch (e) { - console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), _w.setup().catch((e) => P(e, "entry.setup_after_duplicate_registration")); + console.warn("[Majoor] registerExtension() threw (extension already registered) - re-running setup() directly", e), yw.setup().catch((e) => P(e, "entry.setup_after_duplicate_registration")); } diff --git a/docs/API_REFERENCE.md b/docs/API_REFERENCE.md index e1468827..b11fa5f1 100644 --- a/docs/API_REFERENCE.md +++ b/docs/API_REFERENCE.md @@ -12,6 +12,7 @@ - **Current API**: `/mjr/am/*` (unversioned, stable) - **Version Alias**: `/mjr/am/v1/*` → redirects to `/mjr/am/*` (308 Permanent Redirect) - **Legacy Alias**: `/majoor/version` → redirects to `/mjr/am/version` +- **OpenAPI compat (read-only)**: `/mjr/am/compat/assets/*` mirrors the shape of ComfyUI core `/api/assets/*` (`GET /mjr/am/compat/assets`, `/{id}`, `/{id}/content`, `/{id}/tags`, `/tags/refine`, `/seed/status`, `HEAD /hash/{hash}`). The former `/api/v2/assets/*` paths are deprecated and only served when `MJR_AM_LEGACY_API_V2_ASSETS=1`. ### Authentication Most endpoints require authentication when ComfyUI auth is enabled: diff --git a/docs/COMFYUI_INTEGRATION_AUDIT.md b/docs/COMFYUI_INTEGRATION_AUDIT.md index ffcff843..bd64f38f 100644 --- a/docs/COMFYUI_INTEGRATION_AUDIT.md +++ b/docs/COMFYUI_INTEGRATION_AUDIT.md @@ -75,27 +75,26 @@ extensions sur l'objet requête partagé. Imports non triés dans 5 fichiers (`ruff --fix`) qui faisaient échouer `npm run quality:py`. -## 3. Risques de conflit restants (non modifiés, à décider) +## 3. Risques de conflit — état -| # | Risque | Gravité | Recommandation | -| --- | --- | --- | --- | -| R1 | La couche de compatibilité `/api/v2/assets/*` occupe un espace de noms qui appartient au core (`/api/...`). Si ComfyUI publie un jour `/api/v2/assets`, les routes du core (enregistrées en premier) masqueront silencieusement celles de Majoor. | Moyenne | Exposer la même surface sous `/mjr/am/compat/assets/*`, garder `/api/v2/assets` comme alias déprécié, puis le retirer. | -| R2 | `api.queuePrompt` est enveloppé (`floatingViewerProgress.ts`) pour suivre les prompts. Fonctionne, mais d'autres extensions font de même et l'ordre d'enveloppement n'est pas garanti. | Faible | Le frontend envoie déjà `execution_start` avec `prompt_id` ; à terme, s'appuyer uniquement sur les événements websocket et l'API Jobs du core (`adapters/comfy_core` détecte déjà `jobs`). | -| R3 | Les middlewares sont insérés en tête de `app.middlewares`. Ils filtrent bien les chemins Majoor, mais l'insertion échoue si l'app est déjà figée (`freeze()`), ce qui est rattrapé et signalé en « degraded » dans `/mjr/am/health`. | Faible | Garder ; surveiller l'étape `security_middlewares` dans le rapport de démarrage. | -| R4 | Doublon fonctionnel avec la barre latérale native « Assets » du frontend (onglet média du core). Les ID (`majoor-assets`) ne se chevauchent pas, mais deux panneaux similaires coexistent. | UX | Proposer un réglage « Remplacer l'onglet Assets natif » plutôt que masquer quoi que ce soit par défaut. | -| R5 | `requires-python = ">=3.10, <3.14"` : bloque les installations ComfyUI en Python 3.14 via le Registry/comfy-cli. | Moyenne | Vérifier les roues `av`, `blake3`, `pywin32` pour 3.14, lancer la CI sur 3.14, puis relever la borne. | -| R6 | `@comfyorg/litegraph@0.17.2` en devDependency : LiteGraph est désormais intégré au frontend et ses types sont exportés par `comfyui-frontend-types`. | Faible | Importer `LGraph`/`LGraphCanvas` depuis `@comfyorg/comfyui-frontend-types` et retirer le paquet séparé. | -| R7 | `import { app } from "../../scripts/app.js"` dans `ui/entry.ts` : shim encore supporté, mais le frontend pousse vers `window.comfyAPI` et a déjà déprécié d'autres modules `scripts/*`. | Faible | `comfyApiBridge` sait déjà attendre l'app ; préférer `window.comfyAPI?.app?.app` avec repli sur l'import. | -| R8 | 913 erreurs de typage dans `tsconfig.test.json` (script « advisory »). | Dette | Les réduire progressivement ; ne bloque pas le runtime. | +| # | Risque | Statut | +| --- | --- | --- | +| R1 | `/api/v2/assets/*` occupait l'espace de noms du core (`/api/...`) et pouvait être masqué sans erreur. | **Corrigé** : surface déplacée vers `/mjr/am/compat/assets/*` ; l'ancien chemin n'est enregistré que si `MJR_AM_LEGACY_API_V2_ASSETS=1` (déprécié, avertissement au démarrage). | +| R2 | `api.queuePrompt` était enveloppé pour suivre les prompts ; l'ordre d'enveloppement avec d'autres extensions n'est pas garanti. | **Corrigé** : plus aucune interception. Sur `execution_start` (websocket), le prompt est lu via l'API Jobs du core (`api.getJobDetail` → `GET /api/jobs/{id}`, champ `workflow.prompt`), puis `/queue` et `/history/{id}` pour les anciens cores. `wrapHostQueuePrompt` a été retiré. | +| R3 | Middlewares insérés en tête de `app.middlewares` (filtrés sur les chemins Majoor ; échec rattrapé si l'app est figée). | Inchangé, sans risque : surveiller l'étape `security_middlewares` dans `/mjr/am/health`. | +| R4 | Doublon fonctionnel avec l'onglet « Assets » natif. | **Corrigé (opt-in)** : réglage `Majoor.Integration.HideNativeAssetsTab` (désactivé par défaut) qui masque l'onglet natif via `getSidebarTabs`/`unregisterSidebarTab` et le restaure à l'identique quand on le désactive. | +| R5 | `requires-python <3.14` bloquait Python 3.14. | **Corrigé** : `>=3.10, <3.15` ; suite complète validée sous 3.14 (1931 tests OK) ; 3.14 ajouté à la matrice CI et à `tox`. | +| R6 | `@comfyorg/litegraph` séparé alors que le frontend exporte ses types. | Ouvert (faible). | +| R7 | `import { app } from "../../scripts/app.js"` (shim encore supporté). | Ouvert (faible). | +| R8 | 913 erreurs de typage dans `tsconfig.test.json`. | **Corrigé** : 0 erreur ; ajouté à la CI (`python-tests.yml`). Un vrai bug de test trouvé au passage (clé `stubs` dupliquée dans `asset_card_inner.vitest.ts`). | ## 4. Feuille de route d'évolution (meilleure intégration) 1. **Progression par nœud** — écouter l'événement websocket `progress_state` (déclaré dans `comfyui-frontend-types`) pour une progression fiable dans les sous-graphes et en exécution parallèle, en complément de `progress`. -2. **API Jobs du core** — utiliser l'historique/les jobs du core (déjà détectés - par `ComfyCoreCapabilities.jobs`) pour rattacher chaque sortie à son prompt, - au lieu de reconstruire cet état côté Majoor. +2. **API Jobs du core** — déjà utilisée pour la progression (R2) ; étendre à + `api.getJobAssets` pour rattacher chaque sortie à son prompt. 3. **API Assets du core** — quand `capabilities.assets` est vrai, synchroniser les tags/notes avec `/api/assets` (lecture seule d'abord), afin que les assets soient visibles dans les deux panneaux sans double indexation. diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 3be5ae8e..41907421 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -12,7 +12,7 @@ This guide provides detailed instructions for installing and configuring the Maj ### System Requirements - ComfyUI installation (≥ 0.13.0 recommended) -- Python 3.10, 3.11, or 3.12 (3.13 compatible) +- Python 3.10 to 3.14 - At least 500MB free disk space for the extension and dependencies - Administrator privileges (for installation and optional tool installations) diff --git a/docs/SECURITY_ENV_VARS.md b/docs/SECURITY_ENV_VARS.md index a6a2622a..00a02c61 100644 --- a/docs/SECURITY_ENV_VARS.md +++ b/docs/SECURITY_ENV_VARS.md @@ -460,6 +460,14 @@ Environment variables provide secure configuration without code changes: - Options: `1`, `true`, `yes`, `on` to disable - Example: `MJR_AM_NO_AUTO_PIP=1` +### API Compatibility +- **MJR_AM_LEGACY_API_V2_ASSETS** + - Purpose: Also serve the deprecated `/api/v2/assets/*` alias of `/mjr/am/compat/assets/*` + - Default: Disabled (the `/api` namespace belongs to ComfyUI core) + - Security Impact: The alias sits behind the same auth/CSRF middlewares as `/mjr/am/*` + - Options: `1`, `true`, `yes`, `on` to enable + - Example: `MJR_AM_LEGACY_API_V2_ASSETS=1` + ## Security Testing ### Self-Assessment Checklist diff --git a/mjr_am_backend/routes/handlers/api_v2_assets.py b/mjr_am_backend/routes/handlers/api_v2_assets.py index ad1f899e..71fae126 100644 --- a/mjr_am_backend/routes/handlers/api_v2_assets.py +++ b/mjr_am_backend/routes/handlers/api_v2_assets.py @@ -1,19 +1,23 @@ """ -``/api/v2/assets/*`` — OpenAPI-aligned read-only compat layer (Phase 3.1). +``/mjr/am/compat/assets/*`` — OpenAPI-aligned read-only compat layer (Phase 3.1). + +Formerly served at ``/api/v2/assets/*``; that path sits in ComfyUI core's +``/api`` namespace and is now only an opt-in alias +(``MJR_AM_LEGACY_API_V2_ASSETS=1``). This module exposes a small, schema-stable REST surface that mirrors the ComfyUI core ``/api/assets/*`` endpoints defined in ``openapi.yaml`` (the -official spec used by Cloud and Desktop clients). We use the ``v2`` prefix -to avoid colliding with the core's own ``/api/assets/*`` routes when the -plugin is loaded alongside an asset-aware ComfyUI build. +official spec used by Cloud and Desktop clients). It lives under the +extension's own ``/mjr/am/`` prefix so it never collides with the core's +``/api/assets/*`` routes (or any future versioned core route). Scope of this first cut (read-only, additive): -* ``HEAD /api/v2/assets/hash/{hash}`` — existence check by content hash -* ``GET /api/v2/assets`` — paginated list with basic filters -* ``GET /api/v2/assets/{id}`` — single asset metadata -* ``GET /api/v2/assets/{id}/content`` — binary file stream -* ``GET /api/v2/assets/{id}/tags`` — tag list for one asset +* ``HEAD /hash/{hash}`` — existence check by content hash +* ``GET `` — paginated list with basic filters +* ``GET /{id}`` — single asset metadata +* ``GET /{id}/content`` — binary file stream +* ``GET /{id}/tags`` — tag list for one asset Mutations (POST/PUT/PATCH/DELETE) are intentionally *not* implemented yet: they would duplicate complex side-effecting flows already exposed under @@ -468,7 +472,7 @@ async def _list_assets(request: web.Request) -> web.Response: order=order, ) except Exception as exc: - logger.warning("api/v2/assets list failed: %s", exc, exc_info=True) + logger.warning("compat assets list failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Asset listing failed")) assets = [_row_to_asset(row) for row in rows] @@ -505,7 +509,7 @@ async def _check_asset_by_hash(request: web.Request) -> web.Response: (hex_part, f"blake3:{hex_part}"), ) except Exception as exc: - logger.warning("api/v2/assets hash check failed: %s", exc, exc_info=True) + logger.warning("compat assets hash check failed: %s", exc, exc_info=True) return web.Response(status=500) found = bool(res.ok and res.data) @@ -524,7 +528,7 @@ async def _get_asset(request: web.Request) -> web.Response: try: row = await _query_one(services["db"], where, params) except Exception as exc: - logger.warning("api/v2/assets get failed: %s", exc, exc_info=True) + logger.warning("compat assets get failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Asset lookup failed")) if row is None: @@ -542,7 +546,7 @@ async def _get_asset_content(request: web.Request) -> web.StreamResponse: try: row = await _query_one(services["db"], where, params) except Exception as exc: - logger.warning("api/v2/assets content lookup failed: %s", exc, exc_info=True) + logger.warning("compat assets content lookup failed: %s", exc, exc_info=True) return web.json_response({"error": "Asset lookup failed"}, status=500) if row is None: return web.json_response({"error": "Asset not found"}, status=404) @@ -573,7 +577,7 @@ async def _get_asset_tags(request: web.Request) -> web.Response: try: row = await _query_one(services["db"], where, params) except Exception as exc: - logger.warning("api/v2/assets tags lookup failed: %s", exc, exc_info=True) + logger.warning("compat assets tags lookup failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Asset lookup failed")) if row is None: @@ -582,7 +586,7 @@ async def _get_asset_tags(request: web.Request) -> web.Response: async def _seed_status(request: web.Request) -> web.Response: - """Compat shim for ``GET /api/v2/assets/seed/status``. + """Compat shim for ``GET /seed/status``. We do not run a background "seeder" the way ComfyUI core does; our ingestion pipeline is the scanner + watcher loop. This endpoint reports @@ -604,7 +608,7 @@ async def _seed_status(request: web.Request) -> web.Response: "GROUP BY enrichment_level" ) except Exception as exc: - logger.warning("api/v2/assets seed/status failed: %s", exc, exc_info=True) + logger.warning("compat assets seed/status failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Seed status lookup failed")) total = 0 @@ -639,9 +643,9 @@ async def _seed_status(request: web.Request) -> web.Response: async def _tags_refine(request: web.Request) -> web.Response: - """``GET /api/v2/assets/tags/refine`` — tag histogram for filtered subset. + """``GET /tags/refine`` — tag histogram for filtered subset. - Accepts the same filters as ``GET /api/v2/assets`` (``name_contains``, + Accepts the same filters as ``GET `` (``name_contains``, ``include_tags``, ``exclude_tags``) and returns the most-frequent tags among matching assets. Results are read from the normalized ``asset_tags`` + ``tags`` tables. @@ -692,7 +696,7 @@ async def _tags_refine(request: web.Request) -> web.Response: try: res = await db.aquery(sql, tuple([*params, limit])) except Exception as exc: - logger.warning("api/v2/assets tags/refine failed: %s", exc, exc_info=True) + logger.warning("compat assets tags/refine failed: %s", exc, exc_info=True) return _api_error_response(Result.Err("DB_ERROR", "Tag refine failed")) tags: list[dict[str, Any]] = [] @@ -711,14 +715,52 @@ async def _tags_refine(request: web.Request) -> web.Response: # --------------------------------------------------------------------------- # -def register_api_v2_asset_routes(routes: web.RouteTableDef) -> None: - """Register the ``/api/v2/assets/*`` compat surface.""" - routes.head("/api/v2/assets/hash/{hash}")(_check_asset_by_hash) +#: Canonical prefix. Lives under the extension's own ``/mjr/am/`` namespace so +#: it can never be shadowed by (or shadow) ComfyUI core routes. +COMPAT_ASSETS_PREFIX = "/mjr/am/compat/assets" + +#: Historical prefix. ``/api/...`` belongs to ComfyUI core: if core ever ships +#: ``/api/v2/assets`` its routes (registered first) would silently win. Kept +#: only as an opt-in alias for external clients that still call it. +LEGACY_COMPAT_ASSETS_PREFIX = "/api/v2/assets" +LEGACY_ALIAS_ENV = "MJR_AM_LEGACY_API_V2_ASSETS" + + +def legacy_alias_enabled() -> bool: + from mjr_am_backend.utils import env_bool + + return env_bool(LEGACY_ALIAS_ENV, False) + + +def _register_compat_asset_routes(routes: web.RouteTableDef, prefix: str) -> None: + routes.head(prefix + "/hash/{hash}")(_check_asset_by_hash) # Static-path routes MUST be declared before the catch-all ``/{id}`` # variants so aiohttp doesn't route ``seed`` / ``tags`` to ``_get_asset``. - routes.get("/api/v2/assets/seed/status")(_seed_status) - routes.get("/api/v2/assets/tags/refine")(_tags_refine) - routes.get("/api/v2/assets")(_list_assets) - routes.get("/api/v2/assets/{id}")(_get_asset) - routes.get("/api/v2/assets/{id}/content")(_get_asset_content) - routes.get("/api/v2/assets/{id}/tags")(_get_asset_tags) + routes.get(prefix + "/seed/status")(_seed_status) + routes.get(prefix + "/tags/refine")(_tags_refine) + routes.get(prefix)(_list_assets) + routes.get(prefix + "/{id}")(_get_asset) + routes.get(prefix + "/{id}/content")(_get_asset_content) + routes.get(prefix + "/{id}/tags")(_get_asset_tags) + + +def register_api_v2_asset_routes( + routes: web.RouteTableDef, *, include_legacy_alias: bool | None = None +) -> None: + """Register the OpenAPI-aligned compat surface. + + Always served under ``/mjr/am/compat/assets/*``. The legacy + ``/api/v2/assets/*`` alias is registered only when + ``MJR_AM_LEGACY_API_V2_ASSETS=1`` (or ``include_legacy_alias=True``). + """ + _register_compat_asset_routes(routes, COMPAT_ASSETS_PREFIX) + if include_legacy_alias is None: + include_legacy_alias = legacy_alias_enabled() + if include_legacy_alias: + logger.warning( + "Majoor: legacy /api/v2/assets alias enabled via %s; it is deprecated " + "and may be shadowed by ComfyUI core. Use %s instead.", + LEGACY_ALIAS_ENV, + COMPAT_ASSETS_PREFIX, + ) + _register_compat_asset_routes(routes, LEGACY_COMPAT_ASSETS_PREFIX) diff --git a/mjr_am_backend/routes/registry_middlewares.py b/mjr_am_backend/routes/registry_middlewares.py index 17a3a023..a44f87cc 100644 --- a/mjr_am_backend/routes/registry_middlewares.py +++ b/mjr_am_backend/routes/registry_middlewares.py @@ -21,9 +21,10 @@ logger = get_logger(__name__) API_PREFIX = "/mjr/am/" -# The OpenAPI-aligned read-only compat surface (routes/handlers/api_v2_assets.py). -# It is part of this extension's HTTP surface and must sit behind the same -# security boundary as API_PREFIX. +# Legacy, opt-in alias of the OpenAPI-aligned compat surface +# (routes/handlers/api_v2_assets.py; canonical path /mjr/am/compat/assets is +# already covered by API_PREFIX). When enabled it is part of this extension's +# HTTP surface and must sit behind the same security boundary as API_PREFIX. COMPAT_API_PREFIX = "/api/v2/assets" # ComfyUI's PromptServer mirrors EVERY registered route under an additional diff --git a/mjr_am_backend/routes/route_catalog.py b/mjr_am_backend/routes/route_catalog.py index 4e75216b..9832c19a 100644 --- a/mjr_am_backend/routes/route_catalog.py +++ b/mjr_am_backend/routes/route_catalog.py @@ -129,11 +129,11 @@ OPTIONAL_ROUTE_REGISTRATIONS: tuple[RouteRegistration, ...] = ( "api v2 assets (compat)", register_api_v2_asset_routes, ( - " HEAD /api/v2/assets/hash/{hash} (Added)", - " GET /api/v2/assets (Added)", - " GET /api/v2/assets/{id} (Added)", - " GET /api/v2/assets/{id}/content (Added)", - " GET /api/v2/assets/{id}/tags (Added)", + " HEAD /mjr/am/compat/assets/hash/{hash} (Added)", + " GET /mjr/am/compat/assets (Added)", + " GET /mjr/am/compat/assets/{id} (Added)", + " GET /mjr/am/compat/assets/{id}/content (Added)", + " GET /mjr/am/compat/assets/{id}/tags (Added)", ), ), ) diff --git a/pyproject.toml b/pyproject.toml index 62460263..dbafa25c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "majoor-assetsmanager" description = "Majoor Assets Manager is an advanced asset browser for ComfyUI that provides a comprehensive solution for managing, organizing, and viewing your generated assets. It integrates directly into ComfyUI, offering features like full-text search, metadata extraction, rating and tagging systems, and advanced viewing capabilities." version = "2.5.3" -requires-python = ">=3.10, <3.14" +requires-python = ">=3.10, <3.15" license = {file = "LICENSE"} authors = [ { name = "MajoorWaldi" }, @@ -96,7 +96,7 @@ includes = ["dist/", "locales/", "example_workflows/"] [tool.black] line-length = 100 -target-version = ["py310", "py311", "py312", "py313"] +target-version = ["py310", "py311", "py312", "py313", "py314"] include = '\.pyi?$' [tool.ruff] diff --git a/tests/features/test_api_v2_assets.py b/tests/features/test_api_v2_assets.py index 6920387f..39505e1c 100644 --- a/tests/features/test_api_v2_assets.py +++ b/tests/features/test_api_v2_assets.py @@ -1,4 +1,4 @@ -"""Tests for the ``/api/v2/assets/*`` OpenAPI compat layer.""" +"""Tests for the ``/mjr/am/compat/assets/*`` OpenAPI compat layer.""" import json @@ -143,7 +143,7 @@ async def test_list_endpoint_returns_paginated_payload(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) app = _build_app() - req = make_mocked_request("GET", "/api/v2/assets?limit=2&offset=0", app=app) + req = make_mocked_request("GET", "/mjr/am/compat/assets?limit=2&offset=0", app=app) match = await app.router.resolve(req) resp = await match.handler(req) payload = json.loads(resp.text) @@ -166,7 +166,7 @@ async def test_get_endpoint_returns_404_when_missing(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) app = _build_app() - req = make_mocked_request("GET", "/api/v2/assets/999", app=app) + req = make_mocked_request("GET", "/mjr/am/compat/assets/999", app=app) req.match_info["id"] = "999" resp = await api_v2_assets._get_asset(req) assert resp.status == 404 @@ -181,7 +181,7 @@ async def test_get_endpoint_returns_asset(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/1") + req = make_mocked_request("GET", "/mjr/am/compat/assets/1") req.match_info["id"] = "1" resp = await api_v2_assets._get_asset(req) assert resp.status == 200 @@ -199,7 +199,7 @@ async def test_hash_check_returns_200_on_match(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("HEAD", f"/api/v2/assets/hash/{'a' * 64}") + req = make_mocked_request("HEAD", f"/mjr/am/compat/assets/hash/{'a' * 64}") req.match_info["hash"] = "a" * 64 resp = await api_v2_assets._check_asset_by_hash(req) assert resp.status == 200 @@ -214,7 +214,7 @@ async def test_hash_check_returns_404_when_missing(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("HEAD", f"/api/v2/assets/hash/blake3:{'b' * 64}") + req = make_mocked_request("HEAD", f"/mjr/am/compat/assets/hash/blake3:{'b' * 64}") req.match_info["hash"] = "blake3:" + "b" * 64 resp = await api_v2_assets._check_asset_by_hash(req) assert resp.status == 404 @@ -226,7 +226,7 @@ async def test_hash_check_rejects_malformed_input(monkeypatch): return {"db": _FakeDB(lambda *_: Result.Ok([]))}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("HEAD", "/api/v2/assets/hash/notahash") + req = make_mocked_request("HEAD", "/mjr/am/compat/assets/hash/notahash") req.match_info["hash"] = "notahash" resp = await api_v2_assets._check_asset_by_hash(req) assert resp.status == 404 @@ -241,7 +241,7 @@ async def test_tags_endpoint_returns_tags(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/1/tags") + req = make_mocked_request("GET", "/mjr/am/compat/assets/1/tags") req.match_info["id"] = "1" resp = await api_v2_assets._get_asset_tags(req) assert resp.status == 200 @@ -260,7 +260,7 @@ async def test_content_endpoint_returns_404_when_path_disallowed(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) monkeypatch.setattr(api_v2_assets, "_is_path_allowed", lambda *a, **kw: False) - req = make_mocked_request("GET", "/api/v2/assets/1/content") + req = make_mocked_request("GET", "/mjr/am/compat/assets/1/content") req.match_info["id"] = "1" resp = await api_v2_assets._get_asset_content(req) assert resp.status == 404 @@ -289,7 +289,7 @@ def test_row_to_asset_omits_workflow_id_when_absent_everywhere(): # --------------------------------------------------------------------------- # -# /api/v2/assets/seed/status +# /mjr/am/compat/assets/seed/status # --------------------------------------------------------------------------- # @@ -310,7 +310,7 @@ async def test_seed_status_reports_totals_and_breakdown(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/seed/status") + req = make_mocked_request("GET", "/mjr/am/compat/assets/seed/status") resp = await api_v2_assets._seed_status(req) body = json.loads(resp.text) if resp.status != 200: @@ -340,7 +340,7 @@ async def test_seed_status_handles_empty_db(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/seed/status") + req = make_mocked_request("GET", "/mjr/am/compat/assets/seed/status") resp = await api_v2_assets._seed_status(req) body = json.loads(resp.text) if resp.status != 200: @@ -352,7 +352,7 @@ async def test_seed_status_handles_empty_db(monkeypatch): # --------------------------------------------------------------------------- # -# /api/v2/assets/tags/refine +# /mjr/am/compat/assets/tags/refine # --------------------------------------------------------------------------- # @@ -375,7 +375,7 @@ async def test_tags_refine_returns_histogram(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) req = make_mocked_request( "GET", - "/api/v2/assets/tags/refine?include_tags=cat&exclude_tags=blurry&limit=10", + "/mjr/am/compat/assets/tags/refine?include_tags=cat&exclude_tags=blurry&limit=10", ) resp = await api_v2_assets._tags_refine(req) body = json.loads(resp.text) @@ -401,7 +401,7 @@ async def test_tags_refine_handles_no_filters(monkeypatch): return {"db": _FakeDB(_handle)}, None monkeypatch.setattr(api_v2_assets, "_require_services", _services) - req = make_mocked_request("GET", "/api/v2/assets/tags/refine") + req = make_mocked_request("GET", "/mjr/am/compat/assets/tags/refine") resp = await api_v2_assets._tags_refine(req) body = json.loads(resp.text) if resp.status != 200: @@ -424,7 +424,7 @@ async def test_seed_status_is_not_eaten_by_id_route(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) app = _build_app() - req = make_mocked_request("GET", "/api/v2/assets/seed/status", app=app) + req = make_mocked_request("GET", "/mjr/am/compat/assets/seed/status", app=app) match = await app.router.resolve(req) if match.handler is not api_v2_assets._seed_status: pytest.fail(f"seed/status routed to {match.handler.__name__}") @@ -437,7 +437,7 @@ async def test_tags_refine_is_not_eaten_by_id_route(monkeypatch): monkeypatch.setattr(api_v2_assets, "_require_services", _services) app = _build_app() - req = make_mocked_request("GET", "/api/v2/assets/tags/refine", app=app) + req = make_mocked_request("GET", "/mjr/am/compat/assets/tags/refine", app=app) match = await app.router.resolve(req) if match.handler is not api_v2_assets._tags_refine: pytest.fail(f"tags/refine routed to {match.handler.__name__}") @@ -451,3 +451,29 @@ def test_api_error_response_maps_stable_codes_to_http_statuses(): assert invalid.status == 400 assert unavailable.status == 503 + + +# --------------------------------------------------------------------------- # +# Namespace: never squat ComfyUI core's /api space by default +# --------------------------------------------------------------------------- # + + +def _registered_paths(**kwargs) -> set[str]: + routes = web.RouteTableDef() + api_v2_assets.register_api_v2_asset_routes(routes, **kwargs) + return {r.path for r in routes} + + +def test_compat_routes_live_under_extension_namespace(monkeypatch): + monkeypatch.delenv(api_v2_assets.LEGACY_ALIAS_ENV, raising=False) + paths = _registered_paths() + assert paths + assert all(p.startswith("/mjr/am/compat/assets") for p in paths) + + +def test_legacy_alias_is_opt_in(monkeypatch): + monkeypatch.setenv(api_v2_assets.LEGACY_ALIAS_ENV, "1") + paths = _registered_paths() + assert "/api/v2/assets" in paths + assert "/mjr/am/compat/assets" in paths + assert "/api/v2/assets" not in _registered_paths(include_legacy_alias=False) diff --git a/tox.ini b/tox.ini index 8f6dd408..751b770f 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = quality, py310, py311, py312, py313 +envlist = quality, py310, py311, py312, py313, py314 skipsdist = True skip_missing_interpreters = True diff --git a/tsconfig.test.json b/tsconfig.test.json index 73ec6027..f843759d 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -3,7 +3,8 @@ "compilerOptions": { "strict": false, "noImplicitAny": false, - "noEmit": true + "noEmit": true, + "allowImportingTsExtensions": true }, "include": [ "ui/tests/**/*.ts", diff --git a/ui/app/hostAdapter.ts b/ui/app/hostAdapter.ts index bd99593d..77c0bcac 100644 --- a/ui/app/hostAdapter.ts +++ b/ui/app/hostAdapter.ts @@ -48,7 +48,6 @@ import { findGraphNodeById, getHostRootGraph, walkGraphNodes } from "./graphTrav // -- internal state ------------------------------------------------------------ let _app: any = null; -const HOST_QUEUE_PROMPT_BINDING_KEY = Symbol.for("mjr.host.queuePromptBinding"); const HOST_CANVAS_SELECTION_EVENT_TYPES = [ "selectionchange", "selection-change", @@ -252,6 +251,32 @@ export function registerSidebarTab(tabDef: any): boolean { } } +/** + * List every sidebar tab currently registered with the host (core + extensions). + * Returns an empty array when the host predates `getSidebarTabs`. + */ +export function listHostSidebarTabs(app: any = null): any[] { + try { + const manager = getExtensionManager(app || _app || getComfyApp()); + const tabs = typeof manager?.getSidebarTabs === "function" ? manager.getSidebarTabs() : []; + return Array.isArray(tabs) ? tabs.filter(Boolean) : []; + } catch { + return []; + } +} + +/** Unregister a sidebar tab by id through the official extension manager API. */ +export function unregisterHostSidebarTab(id: string, app: any = null): boolean { + try { + const manager = getExtensionManager(app || _app || getComfyApp()); + if (!id || typeof manager?.unregisterSidebarTab !== "function") return false; + manager.unregisterSidebarTab(id); + return true; + } catch { + return false; + } +} + export function registerSidebarTabForApp(app: any, tabDef: any): boolean { try { return registerSidebarTabCompat(app || _app || getComfyApp(), tabDef); @@ -543,65 +568,6 @@ export function observeHostCanvasSelection( }; } -export function wrapHostQueuePrompt( - options: { - api?: any; - app?: any; - owner?: any; - createWrapper?: ((originalQueuePrompt: any, api: any) => any) | null; - } = {}, -): { - api: any; - owner: any; - originalQueuePrompt: any; - wrappedQueuePrompt: any; - restore: () => boolean; -} | null { - const api = options.api || getRawHostApi(options.app || _app || getComfyApp()); - const owner = options.owner || null; - const createWrapper = - typeof options.createWrapper === "function" ? options.createWrapper : null; - if (!api || typeof api.queuePrompt !== "function" || !createWrapper) return null; - - const existingBinding = api.queuePrompt?.[HOST_QUEUE_PROMPT_BINDING_KEY] || null; - if (existingBinding?.owner === owner) { - return existingBinding; - } - if (existingBinding?.owner && existingBinding.owner !== owner) { - return null; - } - - const originalQueuePrompt = api.queuePrompt; - const wrappedQueuePrompt = createWrapper(originalQueuePrompt, api); - if (typeof wrappedQueuePrompt !== "function") return null; - - const binding = { - api, - owner, - originalQueuePrompt, - wrappedQueuePrompt, - restore: () => { - try { - const activeBinding = api.queuePrompt?.[HOST_QUEUE_PROMPT_BINDING_KEY] || null; - if (activeBinding?.owner !== owner) return false; - api.queuePrompt = originalQueuePrompt; - return true; - } catch (e) { - console.debug?.(e); - return false; - } - }, - }; - - Object.defineProperty(wrappedQueuePrompt, HOST_QUEUE_PROMPT_BINDING_KEY, { - configurable: true, - value: binding, - }); - - api.queuePrompt = wrappedQueuePrompt; - return binding; -} - export async function interruptHostExecution(app: any = null): Promise { const runtimeApp = app || _app || getComfyApp(); const liveApi = runtimeApp?.api && typeof runtimeApp.api.interrupt === "function" ? runtimeApp.api : null; @@ -1242,7 +1208,6 @@ export const hostAdapter = { fetchHostApi, queueHostPrompt, observeHostCanvasSelection, - wrapHostQueuePrompt, interruptHostExecution, getSelectedHostCanvasNodes, getSelectedHostCanvasNodeIds, @@ -1255,6 +1220,8 @@ export const hostAdapter = { importWorkflowPreferHostTab, isHostWorkflowDirty, serializeCurrentHostWorkflow, + listHostSidebarTabs, + unregisterHostSidebarTab, addNodeToHostGraph, createHostNode, focusHostCanvasNode, diff --git a/ui/app/settings/settingsCore.ts b/ui/app/settings/settingsCore.ts index 5136cd27..b157949e 100644 --- a/ui/app/settings/settingsCore.ts +++ b/ui/app/settings/settingsCore.ts @@ -139,6 +139,11 @@ export const DEFAULT_SETTINGS = { widthPx: 360, assetBadgeEnabled: APP_DEFAULTS.SIDEBAR_ASSET_BADGE_ENABLED, }, + integration: { + // Opt-in: hide ComfyUI's native Assets sidebar tab so only one assets + // panel is shown. Never enabled by default (no surprise for users). + hideNativeAssetsTab: false, + }, probeBackend: { mode: "auto", }, diff --git a/ui/app/settings/settingsGrid.ts b/ui/app/settings/settingsGrid.ts index e101b9bb..ecd0f769 100644 --- a/ui/app/settings/settingsGrid.ts +++ b/ui/app/settings/settingsGrid.ts @@ -11,6 +11,7 @@ import { detectGridSizePreset, } from "./settingsUtils.js"; import { saveMajoorSettings, applySettingsToConfig } from "./settingsCore.js"; +import { setNativeAssetsTabHidden } from "../../features/runtime/nativeAssetsTab.js"; const SETTINGS_PREFIX = "Majoor"; const SETTINGS_CATEGORY = "Majoor Assets Manager"; @@ -531,6 +532,23 @@ export function registerGridSettings(safeAddSetting: (def: any) => void, setting }, }); + safeAddSetting({ + id: `${SETTINGS_PREFIX}.Integration.HideNativeAssetsTab`, + category: cat(t("cat.grid"), "Hide ComfyUI native Assets tab"), + name: "Hide ComfyUI's native Assets sidebar tab", + tooltip: + "Optional. Removes ComfyUI's built-in Assets tab from the sidebar so only Majoor Assets Manager is shown. Turning it off restores the native tab. Your files and the native tab's data are not affected.", + type: "boolean", + defaultValue: !!settings.integration?.hideNativeAssetsTab, + onChange: (value: any) => { + settings.integration = settings.integration || {}; + settings.integration.hideNativeAssetsTab = !!value; + saveMajoorSettings(settings); + setNativeAssetsTabHidden(!!value); + notifyApplied("integration.hideNativeAssetsTab"); + }, + }); + safeAddSetting({ id: `${SETTINGS_PREFIX}.Sidebar.WidthPx`, category: cat(t("cat.grid"), "Sidebar width"), diff --git a/ui/features/panel/messages/toastHistory.ts b/ui/features/panel/messages/toastHistory.ts index 1c6e729f..42ce8df4 100644 --- a/ui/features/panel/messages/toastHistory.ts +++ b/ui/features/panel/messages/toastHistory.ts @@ -165,7 +165,7 @@ function _writeLastRead(ts: any) { * @param {string} type - "info" | "success" | "warning" | "error" * @param {number} [duration] - Display duration in ms; used to filter ephemeral info toasts. */ -export function addToastHistory(message: any, type: string, duration?: number): void { +export function addToastHistory(message: any, type?: string, duration?: number): void { _load(); const entry = message && typeof message === "object" diff --git a/ui/features/runtime/entryUiRegistration.ts b/ui/features/runtime/entryUiRegistration.ts index 14c5c5e3..90956e72 100644 --- a/ui/features/runtime/entryUiRegistration.ts +++ b/ui/features/runtime/entryUiRegistration.ts @@ -40,6 +40,7 @@ import { mountTopBarMfvButton, teardownTopBarMfvButton } from "./topBarMfvButton import { startEarlyFetch, consumeEarlyFetch } from "./earlyFetch.js"; import { configureSidebarAssetBadge, resetSidebarAssetBadge } from "./sidebarAssetBadge.js"; import { consumePendingGeneratedAssets } from "./pendingGeneratedAssets.js"; +import { setNativeAssetsTabHidden, teardownNativeAssetsTab } from "./nativeAssetsTab.js"; import { refreshGeneratedFeedHosts } from "../bottomPanel/feed/feedHost.js"; // -- keep-alive mount keys ----------------------------------------------------- @@ -617,6 +618,12 @@ export function registerNativeKeybindings(runtimeApp: any): void { */ export function registerAssetsSidebar(runtimeApp: any, { sidebarTabId }: { sidebarTabId: string }): any { configureSidebarAssetBadge({ sidebarTabId }); + try { + // Opt-in only (default false): see Majoor.Integration.HideNativeAssetsTab. + if (loadMajoorSettings()?.integration?.hideNativeAssetsTab) setNativeAssetsTabHidden(true); + } catch (e) { + console.debug?.(e); + } return registerSidebarTabForApp(runtimeApp, { id: sidebarTabId, icon: "pi pi-folder", @@ -666,6 +673,11 @@ export function registerAssetsSidebar(runtimeApp: any, { sidebarTabId }: { sideb * controller on extension cleanup / ComfyUI reload). */ export function teardownAssetsSidebar(): void { + try { + teardownNativeAssetsTab(); + } catch { + /* ignore */ + } try { unmountKeepAlive(null, SIDEBAR_MOUNT_KEY); } catch { diff --git a/ui/features/runtime/nativeAssetsTab.ts b/ui/features/runtime/nativeAssetsTab.ts new file mode 100644 index 00000000..0f3e6136 --- /dev/null +++ b/ui/features/runtime/nativeAssetsTab.ts @@ -0,0 +1,91 @@ +/** + * Optional coexistence with ComfyUI's native "Assets" sidebar tab. + * + * Recent ComfyUI frontends ship their own media/assets sidebar tab. Majoor + * never touches it by default; users who prefer a single assets panel can opt + * in to hide the native one. Hiding goes through the official extension + * manager API (`getSidebarTabs` / `unregisterSidebarTab`) and the removed tab + * definition is kept so it can be re-registered verbatim when the option is + * turned off again. + */ + +import { + listHostSidebarTabs, + registerSidebarTab, + unregisterHostSidebarTab, +} from "../../app/hostAdapter.js"; + +/** Known ids of the core frontend's assets/media sidebar tab across releases. */ +const NATIVE_ASSETS_TAB_IDS = new Set(["assets", "media-assets", "assets-sidebar"]); + +/** + * Core sidebar tabs are registered when the graph view mounts, which can be + * after extensions finish `setup()`. Re-apply a few times so an early opt-in + * still takes effect. + */ +const RETRY_DELAYS_MS = [500, 2000, 6000]; + +let _hideRequested = false; +const _hiddenTabs = new Map(); +let _retryTimers: ReturnType[] = []; + +export function isNativeAssetsTab(tab: any): boolean { + const id = String(tab?.id || "") + .trim() + .toLowerCase(); + if (!id || id.startsWith("majoor") || id.startsWith("mjr")) return false; + return NATIVE_ASSETS_TAB_IDS.has(id); +} + +function _clearRetries(): void { + for (const timer of _retryTimers.splice(0)) clearTimeout(timer); +} + +function _hideNow(): number { + let hidden = 0; + for (const tab of listHostSidebarTabs()) { + if (!isNativeAssetsTab(tab)) continue; + const id = String(tab.id); + if (unregisterHostSidebarTab(id)) { + _hiddenTabs.set(id, tab); + hidden += 1; + } + } + return hidden; +} + +function _restoreNow(): void { + for (const [id, tab] of [..._hiddenTabs.entries()]) { + const alreadyBack = listHostSidebarTabs().some((t: any) => String(t?.id || "") === id); + if (alreadyBack || registerSidebarTab(tab)) _hiddenTabs.delete(id); + } +} + +/** Apply the user's preference. Safe to call repeatedly. */ +export function setNativeAssetsTabHidden(hidden: boolean): void { + _hideRequested = !!hidden; + _clearRetries(); + if (!_hideRequested) { + _restoreNow(); + return; + } + _hideNow(); + for (const delay of RETRY_DELAYS_MS) { + _retryTimers.push( + setTimeout(() => { + if (_hideRequested) _hideNow(); + }, delay), + ); + } +} + +/** Extension teardown: give the core tab back and stop pending retries. */ +export function teardownNativeAssetsTab(): void { + _hideRequested = false; + _clearRetries(); + _restoreNow(); +} + +export function getHiddenNativeAssetsTabIds(): string[] { + return [..._hiddenTabs.keys()]; +} diff --git a/ui/features/viewer/floatingViewerProgress.ts b/ui/features/viewer/floatingViewerProgress.ts index 95d3cf2c..aead4f27 100644 --- a/ui/features/viewer/floatingViewerProgress.ts +++ b/ui/features/viewer/floatingViewerProgress.ts @@ -3,7 +3,6 @@ import { getRawHostApi, getRawHostApp, waitForRawHostApi, - wrapHostQueuePrompt, } from "../../app/hostAdapter.js"; import { findGraphNodeById, getHostRootGraph } from "../../app/graphTraversal.js"; @@ -133,7 +132,7 @@ export class FloatingViewerProgressService extends EventTarget { this._api = null; this._listenerEntries = []; this._initPromise = null; - this._queuePromptBinding = null; + this._hydrations = new Map(); } getSnapshot() { @@ -188,48 +187,89 @@ export class FloatingViewerProgressService extends EventTarget { _attachApi(api: any) { if (!api || typeof api.addEventListener !== "function") return; if (this._api === api) return; - this.dispose({ resetPatchedQueuePrompt: false, keepState: true }); + this.dispose({ keepState: true }); this._api = api; - this._patchQueuePrompt(api); this._attachApiListeners(api); } - _patchQueuePrompt(api: any) { - const service = this; - this._queuePromptBinding = wrapHostQueuePrompt({ - api, - owner: this, - createWrapper(originalQueuePrompt: any) { - return async function (this: any, number: any, prompt: any, ...args: any[]) { - let response; - try { - response = await originalQueuePrompt.apply(this, [number, prompt, ...args]); - } catch (error: any) { - const promptExecution = service.getOrMakePrompt("error"); - promptExecution.error({ exception_type: "Unknown." }); - service.currentExecution = promptExecution; - service.dispatchProgressUpdate(); - throw error; - } + /** + * Resolve the API-format prompt (node ids -> class_type/_meta) for a + * prompt that the server just started, using ComfyUI's own read-only + * endpoints instead of intercepting `api.queuePrompt`. Wrapping + * queuePrompt is fragile: other extensions wrap it too and the order is + * not guaranteed. + * + * Order: core Jobs API (`api.getJobDetail` -> `GET /api/jobs/{id}`, whose + * `workflow` carries `{ prompt, extra_data }`), then `/queue` for older + * cores, then `/history/{id}` for prompts that already finished. + */ + async _hydratePrompt(api: any, promptExecution: any) { + const promptId = String(promptExecution?.id || "").trim(); + if (!promptId || promptId === "unknown" || promptExecution.promptApi) return; + if (!api) return; + if (this._hydrations.has(promptId)) return this._hydrations.get(promptId); - const promptId = String(response?.prompt_id || response?.promptId || "").trim(); - if (promptId) { - const promptExecution = service.getOrMakePrompt(promptId); - promptExecution.setPrompt(prompt); - if (!service.currentExecution) { - service.currentExecution = promptExecution; - } - service.dispatchEvent( - makeCustomEvent("queue-prompt", { - prompt: promptExecution, - }), - ); - service.dispatchProgressUpdate(); - } - return response; - }; - }, - }); + const task = (async () => { + const output = + (await this._findPromptInJob(api, promptId)) || + (await this._findPromptInQueue(api, promptId)) || + (await this._findPromptInHistory(api, promptId)); + if (output && !promptExecution.promptApi) { + promptExecution.setPrompt({ output }); + const current = promptExecution.currentlyExecuting; + if (current?.nodeId) { + current.nodeLabel = + promptExecution.getNodeLabel(current.nodeId) || current.nodeLabel; + } + if (this.promptsMap.get(promptId) === promptExecution) { + this.dispatchProgressUpdate(); + } + } + })() + .catch((e: any) => console.debug?.(e)) + .finally(() => this._hydrations.delete(promptId)); + this._hydrations.set(promptId, task); + return task; + } + + async _findPromptInJob(api: any, promptId: string) { + if (typeof api.getJobDetail !== "function") return null; + try { + const job = await api.getJobDetail(promptId); + const prompt = job?.workflow?.prompt; + return prompt && typeof prompt === "object" && !Array.isArray(prompt) ? prompt : null; + } catch (e: any) { + console.debug?.(e); + return null; + } + } + + async _fetchJson(api: any, route: string) { + if (typeof api.fetchApi !== "function") return null; + const resp = await api.fetchApi(route, { cache: "no-store" }); + if (!resp?.ok || typeof resp.json !== "function") return null; + return resp.json(); + } + + async _findPromptInQueue(api: any, promptId: string) { + const data = await this._fetchJson(api, "/queue"); + const items = [ + ...(Array.isArray(data?.queue_running) ? data.queue_running : []), + ...(Array.isArray(data?.queue_pending) ? data.queue_pending : []), + ]; + for (const item of items) { + // Queue entries are [number, prompt_id, prompt, extra_data, outputs_to_execute, ...] + if (Array.isArray(item) && String(item[1] || "") === promptId) { + return item[2] && typeof item[2] === "object" ? item[2] : null; + } + } + return null; + } + + async _findPromptInHistory(api: any, promptId: string) { + const data = await this._fetchJson(api, `/history/${encodeURIComponent(promptId)}`); + const prompt = data?.[promptId]?.prompt; + return Array.isArray(prompt) && prompt[2] && typeof prompt[2] === "object" ? prompt[2] : null; } _attachApiListeners(api: any) { @@ -246,6 +286,7 @@ export class FloatingViewerProgressService extends EventTarget { if (!promptId) return; this.currentExecution = this.getOrMakePrompt(promptId); this.dispatchProgressUpdate(); + void this._hydratePrompt(api, this.currentExecution); }); this._attachListener(api, "executing", (event: any) => { @@ -318,7 +359,7 @@ export class FloatingViewerProgressService extends EventTarget { this.dispatchEvent(makeCustomEvent(PROGRESS_UPDATE_EVENT, this.getSnapshot())); } - dispose({ resetPatchedQueuePrompt = false, keepState = false } = {}) { + dispose({ keepState = false }: { keepState?: boolean } = {}) { for (const { api, type, handler } of this._listenerEntries.splice(0)) { try { api?.removeEventListener?.(type, handler); @@ -327,15 +368,6 @@ export class FloatingViewerProgressService extends EventTarget { } } - if (resetPatchedQueuePrompt && this._queuePromptBinding?.owner === this) { - try { - this._queuePromptBinding.restore?.(); - } catch (e: any) { - console.debug?.(e); - } - } - - this._queuePromptBinding = null; this._api = null; if (!keepState) { this.promptsMap.clear(); diff --git a/ui/tests/api_client_dedupe.vitest.ts b/ui/tests/api_client_dedupe.vitest.ts index 849ff983..637695e8 100644 --- a/ui/tests/api_client_dedupe.vitest.ts +++ b/ui/tests/api_client_dedupe.vitest.ts @@ -24,28 +24,28 @@ function readHeader(headers, name) { describe("api client request deduplication", () => { beforeEach(() => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; const toastAdd = vi.fn(); globalThis.app = { ui: {}, extensionManager: { toast: { add: toastAdd } } }; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, + location: { origin: "http://localhost" } as any, app: globalThis.app, - }; + } as any; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.fetch = vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { id: 7 } }), - })); + })) as any; }); afterEach(() => { @@ -57,7 +57,7 @@ describe("api client request deduplication", () => { const fetchPromise = new Promise((resolve) => { resolveFetch = resolve; }); - globalThis.fetch = vi.fn(() => fetchPromise); + globalThis.fetch = vi.fn(() => fetchPromise) as any; const client = await import("../api/client.js"); const first = client.getAssetMetadata(7); @@ -85,7 +85,7 @@ describe("api client request deduplication", () => { status: 500, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: false, error: "server sad" }), - })); + })) as any; const client = await import("../api/client.js"); const first = await client.vectorFindSimilar(5, 10); @@ -121,7 +121,7 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); @@ -132,7 +132,7 @@ describe("api client request deduplication", () => { await client.updateAssetTags(7, []); await client.getAvailableTags(); - const tagFetches = globalThis.fetch.mock.calls.filter(([url]) => + const tagFetches = (globalThis.fetch as any).mock.calls.filter(([url]) => String(url).includes("/mjr/am/tags"), ); expect(tagFetches).toHaveLength(2); @@ -171,7 +171,7 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); const result = await client.updateAssetTags(7, ["remote"]); @@ -214,7 +214,7 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); const result = await client.updateAssetTags(7, ["remote"]); @@ -235,7 +235,7 @@ describe("api client request deduplication", () => { globalThis.window.dispatchEvent = vi.fn((event) => { const listener = listeners.get(String(event?.type || "")); if (typeof listener === "function") listener(event); - }); + }) as any; const token = "boot-token-1234567890"; globalThis.fetch = vi.fn(async (url, options = {}) => { @@ -270,13 +270,13 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); const result = await client.updateAssetTags(7, ["local"]); expect(result.ok).toBe(true); - const tagCall = globalThis.fetch.mock.calls.find(([url]) => + const tagCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/asset/tags"), ); expect(readHeader(tagCall?.[1]?.headers, "X-MJR-Token")).toBe(token); @@ -326,7 +326,7 @@ describe("api client request deduplication", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const client = await import("../api/client.js"); client.setRuntimeSecurityToken(staleToken); diff --git a/ui/tests/asset_card_inner.vitest.ts b/ui/tests/asset_card_inner.vitest.ts index 20ff0df8..2d7f02cd 100644 --- a/ui/tests/asset_card_inner.vitest.ts +++ b/ui/tests/asset_card_inner.vitest.ts @@ -24,19 +24,13 @@ const buttonStub = { function assetCardGlobal(overrides = {}) { return { provide: {}, - stubs: { - MButton: true, - RatingBadge: true, - TagsBadge: true, - GenTimeBadge: true, - }, ...overrides, stubs: { MButton: true, RatingBadge: true, TagsBadge: true, GenTimeBadge: true, - ...(overrides.stubs || {}), + ...((overrides as any).stubs || {}), }, }; } @@ -155,7 +149,7 @@ describe("AssetCardInner media display", () => { await Promise.resolve(); const video = wrapper.find("video.mjr-thumb-media").element; - expect(video.getAttribute("src") || video.src).toContain("/api/assets/clip-no-poster"); + expect(video.getAttribute("src") || (video as any).src).toContain("/api/assets/clip-no-poster"); }); it("releases and replaces the video source when a virtualized card changes asset", async () => { @@ -190,7 +184,7 @@ describe("AssetCardInner media display", () => { const video = wrapper.find("video.mjr-thumb-media").element; expect(MediaBlobCache.releaseUrl).toHaveBeenCalledWith("/api/assets/old"); - expect(video.getAttribute("src") || video.src).toContain("blob:new-video"); + expect(video.getAttribute("src") || (video as any).src).toContain("blob:new-video"); wrapper.unmount(); }); @@ -295,7 +289,7 @@ describe("AssetCardInner media display", () => { const actions = wrapper .emitted("workflow-action") - ?.map((eventArgs) => String(eventArgs?.[0]?.type || "")); + ?.map((eventArgs) => String((eventArgs?.[0] as any)?.type || "")); expect(actions).toEqual(["favorite"]); expect(buttons[0].classes()).toContain("is-active"); }); diff --git a/ui/tests/assets_grid_host_state.vitest.ts b/ui/tests/assets_grid_host_state.vitest.ts index faef38d3..ba4d6ec1 100644 --- a/ui/tests/assets_grid_host_state.vitest.ts +++ b/ui/tests/assets_grid_host_state.vitest.ts @@ -10,10 +10,10 @@ import { function createFakeElement() { const el = new EventTarget(); - el.dataset = {}; - el.scrollTop = 0; - el.scrollLeft = 0; - el.querySelector = vi.fn(() => null); + (el as any).dataset = {}; + (el as any).scrollTop = 0; + (el as any).scrollLeft = 0; + (el as any).querySelector = vi.fn(() => null); return el; } @@ -23,14 +23,14 @@ describe("assetsGridHostState", () => { vi.restoreAllMocks(); globalThis.CustomEvent = globalThis.CustomEvent || - class extends Event { + (class extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any); globalThis.requestAnimationFrame = (callback) => { - callback(); + (callback as any)(); return 1; }; globalThis.cancelAnimationFrame = () => {}; @@ -39,7 +39,7 @@ describe("assetsGridHostState", () => { it("syncs scroll, stats, and selection into the panel store", () => { const panelStore = usePanelStore(); const gridWrapper = createFakeElement(); - gridWrapper.scrollTop = 91; + (gridWrapper as any).scrollTop = 91; const disposeScroll = installGridScrollSync(gridWrapper, panelStore); gridWrapper.dispatchEvent(new Event("scroll")); @@ -85,8 +85,8 @@ describe("assetsGridHostState", () => { const gridWrapper = createFakeElement(); const gridContainer = createFakeElement(); - gridContainer._mjrSetSelection = vi.fn(); - gridContainer._mjrScrollToAssetId = vi.fn(); + (gridContainer as any)._mjrSetSelection = vi.fn(); + (gridContainer as any)._mjrScrollToAssetId = vi.fn(); const onRestoreSidebar = vi.fn(); @@ -98,12 +98,15 @@ describe("assetsGridHostState", () => { onRestoreSidebar, }); - expect(gridWrapper.scrollTop).toBe(33); - expect(gridContainer._mjrSetSelection).toHaveBeenCalledWith(["asset-7"], "asset-7"); + expect((gridWrapper as any).scrollTop).toBe(33); + expect((gridContainer as any)._mjrSetSelection).toHaveBeenCalledWith( + ["asset-7"], + "asset-7", + ); // scrollToAssetId is now always called so the selected card is scrolled into // view even when a saved scrollTop was restored (align:"auto" keeps the view // stable when the card is already visible). - expect(gridContainer._mjrScrollToAssetId).toHaveBeenCalledWith("asset-7"); + expect((gridContainer as any)._mjrScrollToAssetId).toHaveBeenCalledWith("asset-7"); expect(onRestoreSidebar).toHaveBeenCalledTimes(1); }); }); diff --git a/ui/tests/audio_visualizer.vitest.ts b/ui/tests/audio_visualizer.vitest.ts index 0804c306..36465698 100644 --- a/ui/tests/audio_visualizer.vitest.ts +++ b/ui/tests/audio_visualizer.vitest.ts @@ -48,7 +48,7 @@ describe("audio visualizer modes", () => { devicePixelRatio: 1, addEventListener: vi.fn(), removeEventListener: vi.fn(), - }; + } as any; APP_CONFIG.VIEWER_DISABLE_WEBGL_AUDIO = false; }); diff --git a/ui/tests/auth_refresh_race.vitest.ts b/ui/tests/auth_refresh_race.vitest.ts index 13d24717..968d2be8 100644 --- a/ui/tests/auth_refresh_race.vitest.ts +++ b/ui/tests/auth_refresh_race.vitest.ts @@ -29,20 +29,20 @@ function makeStorage() { beforeEach(() => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, - }; + location: { origin: "http://localhost" } as any, + } as any; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.app = { extensionManager: { toast: { add: vi.fn() } } }; }); @@ -82,7 +82,7 @@ describe("concurrent auth bootstrap", () => { ? { ok: true, data: { asset_id: 1 } } : { ok: false, code: "AUTH_REQUIRED", error: "no token" }, }; - }); + }) as any; const { default: client } = await import("../api/client.js") .then((m) => ({ default: m })) @@ -107,7 +107,7 @@ describe("concurrent auth bootstrap", () => { // Still only one bootstrap call total expect(bootstrapCalls).toBe(1); - const sentTokens = globalThis.fetch.mock.calls + const sentTokens = (globalThis.fetch as any).mock.calls .filter(([url]) => String(url).includes("/asset/rating")) .map(([_url, options]) => options?.headers?.get?.("X-MJR-Token")); expect(sentTokens).toContain("race_token_abc"); @@ -131,7 +131,7 @@ describe("concurrent auth bootstrap", () => { headers: { get: (n) => (n === "content-type" ? "application/json" : null) }, json: async () => ({ ok: false, code: "AUTH_REQUIRED", error: "no token" }), }; - }); + }) as any; const c = await import("../api/client.js"); @@ -163,7 +163,7 @@ describe("concurrent tag writes", () => { status: 200, headers: { get: (n) => (n === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { tags: [] } }), - })); + })) as any; const c = await import("../api/client.js"); c.setRuntimeSecurityToken(token); @@ -175,7 +175,7 @@ describe("concurrent tag writes", () => { ]); // POST requests are not deduplicated — 3 writes = 3 fetch calls - const tagCalls = globalThis.fetch.mock.calls.filter(([url]) => + const tagCalls = (globalThis.fetch as any).mock.calls.filter(([url]) => String(url).includes("/asset/tags"), ); expect(tagCalls).toHaveLength(3); diff --git a/ui/tests/browser_navigation_controller.vitest.ts b/ui/tests/browser_navigation_controller.vitest.ts index efea06bf..0d8500d5 100644 --- a/ui/tests/browser_navigation_controller.vitest.ts +++ b/ui/tests/browser_navigation_controller.vitest.ts @@ -48,10 +48,10 @@ function createNode() { describe("browserNavigationController", () => { it("syncs navigated folder path into Pinia", async () => { - globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn() }; + globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn() } as any; globalThis.document = { - createElement: () => createNode(), - }; + createElement: () => createNode() as any, + } as any; setActivePinia(createPinia()); const panelStore = usePanelStore(); @@ -85,7 +85,7 @@ describe("browserNavigationController", () => { }); expect(panelStore.currentFolderRelativePath).toBe("animals/cats"); - expect(gridContainer.dataset.mjrSubfolder).toBe("animals/cats"); + expect((gridContainer.dataset as any).mjrSubfolder).toBe("animals/cats"); expect(reloadGrid).toHaveBeenCalledTimes(1); expect(onContextChanged).toHaveBeenCalledTimes(1); expect(folderBreadcrumbController.setFolderBreadcrumb).toHaveBeenCalledWith( diff --git a/ui/tests/browser_perf_extended.vitest.ts b/ui/tests/browser_perf_extended.vitest.ts index 2883d06b..9ff96ead 100644 --- a/ui/tests/browser_perf_extended.vitest.ts +++ b/ui/tests/browser_perf_extended.vitest.ts @@ -29,15 +29,15 @@ function elapsed(fn) { /** Build a synthetic asset. */ function makeAsset(overrides = {}) { return { - id: overrides.id ?? Math.random().toString(36).slice(2), - filename: overrides.filename ?? "image.png", - kind: overrides.kind ?? "image", - mtime: overrides.mtime ?? Date.now(), - size: overrides.size ?? 1024, - has_generation_data: overrides.has_generation_data ?? 0, - subfolder: overrides.subfolder ?? "", - source: overrides.source ?? "output", - root_id: overrides.root_id ?? "root1", + id: (overrides as any).id ?? Math.random().toString(36).slice(2), + filename: (overrides as any).filename ?? "image.png", + kind: (overrides as any).kind ?? "image", + mtime: (overrides as any).mtime ?? Date.now(), + size: (overrides as any).size ?? 1024, + has_generation_data: (overrides as any).has_generation_data ?? 0, + subfolder: (overrides as any).subfolder ?? "", + source: (overrides as any).source ?? "output", + root_id: (overrides as any).root_id ?? "root1", ...overrides, }; } @@ -320,7 +320,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { preloadImageForAsset(asset, "/view/dup-1.png"); // Only one key should be stored - expect(state._preloadedAssetKeys?.size).toBe(1); + expect((state as any)._preloadedAssetKeys?.size).toBe(1); }); it("clears cache after 250-item limit", async () => { @@ -332,7 +332,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { preloadImageForAsset(asset, `/view/asset-${i}.png`); } // After clear the set is small (only items added since last clear) - expect(state._preloadedAssetKeys?.size).toBeLessThan(20); + expect((state as any)._preloadedAssetKeys?.size).toBeLessThan(20); }); it("ignores non-image assets", async () => { @@ -340,7 +340,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { const { preloadImageForAsset } = await makePreloader(state); const video = makeAsset({ id: "v1", kind: "video", filename: "clip.mp4" }); preloadImageForAsset(video, "/view/v1.mp4"); - expect(state._preloadedAssetKeys?.size ?? 0).toBe(0); + expect((state as any)._preloadedAssetKeys?.size ?? 0).toBe(0); }); it("preloadAdjacentAssets skips out-of-bounds indices", async () => { @@ -349,7 +349,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { const assets = [makeAsset({ id: "only", kind: "image" })]; preloadAdjacentAssets(assets, 0); // ±3 would go -3…+3 → all OOB except 0 // The center itself is NOT preloaded (only adjacents) - expect(state._preloadedAssetKeys?.size ?? 0).toBe(0); + expect((state as any)._preloadedAssetKeys?.size ?? 0).toBe(0); }); it("preloadAdjacentAssets preloads ±3 neighbours from a large list", async () => { @@ -360,7 +360,7 @@ describe("imagePreloader – deduplication and cache eviction", () => { ); preloadAdjacentAssets(assets, 10); // Expected: indices 7,8,9,11,12,13 → 6 assets - expect(state._preloadedAssetKeys?.size).toBe(6); + expect((state as any)._preloadedAssetKeys?.size).toBe(6); }); it("preloads 300 unique assets under 100 ms", async () => { @@ -398,7 +398,7 @@ describe("viewer/keyboard – rapid keydown dispatch", () => { makeAsset({ id: "k2", kind: "image" }), ], currentIndex: 0, - ...overrides.state, + ...(overrides as any).state, }; const VIEWER_MODES = { SINGLE: "SINGLE" }; const navigateCalls = []; diff --git a/ui/tests/client_auth_token.vitest.ts b/ui/tests/client_auth_token.vitest.ts index d9b91209..777b4512 100644 --- a/ui/tests/client_auth_token.vitest.ts +++ b/ui/tests/client_auth_token.vitest.ts @@ -33,25 +33,25 @@ async function loadAuth() { beforeEach(() => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, - }; + location: { origin: "http://localhost" } as any, + } as any; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.fetch = vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: {} }), - })); + })) as any; globalThis.app = { extensionManager: { toast: { add: vi.fn() } } }; }); @@ -145,7 +145,7 @@ describe("ensureWriteAuthToken with force=true clears stale runtime token", () = headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: null }), }; - }); + }) as any; const { ensureWriteAuthToken, setRuntimeSecurityToken, readAuthToken } = await loadAuth(); setRuntimeSecurityToken("stale_token"); diff --git a/ui/tests/comfy_api_bridge.vitest.ts b/ui/tests/comfy_api_bridge.vitest.ts index 8aa86a97..86aff600 100644 --- a/ui/tests/comfy_api_bridge.vitest.ts +++ b/ui/tests/comfy_api_bridge.vitest.ts @@ -2,8 +2,8 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; beforeEach(() => { vi.resetModules(); - globalThis.window = {}; - globalThis.globalThis = globalThis; + globalThis.window = {} as any; + (globalThis as any).globalThis = globalThis; }); describe("comfyApiBridge", () => { @@ -231,7 +231,7 @@ describe("comfyApiBridge", () => { it("prefers ComfyUI api.fetchApi for HTTP calls and falls back to same-origin fetch", async () => { const fetchApi = vi.fn(() => Promise.resolve({ ok: true, source: "comfy" })); const fallbackFetch = vi.fn(() => Promise.resolve({ ok: true, source: "fallback" })); - globalThis.fetch = fallbackFetch; + globalThis.fetch = fallbackFetch as any; const mod = await import("../app/comfyApiBridge.js"); mod.setComfyApi({ fetchApi }); diff --git a/ui/tests/custom_roots_controller.vitest.ts b/ui/tests/custom_roots_controller.vitest.ts index e975352b..fbea64c3 100644 --- a/ui/tests/custom_roots_controller.vitest.ts +++ b/ui/tests/custom_roots_controller.vitest.ts @@ -6,59 +6,59 @@ import { usePanelStore } from "../stores/usePanelStore.js"; class SelectStub { constructor() { - this._innerHTML = ""; - this.value = ""; - this.disabled = false; - this.listeners = new Map(); - this.options = []; - this.selectedIndex = -1; + (this as any)._innerHTML = ""; + (this as any).value = ""; + (this as any).disabled = false; + (this as any).listeners = new Map(); + (this as any).options = []; + (this as any).selectedIndex = -1; } set innerHTML(value) { - this._innerHTML = value; - this.options = []; - this.selectedIndex = -1; + (this as any)._innerHTML = value; + (this as any).options = []; + (this as any).selectedIndex = -1; } get innerHTML() { - return this._innerHTML; + return (this as any)._innerHTML; } appendChild(option) { - this.options.push(option); - if (this.selectedIndex < 0) this.selectedIndex = 0; + (this as any).options.push(option); + if ((this as any).selectedIndex < 0) (this as any).selectedIndex = 0; return option; } querySelector(selector) { if (selector === 'option[value=""]') { - return this.options.find((option) => option.value === "") || null; + return (this as any).options.find((option) => option.value === "") || null; } return null; } addEventListener(type, handler) { - const list = this.listeners.get(type) || []; + const list = (this as any).listeners.get(type) || []; list.push(handler); - this.listeners.set(type, list); + (this as any).listeners.set(type, list); } removeEventListener(type, handler) { - const list = this.listeners.get(type) || []; - this.listeners.set( + const list = (this as any).listeners.get(type) || []; + (this as any).listeners.set( type, list.filter((item) => item !== handler), ); } dispatchEvent(event) { - for (const handler of this.listeners.get(event.type) || []) { + for (const handler of (this as any).listeners.get(event.type) || []) { handler(event); } } get selectedOptions() { - const selected = this.options[this.selectedIndex]; + const selected = (this as any).options[(this as any).selectedIndex]; return selected ? [selected] : []; } } @@ -66,18 +66,19 @@ class SelectStub { describe("customRootsController", () => { it("syncs the selected custom root into Pinia", async () => { globalThis.document = { - createElement: () => ({ - value: "", - textContent: "", - get text() { - return this.textContent; - }, - set text(value) { - this.textContent = value; - }, - disabled: false, - }), - }; + createElement: () => + ({ + value: "", + textContent: "", + get text() { + return this.textContent; + }, + set text(value) { + this.textContent = value; + }, + disabled: false, + }) as any, + } as any; setActivePinia(createPinia()); const panelStore = usePanelStore(); @@ -131,8 +132,8 @@ describe("customRootsController", () => { customRemoveBtn, }); - customSelect.value = "root-b"; - customSelect.selectedIndex = 2; + (customSelect as any).value = "root-b"; + (customSelect as any).selectedIndex = 2; await customSelect.dispatchEvent({ type: "change" }); expect(panelStore.customRootId).toBe("root-b"); diff --git a/ui/tests/dialog_templates.vitest.ts b/ui/tests/dialog_templates.vitest.ts index a328d3c8..64b525f2 100644 --- a/ui/tests/dialog_templates.vitest.ts +++ b/ui/tests/dialog_templates.vitest.ts @@ -21,10 +21,14 @@ beforeEach(() => { confirm: vi.fn(() => true), prompt: vi.fn(() => "fallback"), alert: vi.fn(), - }; + } as any; globalThis.document = { - createElement: vi.fn(() => ({ style: {}, appendChild: vi.fn(), setAttribute: vi.fn() })), - }; + createElement: vi.fn(() => ({ + style: {}, + appendChild: vi.fn(), + setAttribute: vi.fn(), + })) as any, + } as any; }); describe("DialogTemplates", () => { diff --git a/ui/tests/dialogs.vitest.ts b/ui/tests/dialogs.vitest.ts index 21d0f632..59e83656 100644 --- a/ui/tests/dialogs.vitest.ts +++ b/ui/tests/dialogs.vitest.ts @@ -24,10 +24,14 @@ beforeEach(() => { confirm: vi.fn(() => true), prompt: vi.fn(() => "fallback"), alert: vi.fn(), - }; + } as any; globalThis.document = { - createElement: vi.fn(() => ({ style: {}, appendChild: vi.fn(), setAttribute: vi.fn() })), - }; + createElement: vi.fn(() => ({ + style: {}, + appendChild: vi.fn(), + setAttribute: vi.fn(), + })) as any, + } as any; }); describe("dialogs", () => { diff --git a/ui/tests/dnd_model3d.vitest.ts b/ui/tests/dnd_model3d.vitest.ts index aed580d7..a2113d09 100644 --- a/ui/tests/dnd_model3d.vitest.ts +++ b/ui/tests/dnd_model3d.vitest.ts @@ -69,7 +69,7 @@ describe("3D drag and drop support", () => { const picked = pickBestMediaPathWidget(node, { kind: "model3d" }, "glb"); expect(picked).toBe(modelPath); - expect(modelPath.__mjrModel3DPickScore).toBeGreaterThan(0); + expect((modelPath as any).__mjrModel3DPickScore).toBeGreaterThan(0); }); it("prefers image-oriented widgets when dropping an image asset on a LoadImage node", () => { @@ -88,7 +88,7 @@ describe("3D drag and drop support", () => { const picked = pickBestMediaPathWidget(node, { kind: "image" }, "png"); expect(picked).toBe(imagePath); - expect(imagePath.__mjrImagePickScore).toBeGreaterThan(0); + expect((imagePath as any).__mjrImagePickScore).toBeGreaterThan(0); }); it("rejects button and hidden callback widgets when picking a path target", () => { @@ -117,7 +117,7 @@ describe("3D drag and drop support", () => { const picked = pickBestMediaPathWidget(node, { kind: "image" }, "png"); expect(picked).toBe(imagePath); - expect(buttonWidget.__mjrImagePickScore).toBeUndefined(); - expect(hiddenWidget.__mjrImagePickScore).toBeUndefined(); + expect((buttonWidget as any).__mjrImagePickScore).toBeUndefined(); + expect((hiddenWidget as any).__mjrImagePickScore).toBeUndefined(); }); }); diff --git a/ui/tests/drag_drop_canvas.vitest.ts b/ui/tests/drag_drop_canvas.vitest.ts index bd9a677f..2f8264c0 100644 --- a/ui/tests/drag_drop_canvas.vitest.ts +++ b/ui/tests/drag_drop_canvas.vitest.ts @@ -132,7 +132,7 @@ describe("canvas drag/drop loader creation", () => { }; const container = { _mjrGetSelectedAssets: () => [] }; - createAssetDragStartHandler(container)(makeDragStartEvent(card, dataTransfer)); + createAssetDragStartHandler((container as any))((makeDragStartEvent(card, dataTransfer) as any)); expect(JSON.parse(data.get("application/x-mjr-asset"))).toMatchObject({ filename: "clip.mp4", @@ -179,7 +179,7 @@ describe("canvas drag/drop loader creation", () => { }; const container = { _mjrGetSelectedAssets: () => [] }; - createAssetDragStartHandler(container)(makeDragStartEvent(card, dataTransfer)); + createAssetDragStartHandler((container as any))((makeDragStartEvent(card, dataTransfer) as any)); expect(JSON.parse(data.get("application/x-mjr-asset"))).toMatchObject({ filename: "ComfyUI_00690_.png", @@ -223,7 +223,7 @@ describe("canvas drag/drop loader creation", () => { }; const container = { _mjrGetSelectedAssets: () => [] }; - createAssetDragStartHandler(container)(makeDragStartEvent(card, dataTransfer)); + createAssetDragStartHandler((container as any))((makeDragStartEvent(card, dataTransfer) as any)); expect(sanitizeDraggedPayload({ filename: "preview.png", type: "temp" })).toMatchObject({ filename: "preview.png", @@ -269,7 +269,7 @@ describe("canvas drag/drop loader creation", () => { expect(app.loadGraphData).not.toHaveBeenCalled(); expect(globalThis.LiteGraph.createNode).toHaveBeenCalledWith("LoadImage"); expect(app.graph.add).toHaveBeenCalledWith(createdNode); - expect(createdNode.pos).toEqual([120, 80]); + expect((createdNode as any).pos).toEqual([120, 80]); expect(createdNode.widgets[0].value).toBe("assets/one.png"); }); @@ -382,7 +382,7 @@ describe("canvas drag/drop loader creation", () => { addEventListener: vi.fn(), }; - createAssetDragStartHandler({ _mjrGetSelectedAssets: () => [] })(makeDragStartEvent(card, dataTransfer)); + createAssetDragStartHandler({ _mjrGetSelectedAssets: () => [] } as any)((makeDragStartEvent(card, dataTransfer) as any)); const payload = JSON.parse(data.get("application/x-mjr-asset")); const handlers = createDragDropRuntimeHandlers(); await handlers.onDrop(makeDropEvent(payload)); @@ -431,7 +431,7 @@ describe("canvas drag/drop loader creation", () => { }); expect(created).toBe(1); - expect(createdNode.pos).toEqual([100, 100]); + expect((createdNode as any).pos).toEqual([100, 100]); }); it("L+drop creates loader nodes for the current multi-selection", async () => { @@ -446,7 +446,7 @@ describe("canvas drag/drop loader creation", () => { return node; }), }); - window.__MJR_LAST_SELECTION_GRID__ = { + (window as any).__MJR_LAST_SELECTION_GRID__ = { _mjrGetSelectedAssets: () => [ { filename: "one.png", type: "output", kind: "image" }, { filename: "two.png", type: "output", kind: "image" }, diff --git a/ui/tests/drag_out.vitest.ts b/ui/tests/drag_out.vitest.ts index 5df82355..518eb7dd 100644 --- a/ui/tests/drag_out.vitest.ts +++ b/ui/tests/drag_out.vitest.ts @@ -46,9 +46,9 @@ describe("drag-out to OS", () => { { id: "a", filename: "one.png", subfolder: "", type: "output" }, { id: "b", filename: "two.png", subfolder: "set", type: "output" }, ]; - container.dataset.mjrSelectedAssetIds = JSON.stringify(["a", "b"]); + (container.dataset as any).mjrSelectedAssetIds = JSON.stringify(["a", "b"]); container._mjrGetAssets = () => assets; - card.dataset.mjrAssetId = "a"; + (card.dataset as any).mjrAssetId = "a"; const dt = makeDataTransfer(); applyDragOutToOS({ @@ -147,9 +147,9 @@ describe("drag-out to OS", () => { const container = { dataset: {}, _mjrGetAssets: null }; const card = { dataset: {} }; const asset = { id: "a", filename: "one.png", type: "output" }; - container.dataset.mjrSelectedAssetIds = JSON.stringify(["b", "c"]); + (container.dataset as any).mjrSelectedAssetIds = JSON.stringify(["b", "c"]); container._mjrGetAssets = () => [asset]; - card.dataset.mjrAssetId = "a"; + (card.dataset as any).mjrAssetId = "a"; const dt = makeDataTransfer(); applyDragOutToOS({ diff --git a/ui/tests/entry_debug_api.vitest.ts b/ui/tests/entry_debug_api.vitest.ts index 539fc15d..cfa52e82 100644 --- a/ui/tests/entry_debug_api.vitest.ts +++ b/ui/tests/entry_debug_api.vitest.ts @@ -7,7 +7,7 @@ vi.mock("../features/viewer/nodeStream/nodeStreamFeatureFlag.js", () => ({ describe("entryDebugApi", () => { beforeEach(() => { vi.resetModules(); - globalThis.window = {}; + globalThis.window = {} as any; }); afterEach(() => { @@ -23,10 +23,10 @@ describe("entryDebugApi", () => { const { exposeDebugApis } = await import("../features/runtime/entryDebugApi.js"); exposeDebugApis({ resolveNodeStreamModule }); - expect(window.MajoorNodeStream.mode).toBe("selection-only"); - expect(window.MajoorNodeStream.registerAdapter).toBeUndefined(); - expect(window.MajoorNodeStream.createAdapter).toBeUndefined(); - await expect(window.MajoorNodeStream.listAdapters()).resolves.toEqual([ + expect((window as any).MajoorNodeStream.mode).toBe("selection-only"); + expect((window as any).MajoorNodeStream.registerAdapter).toBeUndefined(); + expect((window as any).MajoorNodeStream.createAdapter).toBeUndefined(); + await expect((window as any).MajoorNodeStream.listAdapters()).resolves.toEqual([ { name: "video-output", priority: 10 }, ]); }); diff --git a/ui/tests/execution_runtime_controller.vitest.ts b/ui/tests/execution_runtime_controller.vitest.ts index 72ee811c..662905ae 100644 --- a/ui/tests/execution_runtime_controller.vitest.ts +++ b/ui/tests/execution_runtime_controller.vitest.ts @@ -8,15 +8,15 @@ describe("createExecutionRuntimeController", () => { if (typeof globalThis.CustomEvent === "undefined") { globalThis.CustomEvent = class CustomEvent { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; } if (typeof globalThis.window === "undefined") { globalThis.window = { dispatchEvent: () => true, - }; + } as any; } }); diff --git a/ui/tests/fetch_utils.vitest.ts b/ui/tests/fetch_utils.vitest.ts index ce95775a..41a48182 100644 --- a/ui/tests/fetch_utils.vitest.ts +++ b/ui/tests/fetch_utils.vitest.ts @@ -108,7 +108,7 @@ describe("delay()", () => { describe("fetchAPI timeout", () => { it("returns TIMEOUT when the request exceeds timeoutMs", async () => { - globalThis.fetch = makeAbortableFetch(); + globalThis.fetch = makeAbortableFetch() as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -131,7 +131,7 @@ describe("fetchAPI non-JSON response", () => { globalThis.fetch = vi.fn(async () => ({ status: 500, headers: { get: () => "text/plain" }, - })); + })) as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -147,7 +147,7 @@ describe("fetchAPI non-JSON response", () => { status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => null, - })); + })) as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -164,7 +164,7 @@ describe("fetchAPI non-JSON response", () => { json: async () => { throw new SyntaxError("Unexpected token"); }, - })); + })) as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -185,7 +185,7 @@ describe("fetchAPI non-JSON response", () => { }, }, json: async () => ({ ok: false, code: "INVALID_INPUT", error: "Invalid value" }), - })); + })) as any; const mod = await importUtils(); const { fetchAPI } = makeClient(mod); @@ -215,7 +215,7 @@ describe("fetchAPI retryable HTTP status", () => { ? { ok: false, code: "RATE_LIMIT", error: "Slow down" } : { ok: true, data: { recovered: true } }, }; - }); + }) as any; const mod = await importUtils(); const { get } = makeClient(mod); @@ -229,7 +229,7 @@ describe("fetchAPI retryable HTTP status", () => { globalThis.fetch = makeJsonFetch( { ok: false, code: "SERVICE_UNAVAILABLE", error: "Try later" }, 503, - ); + ) as any; const mod = await importUtils(); const { post } = makeClient(mod); @@ -255,7 +255,7 @@ describe("fetchAPI retry on network error", () => { headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { retried: true } }), }; - }); + }) as any; const mod = await importUtils(); vi.spyOn(mod, "delay").mockResolvedValue(undefined); @@ -329,7 +329,7 @@ describe("get() request deduplication", () => { const blocker = new Promise((resolve) => { resolveFetch = resolve; }); - globalThis.fetch = vi.fn(() => blocker); + globalThis.fetch = vi.fn(() => blocker) as any; const mod = await importUtils(); const { get } = makeClient(mod); @@ -352,7 +352,7 @@ describe("get() request deduplication", () => { }); it("issues a second fetch after the first completes", async () => { - globalThis.fetch = makeJsonFetch({ ok: true, data: [] }); + globalThis.fetch = makeJsonFetch({ ok: true, data: [] }) as any; const mod = await importUtils(); const { get } = makeClient(mod); @@ -368,7 +368,7 @@ describe("get() request deduplication", () => { const blocker = new Promise((resolve) => { resolveFetch = resolve; }); - globalThis.fetch = vi.fn(() => blocker); + globalThis.fetch = vi.fn(() => blocker) as any; const mod = await importUtils(); const { get } = makeClient(mod); @@ -397,14 +397,14 @@ describe("get() request deduplication", () => { describe("post()", () => { it("sends a JSON body and returns the parsed response", async () => { - globalThis.fetch = makeJsonFetch({ ok: true, data: { created: true } }); + globalThis.fetch = makeJsonFetch({ ok: true, data: { created: true } }) as any; const mod = await importUtils(); const { post } = makeClient(mod); const result = await post("/mjr/am/asset/rating", { rating: 4 }); expect(result.ok).toBe(true); - const [, opts] = globalThis.fetch.mock.calls[0]; + const [, opts] = (globalThis.fetch as any).mock.calls[0]; expect(opts.method).toBe("POST"); expect(JSON.parse(opts.body)).toEqual({ rating: 4 }); expect(readHeader(opts.headers, "Content-Type")).toBe("application/json"); diff --git a/ui/tests/filters_controller.vitest.ts b/ui/tests/filters_controller.vitest.ts index 8f2e0774..f456dbb4 100644 --- a/ui/tests/filters_controller.vitest.ts +++ b/ui/tests/filters_controller.vitest.ts @@ -4,25 +4,25 @@ import { usePanelStore } from "../stores/usePanelStore.js"; class ElementStub { constructor() { - this.value = ""; - this.checked = false; - this.listeners = new Map(); - this.classList = { + (this as any).value = ""; + (this as any).checked = false; + (this as any).listeners = new Map(); + (this as any).classList = { toggle: vi.fn(), }; } addEventListener(type, handler) { const key = String(type); - const handlers = this.listeners.get(key) || []; + const handlers = (this as any).listeners.get(key) || []; handlers.push(handler); - this.listeners.set(key, handlers); + (this as any).listeners.set(key, handlers); } removeEventListener(type, handler) { const key = String(type); - const handlers = this.listeners.get(key) || []; - this.listeners.set( + const handlers = (this as any).listeners.get(key) || []; + (this as any).listeners.set( key, handlers.filter((item) => item !== handler), ); @@ -32,7 +32,7 @@ class ElementStub { const payload = event || {}; payload.type = String(payload.type || ""); payload.target = payload.target || this; - for (const handler of this.listeners.get(payload.type) || []) { + for (const handler of (this as any).listeners.get(payload.type) || []) { handler(payload); } } @@ -76,8 +76,8 @@ describe("filtersController", () => { const minHeightInput = createControl(); const maxWidthInput = createControl(); const maxHeightInput = createControl(); - maxWidthInput.value = "1280"; - maxHeightInput.value = "720"; + (maxWidthInput as any).value = "1280"; + (maxHeightInput as any).value = "720"; const reloadGrid = vi.fn(async () => ({})); const onFiltersChanged = vi.fn(); @@ -104,17 +104,17 @@ describe("filtersController", () => { lifecycleSignal: null, }); - resolutionPresetSelect.value = "fhd"; + (resolutionPresetSelect as any).value = "fhd"; resolutionPresetSelect.dispatchEvent({ type: "change" }); expect(panelStore.minWidth).toBe(1920); expect(panelStore.minHeight).toBe(1080); expect(panelStore.maxWidth).toBe(0); expect(panelStore.maxHeight).toBe(0); - expect(minWidthInput.value).toBe("1920"); - expect(minHeightInput.value).toBe("1080"); - expect(maxWidthInput.value).toBe(""); - expect(maxHeightInput.value).toBe(""); + expect((minWidthInput as any).value).toBe("1920"); + expect((minHeightInput as any).value).toBe("1080"); + expect((maxWidthInput as any).value).toBe(""); + expect((maxHeightInput as any).value).toBe(""); expect(onFiltersChanged).toHaveBeenCalledTimes(1); await vi.advanceTimersByTimeAsync(250); diff --git a/ui/tests/floating_viewer.vitest.ts b/ui/tests/floating_viewer.vitest.ts index 7c016d02..3d7515fc 100644 --- a/ui/tests/floating_viewer.vitest.ts +++ b/ui/tests/floating_viewer.vitest.ts @@ -46,31 +46,31 @@ describe("FloatingViewer", () => { installFollowerVideoSyncMock.mockClear(); globalThis.document = { adoptNode: vi.fn((node) => node), - querySelectorAll: vi.fn(() => []), + querySelectorAll: vi.fn(() => []) as any, documentElement: { className: "", - attributes: [], + attributes: [] as any, style: { cssText: "", setProperty: vi.fn(), - }, - }, + } as any, + } as any, body: { appendChild: vi.fn(), className: "", - attributes: [], + attributes: [] as any, style: { cssText: "", setProperty: vi.fn(), - }, - }, + } as any, + } as any, createElement: vi.fn(() => ({ className: "", setAttribute: vi.fn(), appendChild: vi.fn(), replaceChildren: vi.fn(), - })), - }; + })) as any, + } as any; }); it("rebinds panel interactions when popping back into the main document", async () => { @@ -200,42 +200,42 @@ describe("FloatingViewer", () => { expect(closeBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(modeSelect.addEventListener).toHaveBeenCalledWith( "change", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(pinSelect.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(liveBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(previewBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(genBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(popoutBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); expect(captureBtn.addEventListener).toHaveBeenCalledWith( "click", expect.any(Function), - expect.objectContaining({ signal: viewer._btnAC.signal }), + expect.objectContaining({ signal: (viewer._btnAC as any).signal }), ); }); @@ -276,8 +276,8 @@ describe("FloatingViewer", () => { return { overflowY: "auto", overflowX: "hidden" }; } return { overflowY: "visible", overflowX: "visible" }; - }), - }; + }) as any, + } as any; try { FloatingViewer.prototype._initPanZoom.call(viewer, contentEl); @@ -365,17 +365,17 @@ describe("FloatingViewer", () => { constructor(type, init = {}) { super(type, init); Object.defineProperties(this, { - key: { value: init.key || "" }, - code: { value: init.code || "" }, - keyCode: { value: init.keyCode || 0 }, - ctrlKey: { value: Boolean(init.ctrlKey) }, - shiftKey: { value: Boolean(init.shiftKey) }, - altKey: { value: Boolean(init.altKey) }, - metaKey: { value: Boolean(init.metaKey) }, - repeat: { value: Boolean(init.repeat) }, + key: { value: (init as any).key || "" }, + code: { value: (init as any).code || "" }, + keyCode: { value: (init as any).keyCode || 0 }, + ctrlKey: { value: Boolean((init as any).ctrlKey) }, + shiftKey: { value: Boolean((init as any).shiftKey) }, + altKey: { value: Boolean((init as any).altKey) }, + metaKey: { value: Boolean((init as any).metaKey) }, + repeat: { value: Boolean((init as any).repeat) }, }); } - }; + } as any; } if (typeof window.KeyboardEvent !== "function") { window.KeyboardEvent = globalThis.KeyboardEvent; @@ -432,10 +432,10 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); const requestWindow = vi.fn(() => Promise.resolve()); - globalThis.window = { - documentPictureInPicture: { requestWindow }, + (globalThis as any).window = { + documentPictureInPicture: { requestWindow } as any, open: vi.fn(), - navigator: { userAgent: "Mozilla/5.0 Code/1.113.0 Electron/39.8.3" }, + navigator: { userAgent: "Mozilla/5.0 Code/1.113.0 Electron/39.8.3" } as any, screenX: 0, screenLeft: 0, screenY: 0, @@ -461,9 +461,9 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); const requestWindow = vi.fn(() => new Promise(() => {})); - globalThis.window = { - documentPictureInPicture: { requestWindow }, - process: { versions: { electron: "39.8.3" } }, + (globalThis as any).window = { + documentPictureInPicture: { requestWindow } as any, + process: { versions: { electron: "39.8.3" } as any } as any, open: vi.fn(), screenX: 0, screenLeft: 0, @@ -495,9 +495,9 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); const requestWindow = vi.fn(() => new Promise(() => {})); - globalThis.window = { - documentPictureInPicture: { requestWindow }, - navigator: { userAgent: "Mozilla/5.0 Electron/39.8.3 Safari/537.36" }, + (globalThis as any).window = { + documentPictureInPicture: { requestWindow } as any, + navigator: { userAgent: "Mozilla/5.0 Electron/39.8.3 Safari/537.36" } as any, open: vi.fn(), screenX: 0, screenLeft: 0, @@ -529,7 +529,7 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); globalThis.window = { - navigator: { userAgent: "Mozilla/5.0 Electron/39.8.3 Safari/537.36" }, + navigator: { userAgent: "Mozilla/5.0 Electron/39.8.3 Safari/537.36" } as any, open: vi.fn(), screenX: 0, screenLeft: 0, @@ -537,7 +537,7 @@ describe("FloatingViewer", () => { screenTop: 0, outerWidth: 1280, outerHeight: 900, - }; + } as any; const viewer = { _isPopped: false, @@ -558,13 +558,13 @@ describe("FloatingViewer", () => { _tryElectronPopupFallback: FloatingViewer.prototype._tryElectronPopupFallback, }; - viewer.element.classList = { add: vi.fn(), remove: vi.fn(), toggle: vi.fn() }; - viewer.element.setAttribute = vi.fn(); - viewer.element.getAttribute = vi.fn(() => null); - viewer.element.removeAttribute = vi.fn(); - viewer.element.style = {}; - viewer.element.parentNode = null; - viewer.element.nextSibling = null; + (viewer.element as any).classList = { add: vi.fn(), remove: vi.fn(), toggle: vi.fn() }; + (viewer.element as any).setAttribute = vi.fn(); + (viewer.element as any).getAttribute = vi.fn(() => null); + (viewer.element as any).removeAttribute = vi.fn(); + (viewer.element as any).style = {}; + (viewer.element as any).parentNode = null; + (viewer.element as any).nextSibling = null; FloatingViewer.prototype.popOut.call(viewer); @@ -581,9 +581,9 @@ describe("FloatingViewer", () => { const { FloatingViewer } = await import("../features/viewer/FloatingViewer.js"); const requestWindow = vi.fn(() => new Promise(() => {})); - globalThis.window = { - documentPictureInPicture: { requestWindow }, - process: { versions: { electron: "39.8.3" } }, + (globalThis as any).window = { + documentPictureInPicture: { requestWindow } as any, + process: { versions: { electron: "39.8.3" } as any } as any, open: vi.fn(() => null), screenX: 0, screenLeft: 0, @@ -622,26 +622,26 @@ describe("FloatingViewer", () => { globalThis.document = { ...globalThis.document, - querySelectorAll: vi.fn(() => []), + querySelectorAll: vi.fn(() => []) as any, documentElement: { className: "comfy-theme dark-mode", - attributes: [{ name: "data-theme", value: "obsidian" }], + attributes: [{ name: "data-theme", value: "obsidian" }] as any, style: { cssText: "--inline-root: 1;", setProperty: vi.fn(), - }, + } as any, lang: "fr", dir: "ltr", - }, + } as any, body: { appendChild: vi.fn(), className: "app-shell", - attributes: [{ name: "data-layout", value: "desktop" }], + attributes: [{ name: "data-layout", value: "desktop" }] as any, style: { cssText: "", setProperty: vi.fn(), - }, - }, + } as any, + } as any, }; globalThis.window = { @@ -666,8 +666,8 @@ describe("FloatingViewer", () => { }[name] || "" ); }, - })), - }; + })) as any, + } as any; const popupDoc = { head: { @@ -796,9 +796,9 @@ describe("FloatingViewer", () => { class HTMLVideoElementMock extends HTMLMediaElementMock {} class HTMLAudioElementMock extends HTMLMediaElementMock {} - globalThis.HTMLMediaElement = HTMLMediaElementMock; - globalThis.HTMLVideoElement = HTMLVideoElementMock; - globalThis.HTMLAudioElement = HTMLAudioElementMock; + globalThis.HTMLMediaElement = HTMLMediaElementMock as any; + globalThis.HTMLVideoElement = HTMLVideoElementMock as any; + globalThis.HTMLAudioElement = HTMLAudioElementMock as any; const play = vi.fn(() => Promise.resolve()); const addEventListener = vi.fn(); diff --git a/ui/tests/floating_viewer_genfields_api.vitest.ts b/ui/tests/floating_viewer_genfields_api.vitest.ts index be612da5..b14d12bd 100644 --- a/ui/tests/floating_viewer_genfields_api.vitest.ts +++ b/ui/tests/floating_viewer_genfields_api.vitest.ts @@ -30,8 +30,8 @@ vi.mock("../features/viewer/nodeStream/nodeStreamFeatureFlag.js", () => ({ vi.mock("../features/viewer/workflowSidebar/WorkflowSidebar.js", () => ({ WorkflowSidebar: class { constructor() { - this.el = document.createElement("div"); - this.isVisible = false; + (this as any).el = document.createElement("div"); + (this as any).isVisible = false; } }, })); @@ -62,8 +62,8 @@ describe("floating viewer gen fields api summary", () => { }, }); - expect(fields.prompt).toBe("girl on a steampunk ship"); - expect(fields.seed).toBe("123"); - expect(fields.model).toBe("API Image-to-Video | Happy Horse | happyhorse-1.0-i2v"); + expect((fields as any).prompt).toBe("girl on a steampunk ship"); + expect((fields as any).seed).toBe("123"); + expect((fields as any).model).toBe("API Image-to-Video | Happy Horse | happyhorse-1.0-i2v"); }); }); diff --git a/ui/tests/floating_viewer_geninfo_overlap.vitest.ts b/ui/tests/floating_viewer_geninfo_overlap.vitest.ts index 611a1da6..9dbe8767 100644 --- a/ui/tests/floating_viewer_geninfo_overlap.vitest.ts +++ b/ui/tests/floating_viewer_geninfo_overlap.vitest.ts @@ -256,7 +256,7 @@ describe("floating viewer geninfo sidebar", () => { }); expect(getAssetMetadata).toHaveBeenCalledWith(10650, {}); - expect(hydrated.metadata_raw.geninfo.positive.value).toBe("real LTX prompt"); - expect(hydrated.metadata_raw.geninfo.seed.value).toBe(0); + expect((hydrated as any).metadata_raw.geninfo.positive.value).toBe("real LTX prompt"); + expect((hydrated as any).metadata_raw.geninfo.seed.value).toBe(0); }); }); diff --git a/ui/tests/floating_viewer_manager.vitest.ts b/ui/tests/floating_viewer_manager.vitest.ts index 03e77b65..07e04ab7 100644 --- a/ui/tests/floating_viewer_manager.vitest.ts +++ b/ui/tests/floating_viewer_manager.vitest.ts @@ -19,80 +19,81 @@ const state = vi.hoisted(() => { class FloatingViewerMock { constructor() { - this._mode = viewerMode; - this._mediaA = null; - this._mediaB = null; - this._pinnedSlots = + (this as any)._mode = viewerMode; + (this as any)._mediaA = null; + (this as any)._mediaB = null; + (this as any)._pinnedSlots = typeof pinnedSlot === "object" && pinnedSlot instanceof Set ? pinnedSlot : pinnedSlot ? new Set([pinnedSlot]) : new Set(); - this._isPopped = viewerPopped; - this.isVisible = false; - this.show = vi.fn(() => { - this.isVisible = true; + (this as any)._isPopped = viewerPopped; + (this as any).isVisible = false; + (this as any).show = vi.fn(() => { + (this as any).isVisible = true; }); - this.hide = vi.fn(() => { - this.isVisible = false; + (this as any).hide = vi.fn(() => { + (this as any).isVisible = false; }); - this.loadMediaA = vi.fn((asset, opts) => { - this._mediaA = asset; - this._lastLoadMediaA = [asset, opts]; + (this as any).loadMediaA = vi.fn((asset, opts) => { + (this as any)._mediaA = asset; + (this as any)._lastLoadMediaA = [asset, opts]; }); - this.loadMediaPair = vi.fn((assetA, assetB) => { - this._mediaA = assetA; - this._mediaB = assetB; - this._lastLoadMediaPair = [assetA, assetB]; + (this as any).loadMediaPair = vi.fn((assetA, assetB) => { + (this as any)._mediaA = assetA; + (this as any)._mediaB = assetB; + (this as any)._lastLoadMediaPair = [assetA, assetB]; }); - this.setMode = vi.fn((mode) => { - this._mode = mode; + (this as any).setMode = vi.fn((mode) => { + (this as any)._mode = mode; }); - this.setLiveActive = vi.fn(); - this.setPreviewActive = vi.fn(); - this.setNodeStreamActive = vi.fn(); - this.setNodeStreamSelection = vi.fn((selection) => { - this._nodeStreamSelection = selection || null; + (this as any).setLiveActive = vi.fn(); + (this as any).setPreviewActive = vi.fn(); + (this as any).setNodeStreamActive = vi.fn(); + (this as any).setNodeStreamSelection = vi.fn((selection) => { + (this as any)._nodeStreamSelection = selection || null; }); - this.loadPreviewBlob = vi.fn(); - this.dispose = vi.fn(() => { - this.isVisible = false; + (this as any).loadPreviewBlob = vi.fn(); + (this as any).dispose = vi.fn(() => { + (this as any).isVisible = false; }); - this._simplePlayerKeydown = vi.fn((event) => { + (this as any)._simplePlayerKeydown = vi.fn((event) => { event.preventDefault?.(); event.stopPropagation?.(); event.stopImmediatePropagation?.(); }); - this._simplePlayer = { - _mjrSimplePlayerHandleKeydown: this._simplePlayerKeydown, + (this as any)._simplePlayer = { + _mjrSimplePlayerHandleKeydown: (this as any)._simplePlayerKeydown, }; - this.element = { + (this as any).element = { isConnected: true, - contains: (target) => target === this._simplePlayer || target?._insideMfv === true, + contains: (target) => + target === (this as any)._simplePlayer || target?._insideMfv === true, querySelector: (selector) => - selector === ".mjr-mfv-simple-player" ? this._simplePlayer : null, + selector === ".mjr-mfv-simple-player" ? (this as any)._simplePlayer : null, }; lastViewer = this; } render() { - return this.element; + return (this as any).element; } get isPopped() { - return this._isPopped; + return (this as any)._isPopped; } getPinnedSlots() { - return this._pinnedSlots; + return (this as any)._pinnedSlots; } popOut = vi.fn(() => { - this._isPopped = true; + (this as any)._isPopped = true; }); popIn = vi.fn(() => { - this._isPopped = false; + (this as any)._isPopped = false; }); } @@ -167,7 +168,7 @@ function createWindowStub() { dispatchEvent(event) { const handlers = Array.from(listeners.get(event?.type) || []); for (const handler of handlers) { - handler(event); + (handler as any)(event); } return true; }, @@ -198,17 +199,17 @@ async function flushAsyncWork() { beforeEach(() => { vi.resetModules(); state.reset(); - globalThis.window = createWindowStub(); + globalThis.window = createWindowStub() as any; globalThis.requestAnimationFrame = (cb) => { - cb(); + (cb as any)(); return 1; }; globalThis.cancelAnimationFrame = vi.fn(); globalThis.document = { body: { appendChild: vi.fn(), - }, - }; + } as any, + } as any; globalThis.app = { canvas: { canvas: { @@ -221,10 +222,10 @@ beforeEach(() => { }; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); describe("floatingViewerManager", () => { @@ -391,7 +392,7 @@ describe("floatingViewerManager", () => { APP_CONFIG.MFV_LIVE_AUTO_OPEN = true; const seen = []; window.addEventListener("mjr:mfv-visibility-changed", (event) => { - seen.push(Boolean(event?.detail?.visible)); + seen.push(Boolean((event as any)?.detail?.visible)); }); const { floatingViewerManager } = @@ -531,7 +532,7 @@ describe("floatingViewerManager", () => { const seen = []; const blob = { fake: "blob" }; window.addEventListener("mjr:mfv-visibility-changed", (event) => { - seen.push(Boolean(event?.detail?.visible)); + seen.push(Boolean((event as any)?.detail?.visible)); }); const { floatingViewerManager } = @@ -584,7 +585,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(event); + window.dispatchEvent(event as any); expect(viewer.setLiveActive).toHaveBeenLastCalledWith(false); expect(floatingViewerManager.getLiveActive()).toBe(false); @@ -611,7 +612,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(event); + window.dispatchEvent(event as any); expect(viewer.hide).toHaveBeenCalledTimes(1); expect(viewer.isVisible).toBe(false); @@ -660,7 +661,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(event); + window.dispatchEvent(event as any); expect(viewer.setPreviewActive).toHaveBeenLastCalledWith(false); expect(floatingViewerManager.getPreviewActive()).toBe(false); @@ -692,7 +693,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(event); + window.dispatchEvent(event as any); expect(viewer._simplePlayerKeydown).toHaveBeenCalledWith(event); expect(event.preventDefault).toHaveBeenCalledTimes(1); @@ -776,14 +777,14 @@ describe("floatingViewerManager", () => { floatingViewerManager.close(); - const callsBefore = document.body.appendChild.mock.calls.length; + const callsBefore = (document.body.appendChild as any).mock.calls.length; viewer.element = { isConnected: false }; await floatingViewerManager.open(); await flushAsyncWork(); expect(state.getLastViewer()).toBe(viewer); - expect(document.body.appendChild.mock.calls.length).toBeGreaterThan(callsBefore); + expect((document.body.appendChild as any).mock.calls.length).toBeGreaterThan(callsBefore); }); it("cycles compare modes with C as A/B, side-by-side, then compare off without closing", async () => { @@ -815,7 +816,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(toCompareEvent); + window.dispatchEvent(toCompareEvent as any); await flushAsyncWork(); expect(viewer.setMode).toHaveBeenLastCalledWith("ab"); @@ -835,7 +836,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(toSimpleEvent); + window.dispatchEvent(toSimpleEvent as any); await flushAsyncWork(); expect(viewer.setMode).toHaveBeenLastCalledWith("side"); @@ -852,7 +853,7 @@ describe("floatingViewerManager", () => { stopPropagation: vi.fn(), stopImmediatePropagation: vi.fn(), }; - window.dispatchEvent(toOffEvent); + window.dispatchEvent(toOffEvent as any); await flushAsyncWork(); expect(viewer.setMode).toHaveBeenLastCalledWith("simple"); @@ -890,7 +891,7 @@ it("loads local assets from the grid when opening the viewer", async () => { filepath: "D:/renders/nested/image.png", }; const grid = createGrid([asset.id]); - grid._mjrGetAssets = () => [asset]; + (grid as any)._mjrGetAssets = () => [asset]; state.setActiveGrid(grid); state.getSelectedIdSetMock.mockReturnValue(new Set([asset.id])); const { floatingViewerManager } = await import("../features/viewer/floatingViewerManager.js"); diff --git a/ui/tests/floating_viewer_panel_interactions.vitest.ts b/ui/tests/floating_viewer_panel_interactions.vitest.ts index 73fd6d4f..72b169d9 100644 --- a/ui/tests/floating_viewer_panel_interactions.vitest.ts +++ b/ui/tests/floating_viewer_panel_interactions.vitest.ts @@ -14,7 +14,7 @@ describe("floating viewer panel interactions", () => { const handle = { ownerDocument: { defaultView: { addEventListener: addWindowListener } }, addEventListener: vi.fn((type, handler) => { - if (type === "pointerdown") handle._down = handler; + if (type === "pointerdown") (handle as any)._down = handler; }), setPointerCapture: vi.fn(), releasePointerCapture, @@ -31,10 +31,10 @@ describe("floating viewer panel interactions", () => { _getResizeDirectionFromPoint: () => "", }; - globalThis.window = { innerWidth: 800, innerHeight: 600 }; + globalThis.window = { innerWidth: 800, innerHeight: 600 } as any; - initFloatingViewerDrag(viewer, handle); - handle._down({ + initFloatingViewerDrag(viewer, handle as any); + (handle as any)._down({ button: 0, pointerId: 7, clientX: 50, @@ -50,8 +50,8 @@ describe("floating viewer panel interactions", () => { ); windowListeners.get("pointermove")({ clientX: 150, clientY: 180 }); - expect(el.style.left).toBe("130px"); - expect(el.style.top).toBe("160px"); + expect((el.style as any).left).toBe("130px"); + expect((el.style as any).top).toBe("160px"); windowListeners.get("pointerup")({}); expect(releasePointerCapture).toHaveBeenCalledWith(7); @@ -106,17 +106,17 @@ describe("floating viewer panel interactions", () => { }), }; const addElementListener = vi.fn((type, handler) => { - if (type === "pointerdown") element._down = handler; + if (type === "pointerdown") (element as any)._down = handler; }); - element.addEventListener = addElementListener; + (element as any).addEventListener = addElementListener; globalThis.window = { innerWidth: 1000, innerHeight: 800, - getComputedStyle: () => ({ minWidth: "120", minHeight: "100" }), - }; + getComputedStyle: () => ({ minWidth: "120", minHeight: "100" }) as any, + } as any; - initFloatingViewerEdgeResize(viewer, element); - element._down({ + initFloatingViewerEdgeResize(viewer, element as any); + (element as any)._down({ button: 0, pointerId: 11, clientX: 298, @@ -131,8 +131,8 @@ describe("floating viewer panel interactions", () => { expect.objectContaining({ signal: expect.any(AbortSignal) }), ); windowListeners.get("pointermove")({ pointerId: 11, clientX: 348, clientY: 288 }); - expect(element.style.width).toBe("250px"); - expect(element.style.height).toBe("190px"); + expect((element.style as any).width).toBe("250px"); + expect((element.style as any).height).toBe("190px"); }); it("does not steal clicks from toolbar buttons near a resize edge", () => { @@ -162,19 +162,19 @@ describe("floating viewer panel interactions", () => { _stopEdgeResize: vi.fn(), }; const addElementListener = vi.fn((type, handler) => { - if (type === "pointerdown") element._down = handler; + if (type === "pointerdown") (element as any)._down = handler; }); - element.addEventListener = addElementListener; + (element as any).addEventListener = addElementListener; globalThis.window = { innerWidth: 1000, innerHeight: 800, - getComputedStyle: () => ({ minWidth: "120", minHeight: "100" }), - }; + getComputedStyle: () => ({ minWidth: "120", minHeight: "100" }) as any, + } as any; const preventDefault = vi.fn(); const stopPropagation = vi.fn(); - initFloatingViewerEdgeResize(viewer, element); - element._down({ + initFloatingViewerEdgeResize(viewer, element as any); + (element as any)._down({ button: 0, pointerId: 12, clientX: 101, diff --git a/ui/tests/floating_viewer_progress.vitest.ts b/ui/tests/floating_viewer_progress.vitest.ts index 298e1d6c..bf72da8a 100644 --- a/ui/tests/floating_viewer_progress.vitest.ts +++ b/ui/tests/floating_viewer_progress.vitest.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { FloatingViewerProgressService, @@ -10,14 +10,30 @@ function ensureCustomEventShim() { globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; } +const flush = () => new Promise((resolve) => setTimeout(resolve, 0)); + +/** + * Mimics ComfyUI's read-only `/queue` and `/history/{id}` endpoints. The + * service must learn the prompt graph from these, never by wrapping + * `api.queuePrompt`. + */ class FakeApi extends EventTarget { - async queuePrompt(_index, _prompt) { - return { prompt_id: "prompt-1" }; + queue: Record = { queue_running: [], queue_pending: [] }; + history: Record = {}; + queuePrompt = vi.fn(); + + run(promptId: string, output: Record) { + this.queue.queue_running = [[0, promptId, output, {}, []]]; + } + + async fetchApi(route: string) { + const json = route === "/queue" ? this.queue : this.history; + return { ok: true, json: async () => json }; } } @@ -42,11 +58,9 @@ describe("floating viewer progress service", () => { await service.ensureInitialized({ api }); - await api.queuePrompt(0, { - output: { - 1: { class_type: "KSampler", _meta: { title: "KSampler" } }, - 2: { class_type: "SaveImage" }, - }, + api.run("prompt-1", { + 1: { class_type: "KSampler", _meta: { title: "KSampler" } }, + 2: { class_type: "SaveImage" }, }); api.dispatchEvent( new CustomEvent("status", { @@ -58,6 +72,7 @@ describe("floating viewer progress service", () => { detail: { prompt_id: "prompt-1" }, }), ); + await flush(); api.dispatchEvent( new CustomEvent("progress", { detail: { @@ -89,7 +104,8 @@ describe("floating viewer progress service", () => { expect(snapshot.prompt.currentlyExecuting.nodeId).toBe("2"); expect(snapshot.prompt.currentlyExecuting.nodeLabel).toBe("SaveImage"); - service.dispose({ resetPatchedQueuePrompt: true }); + service.dispose(); + expect(api.queuePrompt).not.toHaveBeenCalled(); }); it("counts cached nodes as executed without replacing the active node", async () => { @@ -106,18 +122,17 @@ describe("floating viewer progress service", () => { }); await service.ensureInitialized({ api }); - await api.queuePrompt(0, { - output: { - 1: { class_type: "LoadImage" }, - 2: { class_type: "VAEDecode" }, - 3: { class_type: "KSampler" }, - }, + api.run("prompt-1", { + 1: { class_type: "LoadImage" }, + 2: { class_type: "VAEDecode" }, + 3: { class_type: "KSampler" }, }); api.dispatchEvent( new CustomEvent("execution_start", { detail: { prompt_id: "prompt-1" }, }), ); + await flush(); api.dispatchEvent( new CustomEvent("progress", { detail: { @@ -142,7 +157,8 @@ describe("floating viewer progress service", () => { expect(snapshot.prompt.currentlyExecuting.nodeId).toBe("3"); expect(snapshot.prompt.currentlyExecuting.nodeLabel).toBe("KSampler"); - service.dispose({ resetPatchedQueuePrompt: true }); + service.dispose(); + expect(api.queuePrompt).not.toHaveBeenCalled(); }); it("surfaces execution errors and resets to idle on success", async () => { @@ -153,11 +169,7 @@ describe("floating viewer progress service", () => { }); await service.ensureInitialized({ api }); - await api.queuePrompt(0, { - output: { - 1: { class_type: "KSampler" }, - }, - }); + api.run("prompt-1", { 1: { class_type: "KSampler" } }); api.dispatchEvent( new CustomEvent("execution_start", { detail: { prompt_id: "prompt-1" }, @@ -187,7 +199,58 @@ describe("floating viewer progress service", () => { snapshot = service.getSnapshot(); expect(snapshot.prompt).toBeNull(); - service.dispose({ resetPatchedQueuePrompt: true }); + service.dispose(); + expect(api.queuePrompt).not.toHaveBeenCalled(); + }); + + it("never wraps api.queuePrompt and falls back to /history for finished prompts", async () => { + const api = new FakeApi(); + const original = api.queuePrompt; + api.history = { + "prompt-9": { prompt: [0, "prompt-9", { 5: { class_type: "SaveImage" } }, {}, []] }, + }; + const service = new FloatingViewerProgressService({ + getApi: () => api, + getApp: () => ({ graph: { getNodeById: () => null } }), + }); + + await service.ensureInitialized({ api }); + expect(api.queuePrompt).toBe(original); + + api.dispatchEvent( + new CustomEvent("execution_start", { detail: { prompt_id: "prompt-9" } }), + ); + await flush(); + expect(service.getSnapshot().prompt.totalNodes).toBe(1); + expect(service.getSnapshot().prompt.getNodeLabel("5")).toBe("SaveImage"); + + service.dispose(); + }); + + it("prefers the core Jobs API when the frontend exposes getJobDetail", async () => { + const api: any = new FakeApi(); + api.getJobDetail = vi.fn(async (id: string) => ({ + id, + status: "in_progress", + workflow: { + prompt: { 7: { class_type: "VAEDecode" }, 8: { class_type: "SaveImage" } }, + }, + })); + const fetchSpy = vi.spyOn(api, "fetchApi"); + const service = new FloatingViewerProgressService({ + getApi: () => api, + getApp: () => ({ graph: { getNodeById: () => null } }), + }); + + await service.ensureInitialized({ api }); + api.dispatchEvent(new CustomEvent("execution_start", { detail: { prompt_id: "job-1" } })); + await flush(); + + expect(api.getJobDetail).toHaveBeenCalledWith("job-1"); + expect(fetchSpy).not.toHaveBeenCalled(); + expect(service.getSnapshot().prompt.totalNodes).toBe(2); + + service.dispose(); }); it("formats the media overlay label from current node and steps", () => { diff --git a/ui/tests/floating_viewer_simple_player_shortcuts.vitest.ts b/ui/tests/floating_viewer_simple_player_shortcuts.vitest.ts index 5cc86750..e7989bf4 100644 --- a/ui/tests/floating_viewer_simple_player_shortcuts.vitest.ts +++ b/ui/tests/floating_viewer_simple_player_shortcuts.vitest.ts @@ -35,7 +35,7 @@ describe("floatingViewerSimplePlayer keyboard shortcuts", () => { { filename: "clip.mp4" }, { kind: "video" }, ); - document.body.appendChild(root); + document.body.appendChild(root as any); root.dispatchEvent( new KeyboardEvent("keydown", { key: " ", bubbles: true, cancelable: true }), @@ -83,7 +83,7 @@ describe("floatingViewerSimplePlayer keyboard shortcuts", () => { { filename: "clip.mp4" }, { kind: "video" }, ); - document.body.appendChild(root); + document.body.appendChild(root as any); root.dispatchEvent( new KeyboardEvent("keydown", { key: "ArrowLeft", bubbles: true, cancelable: true }), @@ -122,7 +122,7 @@ describe("floatingViewerSimplePlayer keyboard shortcuts", () => { { filename: "clip.mp4" }, { kind: "video" }, ); - document.body.appendChild(root); + document.body.appendChild(root as any); const seek = root.querySelector(".mjr-mfv-simple-player-seek"); const event = new KeyboardEvent("keydown", { key: "ArrowLeft", @@ -181,7 +181,7 @@ describe("floatingViewerSimplePlayer keyboard shortcuts", () => { { filename: "clip.mp4" }, { kind: "video" }, ); - document.body.appendChild(root); + document.body.appendChild(root as any); const seek = root.querySelector(".mjr-mfv-simple-player-seek"); currentTime = 5; diff --git a/ui/tests/floating_viewer_toolbar_overlay_controls.vitest.ts b/ui/tests/floating_viewer_toolbar_overlay_controls.vitest.ts index 1c3c9758..892ea4e7 100644 --- a/ui/tests/floating_viewer_toolbar_overlay_controls.vitest.ts +++ b/ui/tests/floating_viewer_toolbar_overlay_controls.vitest.ts @@ -32,11 +32,11 @@ vi.mock("../features/viewer/nodeStream/nodeStreamFeatureFlag.js", () => ({ vi.mock("../features/viewer/workflowSidebar/WorkflowSidebar.js", () => ({ WorkflowSidebar: class { constructor() { - this.el = document.createElement("div"); - this.isVisible = false; + (this as any).el = document.createElement("div"); + (this as any).isVisible = false; } toggle() { - this.isVisible = !this.isVisible; + (this as any).isVisible = !(this as any).isVisible; } }, })); @@ -86,16 +86,16 @@ describe("floating viewer toolbar overlay controls", () => { expect(bar.querySelector(".mjr-mfv-guides-trigger")).toBeTruthy(); expect(bar.querySelector(".mjr-mfv-ch-trigger")).toBeTruthy(); - expect(viewer._guidesSelect).toBeTruthy(); - expect(viewer._channelSelect).toBeTruthy(); - expect(viewer._exposureCtl?.input).toBeTruthy(); - expect(viewer._formatSelect).toBeTruthy(); - expect(viewer._formatToggle).toBeTruthy(); - expect(viewer._maskOpacityCtl?.input).toBeTruthy(); - expect(viewer._guidesSelect.value).toBe("0"); - expect(viewer._channelSelect.value).toBe("rgb"); + expect((viewer as any)._guidesSelect).toBeTruthy(); + expect((viewer as any)._channelSelect).toBeTruthy(); + expect((viewer as any)._exposureCtl?.input).toBeTruthy(); + expect((viewer as any)._formatSelect).toBeTruthy(); + expect((viewer as any)._formatToggle).toBeTruthy(); + expect((viewer as any)._maskOpacityCtl?.input).toBeTruthy(); + expect((viewer as any)._guidesSelect.value).toBe("0"); + expect((viewer as any)._channelSelect.value).toBe("rgb"); // When _overlayMaskEnabled is false, format initialises to "off" - expect(viewer._formatSelect.value).toBe("off"); + expect((viewer as any)._formatSelect.value).toBe("off"); }); it("renders a Majoor settings shortcut beside the MFV stop controls", async () => { diff --git a/ui/tests/grid_controller_exit_similar_scope.vitest.ts b/ui/tests/grid_controller_exit_similar_scope.vitest.ts index 7e690de2..3cd6fd82 100644 --- a/ui/tests/grid_controller_exit_similar_scope.vitest.ts +++ b/ui/tests/grid_controller_exit_similar_scope.vitest.ts @@ -101,13 +101,13 @@ describe("gridController exiting similar scope", () => { lastGridCount: 0, lastGridTotal: 0, }; - globalThis.window = {}; + globalThis.window = {} as any; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); it("does not preserve stale similar cards when switching back to normal scope", async () => { diff --git a/ui/tests/grid_controller_semantic_mode.vitest.ts b/ui/tests/grid_controller_semantic_mode.vitest.ts index 3797cbfc..871f38b1 100644 --- a/ui/tests/grid_controller_semantic_mode.vitest.ts +++ b/ui/tests/grid_controller_semantic_mode.vitest.ts @@ -43,13 +43,13 @@ function createGridContainer() { describe("gridController semantic mode", () => { beforeEach(() => { vi.clearAllMocks(); - globalThis.window = {}; + globalThis.window = {} as any; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); it("does not show unavailable toast when AI search returns no results without errors", async () => { diff --git a/ui/tests/grid_controller_similar_fallback.vitest.ts b/ui/tests/grid_controller_similar_fallback.vitest.ts index 6c5b2708..4f4affe2 100644 --- a/ui/tests/grid_controller_similar_fallback.vitest.ts +++ b/ui/tests/grid_controller_similar_fallback.vitest.ts @@ -53,13 +53,13 @@ describe("gridController similar fallback", () => { similarSourceAssetId: "", similarTitle: "", }; - globalThis.window = {}; + globalThis.window = {} as any; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); it("uses state similar results when bridge results are empty", async () => { diff --git a/ui/tests/grid_dom_bridge.vitest.ts b/ui/tests/grid_dom_bridge.vitest.ts index ada9b9ae..f6fd6d5b 100644 --- a/ui/tests/grid_dom_bridge.vitest.ts +++ b/ui/tests/grid_dom_bridge.vitest.ts @@ -22,16 +22,16 @@ describe("gridDomBridge", () => { querySelectorAll: vi.fn((selector) => (selector === ".mjr-asset-card" ? cards : [])), }; - expect(readRenderedAssetCards(grid)).toEqual(cards); - expect(findSelectedAssetCard(grid)).toBe(selected); - expect(findAssetCardById(grid, "asset:1")).toBe(byId); - expect(readGridShownCount(grid, 0)).toBe(12); + expect(readRenderedAssetCards(grid as any)).toEqual(cards); + expect(findSelectedAssetCard(grid as any)).toBe(selected); + expect(findAssetCardById(grid as any, "asset:1")).toBe(byId); + expect(readGridShownCount(grid as any, 0)).toBe(12); }); it("falls back safely when the DOM is unavailable", () => { expect(readRenderedAssetCards(null)).toEqual([]); expect(findSelectedAssetCard(null)).toBeNull(); expect(findAssetCardById(null, "a")).toBeNull(); - expect(readGridShownCount({ dataset: { mjrShown: "NaN" } }, 7)).toBe(7); + expect(readGridShownCount({ dataset: { mjrShown: "NaN" } } as any, 7)).toBe(7); }); }); diff --git a/ui/tests/grid_keyboard_navigation.vitest.ts b/ui/tests/grid_keyboard_navigation.vitest.ts index d6e489ac..3e9c4342 100644 --- a/ui/tests/grid_keyboard_navigation.vitest.ts +++ b/ui/tests/grid_keyboard_navigation.vitest.ts @@ -50,33 +50,35 @@ function createGridContainer(assetIds) { grid.className = "mjr-grid"; const assets = assetIds.map((id) => ({ id })); - grid._mjrAssets = assets; - grid._mjrGetAssets = () => assets; - grid._mjrGetRenderedCards = () => + (grid as any)._mjrAssets = assets; + (grid as any)._mjrGetAssets = () => assets; + (grid as any)._mjrGetRenderedCards = () => assets.map((asset, index) => { const card = document.createElement("div"); card.className = "mjr-asset-card"; card.dataset.mjrAssetId = String(asset.id); - card._mjrAsset = asset; - card.getBoundingClientRect = () => ({ - top: 0, - width: 100, - left: index * 100, - height: 100, - right: index * 100 + 100, - bottom: 100, - }); + (card as any)._mjrAsset = asset; + card.getBoundingClientRect = () => + ({ + top: 0, + width: 100, + left: index * 100, + height: 100, + right: index * 100 + 100, + bottom: 100, + }) as any; return card; }); - grid.getBoundingClientRect = () => ({ - top: 0, - left: 0, - width: 220, - height: 100, - right: 220, - bottom: 100, - }); - grid._mjrSetSelection = (ids, activeId = "") => { + grid.getBoundingClientRect = () => + ({ + top: 0, + left: 0, + width: 220, + height: 100, + right: 220, + bottom: 100, + }) as any; + (grid as any)._mjrSetSelection = (ids, activeId = "") => { grid.dataset.mjrSelectedAssetIds = JSON.stringify(ids); if (activeId) grid.dataset.mjrSelectedAssetId = String(activeId); else delete grid.dataset.mjrSelectedAssetId; @@ -105,7 +107,7 @@ describe("GridKeyboard navigation", () => { configurable: true, get: () => document.body, }); - delete window.__MJR_LAST_SELECTION_GRID__; + delete (window as any).__MJR_LAST_SELECTION_GRID__; }); it("handles arrow keys only for the active grid when multiple listeners are installed", async () => { @@ -114,30 +116,30 @@ describe("GridKeyboard navigation", () => { const mainGrid = createGridContainer(["main-1", "main-2", "main-3"]); const feedGrid = createGridContainer(["feed-1", "feed-2", "feed-3"]); - mainGrid._mjrSetSelection(["main-1"], "main-1"); - feedGrid._mjrSetSelection(["feed-1"], "feed-1"); + (mainGrid as any)._mjrSetSelection(["main-1"], "main-1"); + (feedGrid as any)._mjrSetSelection(["feed-1"], "feed-1"); const mainKeyboard = installGridKeyboard({ gridContainer: mainGrid, - getState: () => ({ assets: mainGrid._mjrAssets }), + getState: () => ({ assets: (mainGrid as any)._mjrAssets }), getSelectedAssets: () => - mainGrid._mjrAssets.filter( + (mainGrid as any)._mjrAssets.filter( (asset) => asset.id === mainGrid.dataset.mjrSelectedAssetId, ), getActiveAsset: () => - mainGrid._mjrAssets.find( + (mainGrid as any)._mjrAssets.find( (asset) => asset.id === mainGrid.dataset.mjrSelectedAssetId, ) || null, }); const feedKeyboard = installGridKeyboard({ gridContainer: feedGrid, - getState: () => ({ assets: feedGrid._mjrAssets }), + getState: () => ({ assets: (feedGrid as any)._mjrAssets }), getSelectedAssets: () => - feedGrid._mjrAssets.filter( + (feedGrid as any)._mjrAssets.filter( (asset) => asset.id === feedGrid.dataset.mjrSelectedAssetId, ), getActiveAsset: () => - feedGrid._mjrAssets.find( + (feedGrid as any)._mjrAssets.find( (asset) => asset.id === feedGrid.dataset.mjrSelectedAssetId, ) || null, }); @@ -152,7 +154,7 @@ describe("GridKeyboard navigation", () => { expect(mainGrid.dataset.mjrSelectedAssetId).toBe("main-2"); expect(feedGrid.dataset.mjrSelectedAssetId).toBe("feed-1"); expect(panelRuntimeState.activeGrid).toBe(mainGrid); - expect(window.__MJR_LAST_SELECTION_GRID__).toBe(mainGrid); + expect((window as any).__MJR_LAST_SELECTION_GRID__).toBe(mainGrid); mainKeyboard.dispose(); feedKeyboard.dispose(); @@ -162,9 +164,9 @@ describe("GridKeyboard navigation", () => { const { installGridKeyboard } = await import("../features/grid/GridKeyboard.js"); const grid = createGridContainer(["asset-1"]); - grid._mjrAssets[0].filename = "one.png"; - grid._mjrAssets[0].filepath = "C:/out/one.png"; - grid._mjrSetSelection(["asset-1"], "asset-1"); + (grid as any)._mjrAssets[0].filename = "one.png"; + (grid as any)._mjrAssets[0].filepath = "C:/out/one.png"; + (grid as any)._mjrSetSelection(["asset-1"], "asset-1"); const clicks = []; const originalCreateElement = document.createElement.bind(document); @@ -178,9 +180,9 @@ describe("GridKeyboard navigation", () => { const keyboard = installGridKeyboard({ gridContainer: grid, - getState: () => ({ assets: grid._mjrAssets }), - getSelectedAssets: () => grid._mjrAssets, - getActiveAsset: () => grid._mjrAssets[0], + getState: () => ({ assets: (grid as any)._mjrAssets }), + getSelectedAssets: () => (grid as any)._mjrAssets, + getActiveAsset: () => (grid as any)._mjrAssets[0], }); keyboard.bind(); diff --git a/ui/tests/grid_loader_adaptive_paging.vitest.ts b/ui/tests/grid_loader_adaptive_paging.vitest.ts index e0fa3aa6..98dc502b 100644 --- a/ui/tests/grid_loader_adaptive_paging.vitest.ts +++ b/ui/tests/grid_loader_adaptive_paging.vitest.ts @@ -101,8 +101,8 @@ describe("useGridLoader adaptive paging", () => { vi.resetModules(); vi.clearAllMocks(); vi.useRealTimers(); - globalThis.sessionStorage = makeStorage(); - globalThis.localStorage = makeStorage(); + globalThis.sessionStorage = (makeStorage() as any); + globalThis.localStorage = (makeStorage() as any); ensureWindowStub(); }); @@ -407,7 +407,7 @@ describe("useGridLoader adaptive paging", () => { statusError: false, }; const scrollElement = createVisibleElement({ scrollTop: 420 }); - scrollElement.scrollHeight = 2000; + (scrollElement as any).scrollHeight = 2000; const resetAssets = vi.fn(); const reconcileSelection = vi.fn(); const setSelection = vi.fn((ids, activeId) => { @@ -469,12 +469,12 @@ describe("useGridLoader adaptive paging", () => { statusError: false, }; const scrollElement = new EventTarget(); - scrollElement.scrollTop = 420; - scrollElement.scrollHeight = 2000; - scrollElement.clientHeight = 500; - scrollElement.clientWidth = 320; - scrollElement.isConnected = true; - scrollElement.getClientRects = vi.fn(() => [{ width: 320, height: 500 }]); + (scrollElement as any).scrollTop = 420; + (scrollElement as any).scrollHeight = 2000; + (scrollElement as any).clientHeight = 500; + (scrollElement as any).clientWidth = 320; + (scrollElement as any).isConnected = true; + (scrollElement as any).getClientRects = vi.fn(() => [{ width: 320, height: 500 }]); const loader = useGridLoader({ gridContainerRef: { value: createVisibleElement({ dataset: {} }) }, @@ -492,7 +492,7 @@ describe("useGridLoader adaptive paging", () => { }); const pending = loader.appendNextPage(); - scrollElement.scrollTop = 900; + (scrollElement as any).scrollTop = 900; scrollElement.dispatchEvent(new Event("scroll")); resolvePage({ ok: true, @@ -504,7 +504,7 @@ describe("useGridLoader adaptive paging", () => { }); await pending; - expect(scrollElement.scrollTop).toBe(900); + expect((scrollElement as any).scrollTop).toBe(900); }); it("does not prune unloaded selections after a partial reload", async () => { @@ -594,7 +594,7 @@ describe("useGridLoader adaptive paging", () => { }, }); const scrollElement = createVisibleElement({ scrollTop: 64 }); - scrollElement.scrollHeight = 512; + (scrollElement as any).scrollHeight = 512; const loader = useGridLoader({ gridContainerRef: { value: gridContainer }, @@ -773,7 +773,7 @@ describe("useGridLoader adaptive paging", () => { statusError: false, }; const resetAssets = vi.fn(({ query = "*", total = null, done = false } = {}) => { - state2.query = query; + (state2 as any).query = query; state2.total = total; state2.done = done; state2.assets = []; diff --git a/ui/tests/grid_perf_budget.vitest.ts b/ui/tests/grid_perf_budget.vitest.ts index faefc550..842fc994 100644 --- a/ui/tests/grid_perf_budget.vitest.ts +++ b/ui/tests/grid_perf_budget.vitest.ts @@ -25,18 +25,20 @@ async function elapsedAsync(fn) { } function makeAsset(overrides = {}) { - const i = overrides.i ?? 0; + const i = (overrides as any).i ?? 0; return { - id: overrides.id ?? `asset-${i}`, - filename: overrides.filename ?? `ComfyUI_${String(i).padStart(5, "0")}_00001_.png`, - kind: overrides.kind ?? "image", - mtime: overrides.mtime ?? i, - size: overrides.size ?? 1024, - filepath: overrides.filepath ?? `output/ComfyUI_${String(i).padStart(5, "0")}_00001_.png`, - source: overrides.source ?? "output", - root_id: overrides.root_id ?? "root1", - subfolder: overrides.subfolder ?? "", - has_generation_data: overrides.has_generation_data ?? 0, + id: (overrides as any).id ?? `asset-${i}`, + filename: (overrides as any).filename ?? `ComfyUI_${String(i).padStart(5, "0")}_00001_.png`, + kind: (overrides as any).kind ?? "image", + mtime: (overrides as any).mtime ?? i, + size: (overrides as any).size ?? 1024, + filepath: + (overrides as any).filepath ?? + `output/ComfyUI_${String(i).padStart(5, "0")}_00001_.png`, + source: (overrides as any).source ?? "output", + root_id: (overrides as any).root_id ?? "root1", + subfolder: (overrides as any).subfolder ?? "", + has_generation_data: (overrides as any).has_generation_data ?? 0, ...overrides, }; } diff --git a/ui/tests/grid_scope_switch_cache.vitest.ts b/ui/tests/grid_scope_switch_cache.vitest.ts index f1bc886e..772501e8 100644 --- a/ui/tests/grid_scope_switch_cache.vitest.ts +++ b/ui/tests/grid_scope_switch_cache.vitest.ts @@ -105,13 +105,13 @@ describe("gridController scope switch cache behavior", () => { lastGridCount: 0, lastGridTotal: 0, }); - globalThis.window = {}; + globalThis.window = {} as any; globalThis.CustomEvent = class { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any; }); it("writes mjrCollectionId to the dataset during reload", async () => { @@ -142,7 +142,7 @@ describe("gridController scope switch cache behavior", () => { await controller.reloadGrid(); - expect(gridContainer.dataset.mjrCollectionId).toBe("col-123"); + expect((gridContainer.dataset as any).mjrCollectionId).toBe("col-123"); }); it("loads collection assets when collectionId is set", async () => { @@ -276,7 +276,7 @@ describe("gridController scope switch cache behavior", () => { await controller.reloadGrid(); expect(gridContainer.dataset.mjrScope).toBe("custom"); - expect(gridContainer.dataset.mjrCustomRootId).toBe(""); + expect((gridContainer.dataset as any).mjrCustomRootId).toBe(""); expect(loadAssets).toHaveBeenCalled(); expect(disposeGrid).not.toHaveBeenCalled(); }); diff --git a/ui/tests/grid_selection_manager.vitest.ts b/ui/tests/grid_selection_manager.vitest.ts index 9b607ea8..ba93df72 100644 --- a/ui/tests/grid_selection_manager.vitest.ts +++ b/ui/tests/grid_selection_manager.vitest.ts @@ -47,15 +47,15 @@ describe("GridSelectionManager", () => { const events = []; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.window = { dispatchEvent(evt) { events.push(evt); }, - }; + } as any; const grid = { dataset: {}, dispatchEvent(evt) { @@ -69,7 +69,7 @@ describe("GridSelectionManager", () => { const selected = setSelectionIds(grid, ["1", 3, "3"], { activeId: "3" }, () => cards); expect(selected.sort()).toEqual(["1", "3"]); - expect(grid.dataset.mjrSelectedAssetId).toBe("3"); + expect((grid.dataset as any).mjrSelectedAssetId).toBe("3"); expect(events.length).toBeGreaterThanOrEqual(1); }); @@ -83,15 +83,15 @@ describe("GridSelectionManager", () => { const events = []; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.window = { dispatchEvent(evt) { events.push(evt); }, - }; + } as any; const grid = { dataset: { mjrSelectedAssetIds: JSON.stringify(["1", "2", "9"]), diff --git a/ui/tests/helpers/vitestEnvironment.ts b/ui/tests/helpers/vitestEnvironment.ts index 8885878b..ea65c132 100644 --- a/ui/tests/helpers/vitestEnvironment.ts +++ b/ui/tests/helpers/vitestEnvironment.ts @@ -64,7 +64,7 @@ export function ensureWindowStub(overrides = {}) { typeof current.addEventListener !== "function" || typeof current.removeEventListener !== "function" ) { - globalThis.window = createWindowStub(overrides); + globalThis.window = createWindowStub(overrides) as any; ensureNavigatorStub(); return globalThis.window; } diff --git a/ui/tests/hide_siblings.vitest.ts b/ui/tests/hide_siblings.vitest.ts index 8149f135..0950919d 100644 --- a/ui/tests/hide_siblings.vitest.ts +++ b/ui/tests/hide_siblings.vitest.ts @@ -241,7 +241,7 @@ describe("hide siblings", () => { expect(state.hiddenPngSiblings).toBe(1); expect(state.assets.map((asset) => asset.filename)).toEqual(["clip.mp4"]); expect(virtualGrid.items.map((asset) => asset.filename)).toEqual(["clip.mp4"]); - expect(gridContainer.dataset.mjrHiddenPngSiblings).toBe("1"); + expect((gridContainer.dataset as any).mjrHiddenPngSiblings).toBe("1"); }); it("does not leak a png when the png arrives before its webp sibling in the same batch", () => { @@ -287,7 +287,7 @@ describe("hide siblings", () => { expect(state.hiddenPngSiblings).toBe(1); expect(state.assets.map((asset) => asset.filename)).toEqual(["clip.webp"]); expect(virtualGrid.items.map((asset) => asset.filename)).toEqual(["clip.webp"]); - expect(gridContainer.dataset.mjrHiddenPngSiblings).toBe("1"); + expect((gridContainer.dataset as any).mjrHiddenPngSiblings).toBe("1"); }); it("rebuilds hidden sibling indexes from preserved visible assets", () => { @@ -337,6 +337,6 @@ describe("hide siblings", () => { expect(added).toBe(0); expect(state.assets.map((asset) => asset.filename)).toEqual(["clip.mp4"]); expect(state.hiddenPngSiblings).toBe(3); - expect(gridContainer.dataset.mjrHiddenPngSiblings).toBe("3"); + expect((gridContainer.dataset as any).mjrHiddenPngSiblings).toBe("3"); }); }); diff --git a/ui/tests/host_adapter_contract.vitest.ts b/ui/tests/host_adapter_contract.vitest.ts index b498c23e..2304678c 100644 --- a/ui/tests/host_adapter_contract.vitest.ts +++ b/ui/tests/host_adapter_contract.vitest.ts @@ -140,50 +140,6 @@ describe("hostAdapter contract", () => { expect(Object.prototype.hasOwnProperty.call(canvas, "onNodeDeselected")).toBe(false); }); - it("wrapHostQueuePrompt binds once per owner and restore returns original", async () => { - const mod = await import("../app/hostAdapter.js"); - - const original = vi.fn(async (count: number) => ({ prompt_id: String(count) })); - const api: any = { - queuePrompt: original, - }; - - const ownerA = { id: "A" }; - const ownerB = { id: "B" }; - - const binding = mod.wrapHostQueuePrompt({ - api, - owner: ownerA, - createWrapper(originalQueuePrompt: any) { - return async function (this: any, ...args: any[]) { - return originalQueuePrompt.apply(this, args); - }; - }, - }); - - expect(binding).toBeTruthy(); - expect(api.queuePrompt).not.toBe(original); - - const blockedBinding = mod.wrapHostQueuePrompt({ - api, - owner: ownerB, - createWrapper(originalQueuePrompt: any) { - return async function (this: any, ...args: any[]) { - return originalQueuePrompt.apply(this, args); - }; - }, - }); - - expect(blockedBinding).toBeNull(); - - const result = await api.queuePrompt(7); - expect(result.prompt_id).toBe("7"); - expect(original).toHaveBeenCalledTimes(1); - - expect(binding.restore()).toBe(true); - expect(api.queuePrompt).toBe(original); - }); - it("notifies node graph and root canvas graph through host helpers", async () => { const mod = await import("../app/hostAdapter.js"); diff --git a/ui/tests/hotkeys_state.vitest.ts b/ui/tests/hotkeys_state.vitest.ts index 8f3bd499..bfbfefc0 100644 --- a/ui/tests/hotkeys_state.vitest.ts +++ b/ui/tests/hotkeys_state.vitest.ts @@ -29,7 +29,7 @@ describe("hotkeysState", () => { }); it("coerces non-string values to string", () => { - setHotkeysScope(42); + setHotkeysScope(42 as any); expect(getHotkeysState().scope).toBe("42"); }); @@ -57,12 +57,12 @@ describe("hotkeysState", () => { }); it("coerces truthy values to boolean", () => { - setHotkeysSuspendedFlag(1); + setHotkeysSuspendedFlag(1 as any); expect(getHotkeysState().suspended).toBe(true); }); it("coerces falsy values to boolean", () => { - setHotkeysSuspendedFlag(0); + setHotkeysSuspendedFlag(0 as any); expect(getHotkeysState().suspended).toBe(false); }); }); diff --git a/ui/tests/infinite_scroll_upsert.vitest.ts b/ui/tests/infinite_scroll_upsert.vitest.ts index d2b18193..7397dd4d 100644 --- a/ui/tests/infinite_scroll_upsert.vitest.ts +++ b/ui/tests/infinite_scroll_upsert.vitest.ts @@ -79,9 +79,11 @@ describe("InfiniteScroll upsert", () => { await fetchPage(gridContainer, query, 100, offset, deps, { requestId: 1, }); - const lastCall = buildListURL.mock.calls[buildListURL.mock.calls.length - 1]?.[0]; + const lastCall = (buildListURL.mock.calls as any)[ + (buildListURL.mock.calls as any).length - 1 + ]?.[0]; expect(lastCall).toMatchObject({ - scope: gridContainer.dataset.mjrScope, + scope: (gridContainer as any).dataset.mjrScope, offset, includeTotal, }); @@ -197,7 +199,7 @@ describe("InfiniteScroll upsert", () => { expect(state.seenKeys.has("id:1")).toBe(false); expect(state.seenKeys.has("stack:stack-a")).toBe(true); expect(state.assets).toHaveLength(1); - expect(state.assets[0].stack_id).toBe("stack-a"); + expect((state.assets[0] as any).stack_id).toBe("stack-a"); expect(setItems).toHaveBeenCalledTimes(1); }); diff --git a/ui/tests/live_stream_tracker.vitest.ts b/ui/tests/live_stream_tracker.vitest.ts index 57855041..8488c410 100644 --- a/ui/tests/live_stream_tracker.vitest.ts +++ b/ui/tests/live_stream_tracker.vitest.ts @@ -72,7 +72,7 @@ function createWindowStub() { dispatchEvent(event) { const handlers = Array.from(listeners.get(event?.type) || []); for (const handler of handlers) { - handler(event); + (handler as any)(event); } return true; }, @@ -83,9 +83,9 @@ function installCustomEventShim() { globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; } class FakeApi extends EventTarget {} @@ -99,7 +99,7 @@ beforeEach(() => { vi.resetModules(); vi.useFakeTimers(); state.reset(); - globalThis.window = createWindowStub(); + globalThis.window = createWindowStub() as any; installCustomEventShim(); }); diff --git a/ui/tests/media_factory_model3d.vitest.ts b/ui/tests/media_factory_model3d.vitest.ts index 7e0cf190..66e7623f 100644 --- a/ui/tests/media_factory_model3d.vitest.ts +++ b/ui/tests/media_factory_model3d.vitest.ts @@ -40,8 +40,8 @@ describe("createViewerMediaFactory 3D", () => { beforeEach(() => { vi.clearAllMocks(); globalThis.document = { - createElement: vi.fn((tag) => createElement(tag)), - }; + createElement: vi.fn((tag) => createElement(tag)) as any, + } as any; }); it("routes model3d assets to the shared 3D renderer", async () => { @@ -63,7 +63,7 @@ describe("createViewerMediaFactory 3D", () => { expect(el).toEqual({ kind: "3d-host" }); expect(createModel3DMediaElement).toHaveBeenCalledTimes(1); - expect(createModel3DMediaElement.mock.calls[0][0]).toBe(asset); + expect((createModel3DMediaElement.mock.calls as any)[0][0]).toBe(asset); }); it("wraps audio assets in the enhanced audio preview shell", async () => { @@ -104,7 +104,7 @@ describe("createViewerMediaFactory 3D", () => { factory.applyTransformToVisibleMedia(); - expect(elA.style.transform).toBe("scale(2)"); - expect(elB.style.transform).toBeUndefined(); + expect((elA.style as any).transform).toBe("scale(2)"); + expect((elB.style as any).transform).toBeUndefined(); }); }); diff --git a/ui/tests/message_center.vitest.ts b/ui/tests/message_center.vitest.ts index 963d24f6..ecf9e9d9 100644 --- a/ui/tests/message_center.vitest.ts +++ b/ui/tests/message_center.vitest.ts @@ -2,37 +2,37 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; class MemoryStorage { constructor() { - this.store = new Map(); + (this as any).store = new Map(); } clear() { - this.store.clear(); + (this as any).store.clear(); } getItem(key) { - return this.store.has(key) ? this.store.get(key) : null; + return (this as any).store.has(key) ? (this as any).store.get(key) : null; } removeItem(key) { - this.store.delete(key); + (this as any).store.delete(key); } setItem(key, value) { - this.store.set(key, String(value)); + (this as any).store.set(key, String(value)); } } function installRuntimeGlobals() { const eventTarget = new EventTarget(); - eventTarget.location = { href: "http://127.0.0.1:8188/" }; - globalThis.window = eventTarget; - globalThis.localStorage = new MemoryStorage(); + (eventTarget as any).location = { href: "http://127.0.0.1:8188/" }; + globalThis.window = eventTarget as any; + globalThis.localStorage = new MemoryStorage() as any; globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; } async function loadMessageCenter() { @@ -188,9 +188,9 @@ describe("messageCenter", () => { }); const stored = listPanelMessages().find((message) => message.id === "existing-message"); - expect(updated.createdAt).toBe(123456); - expect(updated.title).toBe("Updated title"); - expect(updated.level).toBe("success"); + expect((updated as any).createdAt).toBe(123456); + expect((updated as any).title).toBe("Updated title"); + expect((updated as any).level).toBe("success"); expect(stored).toMatchObject({ id: "existing-message", title: "Updated title", diff --git a/ui/tests/message_popover_controller.vitest.ts b/ui/tests/message_popover_controller.vitest.ts index c114d7d7..1b8f4983 100644 --- a/ui/tests/message_popover_controller.vitest.ts +++ b/ui/tests/message_popover_controller.vitest.ts @@ -74,8 +74,8 @@ describe("messagePopoverController", () => { beforeEach(() => { vi.useRealTimers(); const eventTarget = new EventTarget(); - eventTarget.location = { href: "http://127.0.0.1:8188/" }; - globalThis.window = eventTarget; + (eventTarget as any).location = { href: "http://127.0.0.1:8188/" }; + globalThis.window = eventTarget as any; globalThis.localStorage = { _data: new Map(), getItem(key) { @@ -87,16 +87,16 @@ describe("messagePopoverController", () => { clear() { this._data.clear(); }, - }; + } as any; globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; globalThis.document = { - createElement: vi.fn(() => createNode()), - }; + createElement: vi.fn(() => createNode()) as any, + } as any; }); it("shows only the shortcut panel in shortcut guide tab", async () => { @@ -140,10 +140,10 @@ describe("messagePopoverController", () => { expect(title.textContent).toBe("Shortcut Guide"); expect(messageList.hidden).toBe(true); - expect(messageList.style.display).toBe("none"); + expect((messageList.style as any).display).toBe("none"); expect(messageList.attributes.get("aria-hidden")).toBe("true"); expect(shortcutsPanel.hidden).toBe(false); - expect(shortcutsPanel.style.display).toBe(""); + expect((shortcutsPanel.style as any).display).toBe(""); expect(shortcutsPanel.attributes.get("aria-hidden")).toBe("false"); expect(markReadBtn.hidden).toBe(true); @@ -151,9 +151,9 @@ describe("messagePopoverController", () => { expect(title.textContent).toBe("Messages"); expect(messageList.hidden).toBe(false); - expect(messageList.style.display).toBe(""); + expect((messageList.style as any).display).toBe(""); expect(shortcutsPanel.hidden).toBe(true); - expect(shortcutsPanel.style.display).toBe("none"); + expect((shortcutsPanel.style as any).display).toBe("none"); expect(markReadBtn.hidden).toBe(false); }); @@ -301,7 +301,7 @@ describe("messagePopoverController", () => { window.dispatchEvent(new CustomEvent(EVENTS.OPEN_MESSAGE_HISTORY)); - expect(messagePopover.style.display).toBe("block"); + expect((messagePopover.style as any).display).toBe("block"); expect(title.textContent).toBe("History"); historyModule.addToastHistory({ @@ -316,11 +316,11 @@ describe("messagePopoverController", () => { forceStore: true, }); - expect(messagePopover.style.display).toBe("block"); + expect((messagePopover.style as any).display).toBe("block"); await vi.advanceTimersByTimeAsync(2200); expect(popovers.close).toHaveBeenCalledWith(messagePopover); - expect(messagePopover.style.display).toBe("none"); + expect((messagePopover.style as any).display).toBe("none"); vi.useRealTimers(); }); }); diff --git a/ui/tests/native_assets_tab.vitest.ts b/ui/tests/native_assets_tab.vitest.ts new file mode 100644 index 00000000..6bf2c8fe --- /dev/null +++ b/ui/tests/native_assets_tab.vitest.ts @@ -0,0 +1,74 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +function makeApp(initialTabs: any[]) { + const tabs = [...initialTabs]; + const extensionManager = { + getSidebarTabs: vi.fn(() => [...tabs]), + unregisterSidebarTab: vi.fn((id: string) => { + const index = tabs.findIndex((tab) => tab.id === id); + if (index >= 0) tabs.splice(index, 1); + }), + registerSidebarTab: vi.fn((tab: any) => { + tabs.push(tab); + }), + }; + return { app: { extensionManager }, tabs, extensionManager }; +} + +describe("native assets tab coexistence", () => { + beforeEach(() => { + vi.resetModules(); + vi.useFakeTimers(); + }); + afterEach(() => { + vi.useRealTimers(); + }); + + async function load(app: any) { + const host = await import("../app/hostAdapter.js"); + host.init(app); + return import("../features/runtime/nativeAssetsTab.js"); + } + + it("only recognises the core assets tab, never Majoor's or unrelated tabs", async () => { + const mod = await load(makeApp([]).app); + expect(mod.isNativeAssetsTab({ id: "assets" })).toBe(true); + expect(mod.isNativeAssetsTab({ id: "majoor-assets" })).toBe(false); + expect(mod.isNativeAssetsTab({ id: "queue" })).toBe(false); + expect(mod.isNativeAssetsTab({ id: "node-library" })).toBe(false); + }); + + it("hides the native tab on opt-in and restores the same definition on opt-out", async () => { + const native = { id: "assets", title: "Assets", type: "vue" }; + const { app, tabs } = makeApp([native, { id: "majoor-assets" }, { id: "queue" }]); + const mod = await load(app); + + mod.setNativeAssetsTabHidden(true); + expect(tabs.map((tab) => tab.id)).toEqual(["majoor-assets", "queue"]); + expect(mod.getHiddenNativeAssetsTabIds()).toEqual(["assets"]); + + mod.setNativeAssetsTabHidden(false); + expect(tabs).toContain(native); + expect(mod.getHiddenNativeAssetsTabIds()).toEqual([]); + }); + + it("hides a native tab registered after setup thanks to delayed retries", async () => { + const { app, tabs } = makeApp([{ id: "majoor-assets" }]); + const mod = await load(app); + + mod.setNativeAssetsTabHidden(true); + tabs.push({ id: "assets" }); + vi.advanceTimersByTime(600); + expect(tabs.map((tab) => tab.id)).toEqual(["majoor-assets"]); + + mod.teardownNativeAssetsTab(); + expect(tabs.map((tab) => tab.id)).toContain("assets"); + }); + + it("is a no-op on hosts without getSidebarTabs", async () => { + const mod = await load({ extensionManager: {} }); + expect(() => mod.setNativeAssetsTabHidden(true)).not.toThrow(); + expect(mod.getHiddenNativeAssetsTabIds()).toEqual([]); + mod.teardownNativeAssetsTab(); + }); +}); diff --git a/ui/tests/node_stream_controller.vitest.ts b/ui/tests/node_stream_controller.vitest.ts index 4e14cd01..1c3f8132 100644 --- a/ui/tests/node_stream_controller.vitest.ts +++ b/ui/tests/node_stream_controller.vitest.ts @@ -3,9 +3,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; beforeEach(() => { vi.resetModules(); vi.useFakeTimers(); - globalThis.window = { - location: { href: "http://localhost/" }, - }; + globalThis.window = ({ + location: ({ href: "http://localhost/" } as any), + } as any); }); afterEach(() => { @@ -126,12 +126,12 @@ describe("NodeStreamController", () => { it("streams the ImageOps preview canvas as a cached data URL and re-emits only on signature change", async () => { class MockCanvas {} - globalThis.HTMLCanvasElement = MockCanvas; + globalThis.HTMLCanvasElement = (MockCanvas as any); const canvas = new MockCanvas(); - canvas.width = 320; - canvas.height = 180; - canvas.toDataURL = vi.fn(() => "data:image/png;base64,preview"); + (canvas as any).width = 320; + (canvas as any).height = 180; + (canvas as any).toDataURL = vi.fn(() => "data:image/png;base64,preview"); const onOutput = vi.fn(); const node = { @@ -170,19 +170,19 @@ describe("NodeStreamController", () => { _source: "imageops-live-preview", }), ); - expect(canvas.toDataURL).toHaveBeenCalledTimes(1); + expect((canvas as any).toDataURL).toHaveBeenCalledTimes(1); // Same signature → no re-emit and no re-encode. onOutput.mockClear(); await vi.advanceTimersByTimeAsync(250); expect(onOutput).not.toHaveBeenCalled(); - expect(canvas.toDataURL).toHaveBeenCalledTimes(1); + expect((canvas as any).toDataURL).toHaveBeenCalledTimes(1); // Signature changes → emit + encode again. node.__imageops_state.lastKey = "render-b"; await vi.advanceTimersByTimeAsync(250); expect(onOutput).toHaveBeenCalledTimes(1); - expect(canvas.toDataURL).toHaveBeenCalledTimes(2); + expect((canvas as any).toDataURL).toHaveBeenCalledTimes(2); mod.teardownNodeStream(app); }); @@ -228,7 +228,7 @@ describe("NodeStreamController", () => { mod.setNodeStreamActive(true); await vi.advanceTimersByTimeAsync(200); - app.canvas.selected_nodes = {}; + app.canvas.selected_nodes = ({} as any); await vi.advanceTimersByTimeAsync(200); expect(onStatus).toHaveBeenLastCalledWith("", ""); diff --git a/ui/tests/open_majoor_settings.vitest.ts b/ui/tests/open_majoor_settings.vitest.ts index 5db791d9..f82d6310 100644 --- a/ui/tests/open_majoor_settings.vitest.ts +++ b/ui/tests/open_majoor_settings.vitest.ts @@ -63,7 +63,7 @@ describe("openMajoorSettings", () => { expect(document.querySelector(".mjr-settings-group-meta")?.textContent).toBe( "2 settings", ); - expect(document.querySelector(".mjr-settings-group")?.open).toBe(false); + expect((document.querySelector(".mjr-settings-group") as any)?.open).toBe(false); expect(document.querySelector(".mjr-settings-name")?.textContent).toBe( "Show metadata panel", ); @@ -76,7 +76,7 @@ describe("openMajoorSettings", () => { openMajoorSettings({}); const checkbox = document.querySelector("input[type='checkbox']"); - checkbox.checked = false; + (checkbox as any).checked = false; checkbox.dispatchEvent(new Event("change", { bubbles: true })); expect(definitions[0].onChange).toHaveBeenCalledWith(false); @@ -102,7 +102,7 @@ describe("openMajoorSettings", () => { openMajoorSettings({}); const checkbox = document.querySelector("input[type='checkbox']"); - checkbox.checked = false; + (checkbox as any).checked = false; checkbox.dispatchEvent(new Event("change", { bubbles: true })); await Promise.resolve(); @@ -119,13 +119,13 @@ describe("openMajoorSettings", () => { openMajoorSettings({}); const search = document.querySelector(".mjr-settings-search"); - search.value = "card size"; + (search as any).value = "card size"; search.dispatchEvent(new Event("input", { bubbles: true })); const names = Array.from(document.querySelectorAll(".mjr-settings-name")).map((el) => el.textContent, ); expect(names).toEqual(["Card Size"]); - expect(document.querySelector(".mjr-settings-group")?.open).toBe(true); + expect((document.querySelector(".mjr-settings-group") as any)?.open).toBe(true); }); }); diff --git a/ui/tests/panel_cleanup_contract.vitest.ts b/ui/tests/panel_cleanup_contract.vitest.ts index 4b1a71d0..04ac524d 100644 --- a/ui/tests/panel_cleanup_contract.vitest.ts +++ b/ui/tests/panel_cleanup_contract.vitest.ts @@ -112,7 +112,7 @@ describe("panel cleanup contract", () => { const obj = {}; let threw = false; try { - obj?.dispose?.(); + (obj as any)?.dispose?.(); } catch { threw = true; } diff --git a/ui/tests/panel_hotkeys.vitest.ts b/ui/tests/panel_hotkeys.vitest.ts index 349e3608..469ec10d 100644 --- a/ui/tests/panel_hotkeys.vitest.ts +++ b/ui/tests/panel_hotkeys.vitest.ts @@ -27,7 +27,7 @@ function createWindowStub() { dispatchEvent(event) { const handlers = Array.from(listeners.get(event?.type) || []); for (const handler of handlers) { - handler(event); + (handler as any)(event); } return true; }, @@ -48,7 +48,7 @@ function createBoundElement() { emit(type, event = {}) { const handlers = Array.from(listeners.get(type) || []); for (const handler of handlers) { - handler(event); + (handler as any)(event); } }, contains(target) { @@ -72,11 +72,11 @@ function createKeyEvent(key, target = null, extras = {}) { } beforeEach(() => { - globalThis.window = createWindowStub(); + globalThis.window = createWindowStub() as any; globalThis.document = { - body: { nodeName: "BODY" }, + body: { nodeName: "BODY" } as any, activeElement: null, - }; + } as any; panelRuntimeState.activeGrid = null; setHotkeysSuspended(false); setHotkeysScope(null); @@ -92,7 +92,7 @@ describe("panelHotkeysController", () => { boundEl.emit("mouseenter"); const event = createKeyEvent("v", null, { ctrlKey: true }); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).not.toHaveBeenCalled(); expect(event.preventDefault).not.toHaveBeenCalled(); @@ -104,14 +104,14 @@ describe("panelHotkeysController", () => { const onToggleFloatingViewer = vi.fn(); const controller = createPanelHotkeysController({ onToggleFloatingViewer }); const boundEl = createBoundElement(); - boundEl.isConnected = true; + (boundEl as any).isConnected = true; controller.bind(boundEl); boundEl.emit("mouseenter"); - document.activeElement = document.body; + (document as any).activeElement = document.body; const event = createKeyEvent("v"); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).toHaveBeenCalledTimes(1); expect(event.preventDefault).toHaveBeenCalledTimes(1); @@ -121,13 +121,13 @@ describe("panelHotkeysController", () => { const onToggleFloatingViewer = vi.fn(); const controller = createPanelHotkeysController({ onToggleFloatingViewer }); const boundEl = createBoundElement(); - boundEl.isConnected = true; + (boundEl as any).isConnected = true; controller.bind(boundEl); - document.activeElement = document.body; + (document as any).activeElement = document.body; const event = createKeyEvent("v"); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).not.toHaveBeenCalled(); expect(event.preventDefault).not.toHaveBeenCalled(); @@ -148,7 +148,7 @@ describe("panelHotkeysController", () => { closest: vi.fn(() => ({ tagName: "INPUT" })), }; const event = createKeyEvent("v", target, { ctrlKey: true }); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).not.toHaveBeenCalled(); expect(event.preventDefault).not.toHaveBeenCalled(); @@ -163,7 +163,7 @@ describe("panelHotkeysController", () => { boundEl.emit("mouseenter"); const event = createKeyEvent("v", null, { ctrlKey: true, shiftKey: true }); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(onToggleFloatingViewer).not.toHaveBeenCalled(); expect(event.preventDefault).not.toHaveBeenCalled(); @@ -176,15 +176,15 @@ describe("panelHotkeysController", () => { contains: vi.fn((target) => target === document.body), }; panelRuntimeState.activeGrid = activeGrid; - boundEl.isConnected = true; + (boundEl as any).isConnected = true; controller.bind(boundEl); - document.activeElement = document.body; + (document as any).activeElement = document.body; const event = createKeyEvent("ArrowRight", { closest: vi.fn(() => activeGrid), }); - window.dispatchEvent({ type: "keydown", ...event }); + window.dispatchEvent({ type: "keydown", ...event } as any); expect(event.preventDefault).not.toHaveBeenCalled(); expect(event.stopPropagation).not.toHaveBeenCalled(); diff --git a/ui/tests/panel_primevue_controls.vitest.ts b/ui/tests/panel_primevue_controls.vitest.ts index 9609503d..85fed07a 100644 --- a/ui/tests/panel_primevue_controls.vitest.ts +++ b/ui/tests/panel_primevue_controls.vitest.ts @@ -255,13 +255,13 @@ describe("PrimeVue-backed panel controls", () => { expect(wrapper.vm.minSizeInput).toBeInstanceOf(HTMLInputElement); expect(wrapper.vm.maxSizeInput).toBeInstanceOf(HTMLInputElement); - wrapper.vm.minSizeInput.value = "2.5"; - wrapper.vm.maxSizeInput.value = "1"; - wrapper.vm.minSizeInput.dispatchEvent(new Event("change", { bubbles: true })); + (wrapper.vm.minSizeInput as any).value = "2.5"; + (wrapper.vm.maxSizeInput as any).value = "1"; + (wrapper.vm.minSizeInput as any).dispatchEvent(new Event("change", { bubbles: true })); expect(panelStore.minSizeMB).toBe(2.5); expect(panelStore.maxSizeMB).toBe(2.5); - expect(wrapper.vm.maxSizeInput.value).toBe("2.5"); + expect((wrapper.vm.maxSizeInput as any).value).toBe("2.5"); expect(filterEvents.length).toBeGreaterThan(0); window.removeEventListener("mjr:filters-changed", listener); @@ -274,15 +274,15 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - expect(wrapper.vm.kindSelect.value).toBe(""); - expect(wrapper.vm.wfCheckbox.checked).toBe(false); + expect((wrapper.vm.kindSelect as any).value).toBe(""); + expect((wrapper.vm.wfCheckbox as any).checked).toBe(false); - wrapper.vm.kindSelect.value = "video"; - wrapper.vm.wfCheckbox.checked = true; - wrapper.vm.workflowTypeSelect.value = "i2i"; - wrapper.vm.ratingSelect.value = "4"; - wrapper.vm.resolutionPresetSelect.value = "fhd"; - wrapper.vm.dateRangeSelect.value = "today"; + (wrapper.vm.kindSelect as any).value = "video"; + (wrapper.vm.wfCheckbox as any).checked = true; + (wrapper.vm.workflowTypeSelect as any).value = "i2i"; + (wrapper.vm.ratingSelect as any).value = "4"; + (wrapper.vm.resolutionPresetSelect as any).value = "fhd"; + (wrapper.vm.dateRangeSelect as any).value = "today"; expect(panelStore.kindFilter).toBe("video"); expect(panelStore.workflowOnly).toBe(true); @@ -322,12 +322,12 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - wrapper.vm.dateExactInput.value = "2026-06-03"; - wrapper.vm.dateExactInput.dispatchEvent(new Event("change", { bubbles: true })); + (wrapper.vm.dateExactInput as any).value = "2026-06-03"; + (wrapper.vm.dateExactInput as any).dispatchEvent(new Event("change", { bubbles: true })); expect(panelStore.dateExactFilter).toBe("2026-06-03"); expect(panelStore.dateRangeFilter).toBe(""); - expect(wrapper.vm.dateRangeSelect.value).toBe(""); + expect((wrapper.vm.dateRangeSelect as any).value).toBe(""); wrapper.unmount(); }); @@ -386,21 +386,21 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - expect(wrapper.vm.customSelect.value).toBe(""); - expect(wrapper.vm.customSelect.options).toHaveLength(1); + expect((wrapper.vm.customSelect as any).value).toBe(""); + expect((wrapper.vm.customSelect as any).options).toHaveLength(1); expect(wrapper.vm.customAddBtn).toBeInstanceOf(HTMLButtonElement); expect(wrapper.vm.customRemoveBtn).toBeInstanceOf(HTMLButtonElement); - expect(wrapper.vm.customRemoveBtn.disabled).toBe(true); + expect((wrapper.vm.customRemoveBtn as any).disabled).toBe(true); const option = document.createElement("option"); option.value = "root-a"; option.textContent = "Root A"; - wrapper.vm.customSelect.innerHTML = ""; - wrapper.vm.customSelect.appendChild(option); - wrapper.vm.customSelect.value = "root-a"; + (wrapper.vm.customSelect as any).innerHTML = ""; + (wrapper.vm.customSelect as any).appendChild(option); + (wrapper.vm.customSelect as any).value = "root-a"; - expect(wrapper.vm.customSelect.selectedIndex).toBe(0); - expect(wrapper.vm.customSelect.selectedOptions[0].text).toBe("Root A"); + expect((wrapper.vm.customSelect as any).selectedIndex).toBe(0); + expect((wrapper.vm.customSelect as any).selectedOptions[0].text).toBe("Root A"); wrapper.unmount(); }); @@ -429,7 +429,7 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - wrapper.vm.setPinnedFolders({ + (wrapper.vm as any).setPinnedFolders({ roots: [{ id: "root-a", label: "Root A", path: "C:/assets/root-a" }], emptyLabel: "No pinned folders", unpinLabel: "Unpin folder", @@ -468,7 +468,7 @@ describe("PrimeVue-backed panel controls", () => { global: { stubs: GLOBAL_STUBS }, }); - wrapper.vm.setFolderBreadcrumb({ + (wrapper.vm as any).setFolderBreadcrumb({ visible: true, back: { label: "Back", disabled: false, onClick: back }, up: { label: "Up", disabled: true, onClick: vi.fn() }, diff --git a/ui/tests/pending_generated_assets.vitest.ts b/ui/tests/pending_generated_assets.vitest.ts index b46d91b1..74a779ac 100644 --- a/ui/tests/pending_generated_assets.vitest.ts +++ b/ui/tests/pending_generated_assets.vitest.ts @@ -3,7 +3,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; describe("pendingGeneratedAssets", () => { beforeEach(() => { vi.resetModules(); - globalThis.window = {}; + globalThis.window = {} as any; }); it("tracks and consumes generated assets waiting for panel reload", async () => { @@ -14,9 +14,9 @@ describe("pendingGeneratedAssets", () => { mod.markPendingGeneratedAsset(5); expect(mod.getPendingGeneratedAssetCount()).toBe(6); - expect(globalThis.window.__mjrPendingGeneratedAssetCount).toBe(6); + expect((globalThis.window as any).__mjrPendingGeneratedAssetCount).toBe(6); expect(mod.consumePendingGeneratedAssets()).toBe(6); expect(mod.getPendingGeneratedAssetCount()).toBe(0); - expect(globalThis.window.__mjrPendingGeneratedAssetCount).toBe(0); + expect((globalThis.window as any).__mjrPendingGeneratedAssetCount).toBe(0); }); }); diff --git a/ui/tests/popover_manager.vitest.ts b/ui/tests/popover_manager.vitest.ts index 594dfbf7..9fc287c2 100644 --- a/ui/tests/popover_manager.vitest.ts +++ b/ui/tests/popover_manager.vitest.ts @@ -8,22 +8,22 @@ import { class FakeElement extends EventTarget { constructor() { super(); - this.style = {}; - this.id = ""; - this.className = ""; - this.attributes = {}; - this.queryMap = new Map(); - this.parentNode = null; - this.parentElement = null; - this.nextSibling = null; - this.children = []; - this.scrollTop = 0; - this.scrollLeft = 0; - this.scrollHeight = 0; - this.scrollWidth = 0; - this.clientHeight = 0; - this.clientWidth = 0; - this.classList = { + (this as any).style = {}; + (this as any).id = ""; + (this as any).className = ""; + (this as any).attributes = {}; + (this as any).queryMap = new Map(); + (this as any).parentNode = null; + (this as any).parentElement = null; + (this as any).nextSibling = null; + (this as any).children = []; + (this as any).scrollTop = 0; + (this as any).scrollLeft = 0; + (this as any).scrollHeight = 0; + (this as any).scrollWidth = 0; + (this as any).clientHeight = 0; + (this as any).clientWidth = 0; + (this as any).classList = { add: vi.fn(), remove: vi.fn(), }; @@ -32,7 +32,7 @@ class FakeElement extends EventTarget { appendChild(child) { child.parentNode = this; child.parentElement = this; - this.children.push(child); + (this as any).children.push(child); return child; } @@ -40,30 +40,30 @@ class FakeElement extends EventTarget { child.parentNode = this; child.parentElement = this; child.nextSibling = nextSibling ?? null; - this.children.push(child); + (this as any).children.push(child); return child; } contains(target) { if (target === this) return true; - return this.children.includes(target); + return (this as any).children.includes(target); } getAttribute(name) { - return this.attributes[name] ?? null; + return (this as any).attributes[name] ?? null; } setAttribute(name, value) { - this.attributes[name] = String(value); + (this as any).attributes[name] = String(value); } matches(selector) { - if (selector.includes("[data-pc-name]") && this.attributes["data-pc-name"]) return true; - if (selector.includes("[role='listbox']") && this.attributes.role === "listbox") return true; - if (selector.includes("[role='dialog']") && this.attributes.role === "dialog") return true; - if (selector.includes("[role='menu']") && this.attributes.role === "menu") return true; - if (selector.includes("[role='tree']") && this.attributes.role === "tree") return true; - if (selector.includes("[role='grid']") && this.attributes.role === "grid") return true; + if (selector.includes("[data-pc-name]") && (this as any).attributes["data-pc-name"]) return true; + if (selector.includes("[role='listbox']") && (this as any).attributes.role === "listbox") return true; + if (selector.includes("[role='dialog']") && (this as any).attributes.role === "dialog") return true; + if (selector.includes("[role='menu']") && (this as any).attributes.role === "menu") return true; + if (selector.includes("[role='tree']") && (this as any).attributes.role === "tree") return true; + if (selector.includes("[role='grid']") && (this as any).attributes.role === "grid") return true; return false; } @@ -71,13 +71,13 @@ class FakeElement extends EventTarget { let el = this; while (el) { if (typeof el.matches === "function" && el.matches(selector)) return el; - el = el.parentElement; + el = (el as any).parentElement; } return null; } querySelector(selector) { - return this.queryMap.get(selector) || null; + return (this as any).queryMap.get(selector) || null; } getBoundingClientRect() { @@ -96,34 +96,34 @@ describe("popoverManager", () => { let docTarget; beforeEach(() => { - globalThis.HTMLElement = FakeElement; - globalThis.getComputedStyle = (el) => ({ - overflow: el.style.overflow || "", - overflowX: el.style.overflowX || "", - overflowY: el.style.overflowY || "", - }); + globalThis.HTMLElement = (FakeElement as any); + globalThis.getComputedStyle = (((el) => ({ + overflow: (el as any).style.overflow || "", + overflowX: (el as any).style.overflowX || "", + overflowY: (el as any).style.overflowY || "", + })) as any); globalThis.requestAnimationFrame = (cb) => { - cb(); + (cb as any)(); return 1; }; globalThis.cancelAnimationFrame = () => {}; - globalThis.ResizeObserver = class { + globalThis.ResizeObserver = (class { observe() {} disconnect() {} - }; + } as any); docTarget = new EventTarget(); const body = new FakeElement(); - globalThis.document = { - body, + globalThis.document = ({ + body: body as any, addEventListener: docTarget.addEventListener.bind(docTarget), removeEventListener: docTarget.removeEventListener.bind(docTarget), - }; + } as any); const winTarget = new EventTarget(); - winTarget.innerWidth = 1280; - winTarget.innerHeight = 900; - globalThis.window = winTarget; + (winTarget as any).innerWidth = 1280; + (winTarget as any).innerHeight = 900; + globalThis.window = (winTarget as any); }); it("captures wheel scrolling inside a popover and scrolls the popover itself", () => { @@ -133,10 +133,10 @@ describe("popoverManager", () => { const parent = new FakeElement(); parent.appendChild(popover); - popover.scrollHeight = 900; - popover.clientHeight = 200; - popover.scrollWidth = 300; - popover.clientWidth = 300; + (popover as any).scrollHeight = 900; + (popover as any).clientHeight = 200; + (popover as any).scrollWidth = 300; + (popover as any).clientWidth = 300; const manager = createPopoverManager(container); manager.open(popover, anchor); @@ -149,7 +149,7 @@ describe("popoverManager", () => { popover.dispatchEvent(event); - expect(popover.scrollTop).toBe(120); + expect((popover as any).scrollTop).toBe(120); expect(event.defaultPrevented).toBe(true); expect(stopPropagation).toHaveBeenCalled(); }); @@ -161,10 +161,10 @@ describe("popoverManager", () => { const parent = new FakeElement(); parent.appendChild(popover); - popover.scrollHeight = 900; - popover.clientHeight = 200; - popover.scrollWidth = 300; - popover.clientWidth = 300; + (popover as any).scrollHeight = 900; + (popover as any).clientHeight = 200; + (popover as any).scrollWidth = 300; + (popover as any).clientWidth = 300; const appendSpy = vi.spyOn(globalThis.document.body, "appendChild"); const manager = createPopoverManager(container); @@ -193,19 +193,19 @@ describe("popoverManager", () => { const parent = new FakeElement(); const appRoot = new FakeElement(); parent.appendChild(popover); - globalThis.document.body.appendChild(appRoot); + globalThis.document.body.appendChild((appRoot as any)); - popover.queryMap.set("[data-pc-name][aria-expanded='true']", {}); + (popover as any).queryMap.set("[data-pc-name][aria-expanded='true']", {}); const manager = createPopoverManager(container); manager.open(popover, anchor); - popover.style.display = "block"; + (popover as any).style.display = "block"; const event = new Event("mousedown", { bubbles: true }); Object.defineProperty(event, "target", { value: appRoot }); docTarget.dispatchEvent(event); - expect(popover.style.display).toBe("none"); + expect((popover as any).style.display).toBe("none"); }); it("keeps an open popover when clicking a PrimeVue overlay portal owned by it", () => { @@ -214,21 +214,21 @@ describe("popoverManager", () => { const popover = new FakeElement(); const parent = new FakeElement(); const overlay = new FakeElement(); - overlay.className = "p-select-panel"; + (overlay as any).className = "p-select-panel"; parent.appendChild(popover); - globalThis.document.body.appendChild(overlay); + globalThis.document.body.appendChild((overlay as any)); - popover.queryMap.set("[data-pc-name][aria-expanded='true']", {}); + (popover as any).queryMap.set("[data-pc-name][aria-expanded='true']", {}); const manager = createPopoverManager(container); manager.open(popover, anchor); - popover.style.display = "block"; + (popover as any).style.display = "block"; const event = new Event("mousedown", { bubbles: true }); Object.defineProperty(event, "target", { value: overlay }); docTarget.dispatchEvent(event); - expect(popover.style.display).toBe("block"); + expect((popover as any).style.display).toBe("block"); }); it("notifies when popover visibility changes", () => { diff --git a/ui/tests/rating_tags_id_save.vitest.ts b/ui/tests/rating_tags_id_save.vitest.ts index cca76e42..2541e09d 100644 --- a/ui/tests/rating_tags_id_save.vitest.ts +++ b/ui/tests/rating_tags_id_save.vitest.ts @@ -61,7 +61,7 @@ describe("ID save-back after successful rating/tag update", () => { it("saves DB id when asset.id is undefined", () => { const asset = { filepath: "/output/img.png" }; applyIdSaveBack(asset, 456); - expect(asset.id).toBe(456); + expect((asset as any).id).toBe(456); }); it("saves DB id when asset.id is a synthetic string", () => { diff --git a/ui/tests/register_realtime_listeners.vitest.ts b/ui/tests/register_realtime_listeners.vitest.ts index 64e90069..7c27e183 100644 --- a/ui/tests/register_realtime_listeners.vitest.ts +++ b/ui/tests/register_realtime_listeners.vitest.ts @@ -10,19 +10,19 @@ import { function ensureBrowserShims() { if (typeof globalThis.CustomEvent === "undefined") { - globalThis.CustomEvent = class CustomEvent { + globalThis.CustomEvent = (class CustomEvent { constructor(type, init = {}) { - this.type = type; - this.detail = init.detail; + (this as any).type = type; + (this as any).detail = (init as any).detail; } - }; + } as any); } if (typeof globalThis.window === "undefined") { - globalThis.window = { + globalThis.window = ({ dispatchEvent: () => true, addEventListener: () => {}, removeEventListener: () => {}, - }; + } as any); } } @@ -98,7 +98,7 @@ describe("registerRealtimeListeners", () => { type: "output", }; - harness.api._mjrAssetIndexedHandler({ detail }); + (harness.api as any)._mjrAssetIndexedHandler({ detail }); expect(harness.pushGeneratedAsset).toHaveBeenCalledTimes(1); expect(harness.upsertAsset).toHaveBeenCalledTimes(1); @@ -132,7 +132,7 @@ describe("registerRealtimeListeners", () => { registerCleanableListener: () => {}, }); - harness.api._mjrAssetIndexedHandler({ + (harness.api as any)._mjrAssetIndexedHandler({ detail: { id: 43, kind: "image", @@ -148,8 +148,8 @@ describe("registerRealtimeListeners", () => { it("upsert apres generation puis indexation sur la grille active", async () => { ensureBrowserShims(); - window.__mjrLastAssetUpsert = 0; - window.__mjrLastAssetUpsertCount = 0; + (window as any).__mjrLastAssetUpsert = 0; + (window as any).__mjrLastAssetUpsertCount = 0; const harness = createRuntimeHarness(); harness.grid.dataset = { mjrScope: "output", mjrQuery: "portrait" }; @@ -183,20 +183,20 @@ describe("registerRealtimeListeners", () => { }; // Phase generation live: pousse au feed mais n'upsert pas directement quand la query n'est pas "*". - harness.api._mjrAssetAddedHandler({ detail }); + (harness.api as any)._mjrAssetAddedHandler({ detail }); expect(harness.pushGeneratedAsset).toHaveBeenCalledTimes(1); expect(harness.upsertAsset).toHaveBeenCalledTimes(0); expect(getSidebarAssetBadgeCount()).toBe(0); // Phase indexation: l'asset final est upsert dans la grille active. - harness.api._mjrAssetIndexedHandler({ detail }); + (harness.api as any)._mjrAssetIndexedHandler({ detail }); expect(harness.pushGeneratedAsset).toHaveBeenCalledTimes(2); expect(harness.upsertAsset).toHaveBeenCalledTimes(1); expect(harness.upsertAsset).toHaveBeenCalledWith( harness.grid, expect.objectContaining(detail), ); - expect(Number(window.__mjrLastAssetUpsertCount || 0)).toBeGreaterThan(0); + expect(Number((window as any).__mjrLastAssetUpsertCount || 0)).toBeGreaterThan(0); expect(getSidebarAssetBadgeCount()).toBe(1); }); @@ -232,7 +232,7 @@ describe("registerRealtimeListeners", () => { type: "output", }; - harness.api._mjrAssetIndexedHandler({ detail }); + (harness.api as any)._mjrAssetIndexedHandler({ detail }); expect(harness.pushGeneratedAsset).toHaveBeenCalledTimes(1); expect(harness.pushGeneratedAsset).toHaveBeenCalledWith(expect.objectContaining(detail)); @@ -385,8 +385,8 @@ describe("registerRealtimeListeners", () => { syncExecutionBackendState, }); - harness.api._mjrExecutionStartHandler({ detail: { prompt_id: "job-1" } }); - harness.api._mjrExecutionEndHandler({ detail: { prompt_id: "job-1" } }); + (harness.api as any)._mjrExecutionStartHandler({ detail: { prompt_id: "job-1" } }); + (harness.api as any)._mjrExecutionEndHandler({ detail: { prompt_id: "job-1" } }); expect(syncExecutionBackendState).toHaveBeenNthCalledWith(1, { active: true, @@ -429,7 +429,7 @@ describe("registerRealtimeListeners", () => { registerCleanableListener: () => {}, }); - harness.api._mjrCoreExecutionAssetsReadyHandler({ + (harness.api as any)._mjrCoreExecutionAssetsReadyHandler({ detail: { prompt_id: "job-2", indexed: 2 }, }); } finally { diff --git a/ui/tests/security_client_headers.vitest.ts b/ui/tests/security_client_headers.vitest.ts index d86d128e..cf31e2a3 100644 --- a/ui/tests/security_client_headers.vitest.ts +++ b/ui/tests/security_client_headers.vitest.ts @@ -26,28 +26,28 @@ describe("api client security headers", () => { beforeEach(async () => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; const toastAdd = vi.fn(); globalThis.app = { ui: {}, extensionManager: { toast: { add: toastAdd } } }; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, + location: { origin: "http://localhost" } as any, app: globalThis.app, - }; + } as any; globalThis.CustomEvent = class { constructor(type, init) { - this.type = type; - this.detail = init?.detail; + (this as any).type = type; + (this as any).detail = init?.detail; } - }; + } as any; globalThis.fetch = vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: {} }), - })); + })) as any; client = await import("../api/client.js"); }); @@ -59,7 +59,7 @@ describe("api client security headers", () => { await client.post("/mjr/am/test", { foo: 1 }); // POST may trigger an auth bootstrap fetch before the actual request - const calls = globalThis.fetch.mock.calls; + const calls = (globalThis.fetch as any).mock.calls; const postCall = calls.find(([, opts]) => (opts?.method || "").toUpperCase() === "POST"); expect(postCall).toBeTruthy(); const xrw = readHeader(postCall[1].headers, "X-Requested-With"); @@ -70,7 +70,7 @@ describe("api client security headers", () => { await client.get("/mjr/am/test"); expect(globalThis.fetch).toHaveBeenCalledTimes(1); - const [, callOptions] = globalThis.fetch.mock.calls[0]; + const [, callOptions] = (globalThis.fetch as any).mock.calls[0]; const xrw = readHeader(callOptions.headers, "X-Requested-With"); expect(xrw).toBeNull(); }); @@ -82,7 +82,7 @@ describe("api client security headers", () => { await client.post("/mjr/am/test", {}); expect(globalThis.fetch).toHaveBeenCalledTimes(1); - const [, callOptions] = globalThis.fetch.mock.calls[0]; + const [, callOptions] = (globalThis.fetch as any).mock.calls[0]; const mjrToken = readHeader(callOptions.headers, "X-MJR-Token"); const authHeader = readHeader(callOptions.headers, "Authorization"); expect(mjrToken).toBe(token); @@ -95,7 +95,7 @@ describe("api client security headers", () => { await client.post("/mjr/am/test", {}); - const [, callOptions] = globalThis.fetch.mock.calls[0]; + const [, callOptions] = (globalThis.fetch as any).mock.calls[0]; const cookie = readHeader(callOptions.headers, "Cookie"); expect(cookie).toBeNull(); }); @@ -106,7 +106,7 @@ describe("api client security headers", () => { await client.get("/mjr/am/assets?page=1"); - const [callUrl] = globalThis.fetch.mock.calls[0]; + const [callUrl] = (globalThis.fetch as any).mock.calls[0]; expect(String(callUrl)).not.toContain(token); }); }); diff --git a/ui/tests/security_deep_merge.vitest.ts b/ui/tests/security_deep_merge.vitest.ts index 599fe312..8e9cab77 100644 --- a/ui/tests/security_deep_merge.vitest.ts +++ b/ui/tests/security_deep_merge.vitest.ts @@ -7,8 +7,8 @@ describe("deepMerge prototype-pollution resistance", () => { const malicious = JSON.parse('{"__proto__": {"polluted": true}}'); const merged = deepMerge(base, malicious); - expect(merged.polluted).toBeUndefined(); - expect({}.polluted).toBeUndefined(); + expect((merged as any).polluted).toBeUndefined(); + expect(({} as any).polluted).toBeUndefined(); expect(merged.a).toBe(1); }); @@ -18,7 +18,7 @@ describe("deepMerge prototype-pollution resistance", () => { const merged = deepMerge(base, malicious); expect(Object.hasOwn(merged, "constructor")).toBe(false); - expect({}.polluted).toBeUndefined(); + expect(({} as any).polluted).toBeUndefined(); }); it("rejects prototype key in the merge source", () => { @@ -26,7 +26,7 @@ describe("deepMerge prototype-pollution resistance", () => { const malicious = { prototype: { polluted: true } }; const merged = deepMerge(base, malicious); - expect(merged.prototype).toBeUndefined(); + expect((merged as any).prototype).toBeUndefined(); }); it("rejects nested __proto__ keys recursively", () => { @@ -34,14 +34,14 @@ describe("deepMerge prototype-pollution resistance", () => { const malicious = { nested: JSON.parse('{"__proto__": {"deep": true}}') }; const merged = deepMerge(base, malicious); - expect(merged.nested.deep).toBeUndefined(); - expect({}.deep).toBeUndefined(); + expect((merged.nested as any).deep).toBeUndefined(); + expect(({} as any).deep).toBeUndefined(); }); it("performs normal deep merge for safe keys", () => { const base = { a: 1, nested: { x: 10 } }; const patch = { b: 2, nested: { y: 20 } }; - const merged = deepMerge(base, patch); + const merged = deepMerge(base, patch as any); expect(merged).toEqual({ a: 1, b: 2, nested: { x: 10, y: 20 } }); }); @@ -55,7 +55,7 @@ describe("deepMerge prototype-pollution resistance", () => { it("does not mutate the original base object", () => { const base = { a: 1, nested: { x: 10 } }; const patch = { nested: { y: 20 } }; - deepMerge(base, patch); + deepMerge(base, patch as any); expect(base).toEqual({ a: 1, nested: { x: 10 } }); }); diff --git a/ui/tests/security_runtime_state.vitest.ts b/ui/tests/security_runtime_state.vitest.ts index 864a8099..e4959bb2 100644 --- a/ui/tests/security_runtime_state.vitest.ts +++ b/ui/tests/security_runtime_state.vitest.ts @@ -20,7 +20,7 @@ describe("runtimeState prototype-pollution resistance", () => { const patch = JSON.parse('{"__proto__": {"polluted": true}}'); setRuntimeStatePatch(patch); - expect({}.polluted).toBeUndefined(); + expect(({} as any).polluted).toBeUndefined(); expect(Object.getPrototypeOf({})).toBe(proto); }); diff --git a/ui/tests/settings_mfv_persistence.vitest.ts b/ui/tests/settings_mfv_persistence.vitest.ts index e009470c..9f4e8b88 100644 --- a/ui/tests/settings_mfv_persistence.vitest.ts +++ b/ui/tests/settings_mfv_persistence.vitest.ts @@ -50,12 +50,12 @@ describe("MFV settings persistence", () => { beforeEach(() => { vi.resetModules(); globalThis.window = { - localStorage: createStorage(), + localStorage: createStorage() as any, addEventListener: vi.fn(), - }; + } as any; globalThis.document = { - querySelectorAll: vi.fn(() => []), - }; + querySelectorAll: vi.fn(() => []) as any, + } as any; }); it("persists MFV stream and KJNodes preview defaults across reload-style reads", async () => { diff --git a/ui/tests/settings_panel.vitest.ts b/ui/tests/settings_panel.vitest.ts index d22442e3..23ba5f3f 100644 --- a/ui/tests/settings_panel.vitest.ts +++ b/ui/tests/settings_panel.vitest.ts @@ -112,7 +112,7 @@ describe("SettingsPanel", () => { watcher: { enabled: true }, grid: { sample: false }, }; - globalThis.window = createWindow(); + globalThis.window = createWindow() as any; }); it("builds normalized settings definitions without runtime bootstrap", async () => { diff --git a/ui/tests/settings_runtime.vitest.ts b/ui/tests/settings_runtime.vitest.ts index 87a8c18d..17be16b5 100644 --- a/ui/tests/settings_runtime.vitest.ts +++ b/ui/tests/settings_runtime.vitest.ts @@ -48,7 +48,7 @@ function createElement(tagName, registry) { function createDocument() { const registry = new Map(); const host = createElement("div", registry); - host.className = "mjr-assets-manager mjr-am-container"; + (host as any).className = "mjr-assets-manager mjr-am-container"; return { host, createElement: (tagName) => createElement(tagName, registry), @@ -77,7 +77,7 @@ describe("settingsRuntime", () => { vi.resetModules(); vi.clearAllMocks(); const document = createDocument(); - globalThis.document = document; + globalThis.document = document as any; globalThis.window = { __MJR_RUNTIME_STATUS_INTERVAL__: null, __MJR_RUNTIME_STATUS_INFLIGHT__: null, @@ -85,15 +85,15 @@ describe("settingsRuntime", () => { __MJR_RUNTIME_STATUS_HIDE_TIMEOUT__: null, __MJR_RUNTIME_STATUS_HIDDEN__: null, __MJR_RUNTIME_STATUS_SETTINGS_LISTENER__: null, - localStorage: createLocalStorage(), + localStorage: createLocalStorage() as any, addEventListener: vi.fn(), - }; + } as any; globalThis.sessionStorage = { getItem: vi.fn(() => "token_1234567890abcd"), - }; + } as any; hasRuntimeSecurityToken.mockReturnValue(true); - globalThis.getComputedStyle = vi.fn(() => ({ position: "static" })); - globalThis.setInterval = vi.fn(() => 1); + globalThis.getComputedStyle = vi.fn(() => ({ position: "static" })) as any; + globalThis.setInterval = vi.fn(() => 1) as any; globalThis.clearInterval = vi.fn(); }); @@ -125,11 +125,11 @@ describe("settingsRuntime", () => { const dashboard = globalThis.document.getElementById("mjr-runtime-status-dashboard"); expect(dashboard).toBeTruthy(); - expect(dashboard.__mjrMetricsLine.textContent).toBe( + expect((dashboard as any).__mjrMetricsLine.textContent).toBe( "DB active: 3 | Enrich Q: 4 | Watcher pending: 5", ); - expect(dashboard.__mjrAuthLine.textContent).toBe("Write auth: active ...abcd"); - expect(dashboard.__mjrAuthLine.style.color).toBe("#7ee0a0"); + expect((dashboard as any).__mjrAuthLine.textContent).toBe("Write auth: active ...abcd"); + expect((dashboard as any).__mjrAuthLine.style.color).toBe("#7ee0a0"); }); it("does not render the dashboard when the setting is hidden", async () => { @@ -142,7 +142,7 @@ describe("settingsRuntime", () => { }, }, }), - }); + }) as any; const mod = await import("../app/settings/settingsRuntime.js"); mod.startRuntimeStatusDashboard(); diff --git a/ui/tests/settings_security.vitest.ts b/ui/tests/settings_security.vitest.ts index 480b60c6..2589f07d 100644 --- a/ui/tests/settings_security.vitest.ts +++ b/ui/tests/settings_security.vitest.ts @@ -36,10 +36,10 @@ describe("settingsSecurity recommended remote LAN preset", () => { vi.resetModules(); vi.unstubAllGlobals(); vi.clearAllMocks(); - globalThis.location = { + globalThis.location = ({ protocol: "http:", hostname: "192.168.1.10", - }; + } as any); vi.stubGlobal("crypto", { getRandomValues: vi.fn((buffer) => { for (let index = 0; index < buffer.length; index += 1) { @@ -107,7 +107,7 @@ describe("settingsSecurity recommended remote LAN preset", () => { allow_insecure_token_transport: true, }), ); - expect(String(settings.security.apiToken)).toMatch(/^mjr_[0-9a-f]+$/); + expect(String((settings.security as any).apiToken)).toMatch(/^mjr_[0-9a-f]+$/); expect(notifyApplied).toHaveBeenCalledWith("security.remoteLanPreset"); expect(notifyApplied).toHaveBeenCalledWith("security.apiToken"); expect(syncBackendSecuritySettings).toHaveBeenCalledTimes(1); diff --git a/ui/tests/settings_store.vitest.ts b/ui/tests/settings_store.vitest.ts index 6d71688a..96a78e27 100644 --- a/ui/tests/settings_store.vitest.ts +++ b/ui/tests/settings_store.vitest.ts @@ -26,9 +26,9 @@ function createStorage() { describe("SettingsStore (Vitest)", () => { it("reads and writes settings through localStorage wrapper", () => { globalThis.window = { - localStorage: createStorage(), + localStorage: createStorage() as any, addEventListener() {}, - }; + } as any; expect(SettingsStore.get("missing")).toBe(null); expect(SettingsStore.set("k", "v")).toBe(true); diff --git a/ui/tests/sidebar_asset_badge.vitest.ts b/ui/tests/sidebar_asset_badge.vitest.ts index 67896a92..9d463cf9 100644 --- a/ui/tests/sidebar_asset_badge.vitest.ts +++ b/ui/tests/sidebar_asset_badge.vitest.ts @@ -58,12 +58,12 @@ describe("sidebarAssetBadge", () => { beforeEach(() => { vi.resetModules(); vi.useFakeTimers(); - globalThis.document = createDocument(); + globalThis.document = (createDocument() as any); globalThis.requestAnimationFrame = (fn) => { - fn(); + (fn as any)(); return 1; }; - globalThis.CSS = { escape: (value) => String(value) }; + globalThis.CSS = ({ escape: (value) => String(value) } as any); }); it("increments, deduplicates by asset id, and resets the sidebar badge", async () => { @@ -77,12 +77,12 @@ describe("sidebarAssetBadge", () => { mod.incrementSidebarAssetBadge({ id: 2 }); expect(mod.getSidebarAssetBadgeCount()).toBe(2); - expect(globalThis.document._tab.querySelector(":scope > .mjr-sidebar-asset-badge").textContent).toBe("2"); + expect((globalThis.document as any)._tab.querySelector(":scope > .mjr-sidebar-asset-badge").textContent).toBe("2"); mod.resetSidebarAssetBadge(); expect(mod.getSidebarAssetBadgeCount()).toBe(0); - expect(globalThis.document._tab.querySelector(":scope > .mjr-sidebar-asset-badge")).toBeNull(); + expect((globalThis.document as any)._tab.querySelector(":scope > .mjr-sidebar-asset-badge")).toBeNull(); }); it("does not show the badge when the sidebar asset badge setting is disabled", async () => { @@ -94,7 +94,7 @@ describe("sidebarAssetBadge", () => { mod.incrementSidebarAssetBadge({ id: 1 }); expect(mod.getSidebarAssetBadgeCount()).toBe(0); - expect(globalThis.document._tab.querySelector(":scope > .mjr-sidebar-asset-badge")).toBeNull(); + expect((globalThis.document as any)._tab.querySelector(":scope > .mjr-sidebar-asset-badge")).toBeNull(); }); it("deduplicates indexed asset events by file identity when no asset id is available", async () => { diff --git a/ui/tests/sidebar_controller.vitest.ts b/ui/tests/sidebar_controller.vitest.ts index da467bbc..e562a418 100644 --- a/ui/tests/sidebar_controller.vitest.ts +++ b/ui/tests/sidebar_controller.vitest.ts @@ -6,28 +6,29 @@ import { usePanelStore } from "../stores/usePanelStore.js"; class ElementStub { constructor() { - this.listeners = new Map(); - this.dataset = {}; - this.style = {}; - this.parentElement = null; - this.children = []; - this.classList = { + (this as any).listeners = new Map(); + (this as any).dataset = {}; + (this as any).style = {}; + (this as any).parentElement = null; + (this as any).children = []; + (this as any).classList = { _set: new Set(), - add: (...names) => names.forEach((name) => this.classList._set.add(name)), - remove: (...names) => names.forEach((name) => this.classList._set.delete(name)), - contains: (name) => this.classList._set.has(name), + add: (...names) => names.forEach((name) => (this as any).classList._set.add(name)), + remove: (...names) => + names.forEach((name) => (this as any).classList._set.delete(name)), + contains: (name) => (this as any).classList._set.has(name), }; } addEventListener(type, handler) { - const list = this.listeners.get(type) || []; + const list = (this as any).listeners.get(type) || []; list.push(handler); - this.listeners.set(type, list); + (this as any).listeners.set(type, list); } removeEventListener(type, handler) { - const list = this.listeners.get(type) || []; - this.listeners.set( + const list = (this as any).listeners.get(type) || []; + (this as any).listeners.set( type, list.filter((item) => item !== handler), ); @@ -42,46 +43,52 @@ class ElementStub { /* ignore readonly event payloads */ } } - for (const handler of this.listeners.get(payload.type) || []) { + for (const handler of (this as any).listeners.get(payload.type) || []) { handler(payload); } } contains(target) { - return target === this || this.children.includes(target); + return target === this || (this as any).children.includes(target); } appendChild(child) { - this.children.push(child); + (this as any).children.push(child); child.parentElement = this; return child; } querySelector(selector) { if (selector === ".mjr-asset-card.is-selected") { - return this.children.find((child) => child.classList?.contains("is-selected")) || null; + return ( + (this as any).children.find((child) => child.classList?.contains("is-selected")) || + null + ); } if (selector.includes('[data-mjr-asset-id="')) { const id = selector.split('[data-mjr-asset-id="')[1]?.split('"')[0] || ""; return ( - this.children.find((child) => String(child.dataset?.mjrAssetId || "") === id) || - null + (this as any).children.find( + (child) => String(child.dataset?.mjrAssetId || "") === id, + ) || null ); } return null; } querySelectorAll(selector) { - if (selector === ".mjr-asset-card") return [...this.children]; + if (selector === ".mjr-asset-card") return [...(this as any).children]; if (selector === ".mjr-asset-card.is-selected") { - return this.children.filter((child) => child.classList?.contains("is-selected")); + return (this as any).children.filter((child) => + child.classList?.contains("is-selected"), + ); } return []; } closest(selector) { if (selector === ".mjr-asset-card") { - return this.classList.contains("mjr-asset-card") ? this : null; + return (this as any).classList.contains("mjr-asset-card") ? this : null; } if (selector === ".mjr-workflow-dot") return null; if (selector === "a, button, input, textarea, select, label") return null; @@ -97,13 +104,13 @@ class ElementStub { describe("sidebarController", () => { it("syncs selected asset ids into Pinia on card click", async () => { - globalThis.Element = ElementStub; + globalThis.Element = ElementStub as any; globalThis.ResizeObserver = class { observe() {} disconnect() {} - }; + } as any; globalThis.requestAnimationFrame = (callback) => { - callback(); + (callback as any)(); return 1; }; globalThis.cancelAnimationFrame = vi.fn(); @@ -113,11 +120,11 @@ describe("sidebarController", () => { const gridContainer = new ElementStub(); const scrollRoot = new ElementStub(); - gridContainer.parentElement = scrollRoot; + (gridContainer as any).parentElement = scrollRoot; const card = new ElementStub(); - card.classList.add("mjr-asset-card"); - card.dataset.mjrAssetId = "42"; - card._mjrAsset = { id: 42, filename: "cat.png" }; + (card as any).classList.add("mjr-asset-card"); + (card as any).dataset.mjrAssetId = "42"; + (card as any)._mjrAsset = { id: 42, filename: "cat.png" }; gridContainer.appendChild(card); const sidebar = new ElementStub(); diff --git a/ui/tests/sidebar_run_button_execution.vitest.ts b/ui/tests/sidebar_run_button_execution.vitest.ts index 8f26687a..703e8a0e 100644 --- a/ui/tests/sidebar_run_button_execution.vitest.ts +++ b/ui/tests/sidebar_run_button_execution.vitest.ts @@ -42,7 +42,7 @@ vi.mock("../app/i18n.js", () => ({ vi.mock("../features/viewer/floatingViewerProgress.js", () => ({ ensureFloatingViewerProgressTracking: (...args) => - state.ensureFloatingViewerProgressTracking(...args), + (state.ensureFloatingViewerProgressTracking as any)(...args), floatingViewerProgressService: state.progressService, })); @@ -86,7 +86,7 @@ describe("sidebarRunButton execution failures", () => { const handle = createRunButton(); const runBtn = handle.el.querySelector(".mjr-mfv-run-btn"); - runBtn.click(); + (runBtn as any).click(); await flushMicrotasks(); diff --git a/ui/tests/sidebar_run_button_live_sync.vitest.ts b/ui/tests/sidebar_run_button_live_sync.vitest.ts index a9760980..1cab92ae 100644 --- a/ui/tests/sidebar_run_button_live_sync.vitest.ts +++ b/ui/tests/sidebar_run_button_live_sync.vitest.ts @@ -125,8 +125,8 @@ describe("sidebar run button live sync", () => { ensureTrackingMock.mockClear(); globalThis.document = { - createElement: vi.fn((tag) => makeElement(tag)), - }; + createElement: vi.fn((tag) => makeElement(tag)) as any, + } as any; bridgeState.app = { rootGraph: { nodes: [{ type: "KSampler" }] }, @@ -150,8 +150,8 @@ describe("sidebar run button live sync", () => { const runBtn = handle.el.children[0]; const stopBtn = handle.el.children[1]; - expect(runBtn.disabled).toBe(false); - expect(stopBtn.disabled).toBe(true); + expect((runBtn as any).disabled).toBe(false); + expect((stopBtn as any).disabled).toBe(true); expect(ensureTrackingMock).toHaveBeenCalledTimes(1); progressService.dispatch({ @@ -159,16 +159,16 @@ describe("sidebar run button live sync", () => { prompt: { currentlyExecuting: { nodeId: "11" }, errorDetails: null }, }); - expect(runBtn.disabled).toBe(true); + expect((runBtn as any).disabled).toBe(true); expect(runBtn.classList.contains("running")).toBe(true); - expect(stopBtn.disabled).toBe(false); + expect((stopBtn as any).disabled).toBe(false); expect(stopBtn.classList.contains("active")).toBe(true); progressService.dispatch({ queue: 0, prompt: null }); - expect(runBtn.disabled).toBe(false); + expect((runBtn as any).disabled).toBe(false); expect(runBtn.classList.contains("running")).toBe(false); - expect(stopBtn.disabled).toBe(true); + expect((stopBtn as any).disabled).toBe(true); handle.dispose(); }); @@ -181,16 +181,16 @@ describe("sidebar run button live sync", () => { const runBtn = handle.el.children[0]; const stopBtn = handle.el.children[1]; - runBtn.click(); + (runBtn as any).click(); await Promise.resolve(); expect(bridgeState.app.graphToPrompt).toHaveBeenCalledTimes(1); expect(bridgeState.api.queuePrompt).toHaveBeenCalledTimes(1); - expect(runBtn.disabled).toBe(true); + expect((runBtn as any).disabled).toBe(true); expect(runBtn.classList.contains("running")).toBe(true); - expect(stopBtn.disabled).toBe(false); + expect((stopBtn as any).disabled).toBe(false); - stopBtn.click(); + (stopBtn as any).click(); await Promise.resolve(); expect(bridgeState.api.interrupt).toHaveBeenCalledTimes(1); @@ -198,9 +198,9 @@ describe("sidebar run button live sync", () => { progressService.dispatch({ queue: 0, prompt: null }); - expect(runBtn.disabled).toBe(false); + expect((runBtn as any).disabled).toBe(false); expect(runBtn.classList.contains("stopping")).toBe(false); - expect(stopBtn.disabled).toBe(true); + expect((stopBtn as any).disabled).toBe(true); handle.dispose(); }); @@ -216,7 +216,7 @@ describe("sidebar run button live sync", () => { const handle = createRunButton(); const runBtn = handle.el.children[0]; - runBtn.click(); + (runBtn as any).click(); await Promise.resolve(); expect(bridgeState.app.queuePrompt).toHaveBeenCalledWith(0); diff --git a/ui/tests/sidebar_workflow_section.vitest.ts b/ui/tests/sidebar_workflow_section.vitest.ts index 3a5603fa..e1634026 100644 --- a/ui/tests/sidebar_workflow_section.vitest.ts +++ b/ui/tests/sidebar_workflow_section.vitest.ts @@ -109,11 +109,11 @@ describe("SidebarWorkflowSection", () => { canvasToWorld: (x, y) => ({ x: 100 + Number(x), y: 200 + Number(y) }), hitTestNode: () => null, })); - globalThis.ResizeObserver = class { + globalThis.ResizeObserver = (class { observe() {} disconnect() {} - }; - globalThis.PointerEvent = globalThis.PointerEvent || MouseEvent; + } as any); + globalThis.PointerEvent = (globalThis.PointerEvent || MouseEvent as any); moveWorkflow.mockReset(); moveWorkflow.mockImplementation(async () => ({ ok: true, @@ -124,19 +124,19 @@ describe("SidebarWorkflowSection", () => { }, })); comfyToast.mockReset(); - window.app = { - canvas: { - canvas: { width: 1000, height: 800, clientWidth: 1000, clientHeight: 800 }, - ds: { scale: 1, offset: [0, 0] }, + window.app = ({ + canvas: ({ + canvas: ({ width: 1000, height: 800, clientWidth: 1000, clientHeight: 800 } as any), + ds: ({ scale: 1, offset: [0, 0] } as any), setDirty: vi.fn(), - }, - graph: { + } as any), + graph: ({ setDirtyCanvas: vi.fn(), - }, - }; - HTMLCanvasElement.prototype.getContext = vi.fn(() => ({ + } as any), + } as any); + HTMLCanvasElement.prototype.getContext = (vi.fn(() => ({ setTransform: vi.fn(), - })); + })) as any); }); it("shows workflow stats and persists size and label toggles", async () => { @@ -215,14 +215,14 @@ describe("SidebarWorkflowSection", () => { }); const canvas = wrapper.find("canvas"); - canvas.element.getBoundingClientRect = () => ({ + canvas.element.getBoundingClientRect = (() => ({ left: 10, top: 20, width: 320, height: 160, right: 330, bottom: 180, - }); + }) as any); await canvas.trigger("pointerdown", { button: 0, @@ -325,7 +325,7 @@ describe("SidebarWorkflowSection", () => { expect(categoryBlock?.text()).not.toContain("PROJECTS"); const input = wrapper.find('input[placeholder="Workflow category"]'); - expect(input.element.value).toBe("PROJECTS/PERSONAL/02_OUT/VIDEOS/260513/Atopi"); + expect((input.element as any).value).toBe("PROJECTS/PERSONAL/02_OUT/VIDEOS/260513/Atopi"); wrapper.unmount(); }); diff --git a/ui/tests/sort_controller.vitest.ts b/ui/tests/sort_controller.vitest.ts index bc8a9da3..fd32949a 100644 --- a/ui/tests/sort_controller.vitest.ts +++ b/ui/tests/sort_controller.vitest.ts @@ -54,13 +54,13 @@ function createElementStub() { describe("sortController", () => { it("syncs sort choice to Pinia and reloads the grid", async () => { globalThis.document = { - createElement: () => createElementStub(), - }; + createElement: () => createElementStub() as any, + } as any; setActivePinia(createPinia()); const panelStore = usePanelStore(); const sortBtn = createElementStub(); - sortBtn._icon = { className: "" }; + (sortBtn as any)._icon = { className: "" }; const sortMenu = createElementStub(); const sortPopover = { style: { display: "" } }; const popovers = { close: vi.fn(), toggle: vi.fn() }; @@ -77,7 +77,7 @@ describe("sortController", () => { }); controller.bind(); - expect(sortBtn._icon.className).toBe("pi pi-sort-amount-down"); + expect((sortBtn as any)._icon.className).toBe("pi pi-sort-amount-down"); const nameAscButton = sortMenu.children.find( (child) => child.children?.[0]?.textContent === "A-Z", @@ -85,7 +85,7 @@ describe("sortController", () => { await nameAscButton.dispatchEvent({ type: "click" }); expect(panelStore.sort).toBe("name_asc"); - expect(sortBtn._icon.className).toBe("pi pi-sort-alpha-down"); + expect((sortBtn as any)._icon.className).toBe("pi pi-sort-alpha-down"); expect(popovers.close).toHaveBeenCalledWith(sortPopover); expect(reloadGrid).toHaveBeenCalledTimes(1); }); diff --git a/ui/tests/stack_group_cards.vitest.ts b/ui/tests/stack_group_cards.vitest.ts index ccb24c46..576ffd47 100644 --- a/ui/tests/stack_group_cards.vitest.ts +++ b/ui/tests/stack_group_cards.vitest.ts @@ -51,7 +51,7 @@ describe("StackGroupCards overlay buttons", () => { const button = card.querySelector(".mjr-stack-group-button"); expect(button).toBeTruthy(); - expect(button.draggable).toBe(false); + expect((button as any).draggable).toBe(false); const cardMouseDown = vi.fn(); card.addEventListener("mousedown", cardMouseDown); @@ -117,7 +117,7 @@ describe("StackGroupCards overlay buttons", () => { button.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true })); expect(getMock).toHaveBeenCalledTimes(1); - expect(button.disabled).toBe(true); + expect((button as any).disabled).toBe(true); resolveFetch({ ok: true, @@ -130,7 +130,7 @@ describe("StackGroupCards overlay buttons", () => { await Promise.resolve(); expect(openStackGroup).toHaveBeenCalledTimes(1); - expect(button.disabled).toBe(false); + expect((button as any).disabled).toBe(false); }); it("skips imperative button creation for Vue cards (_mjrIsVue guard)", async () => { @@ -141,7 +141,7 @@ describe("StackGroupCards overlay buttons", () => { grid.dataset.mjrGroupStacks = "1"; const card = document.createElement("div"); card.className = "mjr-asset-card"; - card._mjrIsVue = true; + (card as any)._mjrIsVue = true; grid.appendChild(card); const asset = { diff --git a/ui/tests/tags_editor.vitest.ts b/ui/tests/tags_editor.vitest.ts index afad5f08..ac945a77 100644 --- a/ui/tests/tags_editor.vitest.ts +++ b/ui/tests/tags_editor.vitest.ts @@ -35,50 +35,50 @@ vi.mock("../utils/events.js", () => ({ class ElementStub { constructor(tagName) { - this.tagName = String(tagName || "").toUpperCase(); - this.children = []; - this.parentNode = null; - this.className = ""; - this.style = {}; - this.attributes = new Map(); - this.listeners = new Map(); - this.textContent = ""; - this.value = ""; - this.type = ""; - this.placeholder = ""; - this.disabled = false; - this.dataset = {}; - this.isConnected = true; + (this as any).tagName = String(tagName || "").toUpperCase(); + (this as any).children = []; + (this as any).parentNode = null; + (this as any).className = ""; + (this as any).style = {}; + (this as any).attributes = new Map(); + (this as any).listeners = new Map(); + (this as any).textContent = ""; + (this as any).value = ""; + (this as any).type = ""; + (this as any).placeholder = ""; + (this as any).disabled = false; + (this as any).dataset = {}; + (this as any).isConnected = true; } appendChild(child) { child.parentNode = this; - this.children.push(child); + (this as any).children.push(child); return child; } removeChild(child) { - const index = this.children.indexOf(child); + const index = (this as any).children.indexOf(child); if (index >= 0) { - this.children.splice(index, 1); + (this as any).children.splice(index, 1); child.parentNode = null; } return child; } setAttribute(name, value) { - this.attributes.set(String(name), String(value)); + (this as any).attributes.set(String(name), String(value)); } getAttribute(name) { - return this.attributes.get(String(name)); + return (this as any).attributes.get(String(name)); } addEventListener(type, handler) { const key = String(type); - const handlers = this.listeners.get(key) || []; + const handlers = (this as any).listeners.get(key) || []; handlers.push(handler); - this.listeners.set(key, handlers); + (this as any).listeners.set(key, handlers); } dispatchEvent(event) { @@ -94,7 +94,7 @@ class ElementStub { }); payload.stopPropagation = payload.stopPropagation || (() => {}); - for (const handler of this.listeners.get(payload.type) || []) { + for (const handler of (this as any).listeners.get(payload.type) || []) { handler(payload); } return !payload.defaultPrevented; @@ -122,7 +122,7 @@ class ElementStub { } set innerHTML(_value) { - this.children = []; + (this as any).children = []; } } @@ -161,8 +161,8 @@ describe("TagsEditor", () => { eventsMock.safeDispatchCustomEvent.mockReset(); globalThis.document = { - createElement: vi.fn((tagName) => new ElementStub(tagName)), - }; + createElement: vi.fn((tagName) => new ElementStub(tagName)) as any, + } as any; }); afterEach(() => { @@ -179,7 +179,7 @@ describe("TagsEditor", () => { expect(asset.tags).toEqual(["Cat", "Dog"]); expect(editor.querySelectorAll(".mjr-tag-chip")).toHaveLength(2); - editor._mjrSetTags(["Bird", "bird", "Cat"]); + (editor as any)._mjrSetTags(["Bird", "bird", "Cat"]); expect(asset.tags).toEqual(["Bird", "Cat"]); expect(editor.querySelectorAll(".mjr-tag-chip")).toHaveLength(2); @@ -198,8 +198,8 @@ describe("TagsEditor", () => { const editor = createTagsEditor(asset, onUpdate); const input = editor.querySelector(".mjr-tag-input"); - input.value = "dog"; - input.dispatchEvent({ type: "keydown", key: "Enter" }); + (input as any).value = "dog"; + input.dispatchEvent({ type: "keydown", key: "Enter" } as any); await flushPromises(); expect(apiMock.updateAssetTags).toHaveBeenCalledTimes(1); @@ -212,8 +212,8 @@ describe("TagsEditor", () => { { warnPrefix: "[TagsEditor]" }, ); - input.value = "DOG"; - input.dispatchEvent({ type: "keydown", key: "Enter" }); + (input as any).value = "DOG"; + input.dispatchEvent({ type: "keydown", key: "Enter" } as any); await flushPromises(); expect(apiMock.updateAssetTags).toHaveBeenCalledTimes(1); @@ -231,8 +231,8 @@ describe("TagsEditor", () => { const editor = createTagsEditor(asset, vi.fn()); const input = editor.querySelector(".mjr-tag-input"); - input.value = "overflow"; - input.dispatchEvent({ type: "keydown", key: "Enter" }); + (input as any).value = "overflow"; + input.dispatchEvent({ type: "keydown", key: "Enter" } as any); await flushPromises(); expect(asset.tags).toHaveLength(50); diff --git a/ui/tests/toast.vitest.ts b/ui/tests/toast.vitest.ts index 3bf01137..7344b229 100644 --- a/ui/tests/toast.vitest.ts +++ b/ui/tests/toast.vitest.ts @@ -17,16 +17,16 @@ vi.mock("../app/i18n.js", () => ({ class MemoryStorage { constructor() { - this.store = new Map(); + (this as any).store = new Map(); } getItem(key) { - return this.store.has(key) ? this.store.get(key) : null; + return (this as any).store.has(key) ? (this as any).store.get(key) : null; } setItem(key, value) { - this.store.set(key, String(value)); + (this as any).store.set(key, String(value)); } clear() { - this.store.clear(); + (this as any).store.clear(); } } @@ -97,10 +97,10 @@ function installRuntimeGlobals() { const elementsById = new Map(); globalThis.document = { - body, - createElement: vi.fn((tag) => createElement(tag)), + body: body as any, + createElement: vi.fn((tag) => createElement(tag)) as any, getElementById: vi.fn((id) => elementsById.get(id) || null), - }; + } as any; const originalAppend = body.appendChild.bind(body); body.appendChild = (child) => { @@ -110,16 +110,16 @@ function installRuntimeGlobals() { return appended; }; - globalThis.window = new EventTarget(); - globalThis.localStorage = new MemoryStorage(); + globalThis.window = new EventTarget() as any; + globalThis.localStorage = new MemoryStorage() as any; globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; globalThis.requestAnimationFrame = (cb) => { - cb(); + (cb as any)(); return 1; }; } diff --git a/ui/tests/tooltip_shortcuts.vitest.ts b/ui/tests/tooltip_shortcuts.vitest.ts index b211c2a6..f2ce20c5 100644 --- a/ui/tests/tooltip_shortcuts.vitest.ts +++ b/ui/tests/tooltip_shortcuts.vitest.ts @@ -20,7 +20,7 @@ describe("tooltipShortcuts", () => { }, }; - const tooltip = setTooltipHint(button, "Close viewer", "Esc"); + const tooltip = setTooltipHint(button as any, "Close viewer", "Esc"); expect(tooltip).toBe("Close viewer (Esc)"); expect(button.title).toBe("Close viewer (Esc)"); diff --git a/ui/tests/topbar_mfv_button.vitest.ts b/ui/tests/topbar_mfv_button.vitest.ts index 44fe36a5..73d07fcd 100644 --- a/ui/tests/topbar_mfv_button.vitest.ts +++ b/ui/tests/topbar_mfv_button.vitest.ts @@ -24,7 +24,7 @@ describe("topBarMfvButton", () => { it("mounts after the queue group and toggles MFV without forcing live or preview", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 88 }); + actionbar.getBoundingClientRect = () => ({ bottom: 88 }) as any; const queueGroup = document.createElement("div"); queueGroup.className = "queue-button-group"; @@ -52,7 +52,7 @@ describe("topBarMfvButton", () => { expect(slot.firstElementChild).toBe(host); expect(actionbar.lastElementChild).toBe(slot); - button.click(); + (button as any).click(); expect(dispatchSpy).toHaveBeenCalledWith( expect.objectContaining({ type: "mjr:mfv-toggle" }), @@ -70,7 +70,7 @@ describe("topBarMfvButton", () => { it("syncs pressed state from visibility events and fully tears down", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 72 }); + actionbar.getBoundingClientRect = () => ({ bottom: 72 }) as any; document.body.appendChild(actionbar); const addSpy = vi.spyOn(window, "addEventListener"); @@ -111,7 +111,7 @@ describe("topBarMfvButton", () => { it("recreates a stable dedicated slot when the actionbar is rebuilt", async () => { const firstActionbar = document.createElement("div"); firstActionbar.className = "actionbar-container"; - firstActionbar.getBoundingClientRect = () => ({ bottom: 64 }); + firstActionbar.getBoundingClientRect = () => ({ bottom: 64 }) as any; document.body.appendChild(firstActionbar); const { mountTopBarMfvButton, teardownTopBarMfvButton } = @@ -126,7 +126,7 @@ describe("topBarMfvButton", () => { const secondActionbar = document.createElement("div"); secondActionbar.className = "actionbar-container"; - secondActionbar.getBoundingClientRect = () => ({ bottom: 96 }); + secondActionbar.getBoundingClientRect = () => ({ bottom: 96 }) as any; document.body.appendChild(secondActionbar); await Promise.resolve(); @@ -148,7 +148,7 @@ describe("topBarMfvButton", () => { it("mounts in the actionbar even when a nested queue group exists", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 80 }); + actionbar.getBoundingClientRect = () => ({ bottom: 80 }) as any; const left = document.createElement("div"); left.className = "left items-center"; @@ -180,7 +180,7 @@ describe("topBarMfvButton", () => { it("keeps the slot as the last actionbar child after actionbar children change", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 70 }); + actionbar.getBoundingClientRect = () => ({ bottom: 70 }) as any; const managerButton = document.createElement("button"); managerButton.type = "button"; @@ -225,7 +225,7 @@ describe("topBarMfvButton", () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 74 }); + actionbar.getBoundingClientRect = () => ({ bottom: 74 }) as any; document.body.appendChild(actionbar); const { mountTopBarMfvButton, teardownTopBarMfvButton } = @@ -264,7 +264,7 @@ describe("topBarMfvButton", () => { it("does not toggle until the button click is committed", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 88 }); + actionbar.getBoundingClientRect = () => ({ bottom: 88 }) as any; document.body.appendChild(actionbar); const dispatchSpy = vi.spyOn(window, "dispatchEvent"); @@ -296,7 +296,7 @@ describe("topBarMfvButton", () => { it("does not toggle when clicking the slot edge around the button", async () => { const actionbar = document.createElement("div"); actionbar.className = "actionbar-container"; - actionbar.getBoundingClientRect = () => ({ bottom: 88 }); + actionbar.getBoundingClientRect = () => ({ bottom: 88 }) as any; document.body.appendChild(actionbar); const dispatchSpy = vi.spyOn(window, "dispatchEvent"); diff --git a/ui/tests/ui_lifecycle_contract.vitest.ts b/ui/tests/ui_lifecycle_contract.vitest.ts index 9571f446..a0619c62 100644 --- a/ui/tests/ui_lifecycle_contract.vitest.ts +++ b/ui/tests/ui_lifecycle_contract.vitest.ts @@ -76,7 +76,7 @@ describe("mountKeepAlive — container styling", () => { const host = container.firstElementChild; expect(host).toBeTruthy(); - expect(host.dataset.mjrKeepAliveHost).toBe(KEY_A); + expect((host as any).dataset.mjrKeepAliveHost).toBe(KEY_A); }); }); diff --git a/ui/tests/ui_registration_lifecycle.vitest.ts b/ui/tests/ui_registration_lifecycle.vitest.ts index e11958a4..5dd13c1e 100644 --- a/ui/tests/ui_registration_lifecycle.vitest.ts +++ b/ui/tests/ui_registration_lifecycle.vitest.ts @@ -91,17 +91,17 @@ vi.mock("../app/bootstrap.js", () => ({ vi.mock("../app/config.js", async (importOriginal) => { const actual = await importOriginal(); return { - ...actual, - APP_CONFIG: { ...actual.APP_CONFIG, DEFAULT_PAGE_SIZE: 200 }, + ...(actual as any), + APP_CONFIG: { ...(actual as any).APP_CONFIG, DEFAULT_PAGE_SIZE: 200 }, }; }); vi.mock("../app/events.js", async (importOriginal) => { const actual = await importOriginal(); return { - ...actual, + ...(actual as any), EVENTS: { - ...actual.EVENTS, + ...(actual as any).EVENTS, OPEN_ASSETS_MANAGER: "mjr:open-assets-manager", RELOAD_GRID: "mjr:reload-grid", MFV_TOGGLE: "mjr:mfv-toggle", @@ -163,7 +163,7 @@ describe("render / destroy — keepalive contract", () => { tabDef.render(el); expect(mockMountKeepAlive).toHaveBeenCalledTimes(1); - expect(mockMountKeepAlive.mock.calls[0][0]).toBe(el); + expect((mockMountKeepAlive.mock.calls as any)[0][0]).toBe(el); }); it("destroy() is a no-op — does NOT call unmountKeepAlive", () => { @@ -187,7 +187,7 @@ describe("render / destroy — keepalive contract", () => { tabDef.destroy(el1); // no-op tabDef.render(el2); // re-render after tab switch - const [call1, call2] = mockMountKeepAlive.mock.calls; + const [call1, call2] = mockMountKeepAlive.mock.calls as any[]; expect(call1[2]).toBe(call2[2]); // same mount key both times }); @@ -253,7 +253,7 @@ describe("mountGlobalRuntime / teardownGlobalRuntime", () => { it("mountGlobalRuntime calls mountKeepAlive with the root element", () => { mountGlobalRuntime(); expect(mockMountKeepAlive).toHaveBeenCalledTimes(1); - const calledWithEl = mockMountKeepAlive.mock.calls[0][0]; + const calledWithEl = (mockMountKeepAlive.mock.calls as any)[0][0]; expect(calledWithEl?.id).toBe(ROOT_ID); }); @@ -316,9 +316,9 @@ describe("isMajoorTrackableNode — node classifier", () => { [undefined, false, "undefined node"], [{}, false, "empty object"], [{ comfyClass: "" }, false, "empty comfyClass"], - ])("(%s) → %s [%s]", (node, expected) => { + ])("(%s) → %s [%s]", ((node: any, expected: any) => { expect(isMajoorTrackableNode(node)).toBe(expected); - }); + }) as any); }); // ───────────────────────────────────────────────────────────────────────────── @@ -330,7 +330,7 @@ describe("native ComfyUI frontend registration payloads", () => { {}, { sidebarTabId: "majoor-assets", triggerStartupScan: vi.fn() }, ); - expect(commands.map((command) => command.id)).toEqual([ + expect(commands.map((command) => (command as any).id)).toEqual([ "mjr.openAssetsManager", "mjr.scanAssets", "mjr.toggleFloatingViewer", @@ -350,7 +350,7 @@ describe("native ComfyUI frontend registration payloads", () => { {}, { sidebarTabId: "majoor-assets", triggerStartupScan: vi.fn() }, ); - const byId = new Map(commands.map((command) => [command.id, command])); + const byId = new Map(commands.map((command) => [(command as any).id, command])); for (const id of [ "mjr.openNodeContext", @@ -360,9 +360,9 @@ describe("native ComfyUI frontend registration payloads", () => { "mjr.openGeneratedFeed", ]) { const command = byId.get(id); - expect(command.tooltip).toBeTruthy(); - expect(command.title).toBe(command.tooltip); - expect(command.description).toBe(command.tooltip); + expect((command as any).tooltip).toBeTruthy(); + expect((command as any).title).toBe((command as any).tooltip); + expect((command as any).description).toBe((command as any).tooltip); } }); @@ -385,8 +385,8 @@ describe("native ComfyUI frontend registration payloads", () => { registerNativeKeybindings(app); expect(mockRegisterKeybindingCompat).toHaveBeenCalledTimes(2); - expect(mockRegisterKeybindingCompat.mock.calls[0][0]).toBe(app); - expect(mockRegisterKeybindingCompat.mock.calls[0][1].commandId).toBe( + expect((mockRegisterKeybindingCompat.mock.calls as any)[0][0]).toBe(app); + expect((mockRegisterKeybindingCompat.mock.calls as any)[0][1].commandId).toBe( "mjr.openAssetsManager", ); }); @@ -394,11 +394,11 @@ describe("native ComfyUI frontend registration payloads", () => { it("builds topbar menu commands under Extensions / Majoor Assets Manager", () => { const menuCommands = buildNativeMenuCommands(); expect(menuCommands).toHaveLength(1); - expect(menuCommands[0].path).toEqual(["Extensions", "Majoor Assets Manager"]); - expect(menuCommands[0].commands).toContain("mjr.openSettings"); - expect(menuCommands[0].commands).toContain("mjr.openGeneratedFeed"); - expect(menuCommands[0].commands).toContain("mjr.pickOutputDirectory"); - expect(menuCommands[0].commands).toContain("mjr.pickIndexDirectory"); + expect((menuCommands[0] as any).path).toEqual(["Extensions", "Majoor Assets Manager"]); + expect((menuCommands[0] as any).commands).toContain("mjr.openSettings"); + expect((menuCommands[0] as any).commands).toContain("mjr.openGeneratedFeed"); + expect((menuCommands[0] as any).commands).toContain("mjr.pickOutputDirectory"); + expect((menuCommands[0] as any).commands).toContain("mjr.pickIndexDirectory"); }); it("builds official ComfyUI canvas context menu items with a declarative submenu", () => { @@ -409,8 +409,10 @@ describe("native ComfyUI frontend registration payloads", () => { ); expect(items[0]).toBeNull(); - expect(items[1].content).toBe("Majoor Assets Manager"); - expect(items[1].submenu.options.map((item) => item?.content).filter(Boolean)).toEqual([ + expect((items[1] as any).content).toBe("Majoor Assets Manager"); + expect( + (items[1] as any).submenu.options.map((item) => item?.content).filter(Boolean), + ).toEqual([ "Open Majoor Assets Manager", "Open floating viewer", "Open generated feed", diff --git a/ui/tests/use_assets_query.vitest.ts b/ui/tests/use_assets_query.vitest.ts index b5640a7f..740a8567 100644 --- a/ui/tests/use_assets_query.vitest.ts +++ b/ui/tests/use_assets_query.vitest.ts @@ -39,7 +39,7 @@ function createInputElement(initialValue = "") { class InputStub extends EventTarget { constructor(value = "") { super(); - this.value = value; + (this as any).value = value; } } return new InputStub(initialValue); @@ -50,12 +50,12 @@ describe("useAssetsQuery", () => { vi.clearAllMocks(); globalThis.CustomEvent = globalThis.CustomEvent || - class extends Event { + (class extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any); }); afterEach(() => { @@ -145,7 +145,7 @@ describe("useAssetsQuery", () => { const previousRaf = globalThis.requestAnimationFrame; globalThis.requestAnimationFrame = (callback) => { - callback(); + (callback as any)(); return 1; }; @@ -234,7 +234,7 @@ describe("useAssetsQuery", () => { }); const gridContainer = createGridContainer(); - gridContainer._mjrGetGridState = vi.fn(() => ({ loading: true, assets: [] })); + (gridContainer as any)._mjrGetGridState = vi.fn(() => ({ loading: true, assets: [] })); const loadAssets = vi.fn(async () => ({ ok: true })); const controller = createAssetsQueryController({ @@ -542,7 +542,7 @@ describe("useAssetsQuery", () => { reloadGrid, }); - searchInputEl.value = "dragon"; + (searchInputEl as any).value = "dragon"; searchInputEl.dispatchEvent(new Event("input")); expect(onQueryChanged).toHaveBeenCalledTimes(1); expect(reloadGrid).toHaveBeenCalledTimes(0); @@ -552,7 +552,7 @@ describe("useAssetsQuery", () => { expect(onBeforeReload).toHaveBeenCalledTimes(1); expect(reloadGrid).toHaveBeenCalledTimes(1); - searchInputEl.value = ""; + (searchInputEl as any).value = ""; searchInputEl.dispatchEvent(new Event("input")); expect(startSearchTimer).toHaveBeenCalledTimes(2); expect(onBeforeReload).toHaveBeenCalledTimes(2); diff --git a/ui/tests/use_grid_display_assets.vitest.ts b/ui/tests/use_grid_display_assets.vitest.ts index 71892b47..4a544470 100644 --- a/ui/tests/use_grid_display_assets.vitest.ts +++ b/ui/tests/use_grid_display_assets.vitest.ts @@ -27,10 +27,10 @@ describe("useGridDisplayAssets", () => { const output = buildDisplayAssets([first, second, third]); expect(output).toEqual([first, third]); - expect(first._mjrDupStack).toBe(true); - expect(first._mjrDupMembers.map((asset) => asset.id)).toEqual([1, 2]); - expect(second._mjrDupStack).toBe(false); - expect(third._mjrDupStack).toBe(false); + expect((first as any)._mjrDupStack).toBe(true); + expect((first as any)._mjrDupMembers.map((asset) => asset.id)).toEqual([1, 2]); + expect((second as any)._mjrDupStack).toBe(false); + expect((third as any)._mjrDupStack).toBe(false); }); it("rebuilds duplicate members from the current asset list only", () => { @@ -45,7 +45,7 @@ describe("useGridDisplayAssets", () => { buildDisplayAssets([first, second]); expect(first._mjrDupMembers.map((asset) => asset.id)).toEqual([1, 2]); - expect(first._mjrDupCount).toBe(2); + expect((first as any)._mjrDupCount).toBe(2); }); it("ignores stale duplicate-hidden flags left on asset objects", () => { diff --git a/ui/tests/use_grid_keyboard.vitest.ts b/ui/tests/use_grid_keyboard.vitest.ts index c9d64fff..b0cba89e 100644 --- a/ui/tests/use_grid_keyboard.vitest.ts +++ b/ui/tests/use_grid_keyboard.vitest.ts @@ -30,7 +30,7 @@ describe("useGridKeyboard", () => { _mjrOpenKeyboardDetails: vi.fn(), }; - const dispose = bindLegacyGridKeyboard(container); + const dispose = bindLegacyGridKeyboard(container as any); expect(keyboardState.installGridKeyboard).toHaveBeenCalledWith( expect.objectContaining({ @@ -43,7 +43,7 @@ describe("useGridKeyboard", () => { }), ); expect(keyboard.bind).toHaveBeenCalledTimes(1); - expect(container._mjrGridKeyboard).toBe(keyboard); + expect((container as any)._mjrGridKeyboard).toBe(keyboard); const options = keyboardState.installGridKeyboard.mock.calls[0][0]; expect(options.getState()).toEqual({ assets: [{ id: 1 }] }); @@ -61,6 +61,6 @@ describe("useGridKeyboard", () => { dispose(); expect(keyboard.dispose).toHaveBeenCalledTimes(1); - expect(container._mjrGridKeyboard).toBeNull(); + expect((container as any)._mjrGridKeyboard).toBeNull(); }); }); diff --git a/ui/tests/use_grid_query.vitest.ts b/ui/tests/use_grid_query.vitest.ts index edf26e79..df7dc1df 100644 --- a/ui/tests/use_grid_query.vitest.ts +++ b/ui/tests/use_grid_query.vitest.ts @@ -112,8 +112,8 @@ describe("useGridQuery helpers", () => { }; expect(readGridQueryFromElement(element)).toMatchObject({ q: "fox", sort: "name_desc" }); - expect(readGridQueryText(element, "*")).toBe("fox"); - expect(readGridSortKey(element, "mtime_desc")).toBe("name_desc"); + expect(readGridQueryText((element as any), "*")).toBe("fox"); + expect(readGridSortKey((element as any), "mtime_desc")).toBe("name_desc"); expect(readGridQueryText(null, "fallback")).toBe("fallback"); }); diff --git a/ui/tests/use_grid_selection.vitest.ts b/ui/tests/use_grid_selection.vitest.ts index e3e2e903..d5244a86 100644 --- a/ui/tests/use_grid_selection.vitest.ts +++ b/ui/tests/use_grid_selection.vitest.ts @@ -5,9 +5,9 @@ function createGridContainer() { return { dataset: {}, children: [], - addEventListener: (...args) => bus.addEventListener(...args), - removeEventListener: (...args) => bus.removeEventListener(...args), - dispatchEvent: (...args) => bus.dispatchEvent(...args), + addEventListener: (...args: any[]) => (bus.addEventListener as any)(...args), + removeEventListener: (...args: any[]) => (bus.removeEventListener as any)(...args), + dispatchEvent: (...args: any[]) => (bus.dispatchEvent as any)(...args), appendChild(child) { this.children.push(child); }, @@ -31,12 +31,12 @@ describe("useGridSelection", () => { vi.restoreAllMocks(); globalThis.CustomEvent = globalThis.CustomEvent || - class extends Event { + (class extends Event { constructor(type, init = {}) { super(type); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any); }); it("syncs selection events back to panel state writers", async () => { @@ -77,8 +77,8 @@ describe("useGridSelection", () => { const { bindGridSelectionState } = await import("../vue/composables/useGridSelection.js"); const gridContainer = createGridContainer(); - gridContainer._mjrSetSelection = vi.fn(); - gridContainer._mjrScrollToAssetId = vi.fn(); + (gridContainer as any)._mjrSetSelection = vi.fn(); + (gridContainer as any)._mjrScrollToAssetId = vi.fn(); const binding = bindGridSelectionState({ gridContainer, @@ -88,11 +88,11 @@ describe("useGridSelection", () => { binding.restoreSelectionState({ scrollTop: 0 }); - expect(gridContainer._mjrSetSelection).toHaveBeenCalledWith( + expect((gridContainer as any)._mjrSetSelection).toHaveBeenCalledWith( ["asset-1", "asset-2"], "asset-2", ); - expect(gridContainer._mjrScrollToAssetId).toHaveBeenCalledWith("asset-2"); + expect((gridContainer as any)._mjrScrollToAssetId).toHaveBeenCalledWith("asset-2"); }); it("falls back to scrolling the matching DOM card into view when needed", async () => { diff --git a/ui/tests/use_grid_snapshot_cache.vitest.ts b/ui/tests/use_grid_snapshot_cache.vitest.ts index 95ab99a4..8824a0e2 100644 --- a/ui/tests/use_grid_snapshot_cache.vitest.ts +++ b/ui/tests/use_grid_snapshot_cache.vitest.ts @@ -24,8 +24,8 @@ describe("useGridSnapshotCache", () => { beforeEach(() => { vi.useRealTimers(); resetGridSnapshotCacheForTests(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = makeStorage() as any; + globalThis.sessionStorage = makeStorage() as any; }); it("builds stable keys compatible with existing snapshot inputs", () => { diff --git a/ui/tests/use_grid_state.vitest.ts b/ui/tests/use_grid_state.vitest.ts index 3452f9f4..a0dc5db2 100644 --- a/ui/tests/use_grid_state.vitest.ts +++ b/ui/tests/use_grid_state.vitest.ts @@ -3,7 +3,7 @@ import { describe, expect, it, vi, beforeEach } from "vitest"; vi.mock("vue", async (importOriginal) => { const actual = await importOriginal(); return { - ...actual, + ...(actual as any), }; }); diff --git a/ui/tests/video_controls_audio.vitest.ts b/ui/tests/video_controls_audio.vitest.ts index b3e61901..9d029c99 100644 --- a/ui/tests/video_controls_audio.vitest.ts +++ b/ui/tests/video_controls_audio.vitest.ts @@ -8,8 +8,8 @@ vi.mock("../app/i18n.js", () => ({ describe("audio viewer controls", () => { it("uses the advanced viewer controls for audio media without frame-step controls", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -45,18 +45,18 @@ describe("audio viewer controls", () => { expect(mounted.controlsEl.querySelector(".mjr-video-btn--mark")).toBeTruthy(); expect(mounted.controlsEl.querySelector(".mjr-video-seek-mark")).toBeTruthy(); expect(mounted.controlsEl.querySelector(".mjr-video-seek-handle")).toBeTruthy(); - expect(mounted.setInPoint()).toBe(true); - expect(mounted.setOutPoint()).toBe(true); - expect(mounted.goToIn()).toBe(true); - expect(mounted.goToOut()).toBe(true); + expect((mounted as any).setInPoint()).toBe(true); + expect((mounted as any).setOutPoint()).toBe(true); + expect((mounted as any).goToIn()).toBe(true); + expect((mounted as any).goToOut()).toBe(true); mounted.destroy(); }); it("renders a time ruler for audio media", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -80,14 +80,16 @@ describe("audio viewer controls", () => { hostEl: host, }); - audio.dispatchEvent(new window.Event("loadedmetadata")); + audio.dispatchEvent(new window.Event("loadedmetadata") as any); const tickBar = mounted.controlsEl.querySelector(".mjr-video-seek-ticks"); const labels = [...mounted.controlsEl.querySelectorAll(".mjr-video-seek-label")].map( (label) => label.textContent, ); - expect(tickBar?.style.backgroundImage || "").toContain("repeating-linear-gradient"); + expect((tickBar as any)?.style.backgroundImage || "").toContain( + "repeating-linear-gradient", + ); expect(labels[0]).toBe("0:00"); expect(labels).toContain("2:05"); expect(mounted.controlsEl.querySelector(".mjr-video-seek-mark")).toBeTruthy(); @@ -98,8 +100,8 @@ describe("audio viewer controls", () => { it("keeps the viewerbar frame readout aligned with actual video frames", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -145,7 +147,7 @@ describe("audio viewer controls", () => { }); paused = false; - video.dispatchEvent(new window.Event("play")); + video.dispatchEvent(new window.Event("play") as any); currentTime = 0.5 / 24; rvfcCallback?.(0, { mediaTime: currentTime }); @@ -166,8 +168,8 @@ describe("audio viewer controls", () => { it("expands the frame stepping range when the real frame count arrives after metadata load", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -200,9 +202,9 @@ describe("audio viewer controls", () => { hostEl: host, }); - video.dispatchEvent(new window.Event("loadedmetadata")); - mounted.setMediaInfo({ frameCount: 41 }); - mounted.goToOut(); + video.dispatchEvent(new window.Event("loadedmetadata") as any); + (mounted as any).setMediaInfo({ frameCount: 41 }); + (mounted as any).goToOut(); const frameLabel = mounted.controlsEl.querySelector(".mjr-video-frame"); expect(frameLabel?.textContent || "").toContain("F: 41 / 41"); diff --git a/ui/tests/video_controls_fps_override.vitest.ts b/ui/tests/video_controls_fps_override.vitest.ts index c2b35889..02514c6a 100644 --- a/ui/tests/video_controls_fps_override.vitest.ts +++ b/ui/tests/video_controls_fps_override.vitest.ts @@ -38,16 +38,16 @@ describe("VideoControls FPS override state", () => { expect(Number(fpsInput?.value)).toBeCloseTo(23.976, 3); fpsInput!.value = "12"; - fpsInput!.dispatchEvent(new window.Event("change", { bubbles: true })); + fpsInput!.dispatchEvent(new window.Event("change", { bubbles: true }) as any); expect(fpsInput?.classList.contains("is-overridden")).toBe(true); expect(fpsInput?.value).toBe("12"); - mounted.setMediaInfo?.({ fps: 24 }); + (mounted as any).setMediaInfo?.({ fps: 24 }); expect(fpsInput?.classList.contains("is-overridden")).toBe(true); expect(fpsInput?.value).toBe("12"); fpsInput!.value = "24"; - fpsInput!.dispatchEvent(new window.Event("change", { bubbles: true })); + fpsInput!.dispatchEvent(new window.Event("change", { bubbles: true }) as any); expect(fpsInput?.classList.contains("is-overridden")).toBe(false); mounted.destroy(); @@ -86,7 +86,7 @@ describe("VideoControls FPS override state", () => { ) as HTMLInputElement | null; expect(fpsInput?.value).toBe("25"); - mounted.setMediaInfo?.({ fps: 17.321, fpsSource: "rvfc" }); + (mounted as any).setMediaInfo?.({ fps: 17.321, fpsSource: "rvfc" }); expect(fpsInput?.value).toBe("25"); expect(fpsInput?.classList.contains("is-overridden")).toBe(false); diff --git a/ui/tests/video_controls_responsive_layout.vitest.ts b/ui/tests/video_controls_responsive_layout.vitest.ts index 4da2762e..d52a1bcf 100644 --- a/ui/tests/video_controls_responsive_layout.vitest.ts +++ b/ui/tests/video_controls_responsive_layout.vitest.ts @@ -8,8 +8,8 @@ vi.mock("../app/i18n.js", () => ({ describe("video controls responsive layout", () => { it("switches to stacked layout when the host is narrow", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -18,12 +18,12 @@ describe("video controls responsive layout", () => { const resizeObservers = []; globalThis.ResizeObserver = class { constructor(cb) { - this.cb = cb; + (this as any).cb = cb; resizeObservers.push(this); } observe() {} disconnect() {} - }; + } as any; const { mountVideoControls } = await import("../components/VideoControls.js"); diff --git a/ui/tests/video_controls_seek_drag.vitest.ts b/ui/tests/video_controls_seek_drag.vitest.ts index 279f6f27..33b28419 100644 --- a/ui/tests/video_controls_seek_drag.vitest.ts +++ b/ui/tests/video_controls_seek_drag.vitest.ts @@ -21,8 +21,8 @@ function makePointerEvent(window, type, props = {}) { describe("video controls seek drag", () => { it("lets the MFV timeline scrub freely without playback sync overwriting the drag", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -56,7 +56,7 @@ describe("video controls seek drag", () => { const seekWrap = mounted.controlsEl.querySelector(".mjr-video-seek-wrap"); const seek = mounted.controlsEl.querySelector(".mjr-video-range--seek"); - seekWrap.getBoundingClientRect = () => ({ left: 10, width: 100 }); + seekWrap.getBoundingClientRect = () => ({ left: 10, width: 100 }) as any; seekWrap.dispatchEvent( makePointerEvent(window, "pointerdown", { @@ -68,11 +68,11 @@ describe("video controls seek drag", () => { ); expect(currentTime).toBeCloseTo(5, 5); - expect(seek.value).toBe("500"); + expect((seek as any).value).toBe("500"); currentTime = 1; - video.dispatchEvent(new window.Event("timeupdate")); - expect(seek.value).toBe("500"); + video.dispatchEvent(new window.Event("timeupdate") as any); + expect((seek as any).value).toBe("500"); window.dispatchEvent( makePointerEvent(window, "pointermove", { @@ -83,7 +83,7 @@ describe("video controls seek drag", () => { ); expect(currentTime).toBeCloseTo(9, 5); - expect(seek.value).toBe("900"); + expect((seek as any).value).toBe("900"); window.dispatchEvent( makePointerEvent(window, "pointerup", { @@ -94,16 +94,16 @@ describe("video controls seek drag", () => { ); currentTime = 2; - video.dispatchEvent(new window.Event("timeupdate")); - expect(seek.value).toBe("200"); + video.dispatchEvent(new window.Event("timeupdate") as any); + expect((seek as any).value).toBe("200"); mounted.destroy(); }); it("uses frame-count seek precision when metadata exceeds the legacy 1000-step range", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -139,13 +139,13 @@ describe("video controls seek drag", () => { const seek = mounted.controlsEl.querySelector(".mjr-video-range--seek"); currentTime = 30; - video.dispatchEvent(new window.Event("timeupdate")); + video.dispatchEvent(new window.Event("timeupdate") as any); - expect(seek.max).toBe("1800"); - expect(seek.value).toBe("900"); + expect((seek as any).max).toBe("1800"); + expect((seek as any).value).toBe("900"); - seek.value = "901"; - seek.dispatchEvent(new window.Event("input", { bubbles: true, cancelable: true })); + (seek as any).value = "901"; + seek.dispatchEvent(new window.Event("input", { bubbles: true, cancelable: true }) as any); expect(currentTime).toBeCloseTo((901 / 1800) * 60, 5); diff --git a/ui/tests/video_sync.vitest.ts b/ui/tests/video_sync.vitest.ts index 572015bf..33a2d9e6 100644 --- a/ui/tests/video_sync.vitest.ts +++ b/ui/tests/video_sync.vitest.ts @@ -89,7 +89,7 @@ describe("video sync", () => { const follower = makeMedia({ currentTime: 0, paused: false }); installFollowerVideoSync(leader, [follower], { threshold: 0.01 }); - follower.pause.mockClear(); + (follower.pause as any).mockClear(); leader.pause(); @@ -116,7 +116,7 @@ describe("video sync", () => { expect(follower.currentTime).toBeCloseTo(1.25, 5); expect(globalThis.requestAnimationFrame).toHaveBeenCalled(); - ac.abort(); + (ac as any).abort(); expect(globalThis.cancelAnimationFrame).toHaveBeenCalled(); }); }); diff --git a/ui/tests/viewer_ab_compare.vitest.ts b/ui/tests/viewer_ab_compare.vitest.ts index 4ce1fead..b4059bbe 100644 --- a/ui/tests/viewer_ab_compare.vitest.ts +++ b/ui/tests/viewer_ab_compare.vitest.ts @@ -25,18 +25,18 @@ function createMediaWithCanvas(canvas) { describe("viewer A/B compare", () => { beforeEach(() => { - globalThis.HTMLCanvasElement = CanvasMock; - globalThis.performance = { now: () => 1000 }; + globalThis.HTMLCanvasElement = CanvasMock as any; + globalThis.performance = { now: () => 1000 } as any; globalThis.requestAnimationFrame = (callback) => { - callback(); + (callback as any)(); return 1; }; globalThis.cancelAnimationFrame = vi.fn(); globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), - CSS: { supports: vi.fn(() => false) }, - }; + CSS: { supports: vi.fn(() => false) } as any, + } as any; }); it("renders subtract mode from both source canvases and restores context", async () => { @@ -79,8 +79,8 @@ describe("viewer A/B compare", () => { addEventListener: vi.fn(), setAttribute: vi.fn(), }; - }), - }; + }) as any, + } as any; const baseCanvas = createSourceCanvas([ 200, 150, 100, 255, 120, 90, 60, 255, 180, 140, 90, 255, 90, 70, 40, 255, diff --git a/ui/tests/viewer_compare_audio.vitest.ts b/ui/tests/viewer_compare_audio.vitest.ts index 191fdca4..c6f55885 100644 --- a/ui/tests/viewer_compare_audio.vitest.ts +++ b/ui/tests/viewer_compare_audio.vitest.ts @@ -28,14 +28,14 @@ describe("viewer compare audio safety", () => { setAttribute: vi.fn(), addEventListener: vi.fn(), remove: vi.fn(), - })), - }; + })) as any, + } as any; globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), - CSS: { supports: vi.fn(() => false) }, - }; - globalThis.HTMLCanvasElement = class {}; + CSS: { supports: vi.fn(() => false) } as any, + } as any; + globalThis.HTMLCanvasElement = class {} as any; }); it("mutes the secondary audio track in A/B compare", async () => { @@ -60,9 +60,9 @@ describe("viewer compare audio safety", () => { destroyMediaProcessorsIn: vi.fn(), }); - expect(a.audio.dataset.mjrCompareRole).toBe("A"); + expect((a.audio.dataset as any).mjrCompareRole).toBe("A"); expect(a.audio.muted).toBe(false); - expect(b.audio.dataset.mjrCompareRole).toBe("B"); + expect((b.audio.dataset as any).mjrCompareRole).toBe("B"); expect(b.audio.muted).toBe(true); expect(b.audio.pause).toHaveBeenCalledTimes(1); }); @@ -94,9 +94,9 @@ describe("viewer compare audio safety", () => { destroyMediaProcessorsIn: vi.fn(), }); - expect(a.audio.dataset.mjrCompareRole).toBe("A"); + expect((a.audio.dataset as any).mjrCompareRole).toBe("A"); expect(a.audio.muted).toBe(false); - expect(b.audio.dataset.mjrCompareRole).toBe("B"); + expect((b.audio.dataset as any).mjrCompareRole).toBe("B"); expect(b.audio.muted).toBe(true); expect(b.audio.pause).toHaveBeenCalledTimes(1); }); diff --git a/ui/tests/viewer_context_menu_vue.vitest.ts b/ui/tests/viewer_context_menu_vue.vitest.ts index 045eacae..733fb790 100644 --- a/ui/tests/viewer_context_menu_vue.vitest.ts +++ b/ui/tests/viewer_context_menu_vue.vitest.ts @@ -45,9 +45,9 @@ function ensureCustomEvent() { globalThis.CustomEvent = class CustomEvent extends Event { constructor(type, init = {}) { super(type, init); - this.detail = init.detail; + (this as any).detail = (init as any).detail; } - }; + } as any; } function resetViewerContextState(state, helpers) { diff --git a/ui/tests/viewer_keyboard.vitest.ts b/ui/tests/viewer_keyboard.vitest.ts index 4dea45bc..b618928f 100644 --- a/ui/tests/viewer_keyboard.vitest.ts +++ b/ui/tests/viewer_keyboard.vitest.ts @@ -38,7 +38,7 @@ function createWindowMock() { }, dispatch(type, event) { for (const handler of Array.from(listeners.get(type) || [])) { - handler(event); + (handler as any)(event); } }, }; @@ -72,12 +72,12 @@ function createPlayerbarInputEvent(key) { describe("viewer keyboard", () => { beforeEach(() => { const windowMock = createWindowMock(); - globalThis.window = windowMock; + globalThis.window = windowMock as any; globalThis.document = { fullscreenElement: null, exitFullscreen: vi.fn(), activeElement: null, - }; + } as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: { clipboard: { writeText: vi.fn() } }, @@ -122,12 +122,12 @@ describe("viewer keyboard", () => { }); keyboard.bind(); - window.dispatch("keydown", createKeyboardEvent("x")); + (window as any).dispatch("keydown", createKeyboardEvent("x")); expect(state.distractionFree).toBe(true); expect(applyDistractionFreeUI).toHaveBeenCalledTimes(1); keyboard.unbind(); - window.dispatch("keydown", createKeyboardEvent("x")); + (window as any).dispatch("keydown", createKeyboardEvent("x")); expect(state.distractionFree).toBe(true); expect(applyDistractionFreeUI).toHaveBeenCalledTimes(1); expect(closeViewer).not.toHaveBeenCalled(); @@ -169,11 +169,11 @@ describe("viewer keyboard", () => { }); keyboard.bind(); - window.dispatch("keydown", createKeyboardEvent("Escape")); + (window as any).dispatch("keydown", createKeyboardEvent("Escape")); expect(closeViewer).toHaveBeenCalledTimes(1); keyboard.unbind(); - window.dispatch("keydown", createKeyboardEvent("Escape")); + (window as any).dispatch("keydown", createKeyboardEvent("Escape")); expect(closeViewer).toHaveBeenCalledTimes(1); }); @@ -214,8 +214,8 @@ describe("viewer keyboard", () => { }); keyboard.bind(); - window.dispatch("keydown", createPlayerbarInputEvent("ArrowRight")); - window.dispatch("keydown", createPlayerbarInputEvent(" ")); + (window as any).dispatch("keydown", createPlayerbarInputEvent("ArrowRight")); + (window as any).dispatch("keydown", createPlayerbarInputEvent(" ")); expect(stepFrames).toHaveBeenCalledWith(1); expect(togglePlay).toHaveBeenCalledTimes(1); diff --git a/ui/tests/viewer_panzoom_performance.vitest.ts b/ui/tests/viewer_panzoom_performance.vitest.ts index 68da9b1a..5e8cc4a8 100644 --- a/ui/tests/viewer_panzoom_performance.vitest.ts +++ b/ui/tests/viewer_panzoom_performance.vitest.ts @@ -69,7 +69,7 @@ describe("viewer panzoom performance", () => { height: 600, right: 800, bottom: 600, - })); + })) as any; media.className = "mjr-viewer-media"; media._mjrNaturalW = 1600; media._mjrNaturalH = 900; diff --git a/ui/tests/viewer_player_bar_fps_sync.vitest.ts b/ui/tests/viewer_player_bar_fps_sync.vitest.ts index a6b4b369..f98c7af9 100644 --- a/ui/tests/viewer_player_bar_fps_sync.vitest.ts +++ b/ui/tests/viewer_player_bar_fps_sync.vitest.ts @@ -28,7 +28,7 @@ describe("playerBarManager FPS sync", () => { globalThis.window = { addEventListener: vi.fn(), removeEventListener: vi.fn(), - }; + } as any; globalThis.requestAnimationFrame = vi.fn(() => 1); state = { assets: [createAsset(1001, "25/2"), createAsset(1002, "25/1")], @@ -202,7 +202,7 @@ describe("playerBarManager FPS sync", () => { fpsHandler = handler; }), removeEventListener: vi.fn(), - }; + } as any; state.nativeFps = 25; const mounted = { destroy: vi.fn(), diff --git a/ui/tests/viewer_runtime_hosts.vitest.ts b/ui/tests/viewer_runtime_hosts.vitest.ts index 069024fc..b1d0c7d8 100644 --- a/ui/tests/viewer_runtime_hosts.vitest.ts +++ b/ui/tests/viewer_runtime_hosts.vitest.ts @@ -6,15 +6,15 @@ describe("viewerRuntimeHosts", () => { globalThis.document = { body: { appendChild: vi.fn(), - querySelectorAll: vi.fn(() => []), + querySelectorAll: vi.fn(() => []) as any, isConnected: true, - }, + } as any, documentElement: { appendChild: vi.fn(), - querySelectorAll: vi.fn(() => []), + querySelectorAll: vi.fn(() => []) as any, isConnected: true, - }, - }; + } as any, + } as any; }); it("appends the floating viewer to document.body even when a Vue host is registered", async () => { diff --git a/ui/tests/viewer_toolbar.vitest.ts b/ui/tests/viewer_toolbar.vitest.ts index dfc2cdfb..e7ec634f 100644 --- a/ui/tests/viewer_toolbar.vitest.ts +++ b/ui/tests/viewer_toolbar.vitest.ts @@ -11,8 +11,8 @@ vi.mock("../app/i18n.js", () => ({ describe("viewer toolbar", () => { it("reset restores all viewer tool defaults", async () => { const window = new Window(); - globalThis.window = window; - globalThis.document = window.document; + globalThis.window = window as any; + globalThis.document = window.document as any; Object.defineProperty(globalThis, "navigator", { configurable: true, value: window.navigator, @@ -63,12 +63,12 @@ describe("viewer toolbar", () => { toolbar.syncToolsUIFromState(); const resetButton = Array.from(toolbar.headerEl.querySelectorAll("button")).find( - (button) => (button.textContent || "").trim() === "Reset", + (button) => ((button as any).textContent || "").trim() === "Reset", ); expect(resetButton).toBeTruthy(); - resetButton.click(); + (resetButton as any).click(); expect(state.channel).toBe("rgb"); expect(state.exposureEV).toBe(0); diff --git a/ui/tests/workflow_api_client.vitest.ts b/ui/tests/workflow_api_client.vitest.ts index 3acaea5c..4d69a307 100644 --- a/ui/tests/workflow_api_client.vitest.ts +++ b/ui/tests/workflow_api_client.vitest.ts @@ -20,21 +20,21 @@ function makeStorage() { describe("workflow api client", () => { beforeEach(() => { vi.resetModules(); - globalThis.localStorage = makeStorage(); - globalThis.sessionStorage = makeStorage(); + globalThis.localStorage = (makeStorage() as any); + globalThis.sessionStorage = (makeStorage() as any); globalThis.app = { ui: {}, extensionManager: { toast: { add: vi.fn() } } }; - globalThis.window = { + globalThis.window = ({ addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), - location: { origin: "http://localhost" }, + location: ({ origin: "http://localhost" } as any), app: globalThis.app, - }; - globalThis.fetch = vi.fn(async () => ({ + } as any); + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: {} }), - })); + })) as any); }); afterEach(() => { @@ -70,45 +70,45 @@ describe("workflow api client", () => { }); it("posts mark-loaded to the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { updated: true } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.markWorkflowLoaded({ filepath: "C:/tmp/wf.json" }); expect(result.ok).toBe(true); - const markLoadedCall = globalThis.fetch.mock.calls.find(([url]) => + const markLoadedCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/mark-loaded"), ); expect(markLoadedCall).toBeTruthy(); }); it("fetches workflow validation diagnostics", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { valid: true, required_nodes: [] } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.validateWorkflow("C:/tmp/wf.json"); expect(result.ok).toBe(true); - const validateCall = globalThis.fetch.mock.calls.find(([url]) => + const validateCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/validate"), ); expect(validateCall).toBeTruthy(); }); it("fetches workflow versions and diff", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { versions: [], changed: [] } }), - })); + })) as any); const client = await import("../api/client.js"); const versions = await client.listWorkflowVersions("C:/tmp/wf.json"); @@ -116,84 +116,84 @@ describe("workflow api client", () => { expect(versions.ok).toBe(true); expect(diff.ok).toBe(true); - expect(globalThis.fetch.mock.calls.some(([url]) => String(url).includes("/mjr/am/workflows/versions"))).toBe(true); - expect(globalThis.fetch.mock.calls.some(([url]) => String(url).includes("/mjr/am/workflows/diff"))).toBe(true); + expect((globalThis.fetch as any).mock.calls.some(([url]) => String(url).includes("/mjr/am/workflows/versions"))).toBe(true); + expect((globalThis.fetch as any).mock.calls.some(([url]) => String(url).includes("/mjr/am/workflows/diff"))).toBe(true); }); it("posts favorite to the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { updated: true, favorite: true } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.setWorkflowFavorite({ filepath: "C:/tmp/wf.json", favorite: true }); expect(result.ok).toBe(true); - const favoriteCall = globalThis.fetch.mock.calls.find(([url]) => + const favoriteCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/favorite"), ); expect(favoriteCall).toBeTruthy(); }); it("fetches linked workflow thumbnail candidates from the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: [] }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.listWorkflowThumbnailCandidates({ filepath: "C:/tmp/wf.json", limit: 3 }); expect(result.ok).toBe(true); - const candidatesCall = globalThis.fetch.mock.calls.find(([url]) => + const candidatesCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/thumbnail-candidates"), ); expect(candidatesCall).toBeTruthy(); }); it("fetches indexed workflow model families from the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { model_families: [{ label: "Flux", value: "Flux" }] } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.listWorkflowModelFamilies(); expect(result.ok).toBe(true); - const familiesCall = globalThis.fetch.mock.calls.find(([url]) => + const familiesCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/model-families"), ); expect(familiesCall).toBeTruthy(); }); it("fetches workflow scope cards from the list endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { assets: [] } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.listWorkflows({ q: "*", limit: 25 }); expect(result.ok).toBe(true); - const listCall = globalThis.fetch.mock.calls.find(([url]) => + const listCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/list") && String(url).includes("scope=workflow"), ); expect(listCall).toBeTruthy(); }); it("posts workflow thumbnail copy requests to the dedicated endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { updated: true } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.setWorkflowThumbnail({ @@ -202,18 +202,18 @@ describe("workflow api client", () => { }); expect(result.ok).toBe(true); - const thumbCall = globalThis.fetch.mock.calls.find(([url]) => + const thumbCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/thumbnail/set"), ); expect(thumbCall).toBeTruthy(); }); it("posts workflow tags updates to the workflow endpoint", async () => { - globalThis.fetch = vi.fn(async () => ({ + globalThis.fetch = (vi.fn(async () => ({ status: 200, headers: { get: (name) => (name === "content-type" ? "application/json" : null) }, json: async () => ({ ok: true, data: { updated: true, tags: ["cinematic"] } }), - })); + })) as any); const client = await import("../api/client.js"); const result = await client.updateAssetTags( @@ -222,7 +222,7 @@ describe("workflow api client", () => { ); expect(result.ok).toBe(true); - const tagsCall = globalThis.fetch.mock.calls.find(([url]) => + const tagsCall = (globalThis.fetch as any).mock.calls.find(([url]) => String(url).includes("/mjr/am/workflows/tags"), ); expect(tagsCall).toBeTruthy(); diff --git a/ui/tests/workflow_graph_map_actions.vitest.ts b/ui/tests/workflow_graph_map_actions.vitest.ts index 0faf1582..b4a32300 100644 --- a/ui/tests/workflow_graph_map_actions.vitest.ts +++ b/ui/tests/workflow_graph_map_actions.vitest.ts @@ -185,7 +185,7 @@ describe("workflow graph map actions", () => { widgets_values: [1, "fixed"], }), ); - expect(created.id).toBeUndefined(); + expect((created as any).id).toBeUndefined(); expect(graph.add).toHaveBeenCalledWith(created); }); }); diff --git a/ui/tests/workflow_graph_map_panel_preview.vitest.ts b/ui/tests/workflow_graph_map_panel_preview.vitest.ts index 25e4c73f..6fe6e4a5 100644 --- a/ui/tests/workflow_graph_map_panel_preview.vitest.ts +++ b/ui/tests/workflow_graph_map_panel_preview.vitest.ts @@ -6,7 +6,7 @@ const drawWorkflowMinimapMock = vi.fn(() => null); const buildFloatingViewerMediaElementMock = vi.fn((asset) => { const root = document.createElement("div"); root.className = `preview-${String(asset?.filename || "none")}`; - root._mjrMediaControlsHandle = { destroy: vi.fn() }; + (root as any)._mjrMediaControlsHandle = { destroy: vi.fn() }; const video = document.createElement("video"); video.pause = vi.fn(); root.appendChild(video); diff --git a/ui/tests/workflow_save_info_dialog.vitest.ts b/ui/tests/workflow_save_info_dialog.vitest.ts index 074ba9d9..09ffe101 100644 --- a/ui/tests/workflow_save_info_dialog.vitest.ts +++ b/ui/tests/workflow_save_info_dialog.vitest.ts @@ -68,7 +68,7 @@ describe("WorkflowSaveInfoDialog", () => { const name = document.body.querySelector("input[type='text']"); const notes = document.body.querySelector("textarea"); - expect(name?.value).toBe("starter workflow"); + expect((name as any)?.value).toBe("starter workflow"); notes.value = "Render the preview branch before publishing."; notes.dispatchEvent(new Event("input", { bubbles: true })); diff --git a/ui/tests/workflow_sidebar_live_sync.vitest.ts b/ui/tests/workflow_sidebar_live_sync.vitest.ts index ac208f4e..be0c6b18 100644 --- a/ui/tests/workflow_sidebar_live_sync.vitest.ts +++ b/ui/tests/workflow_sidebar_live_sync.vitest.ts @@ -19,27 +19,27 @@ vi.mock("../app/comfyApiBridge.js", () => ({ vi.mock("../features/viewer/workflowSidebar/NodeWidgetRenderer.js", () => ({ NodeWidgetRenderer: class NodeWidgetRendererMock { constructor(node, opts = {}) { - this._node = node; - this.node = node; - this.opts = opts; - this._expanded = opts.expanded !== false; - this.el = makeElement("section"); - this.el.dataset.nodeId = String(node?.id ?? ""); + (this as any)._node = node; + (this as any).node = node; + (this as any).opts = opts; + (this as any)._expanded = (opts as any).expanded !== false; + (this as any).el = makeElement("section"); + (this as any).el.dataset.nodeId = String(node?.id ?? ""); rendererState.constructed.push(node?.id ?? null); rendererState.instances.push(this); rendererState.options.push(opts); } setExpanded(expanded) { - this._expanded = Boolean(expanded); + (this as any)._expanded = Boolean(expanded); } syncFromGraph() { - rendererState.synced.push(this.node?.id ?? null); + rendererState.synced.push((this as any).node?.id ?? null); } dispose() { - rendererState.disposed.push(this.node?.id ?? null); + rendererState.disposed.push((this as any).node?.id ?? null); } }, })); @@ -144,14 +144,14 @@ describe("WorkflowSidebar live sync", () => { }, }; - globalThis.document = doc; - globalThis.window = { + globalThis.document = (doc as any); + globalThis.window = ({ ...(globalThis.window || {}), requestAnimationFrame: vi.fn(() => 1), cancelAnimationFrame: vi.fn(), setTimeout, clearTimeout, - }; + } as any); bridgeState.app = { canvas: {