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: {