From 04ca1f444ef9841d96ab6ee0163a34fb47b462fc Mon Sep 17 00:00:00 2001 From: Ewald <129623145+MajoorWaldi@users.noreply.github.com> Date: Wed, 3 Jun 2026 14:53:36 +0200 Subject: [PATCH] Improve workflow metadata filters and UI localization --- dist/assets/comfyui-majoor-assetsmanager.css | 2 +- ...CY901ToM.js => FloatingViewer-A8uTs2JS.js} | 2048 +-- ...3u-OV.js => LiveStreamTracker-mAm9Jo6q.js} | 4 +- ...ts.js => NodeStreamController-EQygLyLg.js} | 2 +- ....js => SidebarWorkflowSection-na0bq_pe.js} | 4244 ++--- dist/chunks/client-DZE_lzdb.js | 1578 ++ ...Adapter-D6BwD-lN.js => config-Cxv7acF8.js} | 3268 ++-- dist/chunks/config-dvcltBqE.js | 369 - ...2.js => floatingViewerManager-BSQ_h48I.js} | 441 +- ...enInfo-DPkTyDKA.js => genInfo-oNZ5Okna.js} | 237 +- dist/chunks/geninfoParser-5vKgjqjD.js | 477 + dist/chunks/geninfoParser-BE5lWeGw.js | 372 - ...HdtD9lDa.js => graphTraversal-CjIZsRsP.js} | 2 +- ...tGg_3hW.js => model3dRenderer-BtzSm2ZA.js} | 896 +- ...TA_W.js => openMajoorSettings-BeNfIQfY.js} | 932 +- ...ide-DX0t_oIi.js => sideBySide-Dp8qRb0r.js} | 4 +- dist/entry.js | 14616 ++++++++-------- mjr_am_backend/features/index/searcher.py | 23 + .../features/metadata/extractors.py | 5 + .../routes/search/query_sanitizer.py | 8 + ui/api/clientOps.ts | 5 +- ui/api/endpoints.ts | 8 + ui/app/dialogs.ts | 28 +- ui/app/graphTraversal.ts | 2 +- ui/app/hostAdapter.ts | 612 + ui/app/i18n.ts | 463 +- ui/app/openMajoorSettings.ts | 4 +- ui/app/settings/MajoorSettingsDialog.ts | 4 +- ui/app/settings/SettingsPanel.ts | 4 +- ui/app/toast.ts | 10 +- ui/components/Badges.ts | 50 +- ui/components/ViewerRuntime.ts | 5 +- .../sidebar/parsers/comfyWorkflowParser.ts | 145 + .../sidebar/parsers/geninfoParser.ts | 44 +- ui/components/sidebar/utils/minimap.ts | 3 +- .../filters/calendar/AgendaCalendar.ts | 23 +- ui/features/geninfo/genInfoOverridePicker.ts | 76 +- .../panel/controllers/contextController.ts | 18 + .../panel/controllers/filtersController.ts | 18 + .../panel/controllers/gridController.ts | 3 + ui/features/panel/panelFiltersInit.ts | 8 +- ui/features/panel/panelRuntime.ts | 3 + ui/features/panel/views/contextPillsView.ts | 11 + ui/features/viewer/floatingViewerManager.ts | 78 +- ui/features/viewer/floatingViewerProgress.ts | 102 +- ui/features/viewer/floatingViewerUi.ts | 14 +- ui/features/viewer/model3dRenderer.impl.ts | 21 +- ui/features/viewer/model3dSupport.ts | 23 +- .../workflowGraphMap/WorkflowGraphMapPanel.ts | 275 +- .../workflowGraphMapActions.ts | 51 +- .../workflowGraphMap/workflowGraphMapData.ts | 81 +- .../workflowSidebar/NodeWidgetRenderer.ts | 26 +- .../workflowSidebar/WorkflowNodesTab.ts | 45 +- .../viewer/workflowSidebar/WorkflowSidebar.ts | 9 +- .../workflowSidebar/sidebarRunButton.ts | 206 +- .../viewer/workflowSidebar/widgetAdapters.ts | 17 +- ui/integration/comfy_send_to_am.ts | 82 +- ui/stores/usePanelStore.ts | 7 + .../generation_prompt_sanitization.vitest.ts | 154 +- ui/tests/host_adapter_contract.vitest.ts | 260 + ui/tests/panel_primevue_controls.vitest.ts | 73 + ui/tests/use_grid_query.vitest.ts | 1 + ui/tests/use_grid_snapshot_cache.vitest.ts | 1 + ui/tests/workflow_graph_map_data.vitest.ts | 45 + ui/theme/theme-comfy.css | 300 + ui/vue/components/panel/FilterPopover.vue | 228 +- ui/vue/components/panel/HeaderSection.vue | 1 + .../panel/sidebar/AssetSidebarContent.vue | 5 +- .../panel/sidebar/SidebarFileInfoSection.vue | 119 +- .../panel/sidebar/SidebarFolderSection.vue | 23 +- .../sidebar/SidebarGenerationSection.vue | 104 +- .../panel/sidebar/SidebarWorkflowSection.vue | 48 +- .../panel/sidebar/generationSectionState.ts | 142 +- .../components/viewer/ViewerMetadataBlock.vue | 15 +- ui/vue/composables/useAssetsQuery.ts | 1 + ui/vue/composables/useGridLoader.ts | 1 + ui/vue/composables/useVirtualGrid.ts | 11 + ui/vue/grid/useGridQuery.ts | 5 + ui/vue/grid/useGridSnapshotCache.ts | 3 + 79 files changed, 18554 insertions(+), 15098 deletions(-) rename dist/chunks/{FloatingViewer-CY901ToM.js => FloatingViewer-A8uTs2JS.js} (72%) rename dist/chunks/{LiveStreamTracker-FHT3u-OV.js => LiveStreamTracker-mAm9Jo6q.js} (96%) rename dist/chunks/{NodeStreamController-_rtriits.js => NodeStreamController-EQygLyLg.js} (99%) rename dist/chunks/{SidebarWorkflowSection-CxD2u7Bb.js => SidebarWorkflowSection-na0bq_pe.js} (58%) create mode 100644 dist/chunks/client-DZE_lzdb.js rename dist/chunks/{hostAdapter-D6BwD-lN.js => config-Cxv7acF8.js} (57%) delete mode 100644 dist/chunks/config-dvcltBqE.js rename dist/chunks/{floatingViewerManager-Oat0dyM2.js => floatingViewerManager-BSQ_h48I.js} (50%) rename dist/chunks/{genInfo-DPkTyDKA.js => genInfo-oNZ5Okna.js} (70%) create mode 100644 dist/chunks/geninfoParser-5vKgjqjD.js delete mode 100644 dist/chunks/geninfoParser-BE5lWeGw.js rename dist/chunks/{graphTraversal-HdtD9lDa.js => graphTraversal-CjIZsRsP.js} (99%) rename dist/chunks/{model3dRenderer-DtGg_3hW.js => model3dRenderer-BtzSm2ZA.js} (57%) rename dist/chunks/{openMajoorSettings-CGhSTA_W.js => openMajoorSettings-BeNfIQfY.js} (68%) rename dist/chunks/{sideBySide-DX0t_oIi.js => sideBySide-Dp8qRb0r.js} (98%) create mode 100644 ui/tests/host_adapter_contract.vitest.ts diff --git a/dist/assets/comfyui-majoor-assetsmanager.css b/dist/assets/comfyui-majoor-assetsmanager.css index 4e5dbca7..bfdc9b7a 100644 --- a/dist/assets/comfyui-majoor-assetsmanager.css +++ b/dist/assets/comfyui-majoor-assetsmanager.css @@ -1,2 +1,2 @@ -.mjr-rating-badge[data-v-730159ba]{letter-spacing:1px;pointer-events:none;z-index:10;text-shadow:0 2px 6px #0009;background:#0000008c;border:1px solid #ffffff1f;border-radius:6px;justify-content:center;align-items:center;padding:2px 6px;font-size:13px;animation:.2s ease-out mjr-fade-in-730159ba;display:inline-flex;position:absolute;top:6px;right:6px;box-shadow:0 6px 18px #00000040}@keyframes mjr-fade-in-730159ba{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.mjr-tags-badge[data-v-2b45d539]{text-overflow:ellipsis;white-space:nowrap;pointer-events:none;z-index:10;background:#000c;border-radius:4px;max-width:calc(100% - 56px);padding:3px 6px;font-size:9px;animation:.2s ease-out mjr-fade-in-2b45d539;position:absolute;bottom:6px;left:6px;overflow:hidden;box-shadow:0 2px 4px #0000004d}@keyframes mjr-fade-in-2b45d539{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.mjr-gentime-badge[data-v-e8aef14a]{letter-spacing:.015em;pointer-events:none;z-index:10;text-shadow:0 1px 2px #000000e6, 0 0 10px color-mix(in srgb, currentColor 35%, transparent);-webkit-backdrop-filter:blur(2px);background:#0000008c;border:1px solid #ffffff1f;border-radius:4px;padding:2px 6px;font-size:10px;font-weight:800;line-height:1.1;position:absolute;bottom:6px;right:6px;box-shadow:0 2px 4px #0000004d}.mjr-grid-skeleton-layout[data-v-ddf2bbab]{grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:12px;display:grid}.mjr-grid-skeleton-card[data-v-ddf2bbab]{background:#c0c6ce33;border:1px solid #ffffff38;border-radius:12px;min-height:146px;overflow:hidden;box-shadow:0 6px 18px #0000003d}.mjr-grid-skeleton-thumb[data-v-ddf2bbab]{aspect-ratio:1;background:linear-gradient(90deg,#9ca2ab85 0%,#dce1e8b8 45%,#9ca2ab85 100%) 0 0/240% 100%;width:100%;animation:1.2s linear infinite mjr-grid-skeleton-shimmer-ddf2bbab}.mjr-grid-skeleton-line[data-v-ddf2bbab]{background:linear-gradient(90deg,#a4aab37a 0%,#d6dbe2b3 45%,#a4aab37a 100%) 0 0/240% 100%;border-radius:8px;height:10px;margin:8px 10px;animation:1.2s linear infinite mjr-grid-skeleton-shimmer-ddf2bbab}.mjr-grid-skeleton-line--title[data-v-ddf2bbab]{width:72%}.mjr-grid-skeleton-line--meta[data-v-ddf2bbab]{width:48%;margin-top:2px;margin-bottom:10px}@keyframes mjr-grid-skeleton-shimmer-ddf2bbab{0%{background-position:100% 0}to{background-position:-100% 0}}.mjr-popover-row[data-v-fee77a92]{grid-template-columns:110px 1fr;align-items:center;gap:8px;margin-bottom:8px;display:grid}.mjr-popover-row--3col[data-v-fee77a92]{grid-template-columns:110px 1fr 1fr}.mjr-popover-label[data-v-fee77a92]{color:var(--mjr-muted,var(--descrip-text,#ffffffa6));white-space:nowrap;font-size:12px}.mjr-popover-toggle[data-v-fee77a92]{cursor:pointer;color:var(--fg-color,#e6edf7);align-items:center;gap:6px;font-size:12px;display:flex}.mjr-filter-group-toggle[data-v-fee77a92]{width:100%;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px;padding:0;display:flex}.mjr-filter-group[data-v-fee77a92]{--mjr-filter-group-accent:var(--mjr-accent,#7aa2ff)}.mjr-filter-group--core[data-v-fee77a92]{--mjr-filter-group-accent:#56a8ff}.mjr-filter-group--media[data-v-fee77a92]{--mjr-filter-group-accent:#35d08b}.mjr-filter-group--time[data-v-fee77a92]{--mjr-filter-group-accent:#f0b84f}.mjr-filter-group-title[data-v-fee77a92]{color:color-mix(in srgb, var(--mjr-filter-group-accent) 62%, var(--content-fg,#ddd));letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:6px;font-size:11px;font-weight:700;display:inline-flex}.mjr-filter-group-title[data-v-fee77a92]:before{content:"";background:var(--mjr-filter-group-accent);border-radius:999px;flex:0 0 6px;width:6px;height:6px}.mjr-filter-group-chevron[data-v-fee77a92]{color:color-mix(in srgb, var(--mjr-filter-group-accent) 78%, var(--mjr-muted,#ffffffa6));font-size:12px;line-height:1}.mjr-filter-group-body[data-v-fee77a92]{padding-top:2px}.mjr-filter-group[data-v-fee77a92]:not(.is-open){padding-bottom:8px}.mjr-filter-group:not(.is-open) .mjr-filter-group-toggle[data-v-fee77a92]{margin-bottom:0}.mjr-pinned-folders-menu[data-v-7d86b0ee]{gap:6px;display:grid}.mjr-pinned-folders-empty[data-v-7d86b0ee]{opacity:.75;padding:10px 12px}.mjr-pinned-folder-row[data-v-7d86b0ee]{align-items:stretch;width:100%;display:flex}.mjr-pinned-folder-open[data-v-7d86b0ee]{background:linear-gradient(135deg,#ffffff08,#ffffff03);border:1px solid #78beff2e;border-radius:9px;flex:1;justify-content:space-between;align-items:center;gap:10px;width:100%;padding:9px 10px;transition:border-color .12s,background .12s;display:flex}.mjr-pinned-folder-open[data-v-7d86b0ee]:hover,.mjr-pinned-folder-open[data-v-7d86b0ee]:focus-visible{background:linear-gradient(135deg,#508cff2e,#2064c824);border-color:#91cdff66}.mjr-pinned-folder-label[data-v-7d86b0ee]{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--fg-color,#e6edf7);font-weight:600;overflow:hidden}.mjr-pinned-folder-path[data-v-7d86b0ee]{text-overflow:ellipsis;white-space:nowrap;opacity:.68;flex:0 auto;min-width:0;max-width:220px;font-size:11px;overflow:hidden}.mjr-pinned-folder-unpin[data-v-7d86b0ee]{background:linear-gradient(135deg,#ff464629,#a014141f);border:1px solid #ff5f5f59;border-radius:9px;justify-content:center;width:42px;margin-left:6px;padding:0}.mjr-pinned-folder-unpin .pi[data-v-7d86b0ee]{opacity:.88;color:#ff8282f5}.mjr-folder-breadcrumb[data-v-0bf75dfa]{--mjr-breadcrumb-accent:#56a8ff;--mjr-breadcrumb-current:#35d08b;opacity:.78;white-space:nowrap;border:1px solid color-mix(in srgb, var(--mjr-breadcrumb-accent) 22%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 9%, transparent);border-radius:8px;align-items:center;gap:4px;margin:1px 0 3px;padding:3px 6px;font-size:11px;display:none;overflow:auto}.mjr-folder-breadcrumb.is-visible[data-v-0bf75dfa]{display:flex}.mjr-folder-breadcrumb-action[data-v-0bf75dfa]{border:1px solid color-mix(in srgb, var(--mjr-breadcrumb-accent) 42%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 16%, transparent);color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 78%, #fff);font:inherit;border-radius:6px;padding:2px 8px}.mjr-folder-breadcrumb-action[data-v-0bf75dfa]:not(:disabled):hover{border-color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 62%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 24%, transparent)}.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]{background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 8%, transparent);min-width:0;max-width:220px;color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 76%, #fff);font:inherit;text-overflow:ellipsis;border:1px solid #0000;border-radius:5px;padding:1px 5px;overflow:hidden}.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]:not(:disabled):hover{border-color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 38%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 16%, transparent)}.mjr-folder-breadcrumb-segment.is-current[data-v-0bf75dfa],.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]:disabled{border-color:color-mix(in srgb, var(--mjr-breadcrumb-current) 38%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-current) 14%, transparent);color:color-mix(in srgb, var(--mjr-breadcrumb-current) 74%, #fff);cursor:default}.mjr-folder-breadcrumb-separator[data-v-0bf75dfa]{color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 58%, var(--mjr-muted,#ffffff9e));opacity:.9}.mjr-rating-star[data-v-d6a0ab11]{outline:none}.mjr-rating-star[data-v-d6a0ab11]:hover:not(:disabled){transform:scale(1.2)}.mjr-rating-star[data-v-d6a0ab11]:focus-visible{outline:2px solid var(--focus-outline-color,#4dabf7);outline-offset:2px;border-radius:2px} +.mjr-rating-badge[data-v-730159ba]{letter-spacing:1px;pointer-events:none;z-index:10;text-shadow:0 2px 6px #0009;background:#0000008c;border:1px solid #ffffff1f;border-radius:6px;justify-content:center;align-items:center;padding:2px 6px;font-size:13px;animation:.2s ease-out mjr-fade-in-730159ba;display:inline-flex;position:absolute;top:6px;right:6px;box-shadow:0 6px 18px #00000040}@keyframes mjr-fade-in-730159ba{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.mjr-tags-badge[data-v-2b45d539]{text-overflow:ellipsis;white-space:nowrap;pointer-events:none;z-index:10;background:#000c;border-radius:4px;max-width:calc(100% - 56px);padding:3px 6px;font-size:9px;animation:.2s ease-out mjr-fade-in-2b45d539;position:absolute;bottom:6px;left:6px;overflow:hidden;box-shadow:0 2px 4px #0000004d}@keyframes mjr-fade-in-2b45d539{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.mjr-gentime-badge[data-v-e8aef14a]{letter-spacing:.015em;pointer-events:none;z-index:10;text-shadow:0 1px 2px #000000e6, 0 0 10px color-mix(in srgb, currentColor 35%, transparent);-webkit-backdrop-filter:blur(2px);background:#0000008c;border:1px solid #ffffff1f;border-radius:4px;padding:2px 6px;font-size:10px;font-weight:800;line-height:1.1;position:absolute;bottom:6px;right:6px;box-shadow:0 2px 4px #0000004d}.mjr-grid-skeleton-layout[data-v-ddf2bbab]{grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:12px;display:grid}.mjr-grid-skeleton-card[data-v-ddf2bbab]{background:#c0c6ce33;border:1px solid #ffffff38;border-radius:12px;min-height:146px;overflow:hidden;box-shadow:0 6px 18px #0000003d}.mjr-grid-skeleton-thumb[data-v-ddf2bbab]{aspect-ratio:1;background:linear-gradient(90deg,#9ca2ab85 0%,#dce1e8b8 45%,#9ca2ab85 100%) 0 0/240% 100%;width:100%;animation:1.2s linear infinite mjr-grid-skeleton-shimmer-ddf2bbab}.mjr-grid-skeleton-line[data-v-ddf2bbab]{background:linear-gradient(90deg,#a4aab37a 0%,#d6dbe2b3 45%,#a4aab37a 100%) 0 0/240% 100%;border-radius:8px;height:10px;margin:8px 10px;animation:1.2s linear infinite mjr-grid-skeleton-shimmer-ddf2bbab}.mjr-grid-skeleton-line--title[data-v-ddf2bbab]{width:72%}.mjr-grid-skeleton-line--meta[data-v-ddf2bbab]{width:48%;margin-top:2px;margin-bottom:10px}@keyframes mjr-grid-skeleton-shimmer-ddf2bbab{0%{background-position:100% 0}to{background-position:-100% 0}}.mjr-filter-head[data-v-5ab0b6db]{border-bottom:1px solid color-mix(in srgb, var(--mjr-border) 85%, transparent);justify-content:space-between;align-items:flex-start;gap:10px;margin:0 0 10px;padding:4px 2px 10px;display:flex}.mjr-filter-head-left[data-v-5ab0b6db]{min-width:0}.mjr-filter-kicker[data-v-5ab0b6db]{letter-spacing:.09em;text-transform:uppercase;color:color-mix(in srgb, var(--mjr-accent,#5fb3ff) 65%, var(--content-fg,#ddd));font-size:11px;font-weight:800}.mjr-filter-subtitle[data-v-5ab0b6db]{color:color-mix(in srgb, var(--content-fg,#ddd) 62%, var(--mjr-muted,#ffffffa6));margin-top:2px;font-size:11px}.mjr-filter-head-actions[data-v-5ab0b6db]{flex:none;align-items:center;gap:8px;display:inline-flex}.mjr-filter-active-count[data-v-5ab0b6db]{border:1px solid color-mix(in srgb, var(--mjr-accent,#5fb3ff) 55%, var(--mjr-border));background:color-mix(in srgb, var(--mjr-accent,#5fb3ff) 18%, var(--mjr-surface-2));min-width:22px;height:22px;color:var(--content-fg,#fff);border-radius:999px;justify-content:center;align-items:center;padding:0 6px;font-size:11px;font-weight:700;line-height:1;display:inline-flex}.mjr-filter-clear-all[data-v-5ab0b6db]{border:1px solid color-mix(in srgb, var(--mjr-border) 75%, transparent);border-radius:999px;height:24px;padding:0 8px;font-size:11px;font-weight:700}.mjr-popover-row[data-v-5ab0b6db]{grid-template-columns:1fr;align-items:start;gap:8px;margin-bottom:10px;display:grid}.mjr-popover-row--3col[data-v-5ab0b6db]{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px}.mjr-popover-row--3col .mjr-popover-label[data-v-5ab0b6db]{grid-column:1/-1}.mjr-popover-label[data-v-5ab0b6db]{color:color-mix(in srgb, var(--content-fg,#ddd) 70%, var(--mjr-muted,#ffffffa6));white-space:normal;font-size:12px;font-weight:600}.mjr-popover-toggle[data-v-5ab0b6db]{cursor:pointer;color:var(--fg-color,#e6edf7);border:1px solid color-mix(in srgb, var(--mjr-border) 80%, transparent);background:color-mix(in srgb, var(--mjr-surface-2) 66%, transparent);border-radius:8px;align-items:center;gap:6px;padding:6px 8px;font-size:12px;display:flex}.mjr-filter-group-toggle[data-v-5ab0b6db]{width:100%;color:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:10px;margin:0 0 10px;padding:2px 4px;display:flex}.mjr-filter-group[data-v-5ab0b6db]{--mjr-filter-group-accent:var(--mjr-accent,#7aa2ff)}.mjr-filter-group--core[data-v-5ab0b6db]{--mjr-filter-group-accent:#56a8ff}.mjr-filter-group--media[data-v-5ab0b6db]{--mjr-filter-group-accent:#35d08b}.mjr-filter-group--time[data-v-5ab0b6db]{--mjr-filter-group-accent:#f0b84f}.mjr-filter-group-title[data-v-5ab0b6db]{color:color-mix(in srgb, var(--mjr-filter-group-accent) 62%, var(--content-fg,#ddd));letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:6px;font-size:11px;font-weight:700;display:inline-flex}.mjr-filter-group-title[data-v-5ab0b6db]:before{content:"";background:var(--mjr-filter-group-accent);border-radius:999px;flex:0 0 6px;width:6px;height:6px}.mjr-filter-group-chevron[data-v-5ab0b6db]{color:color-mix(in srgb, var(--mjr-filter-group-accent) 78%, var(--mjr-muted,#ffffffa6));font-size:12px;line-height:1}.mjr-filter-group-body[data-v-5ab0b6db]{padding-top:4px}.mjr-filter-card[data-v-5ab0b6db]{border:1px solid color-mix(in srgb, var(--mjr-border) 88%, transparent);background:linear-gradient(180deg, color-mix(in srgb, var(--mjr-surface-2) 86%, transparent), color-mix(in srgb, var(--mjr-surface-1) 88%, transparent));border-radius:10px;margin-bottom:8px;padding:10px}.mjr-filter-card[data-v-5ab0b6db]:last-child{margin-bottom:0}.mjr-filter-card--agenda[data-v-5ab0b6db]{background:linear-gradient(180deg, color-mix(in srgb, #f0b84f 9%, var(--mjr-surface-2)), color-mix(in srgb, var(--mjr-surface-1) 92%, transparent))}.mjr-filter-group[data-v-5ab0b6db]:not(.is-open){padding-bottom:8px}.mjr-filter-group:not(.is-open) .mjr-filter-group-toggle[data-v-5ab0b6db]{margin-bottom:0}@media (width<=440px){.mjr-filter-head[data-v-5ab0b6db]{flex-direction:column;align-items:stretch}.mjr-filter-head-actions[data-v-5ab0b6db]{justify-content:space-between}}.mjr-pinned-folders-menu[data-v-7d86b0ee]{gap:6px;display:grid}.mjr-pinned-folders-empty[data-v-7d86b0ee]{opacity:.75;padding:10px 12px}.mjr-pinned-folder-row[data-v-7d86b0ee]{align-items:stretch;width:100%;display:flex}.mjr-pinned-folder-open[data-v-7d86b0ee]{background:linear-gradient(135deg,#ffffff08,#ffffff03);border:1px solid #78beff2e;border-radius:9px;flex:1;justify-content:space-between;align-items:center;gap:10px;width:100%;padding:9px 10px;transition:border-color .12s,background .12s;display:flex}.mjr-pinned-folder-open[data-v-7d86b0ee]:hover,.mjr-pinned-folder-open[data-v-7d86b0ee]:focus-visible{background:linear-gradient(135deg,#508cff2e,#2064c824);border-color:#91cdff66}.mjr-pinned-folder-label[data-v-7d86b0ee]{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--fg-color,#e6edf7);font-weight:600;overflow:hidden}.mjr-pinned-folder-path[data-v-7d86b0ee]{text-overflow:ellipsis;white-space:nowrap;opacity:.68;flex:0 auto;min-width:0;max-width:220px;font-size:11px;overflow:hidden}.mjr-pinned-folder-unpin[data-v-7d86b0ee]{background:linear-gradient(135deg,#ff464629,#a014141f);border:1px solid #ff5f5f59;border-radius:9px;justify-content:center;width:42px;margin-left:6px;padding:0}.mjr-pinned-folder-unpin .pi[data-v-7d86b0ee]{opacity:.88;color:#ff8282f5}.mjr-folder-breadcrumb[data-v-0bf75dfa]{--mjr-breadcrumb-accent:#56a8ff;--mjr-breadcrumb-current:#35d08b;opacity:.78;white-space:nowrap;border:1px solid color-mix(in srgb, var(--mjr-breadcrumb-accent) 22%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 9%, transparent);border-radius:8px;align-items:center;gap:4px;margin:1px 0 3px;padding:3px 6px;font-size:11px;display:none;overflow:auto}.mjr-folder-breadcrumb.is-visible[data-v-0bf75dfa]{display:flex}.mjr-folder-breadcrumb-action[data-v-0bf75dfa]{border:1px solid color-mix(in srgb, var(--mjr-breadcrumb-accent) 42%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 16%, transparent);color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 78%, #fff);font:inherit;border-radius:6px;padding:2px 8px}.mjr-folder-breadcrumb-action[data-v-0bf75dfa]:not(:disabled):hover{border-color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 62%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 24%, transparent)}.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]{background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 8%, transparent);min-width:0;max-width:220px;color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 76%, #fff);font:inherit;text-overflow:ellipsis;border:1px solid #0000;border-radius:5px;padding:1px 5px;overflow:hidden}.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]:not(:disabled):hover{border-color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 38%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-accent) 16%, transparent)}.mjr-folder-breadcrumb-segment.is-current[data-v-0bf75dfa],.mjr-folder-breadcrumb-segment[data-v-0bf75dfa]:disabled{border-color:color-mix(in srgb, var(--mjr-breadcrumb-current) 38%, transparent);background:color-mix(in srgb, var(--mjr-breadcrumb-current) 14%, transparent);color:color-mix(in srgb, var(--mjr-breadcrumb-current) 74%, #fff);cursor:default}.mjr-folder-breadcrumb-separator[data-v-0bf75dfa]{color:color-mix(in srgb, var(--mjr-breadcrumb-accent) 58%, var(--mjr-muted,#ffffff9e));opacity:.9}.mjr-rating-star[data-v-d6a0ab11]{outline:none}.mjr-rating-star[data-v-d6a0ab11]:hover:not(:disabled){transform:scale(1.2)}.mjr-rating-star[data-v-d6a0ab11]:focus-visible{outline:2px solid var(--focus-outline-color,#4dabf7);outline-offset:2px;border-radius:2px} /*$vite$:1*/ \ No newline at end of file diff --git a/dist/chunks/FloatingViewer-CY901ToM.js b/dist/chunks/FloatingViewer-A8uTs2JS.js similarity index 72% rename from dist/chunks/FloatingViewer-CY901ToM.js rename to dist/chunks/FloatingViewer-A8uTs2JS.js index 87345be9..34078f74 100644 --- a/dist/chunks/FloatingViewer-CY901ToM.js +++ b/dist/chunks/FloatingViewer-A8uTs2JS.js @@ -1,27 +1,27 @@ -import { Bt as e, Dt as t, Ht as n, a as r, f as i, h as a, o } from "./hostAdapter-D6BwD-lN.js"; -import { a as s, m as c, t as l } from "./config-dvcltBqE.js"; -import { a as u, c as d, i as f, n as p, o as m, r as h, v as g, y as _ } from "./SidebarWorkflowSection-CxD2u7Bb.js"; -import { r as v } from "./events-BnkL6-b6.js"; -import { a as y, i as b, o as x, s as S } from "./graphTraversal-HdtD9lDa.js"; -import { _ as C, c as w, f as ee, g as T, h as te, i as E, l as D, n as O, r as k, s as ne, t as A, v as j, y as M } from "./openMajoorSettings-CGhSTA_W.js"; -import { a as N, n as re, r as ie } from "./model3dRenderer-DtGg_3hW.js"; -import { i as ae, o as P, r as oe, t as se } from "./geninfoParser-BE5lWeGw.js"; -import { t as F } from "./genInfo-DPkTyDKA.js"; +import { _t as e, a as t, n } from "./client-DZE_lzdb.js"; +import { D as r, E as i, M as a, O as o, S as s, T as c, _ as l, g as u, j as d, k as f, l as p, nt as m, p as h, q as g, t as _, v } from "./config-Cxv7acF8.js"; +import { a as y, i as b, o as x, s as S } from "./graphTraversal-CjIZsRsP.js"; +import { a as C, b as w, c as T, i as E, n as D, o as O, r as k, y as A } from "./SidebarWorkflowSection-na0bq_pe.js"; +import { r as j } from "./events-BnkL6-b6.js"; +import { _ as M, c as N, f as ee, g as P, h as F, i as te, l as ne, n as re, r as ie, s as ae, t as oe, v as se, y as I } from "./openMajoorSettings-BeNfIQfY.js"; +import { a as L, n as ce, r as le } from "./model3dRenderer-BtzSm2ZA.js"; +import { i as ue, o as R, r as de, t as fe } from "./geninfoParser-5vKgjqjD.js"; +import { t as pe } from "./genInfo-oNZ5Okna.js"; //#region ui/features/viewer/floatingViewerConstants.ts -var I = Object.freeze({ +var z = Object.freeze({ SIMPLE: "simple", AB: "ab", SIDE: "side", GRID: "grid", GRAPH: "graph" -}), L = .25, R = 8e-4, z = 30; -function B(e) { +}), me = .25, he = 8e-4, ge = 30; +function _e(e) { let t = Number(e); if (!Number.isFinite(t) || t < 0) return "0:00"; let n = Math.floor(t), r = Math.floor(n / 3600), i = Math.floor(n % 3600 / 60), a = n % 60; return r > 0 ? `${r}:${String(i).padStart(2, "0")}:${String(a).padStart(2, "0")}` : `${i}:${String(a).padStart(2, "0")}`; } -function ce(e) { +function ve(e) { try { let t = e?.play?.(); t && typeof t.catch == "function" && t.catch(() => {}); @@ -29,40 +29,40 @@ function ce(e) { console.debug?.(e); } } -function le(e, t) { +function ye(e, t) { let n = Math.floor(Number(e) || 0), r = Math.max(0, Math.floor(Number(t) || 0)); return n < 0 ? 0 : r > 0 && n > r ? r : n; } -function ue(e, t) { - let n = Number(e?.currentTime || 0), r = Number(t) > 0 ? Number(t) : z; +function be(e, t) { + let n = Number(e?.currentTime || 0), r = Number(t) > 0 ? Number(t) : ge; return Math.max(0, Math.floor(n * r)); } -function de(e, t) { - let n = Number(e?.duration || 0), r = Number(t) > 0 ? Number(t) : z; +function xe(e, t) { + let n = Number(e?.duration || 0), r = Number(t) > 0 ? Number(t) : ge; return !Number.isFinite(n) || n <= 0 ? 0 : Math.max(0, Math.floor(n * r)); } -function fe(e, t, n) { - let r = Number(n) > 0 ? Number(n) : z, i = le(t, de(e, r)) / r; +function Se(e, t, n) { + let r = Number(n) > 0 ? Number(n) : ge, i = ye(t, xe(e, r)) / r; try { e.currentTime = Math.max(0, i); } catch (e) { console.debug?.(e); } } -function pe(e) { +function Ce(e) { return e instanceof HTMLMediaElement; } -function me(e, t) { +function we(e, t) { return String(e || "").toLowerCase() === "video" ? !0 : t instanceof HTMLVideoElement; } -function he(e, t) { +function Te(e, t) { return String(e || "").toLowerCase() === "audio" ? !0 : t instanceof HTMLAudioElement; } -function ge(e) { +function Ee(e) { let t = String(e || "").toLowerCase(); return t === "gif" || t === "animated-image"; } -function _e(e) { +function De(e) { try { let t = Number(e?.naturalWidth || e?.width || 0), n = Number(e?.naturalHeight || e?.height || 0); if (!(t > 0 && n > 0)) return ""; @@ -74,10 +74,10 @@ function _e(e) { return console.debug?.(e), ""; } } -function ve(e, t = null, { kind: n = "" } = {}) { +function Oe(e, t = null, { kind: n = "" } = {}) { if (!e || e._mjrSimplePlayerMounted) return e?.parentElement || null; e._mjrSimplePlayerMounted = !0; - let r = g(t) || z, i = pe(e), a = me(n, e), o = he(n, e), s = ge(n), c = document.createElement("div"); + let r = A(t) || ge, i = Ce(e), a = we(n, e), o = Te(n, e), s = Ee(n), c = document.createElement("div"); c.className = "mjr-mfv-simple-player", c.tabIndex = 0, c.setAttribute("role", "group"), c.setAttribute("aria-label", "Media player"), o && c.classList.add("is-audio"), s && c.classList.add("is-animated-image"); let l = document.createElement("div"); l.className = "mjr-mfv-simple-player-controls"; @@ -93,18 +93,18 @@ function ve(e, t = null, { kind: n = "" } = {}) { m.type = "button", m.className = "mjr-icon-btn mjr-mfv-simple-player-btn", m.setAttribute("aria-label", "Step back"); let h = document.createElement("i"); h.className = "pi pi-step-backward", h.setAttribute("aria-hidden", "true"), m.appendChild(h); - let _ = document.createElement("button"); - _.type = "button", _.className = "mjr-icon-btn mjr-mfv-simple-player-btn", _.setAttribute("aria-label", "Step forward"); - let v = document.createElement("i"); - v.className = "pi pi-step-forward", v.setAttribute("aria-hidden", "true"), _.appendChild(v); + let g = document.createElement("button"); + g.type = "button", g.className = "mjr-icon-btn mjr-mfv-simple-player-btn", g.setAttribute("aria-label", "Step forward"); + let _ = document.createElement("i"); + _.className = "pi pi-step-forward", _.setAttribute("aria-hidden", "true"), g.appendChild(_); + let v = document.createElement("div"); + v.className = "mjr-mfv-simple-player-time", v.textContent = "0:00 / 0:00"; let y = document.createElement("div"); - y.className = "mjr-mfv-simple-player-time", y.textContent = "0:00 / 0:00"; - let b = document.createElement("div"); - b.className = "mjr-mfv-simple-player-frame", b.textContent = "F: 0", a || (b.style.display = "none"); - let x = document.createElement("button"); - x.type = "button", x.className = "mjr-icon-btn mjr-mfv-simple-player-btn", x.setAttribute("aria-label", "Mute/Unmute"); - let S = document.createElement("i"); - if (S.className = "pi pi-volume-up", S.setAttribute("aria-hidden", "true"), x.appendChild(S), a || (m.disabled = !0, _.disabled = !0, m.classList.add("is-disabled"), _.classList.add("is-disabled")), d.appendChild(m), d.appendChild(f), d.appendChild(_), d.appendChild(y), d.appendChild(b), d.appendChild(x), l.appendChild(u), l.appendChild(d), c.appendChild(e), o) { + y.className = "mjr-mfv-simple-player-frame", y.textContent = "F: 0", a || (y.style.display = "none"); + let b = document.createElement("button"); + b.type = "button", b.className = "mjr-icon-btn mjr-mfv-simple-player-btn", b.setAttribute("aria-label", "Mute/Unmute"); + let x = document.createElement("i"); + if (x.className = "pi pi-volume-up", x.setAttribute("aria-hidden", "true"), b.appendChild(x), a || (m.disabled = !0, g.disabled = !0, m.classList.add("is-disabled"), g.classList.add("is-disabled")), d.appendChild(m), d.appendChild(f), d.appendChild(g), d.appendChild(v), d.appendChild(y), d.appendChild(b), l.appendChild(u), l.appendChild(d), c.appendChild(e), o) { let e = document.createElement("div"); e.className = "mjr-mfv-simple-player-audio-backdrop", e.textContent = String(t?.filename || "Audio"), c.appendChild(e); } @@ -114,73 +114,73 @@ function ve(e, t = null, { kind: n = "" } = {}) { } catch (e) { console.debug?.(e); } - let C = s ? String(e?.src || "") : "", w = !1, ee = "", T = () => { + let S = s ? String(e?.src || "") : "", C = !1, w = "", T = () => { if (i) { p.className = e.paused ? "pi pi-play" : "pi pi-pause"; return; } if (s) { - p.className = w ? "pi pi-play" : "pi pi-pause"; + p.className = C ? "pi pi-play" : "pi pi-pause"; return; } p.className = "pi pi-play"; - }, te = () => { + }, E = () => { if (e instanceof HTMLMediaElement) { - S.className = e.muted ? "pi pi-volume-off" : "pi pi-volume-up"; + x.className = e.muted ? "pi pi-volume-off" : "pi pi-volume-up"; return; } - S.className = "pi pi-volume-off", x.disabled = !0, x.classList.add("is-disabled"); - }, E = () => { - if (!a || !(e instanceof HTMLVideoElement)) return; - let t = ue(e, r), n = de(e, r); - b.textContent = n > 0 ? `F: ${t}/${n}` : `F: ${t}`; + x.className = "pi pi-volume-off", b.disabled = !0, b.classList.add("is-disabled"); }, D = () => { + if (!a || !(e instanceof HTMLVideoElement)) return; + let t = be(e, r), n = xe(e, r); + y.textContent = n > 0 ? `F: ${t}/${n}` : `F: ${t}`; + }, O = () => { let e = Math.max(0, Math.min(100, Number(u.value) / 1e3 * 100)); u.style.setProperty("--mjr-seek-pct", `${e}%`); - }, O = () => { + }, k = () => { if (!i) { - y.textContent = s ? "Animated" : "Preview", u.value = "0", D(); + v.textContent = s ? "Animated" : "Preview", u.value = "0", O(); return; } let t = Number(e.currentTime || 0), n = Number(e.duration || 0); if (Number.isFinite(n) && n > 0) { let e = Math.max(0, Math.min(1, t / n)); - u.value = String(Math.round(e * 1e3)), y.textContent = `${B(t)} / ${B(n)}`; - } else u.value = "0", y.textContent = `${B(t)} / 0:00`; - D(); - }, k = (e) => { + u.value = String(Math.round(e * 1e3)), v.textContent = `${_e(t)} / ${_e(n)}`; + } else u.value = "0", v.textContent = `${_e(t)} / 0:00`; + O(); + }, j = (e) => { try { e?.stopPropagation?.(); } catch {} - }, ne = (t) => { - k(t); + }, M = (t) => { + j(t); try { - i ? e.paused ? ce(e) : e.pause?.() : s && (w ? (e.src = C ? `${C}${C.includes("?") ? "&" : "?"}mjr_anim=${Date.now()}` : e.src, w = !1) : (ee ||= _e(e), ee && (e.src = ee), w = !0)); + i ? e.paused ? ve(e) : e.pause?.() : s && (C ? (e.src = S ? `${S}${S.includes("?") ? "&" : "?"}mjr_anim=${Date.now()}` : e.src, C = !1) : (w ||= De(e), w && (e.src = w), C = !0)); } catch (e) { console.debug?.(e); } T(); - }, A = (t, n) => { - if (k(n), !(!a || !(e instanceof HTMLVideoElement))) { + }, N = (t, n) => { + if (j(n), !(!a || !(e instanceof HTMLVideoElement))) { try { e.pause?.(); } catch (e) { console.debug?.(e); } - fe(e, ue(e, r) + t, r), T(), E(), O(); + Se(e, be(e, r) + t, r), T(), D(), k(); } - }, j = (t) => { - if (k(t), e instanceof HTMLMediaElement) { + }, ee = (t) => { + if (j(t), e instanceof HTMLMediaElement) { try { e.muted = !e.muted; } catch (e) { console.debug?.(e); } - te(); + E(); } - }, M = (t) => { - if (k(t), !i) return; - D(); + }, P = (t) => { + if (j(t), !i) return; + O(); let n = Number(e.duration || 0); if (!Number.isFinite(n) || n <= 0) return; let r = Math.max(0, Math.min(1, Number(u.value) / 1e3)); @@ -189,9 +189,9 @@ function ve(e, t = null, { kind: n = "" } = {}) { } catch (e) { console.debug?.(e); } - E(), O(); - }, N = (e) => k(e); - return f.addEventListener("click", ne), m.addEventListener("click", (e) => A(-1, e)), _.addEventListener("click", (e) => A(1, e)), x.addEventListener("click", j), u.addEventListener("input", M), l.addEventListener("pointerdown", N), l.addEventListener("click", N), l.addEventListener("dblclick", N), c.addEventListener("pointerdown", (e) => { + D(), k(); + }, F = (e) => j(e); + return f.addEventListener("click", M), m.addEventListener("click", (e) => N(-1, e)), g.addEventListener("click", (e) => N(1, e)), b.addEventListener("click", ee), u.addEventListener("input", P), l.addEventListener("pointerdown", F), l.addEventListener("click", F), l.addEventListener("dblclick", F), c.addEventListener("pointerdown", (e) => { try { if (e?.target?.closest?.("button, input, textarea, select")) return; c.focus?.({ preventScroll: !0 }); @@ -202,36 +202,36 @@ function ve(e, t = null, { kind: n = "" } = {}) { let t = String(e?.key || ""); if (!(!t || e?.altKey || e?.ctrlKey || e?.metaKey)) { if (t === " " || t === "Spacebar") { - e.preventDefault?.(), ne(e); + e.preventDefault?.(), M(e); return; } if (t === "ArrowLeft") { if (!a) return; - e.preventDefault?.(), A(-1, e); + e.preventDefault?.(), N(-1, e); return; } if (t === "ArrowRight") { if (!a) return; - e.preventDefault?.(), A(1, e); + e.preventDefault?.(), N(1, e); } } }), e instanceof HTMLMediaElement && (e.addEventListener("play", T, { passive: !0 }), e.addEventListener("pause", T, { passive: !0 }), e.addEventListener("timeupdate", () => { - E(), O(); + D(), k(); }, { passive: !0 }), e.addEventListener("seeked", () => { - E(), O(); + D(), k(); }, { passive: !0 }), e.addEventListener("loadedmetadata", () => { - E(), O(); - }, { passive: !0 })), ce(e), T(), te(), E(), O(), c; + D(), k(); + }, { passive: !0 })), ve(e), T(), E(), D(), k(), c; } //#endregion //#region ui/features/viewer/floatingViewerMedia.ts -var ye = new Set([ +var ke = new Set([ ".mp4", ".webm", ".mov", ".avi", ".mkv" -]), be = new Set([ +]), Ae = new Set([ ".mp3", ".wav", ".flac", @@ -241,7 +241,7 @@ var ye = new Set([ ".opus", ".wma" ]); -function xe(e) { +function je(e) { try { let t = String(e || "").trim(), n = t.lastIndexOf("."); return n >= 0 ? t.slice(n).toLowerCase() : ""; @@ -249,7 +249,7 @@ function xe(e) { return ""; } } -function V(e) { +function B(e) { let t = String(e?.kind || "").toLowerCase(); if (t === "video") return "video"; if (t === "audio") return "audio"; @@ -258,21 +258,21 @@ function V(e) { if (r === "video") return "video"; if (r === "audio") return "audio"; if (r === "model3d") return "model3d"; - let i = xe(e?.filename || ""); - return i === ".gif" ? "gif" : ye.has(i) ? "video" : be.has(i) ? "audio" : re.has(i) ? "model3d" : "image"; + let i = je(e?.filename || ""); + return i === ".gif" ? "gif" : ke.has(i) ? "video" : Ae.has(i) ? "audio" : ce.has(i) ? "model3d" : "image"; } -function Se(e) { - return e ? e.url ? String(e.url) : e.filename && e.id == null ? c(e.filename, e.subfolder || "", e.type || "output") : e.filename && s(e) || "" : ""; +function Me(e) { + return e ? e.url ? String(e.url) : e.filename && e.id == null ? m(e.filename, e.subfolder || "", e.type || "output") : e.filename && g(e) || "" : ""; } -function H(e = "No media - select assets in the grid") { +function V(e = "No media - select assets in the grid") { let t = document.createElement("div"); return t.className = "mjr-mfv-empty", t.textContent = e, t; } -function U(e, t) { +function H(e, t) { let n = document.createElement("div"); return n.className = `mjr-mfv-label label-${t}`, n.textContent = e, n; } -function Ce(e) { +function Ne(e) { if (!(!e || typeof e.play != "function")) try { let t = e.play(); t && typeof t.catch == "function" && t.catch(() => {}); @@ -280,7 +280,7 @@ function Ce(e) { console.debug?.(e); } } -function we(e, t) { +function Pe(e, t) { let n = e && e.nodeType === 1 ? e : e?.parentElement || null; for (; n && n !== t;) { try { @@ -293,7 +293,7 @@ function we(e, t) { } return null; } -function Te(e, t, n) { +function Fe(e, t, n) { if (!e) return !1; if (Math.abs(Number(n) || 0) >= Math.abs(Number(t) || 0)) { let t = Number(e.scrollTop || 0), r = Math.max(0, Number(e.scrollHeight || 0) - Number(e.clientHeight || 0)); @@ -302,7 +302,7 @@ function Te(e, t, n) { let r = Number(e.scrollLeft || 0), i = Math.max(0, Number(e.scrollWidth || 0) - Number(e.clientWidth || 0)); return t < 0 && r > 0 || t > 0 && r < i; } -function Ee(e) { +function Ie(e) { if (e) try { let t = e.querySelectorAll?.("video, audio"); if (!t || !t.length) return; @@ -315,10 +315,10 @@ function Ee(e) { console.debug?.(e); } } -function W(e, { fill: t = !1, controls: n = !0 } = {}) { - let r = Se(e); +function U(e, { fill: t = !1, controls: n = !0 } = {}) { + let r = Me(e); if (!r) return null; - let i = V(e), a = `mjr-mfv-media mjr-mfv-media--fit-height${t ? " mjr-mfv-media--fill" : ""}`, o = xe(e?.filename || "") === ".webp" && Number(e?.duration ?? e?.metadata_raw?.duration ?? 0) > 0, s = (r, i) => { + let i = B(e), a = `mjr-mfv-media mjr-mfv-media--fit-height${t ? " mjr-mfv-media--fill" : ""}`, o = je(e?.filename || "") === ".webp" && Number(e?.duration ?? e?.metadata_raw?.duration ?? 0) > 0, s = (r, i) => { if (!n) return r; let a = document.createElement("div"); a.className = `mjr-mfv-player-host${t ? " mjr-mfv-player-host--fill" : ""}`, a.appendChild(r); @@ -326,8 +326,8 @@ function W(e, { fill: t = !1, controls: n = !0 } = {}) { variant: "viewer", hostEl: a, mediaKind: i, - initialFps: g(e) || void 0, - initialFrameCount: _(e, g(e)) || void 0 + initialFps: A(e) || void 0, + initialFrameCount: w(e, A(e)) || void 0 }); try { o && (a._mjrMediaControlsHandle = o); @@ -340,45 +340,45 @@ function W(e, { fill: t = !1, controls: n = !0 } = {}) { let e = document.createElement("audio"); e.className = a, e.src = r, e.controls = !1, e.autoplay = !0, e.preload = "metadata", e.loop = !0, e.muted = !0; try { - e.addEventListener("loadedmetadata", () => Ce(e), { once: !0 }); + e.addEventListener("loadedmetadata", () => Ne(e), { once: !0 }); } catch (e) { console.debug?.(e); } - return Ce(e), s(e, "audio"); + return Ne(e), s(e, "audio"); } if (i === "video") { let e = document.createElement("video"); return e.className = a, e.src = r, e.controls = !1, e.loop = !0, e.muted = !0, e.autoplay = !0, e.playsInline = !0, s(e, "video"); } - if (i === "model3d") return ie(e, r, { + if (i === "model3d") return le(e, r, { hostClassName: `mjr-model3d-host mjr-mfv-model3d-host${t ? " mjr-mfv-model3d-host--fill" : ""}`, canvasClassName: `mjr-mfv-media mjr-model3d-render-canvas${t ? " mjr-mfv-media--fill" : ""}`, hintText: "Rotate: left drag Pan: right drag Zoom: wheel or middle drag", disableViewerTransform: !0, - pauseDuringExecution: !!l.FLOATING_VIEWER_PAUSE_DURING_EXECUTION + pauseDuringExecution: !!_.FLOATING_VIEWER_PAUSE_DURING_EXECUTION }); let c = document.createElement("img"); - return c.className = a, c.src = r, c.alt = String(e?.filename || ""), c.draggable = !1, (i === "gif" || o) && ve(c, e, { kind: i === "gif" ? "gif" : "animated-image" }) || c; + return c.className = a, c.src = r, c.alt = String(e?.filename || ""), c.draggable = !1, (i === "gif" || o) && Oe(c, e, { kind: i === "gif" ? "gif" : "animated-image" }) || c; } -function De(e, t, n, r, i, a) { +function Le(e, t, n, r, i, a) { e.beginPath(), typeof e.roundRect == "function" ? e.roundRect(t, n, r, i, a) : (e.moveTo(t + a, n), e.lineTo(t + r - a, n), e.quadraticCurveTo(t + r, n, t + r, n + a), e.lineTo(t + r, n + i - a), e.quadraticCurveTo(t + r, n + i, t + r - a, n + i), e.lineTo(t + a, n + i), e.quadraticCurveTo(t, n + i, t, n + i - a), e.lineTo(t, n + a), e.quadraticCurveTo(t, n, t + a, n), e.closePath()); } -function G(e, t, n, r) { +function W(e, t, n, r) { e.save(), e.font = "bold 10px system-ui, sans-serif"; let i = e.measureText(t).width; - e.fillStyle = "rgba(0,0,0,0.58)", De(e, n, r, i + 10, 18, 4), e.fill(), e.fillStyle = "#fff", e.fillText(t, n + 5, r + 13), e.restore(); + e.fillStyle = "rgba(0,0,0,0.58)", Le(e, n, r, i + 10, 18, 4), e.fill(), e.fillStyle = "#fff", e.fillText(t, n + 5, r + 13), e.restore(); } //#endregion //#region ui/features/viewer/workflowSidebar/NodeWidgetRenderer.ts -var Oe = new Set([ +var Re = new Set([ "imageupload", "button", "hidden" -]), ke = /\bnote\b|markdown/i; -function Ae(e) { - return ke.test(String(e?.type || "")); +]), ze = /\bnote\b|markdown/i; +function Be(e) { + return ze.test(String(e?.type || "")); } -function je(e) { +function Ve(e) { let t = e?.properties ?? {}; if (typeof t.text == "string") return t.text; if (typeof t.value == "string") return t.value; @@ -386,35 +386,35 @@ function je(e) { let n = e?.widgets?.[0]; return n != null && n.value != null ? String(n.value) : ""; } -function Me(e, t) { +function He(e, t) { let n = e?.properties; n && ("text" in n ? n.text = t : "value" in n ? n.value = t : "markdown" in n ? n.markdown = t : n.text = t); let r = e?.widgets?.[0]; r && (r.value = t); } -var Ne = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Pe = /^[0-9a-f]{20,}$/i; -function Fe(...e) { +var Ue = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, We = /^[0-9a-f]{20,}$/i; +function Ge(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function Ie(e) { - return Ne.test(e) || Pe.test(e); +function Ke(e) { + return Ue.test(e) || We.test(e); } -function Le(e) { - return Fe(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); +function qe(e) { + return Ge(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); } -function Re(e, { isSubgraph: t = !1 } = {}) { - let n = String(e?.type || "").trim(), r = Le(e); - return (t || Ie(n)) && r ? r : Ie(n) ? "Subgraph" : n || r || `Node #${e?.id}`; +function Je(e, { isSubgraph: t = !1 } = {}) { + let n = String(e?.type || "").trim(), r = qe(e); + return (t || Ke(n)) && r ? r : Ke(n) ? "Subgraph" : n || r || `Node #${e?.id}`; } -function ze(e, t, { isSubgraph: n = !1 } = {}) { - let r = String(e?.type || "").trim(), i = Le(e); - return n && r && !Ie(r) && r !== t ? r : i && i !== r && i !== t ? i : ""; +function Ye(e, t, { isSubgraph: n = !1 } = {}) { + let r = String(e?.type || "").trim(), i = qe(e); + return n && r && !Ke(r) && r !== t ? r : i && i !== r && i !== t ? i : ""; } -var Be = class { +var Xe = class { _node; _onLocate; _onToggle; @@ -441,7 +441,7 @@ var Be = class { syncFromGraph() { if (this._noteTextarea) { if ((this._el?.ownerDocument || document)?.activeElement !== this._noteTextarea) { - let e = je(this._node); + let e = Ve(this._node); this._noteTextarea.value !== e && (this._noteTextarea.value = e, this._noteTextarea._mjrAutoFit?.()); } return; @@ -449,7 +449,7 @@ var Be = class { if (!this._node?.widgets) return; let e = (this._el?.ownerDocument || document)?.activeElement || null; for (let t of this._node.widgets) { - let n = this._inputMap.get(t.name), r = Ve(n); + let n = this._inputMap.get(t.name), r = Ze(n); if (!r) continue; if (r.type === "checkbox") { let e = !!t.value; @@ -485,12 +485,12 @@ var Be = class { r.className = "mjr-ws-node-title-wrap"; let i = document.createElement("span"); i.className = "mjr-ws-node-type"; - let a = Re(e, { isSubgraph: this._isSubgraph }); + let a = Je(e, { isSubgraph: this._isSubgraph }); i.textContent = a, r.appendChild(i); - let s = ze(e, a, { isSubgraph: this._isSubgraph }); - if (s) { + let o = Ye(e, a, { isSubgraph: this._isSubgraph }); + if (o) { let e = document.createElement("span"); - e.className = "mjr-ws-node-title", e.textContent = s, r.appendChild(e); + e.className = "mjr-ws-node-title", e.textContent = o, r.appendChild(e); } if (n.appendChild(r), this._isSubgraph) { let e = document.createElement("span"); @@ -502,50 +502,47 @@ var Be = class { let i = document.createElement("span"); i.className = "mjr-ws-node-kind-count", i.textContent = String(this._childCount), e.appendChild(i), n.appendChild(e), this._subgraphHeaderTitle = `${a} · Subgraph · ${this._childCount} inner node${this._childCount === 1 ? "" : "s"}`, n.title = this._subgraphHeaderTitle; } - let c = document.createElement("button"); - c.type = "button", c.className = "mjr-icon-btn mjr-ws-locate", c.title = "Locate on canvas", c.innerHTML = "", c.addEventListener("click", (e) => { + let s = document.createElement("button"); + s.type = "button", s.className = "mjr-icon-btn mjr-ws-locate", s.title = "Locate on canvas", s.innerHTML = "", s.addEventListener("click", (e) => { e.stopPropagation(), this._locateNode(); - }), n.appendChild(c), t.appendChild(n); - let l = document.createElement("div"); - if (l.className = "mjr-ws-node-body", Ae(e)) { + }), n.appendChild(s), t.appendChild(n); + let c = document.createElement("div"); + if (c.className = "mjr-ws-node-body", Be(e)) { let n = document.createElement("textarea"); - n.className = "mjr-ws-input mjr-ws-textarea mjr-ws-note-textarea", n.value = je(e), n.rows = 4; + n.className = "mjr-ws-input mjr-ws-textarea mjr-ws-note-textarea", n.value = Ve(e), n.rows = 4; let r = () => { n.style.height = "auto", n.style.height = n.scrollHeight + "px"; }; return n.addEventListener("input", () => { - Me(e, n.value); + He(e, n.value); 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 { - let t = o(), n = t?.canvas ?? null; - n?.setDirty?.(!0, !0), n?.draw?.(!0, !0); - let r = e?.graph ?? null; - r && r !== t?.graph && (r.setDirtyCanvas?.(!0, !0), r.change?.()), t?.graph?.change?.(); + f(e); } catch {} - }), n._mjrAutoFit = r, this._noteTextarea = n, this._autoFits.push(r), l.appendChild(n), this._body = l, t.appendChild(l), this._el = t, this._applyExpandedState(), requestAnimationFrame(r), t; + }), 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 (Oe.has(n) || t.hidden || t.options?.hidden) continue; - d = !0; + if (Re.has(n) || t.hidden || t.options?.hidden) continue; + 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"); a.className = "mjr-ws-widget-label", a.textContent = t.name || ""; let o = document.createElement("div"); o.className = "mjr-ws-widget-input"; - let s = O(t, () => {}, e); + let s = re(t, () => {}, e); o.appendChild(s), this._inputMap.set(t.name, s); - let c = s._mjrAutoFit ?? s.querySelector?.("textarea")?._mjrAutoFit; - c && this._autoFits.push(c), i.appendChild(a), i.appendChild(o), l.appendChild(i); + 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", l.appendChild(e); + e.className = "mjr-ws-node-empty", e.textContent = "No editable parameters", c.appendChild(e); } - return this._body = l, t.appendChild(l), this._el = t, this._applyExpandedState(), t; + return this._body = c, t.appendChild(c), this._el = t, this._applyExpandedState(), t; } _applyExpandedState() { if (!(!this._el || !this._body)) { @@ -568,24 +565,21 @@ var Be = class { } let e = this._node; if (e) try { - let t = o()?.canvas; - if (!t) return; - if (typeof t.centerOnNode == "function") t.centerOnNode(e); - else if (t.ds && e.pos) { - let n = t.canvas?.width || t.element?.width || 800, r = t.canvas?.height || t.element?.height || 600; - t.ds.offset[0] = -e.pos[0] - (e.size?.[0] || 0) / 2 + n / 2, t.ds.offset[1] = -e.pos[1] - (e.size?.[1] || 0) / 2 + r / 2, t.setDirty?.(!0, !0); - } + l(e, { + select: !1, + focusCanvas: !1 + }); } catch (e) { console.debug?.("[MFV sidebar] locateNode error", e); } } }; -function Ve(e) { +function Ze(e) { return e ? e.classList?.contains?.("mjr-ws-text-wrapper") ? e.querySelector?.("textarea") ?? e : e : null; } //#endregion //#region ui/features/viewer/workflowSidebar/WorkflowNodesTab.ts -var He = () => o(), Ue = class { +var Qe = class { _searchQuery; _expandedNodeIds; _expandedChildrenIds; @@ -627,7 +621,7 @@ var He = () => o(), Ue = class { }), t.appendChild(r), e.appendChild(t), this._list = document.createElement("div"), this._list.className = "mjr-ws-nodes-list", e.appendChild(this._list), e; } _syncCanvasSelection() { - let e = Ze()[0] || "", t = null; + let e = ot()[0] || "", t = null; for (let n of this._renderers) { let r = String(n._node?.id ?? "") === e; n.el?.classList?.toggle("is-selected-from-graph", r), r && (t = n); @@ -652,7 +646,7 @@ var He = () => o(), Ue = class { } } _maybeRebuildList() { - let e = Ke(We()), t = (this._searchQuery || "").toLowerCase().trim(), n = t ? qe(e, t) : e, r = Je(n); + let e = tt($e()), t = (this._searchQuery || "").toLowerCase().trim(), n = t ? nt(e, t) : e, r = rt(n); if (r === this._lastNodeSig) { this._syncCanvasSelection(); return; @@ -670,13 +664,13 @@ var He = () => o(), Ue = class { for (let { node: i, children: a } of e) { let e = String(i?.id ?? ""), o = a.length, s = document.createElement("div"); s.className = "mjr-ws-tree-item", s.dataset.nodeId = e, s._mjrNodeId = e, s._mjrParentTreeItem = r || null, o > 0 && s.classList.add("mjr-ws-tree-item--subgraph"), n > 0 && s.classList.add("mjr-ws-tree-item--nested"); - let c = new Be(i, { + let c = new Xe(i, { collapsible: !0, expanded: this._expandedNodeIds.has(e), depth: n, isSubgraph: o > 0, childCount: o, - onLocate: () => Xe(i), + onLocate: () => at(i), onToggle: (t) => { if (t) { this._expandedNodeIds = new Set([e]); @@ -686,7 +680,7 @@ var He = () => o(), Ue = class { }); if (c._mjrTreeItemEl = s, this._renderers.push(c), s.appendChild(c.el), o > 0) { let t = this._expandedChildrenIds.has(e), r = document.createElement("button"); - r.type = "button", r.className = "mjr-ws-children-toggle", n > 0 && r.classList.add("mjr-ws-children-toggle--nested"), Ye(r, o, t); + r.type = "button", r.className = "mjr-ws-children-toggle", n > 0 && r.classList.add("mjr-ws-children-toggle--nested"), it(r, o, t); let i = document.createElement("div"); i.className = "mjr-ws-children", i.hidden = !t, s._mjrChildrenToggle = r, s._mjrChildrenEl = i, s._mjrChildCount = o, this._renderItems(a, i, n + 1, s), r.addEventListener("click", () => { this._setTreeItemChildrenOpen(s, i.hidden); @@ -698,7 +692,7 @@ var He = () => o(), Ue = class { _setTreeItemChildrenOpen(e, t) { if (!e?._mjrChildrenEl || !e?._mjrChildrenToggle) return; let n = String(e._mjrNodeId || ""); - e._mjrChildrenEl.hidden = !t, n && (t ? this._expandedChildrenIds.add(n) : this._expandedChildrenIds.delete(n)), Ye(e._mjrChildrenToggle, Number(e._mjrChildCount) || 0, t); + e._mjrChildrenEl.hidden = !t, n && (t ? this._expandedChildrenIds.add(n) : this._expandedChildrenIds.delete(n)), it(e._mjrChildrenToggle, Number(e._mjrChildCount) || 0, t); } _openTreeBranch(e) { let t = e || null; @@ -709,23 +703,23 @@ var He = () => o(), Ue = class { this._setTreeItemChildrenOpen(e, !0); } }; -function We() { +function $e() { try { - return y(He()); + return y(); } catch { return null; } } -function Ge(e) { +function et(e) { return x(e); } -function Ke(e, t = /* @__PURE__ */ new Set()) { +function tt(e, t = /* @__PURE__ */ new Set()) { if (!e || t.has(e)) return []; t.add(e); let n = b(e), r = []; for (let e of n) { if (!e) continue; - let n = Ge(e).flatMap((e) => Ke(e, t)); + let n = et(e).flatMap((e) => tt(e, t)); r.push({ node: e, children: n @@ -733,10 +727,10 @@ function Ke(e, t = /* @__PURE__ */ new Set()) { } return r; } -function qe(e, t) { +function nt(e, t) { let n = []; for (let { node: r, children: i } of e) { - let e = (r.type || "").toLowerCase().includes(t) || (r.title || "").toLowerCase().includes(t), a = qe(i, t); + let e = (r.type || "").toLowerCase().includes(t) || (r.title || "").toLowerCase().includes(t), a = nt(i, t); (e || a.length > 0) && n.push({ node: r, children: a @@ -744,14 +738,14 @@ function qe(e, t) { } return n; } -function Je(e) { +function rt(e) { let t = []; function n(e) { for (let { node: r, children: i } of e) t.push(r.id), t.push("["), n(i), t.push("]"); } return n(e), t.join(","); } -function Ye(e, t, n) { +function it(e, t, n) { let r = n ? "pi-chevron-down" : "pi-chevron-right"; e.textContent = ""; let i = document.createElement("i"); @@ -759,27 +753,16 @@ function Ye(e, t, n) { let a = document.createElement("span"); a.textContent = `${t} inner node${t === 1 ? "" : "s"}`, e.appendChild(a), e.setAttribute("aria-expanded", String(n)); } -function Xe(e) { +function at(e) { try { - let t = He()?.canvas; - if (!t) return; - if (t.selectNode?.(e, !1), typeof t.centerOnNode == "function") t.centerOnNode(e); - else if (e.pos && t.ds) { - let n = t.canvas, r = n?.width ?? 800, i = n?.height ?? 600, a = t.ds.scale ?? 1; - t.ds.offset = [-e.pos[0] + r / (2 * a) - (e.size?.[0] ?? 100) / 2, -e.pos[1] + i / (2 * a) - (e.size?.[1] ?? 80) / 2], t.setDirty?.(!0, !0); - } - t.canvas?.focus?.(); + l(e); } catch (e) { console.debug?.("[MFV] _focusNode", e); } } -function Ze() { +function ot() { try { - let e = He(), t = e?.canvas?.selected_nodes ?? e?.canvas?.selectedNodes ?? null; - if (!t) return []; - if (Array.isArray(t)) return t.map((e) => String(e?.id ?? "")).filter(Boolean); - if (t instanceof Map) return Array.from(t.values()).map((e) => String(e?.id ?? "")).filter(Boolean); - if (typeof t == "object") return Object.values(t).map((e) => String(e?.id ?? "")).filter(Boolean); + return i(); } catch (e) { console.debug?.("[MFV] _getSelectedNodeIds", e); } @@ -787,90 +770,105 @@ function Ze() { } //#endregion //#region ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts -var Qe = /* @__PURE__ */ new Map(), $e = null; -async function et(e) { - let t = Array.from(new Set(nt(e).map((e) => K(e)).filter(Boolean))); - if (t.length && t.filter((e) => !Qe.has(e)).length) try { - $e ||= 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)) Qe.set(String(t), n); +var st = /* @__PURE__ */ new Map(), ct = null; +async function lt(e) { + let t = Array.from(new Set(dt(e).map((e) => G(e)).filter(Boolean))); + if (t.length && t.filter((e) => !st.has(e)).length) try { + ct ||= u("/object_info").then((e) => e?.ok ? e.json() : null).then((e) => { + if (e && typeof e == "object") for (let [t, n] of Object.entries(e)) st.set(String(t), n); return e; - }).catch(() => null), await $e; + }).catch(() => null), await ct; } catch {} } -function tt(e) { - let t = bt(e); +function ut(e) { + let t = Mt(e); for (let e of t) { - let t = St(xt(e)); - if (t) return wt(t), t; + let t = Pt(Nt(e)); + if (t) return It(t), t; } return null; } -function nt(e) { - let t = Array.isArray(e?.nodes) ? e.nodes.filter(Boolean) : [], n = [...t], r = J(e); - for (let i of t) { - let t = Nt(e, i, r); - t && n.push(...nt(t)); +function dt(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 = q(e); + for (let n of r) { + let r = Gt(e, n, a); + r && i.push(...dt(r, t)); } - return n; + return i; } -function rt(e, t) { - let n = String(t ?? ""); - if (!n) return null; - if (n.includes("::")) { - let [t, ...r] = n.split("::"), i = r.join("::"), a = rt(e, t), o = a ? Nt(e, a, J(e)) : null; - return o ? rt(o, i) : null; - } - let r = (Array.isArray(e?.nodes) ? e.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === n) || null; - if (r) return r; +function ft(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 Kt(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 r = Nt(e, t, J(e)), i = r ? rt(r, n) : null; - if (i) return i; + let n = Gt(e, t, q(e)), r = n ? ft(n, i) : null; + if (r) return r; } return null; } -function it(e) { - return f(e); +function pt(e) { + return E(e); } -function K(e) { - return u(e); +function G(e) { + return C(e); } -function at(e) { - return m(e); +function mt(e) { + return O(e); } -function ot(e) { - let t = st(e), n = e?.properties && typeof e.properties == "object" ? e.properties : null; +function ht(e) { + let t = gt(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(); !e || t.some(([t]) => String(t) === e) || t.push([e, n?.value]); } - if (n) for (let [e, r] of Object.entries(n)) dt(e) || r == null || typeof r == "object" || t.push([e, r]); + if (n) for (let [e, r] of Object.entries(n)) Ct(e) || r == null || typeof r == "object" || t.push([e, r]); return t.slice(0, 160); } -function st(e) { +function gt(e) { let t = [], n = e?.inputs && typeof e.inputs == "object" ? e.inputs : null; - if (n && !Array.isArray(n)) for (let [e, r] of Object.entries(n)) ut(r) || t.push([e, r]); - for (let { label: n, value: r } of ct(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)) St(r) || t.push([e, r]); + for (let { label: n, value: r } of _t(e)) t.some(([e]) => String(e) === String(n)) || t.push([n, r]); return t; } -function ct(e) { +function _t(e) { let t = e?.widgets_values; - if (t && typeof t == "object" && !Array.isArray(t)) return Object.entries(t).map(([e, t], n) => ({ + if (vt(t)) return Object.entries(t).map(([e, t], n) => ({ label: e, value: t, index: n })); - let n = Array.isArray(t) ? t : [], r = Array.isArray(e?.widgets) ? e.widgets : [], i = mt(ft(e)), a = lt(e); + let n = yt(t), r = Array.isArray(e?.widgets) ? e.widgets : [], i = Et(wt(e)), a = xt(e); return n.map((t, n) => { - let o = yt(e, n, t); + let o = jt(e, n, t); return { - label: r[n]?.name || r[n]?.label || i[n] || a[n] || o || `param ${n + 1}`, + label: i[n] || a[n] || r[n]?.name || r[n]?.label || o || `param ${n + 1}`, value: t, index: n }; }); } -function lt(e) { - let t = Array.isArray(e?.inputs) ? e.inputs : [], n = t.filter(ht), r = t.filter((e) => !gt(e) && vt(e?.type)), i = [], a = /* @__PURE__ */ new Set(), o = (e) => { +function vt(e) { + return !!(e && typeof e == "object" && !Array.isArray(e) && !bt(e)); +} +function yt(e) { + if (Array.isArray(e)) return e; + if (!bt(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 bt(e) { + if (!e || typeof e != "object" || Array.isArray(e)) return !1; + let t = Number(e.length); + return !(!Number.isFinite(t) || t < 0); +} +function xt(e) { + let t = Array.isArray(e?.inputs) ? e.inputs : [], n = t.filter(Dt), r = t.filter((e) => !Ot(e) && At(e?.type)), i = [], a = /* @__PURE__ */ new Set(), o = (e) => { let t = `${String(e?.name || "")}\u0000${String(e?.label || "")}\u0000${String(e?.link ?? "")}`; a.has(t) || (a.add(t), i.push(e)); }; @@ -878,50 +876,50 @@ function lt(e) { for (let e of r) o(e); return i.map((e) => String(e?.label || e?.localized_name || e?.name || e?.widget?.name || e?.widget?.label || "").trim()); } -function ut(e) { +function St(e) { return Array.isArray(e) && e.length === 2 && String(e[0] ?? "").trim() !== "" && Number.isFinite(Number(e[1])); } -function dt(e) { - let t = q(String(e ?? "").trim()); +function Ct(e) { + let t = K(String(e ?? "").trim()); 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_") : !0; } -function ft(e) { - let t = K(e); - return t && Qe.get(t) || null; +function wt(e) { + let t = G(e); + return t && st.get(t) || null; } -function pt(e) { +function Tt(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 mt(e) { +function Et(e) { let t = e?.input; - if (!t || typeof t != "object") return pt(e); + if (!t || typeof t != "object") return Tt(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)) _t(t) && n.push(e); + if (!(!r || typeof r != "object")) for (let [e, t] of Object.entries(r)) kt(t) && n.push(e); } - return n.length ? n : pt(e); + return n.length ? n : Tt(e); } -function ht(e) { +function Dt(e) { return !e || typeof e != "object" ? !1 : !!(e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim()); } -function gt(e) { +function Ot(e) { return !e || typeof e != "object" ? !1 : !!(e.link != null || Array.isArray(e.links) && e.links.length); } -function _t(e) { +function kt(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 : vt(n); + return r?.forceInput === !0 || r?.rawLink === !0 ? !1 : r?.widgetType && String(r.widgetType).trim() ? !0 : At(n); } -function vt(e) { +function At(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 yt(e, t, n) { - let r = K(e), i = it(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase(); +function jt(e, t, n) { + let r = G(e), i = pt(e), a = `${r} ${i}`.toLowerCase(), o = String(n ?? "").toLowerCase(); if (a.includes("ksamplerselect")) return "sampler_name"; if (a.includes("manualsigmas")) return "sigmas"; if (a.includes("randomnoise")) return t === 0 ? "noise_seed" : t === 1 ? "control_after_generate" : null; @@ -940,8 +938,8 @@ function yt(e, t, n) { if (t === 2) return "device"; } if (/primitive(?:int|float|string|boolean)|constant/.test(a) && t === 0) { - let e = q(i); - return e && e !== q(r) ? e : "value"; + let e = K(i); + return e && e !== K(r) ? e : "value"; } if (a.includes("cliptext") || a.includes("prompt")) return t === 0 ? "text" : null; if (o.includes(".safetensors") || o.includes(".ckpt")) return "model"; @@ -953,8 +951,8 @@ function yt(e, t, n) { } return null; } -function bt(e) { - let t = xt(e?.metadata_raw), n = xt(e?.metadata); +function Mt(e) { + let t = Nt(e?.metadata_raw), n = Nt(e?.metadata); return [ e?.workflow, e?.Workflow, @@ -995,7 +993,7 @@ function bt(e) { n?.Prompt ].filter((e) => e != null); } -function xt(e) { +function Nt(e) { if (!e) return null; if (typeof e == "object") return e; if (typeof e != "string") return null; @@ -1007,16 +1005,16 @@ function xt(e) { return null; } } -function St(e) { +function Pt(e) { if (!e || typeof e != "object") return null; if (Array.isArray(e.nodes)) return e; - let t = Ct(e); + let t = Ft(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 k(e.prompt); + let n = k(e); return n && Array.isArray(n.nodes) ? n : null; } -function Ct(e) { +function Ft(e) { for (let t of [ "workflow", "Workflow", @@ -1032,38 +1030,38 @@ function Ct(e) { } return null; } -function wt(e, t = /* @__PURE__ */ new WeakSet()) { +function It(e, t = /* @__PURE__ */ new WeakSet()) { if (!e || typeof e != "object" || t.has(e)) return; t.add(e); - let n = J(e); + let n = q(e); for (let r of Array.isArray(e?.nodes) ? e.nodes : []) { - Tt(r, n); - let i = Nt(e, r, n); - i && (Et(r, i), wt(i, t)); + Lt(r, n); + let i = Gt(e, r, n); + i && (Rt(r, i), It(i, t)); } } -function Tt(e, t) { +function Lt(e, t) { if (!e || typeof e != "object") return; - let n = Mt(e).find((e) => t.has(String(e))); + let n = Wt(e).find((e) => t.has(String(e))); if (!n) return; let r = t.get(String(n)), i = String(r?.name || r?.title || e?.subgraph?.name || e?.subgraph_instance?.name || "").trim(); if (!i) return; 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 Et(e, t) { +function Rt(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 = Dt(e), a = Ot(t), o = []; + let r = new Map(t.nodes.filter(Boolean).map((e) => [String(e?.id ?? e?.ID ?? ""), e])), i = zt(e), a = Bt(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 = ot(l); + let u = ht(l); if (!u.length) continue; - let d = u.find(([e]) => q(e) === q(c)) || u.find(([e]) => q(e) === "value") || (u.length === 1 ? u[0] : null); + let d = u.find(([e]) => K(e) === K(c)) || u.find(([e]) => K(e) === "value") || (u.length === 1 ? u[0] : null); if (!d) continue; - let f = `${String(s)}:${kt(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || At(l, d[0], c); - i.size && !i.has(q(p)) || o.push({ + let f = `${String(s)}:${Vt(t, c, d[0])}`, p = a.get(f) || a.get(String(s)) || Ht(l, d[0], c); + i.size && !i.has(K(p)) || o.push({ label: p, value: d[1], innerNodeId: s, @@ -1072,49 +1070,49 @@ function Et(e, t) { } o.length && (e._mjrSubgraphProxyParams = o); } -function Dt(e) { +function zt(e) { let t = Array.isArray(e?.inputs) ? e.inputs : [], n = /* @__PURE__ */ new Set(); for (let e of t) { - if (!ht(e)) continue; + if (!Dt(e)) continue; let t = String(e?.label || e?.localized_name || e?.name || "").trim(); - t && n.add(q(t)); + t && n.add(K(t)); } return n; } -function Ot(e) { +function Bt(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; if (String(n) !== "-10") continue; let i = Number(Array.isArray(e) ? e[2] : e?.origin_slot ?? e?.originSlot ?? e?.fromSlot), a = Array.isArray(e) ? e[3] : e?.target_id ?? e?.targetId ?? e?.to, o = Number(Array.isArray(e) ? e[4] : e?.target_slot ?? e?.targetSlot ?? e?.toSlot), s = Number.isFinite(i) ? t[i] : null, c = String(s?.label || s?.localized_name || s?.name || "").trim(); - !c || a == null || q(c) !== "value" && (r.set(String(a), c), Number.isFinite(o) && r.set(`${String(a)}:${o}`, c)); + !c || a == null || K(c) !== "value" && (r.set(String(a), c), Number.isFinite(o) && r.set(`${String(a)}:${o}`, c)); } return r; } -function kt(e, t, n) { +function Vt(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 At(e, t, n) { - let r = String(it(e) || "").trim(), i = String(t || n || "").trim(); - return r && i && q(i) !== "value" ? `${r} ${i}` : r || i || "param"; +function Ht(e, t, n) { + let r = String(pt(e) || "").trim(), i = String(t || n || "").trim(); + return r && i && K(i) !== "value" ? `${r} ${i}` : r || i || "param"; } -function q(e) { +function K(e) { return String(e ?? "").trim().toLowerCase().replace(/\s+/g, "_"); } -function J(e) { +function q(e) { let t = [ ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], ...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 jt(e)) t != null && n.set(String(t), e); + for (let e of t) for (let t of Ut(e)) t != null && n.set(String(t), e); return n; } -function jt(e) { +function Ut(e) { let t = e?.properties && typeof e.properties == "object" ? e.properties : {}; return [ e?.id, @@ -1128,7 +1126,7 @@ function jt(e) { t.subgraphId ].filter((e) => e != null && String(e).trim()); } -function Mt(e) { +function Wt(e) { let t = e?.properties && typeof e.properties == "object" ? e.properties : {}; return [ e?.type, @@ -1140,7 +1138,7 @@ function Mt(e) { t.subgraph_name ].filter((e) => e != null && String(e).trim()); } -function Nt(e, t, n = J(e)) { +function Gt(e, t, n = q(e)) { let r = [ t?.subgraph, t?._subgraph, @@ -1151,20 +1149,32 @@ function Nt(e, t, n = J(e)) { t?.subgraph_instance?.graph, t?.inner_graph, t?.subgraph_graph, - ...Mt(t).map((e) => n.get(String(e))) + ...Wt(t).map((e) => n.get(String(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 Kt(e, t) { + let n = e, r = null; + for (let e = 0; e < t.length; e += 1) { + let i = String(t[e] ?? "").trim(); + if (!i || (r = (Array.isArray(n?.nodes) ? n.nodes : []).find((e) => String(e?.id ?? e?.ID ?? "") === i) || null, !r)) return null; + if (e >= t.length - 1) break; + let a = Gt(n, r, q(n)); + if (!a) return null; + n = a; + } + return r; +} //#endregion //#region ui/features/viewer/workflowGraphMap/workflowGraphMapActions.ts -async function Pt(e) { - return e ? E(JSON.stringify(e, null, 2)) : !1; +async function qt(e) { + return e ? te(JSON.stringify(e, null, 2)) : !1; } -async function Ft(e) { - return E(It(e)); +async function Jt(e) { + return te(Yt(e)); } -function It(e) { +function Yt(e) { if (e == null) return ""; if (typeof e == "string") return e; if (typeof e == "number" || typeof e == "boolean") return String(e); @@ -1174,85 +1184,83 @@ function It(e) { return String(e); } } -function Lt(e) { - let t = o(); - return !e || typeof e != "object" ? !1 : typeof t?.loadGraphData == "function" ? (t.loadGraphData(e), !0) : typeof t?.canvas?.graph?.configure == "function" ? (t.canvas.graph.configure(e), t.canvas.graph.setDirtyCanvas?.(!0, !0), !0) : typeof t?.graph?.configure == "function" ? (t.graph.configure(e), t.graph.setDirtyCanvas?.(!0, !0), !0) : !1; +function Xt(e) { + return r(e); } -function Rt(e) { - let t = o(), n = t?.graph ?? t?.canvas?.graph ?? null; - if (!e || !n || typeof n.add != "function") return !1; - let r = String(e?.type || e?.class_type || e?.comfyClass || "").trim(), i = globalThis, a = i?.LiteGraph || i?.window?.LiteGraph || null, s = null; +function Zt(e) { + let t = s(); + if (!e || !t || typeof t.add != "function") return !1; + let n = String(e?.type || e?.class_type || e?.comfyClass || "").trim(), r = globalThis, i = r?.LiteGraph || r?.window?.LiteGraph || null, a = null; try { - a && typeof a.createNode == "function" && r && (s = a.createNode(r)); + i && typeof i.createNode == "function" && n && (a = i.createNode(n)); } catch (e) { console.debug?.("[MFV Graph Map] createNode failed", e); } - if (!s) return !1; + if (!a) return !1; try { - let r = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); - return delete r.id, Array.isArray(r.pos) && (r.pos = [Number(r.pos[0] || 0) + 32, Number(r.pos[1] || 0) + 32]), typeof s.configure == "function" ? s.configure(r) : Object.assign(s, r), n.add(s), n.setDirtyCanvas?.(!0, !0), t?.canvas?.setDirty?.(!0, !0), !0; + let t = typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); + return delete t.id, Array.isArray(t.pos) && (t.pos = [Number(t.pos[0] || 0) + 32, Number(t.pos[1] || 0) + 32]), typeof a.configure == "function" ? a.configure(t) : Object.assign(a, t), h(a); } catch (e) { return console.debug?.("[MFV Graph Map] import node failed", e), !1; } } -function zt(e) { - let t = o(), n = Bt(t); - if (!e || !n) return { +function Qt(e) { + let t = $t(); + if (!e || !t) return { ok: !1, count: 0, reason: "no-target" }; - let r = ct(e), i = Array.isArray(n.widgets) ? n.widgets : []; - if (!r.length || !i.length) return { + let n = _t(e), r = Array.isArray(t.widgets) ? t.widgets : []; + if (!n.length || !r.length) return { ok: !1, count: 0, reason: "no-widgets" }; - let a = /* @__PURE__ */ new Map(); - i.forEach((e, t) => { - for (let n of Vt(e)) a.has(n) || a.set(n, { + let i = /* @__PURE__ */ new Map(); + r.forEach((e, t) => { + for (let n of en(e)) i.has(n) || i.set(n, { widget: e, index: t }); }); - let s = Ut(K(e)), c = Ut(n?.type || n?.comfyClass || n?.class_type), l = !!(s && c && s === c), u = /* @__PURE__ */ new Set(), d = 0; - for (let e of r) { - let t = Ht(e.label), r = t ? a.get(t) : null; - if ((!r || u.has(r.index)) && l) { - let t = i[e.index]; - t && (r = { + let o = nn(G(e)), s = nn(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 = tn(e.label), a = n ? i.get(n) : null; + if ((!a || l.has(a.index)) && c) { + let t = r[e.index]; + t && (a = { widget: t, index: e.index }); } - !r || u.has(r.index) || k(r.widget, Wt(e.value), n) && (u.add(r.index), d += 1); + !a || l.has(a.index) || ie(a.widget, rn(e.value), t) && (l.add(a.index), u += 1); } - return t?.canvas?.setDirty?.(!0, !0), t?.canvas?.draw?.(!0, !0), t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), { - ok: d > 0, - count: d, - reason: d > 0 ? "ok" : "no-match", - targetNode: n + return a(), { + ok: u > 0, + count: u, + reason: u > 0 ? "ok" : "no-match", + targetNode: t }; } -function Bt(e = o()) { - let t = e?.canvas?.selected_nodes ?? e?.canvas?.selectedNodes ?? null; - return t ? Array.isArray(t) ? t.filter(Boolean)[0] || null : t instanceof Map ? Array.from(t.values()).filter(Boolean)[0] || null : typeof t == "object" && Object.values(t).filter(Boolean)[0] || null : null; +function $t() { + return v() || null; } -function Vt(e) { +function en(e) { return [ e?.name, e?.label, e?.options?.name, e?.options?.label - ].map(Ht).filter(Boolean); + ].map(tn).filter(Boolean); } -function Ht(e) { +function tn(e) { return String(e ?? "").trim().toLowerCase().replace(/\s+/g, "_"); } -function Ut(e) { +function nn(e) { return String(e ?? "").trim().toLowerCase(); } -function Wt(e) { +function rn(e) { if (typeof e != "object" || !e) return e; try { return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); @@ -1262,23 +1270,23 @@ function Wt(e) { } //#endregion //#region ui/features/viewer/workflowGraphMap/WorkflowGraphMapPanel.ts -var Gt = class { +var an = class { constructor({ large: e = !1 } = {}) { this._asset = null, this._workflow = null, this._selectedNodeId = "", this._renderInfo = null, this._resizeObserver = null, this._resizeObservedTarget = null, this._resizeObserverWindow = null, this._large = !!e, this._view = { zoom: 1, centerX: null, centerY: null - }, this._drag = null, this._previewMedia = null, this._previewKey = "", this._el = this._build(); + }, this._drag = null, this._previewMedia = null, this._previewKey = "", this._subgraphDisplayMode = "expand", this._modeButtons = /* @__PURE__ */ new Map(), this._el = this._build(); } get el() { return this._el; } setAsset(e) { - this._asset !== e && (this._asset = e || null, this._workflow = tt(this._asset), this._selectedNodeId = "", this._view = { + this._asset !== e && (this._asset = e || null, this._workflow = ut(this._asset), this._selectedNodeId = "", this._view = { zoom: 1, centerX: null, centerY: null - }, this.refresh(), et(this._workflow).then(() => this.refresh()).catch(() => {})); + }, this.refresh(), lt(this._workflow).then(() => this.refresh()).catch(() => {})); } refresh() { this._ensureResizeObserver(), this._el?.isConnected && (this._renderCanvas(), this._renderDetails()); @@ -1290,12 +1298,12 @@ var Gt = class { let e = document.createElement("div"); e.className = "mjr-wgm", this._large && (e.className += " mjr-wgm--large"); let t = document.createElement("div"); - return t.className = "mjr-wgm-map-wrap", this._mapWrap = t, this._large ? (this._canvas = document.createElement("canvas"), this._canvas.className = "mjr-wgm-canvas", this._canvas.addEventListener?.("click", (e) => this._handleCanvasClick(e)), this._canvas.addEventListener?.("wheel", (e) => this._handleWheel(e), { passive: !1 }), this._canvas.addEventListener?.("dblclick", (e) => this._handleCanvasDblClick(e)), this._canvas.addEventListener?.("pointerdown", (e) => this._handlePointerDown(e)), t.appendChild(this._canvas)) : (this._preview = document.createElement("div"), this._preview.className = "mjr-wgm-preview", t.appendChild(this._preview)), e.appendChild(t), this._status = document.createElement("div"), this._status.className = "mjr-wgm-status", e.appendChild(this._status), this._details = document.createElement("div"), this._details.className = "mjr-wgm-details", e.appendChild(this._details), this._ensureResizeObserver(), e; + return t.className = "mjr-wgm-map-wrap", this._mapWrap = t, this._large ? (this._canvas = document.createElement("canvas"), this._canvas.className = "mjr-wgm-canvas", this._canvas.addEventListener?.("click", (e) => this._handleCanvasClick(e)), this._canvas.addEventListener?.("wheel", (e) => this._handleWheel(e), { passive: !1 }), this._canvas.addEventListener?.("dblclick", (e) => this._handleCanvasDblClick(e)), this._canvas.addEventListener?.("pointerdown", (e) => this._handlePointerDown(e)), t.appendChild(this._canvas)) : (this._preview = document.createElement("div"), this._preview.className = "mjr-wgm-preview", t.appendChild(this._preview)), e.appendChild(t), this._status = document.createElement("div"), this._status.className = "mjr-wgm-status", e.appendChild(this._status), this._large && (this._toolbar = document.createElement("div"), this._toolbar.className = "mjr-wgm-toolbar", this._toolbar.appendChild(this._makeModeButton("Expand subgraphs", "expand")), this._toolbar.appendChild(this._makeModeButton("Host nodes only", "host")), e.appendChild(this._toolbar), this._syncModeButtons()), this._details = document.createElement("div"), this._details.className = "mjr-wgm-details", e.appendChild(this._details), this._ensureResizeObserver(), e; } _ensureResizeObserver() { let e = this._mapWrap; if (!e) return; - let t = Y(e), n = t?.ResizeObserver || globalThis.ResizeObserver; + let t = J(e), n = t?.ResizeObserver || globalThis.ResizeObserver; if (typeof n == "function" && !(this._resizeObserver && this._resizeObservedTarget === e && this._resizeObserverWindow === t)) { try { this._resizeObserver?.disconnect?.(); @@ -1316,16 +1324,17 @@ var Gt = class { } let e = this._canvas; if (!e) return; - let t = e.getBoundingClientRect(), n = Math.max(1, Math.floor(t.width || e.clientWidth || 1)), r = Math.max(1, Math.floor(t.height || e.clientHeight || 1)), i = Y(e), a = Math.max(1, Math.min(2, Number(i?.devicePixelRatio) || 1)), o = Math.floor(n * a), s = Math.floor(r * a); + let t = e.getBoundingClientRect(), n = Math.max(1, Math.floor(t.width || e.clientWidth || 1)), r = Math.max(1, Math.floor(t.height || e.clientHeight || 1)), i = J(e), a = Math.max(1, Math.min(2, Number(i?.devicePixelRatio) || 1)), o = Math.floor(n * a), s = Math.floor(r * a); (e.width !== o || e.height !== s) && (e.width = o, e.height = s); let c = e.getContext?.("2d"); if (c && c.setTransform(a, 0, 0, a, 0, 0), !this._workflow) { c?.clearRect?.(0, 0, n, r), this._renderInfo = null; return; } - this._renderInfo = p(e, this._workflow, { + this._renderInfo = D(e, this._workflow, { showNodeLabels: !0, showViewport: !1, + expandSubgraphs: this._subgraphDisplayMode !== "host", view: { hoveredNodeId: this._selectedNodeId || null, zoom: this._view.zoom, @@ -1335,48 +1344,114 @@ var Gt = class { }), this._renderInfo?.resolvedView && (this._view.centerX = this._renderInfo.resolvedView.centerX, this._view.centerY = this._renderInfo.resolvedView.centerY, this._view.zoom = this._renderInfo.resolvedView.zoom); } _renderDetails() { - let e = nt(this._workflow).length; + let e = this._subgraphDisplayMode !== "host", t = dt(this._workflow, { includeSubgraphs: e }).length; if (!this._workflow) { - this._status.textContent = this._large ? "No workflow graph in selected image" : "Selected asset - no workflow graph", X(this._details); + this._status.textContent = this._large ? "No workflow graph in selected image" : "Selected asset - no workflow graph", Y(this._details); return; } - this._status.textContent = this._large ? this._selectedNodeId ? `${e} nodes - selected #${this._selectedNodeId}` : `${e} nodes - select a node` : `${e} nodes - graph opened in viewer`; - let t = rt(this._workflow, this._selectedNodeId); - if (!t) { + this._status.textContent = this._large ? this._selectedNodeId ? `${t} nodes (${this._subgraphDisplayMode}) - selected #${this._selectedNodeId}` : `${t} nodes (${this._subgraphDisplayMode}) - select a node` : `${t} nodes - graph opened in viewer`; + let n = ft(this._workflow, this._selectedNodeId, { includeSubgraphs: e }); + if (!n) { let e = document.createElement("div"); - e.className = "mjr-ws-sidebar-empty", e.textContent = this._large ? "Click a node in the graph map" : "Use the large Graph Map in the viewer to select nodes", X(this._details, e); + e.className = "mjr-ws-sidebar-empty", e.textContent = this._large ? "Click a node in the graph map" : "Use the large Graph Map in the viewer to select nodes", Y(this._details, e); return; } - let n = document.createElement("div"); - n.className = "mjr-wgm-node-title", n.textContent = it(t); let r = document.createElement("div"); - r.className = "mjr-wgm-node-meta", r.textContent = `#${this._selectedNodeId} ${at(t) || K(t) || "Node"}`; + r.className = "mjr-wgm-node-title", r.textContent = pt(n); let i = document.createElement("div"); - i.className = "mjr-wgm-actions", i.appendChild(this._makeAction("Copy node", "pi pi-copy", () => Pt(t))), i.appendChild(this._makeAction("Import node", "pi pi-plus-circle", () => Rt(t))), i.appendChild(this._makeAction("Import workflow", "pi pi-download", () => Lt(this._workflow))), i.appendChild(this._makeAction("Transfer params to selected canvas node", "pi pi-arrow-right-arrow-left", () => zt(t)?.ok)); + i.className = "mjr-wgm-node-meta", i.textContent = `#${this._selectedNodeId} ${mt(n) || G(n) || "Node"}`; let a = document.createElement("div"); - a.className = "mjr-wgm-params"; - for (let [e, n] of ot(t)) { - let t = document.createElement("div"); - t.className = "mjr-wgm-param", t.tabIndex = 0, t.role = "button", t.title = `Copy ${String(e)}`; - let r = document.createElement("span"); - r.className = "mjr-wgm-param-key", r.textContent = String(e); - let i = document.createElement("span"); - i.className = "mjr-wgm-param-value", i.textContent = Kt(n), t.appendChild(r), t.appendChild(i), t.addEventListener("click", () => this._copyParam(t, n)), t.addEventListener("keydown", (e) => { - e.key !== "Enter" && e.key !== " " || (e.preventDefault?.(), this._copyParam(t, n)); - }), a.appendChild(t); - } - if (!a.childElementCount) { + a.className = "mjr-wgm-actions", a.appendChild(this._makeAction("Copy node", "pi pi-copy", () => qt(n))), a.appendChild(this._makeAction("Import node", "pi pi-plus-circle", () => Zt(n))), a.appendChild(this._makeAction("Import workflow", "pi pi-download", () => Xt(this._workflow))), a.appendChild(this._makeAction("Transfer params to selected canvas node", "pi pi-arrow-right-arrow-left", () => Qt(n)?.ok)); + let o = this._buildNodeVisual(n); + Y(this._details, r, i, o, a); + } + _makeModeButton(e, t) { + let n = document.createElement("button"); + return n.type = "button", n.className = "mjr-wgm-mode", n.textContent = String(e), n.addEventListener("click", () => this._setSubgraphDisplayMode(t)), this._modeButtons.set(t, n), n; + } + _setSubgraphDisplayMode(e) { + e !== "expand" && e !== "host" || this._subgraphDisplayMode !== e && (this._subgraphDisplayMode = e, e === "host" && String(this._selectedNodeId || "").includes("::") && (this._selectedNodeId = ""), this._syncModeButtons(), this.refresh()); + } + _syncModeButtons() { + for (let [e, t] of this._modeButtons.entries()) t.classList.toggle("is-active", e === this._subgraphDisplayMode); + } + _buildNodeVisual(e) { + let t = document.createElement("section"); + t.className = "mjr-wgm-node-visual", t.classList.add(`is-${mn(e)}`); + let n = document.createElement("div"); + n.className = "mjr-wgm-node-visual-header"; + let r = document.createElement("span"); + r.className = "mjr-wgm-node-visual-type", r.textContent = mt(e) || G(e) || "Node"; + let i = document.createElement("span"); + i.className = "mjr-wgm-node-visual-id", i.textContent = `#${String(e?.id ?? this._selectedNodeId ?? "")}`, n.append(r, i); + let a = document.createElement("div"); + a.className = "mjr-wgm-node-ports"; + let o = this._buildPortColumn("Inputs", e?.inputs, "in"), s = this._buildPortColumn("Outputs", e?.outputs, "out"); + a.append(o, s); + let c = document.createElement("div"); + c.className = "mjr-wgm-node-widgets"; + let l = document.createElement("div"); + l.className = "mjr-wgm-node-widgets-title", l.textContent = "Widgets", c.appendChild(l); + let u = pn(e); + if (u.length) { + for (let e of u.slice(0, 12)) { + let t = document.createElement("div"); + t.className = "mjr-wgm-node-widget", t.tabIndex = 0, t.role = "button"; + let n = String(e?.label || e?.key || "value"); + t.title = `Copy ${n}`; + let r = document.createElement("span"); + r.className = "mjr-wgm-node-widget-key", r.textContent = n; + let i = document.createElement("span"); + i.className = "mjr-wgm-node-widget-value"; + let a = sn(e?.value); + i.textContent = a, cn(e?.value, a) && t.classList.add("is-multiline"), ln(n) && t.classList.add("is-text-field"), t.append(r, i), t.addEventListener("click", () => this._copyParam(t, e?.value)), t.addEventListener("keydown", (n) => { + n.key !== "Enter" && n.key !== " " || (n.preventDefault?.(), this._copyParam(t, e?.value)); + }), c.appendChild(t); + } + if (u.length > 12) { + let e = document.createElement("div"); + e.className = "mjr-wgm-node-widget-more", e.textContent = `+${u.length - 12} more values`, c.appendChild(e); + } + } else { let e = document.createElement("div"); - e.className = "mjr-ws-node-empty", e.textContent = "No simple parameters found", a.appendChild(e); + e.className = "mjr-wgm-node-widget-empty", e.textContent = "No widget values", c.appendChild(e); } - X(this._details, n, r, i, a); + return t.append(n, a, c), t; + } + _buildPortColumn(e, t, n) { + let r = document.createElement("div"); + r.className = "mjr-wgm-node-ports-col"; + let i = document.createElement("div"); + i.className = "mjr-wgm-node-ports-title", i.textContent = String(e), r.appendChild(i); + let a = document.createElement("div"); + a.className = "mjr-wgm-node-ports-list"; + let o = un(t).slice(0, 8); + if (o.length) for (let e of o) { + let t = document.createElement("div"); + t.className = "mjr-wgm-node-port"; + let r = document.createElement("span"); + r.className = `mjr-wgm-node-port-dot is-${n}`; + let i = document.createElement("span"); + i.className = "mjr-wgm-node-port-name"; + let o = dn(e); + if (i.textContent = o.label, t.append(r, i), o.type) { + let e = document.createElement("span"); + e.className = "mjr-wgm-node-port-type", e.textContent = o.type, t.appendChild(e); + } + a.appendChild(t); + } + else { + let e = document.createElement("div"); + e.className = "mjr-wgm-node-port-empty", e.textContent = "-", a.appendChild(e); + } + return r.appendChild(a), r; } _makeAction(e, t, n) { let r = document.createElement("button"); return r.type = "button", r.className = "mjr-wgm-action", r.title = e, r.innerHTML = `${e}`, r.addEventListener("click", async () => { try { let e = await n(); - r.classList.toggle("is-ok", !!e), Y(r).setTimeout(() => r.classList.remove("is-ok"), 700); + r.classList.toggle("is-ok", !!e), J(r).setTimeout(() => r.classList.remove("is-ok"), 700); } catch (e) { console.debug?.("[MFV Graph Map] action failed", e); } @@ -1384,29 +1459,29 @@ var Gt = class { } async _copyParam(e, t) { try { - let n = await Ft(t); - e.classList.toggle("is-ok", !!n), e.classList.toggle("is-error", !n), Y(e).setTimeout(() => { + let n = await Jt(t); + e.classList.toggle("is-ok", !!n), e.classList.toggle("is-error", !n), J(e).setTimeout(() => { e.classList.remove("is-ok"), e.classList.remove("is-error"); }, 750); } catch (t) { - e.classList.add("is-error"), Y(e).setTimeout(() => e.classList.remove("is-error"), 750), console.debug?.("[MFV Graph Map] param copy failed", t); + e.classList.add("is-error"), J(e).setTimeout(() => e.classList.remove("is-error"), 750), console.debug?.("[MFV Graph Map] param copy failed", t); } } _renderPreview() { if (!this._preview) return; - let e = qt(this._asset), t = Jt(e); + let e = hn(this._asset), t = gn(e); if (this._previewMedia && t && t === this._previewKey) { - (this._preview.firstChild !== this._previewMedia || this._preview.childNodes.length !== 1) && X(this._preview, this._previewMedia); + (this._preview.firstChild !== this._previewMedia || this._preview.childNodes.length !== 1) && Y(this._preview, this._previewMedia); return; } this._disposePreviewMedia(); - let n = W(e, { fill: !0 }); + let n = U(e, { fill: !0 }); if (n) { n.classList?.add?.("mjr-wgm-preview-media"), this._previewMedia = n, this._previewKey = t, this._preview.appendChild(n); return; } let r = document.createElement("div"); - r.className = "mjr-wgm-preview-empty", r.textContent = "No preview", X(this._preview, r); + r.className = "mjr-wgm-preview-empty", r.textContent = "No preview", Y(this._preview, r); } _disposePreviewMedia() { let e = this._previewMedia; @@ -1477,24 +1552,24 @@ var Gt = class { }, r = (e) => { if (!this._drag || e.pointerId !== this._drag.pointerId) return; this._canvas.releasePointerCapture?.(e.pointerId); - let t = Y(this._canvas); + let t = J(this._canvas); t.removeEventListener("pointermove", n), t.removeEventListener("pointerup", r), t.removeEventListener("pointercancel", r), t.setTimeout(() => { this._drag = null; }, 0); - }, i = Y(this._canvas); + }, i = J(this._canvas); i.addEventListener("pointermove", n), i.addEventListener("pointerup", r), i.addEventListener("pointercancel", r); } }; -function Y(e) { +function J(e) { return e?.ownerDocument?.defaultView || window; } -function X(e, ...t) { +function Y(e, ...t) { if (e) { for (; e.firstChild;) e.removeChild(e.firstChild); for (let n of t) e.appendChild(n); } } -function Kt(e) { +function on(e) { if (e == null) return ""; if (typeof e == "string") return e.replace(/\s+/g, " ").trim(); if (typeof e == "number" || typeof e == "boolean") return String(e); @@ -1504,7 +1579,52 @@ function Kt(e) { return String(e); } } -function qt(e) { +function sn(e) { + return e == null ? "" : typeof e == "string" ? e.replace(/\r\n?/g, "\n").trim() : on(e); +} +function cn(e, t) { + if (typeof e != "string") return !1; + let n = String(t || ""); + return n.includes("\n") || n.length > 120; +} +function ln(e) { + let t = String(e || "").toLowerCase().replace(/[^a-z0-9]/g, ""); + return t ? t === "text" || t === "prompt" || t === "positive" || t === "negative" || t === "string" || t === "caption" : !1; +} +function un(e) { + return Array.isArray(e) ? e.filter(Boolean).map((e) => ({ + name: String(e?.name || e?.label || "").trim(), + type: String(e?.type || e?.slot_type || e?.data_type || "").trim() + })) : []; +} +function dn(e) { + let t = String(e?.name || e?.label || e?.type || "port").trim() || "port", n = String(e?.type || "").trim(), r = fn(t), i = fn(n); + return { + label: t, + type: i && i !== r ? n : "" + }; +} +function fn(e) { + return String(e || "").toLowerCase().replace(/[^a-z0-9]/g, ""); +} +function pn(e) { + let t = _t(e); + if (Array.isArray(t) && t.length) return t.map((e) => ({ + label: e?.label, + key: e?.key, + value: e?.value + })); + let n = ht(e); + return (Array.isArray(n) ? n.map(([e, t]) => ({ + label: e, + value: t + })) : []).slice(0, 160); +} +function mn(e) { + let t = `${String(G(e) || "").toLowerCase()} ${String(mt(e) || "").toLowerCase()}`; + return t.trim() ? /ksampler|sampler|scheduler|cfg|steps|noise|seed/.test(t) ? "sampler" : /checkpoint|clip|vae|unet|lora|model|loader/.test(t) ? "model" : /text|prompt|token|encode|decoder|caption|florence/.test(t) ? "text" : /latent|image|mask|video|audio|preview|save|load|upscale/.test(t) ? "media" : /controlnet|conditioning|guidance|adapter|ipadapter/.test(t) ? "control" : /math|logic|switch|merge|concat|combine|route|branch|reroute/.test(t) ? "logic" : "generic" : "generic"; +} +function hn(e) { if (!e || typeof e != "object") return e; let t = (Array.isArray(e.previewCandidates) ? e.previewCandidates : []).find((e) => String(e || "").trim()) || e.url || "", n = String(e.type || "").toLowerCase(), r = String(e.kind || "").toLowerCase(), i = String(e.filename || e.name || ""), a = r || (e.isVideo || n === "video" || /\.(mp4|mov|webm|mkv|avi)$/i.test(i) ? "video" : e.isAudio || n === "audio" || /\.(mp3|wav|flac|ogg|m4a|aac|opus|wma)$/i.test(i) ? "audio" : e.isModel3d || n === "model3d" ? "model3d" : ""); return { @@ -1516,7 +1636,7 @@ function qt(e) { } : null }; } -function Jt(e) { +function gn(e) { return !e || typeof e != "object" ? "" : JSON.stringify({ url: String(e.url || ""), filename: String(e.filename || e.name || ""), @@ -1527,7 +1647,7 @@ function Jt(e) { } //#endregion //#region ui/features/viewer/workflowSidebar/WorkflowSidebar.ts -var Yt = 16, Xt = 250, Zt = class { +var _n = 16, vn = 250, yn = class { _hostEl; _onClose; _onOpenGraphMap; @@ -1546,7 +1666,7 @@ var Yt = 16, Xt = 250, Zt = class { _nodesModeBtn; _graphModeBtn; constructor({ hostEl: e, onClose: t, onOpenGraphMap: n, onCloseGraphMap: r } = {}) { - this._hostEl = e, this._onClose = t ?? null, this._onOpenGraphMap = n ?? null, this._onCloseGraphMap = r ?? null, this._visible = !1, this._liveSyncHandle = null, this._liveSyncMode = "", this._lastLiveSyncAt = 0, this._resizeCleanup = null, this._nodesTab = new Ue(), this._graphMapPanel = new Gt(), this._activeMode = "nodes", this._asset = null, this._body = null, this._nodesModeBtn = null, this._graphModeBtn = null, this._el = this._build(); + this._hostEl = e, this._onClose = t ?? null, this._onOpenGraphMap = n ?? null, this._onCloseGraphMap = r ?? null, this._visible = !1, this._liveSyncHandle = null, this._liveSyncMode = "", this._lastLiveSyncAt = 0, this._resizeCleanup = null, this._nodesTab = new Qe(), this._graphMapPanel = new an(), this._activeMode = "nodes", this._asset = null, this._body = null, this._nodesModeBtn = null, this._graphModeBtn = null, this._el = this._build(); } get el() { return this._el; @@ -1555,7 +1675,7 @@ var Yt = 16, Xt = 250, Zt = class { return this._visible; } show() { - this._visible = !0, this._el.classList.add("open"), this.refresh(), this._lastLiveSyncAt = $t(this._el), this._startLiveSync(); + this._visible = !0, this._el.classList.add("open"), this.refresh(), this._lastLiveSyncAt = xn(this._el), this._startLiveSync(); } hide() { this._visible = !1, this._el.classList.remove("open"), this._stopLiveSync(); @@ -1584,14 +1704,14 @@ var Yt = 16, Xt = 250, Zt = class { let t = document.createElement("div"); t.className = "mjr-ws-sidebar-header"; let n = document.createElement("span"); - n.className = "mjr-ws-sidebar-title", n.textContent = "Nodes", t.appendChild(n); + n.className = "mjr-ws-sidebar-title", n.textContent = p("workflowSidebar.nodes", "Nodes"), t.appendChild(n); let r = document.createElement("button"); - r.type = "button", r.className = "mjr-icon-btn", r.title = "Close sidebar", r.innerHTML = "", r.addEventListener("click", () => { + r.type = "button", r.className = "mjr-icon-btn", r.title = p("workflowSidebar.close", "Close sidebar"), r.innerHTML = "", r.addEventListener("click", () => { let e = this._activeMode === "graph"; this.hide(), e && this._onCloseGraphMap?.(), this._onClose?.(); }), t.appendChild(r), e.appendChild(t); let i = document.createElement("div"); - i.className = "mjr-ws-tab-bar", this._nodesModeBtn = this._makeModeButton("Nodes", "pi pi-sliders-h", "nodes"), this._graphModeBtn = this._makeModeButton("Graph Map", "pi pi-sitemap", "graph"), i.appendChild(this._nodesModeBtn), i.appendChild(this._graphModeBtn), e.appendChild(i); + i.className = "mjr-ws-tab-bar", this._nodesModeBtn = this._makeModeButton(p("workflowSidebar.nodes", "Nodes"), "pi pi-sliders-h", "nodes"), this._graphModeBtn = this._makeModeButton(p("workflowSidebar.graphMap", "Graph Map"), "pi pi-sitemap", "graph"), i.appendChild(this._nodesModeBtn), i.appendChild(this._graphModeBtn), e.appendChild(i); let a = document.createElement("div"); return a.className = "mjr-ws-sidebar-resizer", a.setAttribute("role", "separator"), a.setAttribute("aria-orientation", "vertical"), a.setAttribute("aria-hidden", "true"), e.appendChild(a), this._bindResize(a), this._body = document.createElement("div"), this._body.className = "mjr-ws-sidebar-body", e.appendChild(this._body), this._renderActiveMode(), e; } @@ -1614,20 +1734,20 @@ var Yt = 16, Xt = 250, Zt = class { } _startLiveSync() { if (this._liveSyncHandle != null) return; - let e = Qt(this._el), t = (e) => { + let e = bn(this._el), t = (e) => { if (this._liveSyncHandle = null, this._liveSyncMode = "", !this._visible) return; - let t = Number.isFinite(Number(e)) ? Number(e) : $t(this._el); - t - this._lastLiveSyncAt >= Xt && (this._lastLiveSyncAt = t, this.syncFromGraph()), this._startLiveSync(); + let t = Number.isFinite(Number(e)) ? Number(e) : xn(this._el); + t - this._lastLiveSyncAt >= vn && (this._lastLiveSyncAt = t, this.syncFromGraph()), this._startLiveSync(); }; if (typeof e.requestAnimationFrame == "function") { this._liveSyncMode = "raf", this._liveSyncHandle = e.requestAnimationFrame(t); return; } - this._liveSyncMode = "timeout", this._liveSyncHandle = e.setTimeout(t, Yt); + this._liveSyncMode = "timeout", this._liveSyncHandle = e.setTimeout(t, _n); } _stopLiveSync() { if (this._liveSyncHandle == null) return; - let e = Qt(this._el); + let e = bn(this._el); try { this._liveSyncMode === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(this._liveSyncHandle) : typeof e.clearTimeout == "function" && e.clearTimeout(this._liveSyncHandle); } catch (e) { @@ -1663,11 +1783,11 @@ var Yt = 16, Xt = 250, Zt = class { this._resizeCleanup = null; } }; -function Qt(e) { +function bn(e) { return e?.ownerDocument?.defaultView || (typeof window < "u" ? window : globalThis); } -function $t(e) { - let t = Qt(e), n = t?.performance?.now; +function xn(e) { + let t = bn(e), n = t?.performance?.now; if (typeof n == "function") try { return Number(n.call(t.performance)) || Date.now(); } catch { @@ -1677,48 +1797,48 @@ function $t(e) { } //#endregion //#region ui/features/viewer/workflowSidebar/sidebarRunButton.ts -var Z = Object.freeze({ +var X = Object.freeze({ IDLE: "idle", RUNNING: "running", STOPPING: "stopping", ERROR: "error" -}), en = new Set([ +}), Sn = new Set([ "default", "auto", "latent2rgb", "taesd", "none" -]), tn = "progress-update", nn = (t, n = "") => e(t, n, void 0); -function rn() { +]), Cn = "progress-update", wn = (e, t = "") => p(e, t, void 0); +function Tn() { let e = document.createElement("div"); e.className = "mjr-mfv-run-controls"; let t = document.createElement("button"); t.type = "button", t.className = "mjr-icon-btn mjr-mfv-run-btn"; - let n = nn("tooltip.queuePrompt", "Queue Prompt (Run)"); + let n = wn("tooltip.queuePrompt", "Queue Prompt (Run)"); t.title = n, t.setAttribute("aria-label", n); - let i = document.createElement("i"); - i.className = "pi pi-play", i.setAttribute("aria-hidden", "true"), t.appendChild(i); - let a = document.createElement("button"); - a.type = "button", a.className = "mjr-icon-btn mjr-mfv-stop-btn"; - let s = document.createElement("i"); - s.className = "pi pi-stop", s.setAttribute("aria-hidden", "true"), a.appendChild(s), e.appendChild(t), e.appendChild(a); - let c = Z.IDLE, l = !1, u = !1, d = null; + let r = document.createElement("i"); + r.className = "pi pi-play", r.setAttribute("aria-hidden", "true"), t.appendChild(r); + let i = document.createElement("button"); + i.type = "button", i.className = "mjr-icon-btn mjr-mfv-stop-btn"; + let a = document.createElement("i"); + a.className = "pi pi-stop", a.setAttribute("aria-hidden", "true"), i.appendChild(a), e.appendChild(t), e.appendChild(i); + let s = X.IDLE, l = !1, u = !1, d = null; function f() { d != null && (clearTimeout(d), d = null); } function p(e, { canStop: n = !1 } = {}) { - c = e, t.classList.toggle("running", c === Z.RUNNING), t.classList.toggle("stopping", c === Z.STOPPING), t.classList.toggle("error", c === Z.ERROR), t.disabled = c === Z.RUNNING || c === Z.STOPPING, a.disabled = !n || c === Z.STOPPING, a.classList.toggle("active", n && c !== Z.STOPPING), a.classList.toggle("stopping", c === Z.STOPPING), c === Z.RUNNING || c === Z.STOPPING ? i.className = "pi pi-spin pi-spinner" : i.className = "pi pi-play"; + s = e, t.classList.toggle("running", s === X.RUNNING), t.classList.toggle("stopping", s === X.STOPPING), t.classList.toggle("error", s === X.ERROR), t.disabled = s === X.RUNNING || s === X.STOPPING, i.disabled = !n || s === X.STOPPING, i.classList.toggle("active", n && s !== X.STOPPING), i.classList.toggle("stopping", s === X.STOPPING), s === X.RUNNING || s === X.STOPPING ? r.className = "pi pi-spin pi-spinner" : r.className = "pi pi-play"; } function m() { - let e = nn("tooltip.queueStop", "Stop Generation"); - a.title = e, a.setAttribute("aria-label", e); + let e = wn("tooltip.queueStop", "Stop Generation"); + i.title = e, i.setAttribute("aria-label", e); } - function h(e = M.getSnapshot(), { authoritative: t = !1 } = {}) { + function h(e = I.getSnapshot(), { authoritative: t = !1 } = {}) { let n = Math.max(0, Number(e?.queue) || 0), r = e?.prompt || null, i = !!r?.currentlyExecuting, a = !!(r && (r.currentlyExecuting || r.errorDetails)), o = n > 0 || a, s = !!r?.errorDetails; t && n === 0 && !r && (l = !1, u = !1); let c = l || u || i || n > 0; if ((i || o || n > 0) && (l = !1), s) { - u = !1, f(), p(Z.ERROR, { canStop: !1 }); + u = !1, f(), p(X.ERROR, { canStop: !1 }); return; } if (u) { @@ -1726,47 +1846,35 @@ function rn() { u = !1, h(e); return; } - p(Z.STOPPING, { canStop: !1 }); + p(X.STOPPING, { canStop: !1 }); return; } if (l || i || o || n > 0) { - f(), p(Z.RUNNING, { canStop: !0 }); + f(), p(X.RUNNING, { canStop: !0 }); return; } - f(), p(Z.IDLE, { canStop: !1 }); + f(), p(X.IDLE, { canStop: !1 }); } function g() { - l = !1, u = !1, f(), p(Z.ERROR, { canStop: !1 }), d = setTimeout(() => { + l = !1, u = !1, f(), p(X.ERROR, { canStop: !1 }), d = setTimeout(() => { d = null, h(); }, 1500); } async function _() { - let e = o(), t = (e?.api && typeof e.api.interrupt == "function" ? e.api : null) ?? r(e); - if (t && typeof t.interrupt == "function") return await t.interrupt(), { tracked: !0 }; - if (t && typeof t.fetchApi == "function") { - let e = await t.fetchApi("/interrupt", { method: "POST" }); - if (!e?.ok) throw Error(`POST /interrupt failed (${e?.status})`); - return { tracked: !0 }; - } - let n = await fetch("/interrupt", { - method: "POST", - credentials: "include" - }); - if (!n.ok) throw Error(`POST /interrupt failed (${n.status})`); - return { tracked: !1 }; + return { tracked: await o(c()) }; } async function v() { - if (!(c === Z.RUNNING || c === Z.STOPPING)) { + if (!(s === X.RUNNING || s === X.STOPPING)) { l = !0, u = !1, h(); try { - (await hn())?.tracked || (l = !1), h(); + (await jn())?.tracked || (l = !1), h(); } catch (e) { console.error?.("[MFV Run]", e), g(); } } } async function y() { - if (c === Z.RUNNING) { + if (s === X.RUNNING) { u = !0, h(); try { (await _())?.tracked || (u = !1, l = !1), h(); @@ -1775,25 +1883,25 @@ function rn() { } } } - m(), a.disabled = !0, t.addEventListener("click", v), a.addEventListener("click", y); + m(), i.disabled = !0, t.addEventListener("click", v), i.addEventListener("click", y); let b = (e) => { - h(e?.detail || M.getSnapshot(), { authoritative: !0 }); + h(e?.detail || I.getSnapshot(), { authoritative: !0 }); }; - return M.addEventListener(tn, b), j({ timeoutMs: 4e3 }).catch((e) => { + return I.addEventListener(Cn, b), se({ timeoutMs: 4e3 }).catch((e) => { console.debug?.(e); }), h(), { el: e, dispose() { - f(), t.removeEventListener("click", v), a.removeEventListener("click", y), M.removeEventListener(tn, b); + f(), t.removeEventListener("click", v), i.removeEventListener("click", y), I.removeEventListener(Cn, b); } }; } -function an(e = l.MFV_PREVIEW_METHOD) { +function En(e = _.MFV_PREVIEW_METHOD) { let t = String(e || "").trim().toLowerCase(); - return en.has(t) ? t : l.MFV_PREVIEW_METHOD || "auto"; + return Sn.has(t) ? t : _.MFV_PREVIEW_METHOD || "auto"; } -function on(e, t = l.MFV_PREVIEW_METHOD) { - let n = an(t), r = { +function Dn(e, t = _.MFV_PREVIEW_METHOD) { + let n = En(t), r = { ...e?.extra_data || {}, extra_pnginfo: { ...e?.extra_data?.extra_pnginfo || {} } }; @@ -1802,74 +1910,14 @@ function on(e, t = l.MFV_PREVIEW_METHOD) { extra_data: r }; } -function sn(e, { previewMethod: t = l.MFV_PREVIEW_METHOD, clientId: n = null } = {}) { - let r = on(e, t), i = { +function On(e, { previewMethod: t = _.MFV_PREVIEW_METHOD, clientId: n = null } = {}) { + let r = Dn(e, t), i = { prompt: r?.output, extra_data: r?.extra_data || {} }, a = String(n || "").trim(); return a && (i.client_id = a), i; } -function cn(e, t) { - let n = [ - e?.clientId, - e?.clientID, - e?.client_id, - t?.clientId, - t?.clientID, - t?.client_id - ]; - for (let e of n) { - let t = String(e || "").trim(); - if (t) return t; - } - return ""; -} -function ln(e, t) { - S(e, ({ node: e }) => { - t(e); - }); -} -function un(e) { - if (typeof e != "object" || !e) return e; - try { - return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); - } catch { - return e; - } -} -function dn(e) { - let t = []; - return ln(e, (e) => { - for (let n of e.widgets ?? []) t.push({ - widget: n, - value: un(n?.value) - }); - }), t; -} -function fn(e, t) { - for (let e of Array.isArray(t) ? t : []) { - let t = e?.widget; - if (!t || typeof t != "object") continue; - let n = un(e?.value); - try { - t.value = n; - } catch (e) { - console.debug?.(e); - continue; - } - try { - t.callback?.(n); - } catch (e) { - console.debug?.(e); - } - } - try { - e?.canvas?.draw?.(!0, !0); - } catch (e) { - console.debug?.(e); - } -} -function pn(e) { +function kn(e) { let t = e?.constructor; return [ e?.type, @@ -1878,54 +1926,32 @@ function pn(e) { t?.type ].some((e) => /Api$/i.test(String(e || "").trim())); } -function mn(e) { +function An(e) { let t = !1; - return ln(e, (e) => { - t ||= pn(e); + return S(e, ({ node: e }) => { + t ||= kn(e); }), t; } -async function hn() { - let e = o(); +async function jn() { + let e = c(); if (!e) throw Error("ComfyUI app not available"); - let t = (e?.api && typeof e.api.queuePrompt == "function" ? e.api : null) ?? r(e), n = !!(t && typeof t.queuePrompt == "function" || t && typeof t.fetchApi == "function"), i = y(e); - if ((mn(i) || !n) && typeof e.queuePrompt == "function") return await e.queuePrompt(0), { tracked: !0 }; - let a = null; - try { - a = dn(i), ln(i, (e) => { - for (let t of e.widgets ?? []) t.beforeQueued?.({ isPartialExecution: !1 }); - }); - let n = typeof e.graphToPrompt == "function" ? await e.graphToPrompt() : null; - if (!n?.output) throw Error("graphToPrompt returned empty output"); - let r; - if (t && typeof t.queuePrompt == "function") await t.queuePrompt(0, on(n)), r = { tracked: !0 }; - else if (t && typeof t.fetchApi == "function") { - let i = await t.fetchApi("/prompt", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(sn(n, { clientId: cn(t, e) })) - }); - if (!i?.ok) throw Error(`POST /prompt failed (${i?.status})`); - r = { tracked: !0 }; - } else { - let t = await fetch("/prompt", { - method: "POST", - credentials: "include", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(sn(n, { clientId: cn(null, e) })) - }); - if (!t.ok) throw Error(`POST /prompt failed (${t.status})`); - r = { tracked: !1 }; + return { tracked: await d({ + app: e, + forceNativeQueue: An(y(e)), + resolvePromptData(e) { + return typeof e?.graphToPrompt == "function" ? e.graphToPrompt() : null; + }, + enrichPromptData(e) { + return Dn(e); + }, + buildPromptRequestBody(e, t) { + return On(e, { clientId: t.clientId }); } - return ln(i, (e) => { - for (let t of e.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); - }), e.canvas?.draw?.(!0, !0), r; - } catch (t) { - throw fn(e, a), t; - } + }) }; } //#endregion //#region ui/features/viewer/floatingViewerUi.ts -function gn(e) { +function Mn(e) { let t = e?.models; if (!t || typeof t != "object") return ""; let n = [ @@ -1938,16 +1964,16 @@ function gn(e) { ["VAE", t.vae] ], r = /* @__PURE__ */ new Set(), i = []; for (let [e, t] of n) { - let n = oe(t?.name || t?.value || t || ""); + let n = de(t?.name || t?.value || t || ""); if (!(!n || r.has(n)) && (r.add(n), i.push(`${e}: ${n}`), i.length >= 3)) break; } return i.join(" | "); } -function _n(e) { - let t = se(e); +function Nn(e) { + let t = fe(e); return t.workflowLabel ? t.workflowBadge ? `${t.workflowLabel} • ${t.workflowBadge}` : t.workflowLabel : ""; } -function vn(e, t, n, r) { +function Pn(e, t, n, r) { let i = document.createElement("div"); i.className = "mjr-mfv-idrop"; let a = document.createElement("button"); @@ -1995,21 +2021,21 @@ function vn(e, t, n, r) { } }; } -var yn = { +var Fn = { rgb: "#e0e0e0", r: "#ff5555", g: "#44dd66", b: "#5599ff", a: "#ffffff", l: "#bbbbbb" -}, bn = { +}, In = { rgb: "RGB", r: "R", g: "G", b: "B", a: "A", l: "L" -}, xn = { +}, Ln = { rgb: "500", r: "700", g: "700", @@ -2017,35 +2043,35 @@ var yn = { a: "700", l: "400" }; -function Sn(e) { +function Rn(e) { let t = document.createElement("div"); - return t.className = "mjr-mfv", t.setAttribute("role", "dialog"), t.setAttribute("aria-modal", "false"), t.setAttribute("aria-hidden", "true"), e.element = t, t.appendChild(e._buildHeader()), t.setAttribute("aria-labelledby", e._titleId), t.appendChild(e._buildToolbar()), t.appendChild(T(e)), e._contentWrapper = document.createElement("div"), e._contentWrapper.className = "mjr-mfv-content-wrapper", e._applySidebarPosition(), e._contentEl = document.createElement("div"), e._contentEl.className = "mjr-mfv-content", e._contentWrapper.appendChild(e._contentEl), e._overlayCanvas = document.createElement("canvas"), e._overlayCanvas.className = "mjr-mfv-overlay-canvas", e._contentEl.appendChild(e._overlayCanvas), e._contentEl.appendChild(te(e)), e._genSidebarEl = document.createElement("aside"), e._genSidebarEl.className = "mjr-mfv-gen-sidebar", e._genSidebarEl.setAttribute("aria-label", "Generation info"), e._genSidebarEl.setAttribute("hidden", ""), e._sidebar = new Zt({ + return t.className = "mjr-mfv", t.setAttribute("role", "dialog"), t.setAttribute("aria-modal", "false"), t.setAttribute("aria-hidden", "true"), e.element = t, t.appendChild(e._buildHeader()), t.setAttribute("aria-labelledby", e._titleId), t.appendChild(e._buildToolbar()), t.appendChild(P(e)), e._contentWrapper = document.createElement("div"), e._contentWrapper.className = "mjr-mfv-content-wrapper", e._applySidebarPosition(), e._contentEl = document.createElement("div"), e._contentEl.className = "mjr-mfv-content", e._contentWrapper.appendChild(e._contentEl), e._overlayCanvas = document.createElement("canvas"), e._overlayCanvas.className = "mjr-mfv-overlay-canvas", e._contentEl.appendChild(e._overlayCanvas), e._contentEl.appendChild(F(e)), e._genSidebarEl = document.createElement("aside"), e._genSidebarEl.className = "mjr-mfv-gen-sidebar", e._genSidebarEl.setAttribute("aria-label", "Generation info"), e._genSidebarEl.setAttribute("hidden", ""), e._sidebar = new yn({ hostEl: t, onClose: () => e._updateSettingsBtnState(!1), - onOpenGraphMap: () => e.setMode?.(I.GRAPH), + onOpenGraphMap: () => e.setMode?.(z.GRAPH), onCloseGraphMap: () => { - e._mode === I.GRAPH && e.setMode?.(I.SIMPLE); + e._mode === z.GRAPH && e.setMode?.(z.SIMPLE); } }), e._contentWrapper.appendChild(e._genSidebarEl), e._contentWrapper.appendChild(e._sidebar.el), t.appendChild(e._contentWrapper), e._rebindControlHandlers(), e._bindPanelInteractions(), e._bindDocumentUiHandlers(), e._bindLayoutObserver?.(), e._onSidebarPosChanged = (t) => { t?.detail?.key === "viewer.mfvSidebarPosition" && e._applySidebarPosition(); }, window.addEventListener("mjr-settings-changed", e._onSidebarPosChanged), e._refresh(), t; } -function Cn(t) { - let n = document.createElement("div"); - n.className = "mjr-mfv-header"; - let r = document.createElement("span"); - r.className = "mjr-mfv-header-title", r.id = t._titleId; - let i = document.createElement("i"); - i.className = "mjr-mfv-header-title-icon pi pi-eye", i.setAttribute("aria-hidden", "true"); - let a = document.createElement("span"); - a.textContent = "Majoor Floating Viewer", r.append(i, a); - let o = document.createElement("button"); - t._closeBtn = o, o.type = "button", o.className = "mjr-icon-btn mjr-mfv-close-btn", D(o, e("tooltip.closeViewer", "Close viewer"), "Esc"); - let s = document.createElement("i"); - return s.className = "pi pi-times", s.setAttribute("aria-hidden", "true"), o.appendChild(s), n.appendChild(r), n.appendChild(o), n; +function zn(e) { + let t = document.createElement("div"); + t.className = "mjr-mfv-header"; + let n = document.createElement("span"); + n.className = "mjr-mfv-header-title", n.id = e._titleId; + let r = document.createElement("i"); + r.className = "mjr-mfv-header-title-icon pi pi-eye", r.setAttribute("aria-hidden", "true"); + let i = document.createElement("span"); + i.textContent = "Majoor Floating Viewer", n.append(r, i); + let a = document.createElement("button"); + e._closeBtn = a, a.type = "button", a.className = "mjr-icon-btn mjr-mfv-close-btn", ne(a, p("tooltip.closeViewer", "Close viewer"), "Esc"); + let o = document.createElement("i"); + return o.className = "pi pi-times", o.setAttribute("aria-hidden", "true"), a.appendChild(o), t.appendChild(n), t.appendChild(a), t; } -function wn(t) { - let n = (e, { min: t, max: n, step: r, value: i } = {}) => { +function Bn(e) { + let t = (e, { min: t, max: n, step: r, value: i } = {}) => { let a = document.createElement("div"); a.className = "mjr-mfv-toolbar-range"; let o = document.createElement("input"); @@ -2056,70 +2082,70 @@ function wn(t) { input: o, out: s }; - }, r = document.createElement("div"); - r.className = "mjr-mfv-toolbar"; - let i = vn("", "Viewer mode", [ + }, n = document.createElement("div"); + n.className = "mjr-mfv-toolbar"; + let r = Pn("", p("viewer.mode", "Viewer mode"), [ { - value: I.SIMPLE, - html: "Simple" + value: z.SIMPLE, + html: `${p("viewer.mode.simple", "Simple")}` }, { - value: I.AB, - html: "A/B Compare" + value: z.AB, + html: `${p("viewer.mode.abCompare", "A/B Compare")}` }, { - value: I.SIDE, - html: "Side-by-side" + value: z.SIDE, + html: `${p("viewer.mode.sideBySide", "Side-by-side")}` }, { - value: I.GRID, - html: "Grid" + value: z.GRID, + html: `${p("viewer.mode.grid", "Grid")}` }, { - value: I.GRAPH, - html: "Graph Map" + value: z.GRAPH, + html: `${p("workflowSidebar.graphMap", "Graph Map")}` } - ], t); - t._modeDrop = i, t._modeBtn = i.trigger, t._modeSelect = i.select, t._updateModeBtnUI(), r.appendChild(i.wrap); - let a = document.createElement("button"); - a.type = "button", a.className = "mjr-icon-btn mjr-mfv-pin-trigger", a.title = "Pin slots A/B/C/D", a.setAttribute("aria-haspopup", "dialog"), a.setAttribute("aria-expanded", "false"), a.innerHTML = "", r.appendChild(a); + ], e); + e._modeDrop = r, e._modeBtn = r.trigger, e._modeSelect = r.select, e._updateModeBtnUI(), n.appendChild(r.wrap); + let i = document.createElement("button"); + i.type = "button", i.className = "mjr-icon-btn mjr-mfv-pin-trigger", i.title = p("viewer.pinSlots", "Pin slots A/B/C/D"), i.setAttribute("aria-haspopup", "dialog"), i.setAttribute("aria-expanded", "false"), i.innerHTML = "", n.appendChild(i); + let a = document.createElement("div"); + a.className = "mjr-mfv-pin-popover", e.element.appendChild(a); let o = document.createElement("div"); - o.className = "mjr-mfv-pin-popover", t.element.appendChild(o); - let s = document.createElement("div"); - s.className = "mjr-menu", s.style.cssText = "display:grid;gap:4px;", s.setAttribute("role", "group"), s.setAttribute("aria-label", "Pin References"), o.appendChild(s), t._pinGroup = s, t._pinBtns = {}; - for (let e of [ + o.className = "mjr-menu", o.style.cssText = "display:grid;gap:4px;", o.setAttribute("role", "group"), o.setAttribute("aria-label", "Pin References"), a.appendChild(o), e._pinGroup = o, e._pinBtns = {}; + for (let t of [ "A", "B", "C", "D" ]) { let n = document.createElement("button"); - n.type = "button", n.className = "mjr-menu-item mjr-mfv-pin-btn", n.dataset.slot = e, n.title = `Pin Asset ${e}`, n.setAttribute("aria-pressed", "false"); + n.type = "button", n.className = "mjr-menu-item mjr-mfv-pin-btn", n.dataset.slot = t, n.title = `Pin Asset ${t}`, n.setAttribute("aria-pressed", "false"); let r = document.createElement("span"); - r.className = "mjr-menu-item-label", r.textContent = `Asset ${e}`; + r.className = "mjr-menu-item-label", r.textContent = `Asset ${t}`; let i = document.createElement("i"); - i.className = "pi pi-map-marker mjr-menu-item-check", i.style.opacity = "0", n.appendChild(r), n.appendChild(i), s.appendChild(n), t._pinBtns[e] = n; + i.className = "pi pi-map-marker mjr-menu-item-check", i.style.opacity = "0", n.appendChild(r), n.appendChild(i), o.appendChild(n), e._pinBtns[t] = n; } - t._updatePinUI(), t._pinBtn = a, t._pinPopover = o; - let c = () => { - let e = a.getBoundingClientRect(), n = t.element.getBoundingClientRect(); - o.style.left = `${e.left - n.left}px`, o.style.top = `${e.bottom - n.top + 4}px`, o.classList.add("is-open"), a.setAttribute("aria-expanded", "true"); + e._updatePinUI(), e._pinBtn = i, e._pinPopover = a; + let s = () => { + let t = i.getBoundingClientRect(), n = e.element.getBoundingClientRect(); + a.style.left = `${t.left - n.left}px`, a.style.top = `${t.bottom - n.top + 4}px`, a.classList.add("is-open"), i.setAttribute("aria-expanded", "true"); }; - t._closePinPopover = () => { - o.classList.remove("is-open"), a.setAttribute("aria-expanded", "false"); - }, a.addEventListener("click", (e) => { - e.stopPropagation(), o.classList.contains("is-open") ? t._closePinPopover() : (t._closeAllToolbarPopovers?.(), c()); + e._closePinPopover = () => { + a.classList.remove("is-open"), i.setAttribute("aria-expanded", "false"); + }, i.addEventListener("click", (t) => { + t.stopPropagation(), a.classList.contains("is-open") ? e._closePinPopover() : (e._closeAllToolbarPopovers?.(), s()); }); - let l = document.createElement("button"); - l.type = "button", l.className = "mjr-icon-btn mjr-mfv-guides-trigger", l.title = "Guides", l.setAttribute("aria-haspopup", "listbox"), l.setAttribute("aria-expanded", "false"); - let u = document.createElement("img"); - u.src = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKi0lEQVR4nO2d+28dxRXH58dSQIW2gIoqpP7YX4qqUtLS2A4xNIQCMQTHTlOgCZDEia/vtR3b+O3r2PEjNnbiujFuo6oFU6DQl1rRpqjlEWiiUlQU+Hu+1Vjfg45Wd2d87fXYjPZIR7u5dnbn7mfPzHnt2phccskll1xyySWXXHLJJZfIBcBXAbQAWADwCwBlALXbYFzfBHAQwAkARwDsBnC9iVn4Zf8L4BMA1wB8DOB/AD4CsALg9i0Y01cA9AG4COCXAJYBvADgAoBZADUmRgHQA+BTwrgC4C8A/gjg7wA+pP4NwK0Bx3QTL/pFWus8gLPUc7Riu603MQmA79AiPiEIe/f9HMAi1d6Z7wG4CuB8wHG1E8YSgNMARgAMAxiiTgCYAzAD4GsmFuEUYGH8qwKMn1EvAvg3gA8A3BFgTLfxRrCWMVYBxiCAAQCTBNJsYhEAl2khKykw7NRwHsAlAO/bxTXAmO4jkAUHjAF+bqewXhOLcPH+mBcgDcZ5rikWXluAMT3GBXzOAaOf/7ZWMmZiEeVNLTtgnAPwewDv2rk9wJj2cyqddcAQPQNg3MQiyrVddsCYB/AGgHcAlAIBucDpKA1GH3XcLvomFiGMj3hHpsGYB/A6gLcBFANNWdZapx0werm1HtioiUUI40MCSYMxB+B3AP4JoBBgTA0cy5QDhuioXWdMLEIY/6G/nwZjDsBrAN4KBGQfxzDhgPEct3bRHzSxCGFcpcubBuN5AK8C+AeAkwHG9AjPe8YBQ9ROaf0mFiGMKwSSBmMWwCuMRU4EGNNDPO+4A0YPtT+2OOQKo/BFB4xZAL9lbqslEJAZRulpMLq5Xf3cxCKE8T49rDQYMwBeBvAmgGMBxvQgXd5RBwxR+1m3iUUI4zKBpMGYAfASgL8GArKXEXjZAaOLavc7zXYTAN+m63pZpUMk6BPXVhZwmaYExrt0M9NgnAXwIrPBfwbwJwB/YPT+Ol3iVzmtrRDebwD8GsCvUuoZiyqFLueVc01yQR/xwDhlYSS2yf2kdtibitBv2SwYPSqFfm0dMN7hxUmDMc0LHBLGOKP0LGGI6mPcvRmVvk9VCn2FaesXqEtUuRCSr1pQet4DY5oqn01RJ6kTvIhyIce5IJ+mlpWOqAzuYIVIXFIisna4YHTyju9g/aSU0KJNhlILAFqVdqjj3ZkVjFtV2bVSccmVm3It4EkYUwrARAUAYwkAoykAXIlClzdVDYyiAlFQIE5ST1Bb+Hvd/N0vZAGkRZVdcxioCsZxaifPsXEr4QW/Ru8nh4GqYRxTVrInCyDLXMBt8SiHgaphHOPv2nM9nAWQMr0pG0HnMFA1jKM8hj1vXRZAapVba13LHAaqgnFMnfPrGwZCKCsE8h59/q2EMfw5gnGc57DnbMoEBoHczia2qwz4LiWCtzdUAPcag7hXEoHciyq+SIMxn4hlxBJ1cCeg5VhyHIE5quAJtAEFSeB0rRFGkZ/Lz9tT4hH5P7LfoW4CC+aGzIAQyi28OB9UiMDfZqXvLdYzLnHNeZPemaRDZjyWccERgS9VGYGLdUlwuJpCl0RhIgJ3WUZbSgSuVaxOJyQFui2EXZcpjASYO9iULAuVDCr5xbSZSzrkrGeaWiQMexEPAfgxz9UM4ACARjYn2Hr4oyzD7mOx6UdUm8V9wLqYAO5n/1U9gHsB7KLW8LhiIa5pSgPZxePcmzie/mw3j/8tAF8y21HU9DbtWTMWaRlNAcZ0j7IQ15pREMswsYhaa6Y9C/gCp6nGAGP6gcrMuhbwVpkFTCyisrZTHm/qHNeM/YGAyDTr8qaiBCIe2JTHtZ3nAr4/4JTV4XFtT8YIROoZk544Y47p/McCT1muOCNKIFJcmvAEfc/TtW0ICKTdE/SdEJfWxCIqQJzwpENm6WntCzCmnQkgaRF4i8QZJhZR0fq4Jx1ylp7WIwGBdHjSIS0xWojUwMc9ualpeloPBbYQV27quETfJhZR6ZAxT6Jwigt7SCAlT6IwSiCSmzrtydpOcGF/MLCFuLK2kj7vMbGIShSe9qTQzzBRuDcQkC5aiCuFflSytiYWUVnbUU89Y5wL+wMBxlSjgKTBeJbb6CxEUuhlT3FpjMHjnsAWkgZDdLUL3sQiqp5R9lT6Rjlt3R/YQtJgPKOmrKiASHFpxFN2LXPaui8wkDQYzygLiepxBKn0jXhq4CNc+OsDAelmYjENxtPcrpZ9TSyiyq7DnoaEIU5buwOMqVZZSBqMI9yPzkKkBj7k6Q4ZJLRdgYCIhaTBOML91c4VE4uohoQhT6vOAKHUbQGQSjAOxwpEukMGPX1Tffx5beA1JA3GYe6vPh5tYhHVqjPgaWLrpdYEspAeFqfSYPyU29VxmVhE9U31ezoKn6PuDDCmOmUhaTCeihWINLH1edo7e7h/T0ALKTpgPMX97QuEb2KrVw1qD/OZb2lS28smtR+qRjXpKOzz9Np2sRPENsTdTd2R2Bf9XgXVn3+fjQyyTepBNWWlwXhSWwjXnZ3c1hBqndqK2ua5uwDcvNkvjGxnXmq97Z29m/yAZdca2jtl26OApMF4UllIX0L7Ey68xFeDSofYdZl5X++XE2/vXFhn4/NaHrDsrNAErXU9jc+6cVo/qFlkpjcNxhNU/VCnaPLfSe1UcZU9541ZApH32i7xQn+eHgl41hNnuGD8hCp9xtJrLP3GTdQDqvf4cep+/j95m9DhLN/4LJZh80w5DKwJhjSFN/N62VniG1kAOcg1w3YV5jBQFYxHqW2cujdeeOMXXmZHSA4DVcNo4JjKmXT180ssqZdF5jBQFYwGjrWcSYssfeoLKlubw0BVMBp4PazHuSMLINfTvV1Q7yfMYWBNMPZxnKO8Vl/cMBBCqVFB32Tiub3ki1z0q/G61wGjrcKLXDSUlgpQjlaA8nQCShKMwHliDTCqBdTI47UThtXvZgJDQalPPOa8ngcsfTDaM4zA5cbQL7PsraCFNcCoFIEPKa9T3NqRxFuJJDDenHKC/ZMNHGgvA8Qsn3Yt8OchYfTxvK5p6uA6YAzzO1hLuc1sN1FQfGtGO38vRD1kN4G0eqakz4CYWETd9b4FvEQL2BkQSMGzPjSLZZhYRE1Z7R5vqp1AarYASNpi3STTlIlF1JRV8ri2pcBA+jkGl+ckQIZjnbJccUYpMJABjsHlxh6QxdtECKToCfpKBBKi66SeFtLqiSmiBtLmicBLdGFrA09Zrgi8UVxbEykQVzqkFNhCBhSQtHRIo8QZJkIgBU9uqkgLqQkMxJWbEiBlEyGQVk+isBRwyqpnfNHqSRQ+LhG4iUVUSqTVk7UtEUiIwHAXgRQ8WdtGSYeYWIQXu0sBSUuhdzAHdWeAMd1FIJ2eFPohAjllYhE2z3XxgrteGNlDC7kpwJhuVgW3Q456hqTQN/0dXsGE72uUDG4x5VWqpwijIeC4pCOkl/vJSp8Ul8rbMmu7EWEr6Gd/HEUFibJudPMCXBdwTDfw/JJGL/IGaVFl19EQTsaWiF0bGItUqmc0Zd5yubYx3cgqYqXiUn/mlb7tJvZPNhDMHs7RdZm98XkDYpvY+DbTZq4nOzKrgeeSSy655JJLLrnkkksuuZjtK/8HkUQ57PG6Io0AAAAASUVORK5CYII=", "" + import.meta.url).href, u.className = "mjr-mfv-guides-icon", u.alt = "", u.setAttribute("aria-hidden", "true"), l.appendChild(u), r.appendChild(l); + let c = document.createElement("button"); + c.type = "button", c.className = "mjr-icon-btn mjr-mfv-guides-trigger", c.title = "Guides", c.setAttribute("aria-haspopup", "listbox"), c.setAttribute("aria-expanded", "false"); + let l = document.createElement("img"); + l.src = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKi0lEQVR4nO2d+28dxRXH58dSQIW2gIoqpP7YX4qqUtLS2A4xNIQCMQTHTlOgCZDEia/vtR3b+O3r2PEjNnbiujFuo6oFU6DQl1rRpqjlEWiiUlQU+Hu+1Vjfg45Wd2d87fXYjPZIR7u5dnbn7mfPzHnt2phccskll1xyySWXXHLJJZfIBcBXAbQAWADwCwBlALXbYFzfBHAQwAkARwDsBnC9iVn4Zf8L4BMA1wB8DOB/AD4CsALg9i0Y01cA9AG4COCXAJYBvADgAoBZADUmRgHQA+BTwrgC4C8A/gjg7wA+pP4NwK0Bx3QTL/pFWus8gLPUc7Riu603MQmA79AiPiEIe/f9HMAi1d6Z7wG4CuB8wHG1E8YSgNMARgAMAxiiTgCYAzAD4GsmFuEUYGH8qwKMn1EvAvg3gA8A3BFgTLfxRrCWMVYBxiCAAQCTBNJsYhEAl2khKykw7NRwHsAlAO/bxTXAmO4jkAUHjAF+bqewXhOLcPH+mBcgDcZ5rikWXluAMT3GBXzOAaOf/7ZWMmZiEeVNLTtgnAPwewDv2rk9wJj2cyqddcAQPQNg3MQiyrVddsCYB/AGgHcAlAIBucDpKA1GH3XcLvomFiGMj3hHpsGYB/A6gLcBFANNWdZapx0werm1HtioiUUI40MCSYMxB+B3AP4JoBBgTA0cy5QDhuioXWdMLEIY/6G/nwZjDsBrAN4KBGQfxzDhgPEct3bRHzSxCGFcpcubBuN5AK8C+AeAkwHG9AjPe8YBQ9ROaf0mFiGMKwSSBmMWwCuMRU4EGNNDPO+4A0YPtT+2OOQKo/BFB4xZAL9lbqslEJAZRulpMLq5Xf3cxCKE8T49rDQYMwBeBvAmgGMBxvQgXd5RBwxR+1m3iUUI4zKBpMGYAfASgL8GArKXEXjZAaOLavc7zXYTAN+m63pZpUMk6BPXVhZwmaYExrt0M9NgnAXwIrPBfwbwJwB/YPT+Ol3iVzmtrRDebwD8GsCvUuoZiyqFLueVc01yQR/xwDhlYSS2yf2kdtibitBv2SwYPSqFfm0dMN7hxUmDMc0LHBLGOKP0LGGI6mPcvRmVvk9VCn2FaesXqEtUuRCSr1pQet4DY5oqn01RJ6kTvIhyIce5IJ+mlpWOqAzuYIVIXFIisna4YHTyju9g/aSU0KJNhlILAFqVdqjj3ZkVjFtV2bVSccmVm3It4EkYUwrARAUAYwkAoykAXIlClzdVDYyiAlFQIE5ST1Bb+Hvd/N0vZAGkRZVdcxioCsZxaifPsXEr4QW/Ru8nh4GqYRxTVrInCyDLXMBt8SiHgaphHOPv2nM9nAWQMr0pG0HnMFA1jKM8hj1vXRZAapVba13LHAaqgnFMnfPrGwZCKCsE8h59/q2EMfw5gnGc57DnbMoEBoHczia2qwz4LiWCtzdUAPcag7hXEoHciyq+SIMxn4hlxBJ1cCeg5VhyHIE5quAJtAEFSeB0rRFGkZ/Lz9tT4hH5P7LfoW4CC+aGzIAQyi28OB9UiMDfZqXvLdYzLnHNeZPemaRDZjyWccERgS9VGYGLdUlwuJpCl0RhIgJ3WUZbSgSuVaxOJyQFui2EXZcpjASYO9iULAuVDCr5xbSZSzrkrGeaWiQMexEPAfgxz9UM4ACARjYn2Hr4oyzD7mOx6UdUm8V9wLqYAO5n/1U9gHsB7KLW8LhiIa5pSgPZxePcmzie/mw3j/8tAF8y21HU9DbtWTMWaRlNAcZ0j7IQ15pREMswsYhaa6Y9C/gCp6nGAGP6gcrMuhbwVpkFTCyisrZTHm/qHNeM/YGAyDTr8qaiBCIe2JTHtZ3nAr4/4JTV4XFtT8YIROoZk544Y47p/McCT1muOCNKIFJcmvAEfc/TtW0ICKTdE/SdEJfWxCIqQJzwpENm6WntCzCmnQkgaRF4i8QZJhZR0fq4Jx1ylp7WIwGBdHjSIS0xWojUwMc9ualpeloPBbYQV27quETfJhZR6ZAxT6Jwigt7SCAlT6IwSiCSmzrtydpOcGF/MLCFuLK2kj7vMbGIShSe9qTQzzBRuDcQkC5aiCuFflSytiYWUVnbUU89Y5wL+wMBxlSjgKTBeJbb6CxEUuhlT3FpjMHjnsAWkgZDdLUL3sQiqp5R9lT6Rjlt3R/YQtJgPKOmrKiASHFpxFN2LXPaui8wkDQYzygLiepxBKn0jXhq4CNc+OsDAelmYjENxtPcrpZ9TSyiyq7DnoaEIU5buwOMqVZZSBqMI9yPzkKkBj7k6Q4ZJLRdgYCIhaTBOML91c4VE4uohoQhT6vOAKHUbQGQSjAOxwpEukMGPX1Tffx5beA1JA3GYe6vPh5tYhHVqjPgaWLrpdYEspAeFqfSYPyU29VxmVhE9U31ezoKn6PuDDCmOmUhaTCeihWINLH1edo7e7h/T0ALKTpgPMX97QuEb2KrVw1qD/OZb2lS28smtR+qRjXpKOzz9Np2sRPENsTdTd2R2Bf9XgXVn3+fjQyyTepBNWWlwXhSWwjXnZ3c1hBqndqK2ua5uwDcvNkvjGxnXmq97Z29m/yAZdca2jtl26OApMF4UllIX0L7Ey68xFeDSofYdZl5X++XE2/vXFhn4/NaHrDsrNAErXU9jc+6cVo/qFlkpjcNxhNU/VCnaPLfSe1UcZU9541ZApH32i7xQn+eHgl41hNnuGD8hCp9xtJrLP3GTdQDqvf4cep+/j95m9DhLN/4LJZh80w5DKwJhjSFN/N62VniG1kAOcg1w3YV5jBQFYxHqW2cujdeeOMXXmZHSA4DVcNo4JjKmXT180ssqZdF5jBQFYwGjrWcSYssfeoLKlubw0BVMBp4PazHuSMLINfTvV1Q7yfMYWBNMPZxnKO8Vl/cMBBCqVFB32Tiub3ki1z0q/G61wGjrcKLXDSUlgpQjlaA8nQCShKMwHliDTCqBdTI47UThtXvZgJDQalPPOa8ngcsfTDaM4zA5cbQL7PsraCFNcCoFIEPKa9T3NqRxFuJJDDenHKC/ZMNHGgvA8Qsn3Yt8OchYfTxvK5p6uA6YAzzO1hLuc1sN1FQfGtGO38vRD1kN4G0eqakz4CYWETd9b4FvEQL2BkQSMGzPjSLZZhYRE1Z7R5vqp1AarYASNpi3STTlIlF1JRV8ri2pcBA+jkGl+ckQIZjnbJccUYpMJABjsHlxh6QxdtECKToCfpKBBKi66SeFtLqiSmiBtLmicBLdGFrA09Zrgi8UVxbEykQVzqkFNhCBhSQtHRIo8QZJkIgBU9uqkgLqQkMxJWbEiBlEyGQVk+isBRwyqpnfNHqSRQ+LhG4iUVUSqTVk7UtEUiIwHAXgRQ8WdtGSYeYWIQXu0sBSUuhdzAHdWeAMd1FIJ2eFPohAjllYhE2z3XxgrteGNlDC7kpwJhuVgW3Q456hqTQN/0dXsGE72uUDG4x5VWqpwijIeC4pCOkl/vJSp8Ul8rbMmu7EWEr6Gd/HEUFibJudPMCXBdwTDfw/JJGL/IGaVFl19EQTsaWiF0bGItUqmc0Zd5yubYx3cgqYqXiUn/mlb7tJvZPNhDMHs7RdZm98XkDYpvY+DbTZq4nOzKrgeeSSy655JJLLrnkkksuuZjtK/8HkUQ57PG6Io0AAAAASUVORK5CYII=", "" + import.meta.url).href, l.className = "mjr-mfv-guides-icon", l.alt = "", l.setAttribute("aria-hidden", "true"), c.appendChild(l), n.appendChild(c); + let u = document.createElement("div"); + u.className = "mjr-mfv-guides-popover", e.element.appendChild(u); let d = document.createElement("div"); - d.className = "mjr-mfv-guides-popover", t.element.appendChild(d); - let f = document.createElement("div"); - f.className = "mjr-menu", f.style.cssText = "display:grid;gap:4px;", d.appendChild(f); - let p = document.createElement("select"); - p.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", d.appendChild(p); + d.className = "mjr-menu", d.style.cssText = "display:grid;gap:4px;", u.appendChild(d); + let f = document.createElement("select"); + f.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", u.appendChild(f); let m = [ { value: "0", @@ -2137,52 +2163,52 @@ function wn(t) { value: "3", label: "Safe" } - ], h = String(t._gridMode || 0), g = []; + ], h = String(e._gridMode || 0), g = []; for (let e of m) { let t = document.createElement("option"); - t.value = e.value, p.appendChild(t); + t.value = e.value, f.appendChild(t); let n = document.createElement("button"); n.type = "button", n.className = "mjr-menu-item", n.dataset.value = e.value; let r = document.createElement("span"); r.className = "mjr-menu-item-label", r.textContent = e.label; let i = document.createElement("i"); - i.className = "pi pi-check mjr-menu-item-check", i.style.opacity = e.value === h ? "1" : "0", n.appendChild(r), n.appendChild(i), f.appendChild(n), g.push(n), e.value === h && n.classList.add("is-active"); + i.className = "pi pi-check mjr-menu-item-check", i.style.opacity = e.value === h ? "1" : "0", n.appendChild(r), n.appendChild(i), d.appendChild(n), g.push(n), e.value === h && n.classList.add("is-active"); } - p.value = h, l.classList.toggle("is-on", h !== "0"), t._guidesSelect = p, t._guideBtn = l, t._guidePopover = d; + f.value = h, c.classList.toggle("is-on", h !== "0"), e._guidesSelect = f, e._guideBtn = c, e._guidePopover = u; let _ = () => { - let e = l.getBoundingClientRect(), n = t.element.getBoundingClientRect(); - d.style.left = `${e.left - n.left}px`, d.style.top = `${e.bottom - n.top + 4}px`, d.classList.add("is-open"), l.setAttribute("aria-expanded", "true"); + let t = c.getBoundingClientRect(), n = e.element.getBoundingClientRect(); + u.style.left = `${t.left - n.left}px`, u.style.top = `${t.bottom - n.top + 4}px`, u.classList.add("is-open"), c.setAttribute("aria-expanded", "true"); }; - t._closeGuidePopover = () => { - d.classList.remove("is-open"), l.setAttribute("aria-expanded", "false"); - }, l.addEventListener("click", (e) => { - e.stopPropagation(), d.classList.contains("is-open") ? t._closeGuidePopover() : (t._closeAllToolbarPopovers?.(), _()); - }), f.addEventListener("click", (e) => { - let n = e.target.closest(".mjr-menu-item"); + e._closeGuidePopover = () => { + u.classList.remove("is-open"), c.setAttribute("aria-expanded", "false"); + }, c.addEventListener("click", (t) => { + t.stopPropagation(), u.classList.contains("is-open") ? e._closeGuidePopover() : (e._closeAllToolbarPopovers?.(), _()); + }), d.addEventListener("click", (t) => { + let n = t.target.closest(".mjr-menu-item"); if (!n) return; let r = n.dataset.value; - p.value = r ?? "", p.dispatchEvent(new Event("change", { bubbles: !0 })), g.forEach((e) => { + f.value = r ?? "", f.dispatchEvent(new Event("change", { bubbles: !0 })), g.forEach((e) => { let t = e.dataset.value === r; e.classList.toggle("is-active", t), e.querySelector(".mjr-menu-item-check").style.opacity = t ? "1" : "0"; - }), l.classList.toggle("is-on", r !== "0"), t._closeGuidePopover(); + }), c.classList.toggle("is-on", r !== "0"), e._closeGuidePopover(); }); - let v = String(t._channel || "rgb"), y = document.createElement("button"); + let v = String(e._channel || "rgb"), y = document.createElement("button"); y.type = "button", y.className = "mjr-icon-btn mjr-mfv-ch-trigger", y.title = "Channel", y.setAttribute("aria-haspopup", "listbox"), y.setAttribute("aria-expanded", "false"); let b = document.createElement("img"); - b.src = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAQ4ElEQVR4nO2deVRTd97Gb52tM++c875dpkpxQ7QKCChYBUEjhC2QhAQEJCyO044zPfPO9NQuc+ZMfSNLgABhcWydtmpLXQapRTZBsS6Qm5vF3aq1rkfFahbXakWFfN9z700QkST3JvcSojznPCf/gp/zub/k4eaKICMZyUhGMpKRPAMxpSV5G9Li003pfKkhI3GDKSNptzGdpzFmJH5rSk88akzjqU3pCbsMabwNJnH8cr04eqFBHO/l7p/7qQkgyHPG1ASuMZO/1iQRnDJKhGaTRABEM/lkFyWRzbA0PZGoMZ1H1JCWYDakxp00imM+MaTFcNz9O3lkbqbFvWiUJMpMkuQLpqxkICoRWtoPiAMYxrQEsgvjyabGgTEl7pw+mbviRjLnf9z9e3oGiExBtTFL+KMpWwR2YdAFgsPoV4OYe8sgipGPgLERQwYvw5SdfNWUIwICBlUgdOzo35RYogYRV28URS3FL4/u/jcYFjFkxXuZsoR7TTlioA3DWSAWGEZxDFkRFwzJUe0/JET+DnmWY1okjjXmiPR9MHKG1o7+QAgooqjL10ULns2D/7qEL7mWk9JNwhgAJGto7SCaHE3UIIi6r+dzcpBnKdckye+ZclN6B4WRTRMIQ3ZYgRiTo8AgjOrR8+f9BXkWYswWLCVg5KaAXSCSobcDh0FUuAAMwgXma/x5byJPc/SZ/FRjrvihQxhZ9IAwaYcVCAGFz3lg4M/nIU9j9LkiX1Ou+CYBwx12pMbRgyGwNGnezatJkZOQpymQlvZLY7b4ECUYWU4CYdoOHAafQ9TIn7cfQkN/gTwtMWUJy64tTgV6QATM22EFQtUOCxADfz5uynLkaYg+WzDZlJtyrw8IG3ak85i3ow/IfLKJkT/pE+b6Ip4eY1ZyO307hOzZYQVCxw7SEDAkRmxFPDmmTNFs0+JU85NAPMUOziMYSfNAnxhp1idFBCOeGlO2qMVpOyQuTOyUgdCwgzAkEvSJEbWIJ8aUJR5rzBX3DIkdaQns2dF3uYokgfAiHhri53neXyGvZQlWuGxHJn9Y2UGUFwGG+LnLEE+LMVt8wiYQN03sRmftsALBYRBAwvchnhTjIuGr+GE+fO2Idt4OXgToEyJ6r8SGv4J4SkxZwj84vFx5qh0JlsaHpSOekmuS5C8YnUnSWbDDuurStMMK5Gp82EeIp+RaTorabSNiCgt2WIFY7UiYC/r4sF2Ip8SUk6L3mIldQN8OEkj4RcQTcn4x53lTborZrSOimAU7+oDMtQLpBQ7n54hH3EXiSRO7YAFtO4jGh8PFuLAXkeEeYyZ/msdO7HyKQOLDiV6JnzMRGe7RZycFe+zEnkTdDrymmDl+yHDPlTSBj0dP7EkUgcSFgSk62BvxhPtzPXliN1C0Awei5/j/FhnugTTkZ6Yc8QNPntgNFOzQx8zp9pj7gU2S5HO2YOglqXA8+y3oWPwh7FhcCM2/L4Wm35dBa24x7MzJA3X2+3A+Ixv06QLWJnZj6ny4vjQcbv0jFG4XzYA7FYFwp3I63FEEwG1ZENz6MBhuvBUKxpRw23bEhp1APCXGjKR2K5DzubnQ9kYRbP7D59CQtQl2pG+CHWkbH+/CDbA91dIUsq3i9bA5swa2ZK8EbNG7YFiY5LwdCzlwa/nr8NMGP3iI+oD59KtgPovXy9IxZM+MtvQVS38HPQe84F6tD9zOCwDToll9QK7EzGlAPCVd6Qurt78pg81LNsKOjE3QnmEBYQPGYEC2i9cTbbO0OWU9bJashgMZf6YGQxQNN98Lg3v1ftB7chyYz44F81lvS+0BeQSD7MuWvgTm0y9Bd5s33FruD5fTQhTIcI+/9Ngvgyq1b2Us/8bUvmgTEKUAxBGMNtGXZJPJ1qbVAJrxLhhSBvlknsKF23mz4aF6MpjPWkFQheEACNEXibY1z71XgvHLi7Sil5DhmMDKfZkzK7VdM6t0MKtSC01ZtZRgOAOkVVgDrYIa2LxwHRxNXdIH48Y7EfBQOQXMZ8dbYDgLxD6MniMvgwIVQKlaCKWY4Gapmr+sri7tZ8hwiFeJcnygQrszpFoHOAy8M6p0UPaXJnpA6MAQkkDwbhPUQNMbVXCnLhzMZydYYAwEwqwdxlYfKFUnE0DkagFZjH+wBOMFuhXGtDJN0oxKrRGHMRBIpnQPe3YIHwHZ9+Ea6LlzCuDBGTBfimHdDvOZF2BPUxhpx+NA8N4rxhLfcQuMwApNSUi11jwYDLwhFVrYkrOZHhAxPRinPq8B6L0Dfen9EcxXcm0AYcaOB/tfAYVK+DgQEgaUWFqsSlwtBemoIUIBzwVWaP8dWq0DvLaABFdq4Z33d7Bmx4WtXwKYH8ITMT8Es2GZi4e5bTu+qw+0ZUcfkBIsCYpVvEbpHs7z7MNQaGqpwMA7u0wDDZJaWkDaqMBo2Ijr8CSMR6qA2fDXQYC4Zgd+mH+8N8muHTgMAgiWCCWqxCZWD/uZFZqPZq3cB1SBBFVo4W/v7WDUjlNr1wGYH9iB0c+UK1kuXK6etONEfRAlO6xAiKp4GwBYmFj8ytVv4zCsQKjAwDuzXAMbcuvoARENDmP//60F6L3rGEb/M+XifEbs6MbGQIX1re4AIHZgEJVhvA8YhTFNjoWEVOnu0bUDb2CFFpKle2G7i3bszKyBnrungHbufwfmc75OArHYceoF2N4U6YwdRItUvIcyNH4eIzBCP9n/m9Aq3bn+doTSgEFUoYV/vL3NJTtundgOTufWGpfsONfo1/e5wzYQmzCIytD4C9I9HNfn+pAqjWIwGHSBBJVr4OMl9U7ZcaT8cwDocR4Ifsh3JToF5PY346Bi4NtcenZYmgAyNLbMJRgBlWq/16t19121A+90hQZmyzHYJNnsGEhyPztENdBz+yS4nO4DpCU0YHRrx8CnuxIo2MF3CIMEEv8gXxkf4DSQ0GpdPRN2WIEElGtgvgyF2kW1lO04t+lLYCrmKzmUgTzYPxrWfxNLGQYlIKp4KFTGf+UUjMBK3dRZ1boee0DowLACwcspUMJ/MmvtAmnF7UiugZ4fv2cMCHQfpgTjvm4M1O6IscCgCcQODKLK2F6ZKnY6bSAhlfvWMWmHFYi/pXNkKKzJ/squHcdXfQFMx3yZbxfIT0pvWLs7AcqcgUEFCBoHRWjcGlowOJ/vef71lbobVIDQtcMKxK9MA8ElGOQvbbAJ5O753YwDgVsbbcLQb5sC/0L5/WAwbAcaR1YZe0uBhf2aMpAZCk0um3bgMPBOK1MTzfqgHb5O3fj45w7JF/Q+BFJN7x1yeOwH5OGRMaBtfB3K1CICxkAgTNqBt5C0JIMykNAq7VY6QJyxoz+QqaVqCJWhsOKPDdAqIoGcxpdclmK+nEbCOPUyXG15DT7bk2gTBl0gVGCQjd1IHUi17irTdgTYgYH3NUvnreiA4iX1cPN4G3tArn8C11unwNetXCjXiC0wHABh0A68BWjsD5Q2rqAy3XRnLleu2NEfyBQ52b83aeH8iTbovX+ZMRC99y/B2RPN8H5jBwGCMgzaQBzaQVSq4kxzCGRGleYNtuywAnEEY7Icg7iWyxDX+gMktnbBJ7s74MyxVui+cQig50fqBHpuQ/f1g3DqWBOsbN8LCxq7ILKpCyIbL0GpeqHb7LACyVfFLnIIZGaVtszddvhXHyBg4I3dRjZm22WyLV3wwbYDUNfRDqhmGxw60ALfH22Fk0e3waFDzaDUNUPt3nZ4t00HUS0XYX7zZaLzmsgSQJq64J/K/2XJDh4lGAVoDOR3xkkdA6kgD3S27LACsWdH0OrDNoFwLY1uIRvVrwuayXIstQUD75/a5bSAMG0HDqSgM8bxwR5aret06nLFkB2T5RjM/PToY0CowKALJHfbatbs6ANiDwZuiDK6zTGQlfsOujoiUgUyGIzJcgxCPvuWth1WIFRg4E1v+tIJIAzaQRalcIbovnP2csWEHZPlGMxad/wJIEzagVe0dUsfEHfYUaDk4q9HHAOp1H7L1IjojB2+JRiErDnmlB0LKMKIaOyChU0bnbpcMWaHkgv5aIyWiiFqVyd2V+zwLSHPkMGAMGUHDiSz5TP27LAAsWsHDkQZvZOKITvZtmOqHRi+JRgEfnzY5cPcHgy8S1orWR8RHQEp6OR+7RBIcIV2DVsjIhU7fEsw8F95gFU78C7b/XdWJ3aZQzu4UIhyHf9JN1CheZ/Jid0RkIEwJuGvcg3EtLj+VtcWjLkNXVCkynCrHTiQ/I5ox0/ODlJoE9xpxyRLOVsvPAGEKTvCt5wekondCmRQGEou5HUuiHAIxH/Vnt/OrNLdZ2NitwVkIAyfYgzCNp1mx47GLojagg3VxG4TSEFn9N3q1oRfOQRCnCOVun1sTuyO7PApxiD406OMzSQDgWQ2rxnSEXFwO6J3IFQzXaGVDcWIaAuGTzEGvqUaiG7pYuQw7w8jvOESrOhcPGQTu+3LFZf6cxv9FdjkGVVaM9sTuz0gE4tUEFF3jnE7Ir86MvQj4gAY+Z1RvYVYNL2nQARVaHRsj4hWIIPBmFikgsB/H2XUDvJy9dmQTuwuX64eWaJewubE7siOiXjxd1sNl1waEfsDCas/D8Wq1KG1wzqT9DUa8pTRAtpAONI9Pw+u0J5j2w5fGzAmWDpjzTGXL1dWO4Rb69wzIj5ux2Gnvy/iV6b9M5sjoj07Jlg6sUQNnIaLjNhRqJIM/cT+GJBoyFdGpSBORyodNV2hOcjGxD4YkIkDYIyXkQ1YfcTlwzy9aY377VBGOR4THWW6XDsrUKHpcYcd4y1AxhWpIKz2LO2J3Qojou5bkKtFbpnY+9nRnY9GTUWYyLRSdSnTE7stIBMGwrB0UrkO5jdeoj+T1F+A93a97caJve+tLoPfX5dKRwWUazuZnNgp2yEjO7YQhan/OgScJuoTOz4iSpo/cvuIWKCMaWH8i59TFJi3f5n6ItMjIhU7xhaiRL0LUQhae5yyHXFft7l9Yi/o5B4rVka+gLCRiXJ0qn+5xsDExE7XjrEWIGNlKphR873DEZFTp4FStdi9I2Int0uqjBmPsJkphdhsv1K1kWk7JlKA4V2IwqsF+CsJxRaQ+XUakGNiN0/s0RcZO8QdZZL84BS/Muw8EyMiHTu8LUCIFqog+IuTT8CI/movyFVPwhhSO1DuiYKOuHHIUGZ8YYfX1FJ1J5N2TCiiBsPL0jH5Snht1SGY23AJIhougXjrRrfdp9sHo5PbyNqZ4TBS6ajJclXRVLm6x5URka4dXv2AjM5XwkQF9sOf2vJM7rqLnbSD213QyV3GymM06Ma3WBk6Ra7WMfZBUEYZxr3R+R0y5K+tvyo7nP1fpWqRrEwtvD/U9+nmK7l7pZ3R/sjwCjznU4y9+VoJdoZ1O/KVD0bnddb8t3TPE89eL8GSA+UqQX0pJuxle2IvUMYcKUS5qciwjlQ6yqcYzZ5UgmGT5epeVw5z7wEwxuR1msbko6sGAzEwJVpBgBwTrJNjgltM2lGAxvYUorHt+WiMcFhcnuhkXAHqO6FYtcKnGFP5FKm6nbHj1QLlJa8C1XqvPKUYWbqf9v/YrMDSfi3XCDJLsKTaEkxwxckR8a4Mjd0pU8a9W4glDf/nvVOJl3T/b8bLVNzxRaq/TShCV00owlrGy9COcTLVYbKodmwh+o13gfI/3oXKPK8CVebL+XunMP1zlCgFATKMLylSJeUVY7xNxSreziIVT12E8g7KVLz9MjRhlwyNr5cp4xSFyoSl+FN8KN8dMpKRjGQkIxkJ4r78Pwv259NnjlZFAAAAAElFTkSuQmCC", "" + import.meta.url).href, b.className = "mjr-mfv-ch-icon", b.alt = "", b.setAttribute("aria-hidden", "true"), y.appendChild(b), r.appendChild(y); + b.src = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAQ4ElEQVR4nO2deVRTd97Gb52tM++c875dpkpxQ7QKCChYBUEjhC2QhAQEJCyO044zPfPO9NQuc+ZMfSNLgABhcWydtmpLXQapRTZBsS6Qm5vF3aq1rkfFahbXakWFfN9z700QkST3JvcSojznPCf/gp/zub/k4eaKICMZyUhGMpKRPAMxpSV5G9Li003pfKkhI3GDKSNptzGdpzFmJH5rSk88akzjqU3pCbsMabwNJnH8cr04eqFBHO/l7p/7qQkgyHPG1ASuMZO/1iQRnDJKhGaTRABEM/lkFyWRzbA0PZGoMZ1H1JCWYDakxp00imM+MaTFcNz9O3lkbqbFvWiUJMpMkuQLpqxkICoRWtoPiAMYxrQEsgvjyabGgTEl7pw+mbviRjLnf9z9e3oGiExBtTFL+KMpWwR2YdAFgsPoV4OYe8sgipGPgLERQwYvw5SdfNWUIwICBlUgdOzo35RYogYRV28URS3FL4/u/jcYFjFkxXuZsoR7TTlioA3DWSAWGEZxDFkRFwzJUe0/JET+DnmWY1okjjXmiPR9MHKG1o7+QAgooqjL10ULns2D/7qEL7mWk9JNwhgAJGto7SCaHE3UIIi6r+dzcpBnKdckye+ZclN6B4WRTRMIQ3ZYgRiTo8AgjOrR8+f9BXkWYswWLCVg5KaAXSCSobcDh0FUuAAMwgXma/x5byJPc/SZ/FRjrvihQxhZ9IAwaYcVCAGFz3lg4M/nIU9j9LkiX1Ou+CYBwx12pMbRgyGwNGnezatJkZOQpymQlvZLY7b4ECUYWU4CYdoOHAafQ9TIn7cfQkN/gTwtMWUJy64tTgV6QATM22EFQtUOCxADfz5uynLkaYg+WzDZlJtyrw8IG3ak85i3ow/IfLKJkT/pE+b6Ip4eY1ZyO307hOzZYQVCxw7SEDAkRmxFPDmmTNFs0+JU85NAPMUOziMYSfNAnxhp1idFBCOeGlO2qMVpOyQuTOyUgdCwgzAkEvSJEbWIJ8aUJR5rzBX3DIkdaQns2dF3uYokgfAiHhri53neXyGvZQlWuGxHJn9Y2UGUFwGG+LnLEE+LMVt8wiYQN03sRmftsALBYRBAwvchnhTjIuGr+GE+fO2Idt4OXgToEyJ6r8SGv4J4SkxZwj84vFx5qh0JlsaHpSOekmuS5C8YnUnSWbDDuurStMMK5Gp82EeIp+RaTorabSNiCgt2WIFY7UiYC/r4sF2Ip8SUk6L3mIldQN8OEkj4RcQTcn4x53lTborZrSOimAU7+oDMtQLpBQ7n54hH3EXiSRO7YAFtO4jGh8PFuLAXkeEeYyZ/msdO7HyKQOLDiV6JnzMRGe7RZycFe+zEnkTdDrymmDl+yHDPlTSBj0dP7EkUgcSFgSk62BvxhPtzPXliN1C0Awei5/j/FhnugTTkZ6Yc8QNPntgNFOzQx8zp9pj7gU2S5HO2YOglqXA8+y3oWPwh7FhcCM2/L4Wm35dBa24x7MzJA3X2+3A+Ixv06QLWJnZj6ny4vjQcbv0jFG4XzYA7FYFwp3I63FEEwG1ZENz6MBhuvBUKxpRw23bEhp1APCXGjKR2K5DzubnQ9kYRbP7D59CQtQl2pG+CHWkbH+/CDbA91dIUsq3i9bA5swa2ZK8EbNG7YFiY5LwdCzlwa/nr8NMGP3iI+oD59KtgPovXy9IxZM+MtvQVS38HPQe84F6tD9zOCwDToll9QK7EzGlAPCVd6Qurt78pg81LNsKOjE3QnmEBYQPGYEC2i9cTbbO0OWU9bJashgMZf6YGQxQNN98Lg3v1ftB7chyYz44F81lvS+0BeQSD7MuWvgTm0y9Bd5s33FruD5fTQhTIcI+/9Ngvgyq1b2Us/8bUvmgTEKUAxBGMNtGXZJPJ1qbVAJrxLhhSBvlknsKF23mz4aF6MpjPWkFQheEACNEXibY1z71XgvHLi7Sil5DhmMDKfZkzK7VdM6t0MKtSC01ZtZRgOAOkVVgDrYIa2LxwHRxNXdIH48Y7EfBQOQXMZ8dbYDgLxD6MniMvgwIVQKlaCKWY4Gapmr+sri7tZ8hwiFeJcnygQrszpFoHOAy8M6p0UPaXJnpA6MAQkkDwbhPUQNMbVXCnLhzMZydYYAwEwqwdxlYfKFUnE0DkagFZjH+wBOMFuhXGtDJN0oxKrRGHMRBIpnQPe3YIHwHZ9+Ea6LlzCuDBGTBfimHdDvOZF2BPUxhpx+NA8N4rxhLfcQuMwApNSUi11jwYDLwhFVrYkrOZHhAxPRinPq8B6L0Dfen9EcxXcm0AYcaOB/tfAYVK+DgQEgaUWFqsSlwtBemoIUIBzwVWaP8dWq0DvLaABFdq4Z33d7Bmx4WtXwKYH8ITMT8Es2GZi4e5bTu+qw+0ZUcfkBIsCYpVvEbpHs7z7MNQaGqpwMA7u0wDDZJaWkDaqMBo2Ijr8CSMR6qA2fDXQYC4Zgd+mH+8N8muHTgMAgiWCCWqxCZWD/uZFZqPZq3cB1SBBFVo4W/v7WDUjlNr1wGYH9iB0c+UK1kuXK6etONEfRAlO6xAiKp4GwBYmFj8ytVv4zCsQKjAwDuzXAMbcuvoARENDmP//60F6L3rGEb/M+XifEbs6MbGQIX1re4AIHZgEJVhvA8YhTFNjoWEVOnu0bUDb2CFFpKle2G7i3bszKyBnrungHbufwfmc75OArHYceoF2N4U6YwdRItUvIcyNH4eIzBCP9n/m9Aq3bn+doTSgEFUoYV/vL3NJTtundgOTufWGpfsONfo1/e5wzYQmzCIytD4C9I9HNfn+pAqjWIwGHSBBJVr4OMl9U7ZcaT8cwDocR4Ifsh3JToF5PY346Bi4NtcenZYmgAyNLbMJRgBlWq/16t19121A+90hQZmyzHYJNnsGEhyPztENdBz+yS4nO4DpCU0YHRrx8CnuxIo2MF3CIMEEv8gXxkf4DSQ0GpdPRN2WIEElGtgvgyF2kW1lO04t+lLYCrmKzmUgTzYPxrWfxNLGQYlIKp4KFTGf+UUjMBK3dRZ1boee0DowLACwcspUMJ/MmvtAmnF7UiugZ4fv2cMCHQfpgTjvm4M1O6IscCgCcQODKLK2F6ZKnY6bSAhlfvWMWmHFYi/pXNkKKzJ/squHcdXfQFMx3yZbxfIT0pvWLs7AcqcgUEFCBoHRWjcGlowOJ/vef71lbobVIDQtcMKxK9MA8ElGOQvbbAJ5O753YwDgVsbbcLQb5sC/0L5/WAwbAcaR1YZe0uBhf2aMpAZCk0um3bgMPBOK1MTzfqgHb5O3fj45w7JF/Q+BFJN7x1yeOwH5OGRMaBtfB3K1CICxkAgTNqBt5C0JIMykNAq7VY6QJyxoz+QqaVqCJWhsOKPDdAqIoGcxpdclmK+nEbCOPUyXG15DT7bk2gTBl0gVGCQjd1IHUi17irTdgTYgYH3NUvnreiA4iX1cPN4G3tArn8C11unwNetXCjXiC0wHABh0A68BWjsD5Q2rqAy3XRnLleu2NEfyBQ52b83aeH8iTbovX+ZMRC99y/B2RPN8H5jBwGCMgzaQBzaQVSq4kxzCGRGleYNtuywAnEEY7Icg7iWyxDX+gMktnbBJ7s74MyxVui+cQig50fqBHpuQ/f1g3DqWBOsbN8LCxq7ILKpCyIbL0GpeqHb7LACyVfFLnIIZGaVtszddvhXHyBg4I3dRjZm22WyLV3wwbYDUNfRDqhmGxw60ALfH22Fk0e3waFDzaDUNUPt3nZ4t00HUS0XYX7zZaLzmsgSQJq64J/K/2XJDh4lGAVoDOR3xkkdA6kgD3S27LACsWdH0OrDNoFwLY1uIRvVrwuayXIstQUD75/a5bSAMG0HDqSgM8bxwR5aret06nLFkB2T5RjM/PToY0CowKALJHfbatbs6ANiDwZuiDK6zTGQlfsOujoiUgUyGIzJcgxCPvuWth1WIFRg4E1v+tIJIAzaQRalcIbovnP2csWEHZPlGMxad/wJIEzagVe0dUsfEHfYUaDk4q9HHAOp1H7L1IjojB2+JRiErDnmlB0LKMKIaOyChU0bnbpcMWaHkgv5aIyWiiFqVyd2V+zwLSHPkMGAMGUHDiSz5TP27LAAsWsHDkQZvZOKITvZtmOqHRi+JRgEfnzY5cPcHgy8S1orWR8RHQEp6OR+7RBIcIV2DVsjIhU7fEsw8F95gFU78C7b/XdWJ3aZQzu4UIhyHf9JN1CheZ/Jid0RkIEwJuGvcg3EtLj+VtcWjLkNXVCkynCrHTiQ/I5ox0/ODlJoE9xpxyRLOVsvPAGEKTvCt5wekondCmRQGEou5HUuiHAIxH/Vnt/OrNLdZ2NitwVkIAyfYgzCNp1mx47GLojagg3VxG4TSEFn9N3q1oRfOQRCnCOVun1sTuyO7PApxiD406OMzSQDgWQ2rxnSEXFwO6J3IFQzXaGVDcWIaAuGTzEGvqUaiG7pYuQw7w8jvOESrOhcPGQTu+3LFZf6cxv9FdjkGVVaM9sTuz0gE4tUEFF3jnE7Ir86MvQj4gAY+Z1RvYVYNL2nQARVaHRsj4hWIIPBmFikgsB/H2XUDvJy9dmQTuwuX64eWaJewubE7siOiXjxd1sNl1waEfsDCas/D8Wq1KG1wzqT9DUa8pTRAtpAONI9Pw+u0J5j2w5fGzAmWDpjzTGXL1dWO4Rb69wzIj5ux2Gnvy/iV6b9M5sjoj07Jlg6sUQNnIaLjNhRqJIM/cT+GJBoyFdGpSBORyodNV2hOcjGxD4YkIkDYIyXkQ1YfcTlwzy9aY377VBGOR4THWW6XDsrUKHpcYcd4y1AxhWpIKz2LO2J3Qojou5bkKtFbpnY+9nRnY9GTUWYyLRSdSnTE7stIBMGwrB0UrkO5jdeoj+T1F+A93a97caJve+tLoPfX5dKRwWUazuZnNgp2yEjO7YQhan/OgScJuoTOz4iSpo/cvuIWKCMaWH8i59TFJi3f5n6ItMjIhU7xhaiRL0LUQhae5yyHXFft7l9Yi/o5B4rVka+gLCRiXJ0qn+5xsDExE7XjrEWIGNlKphR873DEZFTp4FStdi9I2Int0uqjBmPsJkphdhsv1K1kWk7JlKA4V2IwqsF+CsJxRaQ+XUakGNiN0/s0RcZO8QdZZL84BS/Muw8EyMiHTu8LUCIFqog+IuTT8CI/movyFVPwhhSO1DuiYKOuHHIUGZ8YYfX1FJ1J5N2TCiiBsPL0jH5Snht1SGY23AJIhougXjrRrfdp9sHo5PbyNqZ4TBS6ajJclXRVLm6x5URka4dXv2AjM5XwkQF9sOf2vJM7rqLnbSD213QyV3GymM06Ma3WBk6Ra7WMfZBUEYZxr3R+R0y5K+tvyo7nP1fpWqRrEwtvD/U9+nmK7l7pZ3R/sjwCjznU4y9+VoJdoZ1O/KVD0bnddb8t3TPE89eL8GSA+UqQX0pJuxle2IvUMYcKUS5qciwjlQ6yqcYzZ5UgmGT5epeVw5z7wEwxuR1msbko6sGAzEwJVpBgBwTrJNjgltM2lGAxvYUorHt+WiMcFhcnuhkXAHqO6FYtcKnGFP5FKm6nbHj1QLlJa8C1XqvPKUYWbqf9v/YrMDSfi3XCDJLsKTaEkxwxckR8a4Mjd0pU8a9W4glDf/nvVOJl3T/b8bLVNzxRaq/TShCV00owlrGy9COcTLVYbKodmwh+o13gfI/3oXKPK8CVebL+XunMP1zlCgFATKMLylSJeUVY7xNxSreziIVT12E8g7KVLz9MjRhlwyNr5cp4xSFyoSl+FN8KN8dMpKRjGQkIxkJ4r78Pwv259NnjlZFAAAAAElFTkSuQmCC", "" + import.meta.url).href, b.className = "mjr-mfv-ch-icon", b.alt = "", b.setAttribute("aria-hidden", "true"), y.appendChild(b), n.appendChild(y); let x = (e) => { if (!e || e === "rgb") y.replaceChildren(b); else { - let t = yn[e] || "#e0e0e0", n = xn[e] || "500", r = bn[e] || e.toUpperCase(), i = document.createElement("span"); + let t = Fn[e] || "#e0e0e0", n = Ln[e] || "500", r = In[e] || e.toUpperCase(), i = document.createElement("span"); i.className = "mjr-mfv-ch-label", i.style.color = t, i.style.fontWeight = n, i.textContent = r, y.replaceChildren(i); } }, S = document.createElement("div"); - S.className = "mjr-mfv-ch-popover", t.element.appendChild(S); + S.className = "mjr-mfv-ch-popover", e.element.appendChild(S); let C = document.createElement("div"); C.className = "mjr-menu", C.style.cssText = "display:grid;gap:4px;", S.appendChild(C); let w = document.createElement("select"); w.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", S.appendChild(w); - let ee = [ + let T = [ { value: "rgb", color: "#e0e0e0", @@ -2219,8 +2245,8 @@ function wn(t) { weight: "400", label: "L" } - ], T = []; - for (let e of ee) { + ], E = []; + for (let e of T) { let t = document.createElement("option"); t.value = e.value, w.appendChild(t); let n = document.createElement("button"); @@ -2230,40 +2256,40 @@ function wn(t) { let i = document.createElement("span"); i.textContent = e.label, i.style.color = e.color, i.style.fontWeight = e.weight, r.appendChild(i); let a = document.createElement("i"); - a.className = "pi pi-check mjr-menu-item-check", a.style.opacity = e.value === v ? "1" : "0", n.appendChild(r), n.appendChild(a), C.appendChild(n), T.push(n), e.value === v && n.classList.add("is-active"); + a.className = "pi pi-check mjr-menu-item-check", a.style.opacity = e.value === v ? "1" : "0", n.appendChild(r), n.appendChild(a), C.appendChild(n), E.push(n), e.value === v && n.classList.add("is-active"); } - w.value = v, x(v), y.classList.toggle("is-on", v !== "rgb"), t._channelSelect = w, t._chBtn = y, t._chPopover = S; - let te = () => { - let e = y.getBoundingClientRect(), n = t.element.getBoundingClientRect(); - S.style.left = `${e.left - n.left}px`, S.style.top = `${e.bottom - n.top + 4}px`, S.classList.add("is-open"), y.setAttribute("aria-expanded", "true"); + w.value = v, x(v), y.classList.toggle("is-on", v !== "rgb"), e._channelSelect = w, e._chBtn = y, e._chPopover = S; + let D = () => { + let t = y.getBoundingClientRect(), n = e.element.getBoundingClientRect(); + S.style.left = `${t.left - n.left}px`, S.style.top = `${t.bottom - n.top + 4}px`, S.classList.add("is-open"), y.setAttribute("aria-expanded", "true"); }; - t._closeChPopover = () => { + e._closeChPopover = () => { S.classList.remove("is-open"), y.setAttribute("aria-expanded", "false"); - }, y.addEventListener("click", (e) => { - e.stopPropagation(), S.classList.contains("is-open") ? t._closeChPopover() : (t._closeAllToolbarPopovers?.(), te()); - }), C.addEventListener("click", (e) => { - let n = e.target.closest(".mjr-menu-item"); + }, y.addEventListener("click", (t) => { + t.stopPropagation(), S.classList.contains("is-open") ? e._closeChPopover() : (e._closeAllToolbarPopovers?.(), D()); + }), C.addEventListener("click", (t) => { + let n = t.target.closest(".mjr-menu-item"); if (!n) return; let r = n.dataset.value; - w.value = r ?? "", w.dispatchEvent(new Event("change", { bubbles: !0 })), T.forEach((e) => { + w.value = r ?? "", w.dispatchEvent(new Event("change", { bubbles: !0 })), E.forEach((e) => { let t = e.dataset.value === r; e.classList.toggle("is-active", t), e.querySelector(".mjr-menu-item-check").style.opacity = t ? "1" : "0"; - }), x(r), y.classList.toggle("is-on", r !== "rgb"), t._closeChPopover(); - }), t._closeAllToolbarPopovers = () => { - t._closeChPopover?.(), t._closeGuidePopover?.(), t._closePinPopover?.(), t._closeFormatPopover?.(), t._closeGenDropdown?.(); - }, t._exposureCtl = n("Exposure (EV)", { + }), x(r), y.classList.toggle("is-on", r !== "rgb"), e._closeChPopover(); + }), e._closeAllToolbarPopovers = () => { + e._closeChPopover?.(), e._closeGuidePopover?.(), e._closePinPopover?.(), e._closeFormatPopover?.(), e._closeGenDropdown?.(); + }, e._exposureCtl = t("Exposure (EV)", { min: -10, max: 10, step: .1, - value: Number(t._exposureEV || 0) - }), t._exposureCtl.out.textContent = `${Number(t._exposureEV || 0).toFixed(1)}EV`, t._exposureCtl.out.title = "Click to reset to 0 EV", t._exposureCtl.out.style.cursor = "pointer", t._exposureCtl.wrap.classList.toggle("is-active", (t._exposureEV || 0) !== 0), r.appendChild(t._exposureCtl.wrap), t._formatToggle = document.createElement("button"), t._formatToggle.type = "button", t._formatToggle.className = "mjr-icon-btn mjr-mfv-format-trigger", t._formatToggle.setAttribute("aria-haspopup", "dialog"), t._formatToggle.setAttribute("aria-expanded", "false"), t._formatToggle.setAttribute("aria-pressed", "false"), t._formatToggle.title = "Format mask", t._formatToggle.innerHTML = "", r.appendChild(t._formatToggle); - let E = document.createElement("div"); - E.className = "mjr-mfv-format-popover", t.element.appendChild(E); + value: Number(e._exposureEV || 0) + }), e._exposureCtl.out.textContent = `${Number(e._exposureEV || 0).toFixed(1)}EV`, e._exposureCtl.out.title = "Click to reset to 0 EV", e._exposureCtl.out.style.cursor = "pointer", e._exposureCtl.wrap.classList.toggle("is-active", (e._exposureEV || 0) !== 0), n.appendChild(e._exposureCtl.wrap), e._formatToggle = document.createElement("button"), e._formatToggle.type = "button", e._formatToggle.className = "mjr-icon-btn mjr-mfv-format-trigger", e._formatToggle.setAttribute("aria-haspopup", "dialog"), e._formatToggle.setAttribute("aria-expanded", "false"), e._formatToggle.setAttribute("aria-pressed", "false"), e._formatToggle.title = "Format mask", e._formatToggle.innerHTML = "", n.appendChild(e._formatToggle); let O = document.createElement("div"); - O.className = "mjr-menu", O.style.cssText = "display:grid;gap:4px;", E.appendChild(O); - let k = document.createElement("select"); - k.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", E.appendChild(k); - let ne = [ + O.className = "mjr-mfv-format-popover", e.element.appendChild(O); + let k = document.createElement("div"); + k.className = "mjr-menu", k.style.cssText = "display:grid;gap:4px;", O.appendChild(k); + let A = document.createElement("select"); + A.style.cssText = "position:absolute;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;", O.appendChild(A); + let j = [ { value: "off", label: "Off" @@ -2292,73 +2318,73 @@ function wn(t) { value: "2.39", label: "2.39" } - ], A = [], j = t._overlayMaskEnabled ? String(t._overlayFormat || "image") : "off"; - for (let e of ne) { + ], M = [], N = e._overlayMaskEnabled ? String(e._overlayFormat || "image") : "off"; + for (let e of j) { let t = document.createElement("option"); - t.value = e.value, k.appendChild(t); + t.value = e.value, A.appendChild(t); let n = document.createElement("button"); n.type = "button", n.className = "mjr-menu-item", n.dataset.value = e.value; let r = document.createElement("span"); r.className = "mjr-menu-item-label", r.textContent = e.label; let i = document.createElement("i"); - i.className = "pi pi-check mjr-menu-item-check", i.style.opacity = e.value === j ? "1" : "0", n.appendChild(r), n.appendChild(i), O.appendChild(n), A.push(n), e.value === j && n.classList.add("is-active"); + i.className = "pi pi-check mjr-menu-item-check", i.style.opacity = e.value === N ? "1" : "0", n.appendChild(r), n.appendChild(i), k.appendChild(n), M.push(n), e.value === N && n.classList.add("is-active"); } - k.value = j; - let M = document.createElement("div"); - M.className = "mjr-mfv-format-sep", E.appendChild(M); - let N = document.createElement("div"); - N.className = "mjr-mfv-format-slider-row", E.appendChild(N); - let re = document.createElement("span"); - re.className = "mjr-mfv-format-slider-label", re.textContent = "Opacity", N.appendChild(re), t._maskOpacityCtl = n("Mask opacity", { + A.value = N; + let ee = document.createElement("div"); + ee.className = "mjr-mfv-format-sep", O.appendChild(ee); + let P = document.createElement("div"); + P.className = "mjr-mfv-format-slider-row", O.appendChild(P); + let F = document.createElement("span"); + F.className = "mjr-mfv-format-slider-label", F.textContent = "Opacity", P.appendChild(F), e._maskOpacityCtl = t("Mask opacity", { min: 0, max: .9, step: .01, - value: Number(t._overlayMaskOpacity ?? .65) - }), N.appendChild(t._maskOpacityCtl.input), N.appendChild(t._maskOpacityCtl.out), t._formatSelect = k, t._formatPopover = E; - let ie = () => { - let e = t._formatToggle.getBoundingClientRect(), n = t.element.getBoundingClientRect(); - E.style.left = `${e.left - n.left}px`, E.style.top = `${e.bottom - n.top + 4}px`, E.classList.add("is-open"), t._formatToggle.setAttribute("aria-expanded", "true"); + value: Number(e._overlayMaskOpacity ?? .65) + }), P.appendChild(e._maskOpacityCtl.input), P.appendChild(e._maskOpacityCtl.out), e._formatSelect = A, e._formatPopover = O; + let te = () => { + let t = e._formatToggle.getBoundingClientRect(), n = e.element.getBoundingClientRect(); + O.style.left = `${t.left - n.left}px`, O.style.top = `${t.bottom - n.top + 4}px`, O.classList.add("is-open"), e._formatToggle.setAttribute("aria-expanded", "true"); }; - t._closeFormatPopover = () => { - E.classList.remove("is-open"), t._formatToggle.setAttribute("aria-expanded", "false"); - }, t._formatToggle.addEventListener("click", (e) => { - e.stopPropagation(), E.classList.contains("is-open") ? t._closeFormatPopover() : (t._closeAllToolbarPopovers?.(), ie()); - }), O.addEventListener("click", (e) => { - let n = e.target.closest(".mjr-menu-item"); + e._closeFormatPopover = () => { + O.classList.remove("is-open"), e._formatToggle.setAttribute("aria-expanded", "false"); + }, e._formatToggle.addEventListener("click", (t) => { + t.stopPropagation(), O.classList.contains("is-open") ? e._closeFormatPopover() : (e._closeAllToolbarPopovers?.(), te()); + }), k.addEventListener("click", (t) => { + let n = t.target.closest(".mjr-menu-item"); if (!n) return; let r = n.dataset.value; - k.value = r ?? "", k.dispatchEvent(new Event("change", { bubbles: !0 })), A.forEach((e) => { + A.value = r ?? "", A.dispatchEvent(new Event("change", { bubbles: !0 })), M.forEach((e) => { let t = e.dataset.value === r; e.classList.toggle("is-active", t), e.querySelector(".mjr-menu-item-check").style.opacity = t ? "1" : "0"; - }), t._closeFormatPopover(); + }), e._closeFormatPopover(); }); - let ae = document.createElement("div"); - ae.className = "mjr-mfv-toolbar-sep", ae.setAttribute("aria-hidden", "true"), r.appendChild(ae), t._liveBtn = document.createElement("button"), t._liveBtn.type = "button", t._liveBtn.className = "mjr-icon-btn", t._liveBtn.innerHTML = "", t._liveBtn.setAttribute("aria-pressed", "false"), D(t._liveBtn, e("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), "L"), r.appendChild(t._liveBtn), t._previewBtn = document.createElement("button"), t._previewBtn.type = "button", t._previewBtn.className = "mjr-icon-btn", t._previewBtn.innerHTML = "", t._previewBtn.setAttribute("aria-pressed", "false"), D(t._previewBtn, e("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), "K"), r.appendChild(t._previewBtn), t._nodeStreamBtn = document.createElement("button"), t._nodeStreamBtn.type = "button", t._nodeStreamBtn.className = "mjr-icon-btn", t._nodeStreamBtn.innerHTML = "", t._nodeStreamBtn.setAttribute("aria-pressed", "false"), D(t._nodeStreamBtn, e("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), "N"), r.appendChild(t._nodeStreamBtn), t._genBtn = document.createElement("button"), t._genBtn.type = "button", t._genBtn.className = "mjr-icon-btn", t._genBtn.setAttribute("aria-pressed", String(!!t._genSidebarEnabled)); - let P = document.createElement("i"); - P.className = "pi pi-info-circle", P.setAttribute("aria-hidden", "true"), t._genBtn.appendChild(P), r.appendChild(t._genBtn), t._updateGenBtnUI(), t._popoutBtn = document.createElement("button"), t._popoutBtn.type = "button", t._popoutBtn.className = "mjr-icon-btn"; - let oe = e("tooltip.popOutViewer", "Pop out viewer to separate window"); - t._popoutBtn.title = oe, t._popoutBtn.setAttribute("aria-label", oe), t._popoutBtn.setAttribute("aria-pressed", "false"); - let se = document.createElement("i"); - se.className = "pi pi-external-link", se.setAttribute("aria-hidden", "true"), t._popoutBtn.appendChild(se), r.appendChild(t._popoutBtn), t._captureBtn = document.createElement("button"), t._captureBtn.type = "button", t._captureBtn.className = "mjr-icon-btn"; - let F = e("tooltip.captureView", "Save view as image"); - t._captureBtn.title = F, t._captureBtn.setAttribute("aria-label", F); - let L = document.createElement("i"); - L.className = "pi pi-download", L.setAttribute("aria-hidden", "true"), t._captureBtn.appendChild(L), r.appendChild(t._captureBtn); - let R = document.createElement("div"); - R.className = "mjr-mfv-toolbar-sep", R.style.marginLeft = "auto", R.setAttribute("aria-hidden", "true"), r.appendChild(R), t._settingsBtn = document.createElement("button"), t._settingsBtn.type = "button", t._settingsBtn.className = "mjr-icon-btn mjr-mfv-settings-btn"; - let z = e("tooltip.nodeParams", "Node Parameters"); - t._settingsBtn.title = z, t._settingsBtn.setAttribute("aria-label", z), t._settingsBtn.setAttribute("aria-pressed", "false"); - let B = document.createElement("i"); - B.className = "pi pi-sliders-h", B.setAttribute("aria-hidden", "true"), t._settingsBtn.appendChild(B), r.appendChild(t._settingsBtn), t._runHandle = rn(), r.appendChild(t._runHandle.el), t._majoorSettingsBtn = document.createElement("button"), t._majoorSettingsBtn.type = "button", t._majoorSettingsBtn.className = "mjr-icon-btn mjr-mfv-majoor-settings-btn"; - let ce = e("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings"); - t._majoorSettingsBtn.title = ce, t._majoorSettingsBtn.setAttribute("aria-label", ce); + let re = document.createElement("div"); + re.className = "mjr-mfv-toolbar-sep", re.setAttribute("aria-hidden", "true"), n.appendChild(re), e._liveBtn = document.createElement("button"), e._liveBtn.type = "button", e._liveBtn.className = "mjr-icon-btn", e._liveBtn.innerHTML = "", e._liveBtn.setAttribute("aria-pressed", "false"), ne(e._liveBtn, p("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), "L"), n.appendChild(e._liveBtn), e._previewBtn = document.createElement("button"), e._previewBtn.type = "button", e._previewBtn.className = "mjr-icon-btn", e._previewBtn.innerHTML = "", e._previewBtn.setAttribute("aria-pressed", "false"), ne(e._previewBtn, p("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), "K"), n.appendChild(e._previewBtn), e._nodeStreamBtn = document.createElement("button"), e._nodeStreamBtn.type = "button", e._nodeStreamBtn.className = "mjr-icon-btn", e._nodeStreamBtn.innerHTML = "", e._nodeStreamBtn.setAttribute("aria-pressed", "false"), ne(e._nodeStreamBtn, p("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), "N"), n.appendChild(e._nodeStreamBtn), e._genBtn = document.createElement("button"), e._genBtn.type = "button", e._genBtn.className = "mjr-icon-btn", e._genBtn.setAttribute("aria-pressed", String(!!e._genSidebarEnabled)); + let ie = document.createElement("i"); + ie.className = "pi pi-info-circle", ie.setAttribute("aria-hidden", "true"), e._genBtn.appendChild(ie), n.appendChild(e._genBtn), e._updateGenBtnUI(), e._popoutBtn = document.createElement("button"), e._popoutBtn.type = "button", e._popoutBtn.className = "mjr-icon-btn"; + let ae = p("tooltip.popOutViewer", "Pop out viewer to separate window"); + e._popoutBtn.title = ae, e._popoutBtn.setAttribute("aria-label", ae), e._popoutBtn.setAttribute("aria-pressed", "false"); + let oe = document.createElement("i"); + oe.className = "pi pi-external-link", oe.setAttribute("aria-hidden", "true"), e._popoutBtn.appendChild(oe), n.appendChild(e._popoutBtn), e._captureBtn = document.createElement("button"), e._captureBtn.type = "button", e._captureBtn.className = "mjr-icon-btn"; + let se = p("tooltip.captureView", "Save view as image"); + e._captureBtn.title = se, e._captureBtn.setAttribute("aria-label", se); + let I = document.createElement("i"); + I.className = "pi pi-download", I.setAttribute("aria-hidden", "true"), e._captureBtn.appendChild(I), n.appendChild(e._captureBtn); + let L = document.createElement("div"); + L.className = "mjr-mfv-toolbar-sep", L.style.marginLeft = "auto", L.setAttribute("aria-hidden", "true"), n.appendChild(L), e._settingsBtn = document.createElement("button"), e._settingsBtn.type = "button", e._settingsBtn.className = "mjr-icon-btn mjr-mfv-settings-btn"; + let ce = p("tooltip.nodeParams", "Node Parameters"); + e._settingsBtn.title = ce, e._settingsBtn.setAttribute("aria-label", ce), e._settingsBtn.setAttribute("aria-pressed", "false"); let le = document.createElement("i"); - return le.className = "pi pi-cog", le.setAttribute("aria-hidden", "true"), t._majoorSettingsBtn.appendChild(le), r.appendChild(t._majoorSettingsBtn), t._handleDocClick = (e) => { - let n = e?.target; - t._chPopover?.classList?.contains("is-open") && !t._chBtn?.contains?.(n) && !t._chPopover.contains(n) && t._closeChPopover?.(), t._guidePopover?.classList?.contains("is-open") && !t._guideBtn?.contains?.(n) && !t._guidePopover.contains(n) && t._closeGuidePopover?.(), t._pinPopover?.classList?.contains("is-open") && !t._pinBtn?.contains?.(n) && !t._pinPopover.contains(n) && t._closePinPopover?.(), t._formatPopover?.classList?.contains("is-open") && !t._formatToggle?.contains?.(n) && !t._formatPopover.contains(n) && t._closeFormatPopover?.(), n?.closest?.(".mjr-mfv-idrop") || t.element?.querySelectorAll?.(".mjr-mfv-idrop-menu.is-open").forEach((e) => e.classList.remove("is-open")); - }, t._bindDocumentUiHandlers(), r; + le.className = "pi pi-sliders-h", le.setAttribute("aria-hidden", "true"), e._settingsBtn.appendChild(le), n.appendChild(e._settingsBtn), e._runHandle = Tn(), n.appendChild(e._runHandle.el), e._majoorSettingsBtn = document.createElement("button"), e._majoorSettingsBtn.type = "button", e._majoorSettingsBtn.className = "mjr-icon-btn mjr-mfv-majoor-settings-btn"; + let ue = p("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings"); + e._majoorSettingsBtn.title = ue, e._majoorSettingsBtn.setAttribute("aria-label", ue); + let R = document.createElement("i"); + return R.className = "pi pi-cog", R.setAttribute("aria-hidden", "true"), e._majoorSettingsBtn.appendChild(R), n.appendChild(e._majoorSettingsBtn), e._handleDocClick = (t) => { + let n = t?.target; + e._chPopover?.classList?.contains("is-open") && !e._chBtn?.contains?.(n) && !e._chPopover.contains(n) && e._closeChPopover?.(), e._guidePopover?.classList?.contains("is-open") && !e._guideBtn?.contains?.(n) && !e._guidePopover.contains(n) && e._closeGuidePopover?.(), e._pinPopover?.classList?.contains("is-open") && !e._pinBtn?.contains?.(n) && !e._pinPopover.contains(n) && e._closePinPopover?.(), e._formatPopover?.classList?.contains("is-open") && !e._formatToggle?.contains?.(n) && !e._formatPopover.contains(n) && e._closeFormatPopover?.(), n?.closest?.(".mjr-mfv-idrop") || e.element?.querySelectorAll?.(".mjr-mfv-idrop-menu.is-open").forEach((e) => e.classList.remove("is-open")); + }, e._bindDocumentUiHandlers(), n; } -function Tn(e) { +function Vn(e) { try { e._btnAC?.abort(); } catch (e) { @@ -2367,7 +2393,7 @@ function Tn(e) { e._btnAC = new AbortController(); let t = e._btnAC.signal; e._closeBtn?.addEventListener("click", () => { - e._dispatchControllerAction("close", v.MFV_CLOSE); + e._dispatchControllerAction("close", j.MFV_CLOSE); }, { signal: t }), e._modeSelect?.addEventListener("change", () => { let t = e._modeSelect?.value; t && e.setMode(t); @@ -2375,21 +2401,21 @@ function Tn(e) { let n = t.target?.closest?.(".mjr-mfv-pin-btn"); if (!n) return; let r = n.dataset.slot; - r && (e._pinnedSlots.has(r) ? e._pinnedSlots.delete(r) : e._pinnedSlots.add(r), e._pinnedSlots.has("C") || e._pinnedSlots.has("D") ? e._mode !== I.GRID && e.setMode(I.GRID) : e._pinnedSlots.size > 0 && e._mode === I.SIMPLE && e.setMode(I.AB), e._updatePinUI()); + r && (e._pinnedSlots.has(r) ? e._pinnedSlots.delete(r) : e._pinnedSlots.add(r), e._pinnedSlots.has("C") || e._pinnedSlots.has("D") ? e._mode !== z.GRID && e.setMode(z.GRID) : e._pinnedSlots.size > 0 && e._mode === z.SIMPLE && e.setMode(z.AB), e._updatePinUI()); }, { signal: t }), e._liveBtn?.addEventListener("click", () => { - e._dispatchControllerAction("toggleLive", v.MFV_LIVE_TOGGLE); + e._dispatchControllerAction("toggleLive", j.MFV_LIVE_TOGGLE); }, { signal: t }), e._previewBtn?.addEventListener("click", () => { - e._dispatchControllerAction("togglePreview", v.MFV_PREVIEW_TOGGLE); + e._dispatchControllerAction("togglePreview", j.MFV_PREVIEW_TOGGLE); }, { signal: t }), e._nodeStreamBtn?.addEventListener("click", () => { - e._dispatchControllerAction("toggleNodeStream", v.MFV_NODESTREAM_TOGGLE); + e._dispatchControllerAction("toggleNodeStream", j.MFV_NODESTREAM_TOGGLE); }, { signal: t }), e._genBtn?.addEventListener("click", (t) => { t.stopPropagation(), e._closeAllToolbarPopovers?.(), e._genSidebarEnabled = !e._genSidebarEnabled, e._updateGenBtnUI(), e._refresh(); }, { signal: t }), e._popoutBtn?.addEventListener("click", () => { - e._dispatchControllerAction("popOut", v.MFV_POPOUT); + e._dispatchControllerAction("popOut", j.MFV_POPOUT); }, { signal: t }), e._captureBtn?.addEventListener("click", () => e._captureView(), { signal: t }), e._settingsBtn?.addEventListener("click", () => { e._sidebar?.toggle(), e._updateSettingsBtnState(e._sidebar?.isVisible ?? !1); }, { signal: t }), e._majoorSettingsBtn?.addEventListener("click", (t) => { - t.stopPropagation(), e._closeAllToolbarPopovers?.(), A(); + t.stopPropagation(), e._closeAllToolbarPopovers?.(), oe(); }, { signal: t }), e._guidesSelect?.addEventListener("change", () => { e._gridMode = Number(e._guidesSelect.value) || 0, e._guideBtn?.classList.toggle("is-on", e._gridMode !== 0), e._redrawOverlayGuides?.(); }, { signal: t }), e._channelSelect?.addEventListener("change", () => { @@ -2407,15 +2433,15 @@ function Tn(e) { e._overlayMaskOpacity = Math.round(Math.max(0, Math.min(.9, Number.isFinite(t) ? t : .65)) * 100) / 100, e._maskOpacityCtl.out.textContent = e._overlayMaskOpacity.toFixed(2), e._redrawOverlayGuides?.(); }, { signal: t }); } -function En(e, t) { +function Hn(e, t) { e._settingsBtn && (e._settingsBtn.classList.toggle("active", !!t), e._settingsBtn.setAttribute("aria-pressed", String(!!t))); } -function Dn(e) { +function Un(e) { if (!e._contentWrapper) return; - let t = l.MFV_SIDEBAR_POSITION || "right"; + let t = _.MFV_SIDEBAR_POSITION || "right"; e._contentWrapper.setAttribute("data-sidebar-pos", t), e._sidebar?.el && e._contentEl && (t === "left" ? e._contentWrapper.insertBefore(e._sidebar.el, e._contentEl) : e._contentWrapper.appendChild(e._sidebar.el)); } -function On(e) { +function Wn(e) { if (!e._handleDocClick) return; let t = e.element?.ownerDocument || document; if (e._docClickHost !== t) { @@ -2428,7 +2454,7 @@ function On(e) { e._docAC = new AbortController(), t.addEventListener("click", e._handleDocClick, { signal: e._docAC.signal }), e._docClickHost = t; } } -function kn(e) { +function Gn(e) { try { e._docAC?.abort(); } catch (e) { @@ -2436,18 +2462,18 @@ function kn(e) { } e._docAC = new AbortController(), e._docClickHost = null; } -function An(e) { +function Kn(e) { if (!e._genBtn) return; let t = !!e._genSidebarEnabled; e._genBtn.classList.toggle("is-on", t), e._genBtn.classList.toggle("is-open", t); let n = t ? "Gen Info sidebar: ON" : "Gen Info sidebar: OFF"; e._genBtn.title = n, e._genBtn.setAttribute("aria-label", n), e._genBtn.setAttribute("aria-pressed", String(t)), e._genBtn.removeAttribute("aria-expanded"), e._genBtn.removeAttribute("aria-haspopup"), e._genBtn.removeAttribute("aria-controls"); } -function jn(e) { +function qn(e) { let t = Number(e); return !Number.isFinite(t) || t <= 0 ? "" : t >= 60 ? `${(t / 60).toFixed(1)}m` : `${t.toFixed(1)}s`; } -function Mn(e) { +function Jn(e) { let t = String(e || "").trim().toLowerCase(); if (!t) return 0; if (t.endsWith("m")) { @@ -2461,10 +2487,10 @@ function Mn(e) { let n = Number.parseFloat(t); return Number.isFinite(n) ? n : 0; } -function Nn(e, t) { +function Yn(e, t) { if (!t) return {}; try { - let e = t.geninfo ? { geninfo: t.geninfo } : t.metadata || t.metadata_raw || t, n = ae(e) || null, r = { + let e = t.geninfo ? { geninfo: t.geninfo } : t.metadata || t.metadata_raw || t, n = ue(e) || null, r = { prompt: "", seed: "", model: "", @@ -2476,17 +2502,17 @@ function Nn(e, t) { genTime: "" }; if (n && typeof n == "object") { - n.prompt && (r.prompt = P(String(n.prompt))), n.seed != null && (r.seed = String(n.seed)), n.model && (r.model = Array.isArray(n.model) ? n.model.join(", ") : String(n.model)); - let i = _n(n), a = gn(n); - a && (r.model = a), i && (r.model = [i, r.model].filter(Boolean).join(" | ")), Array.isArray(n.loras) && (r.lora = n.loras.map((e) => typeof e == "string" ? e : e?.name || e?.lora_name || e?.model_name || "").filter(Boolean).join(", ")), n.sampler && (r.sampler = String(n.sampler)), n.scheduler && (r.scheduler = String(n.scheduler)), n.cfg != null && (r.cfg = String(n.cfg)), n.steps != null && (r.step = String(n.steps)), !r.prompt && e?.prompt && (r.prompt = P(String(e.prompt || ""))); + n.prompt && (r.prompt = R(String(n.prompt))), n.seed != null && (r.seed = String(n.seed)), n.model && (r.model = Array.isArray(n.model) ? n.model.join(", ") : String(n.model)); + let i = Nn(n), a = Mn(n); + a && (r.model = a), i && (r.model = [i, r.model].filter(Boolean).join(" | ")), Array.isArray(n.loras) && (r.lora = n.loras.map((e) => typeof e == "string" ? e : e?.name || e?.lora_name || e?.model_name || "").filter(Boolean).join(", ")), n.sampler && (r.sampler = String(n.sampler)), n.scheduler && (r.scheduler = String(n.scheduler)), n.cfg != null && (r.cfg = String(n.cfg)), n.steps != null && (r.step = String(n.steps)), !r.prompt && e?.prompt && (r.prompt = R(String(e.prompt || ""))); let o = t.generation_time_ms ?? t.metadata_raw?.generation_time_ms ?? e?.generation_time_ms ?? e?.geninfo?.generation_time_ms ?? 0; - return o && Number.isFinite(Number(o)) && o > 0 && o < 864e5 && (r.genTime = jn(Number(o) / 1e3)), r; + return o && Number.isFinite(Number(o)) && o > 0 && o < 864e5 && (r.genTime = qn(Number(o) / 1e3)), r; } } catch (e) { console.debug?.("[MFV] geninfo normalize failed", e); } let n = t?.metadata || t?.metadata_raw || t || {}, r = { - prompt: P(String(n?.prompt || n?.positive || "")), + prompt: R(String(n?.prompt || n?.positive || "")), seed: n?.seed == null ? "" : String(n.seed), model: n?.checkpoint || n?.ckpt_name || n?.model || "", lora: Array.isArray(n?.loras) ? n.loras.join(", ") : n?.lora || "", @@ -2496,9 +2522,9 @@ function Nn(e, t) { step: n?.steps == null ? "" : String(n.steps), genTime: "" }, i = t.generation_time_ms ?? t.metadata_raw?.generation_time_ms ?? n?.generation_time_ms ?? 0; - return i && Number.isFinite(Number(i)) && i > 0 && i < 864e5 && (r.genTime = jn(Number(i) / 1e3)), r; + return i && Number.isFinite(Number(i)) && i > 0 && i < 864e5 && (r.genTime = qn(Number(i) / 1e3)), r; } -function Pn(e, t) { +function Xn(e, t) { let n = e._getGenFields(t); if (!n) return null; let r = document.createDocumentFragment(); @@ -2523,7 +2549,7 @@ function Pn(e, t) { let s = document.createElement("strong"); if (s.textContent = `${a}: `, o.appendChild(s), t === "prompt") o.appendChild(document.createTextNode(i)); else if (t === "genTime") { - let e = Mn(i), t = "#4CAF50"; + let e = Jn(i), t = "#4CAF50"; e >= 60 ? t = "#FF9800" : e >= 30 ? t = "#FFC107" : e >= 10 && (t = "#8BC34A"); let n = document.createElement("span"); n.style.color = t, n.style.fontWeight = "600", n.textContent = i, o.appendChild(n); @@ -2534,30 +2560,30 @@ function Pn(e, t) { } //#endregion //#region ui/features/viewer/floatingViewerMode.ts -function Fn(e) { +function Zn(e) { try { e._controller?.onModeChanged?.(e._mode); } catch (e) { console.debug?.(e); } } -function In(e) { +function Qn(e) { let t = [ - I.SIMPLE, - I.AB, - I.SIDE, - I.GRID, - I.GRAPH + z.SIMPLE, + z.AB, + z.SIDE, + z.GRID, + z.GRAPH ]; e._mode = t[(t.indexOf(e._mode) + 1) % t.length], e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged(); } -function Ln(e, t) { - Object.values(I).includes(t) && (e._mode = t, e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged()); +function $n(e, t) { + Object.values(z).includes(t) && (e._mode = t, e._updateModeBtnUI(), e._refresh(), e._notifyModeChanged()); } -function Rn(e) { +function er(e) { return e._pinnedSlots; } -function zn(e) { +function tr(e) { if (e._pinBtns) { for (let t of [ "A", @@ -2573,50 +2599,50 @@ function zn(e) { e._pinBtn?.classList.toggle("is-on", (e._pinnedSlots?.size ?? 0) > 0); } } -function Bn(e) { +function nr(e) { if (!e._modeBtn) return; let { icon: t = "pi-image", label: n = "" } = { - [I.SIMPLE]: { + [z.SIMPLE]: { icon: "pi-image", label: "Mode: Simple - click to switch" }, - [I.AB]: { + [z.AB]: { icon: "pi-clone", label: "Mode: A/B Compare - click to switch" }, - [I.SIDE]: { + [z.SIDE]: { icon: "pi-table", label: "Mode: Side-by-Side - click to switch" }, - [I.GRID]: { + [z.GRID]: { icon: "pi-th-large", label: "Mode: Grid Compare (up to 4) - click to switch" }, - [I.GRAPH]: { + [z.GRAPH]: { icon: "pi-sitemap", label: "Mode: Graph Map - click to switch" } - }[e._mode] || {}, r = w(n, "C"), i = document.createElement("i"); - i.className = `pi ${t}`, i.setAttribute("aria-hidden", "true"), e._modeBtn.replaceChildren(i), e._modeBtn.title = r, e._modeBtn.setAttribute("aria-label", r), e._modeBtn.removeAttribute("aria-pressed"), e._modeBtn.classList.toggle("is-on", e._mode !== I.SIMPLE), e._modeDrop?.selectItem?.(e._mode); + }[e._mode] || {}, r = N(n, "C"), i = document.createElement("i"); + i.className = `pi ${t}`, i.setAttribute("aria-hidden", "true"), e._modeBtn.replaceChildren(i), e._modeBtn.title = r, e._modeBtn.setAttribute("aria-label", r), e._modeBtn.removeAttribute("aria-pressed"), e._modeBtn.classList.toggle("is-on", e._mode !== z.SIMPLE), e._modeDrop?.selectItem?.(e._mode); } -function Vn(t, n) { - if (!t._liveBtn) return; - let r = !!n; - t._liveBtn.classList.toggle("mjr-live-active", r); - let i = w(r ? e("tooltip.liveStreamOn", "Live Stream: ON - follows final generation outputs after execution") : e("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), "L"); - t._liveBtn.setAttribute("aria-pressed", String(r)), t._liveBtn.setAttribute("aria-label", i); - let a = document.createElement("i"); - a.className = r ? "pi pi-circle-fill" : "pi pi-circle", a.setAttribute("aria-hidden", "true"), t._liveBtn.replaceChildren(a), t._liveBtn.title = i; -} -function Hn(t, n) { - if (t._previewActive = !!n, !t._previewBtn) return; - t._previewBtn.classList.toggle("mjr-preview-active", t._previewActive); - let r = w(t._previewActive ? e("tooltip.previewStreamOn", "KSampler Preview: ON - streams sampler denoising frames during execution") : e("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), "K"); - t._previewBtn.setAttribute("aria-pressed", String(t._previewActive)), t._previewBtn.setAttribute("aria-label", r); +function rr(e, t) { + if (!e._liveBtn) return; + let n = !!t; + e._liveBtn.classList.toggle("mjr-live-active", n); + let r = N(n ? p("tooltip.liveStreamOn", "Live Stream: ON - follows final generation outputs after execution") : p("tooltip.liveStreamOff", "Live Stream: OFF - click to follow final generation outputs"), "L"); + e._liveBtn.setAttribute("aria-pressed", String(n)), e._liveBtn.setAttribute("aria-label", r); let i = document.createElement("i"); - i.className = t._previewActive ? "pi pi-eye" : "pi pi-eye-slash", i.setAttribute("aria-hidden", "true"), t._previewBtn.replaceChildren(i), t._previewBtn.title = r, t._previewActive || t._revokePreviewBlob(); + i.className = n ? "pi pi-circle-fill" : "pi pi-circle", i.setAttribute("aria-hidden", "true"), e._liveBtn.replaceChildren(i), e._liveBtn.title = r; } -function Un(e, t, n = {}) { +function ir(e, t) { + if (e._previewActive = !!t, !e._previewBtn) return; + e._previewBtn.classList.toggle("mjr-preview-active", e._previewActive); + let n = N(e._previewActive ? p("tooltip.previewStreamOn", "KSampler Preview: ON - streams sampler denoising frames during execution") : p("tooltip.previewStreamOff", "KSampler Preview: OFF - click to stream sampler denoising frames"), "K"); + e._previewBtn.setAttribute("aria-pressed", String(e._previewActive)), e._previewBtn.setAttribute("aria-label", n); + let r = document.createElement("i"); + r.className = e._previewActive ? "pi pi-eye" : "pi pi-eye-slash", r.setAttribute("aria-hidden", "true"), e._previewBtn.replaceChildren(r), e._previewBtn.title = n, e._previewActive || e._revokePreviewBlob(); +} +function ar(e, t, n = {}) { if (!t || !(t instanceof Blob)) return; e._revokePreviewBlob(); let r = URL.createObjectURL(t); @@ -2628,9 +2654,9 @@ function Un(e, t, n = {}) { _isPreview: !0, _sourceLabel: n?.sourceLabel || null }; - if (e._mode === I.AB || e._mode === I.SIDE || e._mode === I.GRID) { + if (e._mode === z.AB || e._mode === z.SIDE || e._mode === z.GRID) { let t = e.getPinnedSlots(); - if (e._mode === I.GRID) { + if (e._mode === z.GRID) { let n = [ "A", "B", @@ -2639,10 +2665,10 @@ function Un(e, t, n = {}) { ].find((e) => !t.has(e)) || "A"; e[`_media${n}`] = i; } else t.has("B") ? e._mediaA = i : e._mediaB = i; - } else e._mediaA = i, e._resetMfvZoom(), e._mode !== I.SIMPLE && (e._mode = I.SIMPLE, e._updateModeBtnUI()); + } else e._mediaA = i, e._resetMfvZoom(), e._mode !== z.SIMPLE && (e._mode = z.SIMPLE, e._updateModeBtnUI()); ++e._refreshGen, e._refresh(); } -function Wn(e) { +function or(e) { if (e._previewBlobUrl) { try { URL.revokeObjectURL(e._previewBlobUrl); @@ -2650,18 +2676,18 @@ function Wn(e) { e._previewBlobUrl = null; } } -function Gn(t, n) { - if (t._nodeStreamActive = !!n, t._nodeStreamActive || t.setNodeStreamSelection?.(null), !t._nodeStreamBtn) return; - t._nodeStreamBtn.classList.toggle("mjr-nodestream-active", t._nodeStreamActive); - let r = w(t._nodeStreamActive ? e("tooltip.nodeStreamOn", "Node Stream: ON - follows the selected node preview when frontend media exists") : e("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), "N"); - t._nodeStreamBtn.setAttribute("aria-pressed", String(t._nodeStreamActive)), t._nodeStreamBtn.setAttribute("aria-label", r); - let i = document.createElement("i"); - i.className = "pi pi-sitemap", i.setAttribute("aria-hidden", "true"), t._nodeStreamBtn.replaceChildren(i), t._nodeStreamBtn.title = r; +function sr(e, t) { + if (e._nodeStreamActive = !!t, e._nodeStreamActive || e.setNodeStreamSelection?.(null), !e._nodeStreamBtn) return; + e._nodeStreamBtn.classList.toggle("mjr-nodestream-active", e._nodeStreamActive); + let n = N(e._nodeStreamActive ? p("tooltip.nodeStreamOn", "Node Stream: ON - follows the selected node preview when frontend media exists") : p("tooltip.nodeStreamOff", "Node Stream: OFF - click to follow selected node previews, including ImageOps live canvases"), "N"); + e._nodeStreamBtn.setAttribute("aria-pressed", String(e._nodeStreamActive)), e._nodeStreamBtn.setAttribute("aria-label", n); + let r = document.createElement("i"); + r.className = "pi pi-sitemap", r.setAttribute("aria-hidden", "true"), e._nodeStreamBtn.replaceChildren(r), e._nodeStreamBtn.title = n; } //#endregion //#region ui/features/viewer/floatingViewerPopout.ts -var Kn = /* @__PURE__ */ "--border-color.--border-default.--button-hover-surface.--button-surface.--comfy-accent.--comfy-font.--comfy-input-bg.--comfy-menu-bg.--comfy-menu-secondary-bg.--comfy-status-error.--comfy-status-success.--comfy-status-warning.--content-bg.--content-fg.--descrip-text.--destructive-background.--font-inter.--input-text.--interface-menu-surface.--interface-panel-hover-surface.--interface-panel-selected-surface.--interface-panel-surface.--modal-card-background.--muted-foreground.--primary-background.--primary-background-hover.--radius-lg.--radius-md.--radius-sm.--success-background.--warning-background".split("."); -function qn() { +var cr = /* @__PURE__ */ "--border-color.--border-default.--button-hover-surface.--button-surface.--comfy-accent.--comfy-font.--comfy-input-bg.--comfy-menu-bg.--comfy-menu-secondary-bg.--comfy-status-error.--comfy-status-success.--comfy-status-warning.--content-bg.--content-fg.--descrip-text.--destructive-background.--font-inter.--input-text.--interface-menu-surface.--interface-panel-hover-surface.--interface-panel-selected-surface.--interface-panel-surface.--modal-card-background.--muted-foreground.--primary-background.--primary-background-hover.--radius-lg.--radius-md.--radius-sm.--success-background.--warning-background".split("."); +function lr() { try { let e = typeof window < "u" ? window : globalThis, t = e?.process?.versions?.electron; if (typeof t == "string" && t.trim() || e?.electron || e?.ipcRenderer || e?.electronAPI) return !0; @@ -2672,7 +2698,7 @@ function qn() { } return !1; } -function Q(e, t = null, n = "info") { +function Z(e, t = null, n = "info") { let r = { stage: String(e || "unknown"), detail: t, @@ -2690,10 +2716,10 @@ function Q(e, t = null, n = "info") { console.debug?.(e); } } -function Jn(e, ...t) { +function ur(e, ...t) { return Array.from(new Set([String(e || ""), ...t].join(" ").split(/\s+/).filter(Boolean))).join(" "); } -function Yn(e, t) { +function dr(e, t) { if (!(!e || !t)) for (let n of Array.from(e.attributes || [])) { let e = String(n?.name || ""); if (!(!e || e === "class" || e === "style")) try { @@ -2703,7 +2729,7 @@ function Yn(e, t) { } } } -function Xn(e, t) { +function fr(e, t) { if (!e || !t?.style) return; let n = typeof window < "u" && window?.getComputedStyle || globalThis?.getComputedStyle; if (typeof n != "function") return; @@ -2714,7 +2740,7 @@ function Xn(e, t) { console.debug?.(e); } if (r) { - for (let e of Kn) try { + for (let e of cr) try { let n = String(r.getPropertyValue?.(e) || "").trim(); n && t.style.setProperty(e, n); } catch (e) { @@ -2728,12 +2754,12 @@ function Xn(e, t) { } } } -function Zn(e) { +function pr(e) { if (!e?.documentElement || !e?.body || !document?.documentElement) return; let t = document.documentElement, n = document.body, r = e.documentElement, i = e.body; - r.className = Jn(t.className, "mjr-mfv-popout-document"), i.className = Jn(n?.className, "mjr-mfv-popout-body"), Yn(t, r), Yn(n, i), Xn(t, r), Xn(n, i), t?.lang && (r.lang = t.lang), t?.dir && (r.dir = t.dir); + r.className = ur(t.className, "mjr-mfv-popout-document"), i.className = ur(n?.className, "mjr-mfv-popout-body"), dr(t, r), dr(n, i), fr(t, r), fr(n, i), t?.lang && (r.lang = t.lang), t?.dir && (r.dir = t.dir); } -function Qn(e) { +function mr(e) { if (!e?.body) return null; try { (e.getElementById?.("mjr-mfv-popout-root"))?.remove?.(); @@ -2743,10 +2769,10 @@ function Qn(e) { let t = e.createElement("div"); return t.id = "mjr-mfv-popout-root", t.className = "mjr-mfv-popout-root", e.body.appendChild(t), t; } -function $(e) { +function Q(e) { e._resetGenDropdownForCurrentDocument(), e._rebindControlHandlers(), e._bindPanelInteractions(), e._bindDocumentUiHandlers(), e._unbindLayoutObserver?.(), e._bindLayoutObserver?.(), e._refresh?.(), e._updatePopoutBtnUI(); } -function $n(e, t) { +function hr(e, t) { if (!e.element) return; let n = !!t; if (e._desktopExpanded === n) return; @@ -2756,29 +2782,29 @@ function $n(e, t) { parent: r.parentNode || null, nextSibling: r.nextSibling || null, styleAttr: r.getAttribute("style") - }, r.parentNode !== document.body && document.body.appendChild(r), r.classList.add("mjr-mfv--desktop-expanded", "is-visible"), r.setAttribute("aria-hidden", "false"), r.style.position = "fixed", r.style.top = "12px", r.style.left = "12px", r.style.right = "12px", r.style.bottom = "12px", r.style.width = "auto", r.style.height = "auto", r.style.maxWidth = "none", r.style.maxHeight = "none", r.style.minWidth = "320px", r.style.minHeight = "240px", r.style.resize = "none", r.style.margin = "0", r.style.zIndex = "2147483000", e._desktopExpanded = !0, e.isVisible = !0, $(e), Q("electron-in-app-expanded", { isVisible: e.isVisible }); + }, r.parentNode !== document.body && document.body.appendChild(r), r.classList.add("mjr-mfv--desktop-expanded", "is-visible"), r.setAttribute("aria-hidden", "false"), r.style.position = "fixed", r.style.top = "12px", r.style.left = "12px", r.style.right = "12px", r.style.bottom = "12px", r.style.width = "auto", r.style.height = "auto", r.style.maxWidth = "none", r.style.maxHeight = "none", r.style.minWidth = "320px", r.style.minHeight = "240px", r.style.resize = "none", r.style.margin = "0", r.style.zIndex = "2147483000", e._desktopExpanded = !0, e.isVisible = !0, Q(e), Z("electron-in-app-expanded", { isVisible: e.isVisible }); return; } let i = e._desktopExpandRestore; - e._desktopExpanded = !1, r.classList.remove("mjr-mfv--desktop-expanded"), i?.styleAttr == null || i.styleAttr === "" ? r.removeAttribute("style") : r.setAttribute("style", i.styleAttr), i?.parent && i.parent.isConnected && (i.nextSibling && i.nextSibling.parentNode === i.parent ? i.parent.insertBefore(r, i.nextSibling) : i.parent.appendChild(r)), e._desktopExpandRestore = null, $(e), Q("electron-in-app-restored", null); + e._desktopExpanded = !1, r.classList.remove("mjr-mfv--desktop-expanded"), i?.styleAttr == null || i.styleAttr === "" ? r.removeAttribute("style") : r.setAttribute("style", i.styleAttr), i?.parent && i.parent.isConnected && (i.nextSibling && i.nextSibling.parentNode === i.parent ? i.parent.insertBefore(r, i.nextSibling) : i.parent.appendChild(r)), e._desktopExpandRestore = null, Q(e), Z("electron-in-app-restored", null); } -function er(n, r) { - n._desktopPopoutUnsupported = !0, Q("electron-in-app-fallback", { message: r?.message || String(r || "unknown error") }, "warn"), n._setDesktopExpanded(!0); +function gr(t, n) { + t._desktopPopoutUnsupported = !0, Z("electron-in-app-fallback", { message: n?.message || String(n || "unknown error") }, "warn"), t._setDesktopExpanded(!0); try { - t(e("toast.popoutElectronInAppFallback", "Desktop PiP is unavailable here. Viewer expanded inside the app instead."), "warning", 4500); + e(p("toast.popoutElectronInAppFallback", "Desktop PiP is unavailable here. Viewer expanded inside the app instead."), "warning", 4500); } catch (e) { console.debug?.(e); } } -function tr(e, t, n, r, i) { - return Q("electron-popup-fallback-attempt", { reason: i?.message || String(i || "unknown") }, "warn"), e._fallbackPopout(t, n, r), e._popoutWindow ? (e._desktopPopoutUnsupported = !1, Q("electron-popup-fallback-opened", null), !0) : !1; +function _r(e, t, n, r, i) { + return Z("electron-popup-fallback-attempt", { reason: i?.message || String(i || "unknown") }, "warn"), e._fallbackPopout(t, n, r), e._popoutWindow ? (e._desktopPopoutUnsupported = !1, Z("electron-popup-fallback-opened", null), !0) : !1; } -function nr(e) { +function vr(e) { if (e._isPopped || !e.element) return; let t = e.element; e._stopEdgeResize(); - let n = qn(), r = typeof window < "u" && "documentPictureInPicture" in window, i = String(window?.navigator?.userAgent || globalThis?.navigator?.userAgent || ""), a = Math.max(t.offsetWidth || 520, 400), o = Math.max(t.offsetHeight || 420, 300); - if (Q("start", { + let n = lr(), r = typeof window < "u" && "documentPictureInPicture" in window, i = String(window?.navigator?.userAgent || globalThis?.navigator?.userAgent || ""), a = Math.max(t.offsetWidth || 520, 400), o = Math.max(t.offsetHeight || 420, 300); + if (Z("start", { isElectronHost: n, hasDocumentPiP: r, userAgent: i, @@ -2786,22 +2812,22 @@ function nr(e) { height: o, desktopPopoutUnsupported: e._desktopPopoutUnsupported }), n && e._desktopPopoutUnsupported) { - Q("electron-in-app-fallback-reuse", null), e._setDesktopExpanded(!0); + Z("electron-in-app-fallback-reuse", null), e._setDesktopExpanded(!0); return; } - if (!(n && (Q("electron-popup-request", { + if (!(n && (Z("electron-popup-request", { width: a, height: o }), e._tryElectronPopupFallback(t, a, o, /* @__PURE__ */ Error("Desktop popup requested"))))) { if (n && "documentPictureInPicture" in window) { - Q("electron-pip-request", { + Z("electron-pip-request", { width: a, height: o }), window.documentPictureInPicture.requestWindow({ width: a, height: o }).then((n) => { - Q("electron-pip-opened", { hasDocument: !!n?.document }), e._popoutWindow = n, e._isPopped = !0, e._popoutRestoreGuard = !1; + Z("electron-pip-opened", { hasDocument: !!n?.document }), e._popoutWindow = n, e._isPopped = !0, e._popoutRestoreGuard = !1; try { e._popoutAC?.abort(); } catch (e) { @@ -2812,16 +2838,16 @@ function nr(e) { e._popoutCloseHandler = i; let a = n.document; a.title = "Majoor Viewer", e._installPopoutStyles(a); - let o = Qn(a); + let o = mr(a); if (!o) { e._activateDesktopExpandedFallback(/* @__PURE__ */ Error("Popup root creation failed")); return; } try { let e = typeof a.adoptNode == "function" ? a.adoptNode(t) : t; - o.appendChild(e), Q("electron-pip-adopted", { usedAdoptNode: typeof a.adoptNode == "function" }); + o.appendChild(e), Z("electron-pip-adopted", { usedAdoptNode: typeof a.adoptNode == "function" }); } catch (t) { - Q("electron-pip-adopt-failed", { message: t?.message || String(t) }, "warn"), console.warn("[MFV] PiP adoptNode failed", t), e._isPopped = !1, e._popoutWindow = null; + Z("electron-pip-adopt-failed", { message: t?.message || String(t) }, "warn"), console.warn("[MFV] PiP adoptNode failed", t), e._isPopped = !1, e._popoutWindow = null; try { n.close(); } catch (e) { @@ -2830,36 +2856,36 @@ function nr(e) { e._activateDesktopExpandedFallback(t); return; } - t.classList.add("is-visible"), e.isVisible = !0, $(e), Q("electron-pip-ready", { isPopped: e._isPopped }), n.addEventListener("pagehide", i, { signal: r }), e._startPopoutCloseWatch(), e._popoutKeydownHandler = (t) => { + t.classList.add("is-visible"), e.isVisible = !0, Q(e), Z("electron-pip-ready", { isPopped: e._isPopped }), n.addEventListener("pagehide", i, { signal: r }), e._startPopoutCloseWatch(), e._popoutKeydownHandler = (t) => { let n = String(t?.target?.tagName || "").toLowerCase(); t?.defaultPrevented || t?.target?.isContentEditable || n === "input" || n === "textarea" || n === "select" || e._forwardKeydownToController(t); }, n.addEventListener("keydown", e._popoutKeydownHandler, { signal: r }); }).catch((t) => { - Q("electron-pip-request-failed", { message: t?.message || String(t) }, "warn"), e._activateDesktopExpandedFallback(t); + Z("electron-pip-request-failed", { message: t?.message || String(t) }, "warn"), e._activateDesktopExpandedFallback(t); }); return; } if (n) { - Q("electron-no-pip-api", { hasDocumentPiP: r }), e._activateDesktopExpandedFallback(/* @__PURE__ */ Error("Document Picture-in-Picture unavailable after popup failure")); + Z("electron-no-pip-api", { hasDocumentPiP: r }), e._activateDesktopExpandedFallback(/* @__PURE__ */ Error("Document Picture-in-Picture unavailable after popup failure")); return; } - Q("browser-fallback-popup", { + Z("browser-fallback-popup", { width: a, height: o }), e._fallbackPopout(t, a, o); } } -function rr(e, t, n, r) { - Q("browser-popup-open", { +function yr(e, t, n, r) { + Z("browser-popup-open", { width: n, height: r }); let i = `width=${n},height=${r},left=${(window.screenX || window.screenLeft) + Math.round((window.outerWidth - n) / 2)},top=${(window.screenY || window.screenTop) + Math.round((window.outerHeight - r) / 2)},resizable=yes,scrollbars=no,toolbar=no,menubar=no,location=no,status=no`, a = window.open("about:blank", "_mjr_viewer", i); if (!a) { - Q("browser-popup-blocked", null, "warn"), console.warn("[MFV] Pop-out blocked - allow popups for this site."); + Z("browser-popup-blocked", null, "warn"), console.warn("[MFV] Pop-out blocked - allow popups for this site."); return; } - Q("browser-popup-opened", { hasDocument: !!a?.document }), e._popoutWindow = a, e._isPopped = !0, e._popoutRestoreGuard = !1; + Z("browser-popup-opened", { hasDocument: !!a?.document }), e._popoutWindow = a, e._isPopped = !0, e._popoutRestoreGuard = !1; try { e._popoutAC?.abort(); } catch (e) { @@ -2877,7 +2903,7 @@ function rr(e, t, n, r) { } if (!n) return; n.title = "Majoor Viewer", e._installPopoutStyles(n); - let r = Qn(n); + let r = mr(n); if (r) { try { r.appendChild(n.adoptNode(t)); @@ -2885,7 +2911,7 @@ function rr(e, t, n, r) { console.warn("[MFV] adoptNode failed", e); return; } - t.classList.add("is-visible"), e.isVisible = !0, $(e); + t.classList.add("is-visible"), e.isVisible = !0, Q(e); } }; try { @@ -2903,7 +2929,7 @@ function rr(e, t, n, r) { t?.defaultPrevented || t?.target?.isContentEditable || n === "input" || n === "textarea" || n === "select" || e._forwardKeydownToController(t); }, a.addEventListener("keydown", e._popoutKeydownHandler, { signal: o }); } -function ir(e) { +function br(e) { if (e._popoutCloseTimer != null) { try { window.clearInterval(e._popoutCloseTimer); @@ -2913,7 +2939,7 @@ function ir(e) { e._popoutCloseTimer = null; } } -function ar(e) { +function xr(e) { e._clearPopoutCloseWatch(), e._popoutCloseTimer = window.setInterval(() => { if (!e._isPopped) { e._clearPopoutCloseWatch(); @@ -2923,7 +2949,7 @@ function ar(e) { (!t || t.closed) && (e._clearPopoutCloseWatch(), e._schedulePopInFromPopupClose()); }, 250); } -function or(e) { +function Sr(e) { !e._isPopped || e._popoutRestoreGuard || (e._popoutRestoreGuard = !0, window.setTimeout(() => { try { e.popIn({ closePopupWindow: !1 }); @@ -2932,14 +2958,14 @@ function or(e) { } }, 0)); } -function sr(e, t) { +function Cr(e, t) { if (!t?.head) return; try { for (let e of t.head.querySelectorAll("[data-mjr-popout-cloned-style='1']")) e.remove(); } catch (e) { console.debug?.(e); } - Zn(t); + pr(t); try { let e = document.documentElement.style.cssText; if (e) { @@ -2963,7 +2989,7 @@ function sr(e, t) { let n = t.createElement("style"); n.setAttribute("data-mjr-popout-cloned-style", "1"), n.textContent = "\n html.mjr-mfv-popout-document {\n min-height: 100%;\n background:\n radial-gradient(\n 1200px 420px at 50% 0%,\n color-mix(in srgb, var(--primary-background, var(--comfy-accent, #5fb3ff)) 10%, transparent),\n transparent 62%\n ),\n linear-gradient(\n 180deg,\n color-mix(in srgb, var(--interface-panel-surface, var(--content-bg, #16191f)) 82%, #000 18%),\n color-mix(in srgb, var(--interface-menu-surface, var(--comfy-menu-bg, #1f2227)) 84%, #000 16%)\n ) !important;\n }\n body.mjr-mfv-popout-body {\n margin: 0 !important;\n display: flex !important;\n min-height: 100vh !important;\n overflow: hidden !important;\n background: transparent !important;\n }\n #mjr-mfv-popout-root,\n .mjr-mfv-popout-root {\n flex: 1 !important;\n min-width: 0 !important;\n min-height: 0 !important;\n display: flex !important;\n isolation: isolate;\n }\n body.mjr-mfv-popout-body .mjr-mfv {\n position: static !important;\n width: 100% !important;\n height: 100% !important;\n min-width: 0 !important;\n min-height: 0 !important;\n resize: none !important;\n border-radius: 0 !important;\n display: flex !important;\n opacity: 1 !important;\n visibility: visible !important;\n pointer-events: auto !important;\n transform: none !important;\n max-width: none !important;\n max-height: none !important;\n overflow: hidden !important;\n }\n ", t.head.appendChild(n); } -function cr(e, { closePopupWindow: t = !0 } = {}) { +function wr(e, { closePopupWindow: t = !0 } = {}) { if (e._desktopExpanded) { e._setDesktopExpanded(!1); return; @@ -2983,23 +3009,23 @@ function cr(e, { closePopupWindow: t = !0 } = {}) { } catch (e) { console.debug?.("[MFV] pop-in adopt failed", e); } - if (document.body.appendChild(r), r.classList.add("is-visible"), r.setAttribute("aria-hidden", "false"), e.isVisible = !0, $(e), t) try { + if (document.body.appendChild(r), r.classList.add("is-visible"), r.setAttribute("aria-hidden", "false"), e.isVisible = !0, Q(e), t) try { n?.close(); } catch (e) { console.debug?.(e); } e._popoutWindow = null; } -function lr(t) { - if (!t._popoutBtn) return; - let n = t._isPopped || t._desktopExpanded; - t.element && t.element.classList.toggle("mjr-mfv--popped", n), t._popoutBtn.classList.toggle("mjr-popin-active", n); - let r = t._popoutBtn.querySelector("i") || document.createElement("i"), i = n ? e("tooltip.popInViewer", "Return to floating panel") : e("tooltip.popOutViewer", "Pop out viewer to separate window"); - r.className = n ? "pi pi-sign-in" : "pi pi-external-link", t._popoutBtn.title = i, t._popoutBtn.setAttribute("aria-label", i), t._popoutBtn.setAttribute("aria-pressed", String(n)), t._popoutBtn.contains(r) || t._popoutBtn.replaceChildren(r); +function Tr(e) { + if (!e._popoutBtn) return; + let t = e._isPopped || e._desktopExpanded; + e.element && e.element.classList.toggle("mjr-mfv--popped", t), e._popoutBtn.classList.toggle("mjr-popin-active", t); + let n = e._popoutBtn.querySelector("i") || document.createElement("i"), r = t ? p("tooltip.popInViewer", "Return to floating panel") : p("tooltip.popOutViewer", "Pop out viewer to separate window"); + n.className = t ? "pi pi-sign-in" : "pi pi-external-link", e._popoutBtn.title = r, e._popoutBtn.setAttribute("aria-label", r), e._popoutBtn.setAttribute("aria-pressed", String(t)), e._popoutBtn.contains(n) || e._popoutBtn.replaceChildren(n); } //#endregion //#region ui/features/viewer/floatingViewerPanel.ts -function ur(e) { +function Er(e) { return { n: "ns-resize", s: "ns-resize", @@ -3011,12 +3037,12 @@ function ur(e) { sw: "nesw-resize" }[e] || ""; } -function dr(e, t, n) { +function Dr(e, t, n) { if (!n) return ""; let r = e <= n.left + 8, i = e >= n.right - 8, a = t <= n.top + 8, o = t >= n.bottom - 8; return a && r ? "nw" : a && i ? "ne" : o && r ? "sw" : o && i ? "se" : a ? "n" : o ? "s" : r ? "w" : i ? "e" : ""; } -function fr(e) { +function Or(e) { if (e.element) { try { e._resizeWindowCleanup?.(); @@ -3031,7 +3057,7 @@ function fr(e) { e._resizeState = null, e.element.classList.remove("mjr-mfv--resizing"), e.element.style.cursor = ""; } } -function pr(e) { +function kr(e) { if (e.element) { e._stopEdgeResize(); try { @@ -3042,7 +3068,7 @@ function pr(e) { e._panelAC = new AbortController(), e._initEdgeResize(e.element), e._initDrag(e.element.querySelector(".mjr-mfv-header")); } } -function mr(e, t) { +function Ar(e, t) { if (!t) return; let n = (t) => { if (!e.element || e._isPopped) return ""; @@ -3108,7 +3134,7 @@ function mr(e, t) { !e._resizeState && e.element && (e.element.style.cursor = ""); }, { signal: r }); } -function hr(e, t) { +function jr(e, t) { if (!t) return; let n = e._panelAC?.signal, r = null; t.addEventListener("pointerdown", (n) => { @@ -3136,15 +3162,15 @@ function hr(e, t) { } //#endregion //#region ui/features/viewer/floatingViewerCapture.ts -async function gr(e, t, n, r, i, a, o, s) { +async function Mr(e, t, n, r, i, a, o, s) { if (!n) return; - let c = V(n), l = null; + let c = B(n), l = null; if (c === "video" && (l = s instanceof HTMLVideoElement ? s : e._contentEl?.querySelector("video") || null), !l && c === "model3d") { let t = n?.id == null ? "" : String(n.id); t && (l = e._contentEl?.querySelector?.(`.mjr-model3d-render-canvas[data-mjr-asset-id="${t}"]`) || null), l ||= e._contentEl?.querySelector?.(".mjr-model3d-render-canvas") || null; } if (!l) { - let e = Se(n); + let e = Me(n); if (!e) return; l = await new Promise((t) => { let n = new Image(); @@ -3157,7 +3183,7 @@ async function gr(e, t, n, r, i, a, o, s) { let f = Math.min(a / u, o / d); t.drawImage(l, r + (a - u * f) / 2, i + (o - d * f) / 2, u * f, d * f); } -function _r(e, t, n, r) { +function Nr(e, t, n, r) { if (!t || !n || !e._genInfoSelections.size) return 0; let i = e._getGenFields(n), a = [ "prompt", @@ -3189,7 +3215,7 @@ function _r(e, t, n, r) { } return s > 0 ? s * 16 + 16 : 0; } -function vr(e, t, n, r, i, a, o) { +function Pr(e, t, n, r, i, a, o) { if (!n || !e._genInfoSelections.size) return; let s = e._getGenFields(n), c = { prompt: "#7ec8ff", @@ -3244,126 +3270,126 @@ function vr(e, t, n, r, i, a, o) { }); } let p = f.reduce((e, t) => e + t.lines.length, 0) * 16 + 16, m = r + 8, h = i + o - p - 8; - t.globalAlpha = .72, t.fillStyle = "#000", De(t, m, h, d, p, 6), t.fill(), t.globalAlpha = 1; + t.globalAlpha = .72, t.fillStyle = "#000", Le(t, m, h, d, p, 6), t.fill(), t.globalAlpha = 1; let g = h + 8 + 11; for (let { label: e, labelW: n, lines: r, color: i } of f) for (let a = 0; a < r.length; a++) a === 0 ? (t.font = "bold 11px system-ui, sans-serif", t.fillStyle = i, t.fillText(e, m + 8, g), t.font = "11px system-ui, sans-serif", t.fillStyle = "rgba(255,255,255,0.88)", t.fillText(r[a], m + 8 + n, g)) : (t.font = "11px system-ui, sans-serif", t.fillStyle = "rgba(255,255,255,0.88)", t.fillText(r[a], m + 8 + n, g)), g += 16; t.restore(); } -async function yr(t) { - if (!t._contentEl) return; - t._captureBtn && (t._captureBtn.disabled = !0, t._captureBtn.setAttribute("aria-label", e("tooltip.capturingView", "Capturing..."))); - let n = t._contentEl.clientWidth || 480, r = t._contentEl.clientHeight || 360, i = r; - if (t._mode === I.SIMPLE && t._mediaA && t._genInfoSelections.size) { - let e = document.createElement("canvas"); - e.width = n, e.height = r; - let a = e.getContext("2d"), o = t._estimateGenInfoOverlayHeight(a, t._mediaA, n); +async function Fr(e) { + if (!e._contentEl) return; + e._captureBtn && (e._captureBtn.disabled = !0, e._captureBtn.setAttribute("aria-label", p("tooltip.capturingView", "Capturing..."))); + let t = e._contentEl.clientWidth || 480, n = e._contentEl.clientHeight || 360, r = n; + if (e._mode === z.SIMPLE && e._mediaA && e._genInfoSelections.size) { + let i = document.createElement("canvas"); + i.width = t, i.height = n; + let a = i.getContext("2d"), o = e._estimateGenInfoOverlayHeight(a, e._mediaA, t); if (o > 0) { - let e = Math.max(r, o + 24); - i = Math.min(e, r * 4); + let e = Math.max(n, o + 24); + r = Math.min(e, n * 4); } } - let a = document.createElement("canvas"); - a.width = n, a.height = i; - let o = a.getContext("2d"); - o.fillStyle = "#0d0d0d", o.fillRect(0, 0, n, i); + let i = document.createElement("canvas"); + i.width = t, i.height = r; + let a = i.getContext("2d"); + a.fillStyle = "#0d0d0d", a.fillRect(0, 0, t, r); try { - if (t._mode === I.SIMPLE) t._mediaA && (await t._drawMediaFit(o, t._mediaA, 0, 0, n, r), t._drawGenInfoOverlay(o, t._mediaA, 0, 0, n, i)); - else if (t._mode === I.AB) { - let e = Math.round(t._abDividerX * n), r = t._contentEl.querySelector(".mjr-mfv-ab-layer:not(.mjr-mfv-ab-layer--b) video"), a = t._contentEl.querySelector(".mjr-mfv-ab-layer--b video"); - t._mediaA && await t._drawMediaFit(o, t._mediaA, 0, 0, n, i, r), t._mediaB && (o.save(), o.beginPath(), o.rect(e, 0, n - e, i), o.clip(), await t._drawMediaFit(o, t._mediaB, 0, 0, n, i, a), o.restore()), o.save(), o.strokeStyle = "rgba(255,255,255,0.88)", o.lineWidth = 2, o.beginPath(), o.moveTo(e, 0), o.lineTo(e, i), o.stroke(), o.restore(), G(o, "A", 8, 8), G(o, "B", e + 8, 8), t._mediaA && t._drawGenInfoOverlay(o, t._mediaA, 0, 0, e, i), t._mediaB && t._drawGenInfoOverlay(o, t._mediaB, e, 0, n - e, i); - } else if (t._mode === I.SIDE) { - let e = Math.floor(n / 2), r = t._contentEl.querySelector(".mjr-mfv-side-panel:first-child video"), a = t._contentEl.querySelector(".mjr-mfv-side-panel:last-child video"); - t._mediaA && (await t._drawMediaFit(o, t._mediaA, 0, 0, e, i, r), t._drawGenInfoOverlay(o, t._mediaA, 0, 0, e, i)), o.fillStyle = "#111", o.fillRect(e, 0, 2, i), t._mediaB && (await t._drawMediaFit(o, t._mediaB, e, 0, e, i, a), t._drawGenInfoOverlay(o, t._mediaB, e, 0, e, i)), G(o, "A", 8, 8), G(o, "B", e + 8, 8); - } else if (t._mode === I.GRID) { - let e = Math.floor(n / 2), r = Math.floor(i / 2), a = [ + if (e._mode === z.SIMPLE) e._mediaA && (await e._drawMediaFit(a, e._mediaA, 0, 0, t, n), e._drawGenInfoOverlay(a, e._mediaA, 0, 0, t, r)); + else if (e._mode === z.AB) { + let n = Math.round(e._abDividerX * t), i = e._contentEl.querySelector(".mjr-mfv-ab-layer:not(.mjr-mfv-ab-layer--b) video"), o = e._contentEl.querySelector(".mjr-mfv-ab-layer--b video"); + e._mediaA && await e._drawMediaFit(a, e._mediaA, 0, 0, t, r, i), e._mediaB && (a.save(), a.beginPath(), a.rect(n, 0, t - n, r), a.clip(), await e._drawMediaFit(a, e._mediaB, 0, 0, t, r, o), a.restore()), a.save(), a.strokeStyle = "rgba(255,255,255,0.88)", a.lineWidth = 2, a.beginPath(), a.moveTo(n, 0), a.lineTo(n, r), a.stroke(), a.restore(), W(a, "A", 8, 8), W(a, "B", n + 8, 8), e._mediaA && e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r), e._mediaB && e._drawGenInfoOverlay(a, e._mediaB, n, 0, t - n, r); + } else if (e._mode === z.SIDE) { + let n = Math.floor(t / 2), i = e._contentEl.querySelector(".mjr-mfv-side-panel:first-child video"), o = e._contentEl.querySelector(".mjr-mfv-side-panel:last-child video"); + e._mediaA && (await e._drawMediaFit(a, e._mediaA, 0, 0, n, r, i), e._drawGenInfoOverlay(a, e._mediaA, 0, 0, n, r)), a.fillStyle = "#111", a.fillRect(n, 0, 2, r), e._mediaB && (await e._drawMediaFit(a, e._mediaB, n, 0, n, r, o), e._drawGenInfoOverlay(a, e._mediaB, n, 0, n, r)), W(a, "A", 8, 8), W(a, "B", n + 8, 8); + } else if (e._mode === z.GRID) { + let n = Math.floor(t / 2), i = Math.floor(r / 2), o = [ { - media: t._mediaA, + media: e._mediaA, label: "A", x: 0, y: 0, - w: e - 1, - h: r - 1 + w: n - 1, + h: i - 1 }, { - media: t._mediaB, + media: e._mediaB, label: "B", - x: e + 1, + x: n + 1, y: 0, - w: e - 1, - h: r - 1 + w: n - 1, + h: i - 1 }, { - media: t._mediaC, + media: e._mediaC, label: "C", x: 0, - y: r + 1, - w: e - 1, - h: r - 1 + y: i + 1, + w: n - 1, + h: i - 1 }, { - media: t._mediaD, + media: e._mediaD, label: "D", - x: e + 1, - y: r + 1, - w: e - 1, - h: r - 1 + x: n + 1, + y: i + 1, + w: n - 1, + h: i - 1 } - ], s = t._contentEl.querySelectorAll(".mjr-mfv-grid-cell"); - for (let e = 0; e < a.length; e++) { - let n = a[e], r = s[e]?.querySelector("video") || null; - n.media && (await t._drawMediaFit(o, n.media, n.x, n.y, n.w, n.h, r), t._drawGenInfoOverlay(o, n.media, n.x, n.y, n.w, n.h)), G(o, n.label, n.x + 8, n.y + 8); + ], s = e._contentEl.querySelectorAll(".mjr-mfv-grid-cell"); + for (let t = 0; t < o.length; t++) { + let n = o[t], r = s[t]?.querySelector("video") || null; + n.media && (await e._drawMediaFit(a, n.media, n.x, n.y, n.w, n.h, r), e._drawGenInfoOverlay(a, n.media, n.x, n.y, n.w, n.h)), W(a, n.label, n.x + 8, n.y + 8); } - o.save(), o.fillStyle = "#111", o.fillRect(e - 1, 0, 2, i), o.fillRect(0, r - 1, n, 2), o.restore(); + a.save(), a.fillStyle = "#111", a.fillRect(n - 1, 0, 2, r), a.fillRect(0, i - 1, t, 2), a.restore(); } } catch (e) { console.debug("[MFV] capture error:", e); } - let s = `${{ - [I.AB]: "mfv-ab", - [I.SIDE]: "mfv-side", - [I.GRID]: "mfv-grid" - }[t._mode] ?? "mfv"}-${Date.now()}.png`; + let o = `${{ + [z.AB]: "mfv-ab", + [z.SIDE]: "mfv-side", + [z.GRID]: "mfv-grid" + }[e._mode] ?? "mfv"}-${Date.now()}.png`; try { - let e = a.toDataURL("image/png"), t = document.createElement("a"); - t.href = e, t.download = s, document.body.appendChild(t), t.click(), setTimeout(() => document.body.removeChild(t), 100); + let e = i.toDataURL("image/png"), t = document.createElement("a"); + t.href = e, t.download = o, document.body.appendChild(t), t.click(), setTimeout(() => document.body.removeChild(t), 100); } catch (e) { console.warn("[MFV] download failed:", e); } finally { - t._captureBtn && (t._captureBtn.disabled = !1, t._captureBtn.setAttribute("aria-label", e("tooltip.captureView", "Save view as image"))); + e._captureBtn && (e._captureBtn.disabled = !1, e._captureBtn.setAttribute("aria-label", p("tooltip.captureView", "Save view as image"))); } } //#endregion //#region ui/features/viewer/floatingViewerLoader.ts -var br = "imageops-live-preview"; -function xr(e) { - return String(e?._source || "") === br; +var Ir = "imageops-live-preview"; +function Lr(e) { + return String(e?._source || "") === Ir; } -function Sr(e, t, { autoMode: n = !1 } = {}) { - let r = e._mediaA || null, o = xr(t), s = o && xr(r) && String(r?._nodeId || "") === String(t?._nodeId || ""); - if (e._mediaA = t || null, s || e._resetMfvZoom(), n && e._mode !== I.SIMPLE && e._mode !== I.GRAPH && (e._mode = I.SIMPLE, e._updateModeBtnUI()), e._mediaA && !o && typeof F == "function") { - let t = ++e._refreshGen; +function Rr(e, r, { autoMode: i = !1 } = {}) { + let a = e._mediaA || null, o = Lr(r), s = o && Lr(a) && String(a?._nodeId || "") === String(r?._nodeId || ""); + if (e._mediaA = r || null, s || e._resetMfvZoom(), i && e._mode !== z.SIMPLE && e._mode !== z.GRAPH && (e._mode = z.SIMPLE, e._updateModeBtnUI()), e._mediaA && !o && typeof pe == "function") { + let r = ++e._refreshGen; (async () => { try { - let n = await F(e._mediaA, { - getAssetMetadata: i, - getFileMetadataScoped: a + let i = await pe(e._mediaA, { + getAssetMetadata: n, + getFileMetadataScoped: t }); - if (e._refreshGen !== t) return; - n && typeof n == "object" && (e._mediaA = n, e._refresh()); + if (e._refreshGen !== r) return; + i && typeof i == "object" && (e._mediaA = i, e._refresh()); } catch (e) { console.debug?.("[MFV] metadata enrich error", e); } })(); } else e._refresh(); } -function Cr(e, t, n) { - e._mediaA = t || null, e._mediaB = n || null, e._resetMfvZoom(), e._mode === I.SIMPLE && (e._mode = I.AB, e._updateModeBtnUI()); - let r = ++e._refreshGen, o = async (e) => { +function zr(e, r, i) { + e._mediaA = r || null, e._mediaB = i || null, e._resetMfvZoom(), e._mode === z.SIMPLE && (e._mode = z.AB, e._updateModeBtnUI()); + let a = ++e._refreshGen, o = async (e) => { if (!e) return e; try { - return await F(e, { - getAssetMetadata: i, - getFileMetadataScoped: a + return await pe(e, { + getAssetMetadata: n, + getFileMetadataScoped: t }) || e; } catch { return e; @@ -3371,17 +3397,17 @@ function Cr(e, t, n) { }; (async () => { let [t, n] = await Promise.all([o(e._mediaA), o(e._mediaB)]); - e._refreshGen === r && (e._mediaA = t || null, e._mediaB = n || null, e._refresh()); + e._refreshGen === a && (e._mediaA = t || null, e._mediaB = n || null, e._refresh()); })(); } -function wr(e, t, n, r, o) { - e._mediaA = t || null, e._mediaB = n || null, e._mediaC = r || null, e._mediaD = o || null, e._resetMfvZoom(), e._mode !== I.GRID && (e._mode = I.GRID, e._updateModeBtnUI()); +function Br(e, r, i, a, o) { + e._mediaA = r || null, e._mediaB = i || null, e._mediaC = a || null, e._mediaD = o || null, e._resetMfvZoom(), e._mode !== z.GRID && (e._mode = z.GRID, e._updateModeBtnUI()); let s = ++e._refreshGen, c = async (e) => { if (!e) return e; try { - return await F(e, { - getAssetMetadata: i, - getFileMetadataScoped: a + return await pe(e, { + getAssetMetadata: n, + getFileMetadataScoped: t }) || e; } catch { return e; @@ -3399,16 +3425,16 @@ function wr(e, t, n, r, o) { } //#endregion //#region ui/features/viewer/FloatingViewer.impl.ts -function Tr(e) { +function $(e) { try { return !!e?.classList?.contains("mjr-mfv-simple-player") || !!e?.classList?.contains("mjr-mfv-player-host") || !!e?.querySelector?.(".mjr-video-controls, .mjr-mfv-simple-player-controls"); } catch (e) { return console.debug?.(e), !1; } } -var Er = 0, Dr = class { +var Vr = 0, Hr = class { constructor({ controller: e = null } = {}) { - this._instanceId = ++Er, this._controller = e && typeof e == "object" ? { ...e } : null, this.element = null, this.isVisible = !1, this._contentEl = null, this._genSidebarEl = null, this._closeBtn = null, this._modeBtn = null, this._pinGroup = null, this._pinBtns = null, this._liveBtn = null, this._genBtn = null, this._genDropdown = null, this._genSidebarEnabled = !0, this._captureBtn = null, this._genInfoSelections = new Set([ + this._instanceId = ++Vr, this._controller = e && typeof e == "object" ? { ...e } : null, this.element = null, this.isVisible = !1, this._contentEl = null, this._genSidebarEl = null, this._closeBtn = null, this._modeBtn = null, this._pinGroup = null, this._pinBtns = null, this._liveBtn = null, this._genBtn = null, this._genDropdown = null, this._genSidebarEnabled = !0, this._captureBtn = null, this._genInfoSelections = new Set([ "prompt", "seed", "model", @@ -3418,7 +3444,7 @@ var Er = 0, Dr = class { "cfg", "step", "genTime" - ]), this._mode = I.SIMPLE, this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this._pinnedSlots = /* @__PURE__ */ new Set(), this._abDividerX = .5, this._zoom = 1, this._panX = 0, this._panY = 0, this._panzoomAC = null, this._dragging = !1, this._compareSyncAC = null, this._btnAC = null, this._refreshGen = 0, this._popoutWindow = null, this._popoutBtn = null, this._isPopped = !1, this._desktopExpanded = !1, this._desktopExpandRestore = null, this._desktopPopoutUnsupported = !1, this._popoutCloseHandler = null, this._popoutKeydownHandler = null, this._popoutCloseTimer = null, this._popoutRestoreGuard = !1, this._previewBtn = null, this._previewBlobUrl = null, this._previewActive = !1, this._nodeStreamBtn = null, this._nodeStreamActive = !1, this._nodeStreamSelection = null, this._nodeStreamOverlayEl = null, this._docAC = new AbortController(), this._popoutAC = null, this._panelAC = new AbortController(), this._resizeState = null, this._titleId = `mjr-mfv-title-${this._instanceId}`, this._genDropdownId = `mjr-mfv-gen-dropdown-${this._instanceId}`, this._progressEl = null, this._progressNodesEl = null, this._progressStepsEl = null, this._progressTextEl = null, this._mediaProgressEl = null, this._mediaProgressTextEl = null, this._progressUpdateHandler = null, this._progressCurrentNodeId = null, this._docClickHost = null, this._handleDocClick = null, this._mediaControlHandles = [], this._layoutObserver = null, this._channel = "rgb", this._exposureEV = 0, this._gridMode = 0, this._overlayMaskEnabled = !1, this._overlayMaskOpacity = .65, this._overlayFormat = "image", this._graphMapPanel = new Gt({ large: !0 }); + ]), this._mode = z.SIMPLE, this._mediaA = null, this._mediaB = null, this._mediaC = null, this._mediaD = null, this._pinnedSlots = /* @__PURE__ */ new Set(), this._abDividerX = .5, this._zoom = 1, this._panX = 0, this._panY = 0, this._panzoomAC = null, this._dragging = !1, this._compareSyncAC = null, this._btnAC = null, this._refreshGen = 0, this._popoutWindow = null, this._popoutBtn = null, this._isPopped = !1, this._desktopExpanded = !1, this._desktopExpandRestore = null, this._desktopPopoutUnsupported = !1, this._popoutCloseHandler = null, this._popoutKeydownHandler = null, this._popoutCloseTimer = null, this._popoutRestoreGuard = !1, this._previewBtn = null, this._previewBlobUrl = null, this._previewActive = !1, this._nodeStreamBtn = null, this._nodeStreamActive = !1, this._nodeStreamSelection = null, this._nodeStreamOverlayEl = null, this._docAC = new AbortController(), this._popoutAC = null, this._panelAC = new AbortController(), this._resizeState = null, this._titleId = `mjr-mfv-title-${this._instanceId}`, this._genDropdownId = `mjr-mfv-gen-dropdown-${this._instanceId}`, this._progressEl = null, this._progressNodesEl = null, this._progressStepsEl = null, this._progressTextEl = null, this._mediaProgressEl = null, this._mediaProgressTextEl = null, this._progressUpdateHandler = null, this._progressCurrentNodeId = null, this._docClickHost = null, this._handleDocClick = null, this._mediaControlHandles = [], this._layoutObserver = null, this._channel = "rgb", this._exposureEV = 0, this._gridMode = 0, this._overlayMaskEnabled = !1, this._overlayMaskOpacity = .65, this._overlayFormat = "image", this._graphMapPanel = new an({ large: !0 }); } _dispatchControllerAction(e, t) { try { @@ -3458,32 +3484,32 @@ var Er = 0, Dr = class { } } render() { - return Sn(this); + return Rn(this); } _buildHeader() { - return Cn(this); + return zn(this); } _buildToolbar() { - return wn(this); + return Bn(this); } _rebindControlHandlers() { - return Tn(this); + return Vn(this); } _updateSettingsBtnState(e) { - return En(this, e); + return Hn(this, e); } _applySidebarPosition() { - return Dn(this); + return Un(this); } refreshSidebar() { this._sidebar?.refresh(); } _resetGenDropdownForCurrentDocument() {} _bindDocumentUiHandlers() { - return On(this); + return Wn(this); } _unbindDocumentUiHandlers() { - return kn(this); + return Gn(this); } _isGenDropdownOpen() { return !1; @@ -3491,49 +3517,49 @@ var Er = 0, Dr = class { _openGenDropdown() {} _closeGenDropdown() {} _updateGenBtnUI() { - return An(this); + return Kn(this); } _buildGenDropdown() { return null; } _getGenFields(e) { - return Nn(this, e); + return Yn(this, e); } _buildGenInfoDOM(e) { - return Pn(this, e); + return Xn(this, e); } _notifyModeChanged() { - return Fn(this); + return Zn(this); } _cycleMode() { - return In(this); + return Qn(this); } setMode(e) { - return Ln(this, e); + return $n(this, e); } getPinnedSlots() { - return Rn(this); + return er(this); } _updatePinUI() { - return zn(this); + return tr(this); } _updateModeBtnUI() { - return Bn(this); + return nr(this); } setLiveActive(e) { - return Vn(this, e); + return rr(this, e); } setPreviewActive(e) { - return Hn(this, e); + return ir(this, e); } loadPreviewBlob(e, t = {}) { - return Un(this, e, t); + return ar(this, e, t); } _revokePreviewBlob() { - return Wn(this); + return or(this); } setNodeStreamActive(e) { - return Gn(this, e); + return sr(this, e); } setNodeStreamSelection(e) { e && (e.nodeId != null || e.classType) ? this._nodeStreamSelection = { @@ -3559,17 +3585,17 @@ var Er = 0, Dr = class { this._nodeStreamOverlayEl.textContent = `${n} - ${r}${i}`.trim(); } loadMediaA(e, { autoMode: t = !1 } = {}) { - return Sr(this, e, { autoMode: t }); + return Rr(this, e, { autoMode: t }); } loadMediaPair(e, t) { - return Cr(this, e, t); + return zr(this, e, t); } loadMediaQuad(e, t, n, r) { - return wr(this, e, t, n, r); + return Br(this, e, t, n, r); } _applyTransform() { if (!this._contentEl) return; - let e = Math.max(L, Math.min(8, this._zoom)), t = this._contentEl.clientWidth || 0, n = this._contentEl.clientHeight || 0, r = Math.max(0, (e - 1) * t / 2), i = Math.max(0, (e - 1) * n / 2); + let e = Math.max(me, Math.min(8, this._zoom)), t = this._contentEl.clientWidth || 0, n = this._contentEl.clientHeight || 0, r = Math.max(0, (e - 1) * t / 2), i = Math.max(0, (e - 1) * n / 2); this._panX = Math.max(-r, Math.min(r, this._panX)), this._panY = Math.max(-i, Math.min(i, this._panY)); let a = `translate(${this._panX}px,${this._panY}px) scale(${e})`; for (let e of this._contentEl.querySelectorAll(".mjr-mfv-media")) e?._mjrDisableViewerTransform || (e.style.transform = a, e.style.transformOrigin = "center"); @@ -3690,7 +3716,7 @@ var Er = 0, Dr = class { for (let e of l) n.strokeRect(e.x + .5, e.y + .5, e.w - 1, e.h - 1); n.restore(); } - if (this._mode !== I.SIMPLE || !this._gridMode) return; + if (this._mode !== z.SIMPLE || !this._gridMode) return; let u = l[0]; if (!u) return; n.save(), n.translate(u.x, u.y), n.strokeStyle = "rgba(255,255,255,0.22)", n.lineWidth = Math.max(2, Math.round(1.25 * r)); @@ -3700,7 +3726,7 @@ var Er = 0, Dr = class { this._gridMode === 1 ? (d(u.w / 3, 0, u.w / 3, u.h), d(2 * u.w / 3, 0, 2 * u.w / 3, u.h), d(0, u.h / 3, u.w, u.h / 3), d(0, 2 * u.h / 3, u.w, 2 * u.h / 3)) : this._gridMode === 2 ? (d(u.w / 2, 0, u.w / 2, u.h), d(0, u.h / 2, u.w, u.h / 2)) : this._gridMode === 3 && (n.strokeRect(u.w * .1 + .5, u.h * .1 + .5, u.w * .8 - 1, u.h * .8 - 1), n.strokeRect(u.w * .05 + .5, u.h * .05 + .5, u.w * .9 - 1, u.h * .9 - 1)), n.restore(); } _setMfvZoom(e, t, n) { - let r = Math.max(L, Math.min(8, this._zoom)), i = Math.max(L, Math.min(8, Number(e) || 1)); + let r = Math.max(me, Math.min(8, this._zoom)), i = Math.max(me, Math.min(8, Number(e) || 1)); if (t != null && n != null && this._contentEl) { let e = i / r, a = this._contentEl.getBoundingClientRect(), o = t - (a.left + a.width / 2), s = n - (a.top + a.height / 2); this._panX = this._panX * e + (1 - e) * o, this._panY = this._panY * e + (1 - e) * s; @@ -3734,11 +3760,11 @@ var Er = 0, Dr = class { this._panzoomAC = new AbortController(); let t = { signal: this._panzoomAC.signal }; e.addEventListener("wheel", (t) => { - if (t.target?.closest?.("audio") || t.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") || N(t.target)) return; - let n = we(t.target, e); - if (n && Te(n, Number(t.deltaX || 0), Number(t.deltaY || 0))) return; + if (t.target?.closest?.("audio") || t.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") || L(t.target)) return; + let n = Pe(t.target, e); + if (n && Fe(n, Number(t.deltaX || 0), Number(t.deltaY || 0))) return; t.preventDefault(); - let r = 1 - (t.deltaY || t.deltaX || 0) * R; + let r = 1 - (t.deltaY || t.deltaX || 0) * he; this._setMfvZoom(this._zoom * r, t.clientX, t.clientY); }, { ...t, @@ -3746,7 +3772,7 @@ var Er = 0, Dr = class { }); let n = !1, r = 0, i = 0, a = 0, o = 0; e.addEventListener("pointerdown", (t) => { - if (!(t.button !== 0 && t.button !== 1) && !(this._zoom <= 1.01) && !t.target?.closest?.("video") && !t.target?.closest?.("audio") && !t.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") && !t.target?.closest?.(".mjr-mfv-ab-divider") && !N(t.target)) { + if (!(t.button !== 0 && t.button !== 1) && !(this._zoom <= 1.01) && !t.target?.closest?.("video") && !t.target?.closest?.("audio") && !t.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") && !t.target?.closest?.(".mjr-mfv-ab-divider") && !L(t.target)) { t.preventDefault(), n = !0, this._dragging = !0, r = t.clientX, i = t.clientY, a = this._panX, o = this._panY; try { e.setPointerCapture(t.pointerId); @@ -3770,7 +3796,7 @@ var Er = 0, Dr = class { } }; e.addEventListener("pointerup", s, t), e.addEventListener("pointercancel", s, t), e.addEventListener("dblclick", (e) => { - if (e.target?.closest?.("video") || e.target?.closest?.("audio") || e.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") || N(e.target)) return; + if (e.target?.closest?.("video") || e.target?.closest?.("audio") || e.target?.closest?.(".mjr-video-controls, .mjr-mfv-simple-player-controls") || L(e.target)) return; let t = Math.abs(this._zoom - 1) < .05; this._setMfvZoom(t ? Math.min(4, this._zoom * 4) : 1, e.clientX, e.clientY); }, t); @@ -3810,12 +3836,12 @@ var Er = 0, Dr = class { return e; } _initCompareSync() { - if (this._destroyCompareSync(), this._contentEl && this._mode !== I.SIMPLE) try { + if (this._destroyCompareSync(), this._contentEl && this._mode !== z.SIMPLE) try { let e = Array.from(this._contentEl.querySelectorAll("video")); if (e.length < 2) return; let t = e[0] || null, n = e.slice(1); if (!t || !n.length) return; - this._compareSyncAC = ne(t, n, { threshold: .08 }); + this._compareSyncAC = ae(t, n, { threshold: .08 }); } catch (e) { console.debug?.(e); } @@ -3825,30 +3851,30 @@ var Er = 0, Dr = class { this._sidebar?.setAsset?.(this._mediaA || null), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(); let e = this._overlayCanvas || null; switch (this._contentEl.replaceChildren(), this._contentEl.style.overflow = "hidden", this._mode) { - case I.SIMPLE: + case z.SIMPLE: this._renderSimple(); break; - case I.AB: + case z.AB: this._renderAB(); break; - case I.SIDE: + case z.SIDE: this._renderSide(); break; - case I.GRID: + case z.GRID: this._renderGrid(); break; - case I.GRAPH: + case z.GRAPH: this._renderGraphMap(); break; } - e && this._contentEl.appendChild(e), this._nodeStreamSelection && this._updateNodeStreamOverlay(), this._mediaProgressEl && this._contentEl.appendChild(this._mediaProgressEl), this._applyMediaToneControls(), this._applyTransform(), this._mode !== I.GRAPH && this._initPanZoom(this._contentEl), this._initCompareSync(), this._renderGenInfoSidebar(); + e && this._contentEl.appendChild(e), this._nodeStreamSelection && this._updateNodeStreamOverlay(), this._mediaProgressEl && this._contentEl.appendChild(this._mediaProgressEl), this._applyMediaToneControls(), this._applyTransform(), this._mode !== z.GRAPH && this._initPanZoom(this._contentEl), this._initCompareSync(), this._renderGenInfoSidebar(); } _renderGenInfoSidebar() { let e = this._genSidebarEl; if (!e) return; e.replaceChildren(); let t = this._getGenInfoSidebarSlots(); - if (this._mode === I.GRAPH || !this._genSidebarEnabled || t.length === 0) { + if (this._mode === z.GRAPH || !this._genSidebarEnabled || t.length === 0) { e.classList.remove("open"), e.setAttribute("hidden", ""), this._updateGenBtnUI?.(); return; } @@ -3856,7 +3882,7 @@ var Er = 0, Dr = class { n.className = "mjr-mfv-gen-sidebar-title", n.textContent = "Gen Info", e.appendChild(n); let r = 0; for (let n of t) { - if (V(n.media) === "audio") continue; + if (B(n.media) === "audio") continue; let i = this._buildGenInfoSidebarContent(n.media); if (!i) continue; let a = document.createElement("section"); @@ -3886,17 +3912,17 @@ var Er = 0, Dr = class { media: this._mediaD, label: "D" }; - return (this._mode === I.GRID ? [ + return (this._mode === z.GRID ? [ e, t, n, r - ] : this._mode === I.AB || this._mode === I.SIDE ? [e, t] : [e]).filter((e) => e.media); + ] : this._mode === z.AB || this._mode === z.SIDE ? [e, t] : [e]).filter((e) => e.media); } _buildGenInfoSidebarContent(e) { let t = this._getGenFields(e)?.genTime || "", n = null; try { - n = d(e); + n = T(e); } catch (e) { console.debug?.(e); } @@ -4023,24 +4049,24 @@ var Er = 0, Dr = class { } _renderSimple() { if (!this._mediaA) { - this._contentEl.appendChild(H()); + this._contentEl.appendChild(V()); return; } - let e = W(this._mediaA), t = this._trackMediaControls?.(e) || e; + let e = U(this._mediaA), t = this._trackMediaControls?.(e) || e; if (!t) { - this._contentEl.appendChild(H("Could not load media")); + this._contentEl.appendChild(V("Could not load media")); return; } let n = document.createElement("div"); n.className = "mjr-mfv-simple-container", n.appendChild(t), this._contentEl.appendChild(n); } _renderAB() { - let e = this._mediaA ? W(this._mediaA, { fill: !0 }) : null, t = this._mediaB ? W(this._mediaB, { + let e = this._mediaA ? U(this._mediaA, { fill: !0 }) : null, t = this._mediaB ? U(this._mediaB, { fill: !0, controls: !1 - }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t, i = this._mediaA ? V(this._mediaA) : "", a = this._mediaB ? V(this._mediaB) : ""; + }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t, i = this._mediaA ? B(this._mediaA) : "", a = this._mediaB ? B(this._mediaB) : ""; if (!n && !r) { - this._contentEl.appendChild(H("Select 2 assets for A/B compare")); + this._contentEl.appendChild(V("Select 2 assets for A/B compare")); return; } if (!r) { @@ -4062,9 +4088,9 @@ var Er = 0, Dr = class { let u = document.createElement("div"); u.className = "mjr-mfv-ab-divider", u.style.left = `${l}%`; let d = this._buildGenInfoDOM(this._mediaA), f = null; - d && (f = document.createElement("div"), f.className = "mjr-mfv-geninfo-a", Tr(n) && f.classList.add("mjr-mfv-geninfo--above-player"), f.appendChild(d), f.style.right = `calc(${100 - l}% + 8px)`); + d && (f = document.createElement("div"), f.className = "mjr-mfv-geninfo-a", $(n) && f.classList.add("mjr-mfv-geninfo--above-player"), f.appendChild(d), f.style.right = `calc(${100 - l}% + 8px)`); let p = this._buildGenInfoDOM(this._mediaB), m = null; - p && (m = document.createElement("div"), m.className = "mjr-mfv-geninfo-b", Tr(r) && m.classList.add("mjr-mfv-geninfo--above-player"), m.appendChild(p), m.style.left = `calc(${l}% + 8px)`); + p && (m = document.createElement("div"), m.className = "mjr-mfv-geninfo-b", $(r) && m.classList.add("mjr-mfv-geninfo--above-player"), m.appendChild(p), m.style.left = `calc(${l}% + 8px)`); let h = null; u.addEventListener("pointerdown", (e) => { e.preventDefault(), u.setPointerCapture(e.pointerId); @@ -4083,29 +4109,29 @@ var Er = 0, Dr = class { h?.abort(); } catch {} }, { signal: t }); - }, this._panelAC?.signal ? { signal: this._panelAC.signal } : void 0), o.appendChild(s), o.appendChild(c), o.appendChild(u), f && o.appendChild(f), m && o.appendChild(m), o.appendChild(U("A", "left")), o.appendChild(U("B", "right")), this._contentEl.appendChild(o); + }, this._panelAC?.signal ? { signal: this._panelAC.signal } : void 0), o.appendChild(s), o.appendChild(c), o.appendChild(u), f && o.appendChild(f), m && o.appendChild(m), o.appendChild(H("A", "left")), o.appendChild(H("B", "right")), this._contentEl.appendChild(o); } _renderSide() { - let e = this._mediaA ? W(this._mediaA) : null, t = this._mediaB ? W(this._mediaB, { controls: !1 }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t, i = this._mediaA ? V(this._mediaA) : "", a = this._mediaB ? V(this._mediaB) : ""; + let e = this._mediaA ? U(this._mediaA) : null, t = this._mediaB ? U(this._mediaB, { controls: !1 }) : null, n = this._trackMediaControls?.(e) || e, r = this._trackMediaControls?.(t) || t, i = this._mediaA ? B(this._mediaA) : "", a = this._mediaB ? B(this._mediaB) : ""; if (!n && !r) { - this._contentEl.appendChild(H("Select 2 assets for Side-by-Side")); + this._contentEl.appendChild(V("Select 2 assets for Side-by-Side")); return; } let o = document.createElement("div"); o.className = "mjr-mfv-side-container"; let s = document.createElement("div"); - s.className = "mjr-mfv-side-panel", n ? s.appendChild(n) : s.appendChild(H(" - ")), s.appendChild(U("A", "left")); + s.className = "mjr-mfv-side-panel", n ? s.appendChild(n) : s.appendChild(V(" - ")), s.appendChild(H("A", "left")); let c = i === "audio" ? null : this._buildGenInfoDOM(this._mediaA); if (c) { let e = document.createElement("div"); - e.className = "mjr-mfv-geninfo-a", Tr(n) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(c), s.appendChild(e); + e.className = "mjr-mfv-geninfo-a", $(n) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(c), s.appendChild(e); } let l = document.createElement("div"); - l.className = "mjr-mfv-side-panel", r ? l.appendChild(r) : l.appendChild(H(" - ")), l.appendChild(U("B", "right")); + l.className = "mjr-mfv-side-panel", r ? l.appendChild(r) : l.appendChild(V(" - ")), l.appendChild(H("B", "right")); let u = a === "audio" ? null : this._buildGenInfoDOM(this._mediaB); if (u) { let e = document.createElement("div"); - e.className = "mjr-mfv-geninfo-b", Tr(r) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(u), l.appendChild(e); + e.className = "mjr-mfv-geninfo-b", $(r) && e.classList.add("mjr-mfv-geninfo--above-player"), e.appendChild(u), l.appendChild(e); } o.appendChild(s), o.appendChild(l), this._contentEl.appendChild(o); } @@ -4129,7 +4155,7 @@ var Er = 0, Dr = class { } ]; if (!e.filter((e) => e.media).length) { - this._contentEl.appendChild(H("Select up to 4 assets for Grid Compare")); + this._contentEl.appendChild(V("Select up to 4 assets for Grid Compare")); return; } let t = document.createElement("div"); @@ -4137,15 +4163,15 @@ var Er = 0, Dr = class { for (let { media: n, label: r } of e) { let e = document.createElement("div"); if (e.className = "mjr-mfv-grid-cell", n) { - let t = V(n), i = W(n, { controls: r === "A" }), a = this._trackMediaControls?.(i) || i; - if (a ? e.appendChild(a) : e.appendChild(H(" - ")), e.appendChild(U(r, r === "A" || r === "C" ? "left" : "right")), t !== "audio") { + let t = B(n), i = U(n, { controls: r === "A" }), a = this._trackMediaControls?.(i) || i; + if (a ? e.appendChild(a) : e.appendChild(V(" - ")), e.appendChild(H(r, r === "A" || r === "C" ? "left" : "right")), t !== "audio") { let t = this._buildGenInfoDOM(n); if (t) { let n = document.createElement("div"); - n.className = `mjr-mfv-geninfo-${r.toLowerCase()}`, Tr(a) && n.classList.add("mjr-mfv-geninfo--above-player"), n.appendChild(t), e.appendChild(n); + n.className = `mjr-mfv-geninfo-${r.toLowerCase()}`, $(a) && n.classList.add("mjr-mfv-geninfo--above-player"), n.appendChild(t), e.appendChild(n); } } - } else e.appendChild(H(" - ")), e.appendChild(U(r, r === "A" || r === "C" ? "left" : "right")); + } else e.appendChild(V(" - ")), e.appendChild(H(r, r === "A" || r === "C" ? "left" : "right")); t.appendChild(e); } this._contentEl.appendChild(t); @@ -4154,76 +4180,76 @@ var Er = 0, Dr = class { this.element && (this._bindDocumentUiHandlers(), this.element.classList.add("is-visible"), this.element.setAttribute("aria-hidden", "false"), this.isVisible = !0); } hide() { - this.element && (this._destroyPanZoom(), this._destroyCompareSync(), this._stopEdgeResize(), this._closeGenDropdown(), Ee(this.element), this.element.classList.remove("is-visible"), this.element.setAttribute("aria-hidden", "true"), this.isVisible = !1); + this.element && (this._destroyPanZoom(), this._destroyCompareSync(), this._stopEdgeResize(), this._closeGenDropdown(), Ie(this.element), this.element.classList.remove("is-visible"), this.element.setAttribute("aria-hidden", "true"), this.isVisible = !1); } _setDesktopExpanded(e) { - return $n(this, e); + return hr(this, e); } _activateDesktopExpandedFallback(e) { - return er(this, e); + return gr(this, e); } _tryElectronPopupFallback(e, t, n, r) { - return tr(this, e, t, n, r); + return _r(this, e, t, n, r); } popOut() { - return nr(this); + return vr(this); } _fallbackPopout(e, t, n) { - return rr(this, e, t, n); + return yr(this, e, t, n); } _clearPopoutCloseWatch() { - return ir(this); + return br(this); } _startPopoutCloseWatch() { - return ar(this); + return xr(this); } _schedulePopInFromPopupClose() { - return or(this); + return Sr(this); } _installPopoutStyles(e) { - return sr(this, e); + return Cr(this, e); } popIn(e) { - return cr(this, e); + return wr(this, e); } _updatePopoutBtnUI() { - return lr(this); + return Tr(this); } get isPopped() { return this._isPopped || this._desktopExpanded; } _resizeCursorForDirection(e) { - return ur(e); + return Er(e); } _getResizeDirectionFromPoint(e, t, n) { - return dr(e, t, n); + return Dr(e, t, n); } _stopEdgeResize() { - return fr(this); + return Or(this); } _bindPanelInteractions() { - return pr(this); + return kr(this); } _initEdgeResize(e) { - return mr(this, e); + return Ar(this, e); } _initDrag(e) { - return hr(this, e); + return jr(this, e); } async _drawMediaFit(e, t, n, r, i, a, o) { - return gr(this, e, t, n, r, i, a, o); + return Mr(this, e, t, n, r, i, a, o); } _estimateGenInfoOverlayHeight(e, t, n) { - return _r(this, e, t, n); + return Nr(this, e, t, n); } _drawGenInfoOverlay(e, t, n, r, i, a) { - return vr(this, e, t, n, r, i, a); + return Pr(this, e, t, n, r, i, a); } async _captureView() { - return yr(this); + return Fr(this); } dispose() { - C(this), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), this._unbindLayoutObserver(), this._stopEdgeResize(), this._clearPopoutCloseWatch(); + M(this), this._destroyPanZoom(), this._destroyCompareSync(), this._destroyMediaControls(), this._unbindLayoutObserver(), this._stopEdgeResize(), this._clearPopoutCloseWatch(); try { this._panelAC?.abort(), this._panelAC = null; } catch (e) { @@ -4280,4 +4306,4 @@ var Er = 0, Dr = class { } }; //#endregion -export { Dr as FloatingViewer }; +export { Hr as FloatingViewer }; diff --git a/dist/chunks/LiveStreamTracker-FHT3u-OV.js b/dist/chunks/LiveStreamTracker-mAm9Jo6q.js similarity index 96% rename from dist/chunks/LiveStreamTracker-FHT3u-OV.js rename to dist/chunks/LiveStreamTracker-mAm9Jo6q.js index 5e0223bd..bdf85026 100644 --- a/dist/chunks/LiveStreamTracker-FHT3u-OV.js +++ b/dist/chunks/LiveStreamTracker-mAm9Jo6q.js @@ -1,5 +1,5 @@ -import { u as e } from "./hostAdapter-D6BwD-lN.js"; -import { t } from "./floatingViewerManager-Oat0dyM2.js"; +import { R as e } from "./config-Cxv7acF8.js"; +import { t } from "./floatingViewerManager-BSQ_h48I.js"; import { r as n } from "./events-BnkL6-b6.js"; //#region ui/features/viewer/LiveStreamTracker.ts var r = !1, i = null, a = null, o = null, s = null, c = null, l = 0, u = 0, d = 400, f = new Set([ diff --git a/dist/chunks/NodeStreamController-_rtriits.js b/dist/chunks/NodeStreamController-EQygLyLg.js similarity index 99% rename from dist/chunks/NodeStreamController-_rtriits.js rename to dist/chunks/NodeStreamController-EQygLyLg.js index 96a8a425..3ac2a587 100644 --- a/dist/chunks/NodeStreamController-_rtriits.js +++ b/dist/chunks/NodeStreamController-EQygLyLg.js @@ -1,4 +1,4 @@ -import { a as e, n as t, r as n, s as r } from "./graphTraversal-HdtD9lDa.js"; +import { a as e, n as t, r as n, s as r } from "./graphTraversal-CjIZsRsP.js"; import { KnownNodesAdapter as i, t as a } from "./KnownNodesAdapter-Csi3_LhH.js"; //#region ui/features/viewer/nodeStream/NodeStreamRegistry.ts var o = [], s = !1; diff --git a/dist/chunks/SidebarWorkflowSection-CxD2u7Bb.js b/dist/chunks/SidebarWorkflowSection-na0bq_pe.js similarity index 58% rename from dist/chunks/SidebarWorkflowSection-CxD2u7Bb.js rename to dist/chunks/SidebarWorkflowSection-na0bq_pe.js index 6d8b9f8d..376d23be 100644 --- a/dist/chunks/SidebarWorkflowSection-CxD2u7Bb.js +++ b/dist/chunks/SidebarWorkflowSection-na0bq_pe.js @@ -1,10 +1,10 @@ -import { $t as e, B as t, Bt as n, Dt as r, Et as i, F as a, Ft as o, G as s, Gt as c, I as l, It as u, Kt as d, L as f, Lt as p, M as m, N as h, Ot as g, P as _, Pt as v, R as y, Rt as b, S as x, U as S, V as C, Vt as w, W as T, Wt as E, Yt as ee, _t as D, at as te, bt as ne, ct as re, dt as ie, en as ae, ft as oe, gt as se, i as ce, it as O, k, lt as le, nt as ue, ot as de, pt as fe, r as pe, rt as me, st as he, ut as ge, vt as _e, wt as ve, xt as ye, z as be, zt as xe } from "./hostAdapter-D6BwD-lN.js"; -import { m as Se, n as A, t as j } from "./config-dvcltBqE.js"; -import { B as Ce, C as we, D as Te, E as Ee, F as M, H as De, L as N, M as Oe, N as ke, S as P, T as F, U as Ae, Z as I, _ as je, a as Me, at as L, c as Ne, d as Pe, f as Fe, g as Ie, h as Le, i as Re, it as ze, l as Be, m as Ve, n as He, o as Ue, ot as R, p as We, r as Ge, rt as Ke, s as qe, t as Je, u as Ye, v as Xe, w as z, x as B, y as V, z as Ze } from "./mjr-primevue-DeVPqKdl.js"; -import { n as Qe, r as $e, t as et } from "./mjr-vue-vendor--o0qJuos.js"; -import { a as tt, i as nt, n as rt, o as it, r as at, t as ot } from "./geninfoParser-BE5lWeGw.js"; +import { $ as e, A as t, C as n, D as r, E as i, Et as a, F as o, J as s, K as c, N as l, O as u, P as d, Q as f, S as p, T as m, Tt as h, X as g, Y as _, Z as v, _t as y, ct as b, dt as x, et as S, f as C, gt as w, j as T, k as E, mt as ee, nt as te, ot as ne, q as re, rt as ie, st as ae, t as oe, tt as se, ut as ce, vt as D, w as O, y as le } from "./client-DZE_lzdb.js"; +import { C as ue, I as de, T as fe, a as pe, c as me, i as he, l as k, m as ge, n as A, nt as _e, o as ve, r as ye, s as be, t as j, u as xe, x as Se, y as Ce } from "./config-Cxv7acF8.js"; +import { B as we, C as Te, D as Ee, E as De, F as M, H as Oe, L as N, M as ke, N as Ae, S as P, T as F, U as je, Y as Me, Z as I, _ as Ne, a as Pe, at as L, c as Fe, d as Ie, f as Le, g as Re, h as ze, i as Be, it as Ve, l as He, m as Ue, n as We, o as Ge, ot as R, p as Ke, r as qe, rt as z, s as Je, t as Ye, u as Xe, v as Ze, w as B, x as V, y as H, z as Qe } from "./mjr-primevue-DeVPqKdl.js"; +import { n as $e, r as et, t as tt } from "./mjr-vue-vendor--o0qJuos.js"; +import { a as nt, i as rt, n as it, o as at, r as ot, t as st } from "./geninfoParser-5vKgjqjD.js"; //#region ui/utils/events.ts -function st(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { +function ct(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { let i = n || (typeof window < "u" ? window : null); if (!i || typeof i.dispatchEvent != "function") return !1; try { @@ -20,7 +20,7 @@ function st(e, t, { target: n = null, warnPrefix: r = "[Majoor]" } = {}) { } //#endregion //#region ui/app/settings/settingsUtils.ts -var H = (e, t) => { +var U = (e, t) => { if (typeof e == "boolean") return e; if (typeof e == "string") { let t = e.trim().toLowerCase(); @@ -38,39 +38,39 @@ var H = (e, t) => { ].includes(t)) return !1; } return !!t; -}, U = (e, t) => { +}, W = (e, t) => { let n = Number(e); return Number.isFinite(n) ? n : Number(t); -}, ct = (e, t, n) => { +}, lt = (e, t, n) => { let r = typeof e == "string" ? e.trim() : String(e ?? ""); return t.includes(r) ? r : n; -}, lt = (e) => e === "__proto__" || e === "prototype" || e === "constructor", ut = (e, t) => { +}, ut = (e) => e === "__proto__" || e === "prototype" || e === "constructor", dt = (e, t) => { let n = { ...e }; return !t || typeof t != "object" || Object.keys(t).forEach((r) => { - if (lt(r)) return; + if (ut(r)) return; let i = t[r]; - i && typeof i == "object" && !Array.isArray(i) ? n[r] = ut(e[r] || {}, i) : i !== void 0 && (n[r] = i); + i && typeof i == "object" && !Array.isArray(i) ? n[r] = dt(e[r] || {}, i) : i !== void 0 && (n[r] = i); }), n; -}, dt = Object.freeze({ +}, ft = Object.freeze({ small: 80, medium: 120, large: 180 -}), ft = Object.freeze([ +}), pt = Object.freeze([ "small", "medium", "large" -]), pt = (e, t) => Math.max(60, Math.min(600, Math.round(U(e, t)))), mt = (e = {}) => { +]), mt = (e, t) => Math.max(60, Math.min(600, Math.round(W(e, t)))), ht = (e = {}) => { let t = Number(e?.minSize); - if (Number.isFinite(t)) return pt(t, A.GRID_MIN_SIZE); - let n = ct(String(e?.minSizePreset || "").toLowerCase(), ft, ""); - return n ? dt[n] : pt(e?.minSize, A.GRID_MIN_SIZE); -}, ht = (e = {}) => pt(e?.minSize, A.FEED_GRID_MIN_SIZE), gt = (e) => { - let t = Math.round(U(e, A.GRID_MIN_SIZE)); + if (Number.isFinite(t)) return mt(t, A.GRID_MIN_SIZE); + let n = lt(String(e?.minSizePreset || "").toLowerCase(), pt, ""); + return n ? ft[n] : mt(e?.minSize, A.GRID_MIN_SIZE); +}, gt = (e = {}) => mt(e?.minSize, A.FEED_GRID_MIN_SIZE), _t = (e) => { + let t = Math.round(W(e, A.GRID_MIN_SIZE)); return t <= 100 ? "small" : t >= 150 ? "large" : "medium"; -}, _t = async (e, t = "Majoor", r = {}) => { - let i = xt(); - if (i && typeof i.alert == "function") try { - await i.alert({ +}, vt = async (e, t = "Majoor", n = {}) => { + let r = St(); + if (r && typeof r.alert == "function") try { + await r.alert({ title: String(t || "Majoor"), message: String(e || "") }); @@ -78,10 +78,10 @@ var H = (e, t) => { } catch (e) { console.debug?.(e); } - let a = St(); - if (a) try { + let i = Ct(); + if (i) try { let n = String(e || ""); - typeof a.addAlert == "function" ? a.addAlert(n) : a.add({ + typeof i.addAlert == "function" ? i.addAlert(n) : i.add({ severity: "info", summary: String(t || "Majoor"), detail: n, @@ -91,10 +91,10 @@ var H = (e, t) => { } catch (e) { console.debug?.(e); } - if (r?.native !== !1) { - let n = Ct(); + if (n?.native !== !1) { + let n = wt(); if (n) try { - n.show(wt(e, t)); + n.show(Tt(e, t)); try { n.element?.style?.setProperty?.("z-index", "1100"); } catch (e) { @@ -105,8 +105,8 @@ var H = (e, t) => { console.debug?.(e); } } - let o = kt(); - if (!o) { + let a = At(); + if (!a) { try { window.alert(e); } catch (e) { @@ -114,20 +114,20 @@ var H = (e, t) => { } return; } - return new Promise((r) => { - let i = new o(); - Nt(i); - let a = W("div", { style: { + return new Promise((n) => { + let r = new a(); + Pt(r); + let i = G("div", { style: { display: "flex", flexDirection: "column", gap: "18px", padding: "18px 20px 18px 20px" } }, [ - W("div", { style: { + G("div", { style: { display: "flex", alignItems: "center", justifyContent: "flex-start" - } }, [W("div", { + } }, [G("div", { textContent: t, style: { fontWeight: "700", @@ -136,7 +136,7 @@ var H = (e, t) => { lineHeight: "1.2" } })]), - W("div", { + G("div", { textContent: String(e || ""), style: { fontSize: "22px", @@ -145,19 +145,19 @@ var H = (e, t) => { lineHeight: "1.45" } }), - W("div", { style: { + G("div", { style: { display: "flex", justifyContent: "flex-end", gap: "10px" - } }, [W("button", { - textContent: n("dialog.confirm", "Confirm"), + } }, [G("button", { + textContent: k("dialog.confirm", "Confirm"), onclick: () => { try { - i.close(); + r.close(); } catch (e) { console.debug?.(e); } - r(); + n(); }, style: { padding: "10px 16px", @@ -171,54 +171,54 @@ var H = (e, t) => { })]) ]); try { - i.show(a), setTimeout(() => Pt(i), 0); + r.show(i), setTimeout(() => Ft(r), 0); } catch { try { window.alert(e); } catch (e) { console.debug?.(e); } - r(); + n(); } }); -}, vt = async (e, t = "Majoor") => { - let r = xt(); - if (r) try { - let i = { - title: String(t || n("dialog.confirm", "Confirm")), +}, yt = async (e, t = "Majoor") => { + let n = St(); + if (n) try { + let r = { + title: String(t || k("dialog.confirm", "Confirm")), message: String(e || "") }; - return !!(typeof r.confirm == "function" && await r.confirm(i)); + return !!(typeof n.confirm == "function" && await n.confirm(r)); } catch (e) { console.debug?.(e); } - let i = kt(); - if (!i) try { + let r = At(); + if (!r) try { return window.confirm(e); } catch { return !1; } - return new Promise((r) => { - let a = new i(); - Nt(a); - let o = (e) => { + return new Promise((n) => { + let i = new r(); + Pt(i); + let a = (e) => { try { - a.close(); + i.close(); } catch (e) { console.debug?.(e); } - r(!!e); - }, s = W("div", { style: { + n(!!e); + }, o = G("div", { style: { display: "flex", flexDirection: "column", gap: "18px", padding: "18px 20px 18px 20px" } }, [ - W("div", { style: { + G("div", { style: { display: "flex", alignItems: "center", justifyContent: "flex-start" - } }, [W("div", { + } }, [G("div", { textContent: t, style: { fontWeight: "700", @@ -227,7 +227,7 @@ var H = (e, t) => { lineHeight: "1.2" } })]), - W("div", { + G("div", { textContent: String(e || ""), style: { fontSize: "22px", @@ -236,13 +236,13 @@ var H = (e, t) => { lineHeight: "1.45" } }), - W("div", { style: { + G("div", { style: { display: "flex", justifyContent: "flex-end", gap: "10px" - } }, [W("button", { - textContent: n("dialog.cancel", "Cancel"), - onclick: () => o(!1), + } }, [G("button", { + textContent: k("dialog.cancel", "Cancel"), + onclick: () => a(!1), style: { padding: "10px 16px", borderRadius: "10px", @@ -252,9 +252,9 @@ var H = (e, t) => { fontWeight: "600", cursor: "pointer" } - }), W("button", { - textContent: n("dialog.confirm", "Confirm"), - onclick: () => o(!0), + }), G("button", { + textContent: k("dialog.confirm", "Confirm"), + onclick: () => a(!0), style: { padding: "10px 16px", borderRadius: "10px", @@ -267,44 +267,44 @@ var H = (e, t) => { })]) ]); try { - a.show(s), setTimeout(() => Pt(a), 0); + i.show(o), setTimeout(() => Ft(i), 0); } catch { try { - r(!!window.confirm(e)); + n(!!window.confirm(e)); } catch { - r(!1); + n(!1); } } }); -}, yt = async (e, t = "", r = "Majoor") => { - let i = xt(); - if (i) try { - let a = { - title: String(r || n("dialog.prompt", "Prompt")), +}, bt = async (e, t = "", n = "Majoor") => { + let r = St(); + if (r) try { + let i = { + title: String(n || k("dialog.prompt", "Prompt")), message: String(e || ""), defaultValue: String(t ?? "") - }, o = typeof i.prompt == "function" ? await i.prompt(a) : null; - return o == null ? null : String(o); + }, a = typeof r.prompt == "function" ? await r.prompt(i) : null; + return a == null ? null : String(a); } catch (e) { console.debug?.(e); } - let a = kt(); - if (!a) try { + let i = At(); + if (!i) try { return window.prompt(e, t); } catch { return null; } - return new Promise((i) => { - let o = new a(); - Nt(o); - let s = (e) => { + return new Promise((r) => { + let a = new i(); + Pt(a); + let o = (e) => { try { - o.close(); + a.close(); } catch (e) { console.debug?.(e); } - i(e ?? null); - }, c = W("input", { + r(e ?? null); + }, s = G("input", { type: "text", value: String(t ?? ""), style: { @@ -318,23 +318,23 @@ var H = (e, t) => { boxSizing: "border-box" }, onkeydown: (e) => { - e.key === "Enter" && s(c.value), e.key === "Escape" && s(null), e.stopPropagation(); + e.key === "Enter" && o(s.value), e.key === "Escape" && o(null), e.stopPropagation(); } - }), l = W("div", { style: { + }), c = G("div", { style: { display: "flex", flexDirection: "column", gap: "12px", padding: "16px" } }, [ - W("div", { - textContent: r, + G("div", { + textContent: n, style: { fontWeight: "600", fontSize: "14px", color: "rgba(255,255,255,0.95)" } }), - W("div", { + G("div", { textContent: String(e || ""), style: { fontSize: "13px", @@ -343,14 +343,14 @@ var H = (e, t) => { lineHeight: "1.4" } }), - c, - W("div", { style: { + s, + G("div", { style: { display: "flex", justifyContent: "flex-end", gap: "10px" - } }, [W("button", { - textContent: n("dialog.cancel", "Cancel"), - onclick: () => s(null), + } }, [G("button", { + textContent: k("dialog.cancel", "Cancel"), + onclick: () => o(null), style: { padding: "8px 12px", borderRadius: "8px", @@ -359,9 +359,9 @@ var H = (e, t) => { color: "rgba(255,255,255,0.85)", cursor: "pointer" } - }), W("button", { - textContent: n("dialog.ok", "OK"), - onclick: () => s(c.value), + }), G("button", { + textContent: k("dialog.ok", "OK"), + onclick: () => o(s.value), style: { padding: "8px 12px", borderRadius: "8px", @@ -373,68 +373,56 @@ var H = (e, t) => { })]) ]); try { - o.show(l), setTimeout(() => Pt(o), 0), setTimeout(() => { + a.show(c), setTimeout(() => Ft(a), 0), setTimeout(() => { try { - c.focus(), c.select(); + s.focus(), s.select(); } catch (e) { console.debug?.(e); } }, 0); } catch { try { - i(window.prompt(e, t)); + r(window.prompt(e, t)); } catch { - i(null); + r(null); } } }); -}, bt = () => { +}, xt = () => { try { - return E()?.ui || null; + return fe()?.ui || null; } catch { return null; } -}, xt = () => { +}, St = () => { let e = (e) => !!e && (typeof e.alert == "function" || typeof e.confirm == "function" || typeof e.prompt == "function"); try { - let t = c(E()); + let t = Se(); if (e(t)) return t; } catch (e) { console.debug?.(e); } - try { - let t = (typeof window < "u" ? window?.app : null)?.extensionManager?.dialog || null; - if (e(t)) return t; - } catch (e) { - console.debug?.(e); - } - return null; -}, St = () => { - try { - let e = d(E()); - if (e && typeof e.add == "function") return e; - } catch (e) { - console.debug?.(e); - } - try { - let e = (typeof window < "u" ? window?.app : null)?.extensionManager?.toast || null; - if (e && typeof e.add == "function") return e; - } catch (e) { - console.debug?.(e); - } return null; }, Ct = () => { try { - let e = bt(); + let e = ue(); + if (e && typeof e.add == "function") return e; + } catch (e) { + console.debug?.(e); + } + return null; +}, wt = () => { + try { + let e = xt(); if (e?.dialog && typeof e.dialog.show == "function") return e.dialog; } catch (e) { console.debug?.(e); } return null; -}, wt = (e, t = "Majoor") => { +}, Tt = (e, t = "Majoor") => { let n = String(e ?? ""), r = String(t ?? "").trim(); return !r || r.toLowerCase() === "majoor" ? n : `${r}

${n}`; -}, Tt = new Set(/* @__PURE__ */ "abort.blur.change.click.close.contextmenu.dblclick.dragend.dragenter.dragleave.dragover.dragstart.drop.error.focus.input.keydown.keypress.keyup.load.mousedown.mouseenter.mouseleave.mousemove.mouseout.mouseover.mouseup.reset.resize.scroll.select.submit.touchcancel.touchend.touchmove.touchstart.transitionend.unload.wheel".split(".")), Et = new Set([ +}, Et = new Set(/* @__PURE__ */ "abort.blur.change.click.close.contextmenu.dblclick.dragend.dragenter.dragleave.dragover.dragstart.drop.error.focus.input.keydown.keypress.keyup.load.mousedown.mouseenter.mouseleave.mousemove.mouseout.mouseover.mouseup.reset.resize.scroll.select.submit.touchcancel.touchend.touchmove.touchstart.transitionend.unload.wheel".split(".")), Dt = new Set([ "__proto__", "constructor", "prototype", @@ -445,7 +433,7 @@ var H = (e, t) => { "__defineSetter__", "__lookupGetter__", "__lookupSetter__" -]), Dt = new Set([ +]), Ot = new Set([ "id", "name", "value", @@ -458,11 +446,11 @@ var H = (e, t) => { "htmlFor", "role", "tabIndex" -]), Ot = (e, t = {}, n = []) => { +]), kt = (e, t = {}, n = []) => { let r = document.createElement(e); return Object.entries(t || {}).forEach(([e, t]) => { let n = String(e || ""); - if (!(!n || Et.has(n))) { + if (!(!n || Dt.has(n))) { if (e === "style" && t && typeof t == "object") { Object.assign(r.style, t); return; @@ -474,11 +462,11 @@ var H = (e, t) => { if (n.startsWith("on")) { if (typeof t == "function") { let e = n.slice(2).toLowerCase(); - Tt.has(e) && r.addEventListener(e, t); + Et.has(e) && r.addEventListener(e, t); } return; } - if (Dt.has(n)) try { + if (Ot.has(n)) try { r[n] = t; return; } catch (e) { @@ -497,19 +485,19 @@ var H = (e, t) => { r.appendChild(document.createTextNode(String(e))); } }), r; -}, W = (e, t, n) => { - let r = bt(); +}, G = (e, t, n) => { + let r = xt(); if (r?.$el) try { return r.$el(e, t, n); } catch {} - return Ot(e, t, n); -}, kt = () => bt()?.ComfyDialog || null, At = 999999, jt = 560, Mt = 12, Nt = (e) => { + return kt(e, t, n); +}, At = () => xt()?.ComfyDialog || null, jt = 999999, Mt = 560, Nt = 12, Pt = (e) => { try { - e.element.style.zIndex = String(At), e.element.style.width = `${jt}px`, e.element.style.padding = "0", e.element.style.backgroundColor = "var(--comfy-menu-bg, #131722)", e.element.style.border = "1px solid rgba(255,255,255,0.14)", e.element.style.borderRadius = `${Mt}px`, e.element.style.boxSizing = "border-box", e.element.style.overflow = "hidden", e.element.style.boxShadow = "0 18px 48px rgba(0,0,0,0.48)"; + e.element.style.zIndex = String(jt), e.element.style.width = `${Mt}px`, e.element.style.padding = "0", e.element.style.backgroundColor = "var(--comfy-menu-bg, #131722)", e.element.style.border = "1px solid rgba(255,255,255,0.14)", e.element.style.borderRadius = `${Nt}px`, e.element.style.boxSizing = "border-box", e.element.style.overflow = "hidden", e.element.style.boxShadow = "0 18px 48px rgba(0,0,0,0.48)"; } catch (e) { console.debug?.(e); } -}, Pt = (e) => { +}, Ft = (e) => { try { let t = e?.element; if (!t) return; @@ -525,7 +513,7 @@ var H = (e, t) => { } catch (e) { console.debug?.(e); } -}, G = { +}, K = { debug: { safeCall: A.DEBUG_SAFE_CALL, safeListeners: A.DEBUG_SAFE_LISTENERS, @@ -672,26 +660,26 @@ var H = (e, t) => { tokenConfigured: !1, tokenHint: "" } -}, K = () => { +}, q = () => { try { - let e = w.get(ae); - if (!e) return { ...G }; + let e = xe.get(a); + if (!e) return { ...K }; 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 { ...G }; - if (n && Number(t.version) > 1) return console.warn("[Majoor] settings schema version is newer than this build, using defaults"), { ...G }; - let r = n ? t.data : t, i = 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 = ut(G, a); + if (!n && !(t && typeof t == "object" && !Array.isArray(t))) return { ...K }; + if (n && Number(t.version) > 1) return console.warn("[Majoor] settings schema version is newer than this build, using defaults"), { ...K }; + let r = n ? t.data : t, i = 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(".")), o = {}; + if (r && typeof r == "object") for (let [e, t] of Object.entries(r)) i.has(e) && (o[e] = t); + let s = dt(K, o); if (!n) try { - q(o); + J(s); } catch (e) { console.debug?.(e); } - return o; + return s; } catch (e) { - return console.warn("[Majoor] settings load failed, using defaults", e), { ...G }; + return console.warn("[Majoor] settings load failed, using defaults", e), { ...K }; } -}, q = (e) => { +}, J = (e) => { try { let t = JSON.parse(JSON.stringify(e || {})); t?.security && typeof t.security == "object" && (t.security.apiToken = ""); @@ -699,24 +687,24 @@ var H = (e, t) => { version: 1, data: t }; - if (!w.set("mjrSettings", JSON.stringify(n))) throw Error("SettingsStore rejected the write"); + if (!xe.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, _t(n("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked)."))); + e - (Number(window?._mjrSettingsSaveFailAt || 0) || 0) > 3e4 && (window._mjrSettingsSaveFailAt = e, vt(k("dialog.settingsSaveFailed", "Majoor: Failed to save settings (browser storage full or blocked)."))); } catch (e) { console.debug?.(e); } try { - st("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); + ct("mjr-settings-save-failed", { error: String(e?.message || e || "") }, { warnPrefix: "[Majoor]" }); } catch (e) { console.debug?.(e); } } -}, J = (e) => { +}, Y = (e) => { let t = Number(A.MAX_PAGE_SIZE) || 2e3; - j.DEFAULT_PAGE_SIZE = Math.max(50, Math.min(t, Number(e.grid?.pageSize) || A.DEFAULT_PAGE_SIZE)), j.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, j.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), j.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || A.STATUS_POLL_INTERVAL), j.DEBUG_SAFE_CALL = !!e.debug?.safeCall, j.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, j.DEBUG_VIEWER = !!e.debug?.viewer, j.GRID_MIN_SIZE = mt(e.grid), j.FEED_GRID_MIN_SIZE = ht(e.feed), j.GRID_GAP = Math.max(0, Math.min(40, Math.round(U(e.grid?.gap, A.GRID_GAP)))), j.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? A.GRID_SHOW_BADGES_EXTENSION), j.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? A.GRID_SHOW_BADGES_RATING), j.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? A.GRID_SHOW_BADGES_TAGS), j.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? A.GRID_SHOW_DETAILS), j.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? A.GRID_SHOW_DETAILS_FILENAME), j.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? A.GRID_SHOW_DETAILS_DATE), j.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? A.GRID_SHOW_DETAILS_DIMENSIONS), j.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? A.GRID_SHOW_DETAILS_GENTIME), j.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? A.GRID_SHOW_HOVER_INFO), j.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? A.GRID_SHOW_WORKFLOW_DOT), j.FEED_SHOW_INFO = !!(e.feed?.showInfo ?? A.FEED_SHOW_INFO), j.FEED_SHOW_FILENAME = !!(e.feed?.showFilename ?? A.FEED_SHOW_FILENAME), j.FEED_SHOW_DIMENSIONS = !!(e.feed?.showDimensions ?? A.FEED_SHOW_DIMENSIONS), j.FEED_SHOW_DATE = !!(e.feed?.showDate ?? A.FEED_SHOW_DATE), j.FEED_SHOW_GENTIME = !!(e.feed?.showGenTime ?? A.FEED_SHOW_GENTIME), j.FEED_SHOW_WORKFLOW_DOT = !!(e.feed?.showWorkflowDot ?? A.FEED_SHOW_WORKFLOW_DOT), j.FEED_SHOW_BADGES_EXTENSION = !!(e.feed?.showExtBadge ?? A.FEED_SHOW_BADGES_EXTENSION), j.FEED_SHOW_BADGES_RATING = !!(e.feed?.showRatingBadge ?? A.FEED_SHOW_BADGES_RATING), j.FEED_SHOW_BADGES_TAGS = !!(e.feed?.showTagsBadge ?? A.FEED_SHOW_BADGES_TAGS); + j.DEFAULT_PAGE_SIZE = Math.max(50, Math.min(t, Number(e.grid?.pageSize) || A.DEFAULT_PAGE_SIZE)), j.AUTO_SCAN_ON_STARTUP = !!e.autoScan?.onStartup, j.EXECUTION_GROUPING_ENABLED = !!(e.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), j.STATUS_POLL_INTERVAL = Math.max(1e3, Number(e.status?.pollInterval) || A.STATUS_POLL_INTERVAL), j.DEBUG_SAFE_CALL = !!e.debug?.safeCall, j.DEBUG_SAFE_LISTENERS = !!e.debug?.safeListeners, j.DEBUG_VIEWER = !!e.debug?.viewer, j.GRID_MIN_SIZE = ht(e.grid), j.FEED_GRID_MIN_SIZE = gt(e.feed), j.GRID_GAP = Math.max(0, Math.min(40, Math.round(W(e.grid?.gap, A.GRID_GAP)))), j.GRID_SHOW_BADGES_EXTENSION = !!(e.grid?.showExtBadge ?? A.GRID_SHOW_BADGES_EXTENSION), j.GRID_SHOW_BADGES_RATING = !!(e.grid?.showRatingBadge ?? A.GRID_SHOW_BADGES_RATING), j.GRID_SHOW_BADGES_TAGS = !!(e.grid?.showTagsBadge ?? A.GRID_SHOW_BADGES_TAGS), j.GRID_SHOW_DETAILS = !!(e.grid?.showDetails ?? A.GRID_SHOW_DETAILS), j.GRID_SHOW_DETAILS_FILENAME = !!(e.grid?.showFilename ?? A.GRID_SHOW_DETAILS_FILENAME), j.GRID_SHOW_DETAILS_DATE = !!(e.grid?.showDate ?? A.GRID_SHOW_DETAILS_DATE), j.GRID_SHOW_DETAILS_DIMENSIONS = !!(e.grid?.showDimensions ?? A.GRID_SHOW_DETAILS_DIMENSIONS), j.GRID_SHOW_DETAILS_GENTIME = !!(e.grid?.showGenTime ?? A.GRID_SHOW_DETAILS_GENTIME), j.GRID_SHOW_HOVER_INFO = !!(e.grid?.showHoverInfo ?? A.GRID_SHOW_HOVER_INFO), j.GRID_SHOW_WORKFLOW_DOT = !!(e.grid?.showWorkflowDot ?? A.GRID_SHOW_WORKFLOW_DOT), j.FEED_SHOW_INFO = !!(e.feed?.showInfo ?? A.FEED_SHOW_INFO), j.FEED_SHOW_FILENAME = !!(e.feed?.showFilename ?? A.FEED_SHOW_FILENAME), j.FEED_SHOW_DIMENSIONS = !!(e.feed?.showDimensions ?? A.FEED_SHOW_DIMENSIONS), j.FEED_SHOW_DATE = !!(e.feed?.showDate ?? A.FEED_SHOW_DATE), j.FEED_SHOW_GENTIME = !!(e.feed?.showGenTime ?? A.FEED_SHOW_GENTIME), j.FEED_SHOW_WORKFLOW_DOT = !!(e.feed?.showWorkflowDot ?? A.FEED_SHOW_WORKFLOW_DOT), j.FEED_SHOW_BADGES_EXTENSION = !!(e.feed?.showExtBadge ?? A.FEED_SHOW_BADGES_EXTENSION), j.FEED_SHOW_BADGES_RATING = !!(e.feed?.showRatingBadge ?? A.FEED_SHOW_BADGES_RATING), j.FEED_SHOW_BADGES_TAGS = !!(e.feed?.showTagsBadge ?? A.FEED_SHOW_BADGES_TAGS); { let t = e.grid?.videoAutoplayMode ?? A.GRID_VIDEO_AUTOPLAY_MODE; t ??= e.grid?.videoHoverAutoplay === !1 ? "off" : "hover", t === !0 && (t = "hover"), t === !1 && (t = "off"), t !== "hover" && t !== "always" && t !== "off" && (t = "hover"), j.GRID_VIDEO_AUTOPLAY_MODE = t; @@ -732,7 +720,7 @@ var H = (e, t) => { } catch (e) { console.debug?.(e); } - j.INFINITE_SCROLL_ENABLED = !!e.infiniteScroll?.enabled, j.INFINITE_SCROLL_ROOT_MARGIN = String(e.infiniteScroll?.rootMargin || A.INFINITE_SCROLL_ROOT_MARGIN), j.INFINITE_SCROLL_THRESHOLD = Math.max(0, Math.min(1, U(e.infiniteScroll?.threshold, A.INFINITE_SCROLL_THRESHOLD))), j.BOTTOM_GAP_PX = Math.max(0, Math.min(5e3, Math.round(U(e.infiniteScroll?.bottomGapPx, A.BOTTOM_GAP_PX)))), j.VIEWER_ALLOW_PAN_AT_ZOOM_1 = !!e.viewer?.allowPanAtZoom1, j.VIEWER_DISABLE_WEBGL_VIDEO = !!e.viewer?.disableWebGL, j.VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.pauseDuringExecution ?? A.VIEWER_PAUSE_DURING_EXECUTION), j.FLOATING_VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.floatingPauseDuringExecution ?? A.FLOATING_VIEWER_PAUSE_DURING_EXECUTION), j.MFV_LIVE_DEFAULT = e.viewer?.mfvLiveDefault ?? A.MFV_LIVE_DEFAULT, j.MFV_PREVIEW_DEFAULT = e.viewer?.mfvPreviewDefault ?? A.MFV_PREVIEW_DEFAULT, j.MFV_LIVE_AUTO_OPEN = !1, j.MFV_PREVIEW_AUTO_OPEN = !1, j.MFV_NODE_STREAM_AUTO_OPEN = !1; + j.INFINITE_SCROLL_ENABLED = !!e.infiniteScroll?.enabled, j.INFINITE_SCROLL_ROOT_MARGIN = String(e.infiniteScroll?.rootMargin || A.INFINITE_SCROLL_ROOT_MARGIN), j.INFINITE_SCROLL_THRESHOLD = Math.max(0, Math.min(1, W(e.infiniteScroll?.threshold, A.INFINITE_SCROLL_THRESHOLD))), j.BOTTOM_GAP_PX = Math.max(0, Math.min(5e3, Math.round(W(e.infiniteScroll?.bottomGapPx, A.BOTTOM_GAP_PX)))), j.VIEWER_ALLOW_PAN_AT_ZOOM_1 = !!e.viewer?.allowPanAtZoom1, j.VIEWER_DISABLE_WEBGL_VIDEO = !!e.viewer?.disableWebGL, j.VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.pauseDuringExecution ?? A.VIEWER_PAUSE_DURING_EXECUTION), j.FLOATING_VIEWER_PAUSE_DURING_EXECUTION = !!(e.viewer?.floatingPauseDuringExecution ?? A.FLOATING_VIEWER_PAUSE_DURING_EXECUTION), j.MFV_LIVE_DEFAULT = e.viewer?.mfvLiveDefault ?? A.MFV_LIVE_DEFAULT, j.MFV_PREVIEW_DEFAULT = e.viewer?.mfvPreviewDefault ?? A.MFV_PREVIEW_DEFAULT, j.MFV_LIVE_AUTO_OPEN = !1, j.MFV_PREVIEW_AUTO_OPEN = !1, j.MFV_NODE_STREAM_AUTO_OPEN = !1; { let t = String(e.viewer?.mfvPreviewMethod || A.MFV_PREVIEW_METHOD).toLowerCase(); j.MFV_PREVIEW_METHOD = [ @@ -751,56 +739,56 @@ var H = (e, t) => { "bottom" ].includes(t) ? t : "right"; } - j.VIEWER_VIDEO_GRADE_THROTTLE_FPS = Math.max(1, Math.min(60, Math.round(U(e.viewer?.videoGradeThrottleFps, A.VIEWER_VIDEO_GRADE_THROTTLE_FPS)))), j.VIEWER_SCOPES_FPS = Math.max(1, Math.min(60, Math.round(U(e.viewer?.scopesFps, A.VIEWER_SCOPES_FPS)))), j.VIEWER_META_TTL_MS = Math.max(1e3, Math.min(10 * 6e4, Math.round(U(e.viewer?.metaTtlMs, A.VIEWER_META_TTL_MS)))), j.VIEWER_META_MAX_ENTRIES = Math.max(50, Math.min(5e3, Math.round(U(e.viewer?.metaMaxEntries, A.VIEWER_META_MAX_ENTRIES)))), j.WORKFLOW_MINIMAP_ENABLED = !!(e.workflowMinimap?.enabled ?? !1), j.RT_HYDRATE_CONCURRENCY = Math.max(1, Math.min(16, Math.round(U(e.rtHydrate?.concurrency, A.RT_HYDRATE_CONCURRENCY)))), j.RT_HYDRATE_QUEUE_MAX = Math.max(10, Math.min(5e3, Math.round(U(e.rtHydrate?.queueMax, A.RT_HYDRATE_QUEUE_MAX)))), j.RT_HYDRATE_SEEN_MAX = Math.max(1e3, Math.min(2e5, Math.round(U(e.rtHydrate?.seenMax, A.RT_HYDRATE_SEEN_MAX)))), j.RT_HYDRATE_PRUNE_BUDGET = Math.max(10, Math.min(1e4, Math.round(U(e.rtHydrate?.pruneBudget, A.RT_HYDRATE_PRUNE_BUDGET)))), j.RT_HYDRATE_SEEN_TTL_MS = Math.max(5e3, Math.min(360 * 6e4, Math.round(U(e.rtHydrate?.seenTtlMs, A.RT_HYDRATE_SEEN_TTL_MS)))), j.DELETE_CONFIRMATION = !!e.safety?.confirmDeletion, j.DEBUG_VERBOSE_ERRORS = !!e.observability?.verboseErrors, j.WATCHER_MAX_PENDING = Math.max(10, Math.min(5e3, Math.round(U(e.watcher?.maxPending, 500)))), j.WATCHER_MIN_SIZE = Math.max(0, Math.min(1e6, Math.round(U(e.watcher?.minSize, 100)))), j.WATCHER_MAX_SIZE = Math.max(1e5, Math.min(17179869184, Math.round(U(e.watcher?.maxSize, 4294967296)))), j.DB_TIMEOUT_MS = Math.max(1e3, Math.min(3e4, Math.round(U(e.db?.timeoutMs, 5e3)))), j.DB_MAX_CONNECTIONS = Math.max(1, Math.min(100, Math.round(U(e.db?.maxConnections, 10)))), j.DB_QUERY_TIMEOUT_MS = Math.max(500, Math.min(1e4, Math.round(U(e.db?.queryTimeoutMs, 1e3)))), j.SEARCH_REQUEST_LIMIT = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Math.round(U(e.search?.maxResults, A.SEARCH_DEFAULT_LIMIT)))); + j.VIEWER_VIDEO_GRADE_THROTTLE_FPS = Math.max(1, Math.min(60, Math.round(W(e.viewer?.videoGradeThrottleFps, A.VIEWER_VIDEO_GRADE_THROTTLE_FPS)))), j.VIEWER_SCOPES_FPS = Math.max(1, Math.min(60, Math.round(W(e.viewer?.scopesFps, A.VIEWER_SCOPES_FPS)))), j.VIEWER_META_TTL_MS = Math.max(1e3, Math.min(10 * 6e4, Math.round(W(e.viewer?.metaTtlMs, A.VIEWER_META_TTL_MS)))), j.VIEWER_META_MAX_ENTRIES = Math.max(50, Math.min(5e3, Math.round(W(e.viewer?.metaMaxEntries, A.VIEWER_META_MAX_ENTRIES)))), j.WORKFLOW_MINIMAP_ENABLED = !!(e.workflowMinimap?.enabled ?? !1), j.RT_HYDRATE_CONCURRENCY = Math.max(1, Math.min(16, Math.round(W(e.rtHydrate?.concurrency, A.RT_HYDRATE_CONCURRENCY)))), j.RT_HYDRATE_QUEUE_MAX = Math.max(10, Math.min(5e3, Math.round(W(e.rtHydrate?.queueMax, A.RT_HYDRATE_QUEUE_MAX)))), j.RT_HYDRATE_SEEN_MAX = Math.max(1e3, Math.min(2e5, Math.round(W(e.rtHydrate?.seenMax, A.RT_HYDRATE_SEEN_MAX)))), j.RT_HYDRATE_PRUNE_BUDGET = Math.max(10, Math.min(1e4, Math.round(W(e.rtHydrate?.pruneBudget, A.RT_HYDRATE_PRUNE_BUDGET)))), j.RT_HYDRATE_SEEN_TTL_MS = Math.max(5e3, Math.min(360 * 6e4, Math.round(W(e.rtHydrate?.seenTtlMs, A.RT_HYDRATE_SEEN_TTL_MS)))), j.DELETE_CONFIRMATION = !!e.safety?.confirmDeletion, j.DEBUG_VERBOSE_ERRORS = !!e.observability?.verboseErrors, j.WATCHER_MAX_PENDING = Math.max(10, Math.min(5e3, Math.round(W(e.watcher?.maxPending, 500)))), j.WATCHER_MIN_SIZE = Math.max(0, Math.min(1e6, Math.round(W(e.watcher?.minSize, 100)))), j.WATCHER_MAX_SIZE = Math.max(1e5, Math.min(17179869184, Math.round(W(e.watcher?.maxSize, 4294967296)))), j.DB_TIMEOUT_MS = Math.max(1e3, Math.min(3e4, Math.round(W(e.db?.timeoutMs, 5e3)))), j.DB_MAX_CONNECTIONS = Math.max(1, Math.min(100, Math.round(W(e.db?.maxConnections, 10)))), j.DB_QUERY_TIMEOUT_MS = Math.max(500, Math.min(1e4, Math.round(W(e.db?.queryTimeoutMs, 1e3)))), j.SEARCH_REQUEST_LIMIT = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Math.round(W(e.search?.maxResults, A.SEARCH_DEFAULT_LIMIT)))); }; -async function Ft() { +async function It() { try { let e = await t(); if (!e?.ok) return; let n = e.data?.prefs; if (!n || typeof n != "object") return; - let r = K(); - if (r.security = r.security || {}, r.security.safeMode = H(n.safe_mode, r.security.safeMode), r.security.allowWrite = H(n.allow_write, r.security.allowWrite), r.security.requireAuth = H(n.require_auth, r.security.requireAuth), r.security.allowRemoteWrite = H(n.allow_remote_write, r.security.allowRemoteWrite), r.security.allowInsecureTokenTransport = H(n.allow_insecure_token_transport, r.security.allowInsecureTokenTransport), r.security.allowDelete = H(n.allow_delete, r.security.allowDelete), r.security.allowRename = H(n.allow_rename, r.security.allowRename), r.security.allowOpenInFolder = H(n.allow_open_in_folder, r.security.allowOpenInFolder), r.security.allowResetIndex = H(n.allow_reset_index, r.security.allowResetIndex), r.security.tokenConfigured = H(n.token_configured, r.security.tokenConfigured), r.security.tokenHint = String(n.token_hint || "").trim(), !String(r.security.apiToken || "").trim()) try { - let e = await x(), t = String(e?.data?.token || "").trim(); + let r = q(); + if (r.security = r.security || {}, r.security.safeMode = U(n.safe_mode, r.security.safeMode), r.security.allowWrite = U(n.allow_write, r.security.allowWrite), r.security.requireAuth = U(n.require_auth, r.security.requireAuth), r.security.allowRemoteWrite = U(n.allow_remote_write, r.security.allowRemoteWrite), r.security.allowInsecureTokenTransport = U(n.allow_insecure_token_transport, r.security.allowInsecureTokenTransport), r.security.allowDelete = U(n.allow_delete, r.security.allowDelete), r.security.allowRename = U(n.allow_rename, r.security.allowRename), r.security.allowOpenInFolder = U(n.allow_open_in_folder, r.security.allowOpenInFolder), r.security.allowResetIndex = U(n.allow_reset_index, r.security.allowResetIndex), r.security.tokenConfigured = U(n.token_configured, r.security.tokenConfigured), r.security.tokenHint = String(n.token_hint || "").trim(), !String(r.security.apiToken || "").trim()) try { + let e = await C(), t = String(e?.data?.token || "").trim(); e?.ok && t && (r.security.apiToken = t); } catch (e) { console.debug?.(e); } - q(r), J(r), st("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); + J(r), Y(r), ct("mjr-settings-changed", { key: "security" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend security settings", e); } } -async function It() { +async function Lt() { try { - let e = await S(); + let e = await l(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; - let n = K(); - 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), q(n), J(n), st("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); + let n = q(); + n.ai = n.ai || {}, n.ai.vectorSearchEnabled = U(t.enabled, n.ai.vectorSearchEnabled ?? !0), n.ai.vectorCaptionOnIndex = U(t.caption_on_index ?? t.captionOnIndex, n.ai.vectorCaptionOnIndex ?? !1), J(n), Y(n), ct("mjr-settings-changed", { key: "ai.vectorSearch" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend vector search settings", e); } } -async function Lt() { +async function Rt() { try { - let e = await m(); + let e = await p(); if (!e?.ok) return; let t = e.data?.prefs; if (!t || typeof t != "object") return; - let n = K(); - n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = H(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), q(n), J(n), st("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); + let n = q(); + n.executionGrouping = n.executionGrouping || {}, n.executionGrouping.enabled = U(t.enabled, n.executionGrouping.enabled ?? A.EXECUTION_GROUPING_ENABLED), J(n), Y(n), ct("mjr-settings-changed", { key: "executionGrouping.enabled" }, { warnPrefix: "[Majoor]" }); } catch (e) { console.warn("[Majoor] failed to sync backend execution grouping settings", e); } } //#endregion //#region ui/app/settings/settingsRuntime.ts -var Rt = "mjr-runtime-status-dashboard", zt = "__mjr_write_token", Bt = 3e4; -function Vt() { +var zt = "mjr-runtime-status-dashboard", Bt = "__mjr_write_token", Vt = 3e4; +function Ht() { try { - let e = K(), t = String(e?.observability?.runtimeDashboardMode || G.observability.runtimeDashboardMode); + let e = q(), t = String(e?.observability?.runtimeDashboardMode || K.observability.runtimeDashboardMode); return [ "autoHide30", "always", @@ -810,59 +798,59 @@ function Vt() { return "autoHide30"; } } -function Ht() { - try { - document.getElementById(Rt)?.remove?.(); - } catch (e) { - console.debug?.(e); - } -} function Ut() { try { - window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ && (clearTimeout(window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__), window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = null); + document.getElementById(zt)?.remove?.(); } catch (e) { console.debug?.(e); } } function Wt() { try { - return String(sessionStorage?.getItem?.(zt) || "").trim(); + 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 Gt() { + try { + return String(sessionStorage?.getItem?.(Bt) || "").trim(); } catch { return ""; } } -function Gt(e, t) { +function Kt(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 Kt(e) { - let t = Wt(), r = String(e?.token_hint || "").trim() || (t ? `...${t.slice(-4)}` : ""), i = e?.allow_write !== !1, a = e?.require_auth === !0, o = e?.token_configured === !0; - return i ? t ? { - text: n("runtime.writeAuthActive", "Write auth: active {tokenHint}", { tokenHint: r || "(session)" }), +function qt(e) { + let t = Gt(), n = String(e?.token_hint || "").trim() || (t ? `...${t.slice(-4)}` : ""), r = e?.allow_write !== !1, i = e?.require_auth === !0, a = e?.token_configured === !0; + return r ? t ? { + text: k("runtime.writeAuthActive", "Write auth: active {tokenHint}", { tokenHint: n || "(session)" }), color: "#7ee0a0" - } : a && o ? { - text: n("runtime.writeAuthMissing", "Write auth: missing in this browser {tokenHint}", { tokenHint: r || "(server token configured)" }), + } : i && a ? { + text: k("runtime.writeAuthMissing", "Write auth: missing in this browser {tokenHint}", { tokenHint: n || "(server token configured)" }), color: "#f1c36d" - } : a ? { - text: n("runtime.writeAuthRequired", "Write auth: required"), + } : i ? { + text: k("runtime.writeAuthRequired", "Write auth: required"), color: "#f1c36d" } : e && typeof e == "object" ? { - text: n("runtime.writeAuthNotRequired", "Write auth: not required"), + text: k("runtime.writeAuthNotRequired", "Write auth: not required"), color: "#8fd0ff" } : { - text: n("runtime.writeAuthUnknown", "Write auth: unknown"), + text: k("runtime.writeAuthUnknown", "Write auth: unknown"), color: "#c8ced8" } : { - text: n("runtime.writeAuthBlocked", "Write auth: writes blocked by server"), + text: k("runtime.writeAuthBlocked", "Write auth: writes blocked by server"), color: "#ff9b9b" }; } -function qt() { +function Jt() { try { - if (Vt() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return Ht(), null; - let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(Rt); + if (Ht() === "hidden" || window.__MJR_RUNTIME_STATUS_HIDDEN__) return Ut(), null; + let e = document.querySelector(".mjr-assets-manager.mjr-am-container"), t = document.getElementById(zt); if (!e) { try { t?.remove?.(); @@ -877,52 +865,52 @@ function qt() { } catch (e) { console.debug?.(e); } - let n = document.getElementById(Rt); - return n ? n.parentElement !== e && e.appendChild(n) : (n = document.createElement("div"), n.id = Rt, 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(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; } catch { return null; } } -async function Jt() { - let e = qt(); +async function Yt() { + let e = Jt(); if (!e) return !1; - let r = Gt(e, "metrics"), i = Gt(e, "auth"); + let n = Kt(e, "metrics"), r = Kt(e, "auth"); try { - let [a, o] = await Promise.all([be(), t()]), s = n("runtime.unavailable", "Runtime: unavailable"); - if (!a?.ok || !a?.data) r.textContent = s; + let [i, a] = await Promise.all([E(), t()]), o = k("runtime.unavailable", "Runtime: unavailable"); + if (!i?.ok || !i?.data) n.textContent = o; else { - let e = a.data.db || {}, t = a.data.index || {}, i = a.data.watcher || {}, o = Number(e.active_connections || 0), c = Number(t.enrichment_queue_length || 0), l = Number(i.pending_files || 0); - r.textContent = n("runtime.metricsLine", "DB active: {active} | Enrich Q: {enrichQ} | Watcher pending: {pending}", { - active: o, - enrichQ: c, - pending: l - }), s = n("runtime.metricsTitle", "Runtime Metrics\nDB active connections: {active}\nEnrichment queue: {enrichQ}\nWatcher pending files: {pending}", { - active: o, - enrichQ: c, - pending: l + let e = i.data.db || {}, t = i.data.index || {}, r = i.data.watcher || {}, a = Number(e.active_connections || 0), s = Number(t.enrichment_queue_length || 0), c = Number(r.pending_files || 0); + n.textContent = k("runtime.metricsLine", "DB active: {active} | Enrich Q: {enrichQ} | Watcher pending: {pending}", { + active: a, + enrichQ: s, + pending: c + }), o = k("runtime.metricsTitle", "Runtime Metrics\nDB active connections: {active}\nEnrichment queue: {enrichQ}\nWatcher pending files: {pending}", { + active: a, + enrichQ: s, + pending: c }); } - let c = Kt(o?.data?.prefs || null); - return i.textContent = c.text, i.style.color = c.color, e.title = `${s}\n${c.text}`, !0; + let s = qt(a?.data?.prefs || null); + return r.textContent = s.text, r.style.color = s.color, e.title = `${o}\n${s.text}`, !0; } catch { - return r.textContent = n("runtime.unavailable", "Runtime: unavailable"), i.textContent = n("runtime.writeAuthUnknown", "Write auth: unknown"), i.style.color = "#c8ced8", e.title = `${n("runtime.unavailable", "Runtime: unavailable")}\n${i.textContent}`, !0; + return n.textContent = k("runtime.unavailable", "Runtime: unavailable"), r.textContent = k("runtime.writeAuthUnknown", "Write auth: unknown"), r.style.color = "#c8ced8", e.title = `${k("runtime.unavailable", "Runtime: unavailable")}\n${r.textContent}`, !0; } } -function Yt() { +function Xt() { try { - let e = Vt(); + let e = Ht(); if (e === "hidden") { - window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, Ut(), Ht(); + window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, Wt(), Ut(); return; } window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ || (window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__ = (e) => { if (e?.detail?.key !== "observability.runtimeDashboardMode") return; - let t = Vt(); - window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", Ut(), Ht(), t !== "hidden" && Yt(); - }, window.addEventListener?.("mjr-settings-changed", window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__)), window.__MJR_RUNTIME_STATUS_HIDDEN__ = !1, Ut(), e === "autoHide30" && (window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = setTimeout(() => { - window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, Ht(); - }, Bt)), Jt().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, Jt().then((e) => { + let t = Ht(); + window.__MJR_RUNTIME_STATUS_HIDDEN__ = t === "hidden", Wt(), Ut(), t !== "hidden" && Xt(); + }, window.addEventListener?.("mjr-settings-changed", window.__MJR_RUNTIME_STATUS_SETTINGS_LISTENER__)), window.__MJR_RUNTIME_STATUS_HIDDEN__ = !1, Wt(), e === "autoHide30" && (window.__MJR_RUNTIME_STATUS_HIDE_TIMEOUT__ = setTimeout(() => { + window.__MJR_RUNTIME_STATUS_HIDDEN__ = !0, Ut(); + }, Vt)), Yt().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, Yt().then((e) => { if (e) { window.__MJR_RUNTIME_STATUS_MISS_COUNT__ = 0; return; @@ -938,8 +926,8 @@ function Yt() { } //#endregion //#region ui/utils/debounce.ts -var Xt = 300; -function Zt(e, t = Xt) { +var Zt = 300; +function Qt(e, t = Zt) { let n, r = (...r) => { clearTimeout(n), n = setTimeout(() => e(...r), t); }; @@ -951,54 +939,54 @@ function Zt(e, t = Xt) { } //#endregion //#region ui/app/settings/settingsGrid.ts -var Y = "Majoor", Qt = "Majoor Assets Manager"; -function $t(e, t, r) { - let i = (e, t) => [ - Qt, +var X = "Majoor", $t = "Majoor Assets Manager"; +function en(e, t, n) { + let r = (e, t) => [ + $t, e, t + ], i = (e) => [ + $t, + k("cat.cards", "Cards"), + e ], a = (e) => [ - Qt, - n("cat.cards", "Cards"), + $t, + k("cat.badges", "Badges"), e ], o = (e) => [ - Qt, - n("cat.badges", "Badges"), + $t, + k("cat.badges", "Badges"), e - ], s = (e) => [ - Qt, - n("cat.badges", "Badges"), - e - ], c = (e, t) => { + ], 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 = gt(t.grid.minSize), q(t)), e({ - id: `${Y}.Cards.ThumbSize`, - category: a(n("setting.grid.cardSize.group", "Card size")), - name: n("setting.grid.cardSize.name", "Majoor: Card Size"), - tooltip: n("setting.grid.cardSize.desc", "Choose the card size preset used by the grid layout."), + t.grid?.minSizePreset || (t.grid = t.grid || {}, t.grid.minSizePreset = _t(t.grid.minSize), J(t)), e({ + id: `${X}.Cards.ThumbSize`, + category: i(k("setting.grid.cardSize.group", "Card size")), + name: k("setting.grid.cardSize.name", "Majoor: Card Size"), + tooltip: k("setting.grid.cardSize.desc", "Choose the card size preset used by the grid layout."), type: "combo", defaultValue: (() => { - let e = ct(String(t.grid?.minSizePreset || "").toLowerCase(), ft, gt(t.grid?.minSize)), r = { - small: n("setting.grid.cardSize.small", "Small"), - medium: n("setting.grid.cardSize.medium", "Medium"), - large: n("setting.grid.cardSize.large", "Large") + let e = lt(String(t.grid?.minSizePreset || "").toLowerCase(), pt, _t(t.grid?.minSize)), n = { + small: k("setting.grid.cardSize.small", "Small"), + medium: k("setting.grid.cardSize.medium", "Medium"), + large: k("setting.grid.cardSize.large", "Large") }; - return r[e] || r.medium; + return n[e] || n.medium; })(), options: [ - n("setting.grid.cardSize.small", "Small"), - n("setting.grid.cardSize.medium", "Medium"), - n("setting.grid.cardSize.large", "Large") + k("setting.grid.cardSize.small", "Small"), + k("setting.grid.cardSize.medium", "Medium"), + k("setting.grid.cardSize.large", "Large") ], onChange: (e) => { - let i = String(e || "").trim().toLowerCase(), a = n("setting.grid.cardSize.small", "Small").toLowerCase(), o = n("setting.grid.cardSize.medium", "Medium").toLowerCase(), s = n("setting.grid.cardSize.large", "Large").toLowerCase(), c = "medium"; - i === a || i === "small" || i === "petit" ? c = "small" : i === s || i === "large" || i === "grand" ? c = "large" : (i === o || i === "medium" || i === "moyen") && (c = "medium"), t.grid.minSizePreset = c, t.grid.minSize = dt[c], q(t), J(t), r("grid.minSizePreset"); + let r = String(e || "").trim().toLowerCase(), i = k("setting.grid.cardSize.small", "Small").toLowerCase(), a = k("setting.grid.cardSize.medium", "Medium").toLowerCase(), o = k("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 = ft[s], J(t), Y(t), n("grid.minSizePreset"); } }), e({ - id: `${Y}.Cards.CustomThumbSize`, - category: a(n("setting.grid.cardSize.group", "Card size")), + id: `${X}.Cards.CustomThumbSize`, + category: i(k("setting.grid.cardSize.group", "Card size")), name: "Majoor: Custom Card Size (px)", tooltip: "Set the minimum card width used by the main grid layout (60-600 px).", type: "number", @@ -1009,174 +997,174 @@ function $t(e, t, r) { step: 10 }, onChange: (e) => { - let n = Math.max(60, Math.min(600, Math.round(Number(e) || 120))); - t.grid.minSize = n, t.grid.minSizePreset = gt(n), q(t), J(t), r("grid.minSize"); + let r = Math.max(60, Math.min(600, Math.round(Number(e) || 120))); + t.grid.minSize = r, t.grid.minSizePreset = _t(r), J(t), Y(t), n("grid.minSize"); } }), e({ - id: `${Y}.Grid.ShowDetails`, - category: a("Show card details"), + id: `${X}.Grid.ShowDetails`, + category: i("Show card details"), name: "Show metadata panel", tooltip: "Show the bottom details panel on asset cards (filename, date, etc.)", type: "boolean", defaultValue: !!t.grid?.showDetails, onChange: (e) => { - t.grid.showDetails = !!e, q(t), J(t), r("grid.showDetails"); + t.grid.showDetails = !!e, J(t), Y(t), n("grid.showDetails"); } }), e({ - id: `${Y}.Grid.ShowFilename`, - category: a("Show filename"), + id: `${X}.Grid.ShowFilename`, + category: i("Show filename"), name: "Show filename", tooltip: "Display filename in details panel", type: "boolean", defaultValue: !!t.grid?.showFilename, onChange: (e) => { - t.grid.showFilename = !!e, q(t), J(t), r("grid.showFilename"); + t.grid.showFilename = !!e, J(t), Y(t), n("grid.showFilename"); } }), e({ - id: `${Y}.Grid.ShowDate`, - category: a("Show date/time"), + id: `${X}.Grid.ShowDate`, + category: i("Show date/time"), name: "Show date/time", tooltip: "Display date and time in details panel", type: "boolean", defaultValue: !!t.grid?.showDate, onChange: (e) => { - t.grid.showDate = !!e, q(t), J(t), r("grid.showDate"); + t.grid.showDate = !!e, J(t), Y(t), n("grid.showDate"); } }), e({ - id: `${Y}.Grid.ShowDimensions`, - category: a("Show dimensions"), + id: `${X}.Grid.ShowDimensions`, + category: i("Show dimensions"), name: "Show dimensions", tooltip: "Display resolution (WxH) in details panel", type: "boolean", defaultValue: !!t.grid?.showDimensions, onChange: (e) => { - t.grid.showDimensions = !!e, q(t), J(t), r("grid.showDimensions"); + t.grid.showDimensions = !!e, J(t), Y(t), n("grid.showDimensions"); } }), e({ - id: `${Y}.Grid.ShowGenTime`, - category: a("Show generation time"), + id: `${X}.Grid.ShowGenTime`, + category: i("Show generation time"), name: "Show generation time", tooltip: "Display seconds taken to generate the asset (if available)", type: "boolean", defaultValue: !!(t.grid?.showGenTime ?? A.GRID_SHOW_DETAILS_GENTIME), onChange: (e) => { - t.grid.showGenTime = !!e, q(t), J(t), r("grid.showGenTime"); + t.grid.showGenTime = !!e, J(t), Y(t), n("grid.showGenTime"); } }), e({ - id: `${Y}.Grid.ShowHoverInfo`, - category: a("Show prompt on hover"), + id: `${X}.Grid.ShowHoverInfo`, + category: i("Show prompt on hover"), name: "Show prompt on hover", tooltip: "Show positive prompt and generation time as a tooltip overlay when hovering over a card thumbnail. Does not block video play-on-hover.", type: "boolean", defaultValue: !!(t.grid?.showHoverInfo ?? A.GRID_SHOW_HOVER_INFO), onChange: (e) => { - t.grid.showHoverInfo = !!e, q(t), J(t), r("grid.showHoverInfo"); + t.grid.showHoverInfo = !!e, J(t), Y(t), n("grid.showHoverInfo"); } }), e({ - id: `${Y}.Grid.ShowWorkflowDot`, - category: a("Show workflow dot"), + id: `${X}.Grid.ShowWorkflowDot`, + category: i("Show workflow dot"), name: "Show workflow indicator", tooltip: "Display the green dot indicating workflow metadata availability (bottom right of card)", type: "boolean", defaultValue: !!t.grid?.showWorkflowDot, onChange: (e) => { - t.grid.showWorkflowDot = !!e, q(t), J(t), r("grid.showWorkflowDot"); + t.grid.showWorkflowDot = !!e, J(t), Y(t), n("grid.showWorkflowDot"); } }), e({ - id: `${Y}.Grid.ShowExtBadge`, - category: o("Show format badges"), + id: `${X}.Grid.ShowExtBadge`, + category: a("Show format badges"), name: "Show format badges", tooltip: "Display format badges (e.g. JPG, MP4) on thumbnails", type: "boolean", defaultValue: !!t.grid?.showExtBadge, onChange: (e) => { - t.grid.showExtBadge = !!e, q(t), J(t), r("grid.showExtBadge"); + t.grid.showExtBadge = !!e, J(t), Y(t), n("grid.showExtBadge"); } }), e({ - id: `${Y}.Grid.ShowRatingBadge`, - category: o("Show rating badges"), + id: `${X}.Grid.ShowRatingBadge`, + category: a("Show rating badges"), name: "Show ratings", tooltip: "Display star ratings on thumbnails", type: "boolean", defaultValue: !!t.grid?.showRatingBadge, onChange: (e) => { - t.grid.showRatingBadge = !!e, q(t), J(t), r("grid.showRatingBadge"); + t.grid.showRatingBadge = !!e, J(t), Y(t), n("grid.showRatingBadge"); } }), e({ - id: `${Y}.Grid.ShowTagsBadge`, - category: o("Show tags badges"), + id: `${X}.Grid.ShowTagsBadge`, + category: a("Show tags badges"), name: "Show tags", tooltip: "Display a small indicator if an asset has tags", type: "boolean", defaultValue: !!t.grid?.showTagsBadge, onChange: (e) => { - t.grid.showTagsBadge = !!e, q(t), J(t), r("grid.showTagsBadge"); + t.grid.showTagsBadge = !!e, J(t), Y(t), n("grid.showTagsBadge"); } }), e({ - id: `${Y}.Badges.StarColor`, - category: s(n("setting.starColor", "Star color")), - name: n("setting.starColor", "Majoor: Star color"), - tooltip: n("setting.starColor.tooltip", "Color of rating stars on thumbnails (hex, e.g. #FFD45A)"), + id: `${X}.Badges.StarColor`, + category: o(k("setting.starColor", "Star color")), + name: k("setting.starColor", "Majoor: Star color"), + tooltip: k("setting.starColor.tooltip", "Color of rating stars on thumbnails (hex, e.g. #FFD45A)"), type: "color", - defaultValue: c(t.grid?.starColor, A.BADGE_STAR_COLOR), + defaultValue: s(t.grid?.starColor, A.BADGE_STAR_COLOR), onChange: (e) => { - t.grid.starColor = c(e, A.BADGE_STAR_COLOR), q(t), J(t), r("grid.starColor"); + t.grid.starColor = s(e, A.BADGE_STAR_COLOR), J(t), Y(t), n("grid.starColor"); } }), e({ - id: `${Y}.Badges.ImageColor`, - category: s(n("setting.badgeImageColor", "Image badge color")), - name: n("setting.badgeImageColor", "Majoor: Image badge color"), - tooltip: n("setting.badgeImageColor.tooltip", "Color for image badges: PNG, JPG, WEBP, GIF, BMP, TIF (hex)"), + id: `${X}.Badges.ImageColor`, + category: o(k("setting.badgeImageColor", "Image badge color")), + name: k("setting.badgeImageColor", "Majoor: Image badge color"), + tooltip: k("setting.badgeImageColor.tooltip", "Color for image badges: PNG, JPG, WEBP, GIF, BMP, TIF (hex)"), type: "color", - defaultValue: c(t.grid?.badgeImageColor, A.BADGE_IMAGE_COLOR), + defaultValue: s(t.grid?.badgeImageColor, A.BADGE_IMAGE_COLOR), onChange: (e) => { - t.grid.badgeImageColor = c(e, A.BADGE_IMAGE_COLOR), q(t), J(t), r("grid.badgeImageColor"); + t.grid.badgeImageColor = s(e, A.BADGE_IMAGE_COLOR), J(t), Y(t), n("grid.badgeImageColor"); } }), e({ - id: `${Y}.Badges.VideoColor`, - category: s(n("setting.badgeVideoColor", "Video badge color")), - name: n("setting.badgeVideoColor", "Majoor: Video badge color"), - tooltip: n("setting.badgeVideoColor.tooltip", "Color for video badges: MP4, WEBM, MOV, AVI, MKV (hex)"), + id: `${X}.Badges.VideoColor`, + category: o(k("setting.badgeVideoColor", "Video badge color")), + name: k("setting.badgeVideoColor", "Majoor: Video badge color"), + tooltip: k("setting.badgeVideoColor.tooltip", "Color for video badges: MP4, WEBM, MOV, AVI, MKV (hex)"), type: "color", - defaultValue: c(t.grid?.badgeVideoColor, A.BADGE_VIDEO_COLOR), + defaultValue: s(t.grid?.badgeVideoColor, A.BADGE_VIDEO_COLOR), onChange: (e) => { - t.grid.badgeVideoColor = c(e, A.BADGE_VIDEO_COLOR), q(t), J(t), r("grid.badgeVideoColor"); + t.grid.badgeVideoColor = s(e, A.BADGE_VIDEO_COLOR), J(t), Y(t), n("grid.badgeVideoColor"); } }), e({ - id: `${Y}.Badges.AudioColor`, - category: s(n("setting.badgeAudioColor", "Audio badge color")), - name: n("setting.badgeAudioColor", "Majoor: Audio badge color"), - tooltip: n("setting.badgeAudioColor.tooltip", "Color for audio badges: MP3, WAV, OGG, FLAC (hex)"), + id: `${X}.Badges.AudioColor`, + category: o(k("setting.badgeAudioColor", "Audio badge color")), + name: k("setting.badgeAudioColor", "Majoor: Audio badge color"), + tooltip: k("setting.badgeAudioColor.tooltip", "Color for audio badges: MP3, WAV, OGG, FLAC (hex)"), type: "color", - defaultValue: c(t.grid?.badgeAudioColor, A.BADGE_AUDIO_COLOR), + defaultValue: s(t.grid?.badgeAudioColor, A.BADGE_AUDIO_COLOR), onChange: (e) => { - t.grid.badgeAudioColor = c(e, A.BADGE_AUDIO_COLOR), q(t), J(t), r("grid.badgeAudioColor"); + t.grid.badgeAudioColor = s(e, A.BADGE_AUDIO_COLOR), J(t), Y(t), n("grid.badgeAudioColor"); } }), e({ - id: `${Y}.Badges.Model3dColor`, - category: s(n("setting.badgeModel3dColor", "3D model badge color")), - name: n("setting.badgeModel3dColor", "Majoor: 3D model badge color"), - tooltip: n("setting.badgeModel3dColor.tooltip", "Color for 3D model badges: OBJ, FBX, GLB, GLTF (hex)"), + id: `${X}.Badges.Model3dColor`, + category: o(k("setting.badgeModel3dColor", "3D model badge color")), + name: k("setting.badgeModel3dColor", "Majoor: 3D model badge color"), + tooltip: k("setting.badgeModel3dColor.tooltip", "Color for 3D model badges: OBJ, FBX, GLB, GLTF (hex)"), type: "color", - defaultValue: c(t.grid?.badgeModel3dColor, A.BADGE_MODEL3D_COLOR), + defaultValue: s(t.grid?.badgeModel3dColor, A.BADGE_MODEL3D_COLOR), onChange: (e) => { - t.grid.badgeModel3dColor = c(e, A.BADGE_MODEL3D_COLOR), q(t), J(t), r("grid.badgeModel3dColor"); + t.grid.badgeModel3dColor = s(e, A.BADGE_MODEL3D_COLOR), J(t), Y(t), n("grid.badgeModel3dColor"); } }), e({ - id: `${Y}.Badges.DuplicateAlertColor`, - category: s(n("setting.badgeDuplicateAlertColor", "Duplicate alert badge color")), - name: n("setting.badgeDuplicateAlertColor", "Majoor: Duplicate alert badge color"), - tooltip: n("setting.badgeDuplicateAlertColor.tooltip", "Color for duplicate extension badges (PNG+, JPG+, etc)."), + id: `${X}.Badges.DuplicateAlertColor`, + category: o(k("setting.badgeDuplicateAlertColor", "Duplicate alert badge color")), + name: k("setting.badgeDuplicateAlertColor", "Majoor: Duplicate alert badge color"), + tooltip: k("setting.badgeDuplicateAlertColor.tooltip", "Color for duplicate extension badges (PNG+, JPG+, etc)."), type: "color", - defaultValue: c(t.grid?.badgeDuplicateAlertColor, A.BADGE_DUPLICATE_ALERT_COLOR), + defaultValue: s(t.grid?.badgeDuplicateAlertColor, A.BADGE_DUPLICATE_ALERT_COLOR), onChange: (e) => { - t.grid.badgeDuplicateAlertColor = c(e, A.BADGE_DUPLICATE_ALERT_COLOR), q(t), J(t), r("grid.badgeDuplicateAlertColor"); + t.grid.badgeDuplicateAlertColor = s(e, A.BADGE_DUPLICATE_ALERT_COLOR), J(t), Y(t), n("grid.badgeDuplicateAlertColor"); } }), e({ - id: `${Y}.Grid.PageSize`, - category: i(n("cat.grid"), n("setting.grid.pagesize.name").replace("Majoor: ", "")), - name: n("setting.grid.pagesize.name"), - tooltip: n("setting.grid.pagesize.desc"), + id: `${X}.Grid.PageSize`, + category: r(k("cat.grid"), k("setting.grid.pagesize.name").replace("Majoor: ", "")), + name: k("setting.grid.pagesize.name"), + tooltip: k("setting.grid.pagesize.desc"), type: "number", defaultValue: t.grid.pageSize, attrs: { @@ -1185,43 +1173,43 @@ function $t(e, t, r) { step: 50 }, onChange: (e) => { - let n = Number(j.MAX_PAGE_SIZE) || 2e3; - t.grid.pageSize = Math.max(50, Math.min(n, Number(e) || A.DEFAULT_PAGE_SIZE)), q(t), J(t), r("grid.pageSize"); + let r = Number(j.MAX_PAGE_SIZE) || 2e3; + t.grid.pageSize = Math.max(50, Math.min(r, Number(e) || A.DEFAULT_PAGE_SIZE)), J(t), Y(t), n("grid.pageSize"); } }), e({ - id: `${Y}.InfiniteScroll.Enabled`, - category: i(n("cat.grid"), n("setting.nav.infinite.name").replace("Majoor: ", "")), - name: n("setting.nav.infinite.name"), - tooltip: n("setting.nav.infinite.desc"), + id: `${X}.InfiniteScroll.Enabled`, + category: r(k("cat.grid"), k("setting.nav.infinite.name").replace("Majoor: ", "")), + name: k("setting.nav.infinite.name"), + tooltip: k("setting.nav.infinite.desc"), type: "boolean", defaultValue: !!t.infiniteScroll?.enabled, onChange: (e) => { - t.infiniteScroll = t.infiniteScroll || {}, t.infiniteScroll.enabled = !!e, q(t), J(t), r("infiniteScroll.enabled"); + t.infiniteScroll = t.infiniteScroll || {}, t.infiniteScroll.enabled = !!e, J(t), Y(t), n("infiniteScroll.enabled"); } }), e({ - id: `${Y}.Sidebar.Position`, - category: i(n("cat.grid"), n("setting.sidebar.pos.name").replace("Majoor: ", "")), - name: n("setting.sidebar.pos.name"), - tooltip: n("setting.sidebar.pos.desc"), + id: `${X}.Sidebar.Position`, + category: r(k("cat.grid"), k("setting.sidebar.pos.name").replace("Majoor: ", "")), + name: k("setting.sidebar.pos.name"), + tooltip: k("setting.sidebar.pos.desc"), type: "combo", defaultValue: t.sidebar?.position || "right", options: ["left", "right"], onChange: (e) => { - t.sidebar = t.sidebar || {}, t.sidebar.position = e === "left" ? "left" : "right", q(t), r("sidebar.position"); + t.sidebar = t.sidebar || {}, t.sidebar.position = e === "left" ? "left" : "right", J(t), n("sidebar.position"); } }), e({ - id: `${Y}.Sidebar.ShowPreviewThumb`, - category: i(n("cat.grid"), "Sidebar preview"), + id: `${X}.Sidebar.ShowPreviewThumb`, + category: r(k("cat.grid"), "Sidebar preview"), name: "Show sidebar preview thumb", tooltip: "Show/hide the large media preview at the top of the sidebar metadata panel.", type: "boolean", defaultValue: !!(t.sidebar?.showPreviewThumb ?? !0), onChange: (e) => { - t.sidebar = t.sidebar || {}, t.sidebar.showPreviewThumb = !!e, q(t), r("sidebar.showPreviewThumb"); + t.sidebar = t.sidebar || {}, t.sidebar.showPreviewThumb = !!e, J(t), n("sidebar.showPreviewThumb"); } }), e({ - id: `${Y}.Sidebar.WidthPx`, - category: i(n("cat.grid"), "Sidebar width"), + id: `${X}.Sidebar.WidthPx`, + category: r(k("cat.grid"), "Sidebar width"), name: "Sidebar width (px)", tooltip: "Set the details sidebar width in pixels (240-640).", type: "number", @@ -1232,161 +1220,161 @@ function $t(e, t, r) { step: 10 }, onChange: (e) => { - t.sidebar = t.sidebar || {}, t.sidebar.widthPx = Math.max(240, Math.min(640, Math.round(Number(e) || 360))), q(t), r("sidebar.widthPx"); + t.sidebar = t.sidebar || {}, t.sidebar.widthPx = Math.max(240, Math.min(640, Math.round(Number(e) || 360))), J(t), n("sidebar.widthPx"); } }), e({ - id: `${Y}.General.HideSiblings`, - category: i(n("cat.grid"), n("setting.siblings.hide.name").replace("Majoor: ", "")), - name: n("setting.siblings.hide.name"), - tooltip: n("setting.siblings.hide.desc"), + id: `${X}.General.HideSiblings`, + category: r(k("cat.grid"), k("setting.siblings.hide.name").replace("Majoor: ", "")), + name: k("setting.siblings.hide.name"), + tooltip: k("setting.siblings.hide.desc"), type: "boolean", defaultValue: !!t.siblings?.hidePngSiblings, onChange: (e) => { - t.siblings = t.siblings || {}, t.siblings.hidePngSiblings = !!e, q(t), r("siblings.hidePngSiblings"); + t.siblings = t.siblings || {}, t.siblings.hidePngSiblings = !!e, J(t), n("siblings.hidePngSiblings"); } }), e({ - id: `${Y}.Grid.VideoAutoplayMode`, - category: i(n("cat.grid"), n("setting.grid.videoAutoplayMode.name", "Video autoplay").replace("Majoor: ", "")), - name: n("setting.grid.videoAutoplayMode.name", "Majoor: Video autoplay"), - tooltip: n("setting.grid.videoAutoplayMode.desc", "Controls video thumbnail playback in the grid. Off: static frame. Hover: play on mouse hover. Always: loop while visible."), + id: `${X}.Grid.VideoAutoplayMode`, + category: r(k("cat.grid"), k("setting.grid.videoAutoplayMode.name", "Video autoplay").replace("Majoor: ", "")), + name: k("setting.grid.videoAutoplayMode.name", "Majoor: Video autoplay"), + tooltip: k("setting.grid.videoAutoplayMode.desc", "Controls video thumbnail playback in the grid. Off: static frame. Hover: play on mouse hover. Always: loop while visible."), type: "combo", defaultValue: (() => { let e = t.grid?.videoAutoplayMode; e ??= t.grid?.videoHoverAutoplay === !1 ? "off" : "hover", e === !0 && (e = "hover"), e === !1 && (e = "off"), e !== "hover" && e !== "always" && e !== "off" && (e = "hover"); - let r = { - off: n("setting.grid.videoAutoplayMode.off", "Off"), - hover: n("setting.grid.videoAutoplayMode.hover", "Hover"), - always: n("setting.grid.videoAutoplayMode.always", "Always") + let n = { + off: k("setting.grid.videoAutoplayMode.off", "Off"), + hover: k("setting.grid.videoAutoplayMode.hover", "Hover"), + always: k("setting.grid.videoAutoplayMode.always", "Always") }; - return r[e] || r.off; + return n[e] || n.off; })(), options: [ - n("setting.grid.videoAutoplayMode.off", "Off"), - n("setting.grid.videoAutoplayMode.hover", "Hover"), - n("setting.grid.videoAutoplayMode.always", "Always") + k("setting.grid.videoAutoplayMode.off", "Off"), + k("setting.grid.videoAutoplayMode.hover", "Hover"), + k("setting.grid.videoAutoplayMode.always", "Always") ], onChange: (e) => { - let i = { - [n("setting.grid.videoAutoplayMode.off", "Off")]: "off", - [n("setting.grid.videoAutoplayMode.hover", "Hover")]: "hover", - [n("setting.grid.videoAutoplayMode.always", "Always")]: "always" + let r = { + [k("setting.grid.videoAutoplayMode.off", "Off")]: "off", + [k("setting.grid.videoAutoplayMode.hover", "Hover")]: "hover", + [k("setting.grid.videoAutoplayMode.always", "Always")]: "always" }[e] || "off"; - t.grid = t.grid || {}, t.grid.videoAutoplayMode = i, delete t.grid.videoHoverAutoplay, q(t), J(t), r("grid.videoAutoplayMode"); + t.grid = t.grid || {}, t.grid.videoAutoplayMode = r, delete t.grid.videoHoverAutoplay, J(t), Y(t), n("grid.videoAutoplayMode"); } }), e({ - id: `${Y}.Cards.HoverColor`, - category: a("Hover color"), + id: `${X}.Cards.HoverColor`, + category: i("Hover color"), name: "Majoor: Card hover color", tooltip: "Background tint used when hovering a card (hex, e.g. #3D3D3D).", type: "color", - defaultValue: c(t.ui?.cardHoverColor, A.UI_CARD_HOVER_COLOR), + defaultValue: s(t.ui?.cardHoverColor, A.UI_CARD_HOVER_COLOR), onChange: (e) => { - t.ui = t.ui || {}, t.ui.cardHoverColor = c(e, A.UI_CARD_HOVER_COLOR), q(t), J(t), r("ui.cardHoverColor"); + t.ui = t.ui || {}, t.ui.cardHoverColor = s(e, A.UI_CARD_HOVER_COLOR), J(t), Y(t), n("ui.cardHoverColor"); } }), e({ - id: `${Y}.Cards.SelectionColor`, - category: a("Selection color"), + id: `${X}.Cards.SelectionColor`, + category: i("Selection color"), name: "Majoor: Card selection color", tooltip: "Outline/accent color used for selected cards (hex, e.g. #4A90E2).", type: "color", - defaultValue: c(t.ui?.cardSelectionColor, A.UI_CARD_SELECTION_COLOR), + defaultValue: s(t.ui?.cardSelectionColor, A.UI_CARD_SELECTION_COLOR), onChange: (e) => { - t.ui = t.ui || {}, t.ui.cardSelectionColor = c(e, A.UI_CARD_SELECTION_COLOR), q(t), J(t), r("ui.cardSelectionColor"); + t.ui = t.ui || {}, t.ui.cardSelectionColor = s(e, A.UI_CARD_SELECTION_COLOR), J(t), Y(t), n("ui.cardSelectionColor"); } }), e({ - id: `${Y}.Badges.RatingColor`, - category: o("Rating color"), + id: `${X}.Badges.RatingColor`, + category: a("Rating color"), name: "Majoor: Rating badge color", tooltip: "Color used for rating badge text/accent (hex, e.g. #FF9500).", type: "color", - defaultValue: c(t.ui?.ratingColor, A.UI_RATING_COLOR), + defaultValue: s(t.ui?.ratingColor, A.UI_RATING_COLOR), onChange: (e) => { - t.ui = t.ui || {}, t.ui.ratingColor = c(e, A.UI_RATING_COLOR), q(t), J(t), r("ui.ratingColor"); + t.ui = t.ui || {}, t.ui.ratingColor = s(e, A.UI_RATING_COLOR), J(t), Y(t), n("ui.ratingColor"); } }), e({ - id: `${Y}.Badges.TagColor`, - category: o("Tag color"), + id: `${X}.Badges.TagColor`, + category: a("Tag color"), name: "Majoor: Tags badge color", tooltip: "Color used for tags badge text/accent (hex, e.g. #4A90E2).", type: "color", - defaultValue: c(t.ui?.tagColor, A.UI_TAG_COLOR), + defaultValue: s(t.ui?.tagColor, A.UI_TAG_COLOR), onChange: (e) => { - t.ui = t.ui || {}, t.ui.tagColor = c(e, A.UI_TAG_COLOR), q(t), J(t), r("ui.tagColor"); + t.ui = t.ui || {}, t.ui.tagColor = s(e, A.UI_TAG_COLOR), J(t), Y(t), n("ui.tagColor"); } }); } //#endregion //#region ui/app/settings/settingsViewer.ts -var en = "Majoor", tn = "Majoor Assets Manager"; -function nn(e, t, i) { - let o = (e, t) => [ - tn, +var tn = "Majoor", nn = "Majoor Assets Manager"; +function rn(e, t, n) { + let r = (e, t) => [ + nn, e, t - ], s = (e) => o(n("cat.viewer", "Viewer"), e), c = (e) => o(n("cat.floatingViewer", "Floating Viewer"), e); + ], i = (e) => r(k("cat.viewer", "Viewer"), e), a = (e) => r(k("cat.floatingViewer", "Floating Viewer"), e); e({ - id: `${en}.Viewer.AllowPanAtZoom1`, - category: s(n("setting.viewer.pan.name").replace("Majoor: ", "")), - name: n("setting.viewer.pan.name"), - tooltip: n("setting.viewer.pan.desc"), + id: `${tn}.Viewer.AllowPanAtZoom1`, + category: i(k("setting.viewer.pan.name").replace("Majoor: ", "")), + name: k("setting.viewer.pan.name"), + tooltip: k("setting.viewer.pan.desc"), type: "boolean", defaultValue: !!t.viewer?.allowPanAtZoom1, onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.allowPanAtZoom1 = !!e, q(t), J(t), i("viewer.allowPanAtZoom1"); + t.viewer = t.viewer || {}, t.viewer.allowPanAtZoom1 = !!e, J(t), Y(t), n("viewer.allowPanAtZoom1"); } }), e({ - id: `${en}.Viewer.DisableWebGL`, - category: s("Disable WebGL Video"), + id: `${tn}.Viewer.DisableWebGL`, + category: i("Disable WebGL Video"), name: "Disable WebGL Video", tooltip: "Use CPU rendering (Canvas 2D) for video playback. Fixes 'black screen' issues on incompatible hardware/browsers.", type: "boolean", defaultValue: !!t.viewer?.disableWebGL, onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.disableWebGL = !!e, q(t), J(t), i("viewer.disableWebGL"); + t.viewer = t.viewer || {}, t.viewer.disableWebGL = !!e, J(t), Y(t), n("viewer.disableWebGL"); } }), e({ - id: `${en}.Viewer.PauseDuringExecution`, - category: s(n("setting.viewer.pauseExecution.name").replace("Majoor: ", "")), - name: n("setting.viewer.pauseExecution.name"), - tooltip: n("setting.viewer.pauseExecution.desc"), + id: `${tn}.Viewer.PauseDuringExecution`, + category: i(k("setting.viewer.pauseExecution.name").replace("Majoor: ", "")), + name: k("setting.viewer.pauseExecution.name"), + tooltip: k("setting.viewer.pauseExecution.desc"), type: "boolean", defaultValue: !!t.viewer?.pauseDuringExecution, onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.pauseDuringExecution = !!e, q(t), J(t), i("viewer.pauseDuringExecution"); + t.viewer = t.viewer || {}, t.viewer.pauseDuringExecution = !!e, J(t), Y(t), n("viewer.pauseDuringExecution"); } }), e({ - id: `${en}.Viewer.FloatingPauseDuringExecution`, - category: c(n("setting.viewer.floatingPauseExecution.name").replace("Majoor: ", "")), - name: n("setting.viewer.floatingPauseExecution.name"), - tooltip: n("setting.viewer.floatingPauseExecution.desc"), + id: `${tn}.Viewer.FloatingPauseDuringExecution`, + category: a(k("setting.viewer.floatingPauseExecution.name").replace("Majoor: ", "")), + name: k("setting.viewer.floatingPauseExecution.name"), + tooltip: k("setting.viewer.floatingPauseExecution.desc"), type: "boolean", defaultValue: !!t.viewer?.floatingPauseDuringExecution, onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.floatingPauseDuringExecution = !!e, q(t), J(t), i("viewer.floatingPauseDuringExecution"); + t.viewer = t.viewer || {}, t.viewer.floatingPauseDuringExecution = !!e, J(t), Y(t), n("viewer.floatingPauseDuringExecution"); } }), e({ - id: `${en}.Viewer.MfvLiveDefault`, - category: c(n("setting.viewer.mfvLiveDefault.name").replace("Majoor: ", "")), - name: n("setting.viewer.mfvLiveDefault.name"), - tooltip: n("setting.viewer.mfvLiveDefault.desc"), + id: `${tn}.Viewer.MfvLiveDefault`, + category: a(k("setting.viewer.mfvLiveDefault.name").replace("Majoor: ", "")), + name: k("setting.viewer.mfvLiveDefault.name"), + tooltip: k("setting.viewer.mfvLiveDefault.desc"), type: "boolean", defaultValue: !!(t.viewer?.mfvLiveDefault ?? A.MFV_LIVE_DEFAULT), onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.mfvLiveDefault = !!e, q(t), J(t), i("viewer.mfvLiveDefault"); + t.viewer = t.viewer || {}, t.viewer.mfvLiveDefault = !!e, J(t), Y(t), n("viewer.mfvLiveDefault"); } }), e({ - id: `${en}.Viewer.MfvPreviewDefault`, - category: c(n("setting.viewer.mfvPreviewDefault.name").replace("Majoor: ", "")), - name: n("setting.viewer.mfvPreviewDefault.name"), - tooltip: n("setting.viewer.mfvPreviewDefault.desc"), + id: `${tn}.Viewer.MfvPreviewDefault`, + category: a(k("setting.viewer.mfvPreviewDefault.name").replace("Majoor: ", "")), + name: k("setting.viewer.mfvPreviewDefault.name"), + tooltip: k("setting.viewer.mfvPreviewDefault.desc"), type: "boolean", defaultValue: !!(t.viewer?.mfvPreviewDefault ?? A.MFV_PREVIEW_DEFAULT), onChange: (e) => { - t.viewer = t.viewer || {}, t.viewer.mfvPreviewDefault = !!e, q(t), J(t), i("viewer.mfvPreviewDefault"); + t.viewer = t.viewer || {}, t.viewer.mfvPreviewDefault = !!e, J(t), Y(t), n("viewer.mfvPreviewDefault"); } }), e({ - id: `${en}.Viewer.MfvSidebarPosition`, - category: c("Node Parameters sidebar position"), + id: `${tn}.Viewer.MfvSidebarPosition`, + category: a("Node Parameters sidebar position"), name: "Node Parameters sidebar position", tooltip: "Position of the Node Parameters sidebar in the Floating Viewer (right, left, or bottom).", type: "combo", @@ -1397,18 +1385,18 @@ function nn(e, t, i) { "bottom" ], onChange: (e) => { - let n = [ + let r = [ "left", "right", "bottom" ].includes(e) ? e : "right"; - t.viewer = t.viewer || {}, t.viewer.mfvSidebarPosition = n, q(t), J(t), i("viewer.mfvSidebarPosition"); + t.viewer = t.viewer || {}, t.viewer.mfvSidebarPosition = r, J(t), Y(t), n("viewer.mfvSidebarPosition"); } }), e({ - id: `${en}.Viewer.MfvPreviewMethod`, - category: c(n("setting.viewer.mfvPreviewMethod.name").replace("Majoor: ", "")), - name: n("setting.viewer.mfvPreviewMethod.name"), - tooltip: n("setting.viewer.mfvPreviewMethod.desc"), + id: `${tn}.Viewer.MfvPreviewMethod`, + category: a(k("setting.viewer.mfvPreviewMethod.name").replace("Majoor: ", "")), + name: k("setting.viewer.mfvPreviewMethod.name"), + tooltip: k("setting.viewer.mfvPreviewMethod.desc"), type: "combo", defaultValue: t.viewer?.mfvPreviewMethod || A.MFV_PREVIEW_METHOD, options: [ @@ -1419,106 +1407,106 @@ function nn(e, t, i) { "none" ], onChange: (e) => { - let n = [ + let r = [ "taesd", "latent2rgb", "auto", "default", "none" ].includes(e) ? e : A.MFV_PREVIEW_METHOD; - t.viewer = t.viewer || {}, t.viewer.mfvPreviewMethod = n, q(t), J(t), i("viewer.mfvPreviewMethod"); + t.viewer = t.viewer || {}, t.viewer.mfvPreviewMethod = r, J(t), Y(t), n("viewer.mfvPreviewMethod"); } }), e({ - id: `${en}.Viewer.LtxavRgbFallback`, - category: c("LTXAV preview fallback"), + id: `${tn}.Viewer.LtxavRgbFallback`, + category: a("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.", type: "boolean", defaultValue: !!t.viewer?.ltxavRgbFallback, onChange: async (e) => { - let n = !!e, a = !!t.viewer?.ltxavRgbFallback; - t.viewer = t.viewer || {}, t.viewer.ltxavRgbFallback = n, q(t), J(t), i("viewer.ltxavRgbFallback"); + let r = !!e, i = !!t.viewer?.ltxavRgbFallback; + t.viewer = t.viewer || {}, t.viewer.ltxavRgbFallback = r, J(t), Y(t), n("viewer.ltxavRgbFallback"); try { - let e = await de(n); + let e = await g(r); if (!e?.ok) throw Error(e?.error || "Failed to update LTXAV RGB preview fallback setting"); } catch (e) { - t.viewer.ltxavRgbFallback = a, q(t), J(t), i("viewer.ltxavRgbFallback"), r(e?.message || "Failed to update LTXAV RGB preview fallback setting", "error"); + t.viewer.ltxavRgbFallback = i, J(t), Y(t), n("viewer.ltxavRgbFallback"), y(e?.message || "Failed to update LTXAV RGB preview fallback setting", "error"); } } }); try { - a().then((e) => { + m().then((e) => { if (!e?.ok) return; - let n = !!e?.data?.prefs?.enabled, r = K(); - r.viewer = r.viewer || {}, !!r.viewer.ltxavRgbFallback !== n && (r.viewer.ltxavRgbFallback = n, Object.assign(t, r), q(r), J(r), i("viewer.ltxavRgbFallback")); + let r = !!e?.data?.prefs?.enabled, i = q(); + i.viewer = i.viewer || {}, !!i.viewer.ltxavRgbFallback !== r && (i.viewer.ltxavRgbFallback = r, Object.assign(t, i), J(i), Y(i), n("viewer.ltxavRgbFallback")); }).catch(() => {}); } catch (e) { console.debug?.(e); } - ((r, a, o, c) => { + ((r, a, o, s) => { e({ - id: `${en}.WorkflowMinimap.${r}`, - category: s(n(o).replace("Majoor: ", "")), - name: n(o), - tooltip: n(c), + id: `${tn}.WorkflowMinimap.${r}`, + category: i(k(o).replace("Majoor: ", "")), + name: k(o), + tooltip: k(s), type: "boolean", defaultValue: !!t.workflowMinimap?.[a], onChange: (e) => { - t.workflowMinimap = t.workflowMinimap || {}, t.workflowMinimap[a] = !!e, q(t), i(`workflowMinimap.${a}`); + t.workflowMinimap = t.workflowMinimap || {}, t.workflowMinimap[a] = !!e, J(t), n(`workflowMinimap.${a}`); } }); })("Enabled", "enabled", "setting.minimap.enabled.name", "setting.minimap.enabled.desc"); } //#endregion //#region ui/app/settings/settingsScanning.ts -var rn = "Majoor", an = "Majoor Assets Manager"; -function on(e, t, i) { - let a = (e, t) => [ - an, +var an = "Majoor", on = "Majoor Assets Manager"; +function sn(e, t, n) { + let r = (e, t) => [ + on, e, t ]; e({ - id: `${rn}.ExecutionGrouping.Enabled`, - category: a(n("cat.scanning"), "Execution grouping"), + id: `${an}.ExecutionGrouping.Enabled`, + category: r(k("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.", type: "boolean", defaultValue: !!(t.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), onChange: async (e) => { - let n = !!(t.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), a = !!e; - t.executionGrouping = t.executionGrouping || {}, t.executionGrouping.enabled = a, q(t), J(t), i("executionGrouping.enabled"); + let r = !!(t.executionGrouping?.enabled ?? A.EXECUTION_GROUPING_ENABLED), i = !!e; + t.executionGrouping = t.executionGrouping || {}, t.executionGrouping.enabled = i, J(t), Y(t), n("executionGrouping.enabled"); try { - let e = await me(a); + let e = await re(i); if (!e?.ok) throw Error(e?.error || "Failed to update execution grouping setting"); - t.executionGrouping.enabled = !!e?.data?.prefs?.enabled, q(t), J(t), i("executionGrouping.enabled"); + t.executionGrouping.enabled = !!e?.data?.prefs?.enabled, J(t), Y(t), n("executionGrouping.enabled"); } catch (e) { - t.executionGrouping.enabled = n, q(t), J(t), i("executionGrouping.enabled"), r(e?.message || "Failed to update execution grouping setting", "error"); + t.executionGrouping.enabled = r, J(t), Y(t), n("executionGrouping.enabled"), y(e?.message || "Failed to update execution grouping setting", "error"); } } }), e({ - id: `${rn}.AutoScan.OnStartup`, - category: a(n("cat.scanning"), n("setting.scan.startup.name").replace("Majoor: ", "")), - name: n("setting.scan.startup.name"), - tooltip: n("setting.scan.startup.desc"), + id: `${an}.AutoScan.OnStartup`, + category: r(k("cat.scanning"), k("setting.scan.startup.name").replace("Majoor: ", "")), + name: k("setting.scan.startup.name"), + tooltip: k("setting.scan.startup.desc"), type: "boolean", defaultValue: !!t.autoScan?.onStartup, onChange: (e) => { - t.autoScan = t.autoScan || {}, t.autoScan.onStartup = !!e, q(t), J(t), i("autoScan.onStartup"); + t.autoScan = t.autoScan || {}, t.autoScan.onStartup = !!e, J(t), Y(t), n("autoScan.onStartup"); } }), e({ - id: `${rn}.Scan.FastMode`, - category: a(n("cat.scanning"), "Scan mode"), + id: `${an}.Scan.FastMode`, + category: r(k("cat.scanning"), "Scan mode"), name: "Fast scan mode", tooltip: "Use fast scan mode for manual backfill scans (skip heavier metadata work during scan).", type: "boolean", defaultValue: !!(t.scan?.fastMode ?? !0), onChange: (e) => { - t.scan = t.scan || {}, t.scan.fastMode = !!e, q(t), i("scan.fastMode"); + t.scan = t.scan || {}, t.scan.fastMode = !!e, J(t), n("scan.fastMode"); } }), e({ - id: `${rn}.RtHydrate.Concurrency`, - category: a(n("cat.scanning"), "Hydration"), + id: `${an}.RtHydrate.Concurrency`, + category: r(k("cat.scanning"), "Hydration"), name: "Hydrate Concurrency", tooltip: "Maximum concurrent hydration requests for rating/tags.", type: "number", @@ -1529,53 +1517,53 @@ function on(e, t, i) { step: 1 }, onChange: (e) => { - t.rtHydrate = t.rtHydrate || {}, t.rtHydrate.concurrency = Math.max(1, Math.min(20, Math.round(U(e, A.RT_HYDRATE_CONCURRENCY || 5)))), q(t), J(t), i("rtHydrate.concurrency"); + t.rtHydrate = t.rtHydrate || {}, t.rtHydrate.concurrency = Math.max(1, Math.min(20, Math.round(W(e, A.RT_HYDRATE_CONCURRENCY || 5)))), J(t), Y(t), n("rtHydrate.concurrency"); } }); - let o = (e, t, n, r) => { - let i = Math.round(U(e, t)); + let i = (e, t, n, r) => { + let i = Math.round(W(e, t)); return Math.max(n, Math.min(r, i)); - }, s = (e = {}) => { - let n = []; + }, a = (e = {}) => { + let r = []; if (t.watcher = t.watcher || {}, typeof e.debounce_ms == "number") { - let r = Math.max(50, Math.min(5e3, Math.round(e.debounce_ms))); - t.watcher.debounceMs !== r && (t.watcher.debounceMs = r, n.push("watcher.debounceMs")); + let n = Math.max(50, Math.min(5e3, Math.round(e.debounce_ms))); + t.watcher.debounceMs !== n && (t.watcher.debounceMs = n, r.push("watcher.debounceMs")); } if (typeof e.dedupe_ttl_ms == "number") { - let r = Math.max(100, Math.min(3e4, Math.round(e.dedupe_ttl_ms))); - t.watcher.dedupeTtlMs !== r && (t.watcher.dedupeTtlMs = r, n.push("watcher.dedupeTtlMs")); + let n = Math.max(100, Math.min(3e4, Math.round(e.dedupe_ttl_ms))); + t.watcher.dedupeTtlMs !== n && (t.watcher.dedupeTtlMs = n, r.push("watcher.dedupeTtlMs")); } - n.length && (q(t), n.forEach((e) => i(e))); - }, c = async () => { + r.length && (J(t), r.forEach((e) => n(e))); + }, o = async () => { try { - let e = await T(); + let e = await d(); if (!e?.ok) return; - s(e.data || {}); + a(e.data || {}); } catch (e) { console.debug?.(e); } }; e({ - id: `${rn}.Watcher.Enabled`, - category: a(n("cat.scanning"), n("setting.watcher.enabled.label", "Enable watcher")), - name: n("setting.watcher.name"), - tooltip: n("setting.watcher.desc") + " (env: MJR_ENABLE_WATCHER)", + id: `${an}.Watcher.Enabled`, + category: r(k("cat.scanning"), k("setting.watcher.enabled.label", "Enable watcher")), + name: k("setting.watcher.name"), + tooltip: k("setting.watcher.desc") + " (env: MJR_ENABLE_WATCHER)", type: "boolean", defaultValue: !!t.watcher?.enabled, onChange: async (e) => { - t.watcher = t.watcher || {}, t.watcher.enabled = !!e, q(t), i("watcher.enabled"); + t.watcher = t.watcher || {}, t.watcher.enabled = !!e, J(t), n("watcher.enabled"); try { - let a = await se(!!e); - a?.ok || (t.watcher.enabled = !e, q(t), i("watcher.enabled"), r(a?.error || n("toast.failedToggleWatcher", "Failed to toggle watcher"), "error")); + let r = await ne(!!e); + r?.ok || (t.watcher.enabled = !e, J(t), n("watcher.enabled"), y(r?.error || k("toast.failedToggleWatcher", "Failed to toggle watcher"), "error")); } catch { - t.watcher.enabled = !e, q(t), i("watcher.enabled"); + t.watcher.enabled = !e, J(t), n("watcher.enabled"); } } }), e({ - id: `${rn}.Watcher.DebounceDelay`, - category: a(n("cat.scanning"), n("setting.watcher.debounce.label", "Watcher debounce delay")), - name: n("setting.watcher.debounce.name"), - tooltip: n("setting.watcher.debounce.desc") + " (env: MJR_WATCHER_DEBOUNCE_MS)", + id: `${an}.Watcher.DebounceDelay`, + category: r(k("cat.scanning"), k("setting.watcher.debounce.label", "Watcher debounce delay")), + name: k("setting.watcher.debounce.name"), + tooltip: k("setting.watcher.debounce.desc") + " (env: MJR_WATCHER_DEBOUNCE_MS)", type: "number", defaultValue: t.watcher?.debounceMs ?? A.WATCHER_DEBOUNCE_MS, attrs: { @@ -1584,24 +1572,24 @@ function on(e, t, i) { step: 50 }, onChange: async (e) => { - let a = A.WATCHER_DEBOUNCE_MS, s = o(e, a, 50, 6e4), c = t.watcher?.debounceMs ?? a; - if (s !== c) { - t.watcher = t.watcher || {}, t.watcher.debounceMs = s, q(t); + let r = A.WATCHER_DEBOUNCE_MS, a = i(e, r, 50, 6e4), o = t.watcher?.debounceMs ?? r; + if (a !== o) { + t.watcher = t.watcher || {}, t.watcher.debounceMs = a, J(t); try { - let e = await D({ debounce_ms: s }); - if (!e?.ok) throw Error(e?.error || n("setting.watcher.debounce.error")); - let r = Math.round(Number(e?.data?.debounce_ms ?? s)); - t.watcher.debounceMs = r, q(t), i("watcher.debounceMs"); + let e = await ae({ debounce_ms: a }); + if (!e?.ok) throw Error(e?.error || k("setting.watcher.debounce.error")); + let r = Math.round(Number(e?.data?.debounce_ms ?? a)); + t.watcher.debounceMs = r, J(t), n("watcher.debounceMs"); } catch (e) { - t.watcher.debounceMs = c, q(t), i("watcher.debounceMs"), r(e?.message || n("setting.watcher.debounce.error"), "error"); + t.watcher.debounceMs = o, J(t), n("watcher.debounceMs"), y(e?.message || k("setting.watcher.debounce.error"), "error"); } } } }), e({ - id: `${rn}.Watcher.DedupeWindow`, - category: a(n("cat.scanning"), n("setting.watcher.dedupe.label", "Watcher dedupe window")), - name: n("setting.watcher.dedupe.name"), - tooltip: n("setting.watcher.dedupe.desc") + " (env: MJR_WATCHER_DEDUPE_TTL_MS)", + id: `${an}.Watcher.DedupeWindow`, + category: r(k("cat.scanning"), k("setting.watcher.dedupe.label", "Watcher dedupe window")), + name: k("setting.watcher.dedupe.name"), + tooltip: k("setting.watcher.dedupe.desc") + " (env: MJR_WATCHER_DEDUPE_TTL_MS)", type: "number", defaultValue: t.watcher?.dedupeTtlMs ?? A.WATCHER_DEDUPE_TTL_MS, attrs: { @@ -1610,22 +1598,22 @@ function on(e, t, i) { step: 100 }, onChange: async (e) => { - let a = A.WATCHER_DEDUPE_TTL_MS, s = o(e, a, 100, 12e4), c = t.watcher?.dedupeTtlMs ?? a; - if (s !== c) { - t.watcher = t.watcher || {}, t.watcher.dedupeTtlMs = s, q(t); + let r = A.WATCHER_DEDUPE_TTL_MS, a = i(e, r, 100, 12e4), o = t.watcher?.dedupeTtlMs ?? r; + if (a !== o) { + t.watcher = t.watcher || {}, t.watcher.dedupeTtlMs = a, J(t); try { - let e = await D({ dedupe_ttl_ms: s }); - if (!e?.ok) throw Error(e?.error || n("setting.watcher.dedupe.error")); - let r = Math.round(Number(e?.data?.dedupe_ttl_ms ?? s)); - t.watcher.dedupeTtlMs = r, q(t), i("watcher.dedupeTtlMs"); + let e = await ae({ dedupe_ttl_ms: a }); + if (!e?.ok) throw Error(e?.error || k("setting.watcher.dedupe.error")); + let r = Math.round(Number(e?.data?.dedupe_ttl_ms ?? a)); + t.watcher.dedupeTtlMs = r, J(t), n("watcher.dedupeTtlMs"); } catch (e) { - t.watcher.dedupeTtlMs = c, q(t), i("watcher.dedupeTtlMs"), r(e?.message || n("setting.watcher.dedupe.error"), "error"); + t.watcher.dedupeTtlMs = o, J(t), n("watcher.dedupeTtlMs"), y(e?.message || k("setting.watcher.dedupe.error"), "error"); } } } }), e({ - id: `${rn}.Watcher.MaxPending`, - category: a(n("cat.scanning"), "Watcher queue"), + id: `${an}.Watcher.MaxPending`, + category: r(k("cat.scanning"), "Watcher queue"), name: "Watcher: max pending files", tooltip: "Maximum number of pending watcher files kept in memory.", type: "number", @@ -1636,11 +1624,11 @@ function on(e, t, i) { step: 10 }, onChange: (e) => { - t.watcher = t.watcher || {}, t.watcher.maxPending = Math.max(10, Math.min(5e3, Math.round(U(e, 500)))), q(t), J(t), i("watcher.maxPending"); + t.watcher = t.watcher || {}, t.watcher.maxPending = Math.max(10, Math.min(5e3, Math.round(W(e, 500)))), J(t), Y(t), n("watcher.maxPending"); } }), e({ - id: `${rn}.Watcher.MinSize`, - category: a(n("cat.scanning"), "Watcher file size"), + id: `${an}.Watcher.MinSize`, + category: r(k("cat.scanning"), "Watcher file size"), name: "Watcher: min size (bytes)", tooltip: "Minimum file size indexed by watcher.", type: "number", @@ -1651,11 +1639,11 @@ function on(e, t, i) { step: 100 }, onChange: (e) => { - t.watcher = t.watcher || {}, t.watcher.minSize = Math.max(0, Math.min(1e6, Math.round(U(e, 100)))), q(t), J(t), i("watcher.minSize"); + t.watcher = t.watcher || {}, t.watcher.minSize = Math.max(0, Math.min(1e6, Math.round(W(e, 100)))), J(t), Y(t), n("watcher.minSize"); } }), e({ - id: `${rn}.Watcher.MaxSize`, - category: a(n("cat.scanning"), "Watcher file size"), + id: `${an}.Watcher.MaxSize`, + category: r(k("cat.scanning"), "Watcher file size"), name: "Watcher: max size (bytes)", tooltip: "Maximum file size indexed by watcher.", type: "number", @@ -1666,40 +1654,40 @@ function on(e, t, i) { step: 1e5 }, onChange: (e) => { - t.watcher = t.watcher || {}, t.watcher.maxSize = Math.max(1e5, Math.min(17179869184, Math.round(U(e, 4294967296)))), q(t), J(t), i("watcher.maxSize"); + t.watcher = t.watcher || {}, t.watcher.maxSize = Math.max(1e5, Math.min(17179869184, Math.round(W(e, 4294967296)))), J(t), Y(t), n("watcher.maxSize"); } }); try { - c().catch(() => {}); + o().catch(() => {}); } catch (e) { console.debug?.(e); } e({ - id: `${rn}.RatingTagsSync.Enabled`, - category: a(n("cat.scanning"), n("setting.sync.rating.name").replace("Majoor: ", "")), - name: n("setting.sync.rating.name"), - tooltip: n("setting.sync.rating.desc"), + id: `${an}.RatingTagsSync.Enabled`, + category: r(k("cat.scanning"), k("setting.sync.rating.name").replace("Majoor: ", "")), + name: k("setting.sync.rating.name"), + tooltip: k("setting.sync.rating.desc"), type: "boolean", defaultValue: !!t.ratingTagsSync?.enabled, onChange: (e) => { - t.ratingTagsSync = t.ratingTagsSync || {}, t.ratingTagsSync.enabled = !!e, q(t), i("ratingTagsSync.enabled"); + t.ratingTagsSync = t.ratingTagsSync || {}, t.ratingTagsSync.enabled = !!e, J(t), n("ratingTagsSync.enabled"); } }); } //#endregion //#region ui/app/settings/settingsFeed.ts -var sn = "Majoor", cn = "Majoor Assets Manager"; -function ln(e, t, r) { - let i = (e) => [ - cn, - n("cat.feed", "Generated Feed"), +var cn = "Majoor", ln = "Majoor Assets Manager"; +function un(e, t, n) { + let r = (e) => [ + ln, + k("cat.feed", "Generated Feed"), e - ], a = () => { + ], i = () => { t.feed = t.feed || {}; }; e({ - id: `${sn}.Feed.CardSize`, - category: i("Card size"), + id: `${cn}.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).", type: "number", @@ -1710,103 +1698,103 @@ function ln(e, t, r) { step: 10 }, onChange: (e) => { - a(), t.feed.minSize = Math.max(60, Math.min(600, Math.round(Number(e) || 120))), q(t), J(t), r("feed.minSize"); + i(), t.feed.minSize = Math.max(60, Math.min(600, Math.round(Number(e) || 120))), J(t), Y(t), n("feed.minSize"); } }), e({ - id: `${sn}.Feed.ShowInfo`, - category: i("Show info section"), + id: `${cn}.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.", type: "boolean", defaultValue: !!(t.feed?.showInfo ?? A.FEED_SHOW_INFO), onChange: (e) => { - a(), t.feed.showInfo = !!e, q(t), J(t), r("feed.showInfo"); + i(), t.feed.showInfo = !!e, J(t), Y(t), n("feed.showInfo"); } }), e({ - id: `${sn}.Feed.ShowFilename`, - category: i("Show filename"), + id: `${cn}.Feed.ShowFilename`, + category: r("Show filename"), name: "Show filename", tooltip: "Display the filename on feed cards.", type: "boolean", defaultValue: !!(t.feed?.showFilename ?? A.FEED_SHOW_FILENAME), onChange: (e) => { - a(), t.feed.showFilename = !!e, q(t), J(t), r("feed.showFilename"); + i(), t.feed.showFilename = !!e, J(t), Y(t), n("feed.showFilename"); } }), e({ - id: `${sn}.Feed.ShowDimensions`, - category: i("Show dimensions"), + id: `${cn}.Feed.ShowDimensions`, + category: r("Show dimensions"), name: "Show dimensions", tooltip: "Display resolution (WxH) and duration on feed cards.", type: "boolean", defaultValue: !!(t.feed?.showDimensions ?? A.FEED_SHOW_DIMENSIONS), onChange: (e) => { - a(), t.feed.showDimensions = !!e, q(t), J(t), r("feed.showDimensions"); + i(), t.feed.showDimensions = !!e, J(t), Y(t), n("feed.showDimensions"); } }), e({ - id: `${sn}.Feed.ShowDate`, - category: i("Show date/time"), + id: `${cn}.Feed.ShowDate`, + category: r("Show date/time"), name: "Show date/time", tooltip: "Display date and time on feed cards.", type: "boolean", defaultValue: !!(t.feed?.showDate ?? A.FEED_SHOW_DATE), onChange: (e) => { - a(), t.feed.showDate = !!e, q(t), J(t), r("feed.showDate"); + i(), t.feed.showDate = !!e, J(t), Y(t), n("feed.showDate"); } }), e({ - id: `${sn}.Feed.ShowGenTime`, - category: i("Show generation time"), + id: `${cn}.Feed.ShowGenTime`, + category: r("Show generation time"), name: "Show generation time", tooltip: "Display the generation time badge on feed cards.", type: "boolean", defaultValue: !!(t.feed?.showGenTime ?? A.FEED_SHOW_GENTIME), onChange: (e) => { - a(), t.feed.showGenTime = !!e, q(t), J(t), r("feed.showGenTime"); + i(), t.feed.showGenTime = !!e, J(t), Y(t), n("feed.showGenTime"); } }), e({ - id: `${sn}.Feed.ShowWorkflowDot`, - category: i("Show workflow dot"), + id: `${cn}.Feed.ShowWorkflowDot`, + category: r("Show workflow dot"), name: "Show workflow indicator", tooltip: "Display the workflow availability dot on feed cards.", type: "boolean", defaultValue: !!(t.feed?.showWorkflowDot ?? A.FEED_SHOW_WORKFLOW_DOT), onChange: (e) => { - a(), t.feed.showWorkflowDot = !!e, q(t), J(t), r("feed.showWorkflowDot"); + i(), t.feed.showWorkflowDot = !!e, J(t), Y(t), n("feed.showWorkflowDot"); } }), e({ - id: `${sn}.Feed.ShowExtBadge`, - category: i("Show format badges"), + id: `${cn}.Feed.ShowExtBadge`, + category: r("Show format badges"), name: "Show format badges", tooltip: "Display format badges (e.g. JPG, MP4) on feed card thumbnails.", type: "boolean", defaultValue: !!(t.feed?.showExtBadge ?? A.FEED_SHOW_BADGES_EXTENSION), onChange: (e) => { - a(), t.feed.showExtBadge = !!e, q(t), J(t), r("feed.showExtBadge"); + i(), t.feed.showExtBadge = !!e, J(t), Y(t), n("feed.showExtBadge"); } }), e({ - id: `${sn}.Feed.ShowRatingBadge`, - category: i("Show rating badges"), + id: `${cn}.Feed.ShowRatingBadge`, + category: r("Show rating badges"), name: "Show ratings", tooltip: "Display star ratings on feed card thumbnails.", type: "boolean", defaultValue: !!(t.feed?.showRatingBadge ?? A.FEED_SHOW_BADGES_RATING), onChange: (e) => { - a(), t.feed.showRatingBadge = !!e, q(t), J(t), r("feed.showRatingBadge"); + i(), t.feed.showRatingBadge = !!e, J(t), Y(t), n("feed.showRatingBadge"); } }), e({ - id: `${sn}.Feed.ShowTagsBadge`, - category: i("Show tags badges"), + id: `${cn}.Feed.ShowTagsBadge`, + category: r("Show tags badges"), name: "Show tags", tooltip: "Display tag indicators on feed card thumbnails.", type: "boolean", defaultValue: !!(t.feed?.showTagsBadge ?? A.FEED_SHOW_BADGES_TAGS), onChange: (e) => { - a(), t.feed.showTagsBadge = !!e, q(t), J(t), r("feed.showTagsBadge"); + i(), t.feed.showTagsBadge = !!e, J(t), Y(t), n("feed.showTagsBadge"); } }); } //#endregion //#region ui/app/settings/settingsSecurity.ts -var un = "Majoor", dn = "Majoor Assets Manager", fn = 16, pn = { +var dn = "Majoor", fn = "Majoor Assets Manager", pn = 16, mn = { safeMode: !1, allowWrite: !0, allowDelete: !0, @@ -1814,106 +1802,106 @@ var un = "Majoor", dn = "Majoor Assets Manager", fn = 16, pn = { allowOpenInFolder: !0, allowResetIndex: !0 }; -function mn(e) { +function hn(e) { return !!e; } -function hn(e, t) { - return mn(e) === mn(t); -} -function gn(e) { - return typeof e == "string" ? e.trim() : ""; +function gn(e, t) { + return hn(e) === hn(t); } function _n(e) { + return typeof e == "string" ? e.trim() : ""; +} +function vn(e) { let t = String(e || "").trim().toLowerCase(); return t === "localhost" || t === "127.0.0.1" || t === "::1"; } -function vn() { +function yn() { return globalThis.location || globalThis.window?.location || null; } -function yn() { - let e = vn(); +function bn() { + let e = yn(); if (!e) return !1; let t = String(e.protocol || "").toLowerCase(), n = String(e.hostname || "").trim(); - return t === "http:" && !_n(n); + return t === "http:" && !vn(n); } -function bn(e) { +function xn(e) { let t = globalThis.crypto; if (!t?.getRandomValues) throw Error("Secure token generation requires crypto.getRandomValues()."); return t.getRandomValues(e); } -function xn(e) { +function Sn(e) { let t = Math.max(4, Number(e) || 0), n = new Uint8Array(t); - return bn(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); + return xn(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); } -function Sn() { - return `mjr_${xn(18)}`; -} -function Cn(e) { - return String(e?.apiToken || "").trim().length >= fn && H(e?.allowWrite, !0) && H(e?.requireAuth, !1) && !H(e?.allowRemoteWrite, !1); +function Cn() { + return `mjr_${Sn(18)}`; } function wn(e) { + return String(e?.apiToken || "").trim().length >= pn && U(e?.allowWrite, !0) && U(e?.requireAuth, !1) && !U(e?.allowRemoteWrite, !1); +} +function Tn(e) { let t = String((e && typeof e == "object" ? e : {}).apiToken || "").trim(); return { - apiToken: t.length >= fn ? t : Sn(), + apiToken: t.length >= pn ? t : Cn(), allowWrite: !0, requireAuth: !0, allowRemoteWrite: !1, - allowInsecureTokenTransport: yn() - }; -} -function Tn(e) { - let t = e || {}; - return { - safe_mode: H(t.safeMode, !1), - allow_write: H(t.allowWrite, !0), - require_auth: H(t.requireAuth, !1), - allow_remote_write: H(t.allowRemoteWrite, !1), - allow_insecure_token_transport: H(t.allowInsecureTokenTransport, !1), - allow_delete: H(t.allowDelete, !0), - allow_rename: H(t.allowRename, !0), - allow_open_in_folder: H(t.allowOpenInFolder, !0), - allow_reset_index: H(t.allowResetIndex, !0), - ...String(t.apiToken || "").trim() ? { api_token: String(t.apiToken || "").trim() } : {} + allowInsecureTokenTransport: bn() }; } function En(e) { - return ie(Tn(e)); + let t = e || {}; + return { + safe_mode: U(t.safeMode, !1), + allow_write: U(t.allowWrite, !0), + require_auth: U(t.requireAuth, !1), + allow_remote_write: U(t.allowRemoteWrite, !1), + allow_insecure_token_transport: U(t.allowInsecureTokenTransport, !1), + allow_delete: U(t.allowDelete, !0), + allow_rename: U(t.allowRename, !0), + allow_open_in_folder: U(t.allowOpenInFolder, !0), + allow_reset_index: U(t.allowResetIndex, !0), + ...String(t.apiToken || "").trim() ? { api_token: String(t.apiToken || "").trim() } : {} + }; } function Dn(e) { - let t = String(e?.security?.tokenHint || "").trim(); - return t ? n("setting.sec.token.placeholderConfigured", "Token configured on server ({tokenHint}). Leave blank to keep the current server token.", { tokenHint: t }) : e?.security?.tokenConfigured ? n("setting.sec.token.placeholderConfiguredGeneric", "Token configured on server. Leave blank to keep the current server token.") : n("setting.sec.token.placeholder", "Auto-generated for this browser session."); + return se(En(e)); } -function On(e, t, a) { - let o = (e, t) => [ - dn, +function On(e) { + let t = String(e?.security?.tokenHint || "").trim(); + return t ? k("setting.sec.token.placeholderConfigured", "Token configured on server ({tokenHint}). Leave blank to keep the current server token.", { tokenHint: t }) : e?.security?.tokenConfigured ? k("setting.sec.token.placeholderConfiguredGeneric", "Token configured on server. Leave blank to keep the current server token.") : k("setting.sec.token.placeholder", "Auto-generated for this browser session."); +} +function kn(e, t, n) { + let r = (e, t) => [ + fn, e, t ]; e({ - id: `${un}.Safety.ConfirmDeletion`, - category: o(n("cat.security"), "Confirm before deleting"), + id: `${dn}.Safety.ConfirmDeletion`, + category: r(k("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: t.safety?.confirmDeletion !== !1, onChange: (e) => { - hn(t.safety?.confirmDeletion !== !1, e) || (t.safety = t.safety || {}, t.safety.confirmDeletion = !!e, q(t), J(t), a("safety.confirmDeletion")); + gn(t.safety?.confirmDeletion !== !1, e) || (t.safety = t.safety || {}, t.safety.confirmDeletion = !!e, J(t), Y(t), n("safety.confirmDeletion")); } }); - let s = (r, i, s, c = "cat.security") => { + let i = (i, a, o, s = "cat.security") => { e({ - id: `${un}.Security.${r}`, - category: o(n(c), n(i).replace("Majoor: ", "")), - name: n(i), - tooltip: n(s), + id: `${dn}.Security.${i}`, + category: r(k(s), k(a).replace("Majoor: ", "")), + name: k(a), + tooltip: k(o), type: "boolean", - defaultValue: H(t.security?.[r], pn[r] ?? !1), + defaultValue: U(t.security?.[i], mn[i] ?? !1), onChange: (e) => { - if (!hn(t.security?.[r], e)) { - t.security = t.security || {}, t.security[r] = !!e, q(t), a(`security.${r}`); + if (!gn(t.security?.[i], e)) { + t.security = t.security || {}, t.security[i] = !!e, J(t), n(`security.${i}`); try { - En(t.security).then((e) => { - e?.ok && e.data?.prefs ? Ft() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e); + Dn(t.security).then((e) => { + e?.ok && e.data?.prefs ? It() : e && e.ok === !1 && console.warn("[Majoor] backend security settings update failed", e.error || e); }).catch(() => {}); } catch (e) { console.debug?.(e); @@ -1922,134 +1910,134 @@ function On(e, t, a) { } }); }; - s("safeMode", "setting.sec.safe.name", "setting.sec.safe.desc"), s("allowWrite", "setting.sec.write.name", "setting.sec.write.desc"), s("allowDelete", "setting.sec.del.name", "setting.sec.del.desc"), s("allowRename", "setting.sec.ren.name", "setting.sec.ren.desc"), s("allowOpenInFolder", "setting.sec.open.name", "setting.sec.open.desc"), s("allowResetIndex", "setting.sec.reset.name", "setting.sec.reset.desc"), e({ - id: `${un}.Security.RemoteLanPreset`, - category: o(n("cat.remote"), n("setting.sec.remoteLanPreset.name").replace("Majoor: ", "")), - name: n("setting.sec.remoteLanPreset.name"), - tooltip: n("setting.sec.remoteLanPreset.desc"), + i("safeMode", "setting.sec.safe.name", "setting.sec.safe.desc"), i("allowWrite", "setting.sec.write.name", "setting.sec.write.desc"), i("allowDelete", "setting.sec.del.name", "setting.sec.del.desc"), i("allowRename", "setting.sec.ren.name", "setting.sec.ren.desc"), i("allowOpenInFolder", "setting.sec.open.name", "setting.sec.open.desc"), i("allowResetIndex", "setting.sec.reset.name", "setting.sec.reset.desc"), e({ + id: `${dn}.Security.RemoteLanPreset`, + category: r(k("cat.remote"), k("setting.sec.remoteLanPreset.name").replace("Majoor: ", "")), + name: k("setting.sec.remoteLanPreset.name"), + tooltip: k("setting.sec.remoteLanPreset.desc"), type: "boolean", - defaultValue: Cn(t.security), + defaultValue: wn(t.security), onChange: (e) => { - if (t.security = t.security || {}, hn(t.security.remoteLanPreset, e)) return; + if (t.security = t.security || {}, gn(t.security.remoteLanPreset, e)) return; if (t.security.remoteLanPreset = !!e, !e) { - q(t), a("security.remoteLanPreset"); + J(t), n("security.remoteLanPreset"); return; } - let o; + let r; try { - o = wn(t.security); + r = Tn(t.security); } catch (e) { - r(e?.message || n("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); + y(e?.message || k("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); return; } - Object.assign(t.security, o), t.security.tokenConfigured = !0, t.security.tokenHint = String(o.apiToken || "").trim() ? `...${String(o.apiToken).trim().slice(-4)}` : "", o.apiToken && i(o.apiToken), q(t), a("security.remoteLanPreset"), a("security.apiToken"), a("security.allowWrite"), a("security.requireAuth"), a("security.allowRemoteWrite"), a("security.allowInsecureTokenTransport"); + Object.assign(t.security, r), t.security.tokenConfigured = !0, t.security.tokenHint = String(r.apiToken || "").trim() ? `...${String(r.apiToken).trim().slice(-4)}` : "", r.apiToken && w(r.apiToken), J(t), n("security.remoteLanPreset"), n("security.apiToken"), n("security.allowWrite"), n("security.requireAuth"), n("security.allowRemoteWrite"), n("security.allowInsecureTokenTransport"); try { - En(t.security).then((e) => { - e?.ok && e.data?.prefs ? (Ft(), r(n("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (r(e.error || n("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"), console.warn("[Majoor] backend remote LAN preset update failed", e.error || e)); + Dn(t.security).then((e) => { + e?.ok && e.data?.prefs ? (It(), y(k("toast.remoteLanPresetApplied", "Recommended remote LAN setup applied. This browser session is now authorized for Majoor write operations."), "success")) : e && e.ok === !1 && (y(e.error || k("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) => { - r(e?.message || n("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); + y(e?.message || k("toast.remoteLanPresetFailed", "Failed to apply the recommended remote LAN setup."), "error"); }); } catch (e) { console.debug?.(e); } } }), e({ - id: `${un}.Security.ApiToken`, - category: o(n("cat.remote"), n("setting.sec.token.name").replace("Majoor: ", "")), - name: n("setting.sec.token.name", "Majoor: API Token"), - tooltip: n("setting.sec.token.desc", "Store the API token used for write operations. Majoor sends it via X-MJR-Token and Authorization headers."), + id: `${dn}.Security.ApiToken`, + category: r(k("cat.remote"), k("setting.sec.token.name").replace("Majoor: ", "")), + name: k("setting.sec.token.name", "Majoor: API Token"), + tooltip: k("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: t.security?.apiToken || "", - attrs: { placeholder: Dn(t) }, + attrs: { placeholder: On(t) }, onChange: (e) => { t.security = t.security || {}; - let n = gn(e); - if (gn(t.security.apiToken) !== n && (t.security.apiToken = n, t.security.apiToken && (t.security.tokenConfigured = !0, t.security.tokenHint = `...${t.security.apiToken.slice(-4)}`, i(t.security.apiToken)), q(t), a("security.apiToken"), t.security.apiToken)) try { - ie({ api_token: t.security.apiToken }).then((e) => { - e?.ok && e.data?.prefs ? Ft() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e); + let r = _n(e); + if (_n(t.security.apiToken) !== r && (t.security.apiToken = r, t.security.apiToken && (t.security.tokenConfigured = !0, t.security.tokenHint = `...${t.security.apiToken.slice(-4)}`, w(t.security.apiToken)), J(t), n("security.apiToken"), t.security.apiToken)) try { + se({ api_token: t.security.apiToken }).then((e) => { + e?.ok && e.data?.prefs ? It() : e && e.ok === !1 && console.warn("[Majoor] backend token update failed", e.error || e); }).catch(() => {}); } catch (e) { console.debug?.(e); } } - }), s("requireAuth", "setting.sec.requireAuth.name", "setting.sec.requireAuth.desc", "cat.remote"), s("allowRemoteWrite", "setting.sec.remote.name", "setting.sec.remote.desc", "cat.remote"), s("allowInsecureTokenTransport", "setting.sec.insecureTransport.name", "setting.sec.insecureTransport.desc", "cat.remote"); + }), i("requireAuth", "setting.sec.requireAuth.name", "setting.sec.requireAuth.desc", "cat.remote"), i("allowRemoteWrite", "setting.sec.remote.name", "setting.sec.remote.desc", "cat.remote"), i("allowInsecureTokenTransport", "setting.sec.insecureTransport.name", "setting.sec.insecureTransport.desc", "cat.remote"); } //#endregion //#region ui/app/settings/settingsAdvanced.ts -var X = "Majoor", kn = "Majoor Assets Manager"; -function An(e, t, i, a) { - let s = (e, t) => [ - kn, +var Z = "Majoor", An = "Majoor Assets Manager"; +function jn(t, a, o, l) { + let d = (e, t) => [ + An, e, t - ], c = String(t.paths?.outputDirectory || ""), d = null, m = 0, x = null; - e({ - id: `${X}.Paths.OutputDirectory`, - category: s(n("cat.advanced"), "Paths / Output"), + ], p = String(a.paths?.outputDirectory || ""), m = null, h = 0, g = null; + t({ + id: `${Z}.Paths.OutputDirectory`, + category: d(k("cat.advanced"), "Paths / Output"), name: "Majoor: Generation Output Directory", tooltip: "Override the ComfyUI generation output directory used by Majoor (equivalent to --output-directory). Leave empty to keep the current backend default.", type: "text", - defaultValue: String(t.paths?.outputDirectory || ""), + defaultValue: String(a.paths?.outputDirectory || ""), attrs: { placeholder: "D:\\\\____COMFY_OUTPUTS" }, onChange: async (e) => { - let a = String(e || "").trim(); - t.paths = t.paths || {}, t.paths.outputDirectory = a, q(t); + let t = String(e || "").trim(); + a.paths = a.paths || {}, a.paths.outputDirectory = t, J(a); try { - d &&= (clearTimeout(d), null); + m &&= (clearTimeout(m), null); } catch (e) { console.debug?.(e); } - d = setTimeout(async () => { - d = null; - let e = ++m; + m = setTimeout(async () => { + m = null; + let e = ++h; try { - x?.abort?.(); + g?.abort?.(); } catch (e) { console.debug?.(e); } - x = typeof AbortController < "u" ? new AbortController() : null; + g = typeof AbortController < "u" ? new AbortController() : null; try { - let r = await re(a, x ? { signal: x.signal } : {}); - if (e !== m) return; - if (!r?.ok) throw Error(r?.error || n("toast.failedSetOutputDirectory", "Failed to set output directory")); - let o = String(r?.data?.output_directory || a).trim(); - t.paths.outputDirectory = o, c = o, q(t), i("paths.outputDirectory"); - } catch (a) { - if (e !== m || String(a?.name || "") === "AbortError" || String(a?.code || "") === "ABORTED") return; - t.paths.outputDirectory = c, q(t), i("paths.outputDirectory"), r(a?.message || n("toast.failedSetOutputDirectory", "Failed to set output directory"), "error"); + let n = await f(t, g ? { signal: g.signal } : {}); + if (e !== h) return; + if (!n?.ok) throw Error(n?.error || k("toast.failedSetOutputDirectory", "Failed to set output directory")); + let r = String(n?.data?.output_directory || t).trim(); + a.paths.outputDirectory = r, p = r, J(a), o("paths.outputDirectory"); + } catch (t) { + if (e !== h || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return; + a.paths.outputDirectory = p, J(a), o("paths.outputDirectory"), y(t?.message || k("toast.failedSetOutputDirectory", "Failed to set output directory"), "error"); } }, 700); } }); try { - f().then((e) => { + r().then((e) => { if (!e?.ok) return; - let n = String(e?.data?.output_directory || "").trim(); - t.paths = t.paths || {}, t.paths.outputDirectory !== n && (t.paths.outputDirectory = n, c = n, q(t), i("paths.outputDirectory")); + let t = String(e?.data?.output_directory || "").trim(); + a.paths = a.paths || {}, a.paths.outputDirectory !== t && (a.paths.outputDirectory = t, p = t, J(a), o("paths.outputDirectory")); }).catch(() => {}); } catch (e) { console.debug?.(e); } - let S = String(t.paths?.indexDirectory || ""), w = null, T = 0, E = null; - e({ - id: `${X}.Paths.IndexDirectory`, - category: s(n("cat.advanced"), "Paths / Index"), + let x = String(a.paths?.indexDirectory || ""), C = null, w = 0, E = null; + t({ + id: `${Z}.Paths.IndexDirectory`, + category: d(k("cat.advanced"), "Paths / Index"), name: "Majoor: Index Database Directory", tooltip: "Override the Majoor index database directory. Use this to keep the SQLite index on a different local disk. Requires restart.", type: "text", - defaultValue: String(t.paths?.indexDirectory || ""), + defaultValue: String(a.paths?.indexDirectory || ""), attrs: { placeholder: "D:\\MajoorIndex" }, onChange: async (e) => { - let a = String(e || "").trim(); - t.paths = t.paths || {}, t.paths.indexDirectory = a, q(t); + let t = String(e || "").trim(); + a.paths = a.paths || {}, a.paths.indexDirectory = t, J(a); try { - w &&= (clearTimeout(w), null); + C &&= (clearTimeout(C), null); } catch (e) { console.debug?.(e); } - w = setTimeout(async () => { - w = null; - let e = ++T; + C = setTimeout(async () => { + C = null; + let e = ++w; try { E?.abort?.(); } catch (e) { @@ -2057,253 +2045,253 @@ function An(e, t, i, a) { } E = typeof AbortController < "u" ? new AbortController() : null; try { - let o = await te(a, E ? { signal: E.signal } : {}); - if (e !== T) return; - if (!o?.ok) throw Error(o?.error || n("toast.failedSetIndexDirectory", "Failed to set index directory")); - let s = String(o?.data?.index_directory || a).trim(), c = s !== S; - t.paths.indexDirectory = s, S = s, q(t), i("paths.indexDirectory"), c && r(n("toast.indexDirectorySavedRestart", "Index directory saved. Restart ComfyUI to apply."), "success", void 0, { history: { trackId: "settings:index-directory-saved" } }); - } catch (a) { - if (e !== T || String(a?.name || "") === "AbortError" || String(a?.code || "") === "ABORTED") return; - t.paths.indexDirectory = S, q(t), i("paths.indexDirectory"), r(a?.message || n("toast.failedSetIndexDirectory", "Failed to set index directory"), "error"); + let n = await _(t, E ? { signal: E.signal } : {}); + if (e !== w) return; + if (!n?.ok) throw Error(n?.error || k("toast.failedSetIndexDirectory", "Failed to set index directory")); + let r = String(n?.data?.index_directory || t).trim(), i = r !== x; + a.paths.indexDirectory = r, x = r, J(a), o("paths.indexDirectory"), i && y(k("toast.indexDirectorySavedRestart", "Index directory saved. Restart ComfyUI to apply."), "success", void 0, { history: { trackId: "settings:index-directory-saved" } }); + } catch (t) { + if (e !== w || String(t?.name || "") === "AbortError" || String(t?.code || "") === "ABORTED") return; + a.paths.indexDirectory = x, J(a), o("paths.indexDirectory"), y(t?.message || k("toast.failedSetIndexDirectory", "Failed to set index directory"), "error"); } }, 700); } }); try { - _().then((e) => { + O().then((e) => { if (!e?.ok) return; - let n = String(e?.data?.index_directory || "").trim(); - t.paths = t.paths || {}, t.paths.indexDirectory !== n && (t.paths.indexDirectory = n, S = n, q(t), i("paths.indexDirectory")); + let t = String(e?.data?.index_directory || "").trim(); + a.paths = a.paths || {}, a.paths.indexDirectory !== t && (a.paths.indexDirectory = t, x = t, J(a), o("paths.indexDirectory")); }).catch(() => {}); } catch (e) { console.debug?.(e); } - let ee = o().map((e) => e.code), D = ["auto", ...ee]; - e({ - id: `${X}.Language`, - category: s(n("cat.advanced"), n("setting.language.name", "Language")), - name: n("setting.language.name", "Majoor: Language"), + let ne = he().map((e) => e.code), re = ["auto", ...ne]; + t({ + id: `${Z}.Language`, + category: d(k("cat.advanced"), k("setting.language.name", "Language")), + name: k("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: t.i18n?.followComfyLanguage ? "auto" : v(), - options: D, + defaultValue: a.i18n?.followComfyLanguage ? "auto" : ye(), + options: re, onChange: (e) => { - if (t.i18n = t.i18n || {}, e === "auto") { - t.i18n.followComfyLanguage = !0, p(!0), u(a), q(t), i("language"); + if (a.i18n = a.i18n || {}, e === "auto") { + a.i18n.followComfyLanguage = !0, ve(!0), pe(l), J(a), o("language"); return; } - ee.includes(e) && (t.i18n.followComfyLanguage = !1, p(!1), b(e), q(t), i("language")); + ne.includes(e) && (a.i18n.followComfyLanguage = !1, ve(!1), be(e), J(a), o("language")); } - }), e({ - id: `${X}.ProbeBackend.Mode`, - category: s(n("cat.advanced"), n("setting.probe.mode.name").replace("Majoor: ", "")), - name: n("setting.probe.mode.name"), - tooltip: n("setting.probe.mode.desc") + " (env: MAJOOR_MEDIA_PROBE_BACKEND)", + }), t({ + id: `${Z}.ProbeBackend.Mode`, + category: d(k("cat.advanced"), k("setting.probe.mode.name").replace("Majoor: ", "")), + name: k("setting.probe.mode.name"), + tooltip: k("setting.probe.mode.desc") + " (env: MAJOOR_MEDIA_PROBE_BACKEND)", type: "combo", - defaultValue: t.probeBackend?.mode || G.probeBackend.mode, + defaultValue: a.probeBackend?.mode || K.probeBackend.mode, options: [ "auto", "exiftool", "ffprobe", "both" ], - onChange: (e) => { - let n = ct(e, [ + onChange: (t) => { + let n = lt(t, [ "auto", "exiftool", "ffprobe", "both" - ], G.probeBackend.mode); - t.probeBackend = t.probeBackend || {}, t.probeBackend.mode = n, q(t), J(t), i("probeBackend.mode"), le(n).catch(() => {}); + ], K.probeBackend.mode); + a.probeBackend = a.probeBackend || {}, a.probeBackend.mode = n, J(a), Y(a), o("probeBackend.mode"), e(n).catch(() => {}); } - }), e({ - id: `${X}.MetadataFallback.Image`, - category: s(n("cat.advanced"), "Metadata"), + }), t({ + id: `${Z}.MetadataFallback.Image`, + category: d(k("cat.advanced"), "Metadata"), name: "Majoor: Metadata Fallback (Images)", tooltip: "Enable Pillow fallback when ExifTool is missing or fails.", type: "boolean", - defaultValue: t.metadataFallback?.image ?? G.metadataFallback.image, + defaultValue: a.metadataFallback?.image ?? K.metadataFallback.image, onChange: async (e) => { - let a = !!e, o = !!(t.metadataFallback?.image ?? G.metadataFallback.image); - t.metadataFallback = t.metadataFallback || {}, t.metadataFallback.image = a, q(t), i("metadataFallback.image"); + let t = !!e, n = !!(a.metadataFallback?.image ?? K.metadataFallback.image); + a.metadataFallback = a.metadataFallback || {}, a.metadataFallback.image = t, J(a), o("metadataFallback.image"); try { - let e = await he({ - image: a, - media: t.metadataFallback?.media ?? G.metadataFallback.media + let e = await v({ + image: t, + media: a.metadataFallback?.media ?? K.metadataFallback.media }); - if (!e?.ok) throw Error(e?.error || n("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings")); + if (!e?.ok) throw Error(e?.error || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings")); } catch (e) { - t.metadataFallback.image = o, q(t), i("metadataFallback.image"), r(e?.message || n("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error"); + a.metadataFallback.image = n, J(a), o("metadataFallback.image"), y(e?.message || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error"); } } - }), e({ - id: `${X}.MetadataFallback.Media`, - category: s(n("cat.advanced"), "Metadata"), + }), t({ + id: `${Z}.MetadataFallback.Media`, + category: d(k("cat.advanced"), "Metadata"), name: "Majoor: Metadata Fallback (Audio/Video)", tooltip: "Enable hachoir fallback when ffprobe is missing or fails.", type: "boolean", - defaultValue: t.metadataFallback?.media ?? G.metadataFallback.media, + defaultValue: a.metadataFallback?.media ?? K.metadataFallback.media, onChange: async (e) => { - let a = !!e, o = !!(t.metadataFallback?.media ?? G.metadataFallback.media); - t.metadataFallback = t.metadataFallback || {}, t.metadataFallback.media = a, q(t), i("metadataFallback.media"); + let t = !!e, n = !!(a.metadataFallback?.media ?? K.metadataFallback.media); + a.metadataFallback = a.metadataFallback || {}, a.metadataFallback.media = t, J(a), o("metadataFallback.media"); try { - let e = await he({ - image: t.metadataFallback?.image ?? G.metadataFallback.image, - media: a + let e = await v({ + image: a.metadataFallback?.image ?? K.metadataFallback.image, + media: t }); - if (!e?.ok) throw Error(e?.error || n("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings")); + if (!e?.ok) throw Error(e?.error || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings")); } catch (e) { - t.metadataFallback.media = o, q(t), i("metadataFallback.media"), r(e?.message || n("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error"); + a.metadataFallback.media = n, J(a), o("metadataFallback.media"), y(e?.message || k("toast.failedUpdateMetadataFallback", "Failed to update metadata fallback settings"), "error"); } } }); try { - l().then((e) => { + i().then((e) => { if (!e?.ok || !e?.data?.prefs) return; - let n = e.data.prefs || {}, r = !!(n.image ?? G.metadataFallback.image), a = !!(n.media ?? G.metadataFallback.media); - t.metadataFallback = t.metadataFallback || {}; - let o = !1; - t.metadataFallback.image !== r && (t.metadataFallback.image = r, o = !0), t.metadataFallback.media !== a && (t.metadataFallback.media = a, o = !0), o && (q(t), i("metadataFallback")); + let t = e.data.prefs || {}, n = !!(t.image ?? K.metadataFallback.image), r = !!(t.media ?? K.metadataFallback.media); + a.metadataFallback = a.metadataFallback || {}; + let i = !1; + a.metadataFallback.image !== n && (a.metadataFallback.image = n, i = !0), a.metadataFallback.media !== r && (a.metadataFallback.media = r, i = !0), i && (J(a), o("metadataFallback")); }).catch(() => {}); } catch (e) { console.debug?.(e); } - e({ - id: `${X}.Db.Timeout`, - category: s(n("cat.advanced"), "Database"), + t({ + id: `${Z}.Db.Timeout`, + category: d(k("cat.advanced"), "Database"), name: "DB Timeout (ms)", tooltip: "Client-side DB timeout preference (stored locally).", type: "number", - defaultValue: Number(t.db?.timeoutMs || 5e3), + defaultValue: Number(a.db?.timeoutMs || 5e3), attrs: { min: 1e3, max: 3e4, step: 1e3 }, onChange: (e) => { - t.db = t.db || {}, t.db.timeoutMs = Math.max(1e3, Math.min(3e4, Math.round(U(e, 5e3)))), q(t), J(t), i("db.timeoutMs"); + a.db = a.db || {}, a.db.timeoutMs = Math.max(1e3, Math.min(3e4, Math.round(W(e, 5e3)))), J(a), Y(a), o("db.timeoutMs"); } - }), e({ - id: `${X}.Db.MaxConnections`, - category: s(n("cat.advanced"), "Database"), + }), t({ + id: `${Z}.Db.MaxConnections`, + category: d(k("cat.advanced"), "Database"), name: "DB Max Connections", tooltip: "Client-side DB max connections preference (stored locally).", type: "number", - defaultValue: Number(t.db?.maxConnections || 10), + defaultValue: Number(a.db?.maxConnections || 10), attrs: { min: 1, max: 100, step: 1 }, onChange: (e) => { - t.db = t.db || {}, t.db.maxConnections = Math.max(1, Math.min(100, Math.round(U(e, 10)))), q(t), J(t), i("db.maxConnections"); + a.db = a.db || {}, a.db.maxConnections = Math.max(1, Math.min(100, Math.round(W(e, 10)))), J(a), Y(a), o("db.maxConnections"); } - }), e({ - id: `${X}.Db.QueryTimeout`, - category: s(n("cat.advanced"), "Database"), + }), t({ + id: `${Z}.Db.QueryTimeout`, + category: d(k("cat.advanced"), "Database"), name: "DB Query Timeout (ms)", tooltip: "Client-side DB query timeout preference (stored locally).", type: "number", - defaultValue: Number(t.db?.queryTimeoutMs || 1e3), + defaultValue: Number(a.db?.queryTimeoutMs || 1e3), attrs: { min: 500, max: 1e4, step: 500 }, onChange: (e) => { - t.db = t.db || {}, t.db.queryTimeoutMs = Math.max(500, Math.min(1e4, Math.round(U(e, 1e3)))), q(t), J(t), i("db.queryTimeoutMs"); + a.db = a.db || {}, a.db.queryTimeoutMs = Math.max(500, Math.min(1e4, Math.round(W(e, 1e3)))), J(a), Y(a), o("db.queryTimeoutMs"); } - }), e({ - id: `${X}.Observability.Enabled`, - category: s(n("cat.advanced"), n("setting.obs.enabled.name").replace("Majoor: ", "")), - name: n("setting.obs.enabled.name"), - tooltip: n("setting.obs.enabled.desc"), + }), t({ + id: `${Z}.Observability.Enabled`, + category: d(k("cat.advanced"), k("setting.obs.enabled.name").replace("Majoor: ", "")), + name: k("setting.obs.enabled.name"), + tooltip: k("setting.obs.enabled.desc"), type: "boolean", - defaultValue: !!t.observability?.enabled, + defaultValue: !!a.observability?.enabled, onChange: (e) => { - t.observability = t.observability || {}, t.observability.enabled = !!e, q(t), J(t), i("observability.enabled"); + a.observability = a.observability || {}, a.observability.enabled = !!e, J(a), Y(a), o("observability.enabled"); } - }), e({ - id: `${X}.Observability.RuntimeDashboardMode`, - category: s(n("cat.advanced"), "Runtime metrics badge"), + }), t({ + id: `${Z}.Observability.RuntimeDashboardMode`, + category: d(k("cat.advanced"), "Runtime metrics badge"), name: "Majoor: Runtime metrics badge", tooltip: "Controls the small DB/enrichment/watcher metrics badge in the Assets Manager panel.", type: "combo", - defaultValue: t.observability?.runtimeDashboardMode || G.observability.runtimeDashboardMode, + defaultValue: a.observability?.runtimeDashboardMode || K.observability.runtimeDashboardMode, options: [ "autoHide30", "always", "hidden" ], onChange: (e) => { - let n = ct(e, [ + let t = lt(e, [ "autoHide30", "always", "hidden" - ], G.observability.runtimeDashboardMode); - t.observability = t.observability || {}, t.observability.runtimeDashboardMode = n, q(t), i("observability.runtimeDashboardMode"); + ], K.observability.runtimeDashboardMode); + a.observability = a.observability || {}, a.observability.runtimeDashboardMode = t, J(a), o("observability.runtimeDashboardMode"); } - }), e({ - id: `${X}.Observability.VerboseErrors`, - category: s(n("cat.advanced"), "Verbose error logging"), + }), t({ + id: `${Z}.Observability.VerboseErrors`, + category: d(k("cat.advanced"), "Verbose error logging"), name: "Verbose error logging", tooltip: "Show detailed error messages in toasts and console. Useful for debugging.", type: "boolean", - defaultValue: !!t.observability?.verboseErrors, + defaultValue: !!a.observability?.verboseErrors, onChange: (e) => { - t.observability = t.observability || {}, t.observability.verboseErrors = !!e, q(t), J(t), i("observability.verboseErrors"); + a.observability = a.observability || {}, a.observability.verboseErrors = !!e, J(a), Y(a), o("observability.verboseErrors"); } - }), e({ - id: `${X}.Observability.VerboseRouteRegistrationLogs`, - category: s(n("cat.advanced"), "Logs"), + }), t({ + id: `${Z}.Observability.VerboseRouteRegistrationLogs`, + category: d(k("cat.advanced"), "Logs"), name: "Majoor: Verbose route registration logs", tooltip: "When disabled, Majoor prints a compact startup summary instead of listing every registered API route. Takes effect on the next backend restart.", type: "boolean", - defaultValue: !!(t.observability?.verboseRouteRegistrationLogs ?? G.observability?.verboseRouteRegistrationLogs ?? !1), + defaultValue: !!(a.observability?.verboseRouteRegistrationLogs ?? K.observability?.verboseRouteRegistrationLogs ?? !1), onChange: async (e) => { - let n = !!e, a = !!(t.observability?.verboseRouteRegistrationLogs ?? G.observability?.verboseRouteRegistrationLogs ?? !1); - t.observability = t.observability || {}, t.observability.verboseRouteRegistrationLogs = n, q(t), i("observability.verboseRouteRegistrationLogs"); + let t = !!e, n = !!(a.observability?.verboseRouteRegistrationLogs ?? K.observability?.verboseRouteRegistrationLogs ?? !1); + a.observability = a.observability || {}, a.observability.verboseRouteRegistrationLogs = t, J(a), o("observability.verboseRouteRegistrationLogs"); try { - let e = await ge(n); + let e = await S(t); if (!e?.ok) throw Error(e?.error || "Failed to update route logging settings"); } catch (e) { - t.observability.verboseRouteRegistrationLogs = a, q(t), i("observability.verboseRouteRegistrationLogs"), r(e?.message || "Failed to update route logging settings", "error"); + a.observability.verboseRouteRegistrationLogs = n, J(a), o("observability.verboseRouteRegistrationLogs"), y(e?.message || "Failed to update route logging settings", "error"); } } }), (async () => { try { - let e = !!(await y())?.data?.prefs?.enabled; - t.observability = t.observability || {}, t.observability.verboseRouteRegistrationLogs !== e && (t.observability.verboseRouteRegistrationLogs = e, q(t), i("observability.verboseRouteRegistrationLogs")); + let e = !!(await u())?.data?.prefs?.enabled; + a.observability = a.observability || {}, a.observability.verboseRouteRegistrationLogs !== e && (a.observability.verboseRouteRegistrationLogs = e, J(a), o("observability.verboseRouteRegistrationLogs")); } catch (e) { console.debug?.(e); } - })(), e({ - id: `${X}.Observability.VerboseStartupLogs`, - category: s(n("cat.advanced"), "Logs"), + })(), t({ + id: `${Z}.Observability.VerboseStartupLogs`, + category: d(k("cat.advanced"), "Logs"), name: "Majoor: Verbose startup logs", tooltip: "When disabled, Majoor suppresses most informational bootstrap logs during backend startup while keeping warnings and errors. Takes effect on the next backend restart.", type: "boolean", - defaultValue: !!(t.observability?.verboseStartupLogs ?? G.observability?.verboseStartupLogs ?? !1), + defaultValue: !!(a.observability?.verboseStartupLogs ?? K.observability?.verboseStartupLogs ?? !1), onChange: async (e) => { - let n = !!e, a = !!(t.observability?.verboseStartupLogs ?? G.observability?.verboseStartupLogs ?? !1); - t.observability = t.observability || {}, t.observability.verboseStartupLogs = n, q(t), i("observability.verboseStartupLogs"); + let t = !!e, n = !!(a.observability?.verboseStartupLogs ?? K.observability?.verboseStartupLogs ?? !1); + a.observability = a.observability || {}, a.observability.verboseStartupLogs = t, J(a), o("observability.verboseStartupLogs"); try { - let e = await oe(n); + let e = await te(t); if (!e?.ok) throw Error(e?.error || "Failed to update startup logging settings"); } catch (e) { - t.observability.verboseStartupLogs = a, q(t), i("observability.verboseStartupLogs"), r(e?.message || "Failed to update startup logging settings", "error"); + a.observability.verboseStartupLogs = n, J(a), o("observability.verboseStartupLogs"), y(e?.message || "Failed to update startup logging settings", "error"); } } }), (async () => { try { - let e = !!(await C())?.data?.prefs?.enabled; - t.observability = t.observability || {}, t.observability.verboseStartupLogs !== e && (t.observability.verboseStartupLogs = e, q(t), i("observability.verboseStartupLogs")); + let e = !!(await T())?.data?.prefs?.enabled; + a.observability = a.observability || {}, a.observability.verboseStartupLogs !== e && (a.observability.verboseStartupLogs = e, J(a), o("observability.verboseStartupLogs")); } catch (e) { console.debug?.(e); } })(); { - let a = "HuggingFace Token", o = "", c = null, l = 0, u = !!t.ai?.huggingFaceTokenVisible, d = () => { + let e = "HuggingFace Token", r = "", i = null, l = 0, u = !!a.ai?.huggingFaceTokenVisible, f = () => { try { let e = Array.from(document.querySelectorAll("input[data-mjr-hf-token=\"1\"]")); for (let t of e) try { @@ -2314,7 +2302,7 @@ function An(e, t, i, a) { } catch (e) { console.debug?.(e); } - }, f = (e) => { + }, p = (e) => { try { let t = String(e || "").trim(); if (!t) return; @@ -2328,20 +2316,20 @@ function An(e, t, i, a) { console.debug?.(e); } }; - e({ - id: `${X}.AI.HuggingFaceTokenVisible`, - category: s(n("cat.advanced"), a), + t({ + id: `${Z}.AI.HuggingFaceTokenVisible`, + category: d(k("cat.advanced"), e), name: "Show HuggingFace token", tooltip: "Show or hide the HuggingFace token while editing.", type: "boolean", defaultValue: u, onChange: (e) => { - let n = !!e; - u = n, t.ai = t.ai || {}, t.ai.huggingFaceTokenVisible = n, q(t), i("ai.huggingFaceTokenVisible"), setTimeout(d, 0); + let t = !!e; + u = t, a.ai = a.ai || {}, a.ai.huggingFaceTokenVisible = t, J(a), o("ai.huggingFaceTokenVisible"), setTimeout(f, 0); } - }), e({ - id: `${X}.AI.HuggingFaceToken`, - category: s(n("cat.advanced"), a), + }), t({ + id: `${Z}.AI.HuggingFaceToken`, + category: d(k("cat.advanced"), e), name: "HuggingFace Token", tooltip: [ "Optional token for HuggingFace Hub downloads (higher rate limits).", @@ -2359,77 +2347,77 @@ function An(e, t, i, a) { }, onChange: (e) => { let t = String(e || "").trim(); - if (t !== o) { + if (t !== r) { try { - c &&= (clearTimeout(c), null); + i &&= (clearTimeout(i), null); } catch (e) { console.debug?.(e); } - c = setTimeout(async () => { - c = null; + i = setTimeout(async () => { + i = null; let e = ++l; try { - let n = await O(t); + let n = await s(t); if (e !== l) return; if (!n?.ok) throw Error(n?.error || "Failed to update HuggingFace token"); - o = t, i("ai.huggingFaceToken"), t ? r("HuggingFace token saved", "success") : r("HuggingFace token cleared", "success", void 0, { noHistory: !0 }); + r = t, o("ai.huggingFaceToken"), t ? y("HuggingFace token saved", "success") : y("HuggingFace token cleared", "success", void 0, { noHistory: !0 }); } catch (t) { if (e !== l) return; - r(t?.message || "Failed to update HuggingFace token", "error"); + y(t?.message || "Failed to update HuggingFace token", "error"); } }, 900); } } - }), setTimeout(d, 0), (async () => { + }), setTimeout(f, 0), (async () => { try { - let e = (await h())?.data?.prefs || {}, t = !!e?.has_token, n = String(e?.token_hint || "").trim(); - f(t ? `Configured ${n || "(saved)"}` : "Paste HuggingFace token (hf_...)"); + let e = (await n())?.data?.prefs || {}, t = !!e?.has_token, r = String(e?.token_hint || "").trim(); + p(t ? `Configured ${r || "(saved)"}` : "Paste HuggingFace token (hf_...)"); } catch (e) { console.debug?.(e); } - })(), e({ - id: `${X}.AI.VerboseLogs`, - category: s(n("cat.advanced"), a), + })(), t({ + id: `${Z}.AI.VerboseLogs`, + category: d(k("cat.advanced"), e), name: "Majoor: Verbose AI logs", tooltip: "Enable detailed HuggingFace/SigLIP2/X-CLIP logs and progress bars during model download/loading.", type: "boolean", - defaultValue: !!(t.ai?.verboseAiLogs ?? G.ai?.verboseAiLogs ?? !1), + defaultValue: !!(a.ai?.verboseAiLogs ?? K.ai?.verboseAiLogs ?? !1), onChange: async (e) => { - let n = !!e, a = !!(t.ai?.verboseAiLogs ?? G.ai?.verboseAiLogs ?? !1); - t.ai = t.ai || {}, t.ai.verboseAiLogs = n, q(t), i("ai.verboseAiLogs"); + let t = !!e, n = !!(a.ai?.verboseAiLogs ?? K.ai?.verboseAiLogs ?? !1); + a.ai = a.ai || {}, a.ai.verboseAiLogs = t, J(a), o("ai.verboseAiLogs"); try { - let e = await ue(n); + let e = await c(t); if (!e?.ok) throw Error(e?.error || "Failed to update AI logging settings"); } catch (e) { - t.ai.verboseAiLogs = a, q(t), i("ai.verboseAiLogs"), r(e?.message || "Failed to update AI logging settings", "error"); + a.ai.verboseAiLogs = n, J(a), o("ai.verboseAiLogs"), y(e?.message || "Failed to update AI logging settings", "error"); } } }), (async () => { try { - let e = !!(await k())?.data?.prefs?.enabled; - t.ai = t.ai || {}, t.ai.verboseAiLogs !== e && (t.ai.verboseAiLogs = e, q(t), i("ai.verboseAiLogs")); + let e = !!(await le())?.data?.prefs?.enabled; + a.ai = a.ai || {}, a.ai.verboseAiLogs !== e && (a.ai.verboseAiLogs = e, J(a), o("ai.verboseAiLogs")); } catch (e) { console.debug?.(e); } })(); } - e({ - id: `${X}.AI.VectorStats`, - category: s(n("cat.advanced"), "AI / Vector Search"), + t({ + id: `${Z}.AI.VectorStats`, + category: d(k("cat.advanced"), "AI / Vector Search"), name: "Vector Index Status", tooltip: "Current status of the SigLIP2/X-CLIP vector index used for semantic search", type: "text", defaultValue: "Loading vector status..." }), (async () => { try { - let e = await ve(); + let e = await ee(); e?.ok ? console.debug?.("[Majoor] Vector status:", `${e.data?.total || 0} assets indexed | Model: ${e.data?.model || "N/A"}`) : console.debug?.("[Majoor] Vector status unavailable"); } catch (e) { console.debug?.("[Majoor] Vector status fetch failed", e); } - })(), e({ - id: `${X}.AI.VectorBackfillAction`, - category: s(n("cat.advanced"), "AI / Vector Search"), + })(), t({ + id: `${Z}.AI.VectorBackfillAction`, + category: d(k("cat.advanced"), "AI / Vector Search"), name: "Vector Index Action", tooltip: [ "Compute CLIP embeddings for all assets that don't have them yet.", @@ -2453,14 +2441,14 @@ function An(e, t, i, a) { forceStore: !0 } }; try { - r(n("toast.vectorBackfillStarting", "Starting vector backfill... This may take a while."), "info", void 0, { history: { + y(k("toast.vectorBackfillStarting", "Starting vector backfill... This may take a while."), "info", void 0, { history: { ...t.history, status: "started", detail: "Starting vector backfill... This may take a while." } }); - let e = await _e(64, { onProgress: (e) => { + let e = await b(64, { onProgress: (e) => { let n = String(e?.status || "running").toLowerCase() || "running", r = e?.progress || e?.result || {}, i = Number(r?.candidates ?? r?.processed ?? 0), a = Number(r?.indexed ?? 0), o = Number(r?.skipped ?? 0), s = Number(r?.errors ?? 0), c = Math.max(i, a + o + s), l = c > 0 ? Math.round((a + o + s) / c * 100) : null, u = n === "queued" ? "Vector backfill queued" : `Candidates ${i}, indexed ${a}, skipped ${o}, errors ${s}`; - g({ + D({ summary: "Vector Backfill", detail: u }, n === "failed" ? "error" : n === "succeeded" ? "success" : "info", 0, { history: { @@ -2479,56 +2467,56 @@ function An(e, t, i, a) { } }); } }); if (e?.ok) { - let i = e.data || {}, a = String(i?.status || "").toLowerCase(), o = !!i?.pending || [ + let n = e.data || {}, r = String(n?.status || "").toLowerCase(), i = !!n?.pending || [ "queued", "running", "pending" - ].includes(a), s = i?.progress || {}, c = Number(i?.processed ?? s?.candidates ?? 0), l = Number(i?.indexed ?? s?.indexed ?? 0), u = Number(i?.skipped ?? s?.skipped ?? 0); - if (o) { - let e = String(i?.job_id || "").trim(); - r(n("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (job ${e.slice(0, 8)})` : "" }), "info", void 0, { history: { + ].includes(r), a = n?.progress || {}, o = Number(n?.processed ?? a?.candidates ?? 0), s = Number(n?.indexed ?? a?.indexed ?? 0), c = Number(n?.skipped ?? a?.skipped ?? 0); + if (i) { + let e = String(n?.job_id || "").trim(); + y(k("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (job ${e.slice(0, 8)})` : "" }), "info", void 0, { history: { ...t.history, status: "running", detail: `Vector backfill still running in background${e ? ` (${e.slice(0, 8)})` : ""}.`, progress: { - current: l + u, - total: Math.max(c, l + u), - percent: Math.max(c, l + u) > 0 ? Math.round((l + u) / Math.max(c, l + u) * 100) : null, - indexed: l, - skipped: u, + current: s + c, + total: Math.max(o, s + c), + percent: Math.max(o, s + c) > 0 ? Math.round((s + c) / Math.max(o, s + c) * 100) : null, + indexed: s, + skipped: c, label: "running" } } }); - } else r(n("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { - processed: c, - indexed: l, - skipped: u + } else y(k("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { + processed: o, + indexed: s, + skipped: c }), "success", void 0, { history: { ...t.history, status: "succeeded", - detail: `Processed ${c}, indexed ${l}, skipped ${u}`, + detail: `Processed ${o}, indexed ${s}, skipped ${c}`, progress: { - current: c, - total: c, - percent: c > 0 ? 100 : null, - indexed: l, - skipped: u, + current: o, + total: o, + percent: o > 0 ? 100 : null, + indexed: s, + skipped: c, label: "done" } } }); try { - let e = await ve(); + let e = await ee(); e?.ok && console.debug?.("[Majoor] Vector stats after backfill:", e.data); } catch (e) { console.debug?.("[Majoor] Failed to refresh vector stats:", e); } - } else throw Error(e?.error || n("toast.vectorBackfillFailedGeneric", "Backfill failed")); + } else throw Error(e?.error || k("toast.vectorBackfillFailedGeneric", "Backfill failed")); } catch (e) { - let i = e?.message || String(e || n("status.unknown", "unknown")); - r(n("toast.vectorBackfillFailedDetail", "Vector backfill failed: {error}", { error: i }), "error", void 0, { history: { + let n = e?.message || String(e || k("status.unknown", "unknown")); + y(k("toast.vectorBackfillFailedDetail", "Vector backfill failed: {error}", { error: n }), "error", void 0, { history: { ...t.history, status: "failed", - detail: i + detail: n } }), console.error("[Majoor] Vector backfill error:", e); } } @@ -2536,62 +2524,62 @@ function An(e, t, i, a) { } //#endregion //#region ui/app/settings/settingsSearch.ts -var jn = "Majoor", Mn = "Majoor Assets Manager"; -function Nn(e, t, i) { - let a = (e, t) => [ - Mn, +var Mn = "Majoor", Nn = "Majoor Assets Manager"; +function Pn(e, t, n) { + let r = (e, t) => [ + Nn, e, t ]; e({ - id: `${jn}.AI.VectorSearchEnabled`, - category: a(n("cat.search", "Search"), "AI"), - name: n("setting.ai.vector.enabled.name", "Enable AI semantic search"), - tooltip: n("setting.ai.vector.enabled.desc", "Enable/disable AI vector search features (SigLIP2/X-CLIP: description search, prompt alignment, AI tag suggestions, smart collections)."), + id: `${Mn}.AI.VectorSearchEnabled`, + category: r(k("cat.search", "Search"), "AI"), + name: k("setting.ai.vector.enabled.name", "Enable AI semantic search"), + tooltip: k("setting.ai.vector.enabled.desc", "Enable/disable AI vector search features (SigLIP2/X-CLIP: description search, prompt alignment, AI tag suggestions, smart collections)."), type: "boolean", defaultValue: !!(t.ai?.vectorSearchEnabled ?? !0), onChange: async (e) => { t.ai = t.ai || {}; - let n = !!(t.ai.vectorSearchEnabled ?? !0), a = !!e; - t.ai.vectorSearchEnabled = a, q(t), J(t), i("ai.vectorSearchEnabled"); + let r = !!(t.ai.vectorSearchEnabled ?? !0), i = !!e; + t.ai.vectorSearchEnabled = i, J(t), Y(t), n("ai.vectorSearchEnabled"); try { - let e = await fe(a); + let e = await ie(i); if (!e?.ok) { - t.ai.vectorSearchEnabled = n, q(t), J(t), i("ai.vectorSearchEnabled"), r(e?.error || "Failed to update AI vector search setting", "error"); + t.ai.vectorSearchEnabled = r, J(t), Y(t), n("ai.vectorSearchEnabled"), y(e?.error || "Failed to update AI vector search setting", "error"); return; } - r(a ? "AI semantic search enabled" : "AI semantic search disabled", "info", 2200); + y(i ? "AI semantic search enabled" : "AI semantic search disabled", "info", 2200); } catch (e) { - t.ai.vectorSearchEnabled = n, q(t), J(t), i("ai.vectorSearchEnabled"), r(e?.message || "Failed to update AI vector search setting", "error"); + t.ai.vectorSearchEnabled = r, J(t), Y(t), n("ai.vectorSearchEnabled"), y(e?.message || "Failed to update AI vector search setting", "error"); } } }), e({ - id: `${jn}.AI.VectorCaptionOnIndex`, - category: a(n("cat.search", "Search"), "AI"), - name: n("setting.ai.vector.captionOnIndex.name", "Generate AI captions during indexing"), - tooltip: n("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."), + id: `${Mn}.AI.VectorCaptionOnIndex`, + category: r(k("cat.search", "Search"), "AI"), + name: k("setting.ai.vector.captionOnIndex.name", "Generate AI captions during indexing"), + tooltip: k("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."), type: "boolean", defaultValue: !!(t.ai?.vectorCaptionOnIndex ?? !1), onChange: async (e) => { t.ai = t.ai || {}; - let n = !!(t.ai.vectorCaptionOnIndex ?? !1), a = !!e; - t.ai.vectorCaptionOnIndex = a, q(t), J(t), i("ai.vectorCaptionOnIndex"); + let r = !!(t.ai.vectorCaptionOnIndex ?? !1), i = !!e; + t.ai.vectorCaptionOnIndex = i, J(t), Y(t), n("ai.vectorCaptionOnIndex"); try { - let e = await fe({ caption_on_index: a }); + let e = await ie({ caption_on_index: i }); if (!e?.ok) { - t.ai.vectorCaptionOnIndex = n, q(t), J(t), i("ai.vectorCaptionOnIndex"), r(e?.error || "Failed to update AI caption indexing setting", "error"); + t.ai.vectorCaptionOnIndex = r, J(t), Y(t), n("ai.vectorCaptionOnIndex"), y(e?.error || "Failed to update AI caption indexing setting", "error"); return; } - a && r("AI captions during indexing enabled", "info", 2600); + i && y("AI captions during indexing enabled", "info", 2600); } catch (e) { - t.ai.vectorCaptionOnIndex = n, q(t), J(t), i("ai.vectorCaptionOnIndex"), r(e?.message || "Failed to update AI caption indexing setting", "error"); + t.ai.vectorCaptionOnIndex = r, J(t), Y(t), n("ai.vectorCaptionOnIndex"), y(e?.message || "Failed to update AI caption indexing setting", "error"); } } }), e({ - id: `${jn}.Search.MaxResults`, - category: a(n("cat.search", "Search")), - name: n("setting.search.maxResults.name", "Max search results (client)"), - tooltip: n("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."), + id: `${Mn}.Search.MaxResults`, + category: r(k("cat.search", "Search")), + name: k("setting.search.maxResults.name", "Max search results (client)"), + tooltip: k("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."), type: "number", defaultValue: Number(t.search?.maxResults || A.SEARCH_DEFAULT_LIMIT), attrs: { @@ -2600,11 +2588,11 @@ function Nn(e, t, i) { step: 1 }, onChange: (e) => { - t.search = t.search || {}, t.search.maxResults = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Number(e) || A.SEARCH_DEFAULT_LIMIT)), q(t), J(t), i("search.maxResults"); + t.search = t.search || {}, t.search.maxResults = Math.max(10, Math.min(A.MAX_PAGE_SIZE || 2e3, Number(e) || A.SEARCH_DEFAULT_LIMIT)), J(t), Y(t), n("search.maxResults"); } }), e({ - id: `${jn}.EnvVars.Reference`, - category: a(n("cat.advanced"), "Environment variables"), + id: `${Mn}.EnvVars.Reference`, + category: r(k("cat.advanced"), "Environment variables"), name: "Environment variables reference", tooltip: [ "Set these env vars before starting ComfyUI to override defaults:", @@ -2636,7 +2624,7 @@ function Nn(e, t, i) { } //#endregion //#region ui/app/settings/SettingsPanel.ts -var Pn = "Majoor Assets Manager", Fn = /^\s*Majoor:\s*/i, In = Object.freeze({ +var Fn = "Majoor Assets Manager", In = /^\s*Majoor:\s*/i, Ln = Object.freeze({ ASSETS_PANEL: "Assets Panel", GENERATED_FEED: "Generated Feed", VIEWER: "Viewer & Floating Viewer", @@ -2645,7 +2633,7 @@ var Pn = "Majoor Assets Manager", Fn = /^\s*Majoor:\s*/i, In = Object.freeze({ GENERAL: "General", ADVANCED: "Advanced", SECURITY: "Security" -}), Ln = new Set([ +}), Rn = new Set([ "grid.starColor", "grid.badgeImageColor", "grid.badgeVideoColor", @@ -2657,94 +2645,94 @@ var Pn = "Majoor Assets Manager", Fn = /^\s*Majoor:\s*/i, In = Object.freeze({ "ui.ratingColor", "ui.tagColor" ]); -function Rn(e) { - let t = String(e || "").trim(); - return t ? /^Majoor\.(Safety|Security)\./.test(t) ? In.SECURITY : /^Majoor\.(Paths|ProbeBackend|MetadataFallback|Db|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" || t === "Majoor.AI.HuggingFaceTokenVisible" || t === "Majoor.AI.HuggingFaceToken" || t === "Majoor.AI.VerboseLogs" || t === "Majoor.AI.VectorStats" || t === "Majoor.AI.VectorBackfillAction" ? In.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? In.VIEWER : /^Majoor\.Feed\./.test(t) ? In.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) ? In.INDEXING : t === "Majoor.RtHydrate.Concurrency" ? In.ADVANCED : t === "Majoor.AI.VectorSearchEnabled" || t === "Majoor.AI.VectorCaptionOnIndex" || /^Majoor\.Search\./.test(t) ? In.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? In.ASSETS_PANEL : In.GENERAL : In.GENERAL; -} function zn(e) { - let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = Rn(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(Fn, "").trim(); + let t = String(e || "").trim(); + return t ? /^Majoor\.(Safety|Security)\./.test(t) ? Ln.SECURITY : /^Majoor\.(Paths|ProbeBackend|MetadataFallback|Db|Observability)\./.test(t) || t === "Majoor.EnvVars.Reference" || t === "Majoor.AI.HuggingFaceTokenVisible" || t === "Majoor.AI.HuggingFaceToken" || t === "Majoor.AI.VerboseLogs" || t === "Majoor.AI.VectorStats" || t === "Majoor.AI.VectorBackfillAction" ? Ln.ADVANCED : /^Majoor\.(Viewer|WorkflowMinimap)\./.test(t) ? Ln.VIEWER : /^Majoor\.Feed\./.test(t) ? Ln.GENERATED_FEED : /^Majoor\.(AutoScan|Scan|Watcher|ExecutionGrouping|RatingTagsSync)\./.test(t) ? Ln.INDEXING : t === "Majoor.RtHydrate.Concurrency" ? Ln.ADVANCED : t === "Majoor.AI.VectorSearchEnabled" || t === "Majoor.AI.VectorCaptionOnIndex" || /^Majoor\.Search\./.test(t) ? Ln.SEARCH_AI : /^Majoor\.(Grid|Cards|Badges|Sidebar|InfiniteScroll|General)\./.test(t) ? Ln.ASSETS_PANEL : Ln.GENERAL : Ln.GENERAL; +} +function Bn(e) { + let t = Array.isArray(e?.category) ? e.category.filter(Boolean) : [], n = zn(e?.id), r = String(t[1] || t[0] || "").trim(), i = String(t[2] || "").trim(), a = String(e?.name || "").replace(In, "").trim(); return [ - Pn, + Fn, n, i || r || a || n ]; } -var Bn = !1, Vn = null, Hn = null, Un = !1, Wn = /* @__PURE__ */ new Set(); -function Gn(e) { +var Vn = !1, Hn = null, Un = null, Wn = !1, Gn = /* @__PURE__ */ new Set(); +function Kn(e) { if (!e || typeof e != "object") return null; let t = { ...e }; try { - typeof t.name == "string" && (t.name = t.name.replace(Fn, "").trim()); + typeof t.name == "string" && (t.name = t.name.replace(In, "").trim()); } catch (e) { console.debug?.(e); } try { - t.category = zn(t); + t.category = Bn(t); } catch { - t.category = [Pn, In.GENERAL]; + t.category = [Fn, Ln.GENERAL]; } return !t.tooltip && typeof t.name == "string" && t.name.trim() && (t.tooltip = t.name.trim()), t; } -function Kn(e, t, n) { +function qn(e, t, n) { let r = String(t?.id || "").trim(); - if (!r || Wn.has(r)) return !1; - Wn.add(r); + if (!r || Gn.has(r)) return !1; + Gn.add(r); try { - return ee(e, r, n); + return de(e, r, n); } finally { - Wn.delete(r); + Gn.delete(r); } } -function qn(e, t) { +function Jn(e, t) { if (!t || typeof t != "object") return t; let n = { ...t }; - Kn(e, n, n.defaultValue); + qn(e, n, n.defaultValue); let r = n.onChange; return n.onChange = (t, ...i) => { - if (Kn(e, n, t), typeof r == "function") return r(t, ...i); + if (qn(e, n, t), typeof r == "function") return r(t, ...i); n.defaultValue = t; }, n; } -function Jn(e, t, { initRuntime: n = !1 } = {}) { - if (Hn) typeof t == "function" && Hn.onAppliedListeners.add(t), e && !Hn.app && (Hn.app = e); +function Yn(e, t, { initRuntime: n = !1 } = {}) { + if (Un) typeof t == "function" && Un.onAppliedListeners.add(t), e && !Un.app && (Un.app = e); else { - let n = K(); - n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? p(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, p(!0), q(n)); + let n = q(); + n.i18n = n.i18n || {}, typeof n.i18n.followComfyLanguage == "boolean" ? ve(!!n.i18n.followComfyLanguage) : (n.i18n.followComfyLanguage = !0, ve(!0), J(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) st("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + for (let t of e) ct("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); }, s = () => { if (!a.size) return; let e = Array.from(a); a.clear(); - for (let t of e) st("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); - }, c = Zt(o, 120), l = Zt(s, 450), u = (e) => { + for (let t of e) ct("mjr-settings-changed", { key: t }, { warnPrefix: "[Majoor]" }); + }, c = Qt(o, 120), l = Qt(s, 450), u = (e) => { typeof e == "string" && i.add(e), c(); }, d = (e) => { typeof e == "string" && a.add(e), l(); }, f = () => { - let e = K(); - Object.assign(n, e), J(n), u("storage"); - }, m = (e) => { + let e = q(); + Object.assign(n, e), Y(n), u("storage"); + }, p = (e) => { !e || e.key !== "mjrSettings" || e.newValue !== e.oldValue && f(); }; - if (!Bn) { - if (Vn && typeof window < "u") try { - window.removeEventListener("storage", Vn); + if (!Vn) { + if (Hn && typeof window < "u") try { + window.removeEventListener("storage", Hn); } catch (e) { console.debug?.(e); } try { - window.addEventListener("storage", m), Bn = !0, Vn = m; + window.addEventListener("storage", p), Vn = !0, Hn = p; } catch (e) { console.debug?.(e); } } - Hn = { + Un = { app: e, notifyApplied: (e) => { for (let t of r) try { @@ -2752,63 +2740,63 @@ function Jn(e, t, { initRuntime: n = !1 } = {}) { } catch (e) { console.debug?.(e); } - Ln.has(String(e || "")) ? d(e) : u(e); + Rn.has(String(e || "")) ? d(e) : u(e); }, onAppliedListeners: r, refreshFromStorage: f, settings: n }; } - if (n && !Un) { - let t = e || Hn.app, n = Hn.settings; - u(t), J(n), xe(t), Ft(), It(), Lt(), n?.watcher && typeof n.watcher.enabled == "boolean" && se(!!n.watcher.enabled).catch(() => {}), Yt(), Un = !0; + if (n && !Wn) { + let t = e || Un.app, n = Un.settings; + pe(t), Y(n), me(t), It(), Lt(), Rt(), n?.watcher && typeof n.watcher.enabled == "boolean" && ne(!!n.watcher.enabled).catch(() => {}), Xt(), Wn = !0; } - return Hn; + return Un; } -var Yn = (e, t) => Jn(e, t, { initRuntime: !0 }).settings, Xn = (e, t) => { - let n = Jn(e, t, { initRuntime: !1 }); - Object.assign(n.settings, K()); +var Xn = (e, t) => Yn(e, t, { initRuntime: !0 }).settings, Zn = (e, t) => { + let n = Yn(e, t, { initRuntime: !1 }); + Object.assign(n.settings, q()); let r = (t) => { - let r = Gn(t); - r && i.push(qn(e || n.app, r)); + let r = Kn(t); + r && i.push(Jn(e || n.app, r)); }, i = []; - return $t(r, n.settings, n.notifyApplied), ln(r, n.settings, n.notifyApplied), nn(r, n.settings, n.notifyApplied), on(r, n.settings, n.notifyApplied), On(r, n.settings, n.notifyApplied), An(r, n.settings, n.notifyApplied, e), Nn(r, n.settings, n.notifyApplied), i; + return en(r, n.settings, n.notifyApplied), un(r, n.settings, n.notifyApplied), rn(r, n.settings, n.notifyApplied), sn(r, n.settings, n.notifyApplied), kn(r, n.settings, n.notifyApplied), jn(r, n.settings, n.notifyApplied, e), Pn(r, n.settings, n.notifyApplied), i; }; try { - let e = K(); - e?.watcher && typeof e.watcher.enabled == "boolean" && s().then((e) => { - let t = !!e?.ok && !!e?.data?.enabled, n = K(); - n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, q(n), st("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); + let e = q(); + e?.watcher && typeof e.watcher.enabled == "boolean" && o().then((e) => { + let t = !!e?.ok && !!e?.data?.enabled, n = q(); + n.watcher = n.watcher || {}, typeof t == "boolean" && t !== !!n.watcher.enabled && (n.watcher.enabled = t, J(n), ct("mjr-settings-changed", { key: "watcher.enabled" }, { warnPrefix: "[Majoor]" })); }).catch(() => {}); } catch (e) { console.debug?.(e); } //#endregion //#region ui/features/status/AssetStatusDotTheme.ts -function Zn(e) { +function Qn(e) { return String(e || "").trim().toLowerCase(); } -function Qn({ dot: e = null, asset: t = null, scope: n = "" } = {}) { - let r = Zn(n); +function $n({ dot: e = null, asset: t = null, scope: n = "" } = {}) { + let r = Qn(n); if (r) return r === "custom"; - let i = Zn(t?.type || t?.scope); + let i = Qn(t?.type || t?.scope); if (i) return i === "custom"; try { - let t = Zn(e?.closest?.(".mjr-grid")?.dataset?.mjrScope); + let t = Qn(e?.closest?.(".mjr-grid")?.dataset?.mjrScope); if (t) return t === "custom"; } catch (e) { console.debug?.(e); } return !1; } -function $n(e, t = {}) { - let n = Zn(e); - return Qn(t) ? n === "pending" || n === "info" ? "var(--mjr-browser-status-info, #4DB6AC)" : n === "success" ? "var(--mjr-browser-status-success, #2E7D32)" : n === "warning" ? "var(--mjr-browser-status-warning, #FFB74D)" : n === "error" ? "var(--mjr-browser-status-error, #EF5350)" : "var(--mjr-browser-status-neutral, #90A4AE)" : n === "pending" || n === "info" ? "var(--mjr-status-info, #64B5F6)" : n === "success" ? "var(--mjr-status-success, #4CAF50)" : n === "warning" ? "var(--mjr-status-warning, #FFA726)" : n === "error" ? "var(--mjr-status-error, #f44336)" : "var(--mjr-status-neutral, #666)"; +function er(e, t = {}) { + let n = Qn(e); + return $n(t) ? n === "pending" || n === "info" ? "var(--mjr-browser-status-info, #4DB6AC)" : n === "success" ? "var(--mjr-browser-status-success, #2E7D32)" : n === "warning" ? "var(--mjr-browser-status-warning, #FFB74D)" : n === "error" ? "var(--mjr-browser-status-error, #EF5350)" : "var(--mjr-browser-status-neutral, #90A4AE)" : n === "pending" || n === "info" ? "var(--mjr-status-info, #64B5F6)" : n === "success" ? "var(--mjr-status-success, #4CAF50)" : n === "warning" ? "var(--mjr-status-warning, #FFA726)" : n === "error" ? "var(--mjr-status-error, #f44336)" : "var(--mjr-status-neutral, #666)"; } //#endregion //#region ui/stores/useRuntimeStore.ts -var er = Qe("mjr-runtime", () => { - let e = I(null), t = I(null), n = I(!1), r = I(0), i = I(null), a = I(null), o = I(null), s = I(null), c = I(null), l = I([]), u = B(() => !!i.value), d = B(() => { +var tr = $e("mjr-runtime", () => { + let e = I(null), t = I(null), n = I(!1), r = I(0), i = I(null), a = I(null), o = I(null), s = I(null), c = I(null), l = I([]), u = V(() => !!i.value), d = V(() => { let e = s.value, t = c.value; return !t || t <= 0 || e == null ? 0 : Math.round(e / t * 100); }); @@ -2856,17 +2844,17 @@ var er = Qe("mjr-runtime", () => { }); //#endregion //#region ui/stores/getOptionalRuntimeStore.ts -function tr() { +function nr() { try { - return $e() ? er() : null; + return et() ? tr() : null; } catch { return null; } } //#endregion //#region ui/stores/runtimeEnrichmentState.ts -var nr = Symbol.for("majoor.assets_manager.runtime_state"); -function rr() { +var rr = Symbol.for("majoor.assets_manager.runtime_state"); +function ir() { return { api: null, assetsDeletedHandler: null, @@ -2874,27 +2862,27 @@ function rr() { enrichmentQueueLength: 0 }; } -function ir() { +function ar() { try { let e = typeof globalThis < "u" ? globalThis : {}; - return (!e[nr] || typeof e[nr] != "object") && (e[nr] = rr()), e[nr]; + return (!e[rr] || typeof e[rr] != "object") && (e[rr] = ir()), e[rr]; } catch { - return rr(); + return ir(); } } -function ar(e, t) { - let n = tr(); +function or(e, t) { + let n = nr(); if (n) { n.setEnrichmentState(e, t); return; } - let r = ir(); + let r = ar(); r.enrichmentActive = !!e, r.enrichmentQueueLength = Math.max(0, Number(t || 0) || 0); } -function or() { - let e = tr(); +function sr() { + let e = nr(); if (e) return e.getEnrichmentState(); - let t = ir(); + let t = ar(); return { active: !!t.enrichmentActive, queueLength: Math.max(0, Number(t.enrichmentQueueLength || 0) || 0) @@ -2902,21 +2890,21 @@ function or() { } //#endregion //#region ui/features/grid/AssetCardRenderer.ts -function sr(e) { +function cr(e) { try { return String(e || "").trim().toLowerCase(); } catch { return ""; } } -function cr(e) { +function lr(e) { try { return (String(e || "").split(".").pop() || "").toUpperCase(); } catch { return ""; } } -function lr(e) { +function ur(e) { try { let t = String(e || ""), n = t.lastIndexOf("."), r = n > 0 ? t.slice(0, n) : t; return String(r || "").trim().toLowerCase(); @@ -2924,7 +2912,7 @@ function lr(e) { return ""; } } -function ur(e) { +function dr(e) { try { if (String(e?.kind || "").toLowerCase() !== "video") return !1; let t = String(e?.filename || "").toLowerCase(); @@ -2933,10 +2921,10 @@ function ur(e) { return !1; } } -function dr(e) { +function fr(e) { try { let t = String(e?.kind || "").toLowerCase(), n = 0; - ur(e) ? n = 2 : t === "video" && (n = 1); + dr(e) ? n = 2 : t === "video" && (n = 1); let r = +(Number(e?.has_generation_data || 0) > 0), i = Number(e?.size || 0), a = Number(e?.mtime || 0); return [ n, @@ -2953,31 +2941,31 @@ function dr(e) { ]; } } -function fr(e, t) { +function pr(e, t) { for (let n = 0; n < Math.max(e.length, t.length); n++) { let r = (e[n] || 0) - (t[n] || 0); if (r !== 0) return r; } return 0; } -function pr(e) { +function mr(e) { if (!Array.isArray(e) || e.length === 0) return null; if (e.length === 1) return e[0]; - let t = e[0], n = dr(t); + let t = e[0], n = fr(t); for (let r = 1; r < e.length; r++) { - let i = e[r], a = dr(i); - fr(a, n) > 0 && (t = i, n = a); + let i = e[r], a = fr(i); + pr(a, n) > 0 && (t = i, n = a); } return t; } -function mr(e, t) { +function hr(e, t) { if (!e || !Array.isArray(t) || t.length === 0 || (Number(e?.generation_time_ms ?? e?.metadata?.generation_time_ms ?? 0) || 0) > 0) return e; let n = t.find((e) => (Number(e?.generation_time_ms ?? e?.metadata?.generation_time_ms ?? 0) || 0) > 0); if (!n) return e; let r = Number(n?.generation_time_ms ?? n?.metadata?.generation_time_ms ?? 0) || 0; return r <= 0 ? e : (e.generation_time_ms = r, !e.has_generation_data && n?.has_generation_data && (e.has_generation_data = n.has_generation_data), e); } -function hr(e, t) { +function gr(e, t) { let n = String(e?.kind || "").toLowerCase(); if (n) return n; let r = new Set([ @@ -3013,29 +3001,29 @@ function hr(e, t) { ]); return r.has(t) ? "image" : i.has(t) ? "video" : a.has(t) ? "audio" : o.has(t) ? "model3d" : "unknown"; } -function gr(e) { +function _r(e) { try { return !!e()?.siblings?.hidePngSiblings; } catch { return !1; } } -function _r(e) { +function vr(e) { return `${String(e?.source || e?.type || "").trim().toLowerCase()}|${String(e?.root_id || e?.custom_root_id || "").trim().toLowerCase()}|${String(e?.subfolder || "").trim().toLowerCase()}`; } -function vr(e) { - let t = sr(e?.filename); - return t ? `${_r(e)}|${t}` : ""; +function yr(e) { + let t = cr(e?.filename); + return t ? `${vr(e)}|${t}` : ""; } -function yr(e, t = cr(e?.filename || "")) { - let n = hr(e, t), r = String(e?.filename || "").trim(); +function br(e, t = lr(e?.filename || "")) { + let n = gr(e, t), r = String(e?.filename || "").trim(); if (!r) return ""; - let i = _r(e); + let i = vr(e); if (n === "model3d") return `${i}|model3d|${r.toLowerCase()}`; - let a = lr(r); + let a = ur(r); return a ? `${i}|media|${a}` : ""; } -function br(e) { +function xr(e) { let t = e.nonImageSiblingKeys || /* @__PURE__ */ new Set(); e.nonImageSiblingKeys = t; let n = e.stemMap || /* @__PURE__ */ new Map(); @@ -3050,7 +3038,7 @@ function br(e) { seenKeys: i }; } -function xr(e, t, n) { +function Sr(e, t, n) { try { t?.id != null && n.assetIdSet.delete(String(t.id)); } catch (e) { @@ -3063,20 +3051,20 @@ function xr(e, t, n) { console.debug?.(e); } } -function Sr(e, t, n, r) { +function Cr(e, t, n, r) { let i = n.stemMap.get(t); if (!i?.length) return []; let a = []; for (let e = i.length - 1; e >= 0; e--) r(i[e]) && (a.push(i[e]), i.splice(e, 1)); return i.length || n.stemMap.delete(t), a; } -function Cr(e, t, n) { - if (!gr(n)) return { +function wr(e, t, n) { + if (!_r(n)) return { hidden: !1, hideEnabled: !1, removed: [] }; - let r = br(t), i = String(e?.filename || ""), a = cr(i), o = hr(e, a), s = yr(e, a); + let r = xr(t), i = String(e?.filename || ""), a = lr(i), o = gr(e, a), s = br(e, a); if (!s) return { hidden: !1, hideEnabled: !0, @@ -3085,10 +3073,10 @@ function Cr(e, t, n) { if (o === "video" || o === "audio" || o === "model3d" || a === "WEBP") return r.nonImageSiblingKeys.add(s), { hidden: !1, hideEnabled: !0, - removed: Sr(t, s, r, (e) => cr(e?.filename || "") === "PNG") + removed: Cr(t, s, r, (e) => lr(e?.filename || "") === "PNG") }; if (a === "PNG") { - let t = `${_r(e)}|model3d|${lr(i)}`; + let t = `${vr(e)}|model3d|${ur(i)}`; if (r.nonImageSiblingKeys.has(s) || r.nonImageSiblingKeys.has(t)) return { hidden: !0, hideEnabled: !0, @@ -3101,15 +3089,15 @@ function Cr(e, t, n) { removed: [] }; } -function wr(e, t, n, r) { - let i = gr(r.loadMajoorSettings), a = n.filenameCounts || /* @__PURE__ */ new Map(); +function Tr(e, t, n, r) { + let i = _r(r.loadMajoorSettings), a = n.filenameCounts || /* @__PURE__ */ new Map(); n.filenameCounts = a, r.clearGridMessage(e); let o = r.ensureVirtualGrid(e, n); if (!o) return 0; i || (n.hiddenPngSiblings = 0), n.assetKeyFn = r.assetKey; - let s = br(n), c = /* @__PURE__ */ new Map(); + let s = xr(n), c = /* @__PURE__ */ new Map(); for (let e of n.assets || []) { - let t = vr(e); + let t = yr(e); if (!t) continue; let n = c.get(t); n || (n = [], c.set(t, n)), n.push(e); @@ -3136,7 +3124,7 @@ function wr(e, t, n, r) { } continue; } - let l = mr(pr(s), s), u = s.filter((e) => e !== l); + let l = hr(mr(s), s), u = s.filter((e) => e !== l); for (let e of s) e._mjrNameCollision = !1, delete e._mjrNameCollisionCount, delete e._mjrNameCollisionPaths, e !== l && (e._mjrDupStack = !1, e._mjrDupMembers = null, e._mjrDupCount = 0); let d = Array.isArray(l._mjrDupMembers) ? l._mjrDupMembers : [], f = new Set(d.map((e) => String(e?.id || ""))), p = [...d, ...s.filter((e) => !f.has(String(e?.id || "")))]; l._mjrDupStack = !0, l._mjrDupMembers = p, l._mjrDupCount = p.length, l._mjrNameCollision = !1; @@ -3168,13 +3156,13 @@ function wr(e, t, n, r) { } catch (e) { console.debug?.(e); } - let t = cr(String(e?.filename || "")), i = Cr(e, n, r.loadMajoorSettings); + let t = lr(String(e?.filename || "")), i = wr(e, n, r.loadMajoorSettings); for (let e of i.removed || []) f.add(e); if (i.hidden) { n.hiddenPngSiblings += 1; continue; } - let a = vr(e); + let a = yr(e); if (a) { let t = c.get(a); t || (t = [], c.set(a, t)), t.push(e); @@ -3182,7 +3170,7 @@ function wr(e, t, n, r) { let o = r.assetKey(e); if (!o || s.seenKeys.has(o) || e.id != null && s.assetIdSet.has(String(e.id))) continue; s.seenKeys.add(o), e.id != null && s.assetIdSet.add(String(e.id)), d.push(e); - let u = yr(e, t); + let u = br(e, t); if (u) { let t = s.stemMap.get(u); t || (t = [], s.stemMap.set(u, t)), t.push(e); @@ -3192,10 +3180,10 @@ function wr(e, t, n, r) { if (f.size > 0) { n.hiddenPngSiblings += f.size, n.assets = n.assets.filter((e) => !f.has(e)); for (let e = d.length - 1; e >= 0; e--) f.has(d[e]) && (d.splice(e, 1), l = Math.max(0, l - 1)); - for (let e of f) xr(n, e, s); + for (let e of f) Sr(n, e, s); try { for (let e of f) { - let t = vr(e); + let t = yr(e); if (!t) continue; let n = c.get(t); if (!n) continue; @@ -3217,18 +3205,18 @@ function wr(e, t, n, r) { } //#endregion //#region ui/components/Badges.ts -function Tr({ ext: e = "", filename: t = "", count: n = 0, paths: r = [] } = {}) { +function Er({ ext: e = "", filename: t = "", count: n = 0, paths: r = [] } = {}) { let i = String(e || "").trim(), a = String(t || "").trim(), o = Math.max(0, Number(n) || 0), s = Array.isArray(r) ? r.map((e) => String(e || "").trim()).filter(Boolean) : []; if (o < 2) return `${i} file`; let c = [`${i}+ name collision in current view (${o})`]; - if (a && c.push(`Name: ${a}`), s.length) { - c.push("Paths:"); + if (a && c.push(k("badge.collisionName", "Name: {name}", { name: a })), s.length) { + c.push(k("badge.collisionPaths", "Paths:")); for (let e of s.slice(0, 4)) c.push(`- ${e}`); s.length > 4 && c.push(`- ... +${s.length - 4} more`); } - return c.push("Click to select collisions in current view"), c.join("\n"); + return c.push(k("badge.collisionSelect", "Click to select collisions in current view")), c.join("\n"); } -function Er(e, t, n = !1, r = null) { +function Dr(e, t, n = !1, r = null) { let i = document.createElement("div"); i.className = "mjr-file-badge"; let a = String(e || "").split(".").pop()?.toUpperCase?.() || ""; @@ -3242,8 +3230,8 @@ function Er(e, t, n = !1, r = null) { video: "--mjr-badge-video", audio: "--mjr-badge-audio", model3d: "--mjr-badge-model3d" - }[hr({ kind: t }, a)], s = o ? `var(${o}, #607D8B)` : "#607D8B", c = n ? "var(--mjr-badge-duplicate-alert, #ff1744)" : s; - i.textContent = a + (n ? "+" : ""), i.title = n ? Tr({ + }[gr({ kind: t }, a)], s = o ? `var(${o}, #607D8B)` : "#607D8B", c = n ? "var(--mjr-badge-duplicate-alert, #ff1744)" : s; + i.textContent = a + (n ? "+" : ""), i.title = n ? Er({ ext: a, filename: e, count: r?.count, @@ -3273,10 +3261,10 @@ function Er(e, t, n = !1, r = null) { } return i; } -function Dr(e, t, n = null) { +function Or(e, t, n = null) { if (e) try { let r = e.dataset?.mjrExt || "", i = e.dataset?.mjrBadgeBg || "var(--mjr-badge-image, #607D8B)"; - e.textContent = String(r || "") + (t ? "+" : ""), e.title = t ? Tr({ + e.textContent = String(r || "") + (t ? "+" : ""), e.title = t ? Er({ ext: r, filename: n?.filename || "", count: n?.count, @@ -3286,18 +3274,18 @@ function Dr(e, t, n = null) { console.debug?.(e); } } -function Or(e) { +function kr(e) { return e === !0 ? !0 : e === !1 ? !1 : e === 1 || e === "1" ? !0 : e === 0 || e === "0" ? !1 : null; } -function kr(e, t = []) { +function Ar(e, t = []) { if (!e || typeof e != "object") return null; for (let n of t) if (e[n] != null) return e[n]; return null; } -function Ar(e) { +function jr(e) { return typeof e == "string" && e.trim().length > 0; } -function jr(e) { +function Mr(e) { if (Array.isArray(e)) return e.some((e) => String(e ?? "").trim().length > 0); if (e && typeof e == "object") return Object.keys(e).length > 0; if (typeof e != "string") return !1; @@ -3311,44 +3299,44 @@ function jr(e) { } return !0; } -function Mr(e) { - let t = kr(e, [ +function Nr(e) { + let t = Ar(e, [ "auto_tags", "autoTags", "ai_auto_tags", "aiAutoTags", "suggested_tags", "suggestedTags" - ]), n = kr(e, [ + ]), n = Ar(e, [ "enhanced_caption", "enhancedCaption", "enhanced_prompt", "enhancedPrompt", "ai_enhanced_prompt", "aiEnhancedPrompt" - ]), r = Or(kr(e, [ + ]), r = kr(Ar(e, [ "has_ai_auto_tags", "hasAiAutoTags", "ai_has_auto_tags", "aiHasAutoTags" - ])), i = Or(kr(e, [ + ])), i = kr(Ar(e, [ "has_ai_enhanced_caption", "hasAiEnhancedCaption", "ai_has_enhanced_caption", "aiHasEnhancedCaption" - ])), a = Or(kr(e, [ + ])), a = kr(Ar(e, [ "has_ai_vector", "hasAiVector", "has_vector_embedding", "hasVectorEmbedding", "vector_indexed", "vectorIndexed" - ])), o = Or(kr(e, [ + ])), o = kr(Ar(e, [ "has_ai_info", "hasAiInfo", "ai_indexed", "aiIndexed" - ])), s = r === !0 || r === null && jr(t), c = i === !0 || i === null && Ar(n), l = a === !0 || o === !0; + ])), s = r === !0 || r === null && Mr(t), c = i === !0 || i === null && jr(n), l = a === !0 || o === !0; return { hasAiInfo: o === !0 || s || c || l, hasAutoTags: s, @@ -3356,17 +3344,17 @@ function Mr(e) { hasVectorIndexed: l }; } -function Nr(e) { +function Pr(e) { let t = document.createElement("span"); t.className = "mjr-workflow-dot mjr-asset-status-dot"; - let n = Or(e?.has_workflow ?? e?.hasWorkflow), r = Or(e?.has_generation_data ?? e?.hasGenerationData), i = or(), a = i.queueLength, o = i.active || a > 0, s = "Pending: parsing metadata…", c = n === !0 || r === !0, l = n === !1 || r === !1, u = n === null || r === null; - n === !0 && r === !0 ? s = "Complete: workflow + generation data detected" : c ? s = n === !0 ? "Partial: workflow only (generation data missing)" : "Partial: generation data only (workflow missing)" : l && !c && !u ? s = "None: no workflow or generation data found" : u && (s = "Pending: metadata not parsed yet"); + let n = kr(e?.has_workflow ?? e?.hasWorkflow), r = kr(e?.has_generation_data ?? e?.hasGenerationData), i = sr(), a = i.queueLength, o = i.active || a > 0, s = k("badge.workflow.pendingParsing", "Pending: parsing metadata..."), c = n === !0 || r === !0, l = n === !1 || r === !1, u = n === null || r === null; + n === !0 && r === !0 ? s = k("badge.workflow.complete", "Complete: workflow + generation data detected") : c ? s = n === !0 ? k("badge.workflow.partialWorkflowOnly", "Partial: workflow only (generation data missing)") : k("badge.workflow.partialGenerationOnly", "Partial: generation data only (workflow missing)") : l && !c && !u ? s = k("badge.workflow.none", "None: no workflow or generation data found") : u && (s = k("badge.workflow.pendingNotParsed", "Pending: metadata not parsed yet")); let d = u ? "pending" : n === !0 && r === !0 ? "success" : c ? "warning" : "error"; - o && d !== "success" && (d = "pending", s = a > 0 ? `Pending: database metadata enrichment in progress (${a} queued)` : "Pending: database metadata enrichment in progress"), Pr(t, d, s, { asset: e }); - let f = Mr(e); + o && d !== "success" && (d = "pending", s = a > 0 ? k("badge.workflow.enrichmentQueued", "Pending: database metadata enrichment in progress ({count} queued)", { count: a }) : k("badge.workflow.enrichment", "Pending: database metadata enrichment in progress")), Fr(t, d, s, { asset: e }); + let f = Nr(e); if (f.hasAiInfo) { let e = []; - f.hasVectorIndexed && e.push("vector indexed"), f.hasAutoTags && e.push("AI tag suggestions"), f.hasEnhancedPrompt && e.push("enhanced prompt"), t.textContent = ""; + f.hasVectorIndexed && e.push(k("badge.ai.vectorIndexed", "vector indexed")), f.hasAutoTags && e.push(k("badge.ai.tagSuggestions", "AI tag suggestions")), f.hasEnhancedPrompt && e.push(k("badge.ai.enhancedPrompt", "enhanced prompt")), t.textContent = ""; let n = document.createElement("i"); n.className = "pi pi-sparkles", n.setAttribute("aria-hidden", "true"), n.style.fontSize = "11px", n.style.lineHeight = "1", t.appendChild(n); try { @@ -3374,20 +3362,23 @@ function Nr(e) { } catch (e) { console.debug?.(e); } - t.title = `${s}\nAI: ${e.length ? e.join(", ") : "indexed"}\nClick to rescan this file`; + t.title = k("badge.workflow.aiTooltip", "{title}\nAI: {ai}\nClick to rescan this file", { + title: s, + ai: e.length ? e.join(", ") : k("badge.ai.indexed", "indexed") + }); } else { try { t.dataset.mjrAi = "0"; } catch (e) { console.debug?.(e); } - t.textContent = "●", t.title = `${s}\nClick to rescan this file`; + t.textContent = "●", t.title = k("badge.workflow.tooltip", "{title}\nClick to rescan this file", { title: s }); } return t; } -function Pr(e, t, n = "", r = {}) { +function Fr(e, t, n = "", r = {}) { if (!e) return; - let i = String(t || "").toLowerCase(), a = $n(i, { + let i = String(t || "").toLowerCase(), a = er(i, { dot: e, ...r || {} }); @@ -3412,18 +3403,21 @@ function Pr(e, t, n = "", r = {}) { console.debug?.(e); } } -function Fr(e) { +function Ir(e) { let t = Math.max(0, Math.min(5, Number(e) || 0)); if (t <= 0) return null; let n = document.createElement("div"); - n.className = "mjr-rating-badge", n.title = `Rating: ${t} star${t > 1 ? "s" : ""}`, n.style.cssText = "\n position: absolute;\n top: 6px;\n right: 6px;\n background: rgba(0, 0, 0, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.12);\n padding: 2px 6px;\n border-radius: 6px;\n font-size: 13px;\n letter-spacing: 1px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n z-index: 10;\n text-shadow: 0 2px 6px rgba(0,0,0,0.6);\n box-shadow: 0 6px 18px rgba(0,0,0,0.25);\n "; + n.className = "mjr-rating-badge", n.title = k("badge.rating", "Rating: {rating} star{plural}", { + rating: t, + plural: t > 1 ? "s" : "" + }), n.style.cssText = "\n position: absolute;\n top: 6px;\n right: 6px;\n background: rgba(0, 0, 0, 0.55);\n border: 1px solid rgba(255, 255, 255, 0.12);\n padding: 2px 6px;\n border-radius: 6px;\n font-size: 13px;\n letter-spacing: 1px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n z-index: 10;\n text-shadow: 0 2px 6px rgba(0,0,0,0.6);\n box-shadow: 0 6px 18px rgba(0,0,0,0.25);\n "; for (let e = 1; e <= t; e++) { let r = document.createElement("span"); r.textContent = "★", r.style.color = "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", r.style.marginRight = e < t ? "2px" : "0", n.appendChild(r); } return n; } -function Ir(e) { +function Lr(e) { if (Array.isArray(e)) return e.map((e) => String(e ?? "").trim()).filter(Boolean); if (typeof e == "string") { let t = e.trim(); @@ -3436,26 +3430,29 @@ function Ir(e) { } return []; } -function Lr(e) { +function Rr(e) { let t = Number(e) / 1e3; return t >= 60 ? "#FF9800" : t >= 30 ? "#FFC107" : t >= 10 ? "#8BC34A" : "#4CAF50"; } -function Rr(e) { +function zr(e) { let t = e / 1e3; if (t >= 60) { let e = (t / 60).toFixed(1); return { text: `${e}m`, - title: `Generation time: ${e} minutes (${t.toFixed(1)}s)` + title: k("badge.generationTimeMinutes", "Generation time: {minutes} minutes ({seconds}s)", { + minutes: e, + seconds: t.toFixed(1) + }) }; } let n = t.toFixed(1); return { text: `${n}s`, - title: `Generation time: ${n} seconds` + title: k("badge.generationTimeSeconds", "Generation time: {seconds} seconds", { seconds: n }) }; } -function zr(e, { maxMs: t = 864e5 } = {}) { +function Br(e, { maxMs: t = 864e5 } = {}) { let n; if (e == null) return 0; if (typeof e == "string") { @@ -3470,53 +3467,53 @@ function zr(e, { maxMs: t = 864e5 } = {}) { } else n = Number(e); return !Number.isFinite(n) || n <= 0 || n >= Number(t) ? 0 : n; } -function Br(e) { +function Vr(e) { let t = document.createElement("div"); t.className = "mjr-tags-badge"; - let n = Ir(e); - return n.length === 0 ? (t.style.display = "none", t) : (t.textContent = n.join(", "), t.title = `Tags: ${n.join(", ")}`, t.style.cssText = "\n position: absolute;\n bottom: 6px;\n left: 6px;\n padding: 3px 6px;\n border-radius: 4px;\n background: rgba(0,0,0,0.8);\n color: var(--mjr-tag-color, #90CAF9);\n font-size: 9px;\n max-width: 80%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n z-index: 10;\n box-shadow: 0 2px 4px rgba(0,0,0,0.3);\n ", t); + let n = Lr(e); + return n.length === 0 ? (t.style.display = "none", t) : (t.textContent = n.join(", "), t.title = k("badge.tags", "Tags: {tags}", { tags: n.join(", ") }), t.style.cssText = "\n position: absolute;\n bottom: 6px;\n left: 6px;\n padding: 3px 6px;\n border-radius: 4px;\n background: rgba(0,0,0,0.8);\n color: var(--mjr-tag-color, #90CAF9);\n font-size: 9px;\n max-width: 80%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n z-index: 10;\n box-shadow: 0 2px 4px rgba(0,0,0,0.3);\n ", t); } //#endregion //#region ui/utils/safeCall.ts -var Vr = () => {}; -function Hr(e) { +var Hr = () => {}; +function Ur(e) { try { return !!j?.[e]; } catch { return !1; } } -function Ur(e, t) { +function Wr(e, t) { try { console.warn(`[Majoor] ${e}`, t); } catch (e) { console.debug?.(e); } } -function Wr(e, t = "safeCall") { +function Gr(e, t = "safeCall") { try { return e?.(); } catch (e) { - Hr("DEBUG_SAFE_CALL") && Ur(t, e); + Ur("DEBUG_SAFE_CALL") && Wr(t, e); return; } } -function Gr(e, t, n, r, i = "safeAddListener") { +function Kr(e, t, n, r, i = "safeAddListener") { try { return e?.addEventListener?.(t, n, r), () => { try { e?.removeEventListener?.(t, n, r); } catch (e) { - Hr("DEBUG_SAFE_LISTENERS") && Ur(`${i}:remove:${String(t || "")}`, e); + Ur("DEBUG_SAFE_LISTENERS") && Wr(`${i}:remove:${String(t || "")}`, e); } }; } catch (e) { - return Hr("DEBUG_SAFE_LISTENERS") && Ur(`${i}:add:${String(t || "")}`, e), Vr; + return Ur("DEBUG_SAFE_LISTENERS") && Wr(`${i}:add:${String(t || "")}`, e), Hr; } } //#endregion //#region ui/utils/mediaFps.ts -function Kr(e) { +function qr(e) { try { let t = Number(e); if (Number.isFinite(t) && t > 0) return t; @@ -3535,15 +3532,15 @@ function Kr(e) { return null; } } -function qr(e) { +function Jr(e) { try { let t = e, n = t.metadata_raw || {}, r = (n.raw_ffprobe || {}).video_stream || {}; - return Kr(t.fps) ?? Kr(n.fps) ?? Kr(n.frame_rate) ?? Kr(r.avg_frame_rate) ?? Kr(r.r_frame_rate); + return qr(t.fps) ?? qr(n.fps) ?? qr(n.frame_rate) ?? qr(r.avg_frame_rate) ?? qr(r.r_frame_rate); } catch { return null; } } -function Jr(e, t) { +function Yr(e, t) { try { let n = e, r = n.metadata_raw || {}, i = (r.raw_ffprobe || {}).video_stream || {}, a = Number(n.frame_count) || Number(r.frame_count) || Number(r.frames) || Number(i.nb_frames) || Number(i.nb_read_frames) || 0; if (Number.isFinite(a) && a > 0) return Math.floor(a); @@ -3554,52 +3551,52 @@ function Jr(e, t) { } return null; } -function Yr(e) { +function Xr(e) { let t = Number(e); return !Number.isFinite(t) || t <= 0 ? "" : Math.abs(t - Math.round(t)) < .001 ? `${Math.round(t)} fps` : `${t.toFixed(3).replace(/\.?0+$/, "")} fps`; } -function Xr(e, t = 30) { - let n = Kr(e); +function Zr(e, t = 30) { + let n = qr(e); if (n != null) return Math.max(1, Math.round(n * 1e3) / 1e3); - let r = Kr(t); + let r = qr(t); return r == null ? 30 : Math.max(1, Math.round(r * 1e3) / 1e3); } //#endregion //#region ui/vue/majoorPrimeVue.ts -var Zr = { - Button: Pe, - Checkbox: Ye, - InputText: Be, - Select: qe, - ToggleButton: Ue, - Badge: Fe, - Tag: Me, - Dialog: Re, - Menu: Ge, - Listbox: He, - Tree: Je, - VirtualScroller: Ne +var Qr = { + Button: Ie, + Checkbox: Xe, + InputText: He, + Select: Je, + ToggleButton: Ge, + Badge: Le, + Tag: Pe, + Dialog: Be, + Menu: qe, + Listbox: We, + Tree: Ye, + VirtualScroller: Fe }; -function Qr(e) { - return e.use(Le, { +function $r(e) { + return e.use(ze, { ripple: !1, unstyled: !0, zIndex: { overlay: 10100 } - }), e.use(Ve), e.use(We), Object.entries(Zr).forEach(([t, n]) => { + }), e.use(Ue), e.use(Ke), Object.entries(Qr).forEach(([t, n]) => { e.component(`M${t}`, n); }), e; } //#endregion //#region ui/vue/createVueApp.ts -function $r(e, t = void 0) { - let n = et(), r = Ie(e, t); - return r.use(n), Qr(r), { +function ei(e, t = void 0) { + let n = tt(), r = Re(e, t); + return r.use(n), $r(r), { app: r, pinia: n }; } -var ei = /* @__PURE__ */ new Map(); -function ti(e, t, n) { +var ti = /* @__PURE__ */ new Map(); +function ni(e, t, n) { try { window.dispatchEvent(new CustomEvent("mjr:keepalive-attached", { detail: { mountKey: String(e || "_mjrVueApp"), @@ -3608,28 +3605,28 @@ function ti(e, t, n) { } })); } catch {} } -function ni(e) { +function ri(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 ri(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), ti(t?.dataset?.mjrKeepAliveHost, t, e))); +function ii(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), ni(t?.dataset?.mjrKeepAliveHost, t, e))); } -function ii(e, t, n = "_mjrVueApp") { +function ai(e, t, n = "_mjrVueApp") { if (!e) return !1; - let r = ei.get(n), i = !1; + let r = ti.get(n), i = !1; if (!r) { - let e = ni(n), { app: a } = $r(t); + let e = ri(n), { app: a } = ei(t); a.mount(e), r = { app: a, host: e, container: null - }, ei.set(n, r), i = !0; + }, ti.set(n, r), i = !0; } - return ri(e, r.host), r.container = e, i; + return ii(e, r.host), r.container = e, i; } -function ai(e, t = "_mjrVueApp") { - let n = ei.get(t); +function oi(e, t = "_mjrVueApp") { + let n = ti.get(t); if (n?.app) { try { n.app.unmount(); @@ -3637,32 +3634,254 @@ function ai(e, t = "_mjrVueApp") { try { n.host?.remove?.(); } catch {} - ei.delete(t); + ti.delete(t); } } //#endregion //#region ui/utils/format.ts -function oi(e) { +function si(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 si(e) { - let t = oi(e); +function ci(e) { + let t = si(e); return t ? `${t.getDate().toString().padStart(2, "0")}/${(t.getMonth() + 1).toString().padStart(2, "0")}` : ""; } -function ci(e) { - let t = oi(e); +function li(e) { + let t = si(e); return t ? `${t.getHours().toString().padStart(2, "0")}:${t.getMinutes().toString().padStart(2, "0")}` : ""; } -function li(e) { +function ui(e) { return e ? e < 60 ? `${Math.round(e)}s` : `${Math.floor(e / 60)}m ${Math.round(e % 60)}s` : ""; } //#endregion -//#region ui/vue/components/panel/sidebar/SidebarFileInfoSection.vue -var ui = { +//#region ui/stores/usePanelStore.ts +var di = "mjr_panel_state", fi = new Set([ + "output", + "input", + "all", + "custom" +]); +function pi(e, t = !1) { + if (typeof e == "boolean") return e; + if (typeof e == "string") { + let t = e.trim().toLowerCase(); + if ([ + "1", + "true", + "yes", + "on" + ].includes(t)) return !0; + if ([ + "0", + "false", + "no", + "off" + ].includes(t)) return !1; + } + return !!t; +} +function mi(e, t = 0) { + let n = Number(e); + return Number.isFinite(n) ? n : t; +} +function Q(e, t = "") { + return e == null ? t : String(e); +} +function hi(e, t = 0, n = Infinity) { + return Math.max(t, Math.min(n, Math.floor(mi(e, t)))); +} +function gi(e) { + let t = Q(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; + return fi.has(n) ? n : "output"; +} +function _i(e) { + if (!e || typeof e != "object") return {}; + let t = e; + return { + scope: gi(t.scope), + customRootId: Q(t.customRootId), + customRootLabel: Q(t.customRootLabel), + currentFolderRelativePath: Q(t.currentFolderRelativePath || t.subfolder), + collectionId: Q(t.collectionId), + collectionName: Q(t.collectionName), + kindFilter: Q(t.kindFilter), + dateRangeFilter: Q(t.dateRangeFilter), + dateExactFilter: Q(t.dateExactFilter), + workflowOnly: pi(t.workflowOnly, !1), + minRating: hi(t.minRating, 0, 5), + minSizeMB: Math.max(0, mi(t.minSizeMB, 0)), + maxSizeMB: Math.max(0, mi(t.maxSizeMB, 0)), + resolutionCompare: t.resolutionCompare === "lte" ? "lte" : "gte", + minWidth: hi(t.minWidth), + minHeight: hi(t.minHeight), + maxWidth: hi(t.maxWidth), + maxHeight: hi(t.maxHeight), + workflowType: Q(t.workflowType), + workflowId: Q(t.workflowId || t.workflow_id), + sort: Q(t.sort || "mtime_desc"), + searchQuery: Q(t.searchQuery), + scrollTop: hi(t.scrollTop), + activeAssetId: Q(t.activeAssetId), + selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => Q(e).trim()).filter(Boolean).slice(0, 5e3) : [], + sidebarOpen: pi(t.sidebarOpen, !1) + }; +} +function vi() { + try { + let e = localStorage.getItem(di); + if (e) return _i(JSON.parse(e)); + } catch {} + return {}; +} +function yi(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(di, JSON.stringify(t)); + } catch {} +} +var bi = $e("mjr-panel", () => { + let e = vi(), t = I(e.scope || "output"), n = I(e.customRootId || ""), r = I(e.customRootLabel || ""), i = I(e.currentFolderRelativePath || ""), a = I(e.collectionId || ""), o = I(e.collectionName || ""), s = I(e.kindFilter || ""), c = I(e.dateRangeFilter || ""), l = I(e.dateExactFilter || ""), u = I(e.workflowOnly || !1), d = I(e.minRating || 0), f = I(e.minSizeMB || 0), p = I(e.maxSizeMB || 0), m = I(e.resolutionCompare || "gte"), h = I(e.minWidth || 0), g = I(e.minHeight || 0), _ = I(e.maxWidth || 0), v = I(e.maxHeight || 0), y = I(e.workflowType || ""), b = I(e.workflowId || ""), x = I(e.sort || "mtime_desc"), S = I(e.searchQuery || ""), C = I(e.scrollTop || 0), w = I(e.activeAssetId || ""), T = I(e.selectedAssetIds || []), E = I(e.sidebarOpen || !1), ee = I(0), te = I(0), ne = I(""), re = I([]), ie = I(""), ae = I(""), se = null; + we([ + t, + n, + r, + i, + a, + o, + s, + c, + l, + u, + d, + f, + p, + m, + h, + g, + _, + v, + y, + b, + x, + S, + C, + w, + T, + E + ], () => { + se && clearTimeout(se), se = setTimeout(() => { + se = null, yi({ + scope: t.value, + customRootId: n.value, + customRootLabel: r.value, + currentFolderRelativePath: i.value, + collectionId: a.value, + collectionName: o.value, + kindFilter: s.value, + dateRangeFilter: c.value, + dateExactFilter: l.value, + workflowOnly: u.value, + minRating: d.value, + minSizeMB: f.value, + maxSizeMB: p.value, + resolutionCompare: m.value, + minWidth: h.value, + minHeight: g.value, + maxWidth: _.value, + maxHeight: v.value, + workflowType: y.value, + workflowId: b.value, + sort: x.value, + searchQuery: S.value, + scrollTop: C.value, + activeAssetId: w.value, + selectedAssetIds: T.value, + sidebarOpen: E.value + }); + }, 750); + }, { deep: !0 }); + let ce = (e) => { + if (!(e.key !== di || !e.newValue)) try { + let n = _i(JSON.parse(e.newValue)); + n.scope !== void 0 && (t.value = n.scope), n.customRootLabel !== void 0 && (r.value = n.customRootLabel), n.searchQuery !== void 0 && (S.value = n.searchQuery), n.sort !== void 0 && (x.value = n.sort), n.sidebarOpen !== void 0 && (E.value = n.sidebarOpen); + } catch {} + }; + try { + window.addEventListener("storage", ce); + } catch {} + Me(() => { + try { + window.removeEventListener("storage", ce); + } catch {} + }); + function D() { + s.value = "", c.value = "", l.value = "", u.value = !1, d.value = 0, f.value = 0, p.value = 0, m.value = "gte", h.value = 0, g.value = 0, _.value = 0, v.value = 0, y.value = "", b.value = "", S.value = ""; + } + function O() { + T.value = [], w.value = ""; + } + function le(e, t = "") { + T.value = Array.isArray(e) ? e.map(String).filter(Boolean) : [], w.value = t || T.value[0] || ""; + } + function ue(e, s = {}) { + t.value = e, i.value = s.folder || "", a.value = s.collectionId || "", o.value = s.collectionName || "", n.value = s.customRootId || "", r.value = s.customRootLabel || "", ne.value = "", re.value = [], ie.value = "", ae.value = "", O(); + } + async function de() { + let e = String(n.value || "").trim(); + if (e) try { + let a = await oe("/mjr/am/custom-roots"), o = (Array.isArray(a?.data) ? a.data : []).find((t) => String(t?.id || "") === e); + if (!o) { + n.value = "", r.value = "", t.value === "custom" && (t.value = "output", i.value = ""); + return; + } + let s = String(o.label || "").trim(); + s && s !== r.value && (r.value = s); + } catch {} + } + return { + scope: t, + customRootId: n, + customRootLabel: r, + currentFolderRelativePath: i, + collectionId: a, + collectionName: o, + kindFilter: s, + dateRangeFilter: c, + dateExactFilter: l, + workflowOnly: u, + minRating: d, + minSizeMB: f, + maxSizeMB: p, + resolutionCompare: m, + minWidth: h, + minHeight: g, + maxWidth: _, + maxHeight: v, + workflowType: y, + workflowId: b, + sort: x, + searchQuery: S, + scrollTop: C, + activeAssetId: w, + selectedAssetIds: T, + sidebarOpen: E, + lastGridCount: ee, + lastGridTotal: te, + viewScope: ne, + similarResults: re, + similarTitle: ie, + similarSourceAssetId: ae, + resetFilters: D, + clearSelection: O, + setSelection: le, + navigateToScope: ue, + validatePersistedCustomRoot: de + }; +}), xi = { key: 0, class: "mjr-sidebar-section", style: { @@ -3671,11 +3890,18 @@ var ui = { "border-radius": "8px", padding: "10px" } -}, di = { style: { +}, Si = { style: { + "font-size": "12px", + "font-weight": "700", + color: "#607d8b", + "margin-bottom": "8px", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, Ci = { style: { display: "flex", "flex-direction": "column", gap: "6px" -} }, fi = ["title"], pi = ["title"], mi = { +} }, wi = ["title"], Ti = ["title", "onClick"], Ei = ["title"], Di = { __name: "SidebarFileInfoSection", props: { asset: { type: Object, @@ -3684,6 +3910,22 @@ var ui = { setup(e) { let t = e; function n(e) { + let t = String(e || "").trim(); + if (t) { + try { + let e = bi(); + e.workflowId = t; + } catch (e) { + console.debug?.(e); + } + try { + window.dispatchEvent(new CustomEvent("mjr:filters-changed")); + } catch (e) { + console.debug?.(e); + } + } + } + function r(e) { if (!e || e <= 0) return "0 B"; let t = [ "B", @@ -3694,7 +3936,7 @@ var ui = { for (; r >= 1024 && n < t.length - 1;) r /= 1024, n += 1; return `${r.toFixed(+(n > 0))} ${t[n]}`; } - function r(e) { + function i(e) { try { if (String(e?.kind || "").toLowerCase() === "video") return !0; let t = String(e?.filename || e?.filepath || e?.path || "").toLowerCase(); @@ -3703,96 +3945,93 @@ var ui = { return !1; } } - function i(e, t) { + function a(e, t) { let n = e?.[t] ?? e?.file_info?.[t]; return n != null && n !== "" ? n : t === "workflow_id" ? e?.user_metadata?.workflow?.id ?? e?.metadata?.workflow_id ?? "" : ""; } - let a = B(() => { - let e = t.asset || {}, a = []; - if (e.width && e.height && a.push({ - label: "Dimensions", - value: `${e.width} × ${e.height}`, - tooltip: "Image/video resolution in pixels" - }), e.duration && e.duration > 0 && a.push({ - label: "Duration", - value: li(e.duration), - tooltip: "Video duration" - }), r(e)) { - let t = qr(e); - t != null && a.push({ + let o = V(() => { + let e = t.asset || {}, n = []; + if (e.width && e.height && n.push({ + label: k("sidebar.dimensions", "Dimensions"), + value: `${e.width} x ${e.height}`, + tooltip: k("sidebar.fileInfo.dimensionsTooltip", "Image/video resolution in pixels") + }), e.duration && e.duration > 0 && n.push({ + label: k("sidebar.fileInfo.duration", "Duration"), + value: ui(e.duration), + tooltip: k("sidebar.fileInfo.durationTooltip", "Video duration") + }), i(e)) { + let t = Jr(e); + t != null && n.push({ label: "FPS", - value: Yr(t), - tooltip: "Native frame rate" - }); - let n = Jr(e, t); - n != null && a.push({ - label: "Length", - value: `${Math.max(0, Math.floor(n))} frames`, - tooltip: "Total frame count" + value: Xr(t), + tooltip: k("sidebar.fileInfo.fpsTooltip", "Native frame rate") }); + let r = Yr(e, t); + if (r != null) { + let e = Math.max(0, Math.floor(r)); + n.push({ + label: k("sidebar.fileInfo.length", "Length"), + value: k("sidebar.fileInfo.frames", "{count} frames", { count: e }), + tooltip: k("sidebar.fileInfo.lengthTooltip", "Total frame count") + }); + } } - let o = zr(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0); - o > 0 && a.push({ - label: "Generation Time", + let o = Br(e.generation_time_ms ?? e.metadata?.generation_time_ms ?? 0); + o > 0 && n.push({ + label: k("sidebar.fileInfo.generationTime", "Generation Time"), value: `${(Number(o) / 1e3).toFixed(1)}s`, - tooltip: "Time taken to generate this asset (workflow execution time)", - valueStyle: `color: ${Lr(o)}; font-weight: 600;` + tooltip: k("sidebar.fileInfo.generationTimeTooltip", "Time taken to generate this asset (workflow execution time)"), + valueStyle: `color: ${Rr(o)}; font-weight: 600;` }); let s = e.generation_time || e.file_creation_time || e.mtime || e.created_at; if (s) { - let e = si(s), t = ci(s); - e && a.push({ - label: "Date", + let e = ci(s), t = li(s); + e && n.push({ + label: k("sidebar.date", "Date"), value: e, - tooltip: "File creation/generation date" - }), t && a.push({ - label: "Time", + tooltip: k("sidebar.fileInfo.dateTooltip", "File creation/generation date") + }), t && n.push({ + label: k("sidebar.fileInfo.time", "Time"), value: t, - tooltip: "File creation/generation time" + tooltip: k("sidebar.fileInfo.timeTooltip", "File creation/generation time") }); } - e.size && e.size > 0 && a.push({ - label: "File Size", - value: n(e.size), - tooltip: "File size on disk" - }), e.id != null && a.push({ - label: "Asset ID", + e.size && e.size > 0 && n.push({ + label: k("sidebar.fileInfo.fileSize", "File Size"), + value: r(e.size), + tooltip: k("sidebar.fileInfo.fileSizeTooltip", "File size on disk") + }), e.id != null && n.push({ + label: k("sidebar.fileInfo.assetId", "Asset ID"), value: String(e.id), - tooltip: "Internal database asset identifier" + tooltip: k("sidebar.fileInfo.assetIdTooltip", "Internal database asset identifier") }); - let c = String(i(e, "job_id") || "").trim(); - c && a.push({ - label: "Job ID", + let c = String(a(e, "job_id") || "").trim(); + c && n.push({ + label: k("sidebar.fileInfo.jobId", "Job ID"), value: c, - tooltip: "Workflow execution job identifier (prompt_id)" + tooltip: k("sidebar.fileInfo.jobIdTooltip", "Workflow execution job identifier (prompt_id)") }); - let l = String(i(e, "source_node_id") || "").trim(); - l && a.push({ - label: "Source Node", + let l = String(a(e, "source_node_id") || "").trim(); + l && n.push({ + label: k("sidebar.fileInfo.sourceNode", "Source Node"), value: l, - tooltip: "ComfyUI node id that produced this file" + tooltip: k("sidebar.fileInfo.sourceNodeTooltip", "ComfyUI node id that produced this file") }); - let u = String(i(e, "source_node_type") || "").trim(); - u && a.push({ - label: "Node Type", + let u = String(a(e, "source_node_type") || "").trim(); + u && n.push({ + label: k("sidebar.fileInfo.nodeType", "Node Type"), value: u, - tooltip: "ComfyUI node class that produced this file" + tooltip: k("sidebar.fileInfo.nodeTypeTooltip", "ComfyUI node class that produced this file") }); - let d = String(i(e, "workflow_id") || "").trim(); - return d && a.push({ - label: "Workflow ID", + let d = String(a(e, "workflow_id") || "").trim(); + return d && n.push({ + label: k("sidebar.fileInfo.workflowId", "Workflow ID"), value: d, - tooltip: "ComfyUI workflow identifier (from workflow.id in extra_data)" - }), a; + tooltip: k("sidebar.fileInfo.workflowIdTooltip", "ComfyUI workflow identifier (from workflow.id in extra_data)"), + action: "sameWorkflow" + }), n; }); - return (e, t) => a.value.length ? (M(), F("div", ui, [t[0] ||= P("div", { style: { - "font-size": "12px", - "font-weight": "700", - color: "#607d8b", - "margin-bottom": "8px", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, " File Info ", -1), P("div", di, [(M(!0), F(V, null, N(a.value, (e) => (M(), F("div", { + return (e, t) => o.value.length ? (M(), F("div", xi, [P("div", Si, R(z(k)("sidebar.fileInfo.title", "File Info")), 1), P("div", Ci, [(M(!0), F(H, null, N(o.value, (e) => (M(), F("div", { key: e.label, style: { display: "flex", @@ -3807,12 +4046,33 @@ var ui = { opacity: "0.68", "min-width": "92px" } - }, R(e.label), 9, fi), P("div", { + }, R(e.label), 9, wi), e.action === "sameWorkflow" ? (M(), F("button", { + key: 0, + type: "button", + title: z(k)("tooltip.filterWorkflowId", "Filter assets generated from the same embedded workflow id"), + style: { + appearance: "none", + border: "0", + background: "transparent", + color: "inherit", + font: "inherit", + "font-size": "12px", + "text-align": "right", + "word-break": "break-word", + cursor: "pointer", + padding: "0", + "text-decoration": "underline", + "text-decoration-color": "rgba(255,255,255,0.25)", + "text-underline-offset": "3px" + }, + onClick: (t) => n(e.value) + }, R(e.value), 9, Ti)) : (M(), F("div", { + key: 1, style: L(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") - }, R(e.value), 13, pi)]))), 128))])])) : z("", !0); + }, R(e.value), 13, Ei))]))), 128))])])) : B("", !0); } -}, hi = new Set([ +}, Oi = new Set([ "png", "jpg", "jpeg", @@ -3828,31 +4088,31 @@ var ui = { "hdr", "svg" ]); -function gi(e) { +function ki(e) { let t = String(e?.filename || e?.name || e?.filepath || e?.path || "").trim().toLowerCase(); return !t || !t.includes(".") ? "" : t.split(".").pop() || ""; } -function _i(e) { - return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : hi.has(gi(e)); +function Ai(e) { + return String(e?.kind || "").trim().toLowerCase() === "image" || String(e?.mime || e?.mimetype || "").trim().toLowerCase().startsWith("image/") ? !0 : Oi.has(ki(e)); } -function vi(e) { - let t = gi(e); +function ji(e) { + let t = ki(e); return t === "jpg" || t === "jpeg"; } -function yi() { +function Mi() { try { - return !!(K()?.ai?.vectorSearchEnabled ?? !0); + return !!(q()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } } -function bi(e) { +function Ni(e) { return e >= .75 ? "#4CAF50" : e >= .5 ? "#8BC34A" : e >= .3 ? "#FF9800" : "#F44336"; } -function xi(e) { +function Pi(e) { return e >= .85 ? "Excellent" : e >= .7 ? "Good" : e >= .5 ? "Fair" : e >= .3 ? "Low" : "Very Low"; } -function Si(e) { +function Fi(e) { let t = String(e || "").trim(); if (!t) return ""; let n = []; @@ -3862,17 +4122,17 @@ function Si(e) { } return (n.length ? n.join(" ") : t).replace(/\s+/g, " ").replace(/:{2,}\s*$/, "").trim(); } -function Ci(e) { +function Ii(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) => { if (!e) return; - let r = Se(t, n, e); + let r = _e(t, n, e); r && !i.includes(r) && i.push(r); }; return (r === "input" || r === "output") && a(r), a("input"), a("output"), i; } -function wi(e) { +function Li(e) { let t = String(e || "").trim(); if (!t) return !1; if (t.startsWith("/")) return !0; @@ -3883,31 +4143,37 @@ function wi(e) { return !1; } } -function Z(e) { +function $(e) { return e == null || e === "" ? "-" : String(e); } -function Ti(e, t) { - let n = String(e?.pass_name || "").trim(); - if (n) return n; - let r = Number(e?.denoise); - return t === 0 || r === 1 ? "Base" : Number.isFinite(r) && r < 1 ? "Refine / Upscale" : `Pass ${t + 1}`; +function Ri(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 k("sidebar.generation.stageTextToImage", "Text-to-Image"); + if (n === "img2img" || n === "image_to_image" || n === "image-to-image") return k("sidebar.generation.stageImageToImage", "Image-to-Image"); + if (n === "inpaint" || n === "inpainting") return k("sidebar.generation.stageInpaint", "Inpaint"); + if (n === "upscale" || n === "upscaling") return k("sidebar.generation.stageUpscale", "Upscale"); + if (n === "refine" || n === "refiner") return k("sidebar.generation.stageRefine", "Refine"); + let r = String(e?.pass_name || "").trim(); + if (r && r.toLowerCase() !== "base") return r; + let i = Number(e?.denoise); + return t === 0 || i === 1 ? k("sidebar.generation.stageBase", "Base") : Number.isFinite(i) && i < 1 ? k("sidebar.generation.stageRefineUpscale", "Refine / Upscale") : k("sidebar.generation.stagePassN", "Pass {n}", { n: t + 1 }); } -function Ei(e) { +function zi(e) { return e?.geninfo && typeof e.geninfo == "object" ? { geninfo: e.geninfo } : e?.metadata && (typeof e.metadata == "object" || typeof e.metadata == "string") ? e.metadata : e?.prompt && (typeof e.prompt == "object" || typeof e.prompt == "string") ? e.prompt : e?.metadata_raw ? e.metadata_raw : e?.exif ? e.exif : null; } -function Di(e) { +function Bi(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 || it(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && it(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || 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 || at(e.prompt) || typeof (e.negative_prompt || e.negativePrompt) == "string" && at(e.negative_prompt || e.negativePrompt) || e.models || e.model || e.checkpoint || e.loras || 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" ? at(e) : typeof e == "object" ? at(e.name || e.value || "") : "" : ""; +function Vi(e) { + return e ? typeof e == "string" ? ot(e) : typeof e == "object" ? ot(e.name || e.value || "") : "" : ""; } -function Oi(e, t, n, r) { +function Hi(e, t, n, r) { let i = String(r || "").trim(); if (!i) return; let a = `${n}::${i}`; @@ -3916,15 +4182,15 @@ function Oi(e, t, n, r) { value: i })); } -function ki(e) { +function Ui(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 Ai(e) { +function Wi(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) => rt(e)).filter(Boolean) : []; + let n = Vi(e.model), r = Array.isArray(e.loras) ? e.loras.map((e) => it(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}`, @@ -3935,46 +4201,46 @@ function Ai(e) { let r = e.models && typeof e.models == "object" ? e.models : null, i = Array.isArray(e.loras) ? e.loras : []; return r && [{ key: "high_noise", - label: "High Noise", - model: Q(r.unet_high_noise) + label: k("sidebar.generation.highNoise", "High Noise"), + model: Vi(r.unet_high_noise) }, { key: "low_noise", - label: "Low Noise", - model: Q(r.unet_low_noise) + label: k("sidebar.generation.lowNoise", "Low Noise"), + model: Vi(r.unet_low_noise) }].forEach((e) => { - let n = i.filter((t) => ki(t) === e.key).map((e) => rt(e)).filter(Boolean); + let n = i.filter((t) => Ui(t) === e.key).map((e) => it(e)).filter(Boolean); !e.model && !n.length || t.push({ ...e, loras: n }); }), t; } -function ji(e, t) { +function Gi(e, t) { return t == null ? null : { label: e, - value: t ? "on" : "off" + value: t ? k("state.on", "on") : k("state.off", "off") }; } -function Mi(e) { +function Ki(e) { return e != null && String(e).trim() !== ""; } -function Ni(e) { +function qi(e) { return new Set(Array.isArray(e.override_fields) ? e.override_fields.map((e) => String(e || "").trim()).filter(Boolean) : []); } -function $(e, ...t) { +function Ji(e, ...t) { return t.some((t) => e.has(t)); } -function Pi(e) { +function Yi(e) { return Array.isArray(e) ? e.filter((e) => e && typeof e == "object").map((e, t) => ({ - title: String(e.title || `Custom Info ${t + 1}`).trim(), + title: String(e.title || k("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 Fi(e) { - let t = nt(Ei(e)), n = { +function Xi(e) { + let t = rt(zi(e)), n = { kind: "empty", - title: "Generation", + title: k("sidebar.generation.title", "Generation"), workflowType: "", workflowLabel: "", workflowBadge: "", @@ -3986,9 +4252,9 @@ function Fi(e) { promptTabs: [], mediaOnlyMessage: "", showAlignment: !1, - captionLabel: "Image Description", - emptyCaptionText: "No image description yet.", - isImageAsset: _i(e), + captionLabel: k("sidebar.generation.imageDescription", "Image Description"), + emptyCaptionText: k("sidebar.generation.noImageDescription", "No image description yet."), + isImageAsset: Ai(e), lyrics: "", modelFields: [], modelGroups: [], @@ -4007,159 +4273,167 @@ function Fi(e) { notesFields: [], customInfoBlocks: [] }; - if (!t || typeof t == "object" && Object.keys(t).length === 0 || !Di(t)) { + if (!t || typeof t == "object" && Object.keys(t).length === 0 || !Bi(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: "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters." - } : _i(e) || vi(e) ? { + mediaOnlyMessage: k("sidebar.generation.mediaOnlyPipeline", "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters.") + } : Ai(e) || ji(e) ? { ...n, kind: "caption-only", showAlignment: !1 } : n; } - let r = t, i = Ni(r), a = r.engine && typeof r.engine == "object" ? r.engine : null, o = !!(r.is_override || a?.mode === "override" || a?.parser_version === "geninfo-override-v1" || a?.source === "majoor_geninfo"), s = ot(r), c = tt(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), l = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => { - let n = tt(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : ""); + let r = t, i = qi(r), a = r.engine && typeof r.engine == "object" ? r.engine : null, o = !!(r.is_override || a?.mode === "override" || a?.parser_version === "geninfo-override-v1" || a?.source === "majoor_geninfo"), s = st(r), c = nt(typeof r.prompt == "string" ? r.prompt : null, typeof (r.negative_prompt || r.negativePrompt) == "string" ? r.negative_prompt || r.negativePrompt : null), l = Array.isArray(r.all_positive_prompts) && r.all_positive_prompts.length > 1 ? r.all_positive_prompts.map((e, t) => { + let n = nt(typeof e == "string" ? e : "", typeof r.all_negative_prompts?.[t] == "string" ? r.all_negative_prompts[t] : ""); return { - label: `Prompt ${t + 1}`, - positive: it(n.positive), - negative: it(n.negative) + label: k("sidebar.generation.promptN", "Prompt {n}", { n: t + 1 }), + positive: at(n.positive), + negative: at(n.negative) }; - }).filter((e) => e.positive) : [], u = [], d = /* @__PURE__ */ new Set(), f = r.models && typeof r.models == "object" ? r.models : null, p = Ai(r), m = new Set(p.map((e) => String(e.model || "").trim()).filter(Boolean)), h = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null; + }).filter((e) => e.positive) : [], u = [], d = /* @__PURE__ */ new Set(), f = r.models && typeof r.models == "object" ? r.models : null, p = Wi(r), m = new Set(p.map((e) => String(e.model || "").trim()).filter(Boolean)), h = Array.isArray(r.all_checkpoints) && r.all_checkpoints.length > 1 ? r.all_checkpoints : null; if (f) { let e = new Set([ - Q(f.unet_high_noise), - Q(f.unet_low_noise), + Vi(f.unet_high_noise), + Vi(f.unet_low_noise), ...m ].filter(Boolean)); if (h) h.forEach((e, t) => { - let n = Q(e); - Oi(u, d, `Checkpoint ${t + 1}`, n); + let n = Vi(e); + Hi(u, d, k("sidebar.generation.checkpointN", "Checkpoint {n}", { n: t + 1 }), n); }); else { - let t = Q(f.checkpoint); - t && !e.has(t) && Oi(u, d, "Checkpoint", t); + let t = Vi(f.checkpoint); + t && !e.has(t) && Hi(u, d, k("sidebar.generation.checkpoint", "Checkpoint"), t); } [ - ["UNet", Q(f.unet)], - ["Diffusion", Q(f.diffusion)], - ["Upscaler", Q(f.upscaler)], - ["CLIP", Q(f.clip)], - ["VAE", Q(f.vae)] + ["UNet", Vi(f.unet)], + ["Diffusion", Vi(f.diffusion)], + [k("sidebar.generation.upscaler", "Upscaler"), Vi(f.upscaler)], + ["CLIP", Vi(f.clip)], + ["VAE", Vi(f.vae)] ].forEach(([t, n]) => { - e.has(n) || Oi(u, d, t, n); + e.has(n) || Hi(u, d, t, n); }); - } else (r.model || r.checkpoint) && Oi(u, d, "Model", at(r.model || r.checkpoint)); + } else (r.model || r.checkpoint) && Hi(u, d, k("sidebar.generation.model", "Model"), ot(r.model || r.checkpoint)); if (Array.isArray(r.loras) && r.loras.length > 0) { - let e = r.loras.map((e) => rt(e)).filter(Boolean).join("\n"); - e && Oi(u, d, r.loras.length > 1 ? "LoRAs" : "LoRA", e); + let e = r.loras.map((e) => it(e)).filter(Boolean).join("\n"); + e && Hi(u, d, r.loras.length > 1 ? k("sidebar.generation.loras", "LoRAs") : "LoRA", e); } - !f && r.clip && Oi(u, d, "CLIP", at(r.clip)), !f && r.vae && Oi(u, d, "VAE", at(r.vae)), !f && r.unet && Oi(u, d, "UNet", at(r.unet)), !f && r.diffusion && Oi(u, d, "Diffusion", at(r.diffusion)), f && r.clip && Oi(u, d, "CLIP", at(r.clip)), f && r.vae && Oi(u, d, "VAE", at(r.vae)); + !f && r.clip && Hi(u, d, "CLIP", ot(r.clip)), !f && r.vae && Hi(u, d, "VAE", ot(r.vae)), !f && r.unet && Hi(u, d, "UNet", ot(r.unet)), !f && r.diffusion && Hi(u, d, "Diffusion", ot(r.diffusion)), f && r.clip && Hi(u, d, "CLIP", ot(r.clip)), f && r.vae && Hi(u, d, "VAE", ot(r.vae)); for (let e of u) { let t = String(e.label || "").toLowerCase(); - (t.includes("checkpoint") || t === "model") && (e.override = $(i, "checkpoint", "model")), t === "clip" && (e.override = $(i, "clip")), t === "vae" && (e.override = $(i, "vae")), t.includes("lora") && (e.override = $(i, "loras")); + (t.includes("checkpoint") || t === "model") && (e.override = Ji(i, "checkpoint", "model")), t === "clip" && (e.override = Ji(i, "clip")), t === "vae" && (e.override = Ji(i, "vae")), t.includes("lora") && (e.override = Ji(i, "loras")); } let g = []; - Mi(r.seed) && g.push({ - label: "Seed", + Ki(r.seed) && g.push({ + label: k("sidebar.generation.seed", "Seed"), value: r.seed, - override: $(i, "seed") + override: Ji(i, "seed") }), (r.sampler || r.sampler_name) && g.push({ - label: "Sampler", + label: k("sidebar.generation.sampler", "Sampler"), value: r.sampler || r.sampler_name, - override: $(i, "sampler", "sampler_name") - }), Mi(r.steps) && g.push({ - label: "Steps", + override: Ji(i, "sampler", "sampler_name") + }), Ki(r.steps) && g.push({ + label: k("sidebar.generation.steps", "Steps"), value: r.steps, - override: $(i, "steps") + override: Ji(i, "steps") }); - let _ = Mi(r.cfg) ? r.cfg : r.cfg_scale; - Mi(_) && g.push({ - label: "CFG Scale", + let _ = Ki(r.cfg) ? r.cfg : r.cfg_scale; + Ki(_) && g.push({ + label: k("sidebar.generation.cfgScale", "CFG Scale"), value: _, - override: $(i, "cfg", "cfg_scale") + override: Ji(i, "cfg", "cfg_scale") }), r.cfg_high_noise !== void 0 && r.cfg_high_noise !== null && g.push({ - label: "CFG High Noise", + label: k("sidebar.generation.cfgHighNoise", "CFG High Noise"), value: r.cfg_high_noise }), r.cfg_low_noise !== void 0 && r.cfg_low_noise !== null && g.push({ - label: "CFG Low Noise", + label: k("sidebar.generation.cfgLowNoise", "CFG Low Noise"), value: r.cfg_low_noise }), r.scheduler && g.push({ - label: "Scheduler", + label: k("sidebar.generation.scheduler", "Scheduler"), value: r.scheduler, - override: $(i, "scheduler") + override: Ji(i, "scheduler") }); - let v = Mi(r.denoise) ? r.denoise : r.denoising; - Mi(v) && g.push({ - label: "Denoise", + let v = Ki(r.denoise) ? r.denoise : r.denoising; + Ki(v) && g.push({ + label: k("sidebar.generation.denoise", "Denoise"), value: v, - override: $(i, "denoise", "denoising") + override: Ji(i, "denoise", "denoising") }); let y = []; Array.isArray(r.chained_passes) && r.chained_passes.length > 1 ? y = r.chained_passes.filter((e) => e && typeof e == "object").map((e, t) => ({ - label: Ti(e, t), + label: Ri(e, t), fields: [ { - label: "Sampler", - value: Z(e?.sampler_name || e?.sampler) + label: k("sidebar.generation.model", "Model"), + value: $(e?.model) }, { - label: "Scheduler", - value: Z(e?.scheduler) + label: k("sidebar.generation.sampler", "Sampler"), + value: $(e?.sampler_name || e?.sampler) }, { - label: "Steps", - value: Z(e?.steps) + label: k("sidebar.generation.scheduler", "Scheduler"), + value: $(e?.scheduler) + }, + { + label: k("sidebar.generation.steps", "Steps"), + value: $(e?.steps) }, { label: "CFG", - value: Z(e?.cfg) + value: $(e?.cfg) }, { - label: "Denoise", - value: Z(e?.denoise) + label: k("sidebar.generation.denoise", "Denoise"), + value: $(e?.denoise) }, { - label: "Seed", - value: Z(e?.seed_val || e?.seed) + label: k("sidebar.generation.seed", "Seed"), + value: $(e?.seed_val || e?.seed) } ] })) : Array.isArray(r.all_samplers) && r.all_samplers.length > 1 && (y = r.all_samplers.filter((e) => e && typeof e == "object").map((e, t) => ({ - label: Ti(e, t), + label: Ri(e, t), fields: [ { - label: "Sampler", - value: Z(e?.sampler_name || e?.sampler) + label: k("sidebar.generation.model", "Model"), + value: $(e?.model) }, { - label: "Scheduler", - value: Z(e?.scheduler) + label: k("sidebar.generation.sampler", "Sampler"), + value: $(e?.sampler_name || e?.sampler) }, { - label: "Steps", - value: Z(e?.steps) + label: k("sidebar.generation.scheduler", "Scheduler"), + value: $(e?.scheduler) + }, + { + label: k("sidebar.generation.steps", "Steps"), + value: $(e?.steps) }, { label: "CFG", - value: Z(e?.cfg) + value: $(e?.cfg) }, { - label: "Denoise", - value: Z(e?.denoise) + label: k("sidebar.generation.denoise", "Denoise"), + value: $(e?.denoise) }, { - label: "Seed", - value: Z(e?.seed_val || e?.seed) + label: k("sidebar.generation.seed", "Seed"), + value: $(e?.seed_val || e?.seed) } ] }))); let b = []; r.voice && b.push({ - label: "Narrator Voice", + label: k("sidebar.generation.narratorVoice", "Narrator Voice"), value: r.voice }), r.language && b.push({ - label: "Language", + label: k("sidebar.generation.language", "Language"), value: r.language }), r.top_k !== void 0 && r.top_k !== null && b.push({ label: "Top-k", @@ -4168,84 +4442,84 @@ function Fi(e) { label: "Top-p", value: r.top_p }), r.temperature !== void 0 && r.temperature !== null && b.push({ - label: "Temperature", + label: k("sidebar.generation.temperature", "Temperature"), value: r.temperature }), r.repetition_penalty !== void 0 && r.repetition_penalty !== null && b.push({ - label: "Repetition Penalty", + label: k("sidebar.generation.repetitionPenalty", "Repetition Penalty"), value: r.repetition_penalty }), r.max_new_tokens !== void 0 && r.max_new_tokens !== null && b.push({ - label: "Max New Tokens", + label: k("sidebar.generation.maxNewTokens", "Max New Tokens"), value: r.max_new_tokens }); let x = []; r.device && x.push({ - label: "Device", + label: k("sidebar.generation.device", "Device"), value: r.device }), r.voice_preset && x.push({ - label: "Voice Preset", + label: k("sidebar.generation.voicePreset", "Voice Preset"), value: r.voice_preset }), r.dtype && x.push({ - label: "Dtype", + label: k("sidebar.generation.dtype", "Dtype"), value: r.dtype }), r.attn_implementation && x.push({ - label: "Attention", + label: k("sidebar.generation.attention", "Attention"), value: r.attn_implementation }), r.compile_mode && x.push({ - label: "Compile Mode", + label: k("sidebar.generation.compileMode", "Compile Mode"), value: r.compile_mode }), [ - ji("Torch Compile", r.use_torch_compile), - ji("CUDA Graphs", r.use_cuda_graphs), - ji("X-Vector Only", r.x_vector_only_mode) + Gi(k("sidebar.generation.torchCompile", "Torch Compile"), r.use_torch_compile), + Gi(k("sidebar.generation.cudaGraphs", "CUDA Graphs"), r.use_cuda_graphs), + Gi(k("sidebar.generation.xVectorOnly", "X-Vector Only"), r.x_vector_only_mode) ].filter(Boolean).forEach((e) => x.push(e)); let S = []; [ - ji("Chunking", r.enable_chunking), + Gi(k("sidebar.generation.chunking", "Chunking"), r.enable_chunking), r.max_chars_per_chunk !== void 0 && r.max_chars_per_chunk !== null ? { - label: "Max Chars/Chunk", + label: k("sidebar.generation.maxCharsChunk", "Max Chars/Chunk"), value: r.max_chars_per_chunk } : null, r.chunk_combination_method ? { - label: "Chunk Method", + label: k("sidebar.generation.chunkMethod", "Chunk Method"), value: r.chunk_combination_method } : null, r.silence_between_chunks_ms !== void 0 && r.silence_between_chunks_ms !== null ? { - label: "Silence Between Chunks (ms)", + label: k("sidebar.generation.silenceBetweenChunks", "Silence Between Chunks (ms)"), value: r.silence_between_chunks_ms } : null, - ji("Audio Cache", r.enable_audio_cache), + Gi(k("sidebar.generation.audioCache", "Audio Cache"), r.enable_audio_cache), r.batch_size !== void 0 && r.batch_size !== null ? { - label: "Batch Size", + label: k("sidebar.generation.batchSize", "Batch Size"), value: r.batch_size } : null ].filter(Boolean).forEach((e) => S.push(e)); let C = []; r.lyrics_strength !== void 0 && r.lyrics_strength !== null && C.push({ - label: "Lyrics Strength", + label: k("sidebar.generation.lyricsStrength", "Lyrics Strength"), value: r.lyrics_strength }); let w = []; - Mi(v) && !g.some((e) => e.label === "Denoise") && w.push({ - label: "Denoise", + Ki(v) && !g.some((e) => e.label === "Denoise") && w.push({ + label: k("sidebar.generation.denoise", "Denoise"), value: v - }), Mi(r.clip_skip) && w.push({ - label: "Clip Skip", + }), Ki(r.clip_skip) && w.push({ + label: k("sidebar.generation.clipSkip", "Clip Skip"), value: r.clip_skip }); let T = [], E = String(r.workflow_notes || r.notes || "").trim(); E && T.push({ - label: "Workflow Notes", + label: k("sidebar.generation.workflowNotes", "Workflow Notes"), value: E, - override: $(i, "workflow_notes", "notes") + override: Ji(i, "workflow_notes", "notes") }); - let ee = Pi(r.custom_info), D = Array.isArray(r.inputs) ? r.inputs.filter((e) => e && typeof e == "object" && e.filename).map((e, t) => ({ + let ee = Yi(r.custom_info), te = 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(), filepath: String(e.filepath || e.filename || "").trim(), 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 || "")), - previewCandidates: Ci(e) + previewCandidates: Ii(e) })) : []; return { ...n, @@ -4257,11 +4531,11 @@ function Fi(e) { isTruncated: !!(e?.geninfo?._truncated || e?.metadata?._truncated || e?.prompt?._truncated), positivePrompt: l.length ? "" : String(c.positive || "").trim(), negativePrompt: l.length ? "" : String(c.negative || "").trim(), - positivePromptOverride: $(i, "prompt", "positive", "positive_prompt"), - negativePromptOverride: $(i, "negative_prompt", "negative", "negativePrompt"), + positivePromptOverride: Ji(i, "prompt", "positive", "positive_prompt"), + negativePromptOverride: Ji(i, "negative_prompt", "negative", "negativePrompt"), promptTabs: l, showAlignment: !!e?.id && (!!String(c.positive || "").trim() || l.length > 0), - isImageAsset: _i(e), + isImageAsset: Ai(e), lyrics: String(r.lyrics || "").trim(), modelFields: u, modelGroups: p, @@ -4274,7 +4548,7 @@ function Fi(e) { audioFields: C, seed: r.seed ?? null, imageFields: w, - inputFiles: D, + inputFiles: te, isOverride: o, overrideLabel: o ? "Gen Info Override" : "", notesFields: T, @@ -4283,7 +4557,7 @@ function Fi(e) { } //#endregion //#region ui/vue/components/panel/sidebar/GenerationInputThumb.vue -var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { +var Zi = ["title"], Qi = ["src"], $i = ["src"], ea = { key: 2, style: { position: "absolute", @@ -4299,7 +4573,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { overflow: "hidden", "text-overflow": "ellipsis" } -}, Bi = { +}, ta = { key: 3, title: "Video file", style: { @@ -4309,7 +4583,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "font-size": "16px", "pointer-events": "none" } -}, Vi = { +}, na = { __name: "GenerationInputThumb", props: { inputFile: { type: Object, @@ -4338,7 +4612,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { function s(e) { e?.stopPropagation?.(); let t = i(); - if (wi(t)) try { + if (Li(t)) try { window.open(t, "_blank", "noopener,noreferrer"); } catch (e) { console.debug?.(e); @@ -4387,7 +4661,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { onError: a, onMouseover: c, onMouseout: l - }, null, 40, Li)) : (M(), F("img", { + }, null, 40, Qi)) : (M(), F("img", { key: 1, src: i(), style: { @@ -4396,16 +4670,16 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "object-fit": "cover" }, onError: a - }, null, 40, Ri)), e.inputFile.role && e.inputFile.role !== "secondary" ? (M(), F("div", zi, R(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (M(), F("div", Bi, " ▶ ")) : z("", !0)], 44, Ii)); + }, null, 40, $i)), e.inputFile.role && e.inputFile.role !== "secondary" ? (M(), F("div", ea, R(e.inputFile.roleLabel), 1)) : e.inputFile.isVideo ? (M(), F("div", ta, " ▶ ")) : B("", !0)], 44, Zi)); } -}, Hi = { +}, ra = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "12px" } -}, Ui = { +}, ia = { key: 0, style: { display: "flex", @@ -4420,40 +4694,77 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { fontSize: "11px", color: "var(--fg-color, #ccc)" } -}, Wi = { style: { +}, aa = { style: { opacity: "0.85" } }, oa = { style: { display: "flex", "align-items": "center", gap: "8px", "flex-wrap": "wrap", "justify-content": "flex-end" -} }, Gi = ["title"], Ki = ["title"], qi = { style: { +} }, sa = ["title"], ca = ["title"], la = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px" -} }, Ji = { style: { +} }, ua = { style: { + "font-size": "11px", + "font-weight": "700", + color: "#00BCD4", + "text-transform": "uppercase", + "letter-spacing": "0.6px" +} }, da = { style: { "font-size": "11px", color: "var(--fg-color, rgba(255,255,255,0.9))", "font-weight": "600" -} }, Yi = { style: { +} }, fa = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#FF9800", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, pa = { 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" -} }, Xi = { style: { +} }, ma = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#9E9E9E", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, ha = { 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" +} }, ga = { style: { "font-size": "11px", "font-weight": "600", color: "#4CAF50", "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "10px" -} }, Zi = { style: { +} }, _a = { style: { display: "flex", "flex-wrap": "wrap", gap: "6px", "margin-bottom": "10px" -} }, Qi = ["onClick"], $i = ["onClick"], ea = { style: { +} }, va = { style: { + "font-size": "10px", + "font-weight": "700", + color: "#4CAF50", + "letter-spacing": "0.4px" +} }, ya = ["onClick"], ba = { style: { + "font-size": "10px", + "font-weight": "700", + color: "#F44336", + "letter-spacing": "0.4px", + "margin-top": "4px" +} }, xa = ["onClick"], Sa = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -4463,7 +4774,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, ta = { style: { +} }, Ca = ["title"], wa = ["title"], Ta = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -4473,17 +4784,26 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "text-transform": "uppercase", "letter-spacing": "0.5px", "margin-bottom": "8px" -} }, na = { style: { +} }, Ea = ["title"], Da = ["title"], Oa = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#00BCD4", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + display: "flex", + "align-items": "center", + "justify-content": "space-between" +} }, ka = ["title"], Aa = { style: { display: "flex", "align-items": "center", gap: "10px" -} }, ra = { style: { +} }, ja = { style: { flex: "1", height: "8px", background: "rgba(255,255,255,0.1)", "border-radius": "4px", overflow: "hidden" -} }, ia = { +} }, Ma = { key: 0, style: { "font-size": "10px", @@ -4493,7 +4813,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { padding: "6px 8px", background: "rgba(255,255,255,0.04)" } -}, aa = { style: { +}, Na = { style: { "font-size": "10px", "font-weight": "600", color: "rgba(0, 188, 212, 0.75)", @@ -4504,96 +4824,149 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "align-items": "center", "justify-content": "space-between", gap: "8px" -} }, oa = { title: "AI caption generated by Florence-2" }, sa = { style: { +} }, Pa = ["title"], Fa = { style: { display: "flex", "align-items": "center", gap: "6px" -} }, ca = ["title"], la = { style: { +} }, Ia = ["title"], La = { style: { + display: "flex", + "justify-content": "space-between", + "align-items": "center", + "font-size": "11px", + "font-weight": "600", + color: "#00BCD4", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, Ra = { 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" -} }, ua = { style: { +} }, za = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#FF9800", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "10px" +} }, Ba = { style: { display: "flex", "flex-wrap": "wrap", gap: "6px", "margin-bottom": "10px" -} }, da = { style: { +} }, Va = { style: { "font-size": "10px", "font-weight": "600", color: "rgba(255,255,255,0.6)", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, fa = ["onClick"], pa = { style: { +} }, Ha = ["onClick"], Ua = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#9C27B0", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "10px" +} }, Wa = { style: { display: "grid", "grid-template-columns": "repeat(auto-fit, minmax(220px, 1fr))", gap: "10px" -} }, ma = { style: { +} }, Ga = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px" -} }, ha = { style: { +} }, Ka = { style: { display: "flex", "flex-direction": "column", gap: "4px" -} }, ga = ["onClick"], _a = { +} }, qa = ["onClick"], Ja = { key: 0, style: { display: "flex", "flex-direction": "column", gap: "6px" } -}, va = { style: { +}, Ya = { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.58)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, Xa = { style: { display: "flex", "flex-direction": "column", gap: "5px" -} }, ya = ["onClick"], ba = { style: { +} }, Za = ["onClick"], Qa = { style: { display: "grid", "grid-template-columns": "auto 1fr", gap: "8px 12px", "align-items": "start" -} }, xa = ["title"], Sa = ["title", "onClick"], Ca = ["title", "onClick"], wa = ["title", "onClick"], Ta = ["title"], Ea = ["title"], Da = { style: { +} }, $a = ["title"], eo = ["title"], to = ["title", "onClick"], no = { style: { + "font-size": "11px", + "font-weight": "600", + color: "#4CAF50", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "10px" +} }, ro = ["title", "onClick"], io = ["title", "onClick"], ao = { style: { + display: "flex", + "justify-content": "space-between", + "align-items": "center", + "font-size": "11px", + "font-weight": "600", + color: "#26A69A", + "text-transform": "uppercase", + "letter-spacing": "0.5px", + "margin-bottom": "8px" +} }, oo = ["title"], so = { style: { + "font-size": "11px", + "font-weight": "700", + color: "#E91E63", + "text-transform": "uppercase", + "letter-spacing": "1px" +} }, co = ["title"], lo = ["title"], uo = { style: { display: "flex", gap: "8px", "flex-wrap": "wrap" -} }, Oa = { +} }, fo = { __name: "SidebarGenerationSection", props: { asset: { type: Object, required: !0 } }, setup(e) { - let t = e, r = I(0), i = I(0), a = I(""), o = I("Copy"), s = I("Generate"), c = I(!1), l = I(d()), u = 0; - function d() { + let t = e, n = I(0), r = I(0), i = I(""), a = I(k("action.copy", "Copy")), o = I(k("action.generate", "Generate")), s = I(!1), c = I(u()), l = 0; + function u() { return { scoreText: "...", scoreColor: "#888", - qualityText: "Loading", + qualityText: k("status.loading", "Loading"), qualityColor: "#888", qualityBackground: "rgba(127,127,127,0.3)", fillWidth: "0%", fillColor: "#666", aiStatusVisible: !1, - aiStatusText: "AI features are disabled (enable vector search env var)." + aiStatusText: k("sidebar.generation.aiDisabledEnv", "AI features are disabled (enable vector search env var).") }; } - function f(e, t) { + function d(e, t) { let n = String(e || "").trim().replace(/^#/, ""); return /^[0-9a-fA-F]{6}$/.test(n) ? `rgba(${Number.parseInt(n.slice(0, 2), 16)}, ${Number.parseInt(n.slice(2, 4), 16)}, ${Number.parseInt(n.slice(4, 6), 16)}, ${t})` : `rgba(255,255,255,${t})`; } - function p(e, { emphasis: t = !1, startAlpha: n = .16, endAlpha: r = .08 } = {}) { + function f(e, { emphasis: t = !1, startAlpha: n = .16, endAlpha: r = .08 } = {}) { return { - background: t ? `linear-gradient(135deg, ${f(e, n)} 0%, ${f(e, r)} 100%)` : "var(--comfy-menu-bg, rgba(0,0,0,0.3))", + background: t ? `linear-gradient(135deg, ${d(e, n)} 0%, ${d(e, r)} 100%)` : "var(--comfy-menu-bg, rgba(0,0,0,0.3))", borderLeft: `3px solid ${e}`, - border: t ? `1px solid ${f(e, .45)}` : "1px solid var(--border-color, rgba(255,255,255,0.12))", - boxShadow: t ? `0 0 0 1px ${f(e, .15)} inset` : "none", + border: t ? `1px solid ${d(e, .45)}` : "1px solid var(--border-color, rgba(255,255,255,0.12))", + boxShadow: t ? `0 0 0 1px ${d(e, .15)} inset` : "none", borderRadius: "6px", padding: "12px" }; } - function m() { + function p() { return { background: "linear-gradient(135deg, rgba(233, 30, 99, 0.15) 0%, rgba(156, 39, 176, 0.15) 100%)", border: "2px solid #E91E63", @@ -4605,7 +4978,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { gap: "12px" }; } - function h() { + function m() { return { display: "inline-flex", alignItems: "center", @@ -4622,50 +4995,50 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { whiteSpace: "nowrap" }; } - let g = B(() => Fi(t.asset)), _ = B(() => yi()), v = B(() => g.value.kind === "full" || g.value.kind === "caption-only"), y = B(() => Si(a.value) || g.value.emptyCaptionText), b = B(() => _.value && g.value.isImageAsset && !!t.asset?.id), x = B(() => _.value && !!Si(y.value) && y.value !== g.value.emptyCaptionText), S = B(() => { + let h = V(() => Xi(t.asset)), g = V(() => Mi()), _ = V(() => h.value.kind === "full" || h.value.kind === "caption-only"), v = V(() => Fi(i.value) || h.value.emptyCaptionText), y = V(() => g.value && h.value.isImageAsset && !!t.asset?.id), b = V(() => g.value && !!Fi(v.value) && v.value !== h.value.emptyCaptionText), S = V(() => { let e = []; - return g.value.modelFields.length && e.push({ + return h.value.modelFields.length && e.push({ key: "model", - title: "Model & LoRA", + title: k("sidebar.generation.modelLora", "Model & LoRA"), accent: "#9C27B0", emphasis: !0, - fields: g.value.modelFields - }), !g.value.pipelineTabs.length && g.value.samplingFields.length && e.push({ + fields: h.value.modelFields + }), !h.value.pipelineTabs.length && h.value.samplingFields.length && e.push({ key: "sampling", - title: "Sampling", + title: k("sidebar.generation.sampling", "Sampling"), accent: "#FF9800", emphasis: !0, - fields: g.value.samplingFields - }), (g.value.ttsFields.length || g.value.workflowType.toLowerCase() === "tts") && e.push({ + fields: h.value.samplingFields + }), (h.value.ttsFields.length || h.value.workflowType.toLowerCase() === "tts") && e.push({ key: "tts", title: "TTS", accent: "#26A69A", emphasis: !0, - fields: g.value.ttsFields - }), g.value.ttsEngineFields.length && e.push({ + fields: h.value.ttsFields + }), h.value.ttsEngineFields.length && e.push({ key: "tts-engine", title: "TTS Engine", accent: "#00897B", emphasis: !1, - fields: g.value.ttsEngineFields - }), g.value.ttsRuntimeFields.length && e.push({ + fields: h.value.ttsEngineFields + }), h.value.ttsRuntimeFields.length && e.push({ key: "tts-runtime", title: "TTS Runtime", accent: "#00796B", emphasis: !1, - fields: g.value.ttsRuntimeFields - }), g.value.audioFields.length && e.push({ + fields: h.value.ttsRuntimeFields + }), h.value.audioFields.length && e.push({ key: "audio", - title: "Audio", + title: k("sidebar.generation.audio", "Audio"), accent: "#00BCD4", emphasis: !1, - fields: g.value.audioFields - }), g.value.imageFields.length && e.push({ + fields: h.value.audioFields + }), h.value.imageFields.length && e.push({ key: "image", - title: "Image", + title: k("sidebar.generation.image", "Image"), accent: "#2196F3", emphasis: !1, - fields: g.value.imageFields + fields: h.value.imageFields }), e; }); function C(e, t, n = 450) { @@ -4677,9 +5050,9 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { } function w(e, t = !0) { return { - background: t ? `linear-gradient(135deg, ${f(e, .16)} 0%, ${f(e, .08)} 100%)` : "var(--comfy-menu-bg, rgba(0,0,0,0.3))", - border: `1px solid ${f(e, .42)}`, - boxShadow: `0 0 0 1px ${f(e, .14)} inset`, + background: t ? `linear-gradient(135deg, ${d(e, .16)} 0%, ${d(e, .08)} 100%)` : "var(--comfy-menu-bg, rgba(0,0,0,0.3))", + border: `1px solid ${d(e, .42)}`, + boxShadow: `0 0 0 1px ${d(e, .14)} inset`, borderRadius: "8px", padding: "12px", display: "flex", @@ -4699,46 +5072,46 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { } } function ee() { - l.value = { + c.value = { scoreText: "AI OFF", scoreColor: "#9E9E9E", - qualityText: "Disabled", + qualityText: k("status.disabled", "Disabled"), qualityColor: "#BDBDBD", qualityBackground: "rgba(158,158,158,0.25)", fillWidth: "0%", fillColor: "#777", aiStatusVisible: !0, - aiStatusText: "AI features are disabled in settings." + aiStatusText: k("sidebar.generation.aiDisabledSettings", "AI features are disabled in settings.") }; } - function D() { - l.value = d(); + function te() { + c.value = u(); } - async function te() { - u += 1; - let e = u; - if (!g.value.showAlignment || !t.asset?.id) { - D(); + async function ne() { + l += 1; + let e = l; + if (!h.value.showAlignment || !t.asset?.id) { + te(); return; } - if (!_.value) { + if (!g.value) { ee(); return; } - D(); + te(); try { - let n = await ye(t.asset.id); - if (e !== u) return; + let n = await x(t.asset.id); + if (e !== l) return; if (!n?.ok && (String(n?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(n?.error || "")))) { ee(); return; } let r = n?.ok && n.data != null ? Number(n.data) : null; if (!Number.isFinite(r)) { - l.value = { + c.value = { scoreText: "N/A", scoreColor: "#888", - qualityText: "N/A", + qualityText: k("status.na", "N/A"), qualityColor: "#888", qualityBackground: "rgba(127,127,127,0.3)", fillWidth: "0%", @@ -4748,11 +5121,11 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { }; return; } - let i = Math.round(r * 100), a = bi(r); - l.value = { + let i = Math.round(r * 100), a = Ni(r); + c.value = { scoreText: `${i}%`, scoreColor: a, - qualityText: xi(r), + qualityText: Pi(r), qualityColor: a, qualityBackground: `${a}33`, fillWidth: `${i}%`, @@ -4761,11 +5134,11 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { aiStatusText: "" }; } catch (t) { - if (console.debug?.(t), e !== u) return; - l.value = { + if (console.debug?.(t), e !== l) return; + c.value = { scoreText: "-", scoreColor: "#888", - qualityText: "Unavailable", + qualityText: k("status.unavailable", "Unavailable"), qualityColor: "#888", qualityBackground: "rgba(127,127,127,0.3)", fillWidth: "0%", @@ -4776,41 +5149,41 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { } } async function re() { - if (!(!b.value || c.value)) { - c.value = !0, s.value = "Generating..."; + if (!(!y.value || s.value)) { + s.value = !0, o.value = k("status.generating", "Generating..."); try { - let e = await ne(t.asset.id); - e?.ok && (a.value = String(e?.data || "").trim()); + let e = await ce(t.asset.id); + e?.ok && (i.value = String(e?.data || "").trim()); } catch (e) { console.debug?.(e); } finally { - c.value = !1, s.value = "Generate"; + s.value = !1, o.value = k("action.generate", "Generate"); } } } async function ie() { - if (x.value) try { - await navigator.clipboard.writeText(y.value), o.value = "Copied!", setTimeout(() => { - o.value = "Copy"; + if (b.value) try { + await navigator.clipboard.writeText(v.value), a.value = k("viewer.copySuccessShort", "Copied!"), setTimeout(() => { + a.value = k("action.copy", "Copy"); }, 900); } catch (e) { console.debug?.(e); } } - return Ce(() => t.asset, () => { - r.value = 0, i.value = 0, a.value = String(t.asset?.enhanced_caption || "").trim(), o.value = "Copy", s.value = "Generate"; - }, { immediate: !0 }), Ce(() => [ + return we(() => t.asset, () => { + n.value = 0, r.value = 0, i.value = String(t.asset?.enhanced_caption || "").trim(), a.value = k("action.copy", "Copy"), o.value = k("action.generate", "Generate"); + }, { immediate: !0 }), we(() => [ t.asset?.id, - g.value.kind, - g.value.showAlignment, - _.value + h.value.kind, + h.value.showAlignment, + g.value ], () => { - te(); + ne(); }, { immediate: !0 }), (e, t) => { - let a = Ze("MButton"); - return g.value.kind === "empty" ? z("", !0) : (M(), F("div", Hi, [ - g.value.workflowType ? (M(), F("div", Ui, [t[4] ||= P("span", { style: { opacity: "0.85" } }, "Workflow", -1), P("div", Wi, [P("span", { - title: `Workflow engine: ${g.value.workflowType}`, + let i = Qe("MButton"); + return h.value.kind === "empty" ? B("", !0) : (M(), F("div", ra, [ + h.value.workflowType ? (M(), F("div", ia, [P("span", aa, R(z(k)("viewer.workflow", "Workflow")), 1), P("div", oa, [P("span", { + title: z(k)("sidebar.generation.workflowEngine", "Workflow engine: {value}", { value: h.value.workflowType }), style: { background: "#2196F3", color: "white", @@ -4820,9 +5193,9 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "font-size": "10px", "letter-spacing": "0.2px" } - }, R(g.value.workflowLabel || g.value.workflowType), 9, Gi), g.value.workflowBadge ? (M(), F("span", { + }, R(h.value.workflowLabel || h.value.workflowType), 9, sa), h.value.workflowBadge ? (M(), F("span", { key: 0, - title: `API provider: ${g.value.workflowBadge}`, + title: z(k)("sidebar.generation.apiProvider", "API provider: {value}", { value: h.value.workflowBadge }), style: { background: "rgba(255,255,255,0.08)", color: "var(--fg-color, #eee)", @@ -4833,67 +5206,41 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "font-size": "10px", "letter-spacing": "0.2px" } - }, R(g.value.workflowBadge), 9, Ki)) : z("", !0)])])) : z("", !0), - g.value.isOverride ? (M(), F("div", { + }, R(h.value.workflowBadge), 9, ca)) : B("", !0)])])) : B("", !0), + h.value.isOverride ? (M(), F("div", { key: 1, - style: L(p("#00BCD4", { + style: L(f("#00BCD4", { emphasis: !0, startAlpha: .14, endAlpha: .08 })) - }, [P("div", qi, [t[5] ||= P("span", { style: { - "font-size": "11px", - "font-weight": "700", - color: "#00BCD4", - "text-transform": "uppercase", - "letter-spacing": "0.6px" - } }, " Override ", -1), P("span", Ji, R(g.value.overrideLabel), 1)])], 4)) : z("", !0), - g.value.isTruncated ? (M(), F("div", { + }, [P("div", la, [P("span", ua, R(z(k)("sidebar.generation.override", "Override")), 1), P("span", da, R(h.value.overrideLabel), 1)])], 4)) : B("", !0), + h.value.isTruncated ? (M(), F("div", { key: 2, - style: L(p("#FF9800", { + style: L(f("#FF9800", { emphasis: !0, startAlpha: .12, endAlpha: .08 })) - }, [...t[6] ||= [P("div", { style: { - "font-size": "11px", - "font-weight": "600", - color: "#FF9800", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" - } }, " Metadata Truncated ", -1), P("div", { 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" - } }, " Generation data is incomplete because it exceeded the size limit. ", -1)]], 4)) : z("", !0), - g.value.kind === "media-only" ? (M(), F("div", { + }, [P("div", fa, R(z(k)("sidebar.generation.metadataTruncated", "Metadata Truncated")), 1), P("div", pa, R(z(k)("sidebar.generation.metadataTruncatedBody", "Generation data is incomplete because it exceeded the size limit.")), 1)], 4)) : B("", !0), + h.value.kind === "media-only" ? (M(), F("div", { key: 3, - style: L(p("#9E9E9E", { + style: L(f("#9E9E9E", { emphasis: !0, startAlpha: .1, endAlpha: .06 })) - }, [t[7] ||= P("div", { style: { - "font-size": "11px", - "font-weight": "600", - color: "#9E9E9E", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" - } }, " Generation Data ", -1), P("div", Yi, R(g.value.mediaOnlyMessage), 1)], 4)) : z("", !0), - g.value.kind === "full" ? (M(), F(V, { key: 4 }, [g.value.promptTabs.length ? (M(), F("div", { + }, [P("div", ma, R(z(k)("sidebar.generation.generationData", "Generation Data")), 1), P("div", ha, R(h.value.mediaOnlyMessage), 1)], 4)) : B("", !0), + h.value.kind === "full" ? (M(), F(H, { key: 4 }, [h.value.promptTabs.length ? (M(), F("div", { key: 0, - style: L(p("#4CAF50", { + style: L(f("#4CAF50", { emphasis: !0, startAlpha: .16, endAlpha: .1 })) }, [ - P("div", Xi, " Prompt Pipeline (" + R(g.value.promptTabs.length) + " variants) ", 1), - P("div", Zi, [(M(!0), F(V, null, N(g.value.promptTabs, (e, t) => (M(), we(a, { + P("div", ga, R(z(k)("sidebar.generation.promptPipeline", "Prompt Pipeline ({count} variants)", { count: h.value.promptTabs.length })), 1), + P("div", _a, [(M(!0), F(H, null, N(h.value.promptTabs, (e, t) => (M(), Te(i, { key: e.label, type: "button", severity: "secondary", @@ -4901,22 +5248,22 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { rounded: "", style: L({ appearance: "none", - border: r.value === t ? "1px solid #4CAF50" : "1px solid var(--border-color, rgba(255,255,255,0.12))", + border: n.value === t ? "1px solid #4CAF50" : "1px solid var(--border-color, rgba(255,255,255,0.12))", borderRadius: "999px", - background: r.value === t ? "#4CAF5033" : "rgba(127,127,127,0.12)", - color: r.value === t ? "#4CAF50" : "var(--fg-color, #ddd)", + background: n.value === t ? "#4CAF5033" : "rgba(127,127,127,0.12)", + color: n.value === t ? "#4CAF50" : "var(--fg-color, #ddd)", fontSize: "11px", padding: "4px 10px", cursor: "pointer", - fontWeight: r.value === t ? "700" : "500", - boxShadow: r.value === t ? "0 0 0 1px #4CAF5055 inset" : "none" + fontWeight: n.value === t ? "700" : "500", + boxShadow: n.value === t ? "0 0 0 1px #4CAF5055 inset" : "none" }), - onClick: (e) => r.value = t + onClick: (e) => n.value = t }, { - default: De(() => [Ee(R(e.label), 1)]), + default: Oe(() => [De(R(e.label), 1)]), _: 2 }, 1032, ["style", "onClick"]))), 128))]), - (M(!0), F(V, null, N(g.value.promptTabs, (e, n) => Ae((M(), F("div", { + (M(!0), F(H, null, N(h.value.promptTabs, (e, t) => je((M(), F("div", { key: `${e.label}-panel`, style: { display: "flex", @@ -4929,12 +5276,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { padding: "10px" } }, [ - t[9] ||= P("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "#4CAF50", - "letter-spacing": "0.4px" - } }, " POSITIVE ", -1), + P("div", va, R(z(k)("sidebar.generation.positive", "POSITIVE")), 1), P("div", { style: { "font-size": "12px", @@ -4944,14 +5286,8 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { cursor: "pointer" }, onClick: (t) => E(e.positive, t.currentTarget) - }, R(e.positive), 9, Qi), - e.negative ? (M(), F(V, { key: 0 }, [t[8] ||= P("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "#F44336", - "letter-spacing": "0.4px", - "margin-top": "4px" - } }, " NEGATIVE ", -1), P("div", { + }, R(e.positive), 9, ya), + e.negative ? (M(), F(H, { key: 0 }, [P("div", ba, R(z(k)("sidebar.generation.negative", "NEGATIVE")), 1), P("div", { style: { "font-size": "12px", color: "var(--fg-color, #ddd)", @@ -4960,21 +5296,21 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { cursor: "pointer" }, onClick: (t) => E(e.negative, t.currentTarget) - }, R(e.negative), 9, $i)], 64)) : z("", !0) - ])), [[je, r.value === n]])), 128)) - ], 4)) : g.value.positivePrompt ? (M(), F("div", { + }, R(e.negative), 9, xa)], 64)) : B("", !0) + ])), [[Ne, n.value === t]])), 128)) + ], 4)) : h.value.positivePrompt ? (M(), F("div", { key: 1, - style: L(p("#4CAF50", { + style: L(f("#4CAF50", { emphasis: !0, startAlpha: .16, endAlpha: .1 })) - }, [P("div", ea, [t[10] ||= P("span", null, "Positive Prompt", -1), g.value.positivePromptOverride ? (M(), F("span", { + }, [P("div", Sa, [P("span", null, R(z(k)("sidebar.generation.positivePrompt", "Positive Prompt")), 1), h.value.positivePromptOverride ? (M(), F("span", { key: 0, - style: L(h()), - title: "This field was forced by Majoor Gen Info Override" - }, " override ", 4)) : z("", !0)]), P("div", { - title: "Click to copy", + style: L(m()), + title: z(k)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") + }, R(z(k)("sidebar.generation.override", "override")), 13, Ca)) : B("", !0)]), P("div", { + title: z(k)("action.clickToCopy", "Click to copy"), style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.9))", @@ -4983,20 +5319,20 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[0] ||= (e) => E(g.value.positivePrompt, e.currentTarget) - }, R(g.value.positivePrompt), 1)], 4)) : z("", !0), !g.value.promptTabs.length && g.value.negativePrompt ? (M(), F("div", { + onClick: t[0] ||= (e) => E(h.value.positivePrompt, e.currentTarget) + }, R(h.value.positivePrompt), 9, wa)], 4)) : B("", !0), !h.value.promptTabs.length && h.value.negativePrompt ? (M(), F("div", { key: 2, - style: L(p("#F44336", { + style: L(f("#F44336", { emphasis: !0, startAlpha: .16, endAlpha: .1 })) - }, [P("div", ta, [t[11] ||= P("span", null, "Negative Prompt", -1), g.value.negativePromptOverride ? (M(), F("span", { + }, [P("div", Ta, [P("span", null, R(z(k)("sidebar.generation.negativePrompt", "Negative Prompt")), 1), h.value.negativePromptOverride ? (M(), F("span", { key: 0, - style: L(h()), - title: "This field was forced by Majoor Gen Info Override" - }, " override ", 4)) : z("", !0)]), P("div", { - title: "Click to copy", + style: L(m()), + title: z(k)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") + }, R(z(k)("sidebar.generation.override", "override")), 13, Ea)) : B("", !0)]), P("div", { + title: z(k)("action.clickToCopy", "Click to copy"), style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.9))", @@ -5005,9 +5341,9 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[1] ||= (e) => E(g.value.negativePrompt, e.currentTarget) - }, R(g.value.negativePrompt), 1)], 4)) : z("", !0)], 64)) : z("", !0), - v.value ? (M(), F("div", { + onClick: t[1] ||= (e) => E(h.value.negativePrompt, e.currentTarget) + }, R(h.value.negativePrompt), 9, Da)], 4)) : B("", !0)], 64)) : B("", !0), + _.value ? (M(), F("div", { key: 5, style: { background: "linear-gradient(135deg, rgba(0, 188, 212, 0.14) 0%, rgba(33, 150, 243, 0.10) 100%)", @@ -5018,54 +5354,68 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "flex-direction": "column", gap: "10px" }, - class: ze({ "mjr-ai-disabled-block": !_.value }) + class: Ve({ "mjr-ai-disabled-block": !g.value }) }, [ - g.value.showAlignment ? (M(), F(V, { key: 0 }, [ - t[12] ||= P("div", { style: { - "font-size": "11px", - "font-weight": "600", - color: "#00BCD4", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - display: "flex", - "align-items": "center", - "justify-content": "space-between" - } }, [P("span", { title: "How closely the generated image matches the prompt (SigLIP2 score)" }, " Prompt Alignment ")], -1), - P("div", na, [ - P("div", ra, [P("div", { style: L({ + h.value.showAlignment ? (M(), F(H, { key: 0 }, [ + P("div", Oa, [P("span", { title: z(k)("sidebar.generation.promptAlignmentTooltip", "How closely the generated image matches the prompt (SigLIP2 score)") }, R(z(k)("sidebar.generation.promptAlignment", "Prompt Alignment")), 9, ka)]), + P("div", Aa, [ + P("div", ja, [P("div", { style: L({ height: "100%", - width: l.value.fillWidth, - background: l.value.fillColor, + width: c.value.fillWidth, + background: c.value.fillColor, borderRadius: "4px", transition: "width 0.6s ease, background 0.4s ease" }) }, null, 4)]), P("span", { style: L({ fontSize: "13px", fontWeight: "700", - color: l.value.scoreColor, + color: c.value.scoreColor, minWidth: "60px", textAlign: "right", fontFamily: "'Consolas', 'Monaco', monospace" - }) }, R(l.value.scoreText), 5), + }) }, R(c.value.scoreText), 5), P("span", { style: L({ fontSize: "9px", fontWeight: "700", padding: "2px 6px", borderRadius: "3px", - background: l.value.qualityBackground, - color: l.value.qualityColor, + background: c.value.qualityBackground, + color: c.value.qualityColor, textTransform: "uppercase", letterSpacing: "0.5px" - }) }, R(l.value.qualityText), 5) + }) }, R(c.value.qualityText), 5) ]), - l.value.aiStatusVisible ? (M(), F("div", ia, R(l.value.aiStatusText), 1)) : z("", !0) - ], 64)) : z("", !0), - P("div", aa, [P("span", oa, R(g.value.captionLabel), 1), P("div", sa, [Te(a, { + c.value.aiStatusVisible ? (M(), F("div", Ma, R(c.value.aiStatusText), 1)) : B("", !0) + ], 64)) : B("", !0), + P("div", Na, [P("span", { title: z(k)("sidebar.generation.aiCaptionTooltip", "AI caption generated by Florence-2") }, R(h.value.captionLabel), 9, Pa), P("div", Fa, [Ee(i, { type: "button", class: "mjr-ai-control", severity: "secondary", text: "", - disabled: !b.value || c.value, + disabled: !y.value || s.value, + style: L([{ + border: "1px solid rgba(0,188,212,0.45)", + background: "rgba(0,188,212,0.12)", + color: "#00BCD4", + "border-radius": "4px", + "font-size": "10px", + "font-weight": "600", + padding: "2px 8px", + cursor: "pointer" + }, { + opacity: y.value ? "1" : "0.6", + cursor: y.value ? "pointer" : "default" + }]), + onClick: Ze(re, ["stop"]) + }, { + default: Oe(() => [De(R(o.value), 1)]), + _: 1 + }, 8, ["disabled", "style"]), Ee(i, { + type: "button", + class: "mjr-ai-control", + severity: "secondary", + text: "", + disabled: !b.value, style: L([{ border: "1px solid rgba(0,188,212,0.45)", background: "rgba(0,188,212,0.12)", @@ -5079,36 +5429,13 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { opacity: b.value ? "1" : "0.6", cursor: b.value ? "pointer" : "default" }]), - onClick: Xe(re, ["stop"]) + onClick: Ze(ie, ["stop"]) }, { - default: De(() => [Ee(R(s.value), 1)]), - _: 1 - }, 8, ["disabled", "style"]), Te(a, { - type: "button", - class: "mjr-ai-control", - severity: "secondary", - text: "", - disabled: !x.value, - style: L([{ - border: "1px solid rgba(0,188,212,0.45)", - background: "rgba(0,188,212,0.12)", - color: "#00BCD4", - "border-radius": "4px", - "font-size": "10px", - "font-weight": "600", - padding: "2px 8px", - cursor: "pointer" - }, { - opacity: x.value ? "1" : "0.6", - cursor: x.value ? "pointer" : "default" - }]), - onClick: Xe(ie, ["stop"]) - }, { - default: De(() => [Ee(R(o.value), 1)]), + default: Oe(() => [De(R(a.value), 1)]), _: 1 }, 8, ["disabled", "style"])])]), P("div", { - title: _.value ? "Click to copy caption" : "AI caption controls are disabled", + title: g.value ? z(k)("sidebar.generation.copyCaptionTooltip", "Click to copy caption") : z(k)("sidebar.generation.aiCaptionDisabled", "AI caption controls are disabled"), style: L({ marginTop: "4px", padding: "8px", @@ -5120,42 +5447,25 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { lineHeight: "1.45", whiteSpace: "pre-wrap", wordBreak: "break-word", - cursor: x.value ? "copy" : "default" + cursor: b.value ? "copy" : "default" }), onClick: ie - }, R(y.value), 13, ca) - ], 2)) : z("", !0), - g.value.lyrics ? (M(), F("div", { + }, R(v.value), 13, Ia) + ], 2)) : B("", !0), + h.value.lyrics ? (M(), F("div", { key: 6, - style: L(p("#00BCD4", { emphasis: !1 })) - }, [t[13] ||= P("div", { style: { - display: "flex", - "justify-content": "space-between", - "align-items": "center", - "font-size": "11px", - "font-weight": "600", - color: "#00BCD4", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" - } }, [P("span", null, "Lyrics")], -1), P("div", la, R(g.value.lyrics), 1)], 4)) : z("", !0), - g.value.pipelineTabs.length ? (M(), F("div", { + style: L(f("#00BCD4", { emphasis: !1 })) + }, [P("div", La, [P("span", null, R(z(k)("sidebar.generation.lyrics", "Lyrics")), 1)]), P("div", Ra, R(h.value.lyrics), 1)], 4)) : B("", !0), + h.value.pipelineTabs.length ? (M(), F("div", { key: 7, - style: L(p("#FF9800", { + style: L(f("#FF9800", { emphasis: !0, startAlpha: .16, endAlpha: .1 })) }, [ - t[14] ||= P("div", { style: { - "font-size": "11px", - "font-weight": "600", - color: "#FF9800", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "10px" - } }, " Generation Pipeline ", -1), - P("div", ua, [(M(!0), F(V, null, N(g.value.pipelineTabs, (e, t) => (M(), we(a, { + P("div", za, R(z(k)("sidebar.generation.pipeline", "Generation Pipeline")), 1), + P("div", Ba, [(M(!0), F(H, null, N(h.value.pipelineTabs, (e, t) => (M(), Te(i, { key: e.label, type: "button", severity: "secondary", @@ -5163,22 +5473,22 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { rounded: "", style: L({ appearance: "none", - border: i.value === t ? "1px solid #FF9800" : "1px solid var(--border-color, rgba(255,255,255,0.12))", + border: r.value === t ? "1px solid #FF9800" : "1px solid var(--border-color, rgba(255,255,255,0.12))", borderRadius: "999px", - background: i.value === t ? "#FF980033" : "rgba(127,127,127,0.12)", - color: i.value === t ? "#FF9800" : "var(--fg-color, #ddd)", + background: r.value === t ? "#FF980033" : "rgba(127,127,127,0.12)", + color: r.value === t ? "#FF9800" : "var(--fg-color, #ddd)", fontSize: "11px", padding: "4px 10px", cursor: "pointer", - fontWeight: i.value === t ? "700" : "500", - boxShadow: i.value === t ? "0 0 0 1px #FF980055 inset" : "none" + fontWeight: r.value === t ? "700" : "500", + boxShadow: r.value === t ? "0 0 0 1px #FF980055 inset" : "none" }), - onClick: (e) => i.value = t + onClick: (e) => r.value = t }, { - default: De(() => [Ee(R(e.label), 1)]), + default: Oe(() => [De(R(e.label), 1)]), _: 2 }, 1032, ["style", "onClick"]))), 128))]), - (M(!0), F(V, null, N(g.value.pipelineTabs, (e, t) => Ae((M(), F("div", { + (M(!0), F(H, null, N(h.value.pipelineTabs, (e, t) => je((M(), F("div", { key: `${e.label}-pipeline`, style: { display: "grid", @@ -5190,7 +5500,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { background: "linear-gradient(135deg, rgba(255, 152, 0, 0.12) 0%, rgba(255, 193, 7, 0.08) 100%)", "box-shadow": "0 0 0 1px rgba(255, 152, 0, 0.12) inset" } - }, [(M(!0), F(V, null, N(e.fields, (t) => (M(), F("div", { + }, [(M(!0), F(H, null, N(e.fields, (t) => (M(), F("div", { key: `${e.label}-${t.label}`, style: { display: "flex", @@ -5198,7 +5508,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { gap: "2px", "min-width": "0" } - }, [P("span", da, R(t.label), 1), P("span", { + }, [P("span", Va, R(t.label), 1), P("span", { style: { "font-size": "12px", color: "var(--fg-color, #ddd)", @@ -5209,27 +5519,20 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { cursor: "copy" }, onClick: (e) => E(t.value, e.currentTarget) - }, R(t.value), 9, fa)]))), 128))])), [[je, i.value === t]])), 128)) - ], 4)) : z("", !0), - g.value.modelGroups.length ? (M(), F("div", { + }, R(t.value), 9, Ha)]))), 128))])), [[Ne, r.value === t]])), 128)) + ], 4)) : B("", !0), + h.value.modelGroups.length ? (M(), F("div", { key: 8, - style: L(p("#9C27B0", { + style: L(f("#9C27B0", { emphasis: !0, startAlpha: .18, endAlpha: .1 })) - }, [t[17] ||= P("div", { style: { - "font-size": "11px", - "font-weight": "600", - color: "#9C27B0", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "10px" - } }, " Model Branches ", -1), P("div", pa, [(M(!0), F(V, null, N(g.value.modelGroups, (e) => (M(), F("div", { + }, [P("div", Ua, R(z(k)("sidebar.generation.modelBranches", "Model Branches")), 1), P("div", Wa, [(M(!0), F(H, null, N(h.value.modelGroups, (e) => (M(), F("div", { key: `model-group-${e.key}`, style: L(w(T(e.key), !0)) }, [ - P("div", ma, [P("div", { style: L({ + P("div", Ga, [P("div", { style: L({ fontSize: "10px", fontWeight: "800", color: T(e.key), @@ -5239,14 +5542,14 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { fontSize: "9px", fontWeight: "700", color: "#fff", - background: f(T(e.key), .22), - border: `1px solid ${f(T(e.key), .48)}`, + background: d(T(e.key), .22), + border: `1px solid ${d(T(e.key), .48)}`, borderRadius: "999px", padding: "2px 8px", letterSpacing: "0.4px", textTransform: "uppercase" }) }, R(e.loras?.length || 0) + " LoRA ", 5)]), - P("div", ha, [t[15] ||= P("div", { style: { + P("div", Ka, [t[4] ||= P("div", { style: { "font-size": "10px", "font-weight": "700", color: "rgba(255,255,255,0.58)", @@ -5261,14 +5564,8 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { cursor: "pointer" }, onClick: (t) => E(e.model, t.currentTarget) - }, R(e.model || "-"), 9, ga)]), - e.loras?.length ? (M(), F("div", _a, [t[16] ||= P("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.58)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, " LoRA Stack ", -1), P("div", va, [(M(!0), F(V, null, N(e.loras, (t, n) => (M(), F("div", { + }, R(e.model || "-"), 9, qa)]), + e.loras?.length ? (M(), F("div", Ja, [P("div", Ya, R(z(k)("sidebar.generation.loraStack", "LoRA Stack")), 1), P("div", Xa, [(M(!0), F(H, null, N(e.loras, (t, n) => (M(), F("div", { key: `${e.key}-lora-${n}`, style: { "font-size": "12px", @@ -5282,11 +5579,11 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { cursor: "pointer" }, onClick: (e) => E(t, e.currentTarget) - }, R(t), 9, ya))), 128))])])) : z("", !0) - ], 4))), 128))])], 4)) : z("", !0), - (M(!0), F(V, null, N(S.value, (e) => (M(), F("div", { + }, R(t), 9, Za))), 128))])])) : B("", !0) + ], 4))), 128))])], 4)) : B("", !0), + (M(!0), F(H, null, N(S.value, (e) => (M(), F("div", { key: e.key, - style: L(p(e.accent, { emphasis: e.emphasis })) + style: L(f(e.accent, { emphasis: e.emphasis })) }, [P("div", { style: L({ fontSize: "11px", fontWeight: "600", @@ -5294,7 +5591,7 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { textTransform: "uppercase", letterSpacing: "0.5px", marginBottom: "10px" - }) }, R(e.title), 5), P("div", ba, [(M(!0), F(V, null, N(e.fields, (t) => (M(), F(V, { key: `${e.key}-${t.label}` }, [P("div", { + }) }, R(e.title), 5), P("div", Qa, [(M(!0), F(H, null, N(e.fields, (t) => (M(), F(H, { key: `${e.key}-${t.label}` }, [P("div", { title: t.label, style: { "font-size": "11px", @@ -5306,9 +5603,9 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { } }, [P("span", null, R(t.label) + ":", 1), t.override ? (M(), F("span", { key: 0, - style: L(h()), - title: "This field was forced by Majoor Gen Info Override" - }, " override ", 4)) : z("", !0)], 8, xa), P("div", { + style: L(m()), + title: z(k)("sidebar.generation.overrideTooltip", "This field was forced by Majoor Gen Info Override") + }, R(z(k)("sidebar.generation.override", "override")), 13, eo)) : B("", !0)], 8, $a), P("div", { title: `${t.label}: ${t.value}`, style: { "font-size": "12px", @@ -5318,18 +5615,11 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { cursor: "pointer" }, onClick: (e) => E(t.value, e.currentTarget) - }, R(t.value), 9, Sa)], 64))), 128))])], 4))), 128)), - g.value.notesFields.length ? (M(), F("div", { + }, R(t.value), 9, to)], 64))), 128))])], 4))), 128)), + h.value.notesFields.length ? (M(), F("div", { key: 9, - style: L(p("#4CAF50", { emphasis: !1 })) - }, [t[18] ||= P("div", { style: { - "font-size": "11px", - "font-weight": "600", - color: "#4CAF50", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "10px" - } }, " Notes ", -1), (M(!0), F(V, null, N(g.value.notesFields, (e) => (M(), F("div", { + style: L(f("#4CAF50", { emphasis: !1 })) + }, [P("div", no, R(z(k)("sidebar.generation.notes", "Notes")), 1), (M(!0), F(H, null, N(h.value.notesFields, (e) => (M(), F("div", { key: e.label, title: `${e.label}: ${e.value}`, style: { @@ -5341,10 +5631,10 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { cursor: "pointer" }, onClick: (t) => E(e.value, t.currentTarget) - }, R(e.value), 9, Ca))), 128))], 4)) : z("", !0), - (M(!0), F(V, null, N(g.value.customInfoBlocks, (e) => (M(), F("div", { + }, R(e.value), 9, ro))), 128))], 4)) : B("", !0), + (M(!0), F(H, null, N(h.value.customInfoBlocks, (e) => (M(), F("div", { key: `${e.title}-${e.content}`, - style: L(p(e.color, { emphasis: !1 })) + style: L(f(e.color, { emphasis: !1 })) }, [P("div", { style: L({ fontSize: "11px", fontWeight: "600", @@ -5363,22 +5653,12 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { cursor: "pointer" }, onClick: (t) => E(e.content, t.currentTarget) - }, R(e.content), 9, wa)], 4))), 128)), - g.value.ttsInstruction ? (M(), F("div", { + }, R(e.content), 9, io)], 4))), 128)), + h.value.ttsInstruction ? (M(), F("div", { key: 10, - style: L(p("#26A69A", { emphasis: !1 })) - }, [t[19] ||= P("div", { style: { - display: "flex", - "justify-content": "space-between", - "align-items": "center", - "font-size": "11px", - "font-weight": "600", - color: "#26A69A", - "text-transform": "uppercase", - "letter-spacing": "0.5px", - "margin-bottom": "8px" - } }, [P("span", null, "TTS Instruction")], -1), P("div", { - title: "Click to copy", + style: L(f("#26A69A", { emphasis: !1 })) + }, [P("div", ao, [P("span", null, R(z(k)("sidebar.generation.ttsInstruction", "TTS Instruction")), 1)]), P("div", { + title: z(k)("action.clickToCopy", "Click to copy"), style: { "font-size": "12px", color: "var(--fg-color, rgba(255,255,255,0.9))", @@ -5387,19 +5667,13 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "word-break": "break-word", cursor: "pointer" }, - onClick: t[2] ||= (e) => E(g.value.ttsInstruction, e.currentTarget) - }, R(g.value.ttsInstruction), 1)], 4)) : z("", !0), - g.value.seed !== null && g.value.seed !== void 0 && g.value.seed !== "" ? (M(), F("div", { + onClick: t[2] ||= (e) => E(h.value.ttsInstruction, e.currentTarget) + }, R(h.value.ttsInstruction), 9, oo)], 4)) : B("", !0), + h.value.seed !== null && h.value.seed !== void 0 && h.value.seed !== "" ? (M(), F("div", { key: 11, - style: L(m()) - }, [t[20] ||= P("div", { style: { - "font-size": "11px", - "font-weight": "700", - color: "#E91E63", - "text-transform": "uppercase", - "letter-spacing": "1px" - } }, " SEED ", -1), P("div", { - title: `Click to copy seed: ${g.value.seed}`, + style: L(p()) + }, [P("div", so, R(z(k)("sidebar.generation.seed", "SEED")), 1), P("div", { + title: z(k)("sidebar.generation.copySeedTooltip", "Click to copy seed: {seed}", { seed: h.value.seed }), style: { "font-size": "18px", "font-weight": "700", @@ -5411,17 +5685,17 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "border-radius": "4px", transition: "background 0.2s" }, - onClick: t[3] ||= (e) => E(g.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)") - }, R(g.value.seed), 9, Ta)], 4)) : z("", !0), - g.value.inputFiles.length ? (M(), F("div", { + onClick: t[3] ||= (e) => E(h.value.seed, e.currentTarget, "rgba(76, 175, 80, 0.4)") + }, R(h.value.seed), 9, co)], 4)) : B("", !0), + h.value.inputFiles.length ? (M(), F("div", { key: 12, - style: L(p("#4CAF50", { + style: L(f("#4CAF50", { emphasis: !0, startAlpha: .16, endAlpha: .1 })) }, [P("div", { - title: Ke(n)("tooltip.generationInputs", "Input files used in generation"), + title: z(k)("tooltip.generationInputs", "Input files used in generation"), style: { "font-size": "11px", "font-weight": "600", @@ -5430,42 +5704,42 @@ var Ii = ["title"], Li = ["src"], Ri = ["src"], zi = { "letter-spacing": "0.5px", "margin-bottom": "8px" } - }, " Source Files ", 8, Ea), P("div", Da, [(M(!0), F(V, null, N(g.value.inputFiles, (e) => (M(), we(Vi, { + }, R(z(k)("sidebar.generation.sourceFiles", "Source Files")), 9, lo), P("div", uo, [(M(!0), F(H, null, N(h.value.inputFiles, (e) => (M(), Te(na, { key: e.id, "input-file": e - }, null, 8, ["input-file"]))), 128))])], 4)) : z("", !0) + }, null, 8, ["input-file"]))), 128))])], 4)) : B("", !0) ])); }; } -}, ka = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, Aa = /^[0-9a-f]{20,}$/i; -function ja(...e) { +}, po = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, mo = /^[0-9a-f]{20,}$/i; +function ho(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function Ma(e) { +function go(e) { let t = String(e || "").trim(); - return !!t && (ka.test(t) || Aa.test(t)); + return !!t && (po.test(t) || mo.test(t)); } -function Na(e) { +function _o(e) { return String(e?.type || e?.class_type || e?.comfyClass || e?.classType || "").trim(); } -function Pa(e) { - return ja(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 vo(e) { + return ho(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 Fa(e) { - let t = Na(e), n = Pa(e); - return n && (!t || Ma(t) || n !== t) ? n : t && !Ma(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node"); +function yo(e) { + let t = _o(e), n = vo(e); + return n && (!t || go(t) || n !== t) ? n : t && !go(t) ? t : n || (t ? "Subgraph" : String(e?.id || "Node").trim() || "Node"); } -function Ia(e) { - let t = Na(e); - return t && !Ma(t) ? t : t ? "Subgraph" : "Node"; +function bo(e) { + let t = _o(e); + return t && !go(t) ? t : t ? "Subgraph" : "Node"; } //#endregion //#region ui/components/sidebar/utils/minimap.ts -var La = 6, Ra = 1, za = 8, Ba = 74, Va = 42, Ha = [ +var xo = 6, So = 1, Co = 8, wo = 74, To = 42, Eo = [ ["sampler", "#8e5cff"], ["ksampler", "#8e5cff"], ["loader", "#4f8cff"], @@ -5482,20 +5756,20 @@ var La = 6, Ra = 1, za = 8, Ba = 74, Va = 42, Ha = [ ["save", "#4aa37c"], ["preview", "#4aa37c"], ["api", "#3aa6a6"] -], Ua = (e, t, n) => { +], Do = (e, t, n) => { let r = Number(e); return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; -}, Wa = (e, t = !1) => { +}, Oo = (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)"; -}, Ga = (e, t, n) => { +}, ko = (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 Ka(e, t, n = null) { +function Ao(e, t, n = null) { if (!e) return; let r = e.getContext?.("2d"); if (!r) return; @@ -5507,8 +5781,9 @@ function Ka(e, t, n = null) { renderErrorState: !0, showViewport: !0, showNodeLabels: !1, + expandSubgraphs: !0, ...n && typeof n == "object" ? n : {} - }, a = qa(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 : jo(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})`; @@ -5545,7 +5820,7 @@ function Ka(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 Ha) if (n.includes(e)) return t; + for (let [e, t] of Eo) 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%)`; @@ -5554,7 +5829,7 @@ function Ka(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 && to(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 && zo(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]); @@ -5597,7 +5872,7 @@ function Ka(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: Fa(e).replace(/\s+/g, " ").trim() + label: yo(e).replace(/\s+/g, " ").trim() }), n && h.set(n, m[m.length - 1]); } if (i.showGroups) for (let e of s || []) { @@ -5617,21 +5892,21 @@ function Ka(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), w = v + S / 2, T = y + C / 2, E = i.view && typeof i.view == "object" ? i.view : Object.create(null), ee = Ua(E.zoom ?? 1, Ra, za), D = Math.max(1, S / ee), te = Math.max(1, C / ee), ne = D / 2, re = te / 2, ie = D >= S ? w : Ua(E.centerX ?? w, v + ne, b - ne), ae = te >= C ? T : Ua(E.centerY ?? T, y + re, x - re), oe = ie - ne, se = ae - re, O = La, k = Math.min((l - O * 2) / D, (u - O * 2) / te), le = E.hoveredNodeId !== null && E.hoveredNodeId !== void 0 ? String(E.hoveredNodeId) : null; + let S = Math.max(1, b - v), C = Math.max(1, x - y), w = v + S / 2, T = y + C / 2, E = i.view && typeof i.view == "object" ? i.view : Object.create(null), ee = Do(E.zoom ?? 1, So, Co), te = Math.max(1, S / ee), ne = Math.max(1, C / ee), re = te / 2, ie = ne / 2, ae = te >= S ? w : Do(E.centerX ?? w, v + re, b - re), oe = ne >= C ? T : Do(E.centerY ?? T, y + ie, x - ie), se = ae - re, ce = oe - ie, D = xo, O = Math.min((l - D * 2) / te, (u - D * 2) / ne), le = E.hoveredNodeId !== null && E.hoveredNodeId !== void 0 ? String(E.hoveredNodeId) : null; r.clearRect(0, 0, l, u), r.fillStyle = "rgba(0,0,0,0.22)", r.fillRect(0, 0, l, u); let ue = (e, t) => ({ - x: O + (e - oe) * k, - y: O + (t - se) * k + x: D + (e - se) * O, + y: D + (t - ce) * O }), de = (e, t) => ({ - x: Ua(oe + (Number(e) - O) / k, v, b), - y: Ua(se + (Number(t) - O) / k, y, x) + x: Do(se + (Number(e) - D) / O, v, b), + y: Do(ce + (Number(t) - D) / O, y, x) }), fe = (e) => ({ - x: O + (e.x - oe) * k, - y: O + (e.y - se) * k, - w: Math.max(1, e.w * k), - h: Math.max(1, e.h * k) + x: D + (e.x - se) * O, + y: D + (e.y - ce) * O, + w: Math.max(1, e.w * O), + h: Math.max(1, e.h * O) }), pe = (e) => Math.max(10, Math.min(24, Math.floor(Number(e) * .2))), me = (e, t, n) => { - let r = fe(e), i = pe(r.h), a = n === "output" ? e.outputs : e.inputs, o = Math.max(1, Array.isArray(a) ? a.length : Number(e[`${n}Count`]) || 0), s = Ua(t, 0, Math.max(0, o - 1)); + let r = fe(e), i = pe(r.h), a = n === "output" ? e.outputs : e.inputs, o = Math.max(1, Array.isArray(a) ? a.length : Number(e[`${n}Count`]) || 0), s = Do(t, 0, Math.max(0, o - 1)); return r.y + i + (r.h - i) * (s + 1) / (o + 1); }, he = (e) => Array.isArray(e) && e.length >= 5 ? { originId: e[1], @@ -5645,10 +5920,10 @@ function Ka(e, t, n = null) { targetId: e.target_id ?? e.targetId ?? e.to ?? null, targetSlot: Number(e.target_slot ?? e.targetSlot ?? e.toSlot ?? 0) || 0, type: e.type - } : null, ge = (e) => { + } : null, k = (e) => { let t = String(e || "").toUpperCase(); return t.includes("IMAGE") ? "rgba(145,198,99,0.38)" : t.includes("LATENT") ? "rgba(89,178,118,0.38)" : t.includes("MODEL") ? "rgba(112,155,255,0.38)" : t.includes("CONDITIONING") ? "rgba(191,123,226,0.38)" : t.includes("CLIP") ? "rgba(220,178,77,0.38)" : t.includes("VAE") ? "rgba(72,184,214,0.38)" : t.includes("MASK") ? "rgba(190,190,190,0.36)" : "rgba(255,255,255,0.2)"; - }, _e = () => { + }, ge = () => { if (i.showLinks && !(!c || c.length === 0)) { r.save(), r.globalAlpha = 1, r.lineWidth = 1; for (let e of c) { @@ -5663,12 +5938,12 @@ function Ka(e, t, n = null) { x: c.x, y: me(o, t?.targetSlot ?? 0, "input") }, d = Math.max(12, Math.min(80, Math.abs(u.x - l.x) * .35)); - r.strokeStyle = ge(t?.type), r.beginPath(), r.moveTo(l.x, l.y), r.bezierCurveTo(l.x + d, l.y, u.x - d, u.y, u.x, u.y), r.stroke(); + r.strokeStyle = k(t?.type), r.beginPath(), r.moveTo(l.x, l.y), r.bezierCurveTo(l.x + d, l.y, u.x - d, u.y, u.x, u.y), r.stroke(); } r.restore(); } - }, ve = (e) => { - let { x: t, y: n, w: a, h: o } = fe(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 >= Ba && o >= Va, _ = Math.max(2, Math.min(g ? 7 : 8, Math.floor(Math.min(a, o) * .08))), v = s ? pe(o) : 0; + }, A = (e) => { + let { x: t, y: n, w: a, h: o } = fe(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 >= wo && o >= To, _ = Math.max(2, Math.min(g ? 7 : 8, Math.floor(Math.min(a, o) * .08))), v = s ? pe(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, [ _, _, @@ -5689,11 +5964,11 @@ function Ka(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 = me(e, i, "input"); - r.fillStyle = Wa(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 = Oo(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 = me(e, n, "output"); - r.fillStyle = Wa(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 = Oo(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(); } @@ -5736,22 +6011,22 @@ function Ka(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(Ga(r, s, i), t + 7, me(e, a, "input") + n * .35, i); + s && r.fillText(ko(r, s, i), t + 7, me(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 = Ga(r, c, i); + let l = ko(r, c, i); r.fillText(l, t + a - 7 - Math.min(i, r.measureText(l).width), me(e, o, "output") + n * .35, i); } r.restore(); } }; - for (let e of m.filter((e) => e.kind === "group")) ve(e); - _e(); - for (let e of m.filter((e) => e.kind === "node")) ve(e); + for (let e of m.filter((e) => e.kind === "group")) A(e); + ge(); + for (let e of m.filter((e) => e.kind === "node")) A(e); if (i.showViewport) try { - let e = ce(); + let e = Ce(); if (e) { let t = ue(e.x0, e.y0), n = ue(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(); @@ -5770,14 +6045,14 @@ function Ka(e, t, n = null) { }, resolvedView: { zoom: ee, - centerX: ie, - centerY: ae, - visibleW: D, - visibleH: te, - viewMinX: oe, - viewMinY: se, - pad: O, - renderScale: k + centerX: ae, + centerY: oe, + visibleW: te, + visibleH: ne, + viewMinX: se, + viewMinY: ce, + pad: D, + renderScale: O }, canvasToWorld: de, worldToCanvas: ue, @@ -5791,16 +6066,16 @@ function Ka(e, t, n = null) { } }; } -function qa(e) { +function jo(e) { if (!e || typeof e != "object") return e; - let t = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], n = Ja(e); + let t = Array.isArray(e.nodes) ? e.nodes.filter(Boolean) : [], n = Mo(e); if (!t.length) return e; let r = [], i = Array.isArray(e.links) ? [...e.links] : [], a = [...Array.isArray(e.groups) ? e.groups : [], ...Array.isArray(e.extra?.groups) ? e.extra.groups : []]; for (let e of t) { r.push(e); - let t = Ya(e, n); + let t = No(e, n); if (!t || !Array.isArray(t.nodes) || !t.nodes.length) continue; - let o = Za(e, qa(t)); + let o = Fo(e, jo(t)); r.push(...o.nodes), i.push(...o.links), o.group && a.push(o.group); } return { @@ -5814,16 +6089,16 @@ function qa(e) { } }; } -function Ja(e) { +function Mo(e) { let t = [ ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], ...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 Xa(e)) t != null && n.set(String(t), e); + for (let e of t) for (let t of Po(e)) t != null && n.set(String(t), e); return n; } -function Ya(e, t) { +function No(e, t) { let n = [ e?.type, e?.comfyClass, @@ -5851,7 +6126,7 @@ function Ya(e, t) { e?.subgraph_graph ].find((e) => e && typeof e == "object" && Array.isArray(e.nodes)) || null; } -function Xa(e) { +function Po(e) { return [ e?.id, e?.name, @@ -5863,9 +6138,9 @@ function Xa(e) { e?.properties?.subgraphId ].filter((e) => e != null && String(e).trim()); } -function Za(e, t) { - let n = String(e?.id ?? e?.ID ?? ""), r = $a(e?.pos) || [0, 0], i = eo(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = Qa(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 = $a(r?.pos) || [o.minX, o.minY], a = eo(r?.size) || [140, 60]; +function Fo(e, t) { + let n = String(e?.id ?? e?.ID ?? ""), r = Lo(e?.pos) || [0, 0], i = Ro(e?.size) || [260, 180], a = t.nodes.filter(Boolean), o = Io(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 = Lo(r?.pos) || [o.minX, o.minY], a = Ro(r?.size) || [140, 60]; return { ...r, id: `${n}::${r?.id ?? r?.ID ?? ""}`, @@ -5905,12 +6180,12 @@ function Za(e, t) { } }; } -function Qa(e) { +function Io(e) { let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity; for (let a of e) { - let e = $a(a?.pos); + let e = Lo(a?.pos); if (!e) continue; - let o = eo(a?.size) || [140, 60]; + let o = Ro(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) ? { @@ -5925,7 +6200,7 @@ function Qa(e) { height: 1 }; } -function $a(e) { +function Lo(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; @@ -5933,7 +6208,7 @@ function $a(e) { } return null; } -function eo(e) { +function Ro(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; @@ -5941,12 +6216,12 @@ function eo(e) { } return null; } -function to(e) { +function zo(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 no(e, t = null) { +function Bo(e, t = null) { if (!e || typeof e != "object") return null; let n = { maxNodes: 220, @@ -6017,7 +6292,7 @@ function no(e, t = null) { } //#endregion //#region ui/vue/components/panel/sidebar/SidebarWorkflowSection.vue -var ro = { +var Vo = { key: 0, class: "mjr-sidebar-section", style: { @@ -6027,12 +6302,19 @@ var ro = { padding: "12px", "min-width": "300px" } -}, io = { style: { +}, Ho = { style: { + "font-size": "13px", + "font-weight": "600", + color: "var(--fg-color, #eaeaea)", + "margin-bottom": "12px", + "text-transform": "uppercase", + "letter-spacing": "0.5px" +} }, Uo = { style: { display: "flex", "flex-wrap": "wrap", gap: "8px", "margin-bottom": "10px" -} }, ao = { style: { +} }, Wo = { style: { padding: "4px 9px", "border-radius": "999px", background: "rgba(33,150,243,0.14)", @@ -6042,7 +6324,7 @@ var ro = { color: "#90CAF9", "text-transform": "uppercase", "letter-spacing": "0.4px" -} }, oo = { +} }, Go = { key: 0, style: { padding: "4px 9px", @@ -6053,62 +6335,80 @@ var ro = { "font-weight": "600", color: "rgba(255,255,255,0.82)" } -}, so = { style: { +}, Ko = { style: { display: "grid", "grid-template-columns": "repeat(3, minmax(0, 1fr))", gap: "8px", "margin-bottom": "12px" -} }, co = { style: { +} }, qo = { style: { padding: "8px 10px", "border-radius": "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" -} }, lo = { style: { +} }, Jo = { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, Yo = { style: { "font-size": "18px", "font-weight": "700", color: "rgba(255,255,255,0.94)", "margin-top": "2px" -} }, uo = { style: { +} }, Xo = { style: { padding: "8px 10px", "border-radius": "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" -} }, fo = { style: { +} }, Zo = { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, Qo = { style: { "font-size": "18px", "font-weight": "700", color: "rgba(255,255,255,0.94)", "margin-top": "2px" -} }, po = { style: { +} }, $o = { style: { padding: "8px 10px", "border-radius": "10px", background: "rgba(255,255,255,0.04)", border: "1px solid rgba(255,255,255,0.10)" -} }, mo = { style: { +} }, es = { style: { + "font-size": "10px", + "font-weight": "700", + color: "rgba(255,255,255,0.55)", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, ts = { style: { "font-size": "18px", "font-weight": "700", color: "rgba(255,255,255,0.94)", "margin-top": "2px" -} }, ho = { +} }, ns = { key: 0, class: "mjr-workflow-tree-wrap" -}, go = { class: "mjr-workflow-tree-node" }, _o = { class: "mjr-workflow-tree-node-name" }, vo = { +}, rs = { class: "mjr-section-title" }, is = { class: "mjr-workflow-tree-node" }, as = { class: "mjr-workflow-tree-node-name" }, os = { key: 0, class: "mjr-workflow-tree-node-type" -}, yo = { class: "mjr-menu-item-hint" }, bo = { +}, ss = { class: "mjr-menu-item-hint" }, cs = { key: 0, class: "mjr-section-hint" -}, xo = { style: { +}, ls = { style: { display: "flex", "align-items": "center", "justify-content": "space-between", gap: "10px", "margin-top": "8px" -} }, So = { style: { +} }, us = { style: { display: "flex", "flex-wrap": "wrap", gap: "6px", "align-items": "center" -} }, Co = { +} }, ds = { key: 1, style: { display: "grid", @@ -6118,23 +6418,23 @@ var ro = { "margin-top": "10px", "margin-bottom": "10px" } -}, wo = { style: { +}, fs = { style: { display: "flex", "flex-direction": "column", gap: "2px", "min-width": "0" -} }, To = { style: { +} }, ps = { style: { "font-size": "13px", "font-weight": "600" -} }, Eo = { style: { +} }, ms = { style: { "font-size": "11px", color: "rgba(255,255,255,0.58)" -} }, Do = { style: { +} }, hs = { style: { display: "flex", gap: "10px", "align-items": "stretch", "margin-top": "10px" -} }, Oo = { style: { +} }, gs = { style: { display: "flex", "justify-content": "space-between", "align-items": "center", @@ -6142,7 +6442,12 @@ var ro = { "margin-top": "8px", "font-size": "11px", color: "rgba(255,255,255,0.58)" -} }, ko = ["open"], Ao = { style: { +} }, _s = ["open"], vs = { style: { + cursor: "pointer", + color: "var(--mjr-muted, rgba(255,255,255,0.65))", + "font-size": "12px", + "user-select": "none" +} }, ys = { style: { background: "rgba(0,0,0,0.5)", padding: "10px", "border-radius": "6px", @@ -6152,14 +6457,14 @@ var ro = { margin: "10px 0 0 0", color: "#90CAF9", "font-family": "'Consolas', 'Monaco', monospace" -} }, jo = 1, Mo = 8, No = 250, Po = { +} }, bs = 1, xs = 8, Ss = 250, Cs = { __name: "SidebarWorkflowSection", props: { asset: { type: Object, required: !0 } }, - setup(t) { - let r = t, i = Object.freeze({ + setup(e) { + let t = e, n = Object.freeze({ nodeColors: !0, showLinks: !0, showGroups: !0, @@ -6168,44 +6473,47 @@ var ro = { showViewport: !0, showNodeLabels: !1, size: "comfortable" - }), a = Object.freeze({ + }), r = Object.freeze({ zoom: 1, centerX: null, centerY: null, hoveredNodeId: null - }), o = Object.freeze([ + }), i = Object.freeze([ { key: "compact", - label: "Compact", + labelKey: "workflowSidebar.sizeCompact", + fallback: "Compact", height: 120 }, { key: "comfortable", - label: "Comfort", + labelKey: "workflowSidebar.sizeComfort", + fallback: "Comfort", height: 160 }, { key: "expanded", - label: "Expanded", + labelKey: "workflowSidebar.sizeExpanded", + fallback: "Expanded", height: 220 } - ]), s = I(null), c = I(!1), l = I(!1), u = I(w()), d = I({ ...a }), f = I("crosshair"), p = I(""), m = null, h = null, g = null; - function _(e, t, n) { + ]), a = I(null), o = I(!1), s = I(!1), c = I(C()), l = I({ ...r }), u = I("crosshair"), d = I(""), f = null, p = null, m = null; + function g(e, t, n) { let r = Number(e); return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; } - function v(e) { - !e || typeof e != "object" || (d.value = { - ...d.value, - zoom: _(e.zoom ?? d.value.zoom, jo, Mo), + function _(e) { + !e || typeof e != "object" || (l.value = { + ...l.value, + zoom: g(e.zoom ?? l.value.zoom, bs, xs), centerX: Number.isFinite(Number(e.centerX)) ? Number(e.centerX) : null, centerY: Number.isFinite(Number(e.centerY)) ? Number(e.centerY) : null }); } - function y() { - d.value = { ...a }, p.value = ""; + function v() { + l.value = { ...r }, d.value = ""; } - function b(e) { + function y(e) { let t = e?.metadata_raw ?? null; if (!t) return null; if (typeof t == "object") return t; @@ -6221,7 +6529,7 @@ var ro = { } return null; } - function x(e) { + function b(e) { try { let t = Object.entries(e || {}); if (!t.length) return !1; @@ -6232,8 +6540,8 @@ var ro = { } return !1; } - function S(e) { - let t = b(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null; + function x(e) { + let t = y(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null; if (!n) return null; if (typeof n == "object") return n; if (typeof n == "string") { @@ -6247,70 +6555,70 @@ var ro = { } return null; } - function C(e) { - let t = b(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null; + function S(e) { + let t = y(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null; if (!n) return null; - if (typeof n == "object") return x(n) ? n : null; + if (typeof n == "object") return b(n) ? n : null; if (typeof n == "string") { let e = n.trim(); if (!e) return null; try { let t = JSON.parse(e); - return x(t) ? t : null; + return b(t) ? t : null; } catch { return null; } } return null; } - function w() { + function C() { try { - let e = K?.()?.workflowMinimap; + let e = q?.()?.workflowMinimap; if (e && typeof e == "object") return { - ...i, + ...n, ...e }; } catch (e) { console.debug?.(e); } try { - let t = localStorage?.getItem?.(e); - if (!t) return { ...i }; - let n = JSON.parse(t); - if (!n || typeof n != "object") return { ...i }; + let e = localStorage?.getItem?.(h); + if (!e) return { ...n }; + let t = JSON.parse(e); + if (!t || typeof t != "object") return { ...n }; let r = { - ...i, - ...n + ...n, + ...t }; try { - let t = K(); - t.workflowMinimap = { - ...t.workflowMinimap, + let e = q(); + e.workflowMinimap = { + ...e.workflowMinimap, ...r - }, q(t), localStorage?.removeItem?.(e); + }, J(e), localStorage?.removeItem?.(h); } catch (e) { console.debug?.(e); } return r; } catch { - return { ...i }; + return { ...n }; } } - function T(e) { + function w(e) { try { - let t = K(); + let t = q(); t.workflowMinimap = { ...t.workflowMinimap, ...e - }, q(t); + }, J(t); } catch (e) { console.debug?.(e); } } - let E = B(() => { - let e = S(r.asset), t = C(r.asset); - return !e && !t ? null : e || no(t); - }), ee = B(() => r.asset?.has_generation_data ? "Complete" : "Partial"), D = B(() => E.value ? JSON.stringify(E.value, null, 2) : ""); + let T = V(() => { + let e = x(t.asset), n = S(t.asset); + return !e && !n ? null : e || Bo(n); + }), E = V(() => t.asset?.has_generation_data ? "Complete" : "Partial"), ee = V(() => T.value ? JSON.stringify(T.value, null, 2) : ""); function te(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}`); @@ -6318,7 +6626,7 @@ var ro = { function ne(e) { return String(e?.type || e?.class_type || e?.name || "").trim(); } - let re = B(() => (Array.isArray(E.value?.nodes) ? E.value.nodes : []).slice(0, No).map((e, t) => { + let re = V(() => (Array.isArray(T.value?.nodes) ? T.value.nodes : []).slice(0, Ss).map((e, t) => { let n = e?.id ?? e?.key ?? t + 1, r = ne(e); return { key: String(n), @@ -6329,75 +6637,75 @@ var ro = { type: r } }; - })), ie = B(() => Math.max(0, Number(ae.value.nodes || 0) - re.value.length)), ae = B(() => { - let e = E.value; + })), ie = V(() => Math.max(0, Number(ae.value.nodes || 0) - re.value.length)), ae = V(() => { + let e = T.value; return e ? { nodes: Array.isArray(e?.nodes) ? e.nodes.length : 0, links: Array.isArray(e?.links) && e.links.length || Array.isArray(e?.extra?.links) && e.extra.links.length || 0, groups: Array.isArray(e?.groups) && e.groups.length || Array.isArray(e?.extra?.groups) && e.extra.groups.length || Array.isArray(e?.extra?.groupNodes) && e.extra.groupNodes.length || Array.isArray(e?.extra?.group_nodes) && e.extra.group_nodes.length || 0, - source: e?.extra?.synthetic ? "Synthetic" : "Embedded" + source: e?.extra?.synthetic ? k("workflowSidebar.sourceSynthetic", "Synthetic") : k("workflowSidebar.sourceEmbedded", "Embedded") } : { nodes: 0, links: 0, groups: 0, source: "" }; - }), oe = B(() => { - let e = String(u.value?.size || "comfortable"); - return o.find((t) => t.key === e) || o[1]; - }), se = B(() => `${oe.value.height}px`), ce = B(() => [ + }), oe = V(() => { + let e = String(c.value?.size || "comfortable"); + return i.find((t) => t.key === e) || i[1]; + }), se = V(() => `${oe.value.height}px`), ce = V(() => [ { key: "showNodeLabels", - label: "Node Labels", + label: k("workflowSidebar.nodeLabels", "Node Labels"), iconClass: "pi pi-tag" }, { key: "nodeColors", - label: "Node Colors", + label: k("workflowSidebar.nodeColors", "Node Colors"), iconClass: "pi pi-palette" }, { key: "showLinks", - label: "Show Links", + label: k("workflowSidebar.showLinks", "Show Links"), iconClass: "pi pi-share-alt" }, { key: "showGroups", - label: "Show Frames/Groups", + label: k("workflowSidebar.showFramesGroups", "Show Frames/Groups"), iconClass: "pi pi-th-large" }, { key: "renderBypassState", - label: "Render Bypass State", + label: k("workflowSidebar.renderBypassState", "Render Bypass State"), iconClass: "pi pi-ban" }, { key: "renderErrorState", - label: "Render Error State", + label: k("workflowSidebar.renderErrorState", "Render Error State"), iconClass: "pi pi-exclamation-triangle" }, { key: "showViewport", - label: "Show Viewport", + label: k("workflowSidebar.showViewport", "Show Viewport"), iconClass: "pi pi-window-maximize" } ]); - function O() { - let e = s.value, t = E.value; + function D() { + let e = a.value, t = T.value; if (!e || !t) return; 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), h = Ka(e, t, { - ...u.value, - view: d.value - }) || null, v(h?.resolvedView); + let o = e.getContext("2d"); + o && o.setTransform(i, 0, 0, i, 0, 0), p = Ao(e, t, { + ...c.value, + view: l.value + }) || null, _(p?.resolvedView); } - function k(e) { - pe(e); + function O(e) { + ge(e); } function le(e) { - let t = s.value; + let t = a.value; if (!t) return null; let n = t.getBoundingClientRect?.(); return n ? { @@ -6407,132 +6715,107 @@ var ro = { } function ue(e) { let t = le(e); - return !t || !h?.canvasToWorld ? null : { + return !t || !p?.canvasToWorld ? null : { local: t, - world: h.canvasToWorld(t.x, t.y) + world: p.canvasToWorld(t.x, t.y) }; } function de(e) { - let t = le(e), n = t && h?.hitTestNode ? h.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = d.value.hoveredNodeId !== null && d.value.hoveredNodeId !== void 0 ? String(d.value.hoveredNodeId) : null; - p.value = n?.label || "", r !== i && (d.value = { - ...d.value, + let t = le(e), n = t && p?.hitTestNode ? p.hitTestNode(t.x, t.y) : null, r = n?.id !== null && n?.id !== void 0 ? String(n.id) : null, i = l.value.hoveredNodeId !== null && l.value.hoveredNodeId !== void 0 ? String(l.value.hoveredNodeId) : null; + d.value = n?.label || "", r !== i && (l.value = { + ...l.value, hoveredNodeId: r - }, O()); + }, D()); } function fe(e) { - e && (k(e), d.value = { - ...d.value, + e && (O(e), l.value = { + ...l.value, centerX: Number(e.x), centerY: Number(e.y) - }, O()); + }, D()); } - function me(e) { + function pe(e) { if (Number(e?.button ?? 0) !== 0) return; let t = ue(e); - t && (g = e.pointerId ?? 1, f.value = "grabbing", s.value?.setPointerCapture?.(g), fe(t.world), de(e), e.preventDefault?.(), e.stopPropagation?.()); + t && (m = e.pointerId ?? 1, u.value = "grabbing", a.value?.setPointerCapture?.(m), fe(t.world), de(e), e.preventDefault?.(), e.stopPropagation?.()); } - function he(e) { - if (g !== null && e.pointerId === g) { + function me(e) { + if (m !== null && e.pointerId === m) { let t = ue(e); t && fe(t.world), e.preventDefault?.(), e.stopPropagation?.(); return; } de(e); } - function ge(e) { - g !== null && e?.pointerId === g && (s.value?.releasePointerCapture?.(g), g = null, f.value = "crosshair"), e?.type === "pointerleave" && (p.value = "", d.value.hoveredNodeId !== null && (d.value = { - ...d.value, + function he(e) { + m !== null && e?.pointerId === m && (a.value?.releasePointerCapture?.(m), m = null, u.value = "crosshair"), e?.type === "pointerleave" && (d.value = "", l.value.hoveredNodeId !== null && (l.value = { + ...l.value, hoveredNodeId: null - }, O())); + }, D())); } - function _e(e) { - let t = ue(e), n = h?.resolvedView; + function A(e) { + let t = ue(e), n = p?.resolvedView; if (!t || !n) return; - let r = _(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = _((Number(d.value.zoom) || 1) * i, jo, Mo); - if (Math.abs(a - (Number(d.value.zoom) || 1)) < .001) { + let r = g(Number(e?.deltaY) || 0, -240, 240), i = Math.exp(-r * .0025), a = g((Number(l.value.zoom) || 1) * i, bs, xs); + if (Math.abs(a - (Number(l.value.zoom) || 1)) < .001) { e.preventDefault?.(), e.stopPropagation?.(); return; } - let o = Math.max(1, Number(h?.bounds?.width || 1) / a), s = Math.max(1, Number(h?.bounds?.height || 1) / a), c = _((Number(t.world.x) - Number(n.viewMinX || 0)) / Math.max(1, Number(n.visibleW || 1)), 0, 1), l = _((Number(t.world.y) - Number(n.viewMinY || 0)) / Math.max(1, Number(n.visibleH || 1)), 0, 1); - d.value = { - ...d.value, + let o = Math.max(1, Number(p?.bounds?.width || 1) / a), s = Math.max(1, Number(p?.bounds?.height || 1) / a), c = g((Number(t.world.x) - Number(n.viewMinX || 0)) / Math.max(1, Number(n.visibleW || 1)), 0, 1), u = g((Number(t.world.y) - Number(n.viewMinY || 0)) / Math.max(1, Number(n.visibleH || 1)), 0, 1); + l.value = { + ...l.value, zoom: a, centerX: Number(t.world.x) + (.5 - c) * o, - centerY: Number(t.world.y) + (.5 - l) * s - }, O(), de(e), e.preventDefault?.(), e.stopPropagation?.(); + centerY: Number(t.world.y) + (.5 - u) * s + }, D(), de(e), e.preventDefault?.(), e.stopPropagation?.(); + } + function _e(e) { + let t = ue(e); + v(), t && O(t.world), D(), e.preventDefault?.(), e.stopPropagation?.(); } function ve(e) { - let t = ue(e); - y(), t && k(t.world), O(), e.preventDefault?.(), e.stopPropagation?.(); + c.value = { + ...c.value, + [e]: !c.value?.[e] + }, w(c.value); } function ye(e) { - u.value = { - ...u.value, - [e]: !u.value?.[e] - }, T(u.value); - } - function be(e) { - o.some((t) => t.key === e) && (u.value = { - ...u.value, + i.some((t) => t.key === e) && (c.value = { + ...c.value, size: e - }, T(u.value)); + }, w(c.value)); } - return ke(() => { - s.value && typeof ResizeObserver == "function" && (m = new ResizeObserver(() => O()), m.observe(s.value)), O(); - }), Ce(E, () => { - y(), O(); - }, { flush: "post" }), Ce(u, () => { - O(); + return Ae(() => { + a.value && typeof ResizeObserver == "function" && (f = new ResizeObserver(() => D()), f.observe(a.value)), D(); + }), we(T, () => { + v(), D(); + }, { flush: "post" }), we(c, () => { + D(); }, { deep: !0, flush: "post" - }), Ce(c, () => { - O(); - }, { flush: "post" }), Oe(() => { + }), we(o, () => { + D(); + }, { flush: "post" }), ke(() => { try { - m?.disconnect?.(); + f?.disconnect?.(); } catch (e) { console.debug?.(e); } - m = null, g = null; + f = null, m = null; }), (e, t) => { - let r = Ze("MTree"), i = Ze("MButton"); - return E.value ? (M(), F("div", ro, [ - t[8] ||= P("div", { style: { - "font-size": "13px", - "font-weight": "600", - color: "var(--fg-color, #eaeaea)", - "margin-bottom": "12px", - "text-transform": "uppercase", - "letter-spacing": "0.5px" - } }, " ComfyUI Workflow ", -1), - P("div", io, [P("div", ao, R(ee.value), 1), ae.value.source ? (M(), F("div", oo, R(ae.value.source), 1)) : z("", !0)]), - P("div", so, [ - P("div", co, [t[2] ||= P("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Nodes", -1), P("div", lo, R(ae.value.nodes), 1)]), - P("div", uo, [t[3] ||= P("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Links", -1), P("div", fo, R(ae.value.links), 1)]), - P("div", po, [t[4] ||= P("div", { style: { - "font-size": "10px", - "font-weight": "700", - color: "rgba(255,255,255,0.55)", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, "Groups", -1), P("div", mo, R(ae.value.groups), 1)]) + let n = Qe("MTree"), r = Qe("MButton"); + return T.value ? (M(), F("div", Vo, [ + P("div", Ho, R(z(k)("workflowSidebar.comfyWorkflow", "ComfyUI Workflow")), 1), + P("div", Uo, [P("div", Wo, R(E.value), 1), ae.value.source ? (M(), F("div", Go, R(ae.value.source), 1)) : B("", !0)]), + P("div", Ko, [ + P("div", qo, [P("div", Jo, R(z(k)("workflowSidebar.nodes", "Nodes")), 1), P("div", Yo, R(ae.value.nodes), 1)]), + P("div", Xo, [P("div", Zo, R(z(k)("workflowSidebar.links", "Links")), 1), P("div", Qo, R(ae.value.links), 1)]), + P("div", $o, [P("div", es, R(z(k)("workflowSidebar.groups", "Groups")), 1), P("div", ts, R(ae.value.groups), 1)]) ]), - re.value.length ? (M(), F("div", ho, [ - t[5] ||= P("div", { class: "mjr-section-title" }, " Workflow Nodes ", -1), - Te(r, { + re.value.length ? (M(), F("div", ns, [ + P("div", rs, R(z(k)("workflowSidebar.workflowNodes", "Workflow Nodes")), 1), + Ee(n, { value: re.value, class: "mjr-workflow-tree", "scroll-height": "180px", @@ -6545,48 +6828,48 @@ var ro = { nodeLabel: { class: "mjr-workflow-tree-label" } } }, { - default: De(({ node: e }) => [P("span", go, [ - P("span", _o, R(e.label), 1), - e.data?.type ? (M(), F("span", vo, R(e.data.type), 1)) : z("", !0), - P("span", yo, "#" + R(e.data?.id), 1) + default: Oe(({ node: e }) => [P("span", is, [ + P("span", as, R(e.label), 1), + e.data?.type ? (M(), F("span", os, R(e.data.type), 1)) : B("", !0), + P("span", ss, "#" + R(e.data?.id), 1) ])]), _: 1 }, 8, ["value"]), - ie.value ? (M(), F("div", bo, " +" + R(ie.value) + " more nodes ", 1)) : z("", !0) - ])) : z("", !0), - P("div", xo, [P("div", So, [(M(!0), F(V, null, N(Ke(o), (e) => (M(), we(i, { + ie.value ? (M(), F("div", cs, R(z(k)("workflowSidebar.moreNodes", "+{count} more nodes", { count: ie.value })), 1)) : B("", !0) + ])) : B("", !0), + P("div", ls, [P("div", us, [(M(!0), F(H, null, N(z(i), (e) => (M(), Te(r, { key: e.key, type: "button", severity: "secondary", text: "", rounded: "", - title: `${e.label} minimap`, + title: z(k)("workflowSidebar.minimapSizeTitle", "{label} minimap", { label: z(k)(e.labelKey, e.fallback) }), style: L({ appearance: "none", - border: u.value.size === e.key ? "1px solid rgba(33,150,243,0.55)" : "1px solid rgba(255,255,255,0.12)", + border: c.value.size === e.key ? "1px solid rgba(33,150,243,0.55)" : "1px solid rgba(255,255,255,0.12)", borderRadius: "999px", padding: "4px 10px", - background: u.value.size === e.key ? "rgba(33,150,243,0.18)" : "rgba(255,255,255,0.04)", - color: u.value.size === e.key ? "#90CAF9" : "rgba(255,255,255,0.78)", + background: c.value.size === e.key ? "rgba(33,150,243,0.18)" : "rgba(255,255,255,0.04)", + color: c.value.size === e.key ? "#90CAF9" : "rgba(255,255,255,0.78)", fontSize: "11px", - fontWeight: u.value.size === e.key ? "700" : "600", + fontWeight: c.value.size === e.key ? "700" : "600", cursor: "pointer" }), - onClick: (t) => be(e.key) + onClick: (t) => ye(e.key) }, { - default: De(() => [Ee(R(e.label), 1)]), + default: Oe(() => [De(R(z(k)(e.labelKey, e.fallback)), 1)]), _: 2 }, 1032, [ "title", "style", "onClick" - ]))), 128))]), Te(i, { + ]))), 128))]), Ee(r, { type: "button", class: "mjr-btn mjr-icon-btn", severity: "secondary", text: "", rounded: "", - title: Ke(n)("tooltip.minimapSettings", "Minimap settings"), + title: z(k)("tooltip.minimapSettings", "Minimap settings"), style: { width: "28px", height: "28px", @@ -6599,12 +6882,12 @@ var ro = { color: "rgba(255,255,255,0.9)", cursor: "pointer" }, - onClick: t[0] ||= (e) => c.value = !c.value + onClick: t[0] ||= (e) => o.value = !o.value }, { - default: De(() => [...t[6] ||= [P("i", { class: "pi pi-sliders-h" }, null, -1)]]), + default: Oe(() => [...t[2] ||= [P("i", { class: "pi pi-sliders-h" }, null, -1)]]), _: 1 }, 8, ["title"])]), - c.value ? (M(), F("div", Co, [(M(!0), F(V, null, N(ce.value, (e) => (M(), we(i, { + o.value ? (M(), F("div", ds, [(M(!0), F(H, null, N(ce.value, (e) => (M(), Te(r, { key: e.key, type: "button", severity: "secondary", @@ -6615,15 +6898,15 @@ var ro = { gap: "10px", padding: "9px 10px", borderRadius: "10px", - border: u.value?.[e.key] ? "1px solid rgba(76,175,80,0.40)" : "1px solid rgba(255,255,255,0.12)", - background: u.value?.[e.key] ? "rgba(76,175,80,0.10)" : "rgba(255,255,255,0.04)", + border: c.value?.[e.key] ? "1px solid rgba(76,175,80,0.40)" : "1px solid rgba(255,255,255,0.12)", + background: c.value?.[e.key] ? "rgba(76,175,80,0.10)" : "rgba(255,255,255,0.04)", cursor: "pointer", color: "rgba(255,255,255,0.92)", textAlign: "left" }), - onClick: (t) => ye(e.key) + onClick: (t) => ve(e.key) }, { - default: De(() => [ + default: Oe(() => [ P("span", { style: L({ width: "22px", height: "22px", @@ -6631,35 +6914,35 @@ var ro = { display: "inline-flex", alignItems: "center", justifyContent: "center", - background: u.value?.[e.key] ? "rgba(76,175,80,0.95)" : "rgba(255,255,255,0.08)", - border: u.value?.[e.key] ? "1px solid rgba(76,175,80,0.35)" : "1px solid rgba(255,255,255,0.12)", + background: c.value?.[e.key] ? "rgba(76,175,80,0.95)" : "rgba(255,255,255,0.08)", + border: c.value?.[e.key] ? "1px solid rgba(76,175,80,0.35)" : "1px solid rgba(255,255,255,0.12)", flex: "0 0 auto" }) }, [P("i", { class: "pi pi-check", style: L({ fontSize: "12px", - opacity: u.value?.[e.key] ? "1" : "0" + opacity: c.value?.[e.key] ? "1" : "0" }) }, null, 4)], 4), P("i", { - class: ze(e.iconClass), + class: Ve(e.iconClass), style: { "font-size": "18px", opacity: "0.9", width: "18px" } }, null, 2), - P("div", wo, [P("div", To, R(e.label), 1), P("div", Eo, R(u.value?.[e.key] ? "On" : "Off"), 1)]) + P("div", fs, [P("div", ps, R(e.label), 1), P("div", ms, R(c.value?.[e.key] ? z(k)("state.on", "on") : z(k)("state.off", "off")), 1)]) ]), _: 2 - }, 1032, ["style", "onClick"]))), 128))])) : z("", !0), - P("div", Do, [P("canvas", { + }, 1032, ["style", "onClick"]))), 128))])) : B("", !0), + P("div", hs, [P("canvas", { ref_key: "canvasRef", - ref: s, + ref: a, style: L({ width: "100%", height: se.value, - cursor: f.value, + cursor: u.value, touchAction: "none", borderRadius: "10px", marginTop: "0", @@ -6667,28 +6950,23 @@ var ro = { border: "1px solid var(--mjr-border, rgba(255,255,255,0.12))", boxShadow: "inset 0 0 0 1px rgba(255,255,255,0.03)" }), - onPointerdown: me, - onPointermove: he, - onPointerup: ge, - onPointercancel: ge, - onPointerleave: ge, - onWheel: _e, - onDblclick: ve + onPointerdown: pe, + onPointermove: me, + onPointerup: he, + onPointercancel: he, + onPointerleave: he, + onWheel: A, + onDblclick: _e }, null, 36)]), - P("div", Oo, [P("span", null, R(p.value || "Click/drag to navigate · wheel to zoom"), 1), P("span", null, R(Math.round((d.value.zoom || 1) * 100)) + "% · " + R(oe.value.label), 1)]), + P("div", gs, [P("span", null, R(d.value || z(k)("workflowSidebar.minimapHint", "Click/drag to navigate - wheel to zoom")), 1), P("span", null, R(Math.round((l.value.zoom || 1) * 100)) + "% - " + R(z(k)(oe.value.labelKey, oe.value.fallback)), 1)]), P("details", { - open: l.value, + open: s.value, style: { "margin-top": "10px" }, - onToggle: t[1] ||= (e) => l.value = e.target.open - }, [t[7] ||= P("summary", { style: { - cursor: "pointer", - color: "var(--mjr-muted, rgba(255,255,255,0.65))", - "font-size": "12px", - "user-select": "none" - } }, " Show raw JSON ", -1), P("pre", Ao, R(D.value), 1)], 40, ko) - ])) : z("", !0); + onToggle: t[1] ||= (e) => s.value = e.target.open + }, [P("summary", vs, R(z(k)("workflowSidebar.showRawJson", "Show raw JSON")), 1), P("pre", ys, R(ee.value), 1)], 40, _s) + ])) : B("", !0); }; } }; //#endregion -export { zr as A, Xn as B, Pr as C, Nr as D, Br as E, pr as F, q as G, Zt as H, Cr as I, st as J, vt as K, xr as L, wr as M, sr as N, Rr as O, mr as P, or as R, Wr as S, Fr as T, J as U, Yn as V, K as W, Kr as _, Na as a, Vr as b, Fi as c, li as d, ci as f, Xr as g, ai as h, Fa as i, Dr as j, Lr as k, mi as l, ii as m, Ka as n, Ia as o, $r as p, yt as q, no as r, Oa as s, Po as t, si as u, qr as v, Er as w, Gr as x, Jr as y, ar as z }; +export { Rr as A, or as B, Gr as C, Vr as D, Ir as E, hr as F, q as G, Xn as H, mr as I, bt as J, J as K, wr as L, Or as M, Tr as N, Pr as O, cr as P, Sr as R, Kr as S, Dr as T, Qt as U, Zn as V, Y as W, ct as Y, Zr as _, _o as a, Yr as b, Xi as c, ci as d, ui as f, oi as g, ai as h, yo as i, Br as j, zr as k, Di as l, ei as m, Ao as n, bo as o, li as p, yt as q, Bo as r, fo as s, Cs as t, bi as u, qr as v, Fr as w, Hr as x, Jr as y, sr as z }; diff --git a/dist/chunks/client-DZE_lzdb.js b/dist/chunks/client-DZE_lzdb.js new file mode 100644 index 00000000..45363ef7 --- /dev/null +++ b/dist/chunks/client-DZE_lzdb.js @@ -0,0 +1,1578 @@ +import { C as e, G as t, K as n, ct as r, l as i, ot as a, st as o } from "./config-Cxv7acF8.js"; +//#region ui/app/settingsStore.ts +var s = "mjrSettings", c = "mjrMinimapSettings", l = new Set([ + "POST", + "PUT", + "DELETE", + "PATCH" +]), u = 2e4, d = 3e5, f = 3, p = 400, m = "/mjr/am/settings/security/bootstrap-token", h = "/mjr/am/", g = /* @__PURE__ */ new Map(); +function _(e) { + return new Promise((t) => setTimeout(t, e)); +} +function v(e) { + return l.has(String(e || "").trim().toUpperCase()); +} +function y(e) { + try { + let t = String(e || "").trim(); + if (!t) return ""; + if (t.startsWith("http://") || t.startsWith("https://")) { + let e = typeof globalThis < "u" && globalThis?.location?.origin ? String(globalThis.location.origin) : "http://localhost"; + return new URL(t, e).pathname || ""; + } + return t.split("?")[0] || ""; + } catch { + return ""; + } +} +function b(e) { + return y(e).startsWith(h); +} +function x(e) { + return y(e) === m; +} +function ee(e) { + try { + if (!e) return !1; + let t = String(e.name || ""); + if (t === "AbortError") return !1; + let n = String(e.message || "").toLowerCase(); + return t === "TypeError" ? n.includes("failed to fetch") || n.includes("networkerror") || n.includes("load failed") || n.includes("fetch") || n.includes("network") : n.includes("fetch") || n.includes("network") || n.includes("failed"); + } catch { + return !1; + } +} +function S(e = {}) { + try { + let t = Number(e?.timeoutMs); + return Number.isFinite(t) ? Math.max(1e3, Math.min(d, Math.floor(t))) : u; + } catch { + return u; + } +} +function te(e = {}) { + let t = e?.signal || null; + if (typeof AbortController > "u") return { + signal: t || void 0, + timeoutMs: S(e), + cleanup: () => {} + }; + let n = S(e), r = new AbortController(), i = null, a = () => { + try { + i &&= (clearTimeout(i), null); + } catch (e) { + console.debug?.(e); + } + try { + r.abort(); + } catch (e) { + console.debug?.(e); + } + }; + try { + i = setTimeout(() => { + try { + r.abort(); + } catch (e) { + console.debug?.(e); + } + }, n); + } catch (e) { + console.debug?.(e); + } + try { + t && (t.aborted ? a() : t.addEventListener("abort", a, { once: !0 })); + } catch (e) { + console.debug?.(e); + } + return { + signal: r.signal, + timeoutMs: n, + cleanup: () => { + try { + i && clearTimeout(i); + } catch (e) { + console.debug?.(e); + } + try { + t && t.removeEventListener("abort", a); + } catch (e) { + console.debug?.(e); + } + } + }; +} +function ne(e, t, n = {}) { + let r = String(e || "GET").trim().toUpperCase(), i = String(t || "").trim(); + return !r || !i ? "" : `${r}:${i}:timeout=${S(n)}`; +} +function re(e, t) { + let n = String(e || "").trim(); + if (!n) return t(); + if (g.has(n)) return g.get(n); + let r = Promise.resolve().then(() => t()).finally(() => { + try { + g.delete(n); + } catch (e) { + console.debug?.(e); + } + }); + return g.set(n, r), r; +} +function ie(e, t, n) { + if (v(t)) try { + e instanceof Headers ? e.has("X-Requested-With") || e.set("X-Requested-With", "XMLHttpRequest") : e["X-Requested-With"] ||= "XMLHttpRequest"; + } catch (e) { + console.debug?.(e); + } + try { + e instanceof Headers ? e.has("X-MJR-OBS") || e.set("X-MJR-OBS", n ? "on" : "off") : "X-MJR-OBS" in e || (e["X-MJR-OBS"] = n ? "on" : "off"); + } catch (e) { + console.debug?.(e); + } +} +function ae(e, t) { + if (t) try { + e instanceof Headers ? (e.has("X-MJR-Token") || e.set("X-MJR-Token", t), e.has("Authorization") || e.set("Authorization", `Bearer ${t}`)) : ("X-MJR-Token" in e || (e["X-MJR-Token"] = t), "Authorization" in e || (e.Authorization = `Bearer ${t}`)); + } catch (e) { + console.debug?.(e); + } +} +async function oe(e, t, n, r, { ensureWriteAuthToken: i, normalizeWriteAuthFailure: a, fetchAPI: o, options: s, retryCount: c }) { + let l = e.headers.get("content-type") || ""; + if (!l.includes("application/json")) return !r && v(n) && b(t) && !x(t) && Number(e.status || 0) === 401 && await i({ + force: !0, + allowCookieRefresh: !0 + }) ? await o(t, { + ...s, + _authRetryDone: !0 + }, c) : { + ok: !1, + error: `Server returned non-JSON response (${e.status})`, + code: "INVALID_RESPONSE", + status: e.status, + content_type: l, + data: null + }; + let u = await e.json().catch((e) => (console.debug?.("[MJR API] JSON parse error:", e), null)); + if (typeof u != "object" || !u) return { + ok: !1, + error: "Invalid response structure", + code: "INVALID_RESPONSE", + status: e.status, + data: null + }; + if (!("status" in u)) try { + u.status = e.status; + } catch (e) { + console.debug?.(e); + } + return !r && v(n) && !x(t) && !u?.ok && (String(u?.code || "").toUpperCase() === "AUTH_REQUIRED" || Number(u?.status || 0) === 401) && await i({ + force: !0, + allowCookieRefresh: !0 + }) ? await o(t, { + ...s, + _authRetryDone: !0 + }, c) : (v(n) && b(t) && !x(t) && (u = a(u)), u); +} +function se({ readObsEnabled: e = () => !1, readAuthToken: t = () => "", ensureWriteAuthToken: n = async () => "", normalizeWriteAuthFailure: r = (e) => e, trackApiCall: i = null } = {}) { + async function a(o, s = {}, c = 0) { + let l = typeof performance < "u" ? performance.now() : Date.now(), u = te(s), d = null; + try { + let i = (s.method || "GET").toUpperCase(), l = !!s?._authRetryDone, f = typeof Headers < "u" ? new Headers(s.headers || {}) : { ...s.headers }; + ie(f, i, !!e()); + let p = t(); + if (!p && v(i) && b(o) && !x(o)) { + try { + await n(); + } catch (e) { + console.debug?.(e); + } + p = t(); + } + ae(f, p); + let m = { + ...s, + headers: f, + signal: u.signal + }; + try { + delete m._authRetryDone, delete m.timeoutMs; + } catch (e) { + console.debug?.(e); + } + return d = await oe(await fetch(o, m), o, i, l, { + ensureWriteAuthToken: n, + normalizeWriteAuthFailure: r, + fetchAPI: a, + options: s, + retryCount: c + }), d; + } catch (e) { + try { + if (String(e?.name || "") === "AbortError") return s?.signal && s.signal.aborted ? { + ok: !1, + error: "Aborted", + code: "ABORTED", + data: null + } : { + ok: !1, + error: `Request timed out after ${u.timeoutMs}ms`, + code: "TIMEOUT", + data: null, + timeout_ms: u.timeoutMs + }; + } catch (e) { + console.debug?.(e); + } + if (c < f && ee(e)) { + try { + await _(p * (c + 1)); + } catch (e) { + console.debug?.(e); + } + return await a(o, s, c + 1); + } + return { + ok: !1, + error: e?.message || String(e || "Network error"), + code: "NETWORK_ERROR", + data: null, + retries: c + }; + } finally { + try { + let e = (typeof performance < "u" ? performance.now() : Date.now()) - l; + typeof i == "function" ? i(e, !d?.ok) : typeof window < "u" && window.MajoorMetrics && window.MajoorMetrics.trackApiCall(e, !d?.ok); + } catch (e) { + console.debug?.(e); + } + try { + u.cleanup?.(); + } catch (e) { + console.debug?.(e); + } + } + } + async function o(e, t = {}) { + return re(t?.dedupe === !1 ? "" : String(t?.dedupeKey || "").trim() || ne("GET", e, t), () => a(e, { + ...t, + method: "GET" + })); + } + async function s(e, t, n = {}) { + return a(e, { + ...n, + method: "POST", + headers: { + "Content-Type": "application/json", + ...n.headers + }, + body: JSON.stringify(t) + }); + } + return { + fetchAPI: a, + get: o, + post: s + }; +} +//#endregion +//#region ui/utils/ttlCache.ts +function C({ ttlMs: e = 0, maxSize: t = 100, now: n = () => Date.now() } = {}) { + let r = /* @__PURE__ */ new Map(); + function i() { + try { + let e = Number(n()); + return Number.isFinite(e) ? e : Date.now(); + } catch { + return Date.now(); + } + } + function a() { + try { + let t = Number(typeof e == "function" ? e() : e); + return Number.isFinite(t) ? Math.max(0, Math.floor(t)) : 0; + } catch { + return 0; + } + } + function o() { + try { + let e = Number(t); + return Number.isFinite(e) ? Math.max(1, Math.floor(e)) : 1; + } catch { + return 1; + } + } + function s(e, t, n) { + return e ? n > 0 ? t - Number(e.at || 0) > n : !1 : !0; + } + function c(e = i(), t = a()) { + if (t > 0) for (let [n, i] of r.entries()) s(i, e, t) && r.delete(n); + } + function l() { + let e = o(); + for (; r.size > e;) { + let e = r.keys().next().value; + if (e === void 0) break; + r.delete(e); + } + } + function u(e, t) { + r.delete(e), r.set(e, t); + } + return { + get(e) { + let t = i(), n = a(); + c(t, n); + let o = r.get(e); + if (o) { + if (s(o, t, n)) { + r.delete(e); + return; + } + return o.value; + } + }, + has(e) { + return this.get(e) !== void 0; + }, + set(e, t, n = {}) { + let o = Number(n?.at), s = { + value: t, + at: Number.isFinite(o) ? o : i() + }; + return r.has(e) ? u(e, s) : r.set(e, s), c(i(), a()), l(), t; + }, + delete(e) { + return r.delete(e); + }, + clear() { + r.clear(); + }, + prune() { + return c(i(), a()), l(), r.size; + }, + keys() { + return this.prune(), Array.from(r.keys()); + }, + entries() { + return this.prune(), Array.from(r.entries()).map(([e, t]) => [e, t.value]); + }, + get size() { + return this.prune(), r.size; + } + }; +} +//#endregion +//#region ui/features/panel/messages/toastHistory.ts +var ce = "mjr_toast_history_v1", le = "mjr_toast_history_last_read_v1", ue = 60, de = "mjr:toast-history-changed", w = null; +function T(e) { + return String(e || "").trim(); +} +function fe(e) { + let t = T(e).toLowerCase(); + return t === "warn" ? "warning" : t === "danger" ? "error" : t || "info"; +} +function pe(e) { + let t = Number(e); + return Number.isFinite(t) ? t : null; +} +function me(e) { + if (!e || typeof e != "object") return null; + let t = Number(e.percent), n = Number.isFinite(t) ? Math.max(0, Math.min(100, Math.round(t))) : null, r = Number(e.current), i = Number(e.total), a = Number.isFinite(r) ? Math.max(0, Math.floor(r)) : null, o = Number.isFinite(i) ? Math.max(0, Math.floor(i)) : null, s = Number(e.indexed), c = Number(e.skipped), l = Number(e.errors), u = Number.isFinite(s) ? Math.max(0, Math.floor(s)) : null, d = Number.isFinite(c) ? Math.max(0, Math.floor(c)) : null, f = Number.isFinite(l) ? Math.max(0, Math.floor(l)) : null, p = T(e.label); + return n === null && a === null && o === null && u === null && d === null && f === null && !p ? null : { + percent: n, + current: a, + total: o, + indexed: u, + skipped: d, + errors: f, + label: p + }; +} +function he(e, t, n) { + return e && t ? `${e}: ${t}` : t || e || n || ""; +} +function E(e, t = "info", n = null) { + if (!e || typeof e != "object") return null; + let r = T(e.title || e.summary), i = T(e.detail), o = T(e.message || he(r, i, T(e.fallbackMessage))); + if (!o) return null; + let s = pe(e.durationMs ?? e.duration ?? n), c = Number(e.createdAt), l = Number.isFinite(c) && c > 0 ? c : Date.now(), u = typeof e.persistent == "boolean" ? e.persistent : !(Number.isFinite(s) && (s ?? 0) > 0); + return { + id: T(e.id) || a(`th-${l}-`, 4), + message: o, + title: r, + detail: i, + type: fe(e.type || t), + createdAt: l, + durationMs: s, + persistent: u, + source: T(e.source), + trackId: T(e.trackId), + status: T(e.status), + operation: T(e.operation), + progress: me(e.progress), + forceStore: !!e.forceStore, + actionLabel: T(e.actionLabel), + actionUrl: T(e.actionUrl) + }; +} +function D() { + if (w === null) try { + let e = localStorage.getItem(ce), t = e ? JSON.parse(e) : []; + w = Array.isArray(t) ? t.map((e) => { + if (e && typeof e == "object") return E(e); + let t = T(e); + return t ? E({ message: t }) : null; + }).filter(Boolean) : []; + } catch { + w = []; + } +} +function O() { + try { + localStorage.setItem(ce, JSON.stringify(w)); + } catch {} +} +function k() { + try { + window.dispatchEvent(new CustomEvent(de)); + } catch {} +} +function ge() { + try { + return Number(localStorage.getItem(le)) || 0; + } catch { + return 0; + } +} +function _e(e) { + try { + localStorage.setItem(le, String(Number(e) || 0)); + } catch {} +} +function ve(e, t, n) { + D(); + let r = E(e && typeof e == "object" ? e : { + message: T(e), + type: t, + durationMs: n + }, t, n); + if (!r || !r.forceStore && !r.trackId && r.type === "info" && Number.isFinite(r.durationMs) && r.durationMs != null && r.durationMs > 0 && r.durationMs < 2500) return; + let i = String(r.trackId || "").trim(); + if (i) { + let e = w.findIndex((e) => String(e?.trackId || "").trim() === i); + if (e >= 0) { + let t = w[e] || {}; + w.splice(e, 1), r.id = String(t.id || r.id || "").trim() || r.id; + } + } + w.unshift(r), w.length > ue && (w = w.slice(0, ue)), O(), k(); +} +function ye() { + return D(), w.map((e) => ({ ...e })); +} +function be() { + D(); + let e = ge(); + return w.filter((t) => t.createdAt > e).length; +} +function xe() { + _e(Date.now()), k(); +} +function Se() { + D(), w = [], O(), _e(Date.now()), k(); +} +//#endregion +//#region ui/app/toast.ts +function Ce(e) { + let t = String(e || "info").trim().toLowerCase(); + return t === "warn" ? "warning" : t === "danger" ? "error" : t === "success" || t === "warning" || t === "error" ? t : "info"; +} +function A(e) { + if (typeof e == "string") return e; + if (e && typeof e == "object") { + let t = String(e.summary || "").trim(), n = String(e.detail || e.message || "").trim(); + if (t && n) return `${t}: ${n}`; + if (n) return n; + if (t) return t; + } + try { + return String(e?.message || e || "").trim() || "Unknown message"; + } catch { + return "Unknown message"; + } +} +function j(e, t, n, r) { + let i = r?.history && typeof r.history == "object" ? r.history : null, a = { + persistent: !(Number.isFinite(Number(n)) && Number(n) > 0), + source: String(i?.source || r?.source || "").trim(), + trackId: String(i?.trackId || "").trim(), + status: String(i?.status || "").trim(), + operation: String(i?.operation || "").trim(), + progress: i?.progress && typeof i.progress == "object" ? { ...i.progress } : null, + forceStore: !!i?.forceStore, + actionLabel: String(i?.actionLabel || "").trim(), + actionUrl: String(i?.actionUrl || "").trim() + }; + return e && typeof e == "object" ? (a.title = String(i?.title || e.summary || "").trim(), a.detail = String(i?.detail || e.detail || e.message || "").trim(), a.message = A(e), a) : (a.title = String(i?.title || "").trim(), a.detail = String(i?.detail || "").trim(), a.message = A(e), a); +} +function we(e, t = "info", n, r) { + try { + let i = j(e, t, n, r); + i.forceStore = !0, ve(i, t, n ?? void 0); + } catch {} +} +function Te(e) { + switch (e) { + case "success": return 2e3; + case "info": return 3e3; + case "warning": return 4e3; + case "error": return 5e3; + default: return 5e3; + } +} +function Ee(e) { + if (typeof e != "string") return e; + let t = e.trim(), n = { + "Failed to update rating": i("toast.ratingUpdateFailed", "Failed to update rating"), + "Error updating rating": i("toast.ratingUpdateError", "Error updating rating"), + "Rating cleared": i("toast.ratingCleared", "Rating cleared"), + "Failed to update tags": i("toast.tagsUpdateFailed", "Failed to update tags"), + "Tags updated": i("toast.tagsUpdated", "Tags updated"), + "Failed to toggle watcher": i("toast.watcherToggleFailed", "Failed to toggle watcher"), + "No valid assets selected.": i("toast.noValidAssetsSelected", "No valid assets selected."), + "Name collision in current view": i("toast.nameCollisionInView", "Name collision in current view"), + "Failed to create collection.": i("toast.failedCreateCollectionDot", "Failed to create collection."), + "Failed to add assets to collection.": i("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), + "Failed to remove from collection.": i("toast.removeFromCollectionFailed", "Failed to remove from collection."), + "Collection created": i("toast.collectionCreated", "Collection created"), + "Added to collection": i("toast.addedToCollection", "Added to collection"), + "Removed from collection": i("toast.removedFromCollection", "Removed from collection"), + "File renamed successfully!": i("toast.fileRenamedSuccess", "File renamed successfully!"), + "Failed to rename file": i("toast.fileRenameFailed", "Failed to rename file"), + "Failed to rename file.": i("toast.fileRenameFailed", "Failed to rename file."), + "File deleted successfully!": i("toast.fileDeletedSuccess", "File deleted successfully!"), + "Failed to delete file.": i("toast.fileDeleteFailed", "Failed to delete file."), + "Failed to delete file. ": i("toast.fileDeleteFailed", "Failed to delete file."), + "File deleted": i("toast.deleted", "File deleted"), + "File renamed": i("toast.renamed", "File renamed"), + "Folder created": i("toast.folderCreated", "Folder created"), + "Folder renamed": i("toast.folderRenamed", "Folder renamed"), + "Folder moved": i("toast.folderMoved", "Folder moved"), + "Folder deleted": i("toast.folderDeleted", "Folder deleted"), + "Failed to create folder": i("toast.createFolderFailed", "Failed to create folder"), + "Failed to rename folder": i("toast.renameFolderFailed", "Failed to rename folder"), + "Failed to move folder": i("toast.moveFolderFailed", "Failed to move folder"), + "Failed to delete folder": i("toast.deleteFolderFailed", "Failed to delete folder"), + "Failed to pin folder": i("toast.pinFolderFailed", "Failed to pin folder"), + "Failed to unpin folder": i("toast.unpinFolderFailed", "Failed to unpin folder"), + "Folder pinned as browser root": i("toast.folderPinnedAsBrowserRoot", "Folder pinned as browser root"), + "Folder added": i("toast.folderAdded", "Folder added"), + "Folder removed": i("toast.folderRemoved", "Folder removed"), + "Folder linked successfully": i("toast.folderLinked", "Folder linked successfully"), + "An error occurred while adding the custom folder": i("toast.errorAddingFolder", "An error occurred while adding the custom folder"), + "An error occurred while removing the custom folder": i("toast.errorRemovingFolder", "An error occurred while removing the custom folder"), + "Failed to add custom folder": i("toast.failedAddFolder", "Failed to add custom folder"), + "Failed to remove custom folder": i("toast.failedRemoveFolder", "Failed to remove custom folder"), + "Native folder browser unavailable. Please enter path manually.": i("toast.nativeBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), + "Opened in folder": i("toast.openedInFolder", "Opened in folder"), + "Failed to open folder": i("toast.openFolderFailed", "Failed to open folder"), + "Failed to open folder.": i("toast.openFolderFailed", "Failed to open folder."), + "File path copied to clipboard": i("toast.pathCopied", "File path copied to clipboard"), + "Failed to copy path": i("toast.pathCopyFailed", "Failed to copy path"), + "Failed to copy to clipboard": i("toast.copyClipboardFailed", "Failed to copy to clipboard"), + "No file path available for this asset.": i("toast.noFilePath", "No file path available for this asset."), + "Failed to refresh metadata.": i("toast.metadataRefreshFailed", "Failed to refresh metadata."), + "Metadata refreshed": i("toast.metadataRefreshed", "Metadata refreshed"), + "Duplicate analysis started": i("toast.dupAnalysisStarted", "Duplicate analysis started"), + "Tags merged": i("toast.tagsMerged", "Tags merged"), + "Duplicates deleted": i("toast.duplicatesDeleted", "Duplicates deleted"), + "Rescanning file...": i("toast.rescanningFile", "Rescanning file..."), + "Metadata enrichment complete": i("toast.enrichmentComplete", "Metadata enrichment complete"), + "Playback speed is available for video media only": i("toast.playbackVideoOnly", "Playback speed is available for video media only"), + "DB backup saved": i("toast.dbSaveSuccess", "DB backup saved"), + "Failed to save DB backup": i("toast.dbSaveFailed", "Failed to save DB backup"), + "DB restore started": i("toast.dbRestoreStarted", "DB restore started"), + "Failed to restore DB backup": i("toast.dbRestoreFailed", "Failed to restore DB backup"), + "Select a DB backup first": i("toast.dbRestoreSelect", "Select a DB backup first"), + "Stopping running workers": i("toast.dbRestoreStopping", "Stopping running workers"), + "Unlocking and resetting database": i("toast.dbRestoreResetting", "Unlocking and resetting database"), + "Recreating database": i("toast.dbRestoreReplacing", "Recreating database"), + "Replacing database files": i("toast.dbRestoreReplacing", "Replacing database files"), + "Restarting scan": i("toast.dbRestoreRescan", "Restarting scan"), + "Deleting database and rebuilding...": i("toast.dbDeleteTriggered", "Deleting database and rebuilding..."), + "Database deleted and rebuilt. Files are being reindexed.": i("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed."), + "Failed to delete database": i("toast.dbDeleteFailed", "Failed to delete database"), + "Database backup restored": i("toast.dbRestoreSuccess", "Database backup restored"), + "Index reset started. Files will be reindexed in the background.": i("toast.resetStarted", "Index reset started. Files will be reindexed in the background."), + "Failed to reset index": i("toast.resetFailed", "Failed to reset index"), + "Reset triggered: Reindexing all files...": i("toast.resetTriggered", "Reset triggered: Reindexing all files..."), + "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild.": i("toast.resetFailedCorrupt", "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild."), + "Scan started": i("toast.scanStarted", "Scan started"), + "Scan complete": i("toast.scanComplete", "Scan complete"), + "Scan failed": i("toast.scanFailed", "Scan failed"), + "Permission denied": i("toast.permissionDenied", "Permission denied"), + "Language changed. Reload the page for full effect.": i("toast.languageChanged", "Language changed. Reload the page for full effect."), + "Tag added": i("toast.tagAdded", "Tag added"), + "Tag removed": i("toast.tagRemoved", "Tag removed"), + "Rating saved": i("toast.ratingSaved", "Rating saved"), + "Failed to create collection": i("toast.failedCreateCollection", "Failed to create collection"), + "Failed to delete collection": i("toast.failedDeleteCollection", "Failed to delete collection") + }; + if (n[t]) return n[t]; + let r; + if (r = t.match(/Rating set to (\d+) star(?:s)?/i), r) return i("toast.ratingSetN", "Rating set to {n} stars", { n: Number(r[1]) }); + if (r = t.match(/Downloading (.+?)\.\.\./i), r) return i("toast.downloadingFile", "Downloading {filename}...", { filename: r[1] }); + if (r = t.match(/Playback ([0-9]+(?:\.[0-9]+)?)x/i), r) return i("toast.playbackRate", "Playback {rate}x", { rate: Number(r[1]).toFixed(2) }); + if (r = t.match(/Metadata refreshed(?:\s*(.*))?/i), r) return i("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: r[1] ? " (" + r[1] + ")" : "" }); + if (r = t.match(/Error renaming(?: file)?:\s*(.+)/i), r) return i("toast.errorRenaming", "Error renaming file: {error}", { error: r[1] }); + if (r = t.match(/Error deleting(?: files?| file)?:\s*(.+)/i), r) return i("toast.errorDeleting", "Error deleting file: {error}", { error: r[1] }); + if (r = t.match(/Tag merge failed:\s*(.+)/i), r) return i("toast.tagMergeFailed", "Tag merge failed: {error}", { error: r[1] }); + if (r = t.match(/Delete failed:\s*(.+)/i), r) return i("toast.deleteFailed", "Delete failed: {error}", { error: r[1] }); + if (r = t.match(/Analysis not started:\s*(.+)/i), r) return i("toast.analysisNotStarted", "Analysis not started: {error}", { error: r[1] }); + if (r = t.match(/(\d+)\s+files deleted successfully!/i), r) return i("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: Number(r[1]) }); + if (r = t.match(/(\d+)\s+files deleted,\s+(\d+)\s+failed\./i), r) return i("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { + success: Number(r[1]), + failed: Number(r[2]) + }); + if (r = t.match(/(\d+)\s+files?\s+deleted/i), r) return i("toast.filesDeletedShort", "{n} files deleted", { n: Number(r[1]) }); + if (r = t.match(/(\d+)\s+deleted,\s+(\d+)\s+failed/i), r) return i("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", { + success: Number(r[1]), + failed: Number(r[2]) + }); + if (r = t.match(/^(.+?)\s+copied to clipboard!$/i), r) return i("toast.copiedToClipboardNamed", "{name} copied to clipboard!", { name: r[1] }); + if (r = t.match(/Folder created:\s*(.+)/i), r) return i("toast.folderCreated", "Folder created: {name}", { name: r[1] }); + if (r = t.match(/Failed to create folder:\s*(.+)/i), r) return i("toast.createFolderFailedDetail", "Failed to create folder: {error}", { error: r[1] }); + if (r = t.match(/Failed to rename folder:\s*(.+)/i), r) return i("toast.renameFolderFailedDetail", "Failed to rename folder: {error}", { error: r[1] }); + if (r = t.match(/Failed to move folder:\s*(.+)/i), r) return i("toast.moveFolderFailedDetail", "Failed to move folder: {error}", { error: r[1] }); + if (r = t.match(/Failed to delete folder:\s*(.+)/i), r) return i("toast.deleteFolderFailedDetail", "Failed to delete folder: {error}", { error: r[1] }); + if (r = t.match(/Error removing from collection:\s*(.+)/i), r) return i("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: r[1] }); + if (r = t.match(/^Failed to (.+)$/i), r) { + let e = r[1].toLowerCase(), t = { + "add folder": i("toast.failedAddFolder", "Failed to add custom folder"), + "remove folder": i("toast.failedRemoveFolder", "Failed to remove custom folder"), + "create collection": i("toast.failedCreateCollection", "Failed to create collection"), + "delete collection": i("toast.failedDeleteCollection", "Failed to delete collection") + }; + for (let [n, r] of Object.entries(t)) if (e.includes(n)) return r; + } + return t; +} +function M(t, n = "info", r, a) { + if (n = Ce(n), t = Ee(t), r ??= Te(n), !a?.noHistory) try { + ve(j(t, n, r, a), n, r ?? void 0); + } catch {} + let o = !(Number.isFinite(Number(r)) && Number(r) > 0); + try { + let a = e(); + if (a && typeof a.add == "function") { + let e = n; + e === "warning" && (e = "warn"); + let s = i("manager.title"), c = t; + if (typeof t == "object" && t?.summary) s = t.summary, c = t.detail || ""; + else if (typeof t != "string") try { + c = t.message || String(t); + } catch (e) { + console.debug?.(e); + } + let l = { + severity: e, + summary: s, + detail: c + }; + o || (l.life = r), a.add(l); + return; + } + } catch (e) { + console.debug("Majoor: extensionManager.toast failed", e); + } + let s = globalThis?.app || (typeof window < "u" ? window?.app : null); + if (s?.ui?.toast) try { + return s.ui.toast(t, n); + } catch (e) { + console.debug("Native app.ui.toast failed", e); + } + console.warn("[Majoor Toast] Native toast API unavailable", { + type: n, + message: A(t), + duration: o ? 0 : r + }); +} +//#endregion +//#region ui/api/clientAuth.ts +var De = 2e3, Oe = 15e3, ke = 8e3, N = "__mjr_write_token", P = "token", F = null, I = null, Ae = null, L = C({ + ttlMs: De, + maxSize: 1 +}); +function je() { + try { + return String(sessionStorage?.getItem?.(N) || "").trim(); + } catch { + return ""; + } +} +function R(e) { + let t = String(e || "").trim(); + try { + return t ? sessionStorage?.setItem?.(N, t) : sessionStorage?.removeItem?.(N), !0; + } catch { + return !1; + } +} +function z() { + try { + let e = localStorage?.getItem?.(s), t = e ? JSON.parse(e) : {}, n = t && typeof t == "object" ? t : {}, r = n?.data && typeof n.data == "object" ? n.data : n; + r?.security && typeof r.security == "object" && String(r.security.apiToken || "").trim() && (r.security.apiToken = "", localStorage?.setItem?.(s, JSON.stringify(n))); + } catch (e) { + console.debug?.(e); + } +} +function B() { + try { + L.delete(P); + } catch (e) { + console.debug?.(e); + } + R(""), z(); +} +function V() { + let e = L.get(P); + if (e !== void 0) return e; + let t = Date.now(), n = je(); + if (n) return L.set(P, n, { at: t }), n; + try { + let e = localStorage?.getItem?.(s), n = e ? JSON.parse(e) : null, r = n?.data && typeof n.data == "object" ? n.data : n, i = String(r?.security?.apiToken || "").trim(); + if (i) { + R(i); + try { + let e = n && typeof n == "object" ? n : {}, t = e?.data && typeof e.data == "object" ? e.data : e; + t?.security && typeof t.security == "object" && (t.security.apiToken = "", localStorage?.setItem?.(s, JSON.stringify(e)), window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } }))); + } catch (e) { + console.debug?.(e); + } + } + return L.set(P, i, { at: t }), i; + } catch { + return L.set(P, "", { at: t }), ""; + } +} +function H(e) { + let t = String(e || "").trim(); + if (!t) return !1; + try { + L.set(P, t), I = null, R(t), z(); + try { + window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } })); + } catch (e) { + console.debug?.(e); + } + return !0; + } catch { + return !1; + } +} +var Me = /^[A-Za-z0-9._\-~+/]+=*$/; +function Ne(e) { + let t = String(e || "").trim(); + return t ? Me.test(t) ? H(t) : (console.debug?.("[MJR auth] Rejected malformed security token (invalid characters)"), !1) : !1; +} +function U(e = {}) { + I = { + code: String(e?.code || "").trim().toUpperCase(), + error: String(e?.error || "").trim(), + status: Number(e?.status || 0) || 0, + at: Date.now() + }; +} +function W() { + let e = I; + if (!e) return null; + let t = Date.now() - (Number(e.at || 0) || 0); + return t < 0 || t > Oe ? (I = null, null) : e; +} +function Pe(e) { + let t = W(), n = String(e?.code || "").trim().toUpperCase(), r = String(e?.error || "").trim(), a = String(t?.code || "").trim().toUpperCase(), o = String(t?.error || "").trim().toLowerCase(), s = r.toLowerCase(); + return a === "FORBIDDEN" && (o.includes("already configured") || o.includes("rotate-token")) ? i("toast.writeAuthConfiguredTokenRequired", "Write access requires the Majoor API token already configured on the server. Open Settings -> Security -> API Token and enter the matching token.") : a === "AUTH_REQUIRED" && (o.includes("sign in to comfyui") || o.includes("authenticated comfyui user")) ? i("toast.writeAuthSignInRequired", "Write access is blocked. Sign in to ComfyUI first, then retry so Majoor can bootstrap the remote session token automatically.") : a === "BOOTSTRAP_DISABLED" || a === "AUTH_REQUIRED" && o.includes("bootstrap") || n === "AUTH_REQUIRED" && s.includes("api token") ? i("toast.writeAuthBootstrapHelp", "Write access is blocked. Sign in to ComfyUI and retry so Majoor can bootstrap the remote session automatically, or set a Majoor API token in Settings -> Security.") : ""; +} +function Fe(e) { + let t = String(e || "").trim(); + if (!t) return; + let n = Date.now(), r = Ae; + if (!(r && r.message === t && n - (Number(r.at || 0) || 0) < ke)) { + Ae = { + message: t, + at: n + }; + try { + M({ + summary: i("toast.writeAuthTitle", "Majoor remote write access"), + detail: t + }, "warning", 6500, { noHistory: !0 }); + } catch (e) { + console.debug?.(e); + } + } +} +function Ie(e) { + let t = String(e?.code || "").trim().toUpperCase(), n = String(e?.error || "").trim().toLowerCase(), r = t === "FORBIDDEN" && n.includes("write operation blocked"); + if (t !== "AUTH_REQUIRED" && !r) return e; + let i = Pe(e); + return i ? (Fe(i), { + ...e, + error: i + }) : e; +} +async function Le() { + try { + let e = await fetch("/mjr/am/settings/security/bootstrap-token", { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-Requested-With": "XMLHttpRequest" + }, + body: "{}" + }); + if (!(e.headers.get("content-type") || "").includes("application/json")) return U({ + code: "INVALID_RESPONSE", + error: `Bootstrap token request returned non-JSON response (${e.status})`, + status: e.status + }), { + ok: !1, + token: !1 + }; + let t = await e.json().catch((e) => (console.debug?.("[MJR auth] JSON parse error:", e), null)); + if (!t || typeof t != "object") return U({ + code: "INVALID_RESPONSE", + error: "Bootstrap token response was invalid.", + status: e.status + }), { + ok: !1, + token: !1 + }; + if (!t.ok) return U({ + code: t?.code, + error: t?.error, + status: e.status + }), { + ok: !1, + token: !1 + }; + let n = String(t?.data?.token || "").trim(); + return n ? { + ok: H(n), + token: !0 + } : (I = null, { + ok: !0, + token: !1 + }); + } catch (e) { + return U({ + code: "NETWORK_ERROR", + error: e?.message || "Bootstrap token request failed.", + status: 0 + }), { + ok: !1, + token: !1 + }; + } +} +async function Re({ force: e = !1, allowCookieRefresh: t = !1 } = {}) { + let n = V(); + if (n && !e) return n; + let r = { + ok: !1, + token: !1 + }; + F ||= (async () => { + try { + return await Le(); + } finally { + F = null; + } + })(); + try { + r = await F || r; + } catch (e) { + console.debug?.(e); + } + if (e && r?.ok && !r?.token && n) B(); + else if (e && !r?.ok) { + let e = W(), t = String(e?.code || "").trim().toUpperCase(); + (!t || !["NETWORK_ERROR", "INVALID_RESPONSE"].includes(t)) && B(); + } + let i = V(); + return !i && t && r?.ok ? !0 : i; +} +function ze() { + L.clear(); +} +//#endregion +//#region ui/api/clientOps.ts +async function Be(e) { + return !e || typeof e != "string" ? { + ok: !1, + error: "Missing mode", + code: "INVALID_INPUT" + } : Q("/mjr/am/settings/probe-backend", { mode: e }); +} +async function Ve() { + return Z(t.SETTINGS_METADATA_FALLBACK); +} +async function He({ image: e, media: n } = {}) { + return Q(t.SETTINGS_METADATA_FALLBACK, { + image: e, + media: n + }); +} +async function Ue() { + return Z(t.SETTINGS_VECTOR_SEARCH); +} +async function We(e = !0) { + if (e && typeof e == "object") { + let n = {}; + return "enabled" in e && (n.enabled = !!e.enabled), "caption_on_index" in e && (n.caption_on_index = !!e.caption_on_index), "captionOnIndex" in e && (n.caption_on_index = !!e.captionOnIndex), Q(t.SETTINGS_VECTOR_SEARCH, n); + } + return Q(t.SETTINGS_VECTOR_SEARCH, { enabled: !!e }); +} +async function Ge() { + return Z(t.SETTINGS_EXECUTION_GROUPING); +} +async function Ke(e = !0) { + return Q(t.SETTINGS_EXECUTION_GROUPING, { enabled: !!e }); +} +async function qe() { + return Z(t.SETTINGS_HUGGINGFACE); +} +async function Je(e = "") { + return Q(t.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() }); +} +async function Ye() { + return Z(t.SETTINGS_AI_LOGGING); +} +async function Xe(e = !1) { + return Q(t.SETTINGS_AI_LOGGING, { enabled: !!e }); +} +async function Ze() { + return Z(t.SETTINGS_ROUTE_LOGGING); +} +async function Qe(e = !1) { + return Q(t.SETTINGS_ROUTE_LOGGING, { enabled: !!e }); +} +async function $e() { + return Z(t.SETTINGS_STARTUP_LOGGING); +} +async function et(e = !1) { + return Q(t.SETTINGS_STARTUP_LOGGING, { enabled: !!e }); +} +async function tt() { + return Z(t.SETTINGS_LTXAV_RGB_FALLBACK); +} +async function nt(e = !1) { + return Q(t.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e }); +} +async function rt() { + return Z(t.SETTINGS_OUTPUT_DIRECTORY); +} +async function it(e, n = {}) { + let r = String(e ?? "").trim(); + return Q(t.SETTINGS_OUTPUT_DIRECTORY, { output_directory: r }, n); +} +async function at() { + return Z(t.SETTINGS_INDEX_DIRECTORY); +} +async function ot(e, n = {}) { + let r = String(e ?? "").trim(); + return Q(t.SETTINGS_INDEX_DIRECTORY, { index_directory: r }, n); +} +async function st() { + return Z("/mjr/am/settings/security"); +} +async function ct(e) { + return Q("/mjr/am/settings/security", e && typeof e == "object" ? e : {}); +} +async function lt() { + let e = await Q("/mjr/am/settings/security/bootstrap-token", {}); + if (e?.ok) try { + let t = String(e?.data?.token || "").trim(); + t && H(t); + } catch (e) { + console.debug?.(e); + } + return e; +} +async function ut(e) { + if (e && typeof e == "object") { + let t = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); + return e.id == null ? Q("/mjr/am/open-in-folder", { filepath: t }) : Q("/mjr/am/open-in-folder", { asset_id: o(e.id) }); + } + return Q("/mjr/am/open-in-folder", { asset_id: o(e) }); +} +async function dt({ op: e = "", path: n = "", name: r = "", destination: i = "", recursive: a = !0 } = {}, o = {}) { + let s = { + op: String(e || "").trim().toLowerCase(), + path: String(n || "").trim() + }; + return r != null && String(r).trim() && (s.name = String(r).trim()), i != null && String(i).trim() && (s.destination = String(i).trim()), s.op === "delete" && (s.recursive = !!a), Q(t.BROWSER_FOLDER_OP, s, o); +} +async function ft(e = {}) { + let n = (e, t) => e == null ? t : !!e, r = String(e.scope || "output").trim().toLowerCase() || "output", i = e.customRootId ?? e.custom_root_id ?? e.rootId ?? e.root_id ?? e.customRoot ?? null, a = { + scope: r, + reindex: n(e.reindex, !0), + hard_reset_db: n(e.hardResetDb ?? e.hard_reset_db ?? e.deleteDbFiles ?? e.delete_db_files ?? e.deleteDb ?? e.delete_db ?? void 0, r === "all"), + clear_scan_journal: n(e.clearScanJournal ?? e.clear_scan_journal, !0), + clear_metadata_cache: n(e.clearMetadataCache ?? e.clear_metadata_cache, !0), + clear_asset_metadata: n(e.clearAssetMetadata ?? e.clear_asset_metadata, !0), + clear_assets: n(e.clearAssets ?? e.clear_assets, !0), + preserve_vectors: n(e.preserveVectors ?? e.preserve_vectors ?? e.keepVectors ?? e.keep_vectors, !1), + rebuild_fts: n(e.rebuildFts ?? e.rebuild_fts, !0), + incremental: n(e.incremental, !1), + fast: n(e.fast, !0), + background_metadata: n(e.backgroundMetadata ?? e.background_metadata, !0), + maintenance_force: n(e.maintenanceForce ?? e.maintenance_force, !1) + }; + return i && (a.custom_root_id = String(i)), Q(t.INDEX_RESET, a); +} +async function pt({ scope: e = "output", customRootId: n = "" } = {}) { + let r = String(e || "output").trim().toLowerCase() || "output", i = String(n || "").trim(), a = { scope: r }; + return i && (a.custom_root_id = i), Q(t.WATCHER_SCOPE, a); +} +async function mt(e = {}) { + return Z(t.WATCHER_STATUS, e); +} +async function ht(e = !0) { + return Q(t.WATCHER_TOGGLE, { enabled: !!e }); +} +async function gt() { + return Z(t.WATCHER_SETTINGS); +} +async function _t(e = {}) { + return Q(t.WATCHER_SETTINGS, e); +} +async function vt(e = {}) { + return Z(t.TOOLS_STATUS, e); +} +async function yt(e = {}) { + return Z(t.STATUS, e); +} +async function bt() { + return Q("/mjr/am/db/force-delete", {}); +} +async function xt(e = {}) { + return Z(t.DB_BACKUPS, e); +} +async function St() { + return Q(t.DB_BACKUP_SAVE, {}); +} +async function Ct({ name: e = "", useLatest: n = !1 } = {}) { + let r = {}; + return e && (r.name = String(e)), n && (r.use_latest = !0), Q(t.DB_BACKUP_RESTORE, r); +} +async function wt(e = 250) { + return Q("/mjr/am/duplicates/analyze", { limit: Math.max(10, Math.min(5e3, Number(e) || 250)) }); +} +async function Tt({ scope: e = "output", customRootId: t = "", maxGroups: n = 6, maxPairs: r = 10 } = {}, i = {}) { + let a = `/mjr/am/duplicates/alerts?scope=${encodeURIComponent(String(e || "output"))}`; + return t && (a += `&custom_root_id=${encodeURIComponent(String(t))}`), a += `&max_groups=${encodeURIComponent(String(Math.max(1, Number(n) || 6)))}`, a += `&max_pairs=${encodeURIComponent(String(Math.max(1, Number(r) || 10)))}`, Z(a, i); +} +async function Et(e, t = []) { + return Q("/mjr/am/duplicates/merge-tags", { + keep_asset_id: Number(e) || 0, + merge_asset_ids: Array.isArray(t) ? t.map((e) => Number(e) || 0).filter((e) => e > 0) : [] + }); +} +async function Dt(e) { + let t, n; + if (e && typeof e == "object") { + t = o(e.id); + let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); + n = t ? { asset_id: t } : { filepath: r }; + } else t = o(e), n = { asset_id: t }; + let r = await Q("/mjr/am/asset/delete", n); + return r?.ok && t && kt([t]), r; +} +async function Ot(e) { + let t = Array.isArray(e) ? e.map((e) => o(e)).filter(Boolean) : [], n = await Q("/mjr/am/assets/delete", { ids: t }); + return n?.ok && kt(t), n; +} +function kt(e) { + try { + let t = (Array.isArray(e) ? e : [e]).map((e) => String(e || "").trim()).filter(Boolean); + if (!t.length) return; + window.dispatchEvent(new CustomEvent("mjr:assets-deleted", { detail: { ids: t } })); + } catch (e) { + console.debug?.(e); + } +} +async function At(e, t) { + let n; + if (e && typeof e == "object") { + n = o(e.id); + let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), i = n ? await Q("/mjr/am/asset/rename", { + asset_id: n, + new_name: t + }) : await Q("/mjr/am/asset/rename", { + filepath: r, + new_name: t + }); + if (i?.ok && n) try { + let e = await $(n); + e?.ok && e?.data && (i.data = { + ...i.data || {}, + asset: e.data + }); + } catch (e) { + console.debug?.(e); + } + return i; + } + n = o(e); + let r = await Q("/mjr/am/asset/rename", { + asset_id: n, + new_name: t + }); + if (r?.ok && n) try { + let e = await $(n); + e?.ok && e?.data && (r.data = { + ...r.data || {}, + asset: e.data + }); + } catch (e) { + console.debug?.(e); + } + return r; +} +async function jt() { + let e = typeof AbortController < "u" ? new AbortController() : null, t = null; + try { + return e && (t = setTimeout(() => e.abort(), 1e4)), await Z("/mjr/am/collections", e ? { signal: e.signal } : {}); + } finally { + t && clearTimeout(t); + } +} +async function Mt(e) { + return Q("/mjr/am/collections", { name: String(e || "").trim() }); +} +async function Nt(e) { + let t = String(e || "").trim(); + return Q(`/mjr/am/collections/${encodeURIComponent(t)}/delete`, {}); +} +async function Pt(e, t) { + let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; + return Q(`/mjr/am/collections/${encodeURIComponent(n)}/add`, { assets: r }); +} +async function Ft(e, t) { + let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; + return Q(`/mjr/am/collections/${encodeURIComponent(n)}/remove`, { filepaths: r }); +} +async function It(e) { + let t = String(e || "").trim(); + return Z(`/mjr/am/collections/${encodeURIComponent(t)}/assets`); +} +async function Lt(e, r = 20) { + let i = String(e || "").trim(); + if (!i) return { + ok: !1, + error: "Empty query" + }; + let a = r && typeof r == "object" ? r : { topK: Number(r) }, o = Math.max(1, Math.min(200, Number(a?.topK ?? 20) || 20)), s = String(a?.scope || "").trim(), c = String(a?.customRootId || "").trim(), l = `${t.VECTOR_SEARCH}?q=${encodeURIComponent(i)}&top_k=${o}`; + return s && (l += `&scope=${encodeURIComponent(s)}`), c && (l += `&custom_root_id=${encodeURIComponent(c)}`), l = n(l, { + subfolder: a?.subfolder ?? null, + kind: a?.kind ?? null, + hasWorkflow: a?.hasWorkflow ?? null, + minRating: a?.minRating ?? null, + minSizeMB: a?.minSizeMB ?? null, + maxSizeMB: a?.maxSizeMB ?? null, + minWidth: a?.minWidth ?? null, + minHeight: a?.minHeight ?? null, + maxWidth: a?.maxWidth ?? null, + maxHeight: a?.maxHeight ?? null, + workflowType: a?.workflowType ?? null, + workflowId: a?.workflowId ?? null, + dateRange: a?.dateRange ?? null, + dateExact: a?.dateExact ?? null + }), Z(l, { timeoutMs: 12e4 }); +} +async function Rt(e, n = 20) { + let r = String(e || "").trim(); + if (!r) return { + ok: !1, + error: "Missing asset ID" + }; + let i = n && typeof n == "object" ? n : { topK: Number(n) }, a = Math.max(1, Math.min(200, Number(i?.topK ?? 20) || 20)), o = String(i?.scope || "").trim(), s = String(i?.customRootId || "").trim(), c = `${t.VECTOR_SIMILAR}/${encodeURIComponent(r)}?top_k=${a}`; + return o && (c += `&scope=${encodeURIComponent(o)}`), s && (c += `&custom_root_id=${encodeURIComponent(s)}`), Z(c, { dedupeKey: `vec:${r}:${a}:${o}:${s}` }); +} +async function zt(e) { + let n = String(e || "").trim(); + return n ? Z(`${t.VECTOR_ALIGNMENT}/${encodeURIComponent(n)}`) : { + ok: !1, + error: "Missing asset ID" + }; +} +async function Bt(e) { + let n = String(e || "").trim(); + return n ? Q(`${t.VECTOR_INDEX}/${encodeURIComponent(n)}`, {}) : { + ok: !1, + error: "Missing asset ID" + }; +} +async function Vt() { + return Z(t.VECTOR_STATS); +} +async function Ht(e = 64, n = {}) { + let r = Math.max(1, Math.min(200, e)), i = typeof n?.onProgress == "function" ? n.onProgress : null, a = String(n?.scope || "").trim().toLowerCase(), o = String(n?.customRootId ?? n?.custom_root_id ?? "").trim(), s = `${t.VECTOR_BACKFILL}?batch_size=${r}&async=1`; + a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`); + let c = await Q(s, {}, { timeoutMs: 3e4 }); + if (!c?.ok) return c; + let l = c?.data || {}, u = String(l?.status || "").toLowerCase(), d = String(l?.backfill_id || "").trim(); + try { + i?.(l); + } catch (e) { + console.debug?.(e); + } + if (!d || ![ + "queued", + "running", + "pending" + ].includes(u)) return c; + let f = Number(n?.pollIntervalMs), p = Number(n?.pollTimeoutMs), m = Number.isFinite(f) ? Math.max(500, Math.min(1e4, Math.floor(f))) : Xt, h = Number.isFinite(p) ? Math.max(1e4, Math.min(Qt, Math.floor(p))) : Zt, g = Date.now(), v = null; + for (; Date.now() - g < h;) { + await _(m); + let e = await Z(`${t.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }); + if (!e?.ok) { + v = e; + continue; + } + let n = e?.data || {}, r = String(n?.status || "").toLowerCase(); + v = e; + try { + i?.(n); + } catch (e) { + console.debug?.(e); + } + if (r === "succeeded") return { + ok: !0, + data: n?.result || {}, + code: null, + status: 200 + }; + if (r === "failed") return { + ok: !1, + error: String(n?.error || "Vector backfill failed"), + code: String(n?.code || "DB_ERROR"), + data: n, + status: 500 + }; + } + let y = await Z(`${t.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }), b = y?.data || v?.data || {}, x = String(b?.status || "").toLowerCase(); + if (y?.ok && [ + "queued", + "running", + "pending" + ].includes(x)) { + try { + i?.(b); + } catch (e) { + console.debug?.(e); + } + return { + ok: !0, + code: "PENDING", + status: 202, + data: { + ...b, + pending: !0, + timed_out: !0, + poll_timeout_ms: h, + backfill_id: String(b?.backfill_id || d), + status: x || "running" + }, + meta: { pending: !0 } + }; + } + return y?.ok && x === "failed" ? { + ok: !1, + error: String(b?.error || "Vector backfill failed"), + code: String(b?.code || "DB_ERROR"), + data: b, + status: 500 + } : { + ok: !1, + error: `Vector backfill polling timed out after ${h}ms`, + code: "TIMEOUT", + data: b || null, + status: 408 + }; +} +async function Ut(e) { + let n = String(e || "").trim(); + return n ? Q(`${t.VECTOR_CAPTION}/${encodeURIComponent(n)}`, {}) : { + ok: !1, + error: "Missing asset ID" + }; +} +async function Wt(e, { topK: r = 50, scope: i = "output", customRootId: a = "", subfolder: o = null, kind: s = null, hasWorkflow: c = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: h = null, workflowType: g = null, workflowId: _ = null, dateRange: v = null, dateExact: y = null } = {}) { + let b = String(e || "").trim(); + if (!b) return { + ok: !1, + error: "Empty query" + }; + let x = `${t.HYBRID_SEARCH}?q=${encodeURIComponent(b)}&top_k=${Math.max(1, Math.min(200, r))}&scope=${encodeURIComponent(i)}`; + return a && (x += `&custom_root_id=${encodeURIComponent(a)}`), x = n(x, { + subfolder: o, + kind: s, + hasWorkflow: c, + minRating: l, + minSizeMB: u, + maxSizeMB: d, + minWidth: f, + minHeight: p, + maxWidth: m, + maxHeight: h, + workflowType: g, + workflowId: _, + dateRange: v, + dateExact: y + }), Z(x, { timeoutMs: 12e4 }); +} +async function Gt(e = 8) { + return Q(t.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) }); +} +//#endregion +//#region ui/api/client.ts +var Kt = 3e4, qt = "__MJR_API_CLIENT__", Jt = 2e3, Yt = 200, Xt = 1e3, Zt = 30 * 6e4, Qt = 720 * 6e4, G = "settings", $t = "available-tags", K = C({ + ttlMs: Jt, + maxSize: 1 +}), q = C({ + ttlMs: Jt, + maxSize: 1 +}), J = C({ + ttlMs: () => rn(), + maxSize: 1 +}), en = new Set([ + "1", + "true", + "yes", + "on" +]), tn = new Set([ + "0", + "false", + "no", + "off" +]); +function nn(e, t = !1) { + if (typeof e == "boolean") return e; + if (typeof e == "number") return e !== 0; + if (typeof e == "string") { + let t = e.trim().toLowerCase(); + if (en.has(t)) return !0; + if (tn.has(t)) return !1; + } + return !!t; +} +function rn() { + try { + let e = localStorage?.getItem?.("mjrSettings") || "{}", t = JSON.parse(e), n = t?.cache?.tagsTTLms ?? t?.cache?.tagsTTL ?? t?.cache?.tags_ttl_ms ?? null, r = Number(n); + return Number.isFinite(r) ? Math.max(1e3, Math.min(10 * 6e4, Math.floor(r))) : Kt; + } catch { + return Kt; + } +} +function an() { + K.clear(); +} +function on() { + q.clear(); +} +function Y() { + J.clear(); +} +function sn(e) { + return String(e ?? "").trim().toLowerCase() || ""; +} +function cn(e) { + let t = [], n = /* @__PURE__ */ new Set(); + for (let r of Array.isArray(e) ? e : []) { + let e = String(r ?? "").trim(); + if (!e) continue; + let i = sn(e); + !i || n.has(i) || (n.add(i), t.push(e)); + } + return t; +} +try { + let e = typeof window < "u" ? window : null; + e && !e[qt] && (e[qt] = { initialized: !0 }, e.addEventListener?.("storage", (e) => { + try { + e?.key === "mjrSettings" && (an(), on(), Y(), ze()); + } catch (e) { + console.debug?.(e); + } + }), e.addEventListener?.("mjr-settings-changed", () => { + an(), on(), Y(), ze(); + })); +} catch (e) { + console.debug?.(e); +} +var ln = () => { + let e = K.get(G); + if (e !== void 0) return e; + let t = Date.now(); + try { + let e = localStorage?.getItem?.(s); + if (!e) return K.set(G, !1, { at: t }), !1; + let n = !!JSON.parse(e)?.observability?.enabled; + return K.set(G, n, { at: t }), n; + } catch { + return K.set(G, !1, { at: t }), !1; + } +}, un = () => { + let e = q.get(G); + if (e !== void 0) return e; + let t = Date.now(); + try { + let e = localStorage?.getItem?.(s); + if (!e) return q.set(G, !0, { at: t }), !0; + let n = JSON.parse(e)?.ratingTagsSync?.enabled, r = n == null ? !0 : nn(n, !0); + return q.set(G, r, { at: t }), r; + } catch { + return q.set(G, !0, { at: t }), !0; + } +}, X = se({ + readObsEnabled: ln, + readAuthToken: V, + ensureWriteAuthToken: Re, + normalizeWriteAuthFailure: Ie +}), dn = X.fetchAPI; +async function Z(e, t = {}) { + return X.get(e, t); +} +async function Q(e, t, n = {}) { + return X.post(e, t, n); +} +async function fn(e, t, n = {}) { + let i = un(), a = e && typeof e == "object" ? e : null, s = o(a ? a.id : e), c = { rating: Math.max(0, Math.min(5, Number(t) || 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 = r(a)), dn("/mjr/am/asset/rating", { + ...n, + method: "POST", + headers: { + "Content-Type": "application/json", + ...i ? { "X-MJR-RTSYNC": "on" } : {} + }, + body: JSON.stringify(c) + }); +} +async function pn(e, t, n = {}) { + let i = un(), a = e && typeof e == "object" ? e : null, s = o(a ? a.id : e), c = { tags: Array.isArray(t) ? t : [] }; + s ? c.asset_id = s : a && (c.filepath = a.filepath || a.path || a?.file_info?.filepath || "", c.type = a.type || "output", c.root_id = r(a)); + let l = await dn("/mjr/am/asset/tags", { + ...n, + method: "POST", + headers: { + "Content-Type": "application/json", + ...i ? { "X-MJR-RTSYNC": "on" } : {} + }, + body: JSON.stringify(c) + }); + return l?.ok && Y(), l; +} +async function mn() { + let e = J.get($t); + if (Array.isArray(e)) return { + ok: !0, + data: e, + error: null, + code: "OK", + meta: { cached: !0 } + }; + let t = await Z("/mjr/am/tags"); + if (t?.ok && Array.isArray(t.data)) { + let e = cn(t.data); + return J.set($t, e), { + ...t, + data: e + }; + } + return t; +} +async function $(e, t = {}) { + let n = encodeURIComponent(o(e)); + return Z(`/mjr/am/asset/${n}`, { + ...t, + dedupeKey: t?.dedupeKey || `meta:${n}` + }); +} +async function hn(e, t = {}) { + let n = o(e); + if (!n) return { + ok: !1, + data: null, + error: "Missing assetId", + code: "INVALID_INPUT" + }; + let r = `/mjr/am/viewer/info?asset_id=${encodeURIComponent(n)}`; + t.refresh && (r += "&refresh=1"); + let { refresh: i, ...a } = t; + return Z(r, a); +} +async function gn(e, t = {}) { + let n = Array.isArray(e) ? e : [], r = []; + for (let e of n) { + let t = Number(e); + if (Number.isFinite(t) && (r.push(Math.trunc(t)), r.length >= Yt)) break; + } + return r.length ? Q("/mjr/am/assets/batch", { asset_ids: r }, t) : { + ok: !0, + data: [], + error: null, + code: "OK" + }; +} +async function _n({ type: e = "output", filename: t = "", subfolder: n = "", root_id: r = "", rootId: i = "", filepath: a = "" } = {}, o = {}) { + let s = String(e || "output").trim().toLowerCase() || "output", c = String(t || "").trim(), l = String(n || "").trim(), u = String(r || i || "").trim(), d = String(a || "").trim(); + if (!c) return { + ok: !1, + data: null, + error: "Missing filename", + code: "INVALID_INPUT" + }; + let f = `/mjr/am/metadata?type=${encodeURIComponent(s)}&filename=${encodeURIComponent(c)}`; + return d && (f += `&filepath=${encodeURIComponent(d)}`), l && (f += `&subfolder=${encodeURIComponent(l)}`), u && (f += `&root_id=${encodeURIComponent(u)}`), Z(f, o); +} +async function vn({ filepath: e = "", root_id: n = "", subfolder: r = "" } = {}, i = {}) { + try { + if (globalThis.__mjrFolderInfoSupported === !1) return { + ok: !1, + data: null, + error: "Folder info endpoint unavailable", + code: "UNAVAILABLE" + }; + if (globalThis.__mjrFolderInfoSupported == null) { + let e = await Z("/mjr/am/routes"); + if (e?.ok && Array.isArray(e.data)) { + let t = e.data.some((e) => String(e?.path || "").trim() === "/mjr/am/folder-info"); + if (globalThis.__mjrFolderInfoSupported = !!t, !t) return { + ok: !1, + data: null, + error: "Folder info endpoint unavailable", + code: "UNAVAILABLE" + }; + } else globalThis.__mjrFolderInfoSupported = null; + } + } catch (e) { + console.debug?.(e); + } + let a = String(e || "").trim(), o = String(n || "").trim(), s = String(r || "").trim(), c = t.FOLDER_INFO, l = []; + a ? (l.push(`filepath=${encodeURIComponent(a)}`), l.push("browser_mode=1")) : (o && l.push(`root_id=${encodeURIComponent(o)}`), s && l.push(`subfolder=${encodeURIComponent(s)}`)), l.length && (c += `?${l.join("&")}`); + let u = await Z(c, i); + try { + !u?.ok && Number(u?.status || 0) === 404 && (globalThis.__mjrFolderInfoSupported = !1); + } catch (e) { + console.debug?.(e); + } + return u; +} +//#endregion +export { Be as $, st as A, ut as B, qe as C, xe as Ct, rt as D, Ve as E, s as Et, mt as F, St as G, At as H, Wt as I, Je as J, Xe as K, jt as L, vt as M, Ue as N, Ze as O, gt as P, it as Q, xt as R, Ge as S, ye as St, tt as T, c as Tt, ft as U, Ft as V, Ct as W, nt as X, ot as Y, He as Z, Nt as _, M as _t, _n as a, wt as at, It as b, Se as bt, Q as c, Ht as ct, Pt as d, zt as dt, Qe as et, lt as f, Bt as ft, Ot as g, Ne as gt, Dt as h, Gt as ht, mn as i, pt as it, $e as j, yt as k, fn as l, Rt as lt, Mt as m, Vt as mt, $ as n, et as nt, vn as o, ht as ot, dt as p, Lt as pt, Ke as q, gn as r, We as rt, hn as s, _t as st, Z as t, ct as tt, pn as u, Ut as ut, bt as v, we as vt, at as w, C as wt, Tt as x, be as xt, Ye as y, de as yt, Et as z }; diff --git a/dist/chunks/hostAdapter-D6BwD-lN.js b/dist/chunks/config-Cxv7acF8.js similarity index 57% rename from dist/chunks/hostAdapter-D6BwD-lN.js rename to dist/chunks/config-Cxv7acF8.js index 566384d7..a0902333 100644 --- a/dist/chunks/hostAdapter-D6BwD-lN.js +++ b/dist/chunks/config-Cxv7acF8.js @@ -1,377 +1,291 @@ -import { b as e, i as t, r as n, v as r, y as i } from "./config-dvcltBqE.js"; -//#region ui/app/settingsStore.ts -var a = "mjrSettings", o = "mjrMinimapSettings", s = new Set([ - "POST", - "PUT", - "DELETE", - "PATCH" -]), c = 2e4, l = 3e5, u = 3, d = 400, f = "/mjr/am/settings/security/bootstrap-token", p = "/mjr/am/", m = /* @__PURE__ */ new Map(); -function ee(e) { - return new Promise((t) => setTimeout(t, e)); -} -function h(e) { - return s.has(String(e || "").trim().toUpperCase()); -} -function g(e) { +import { a as e, n as t, s as n } from "./graphTraversal-CjIZsRsP.js"; +//#region ui/utils/ids.ts +function r(e) { try { - let t = String(e || "").trim(); - if (!t) return ""; - if (t.startsWith("http://") || t.startsWith("https://")) { - let e = typeof globalThis < "u" && globalThis?.location?.origin ? String(globalThis.location.origin) : "http://localhost"; - return new URL(t, e).pathname || ""; - } - return t.split("?")[0] || ""; + return String(e ?? "").trim(); } catch { return ""; } } -function _(e) { - return g(e).startsWith(p); -} -function v(e) { - return g(e) === f; -} -function y(e) { +var i = 0; +function a(e) { + let t = Math.max(4, Number(e) || 0); try { - if (!e) return !1; - let t = String(e.name || ""); - if (t === "AbortError") return !1; - let n = String(e.message || "").toLowerCase(); - return t === "TypeError" ? n.includes("failed to fetch") || n.includes("networkerror") || n.includes("load failed") || n.includes("fetch") || n.includes("network") : n.includes("fetch") || n.includes("network") || n.includes("failed"); + let e = globalThis.crypto; + if (!e?.getRandomValues) return ""; + let n = new Uint8Array(t); + return e.getRandomValues(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); } catch { - return !1; + return ""; } } -function b(e = {}) { +function o(e = "", t = 16) { + let n = a(t); + if (!n) throw Error("Secure token generation requires crypto.getRandomValues()."); + return `${String(e || "")}${n}`; +} +function s(e = "", t = 8) { + let n = a(t); + return n ? `${String(e || "")}${n}` : (i += 1, `${String(e || "")}${Date.now().toString(36)}_${i.toString(36)}`); +} +function c(e) { + let t = r(e); + if (!t || !/^\d+$/.test(t)) return ""; try { - let t = Number(e?.timeoutMs); - return Number.isFinite(t) ? Math.max(1e3, Math.min(l, Math.floor(t))) : c; + let e = Number(t); + return !Number.isSafeInteger(e) || e <= 0 ? "" : String(e); } catch { - return c; + return ""; } } -function te(e = {}) { - let t = e?.signal || null; - if (typeof AbortController > "u") return { - signal: t || void 0, - timeoutMs: b(e), - cleanup: () => {} - }; - let n = b(e), r = new AbortController(), i = null, a = () => { - try { - i &&= (clearTimeout(i), null); - } catch (e) { - console.debug?.(e); - } - try { - r.abort(); - } catch (e) { - console.debug?.(e); - } - }; +function l(e) { + return c(e); +} +function u(e) { try { - i = setTimeout(() => { - try { - r.abort(); - } catch (e) { - console.debug?.(e); - } - }, n); - } catch (e) { - console.debug?.(e); + if (!e) return ""; + let t = e, n = t.file_info; + return r(t.root_id ?? t.rootId ?? t.custom_root_id ?? t.customRootId ?? t.customRoot ?? n?.root_id ?? n?.rootId ?? ""); + } catch { + return ""; } - try { - t && (t.aborted ? a() : t.addEventListener("abort", a, { once: !0 })); - } catch (e) { - console.debug?.(e); - } - return { - signal: r.signal, - timeoutMs: n, - cleanup: () => { - try { - i && clearTimeout(i); - } catch (e) { - console.debug?.(e); - } - try { - t && t.removeEventListener("abort", a); - } catch (e) { - console.debug?.(e); - } - } - }; -} -function ne(e, t, n = {}) { - let r = String(e || "GET").trim().toUpperCase(), i = String(t || "").trim(); - return !r || !i ? "" : `${r}:${i}:timeout=${b(n)}`; -} -function re(e, t) { - let n = String(e || "").trim(); - if (!n) return t(); - if (m.has(n)) return m.get(n); - let r = Promise.resolve().then(() => t()).finally(() => { - try { - m.delete(n); - } catch (e) { - console.debug?.(e); - } - }); - return m.set(n, r), r; -} -function ie(e, t, n) { - if (h(t)) try { - e instanceof Headers ? e.has("X-Requested-With") || e.set("X-Requested-With", "XMLHttpRequest") : e["X-Requested-With"] ||= "XMLHttpRequest"; - } catch (e) { - console.debug?.(e); - } - try { - e instanceof Headers ? e.has("X-MJR-OBS") || e.set("X-MJR-OBS", n ? "on" : "off") : "X-MJR-OBS" in e || (e["X-MJR-OBS"] = n ? "on" : "off"); - } catch (e) { - console.debug?.(e); - } -} -function ae(e, t) { - if (t) try { - e instanceof Headers ? (e.has("X-MJR-Token") || e.set("X-MJR-Token", t), e.has("Authorization") || e.set("Authorization", `Bearer ${t}`)) : ("X-MJR-Token" in e || (e["X-MJR-Token"] = t), "Authorization" in e || (e.Authorization = `Bearer ${t}`)); - } catch (e) { - console.debug?.(e); - } -} -async function oe(e, t, n, r, { ensureWriteAuthToken: i, normalizeWriteAuthFailure: a, fetchAPI: o, options: s, retryCount: c }) { - let l = e.headers.get("content-type") || ""; - if (!l.includes("application/json")) return !r && h(n) && _(t) && !v(t) && Number(e.status || 0) === 401 && await i({ - force: !0, - allowCookieRefresh: !0 - }) ? await o(t, { - ...s, - _authRetryDone: !0 - }, c) : { - ok: !1, - error: `Server returned non-JSON response (${e.status})`, - code: "INVALID_RESPONSE", - status: e.status, - content_type: l, - data: null - }; - let u = await e.json().catch((e) => (console.debug?.("[MJR API] JSON parse error:", e), null)); - if (typeof u != "object" || !u) return { - ok: !1, - error: "Invalid response structure", - code: "INVALID_RESPONSE", - status: e.status, - data: null - }; - if (!("status" in u)) try { - u.status = e.status; - } catch (e) { - console.debug?.(e); - } - return !r && h(n) && !v(t) && !u?.ok && (String(u?.code || "").toUpperCase() === "AUTH_REQUIRED" || Number(u?.status || 0) === 401) && await i({ - force: !0, - allowCookieRefresh: !0 - }) ? await o(t, { - ...s, - _authRetryDone: !0 - }, c) : (h(n) && _(t) && !v(t) && (u = a(u)), u); -} -function se({ readObsEnabled: e = () => !1, readAuthToken: t = () => "", ensureWriteAuthToken: n = async () => "", normalizeWriteAuthFailure: r = (e) => e, trackApiCall: i = null } = {}) { - async function a(o, s = {}, c = 0) { - let l = typeof performance < "u" ? performance.now() : Date.now(), f = te(s), p = null; - try { - let i = (s.method || "GET").toUpperCase(), l = !!s?._authRetryDone, u = typeof Headers < "u" ? new Headers(s.headers || {}) : { ...s.headers }; - ie(u, i, !!e()); - let d = t(); - if (!d && h(i) && _(o) && !v(o)) { - try { - await n(); - } catch (e) { - console.debug?.(e); - } - d = t(); - } - ae(u, d); - let m = { - ...s, - headers: u, - signal: f.signal - }; - try { - delete m._authRetryDone, delete m.timeoutMs; - } catch (e) { - console.debug?.(e); - } - return p = await oe(await fetch(o, m), o, i, l, { - ensureWriteAuthToken: n, - normalizeWriteAuthFailure: r, - fetchAPI: a, - options: s, - retryCount: c - }), p; - } catch (e) { - try { - if (String(e?.name || "") === "AbortError") return s?.signal && s.signal.aborted ? { - ok: !1, - error: "Aborted", - code: "ABORTED", - data: null - } : { - ok: !1, - error: `Request timed out after ${f.timeoutMs}ms`, - code: "TIMEOUT", - data: null, - timeout_ms: f.timeoutMs - }; - } catch (e) { - console.debug?.(e); - } - if (c < u && y(e)) { - try { - await ee(d * (c + 1)); - } catch (e) { - console.debug?.(e); - } - return await a(o, s, c + 1); - } - return { - ok: !1, - error: e?.message || String(e || "Network error"), - code: "NETWORK_ERROR", - data: null, - retries: c - }; - } finally { - try { - let e = (typeof performance < "u" ? performance.now() : Date.now()) - l; - typeof i == "function" ? i(e, !p?.ok) : typeof window < "u" && window.MajoorMetrics && window.MajoorMetrics.trackApiCall(e, !p?.ok); - } catch (e) { - console.debug?.(e); - } - try { - f.cleanup?.(); - } catch (e) { - console.debug?.(e); - } - } - } - async function o(e, t = {}) { - return re(t?.dedupe === !1 ? "" : String(t?.dedupeKey || "").trim() || ne("GET", e, t), () => a(e, { - ...t, - method: "GET" - })); - } - async function s(e, t, n = {}) { - return a(e, { - ...n, - method: "POST", - headers: { - "Content-Type": "application/json", - ...n.headers - }, - body: JSON.stringify(t) - }); - } - return { - fetchAPI: a, - get: o, - post: s - }; } //#endregion -//#region ui/utils/ttlCache.ts -function x({ ttlMs: e = 0, maxSize: t = 100, now: n = () => Date.now() } = {}) { - let r = /* @__PURE__ */ new Map(); - function i() { - try { - let e = Number(n()); - return Number.isFinite(e) ? e : Date.now(); - } catch { - return Date.now(); - } - } - function a() { - try { - let t = Number(typeof e == "function" ? e() : e); - return Number.isFinite(t) ? Math.max(0, Math.floor(t)) : 0; - } catch { - return 0; - } - } - function o() { - try { - let e = Number(t); - return Number.isFinite(e) ? Math.max(1, Math.floor(e)) : 1; - } catch { - return 1; - } - } - function s(e, t, n) { - return e ? n > 0 ? t - Number(e.at || 0) > n : !1 : !0; - } - function c(e = i(), t = a()) { - if (t > 0) for (let [n, i] of r.entries()) s(i, e, t) && r.delete(n); - } - function l() { - let e = o(); - for (; r.size > e;) { - let e = r.keys().next().value; - if (e === void 0) break; - r.delete(e); - } - } - function u(e, t) { - r.delete(e), r.set(e, t); - } - return { - get(e) { - let t = i(), n = a(); - c(t, n); - let o = r.get(e); - if (o) { - if (s(o, t, n)) { - r.delete(e); - return; - } - return o.value; - } - }, - has(e) { - return this.get(e) !== void 0; - }, - set(e, t, n = {}) { - let o = Number(n?.at), s = { - value: t, - at: Number.isFinite(o) ? o : i() - }; - return r.has(e) ? u(e, s) : r.set(e, s), c(i(), a()), l(), t; - }, - delete(e) { - return r.delete(e); - }, - clear() { - r.clear(); - }, - prune() { - return c(i(), a()), l(), r.size; - }, - keys() { - return this.prune(), Array.from(r.keys()); - }, - entries() { - return this.prune(), Array.from(r.entries()).map(([e, t]) => [e, t.value]); - }, - get size() { - return this.prune(), r.size; - } +//#region ui/utils/path.ts +function d(e) { + return String(e || "").replace(/\\/g, "/"); +} +function f(e) { + let t = d(e).trim(); + if (!t) return { + filename: "", + subfolder: "" }; + let n = t.lastIndexOf("/"); + return n < 0 ? { + filename: t, + subfolder: "" + } : { + filename: t.slice(n + 1), + subfolder: t.slice(0, n) + }; +} +function p(e) { + return /^[a-zA-Z]:\//.test(String(e || "")); +} +//#endregion +//#region ui/api/endpoints.ts +var m = 200, h = 0, g = { + HEALTH: "/mjr/am/health", + HEALTH_COUNTERS: "/mjr/am/health/counters", + HEALTH_DB: "/mjr/am/health/db", + STATUS: "/mjr/am/status", + RUNTIME_EXECUTION: "/mjr/am/runtime/execution", + CONFIG: "/mjr/am/config", + VERSION: "/mjr/am/version", + SCAN: "/mjr/am/scan", + INDEX_FILES: "/mjr/am/index-files", + INDEX_RESET: "/mjr/am/index/reset", + DB_RESET: "/mjr/am/db/reset", + SEARCH: "/mjr/am/search", + LIST: "/mjr/am/list", + ROOTS: "/mjr/am/roots", + CUSTOM_ROOTS: "/mjr/am/custom-roots", + CUSTOM_ROOTS_REMOVE: "/mjr/am/custom-roots/remove", + BROWSER_FOLDER_OP: "/mjr/am/browser/folder-op", + BROWSE_FOLDER: "/mjr/sys/browse-folder", + FOLDER_INFO: "/mjr/am/folder-info", + METADATA: "/mjr/am/metadata", + WORKFLOW_QUICK: "/mjr/am/workflow-quick", + RETRY_SERVICES: "/mjr/am/retry-services", + STAGE_TO_INPUT: "/mjr/am/stage-to-input", + OPEN_IN_FOLDER: "/mjr/am/open-in-folder", + TOOLS_STATUS: "/mjr/am/tools/status", + SETTINGS_OUTPUT_DIRECTORY: "/mjr/am/settings/output-directory", + SETTINGS_INDEX_DIRECTORY: "/mjr/am/settings/index-directory", + SETTINGS_METADATA_FALLBACK: "/mjr/am/settings/metadata-fallback", + SETTINGS_VECTOR_SEARCH: "/mjr/am/settings/vector-search", + SETTINGS_EXECUTION_GROUPING: "/mjr/am/settings/execution-grouping", + SETTINGS_HUGGINGFACE: "/mjr/am/settings/huggingface", + SETTINGS_AI_LOGGING: "/mjr/am/settings/ai-logging", + SETTINGS_ROUTE_LOGGING: "/mjr/am/settings/route-logging", + SETTINGS_STARTUP_LOGGING: "/mjr/am/settings/startup-logging", + SETTINGS_LTXAV_RGB_FALLBACK: "/mjr/am/settings/ltxav-rgb-fallback", + VIEW: "/view", + CUSTOM_VIEW: "/mjr/am/custom-view", + VIEWER_INFO: "/mjr/am/viewer/info", + VIEWER_RESOURCE: "/mjr/am/viewer/resource", + UPLOAD_INPUT: "/mjr/am/upload_input", + DOWNLOAD: "/mjr/am/download", + DOWNLOAD_CLEAN: "/mjr/am/download-clean", + BATCH_ZIP_CREATE: "/mjr/am/batch-zip", + DATE_HISTOGRAM: "/mjr/am/date-histogram", + ASSET_DELETE: "/mjr/am/asset/delete", + ASSET_RENAME: "/mjr/am/asset/rename", + WATCHER_STATUS: "/mjr/am/watcher/status", + WATCHER_TOGGLE: "/mjr/am/watcher/toggle", + WATCHER_SCOPE: "/mjr/am/watcher/scope", + WATCHER_SETTINGS: "/mjr/am/watcher/settings", + COLLECTIONS: "/mjr/am/collections", + STACKS: "/mjr/am/stacks", + STACKS_MERGE: "/mjr/am/stacks/merge", + STACKS_DISSOLVE: "/mjr/am/stacks/dissolve", + STACKS_AUTO_STACK: "/mjr/am/stacks/auto-stack", + DUPLICATES_ALERTS: "/mjr/am/duplicates/alerts", + DUPLICATES_ANALYZE: "/mjr/am/duplicates/analyze", + DUPLICATES_MERGE_TAGS: "/mjr/am/duplicates/merge-tags", + DB_BACKUPS: "/mjr/am/db/backups", + DB_BACKUP_SAVE: "/mjr/am/db/backup-save", + DB_BACKUP_RESTORE: "/mjr/am/db/backup-restore", + VECTOR_SEARCH: "/mjr/am/vector/search", + VECTOR_SIMILAR: "/mjr/am/vector/similar", + VECTOR_ALIGNMENT: "/mjr/am/vector/alignment", + VECTOR_AUTO_TAGS: "/mjr/am/vector/auto-tags", + VECTOR_CAPTION: "/mjr/am/vector/caption", + VECTOR_ENHANCED_PROMPT: "/mjr/am/vector/enhanced-prompt", + VECTOR_INDEX: "/mjr/am/vector/index", + VECTOR_STATS: "/mjr/am/vector/stats", + VECTOR_SUGGEST_COLLECTIONS: "/mjr/am/vector/suggest-collections", + VECTOR_BACKFILL: "/mjr/am/db/backfill-missing-vectors", + VECTOR_BACKFILL_STATUS: "/mjr/am/db/backfill-missing-vectors/status", + HYBRID_SEARCH: "/mjr/am/search/hybrid", + AUDIT: "/mjr/am/audit" +}; +function _(e, t = {}) { + let n = String(e || ""), r = () => n.includes("?") ? "&" : "?", i = (e) => { + n += r() + e; + }, { subfolder: a = null, kind: o = null, hasWorkflow: s = null, minRating: c = null, minSizeMB: l = null, maxSizeMB: u = null, minWidth: d = null, minHeight: f = null, maxWidth: p = null, maxHeight: m = null, workflowType: h = null, workflowId: g = null, dateRange: _ = null, dateExact: v = null } = t || {}; + return a && i(`subfolder=${encodeURIComponent(String(a))}`), o && i(`kind=${encodeURIComponent(o)}`), s != null && i(`has_workflow=${encodeURIComponent(s ? "true" : "false")}`), c != null && Number(c) > 0 && i(`min_rating=${encodeURIComponent(String(c))}`), l != null && Number(l) > 0 && i(`min_size_mb=${encodeURIComponent(String(l))}`), u != null && Number(u) > 0 && i(`max_size_mb=${encodeURIComponent(String(u))}`), d != null && Number(d) > 0 && i(`min_width=${encodeURIComponent(String(d))}`), f != null && Number(f) > 0 && i(`min_height=${encodeURIComponent(String(f))}`), p != null && Number(p) > 0 && i(`max_width=${encodeURIComponent(String(p))}`), m != null && Number(m) > 0 && i(`max_height=${encodeURIComponent(String(m))}`), h && i(`workflow_type=${encodeURIComponent(String(h))}`), g && i(`workflow_id=${encodeURIComponent(String(g))}`), _ && i(`date_range=${encodeURIComponent(String(_))}`), v && i(`date_exact=${encodeURIComponent(String(v))}`), n; +} +function v(e, t = null, n = "output") { + let r = String(e || "").trim(); + if (!r) return ""; + let i = `${g.VIEW}?filename=${encodeURIComponent(r)}`; + return t && (i += `&subfolder=${encodeURIComponent(t)}`), i += `&type=${encodeURIComponent(n)}`, i; +} +function ee(e = {}) { + let { q: t = "*", limit: n = m, offset: r = h, scope: i = "output", subfolder: a = "", customRootId: o = null, kind: s = null, hasWorkflow: c = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, resolutionCompare: f = null, minWidth: p = null, minHeight: v = null, maxWidth: ee = null, maxHeight: y = null, workflowType: te = null, workflowId: ne = null, dateRange: re = null, dateExact: ie = null, sort: b = null, cursor: x = null, includeTotal: ae = !0, groupStacks: S = !1 } = e, C = `${g.LIST}?q=${encodeURIComponent(t)}&limit=${n}&offset=${r}&scope=${encodeURIComponent(i)}`; + return a && (C += `&subfolder=${encodeURIComponent(a)}`), o ? C += `&custom_root_id=${encodeURIComponent(o)}` : String(i || "").toLowerCase() === "custom" && (C += "&browser_mode=1"), C = _(C, { + kind: s, + hasWorkflow: c, + minRating: l, + minSizeMB: u, + maxSizeMB: d, + minWidth: p, + minHeight: v, + maxWidth: ee, + maxHeight: y, + workflowType: te, + workflowId: ne, + dateRange: re, + dateExact: ie + }), f && (C += `&resolution_compare=${encodeURIComponent(String(f))}`), b && (C += `&sort=${encodeURIComponent(String(b))}`), x && (C += `&cursor=${encodeURIComponent(String(x))}`), ae === !1 && (C += "&include_total=0"), S && (C += "&group_stacks=1"), C; +} +function y(e, t = "", n = "") { + let r = String(e || "").trim(), i = String(n || "").trim(); + if (!r || !i) return ""; + let a = `${g.CUSTOM_VIEW}?root_id=${encodeURIComponent(i)}&filename=${encodeURIComponent(r)}`; + return t && (a += `&subfolder=${encodeURIComponent(t)}`), a; +} +function te(e) { + return `${g.BATCH_ZIP_CREATE}/${encodeURIComponent(String(e || ""))}`; +} +function ne(e) { + return `${g.STACKS}/${encodeURIComponent(String(e || ""))}`; +} +function re(e) { + return `${ne(e)}/members`; +} +function ie(e, t = {}) { + let n = String(e || "").trim(), r = `${g.STACKS}/by-node/${encodeURIComponent(n)}/members`, i = [], a = String(t?.jobId || t?.job_id || "").trim(); + a && i.push(`job_id=${encodeURIComponent(a)}`), t?.latest === !1 && i.push("latest=0"); + let o = Number(t?.limit || 0); + return Number.isFinite(o) && o > 0 && i.push(`limit=${encodeURIComponent(String(Math.trunc(o)))}`), i.length && (r += `?${i.join("&")}`), r; +} +function b(e, t = "") { + let n = e && typeof e == "object" ? e : {}, r = String(t || "").trim(); + if (!r) return ""; + let i = l(n?.asset_id ?? n?.id ?? null), a = `${g.VIEWER_RESOURCE}?relpath=${encodeURIComponent(r)}`; + if (i) return `${a}&asset_id=${encodeURIComponent(i)}`; + let o = d(String(n?.filepath || n?.path || n?.fullpath || n?.full_path || n?.file_info?.filepath || n?.file_info?.path || "").trim()); + if (o) return `${a}&filepath=${encodeURIComponent(o)}`; + let s = String(n?.filename || n?.name || n?.file_info?.filename || "").trim(); + if (!s) return ""; + a += `&filename=${encodeURIComponent(s)}`; + let c = String(n?.subfolder || n?.file_info?.subfolder || "").trim(); + c && (a += `&subfolder=${encodeURIComponent(c)}`); + let f = String(n?.type || n?.file_info?.type || "").trim().toLowerCase(); + f && f !== "custom" && (a += `&type=${encodeURIComponent(f)}`); + let p = String(u(n) || n?.root_id || n?.custom_root_id || "").trim(); + return p && (a += `&root_id=${encodeURIComponent(p)}`), a; +} +function x(e = {}) { + let { scope: t = "output", customRootId: n = null, month: r = "", kind: i = null, hasWorkflow: a = null, minRating: o = null } = e, s = `${g.DATE_HISTOGRAM}?scope=${encodeURIComponent(t)}&month=${encodeURIComponent(String(r || ""))}`; + return n && (s += `&custom_root_id=${encodeURIComponent(n)}`), _(s, { + subfolder: e.subfolder ?? null, + kind: i, + hasWorkflow: a, + minRating: o, + minSizeMB: e.minSizeMB ?? null, + maxSizeMB: e.maxSizeMB ?? null, + minWidth: e.minWidth ?? null, + minHeight: e.minHeight ?? null, + maxWidth: e.maxWidth ?? null, + maxHeight: e.maxHeight ?? null, + workflowType: e.workflowType ?? null, + workflowId: e.workflowId ?? null, + dateRange: e.dateRange ?? null, + dateExact: e.dateExact ?? null + }); +} +function ae(e) { + let t = e?.mtime, n = (e) => !e || !t ? e : `${e}${e.includes("?") ? "&" : "?"}v=${encodeURIComponent(t)}`, r = d(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "").trim()), i = String(e?.filename || e?.name || e?.file_info?.filename || "").trim(), a = String(e?.subfolder || e?.file_info?.subfolder || "").trim(), o = ((e) => { + let t = { + type: "", + subfolder: "", + filename: "" + }, n = d(e); + if (!n) return t; + let r = n.toLowerCase(), i = r.indexOf("/output/"), a = r.indexOf("/input/"), o = r.indexOf("/temp/"), s = -1; + if (i >= 0 ? (t.type = "output", s = i + 8) : a >= 0 ? (t.type = "input", s = a + 7) : o >= 0 && (t.type = "temp", s = o + 6), s >= 0) { + let e = n.slice(s), r = e.lastIndexOf("/"); + r >= 0 ? (t.subfolder = e.slice(0, r), t.filename = e.slice(r + 1)) : t.filename = e; + } else t.filename = f(n).filename; + return t; + })(r); + if (!a && i.includes("/")) { + let e = i.lastIndexOf("/"); + e > 0 && (a = i.slice(0, e), i = i.slice(e + 1)); + } + if (!i && o.filename && (i = o.filename), !a && o.subfolder && (a = o.subfolder), !i) return ""; + let s = String(e?.type || e?.file_info?.type || "").toLowerCase().trim(); + s !== "input" && s !== "output" && s !== "temp" && s !== "custom" && (s = ""), !s && o.type && (s = o.type), !s && r && (r.includes("/input/") ? s = "input" : r.includes("/output/") ? s = "output" : r.includes("/temp/") && (s = "temp")), s ||= "output"; + let c = r.includes("/output/") || r.includes("/input/") || r.includes("/temp/"), l = p(a) || a.startsWith("/"); + if (r && s !== "custom" && (l || !c)) return n(S(r, { inline: !0 })); + if (s === "custom") { + let t = String(u(e) || "").trim(); + if (t) return n(y(i, a, t)); + if (r) return n(`${g.CUSTOM_VIEW}?filepath=${encodeURIComponent(r)}&browser_mode=1`); + let s = o.type || "output"; + return n(v(i, a, s)); + } + return r.includes("/output/") && (s = "output"), r.includes("/input/") && (s = "input"), r.includes("/temp/") && (s = "temp"), n(v(i, a, s)); +} +function S(e, t = {}) { + if (!e) return ""; + let n = !!t?.inline, r = `${g.DOWNLOAD}?filepath=${encodeURIComponent(e)}`; + return n && (r += "&preview=1"), r; +} +function C(e) { + return e ? `${g.DOWNLOAD_CLEAN}?filepath=${encodeURIComponent(e)}` : ""; } //#endregion //#region ui/app/comfyApiBridge.ts -var S = null, C = null, ce = 50; -function w(e) { +var w = null, T = null, oe = 50; +function E(e) { return !!e && typeof e == "object"; } -function T(e, t) { +function D(e, t) { try { if (!e || typeof e != "object" && typeof e != "function") return null; let n = Object.getOwnPropertyDescriptor(e, t); @@ -380,65 +294,65 @@ function T(e, t) { return null; } } -function E(e) { - return w(e) ? typeof e.fetchApi == "function" || typeof e.apiURL == "function" || w(e.settings) : !1; +function O(e) { + return E(e) ? typeof e.fetchApi == "function" || typeof e.apiURL == "function" || E(e.settings) : !1; } -function le(e) { - return w(e) ? w(e.ui) || w(e.canvas) || w(e.graph) || typeof e.loadGraphData == "function" || E(e.api) : !1; +function k(e) { + return E(e) ? E(e.ui) || E(e.canvas) || E(e.graph) || typeof e.loadGraphData == "function" || O(e.api) : !1; } -function ue(e) { - return le(e) && (S = e), S; +function se(e) { + return k(e) && (w = e), w; } -function de(e) { - return E(e) && (C = e), C; +function ce(e) { + return O(e) && (T = e), T; } -function D(e) { - if (E(C)) return C; - let t = w(e) ? e : O(), n = t?.api || t?.ui?.api || t?.ui?.app?.api || null; - if (E(n)) return n; +function A(e) { + if (O(T)) return T; + let t = E(e) ? e : j(), n = t?.api || t?.ui?.api || t?.ui?.app?.api || null; + if (O(n)) return n; try { - let e = typeof window < "u" ? T(window, "api") : null; - if (E(e)) return e; + let e = typeof window < "u" ? D(window, "api") : null; + if (O(e)) return e; } catch (e) { console.debug?.(e); } try { - let e = typeof globalThis < "u" ? T(globalThis, "api") : null; - if (E(e)) return e; + let e = typeof globalThis < "u" ? D(globalThis, "api") : null; + if (O(e)) return e; } catch (e) { console.debug?.(e); } return null; } -async function fe(e, t = null, n) { - let r = D(n); +async function le(e, t = null, n) { + let r = A(n); return r && typeof r.fetchApi == "function" ? r.fetchApi(e, t || void 0) : fetch(e, { credentials: "include", ...t || {} }); } -function O() { - if (le(S)) return S; +function j() { + if (k(w)) return w; try { - let e = typeof globalThis < "u" ? T(globalThis, "app") : null; - if (le(e)) return e; + let e = typeof globalThis < "u" ? D(globalThis, "app") : null; + if (k(e)) return e; } catch (e) { console.debug?.(e); } try { - let e = typeof window < "u" ? T(window, "app") : null; - if (le(e)) return e; + let e = typeof window < "u" ? D(window, "app") : null; + if (k(e)) return e; } catch (e) { console.debug?.(e); } return null; } -function pe(e) { - let t = w(e) ? e : O(); +function ue(e) { + let t = E(e) ? e : j(); return !t || typeof t != "object" ? null : t?.ui?.settings || t?.settings || t?.ui?.api?.settings || t?.api?.settings || null; } -function me(e, t) { - let n = pe(e); +function de(e, t) { + let n = ue(e); if (!n) return null; for (let e of [ "getSettingValue", @@ -459,8 +373,8 @@ function me(e, t) { } return null; } -function he(e, t, n) { - let r = pe(e); +function fe(e, t, n) { + let r = ue(e); if (!r) return !1; for (let e of [ "setSettingValue", @@ -479,27 +393,27 @@ function he(e, t, n) { } return !1; } -function k(e) { - let t = w(e) ? e : O(); +function M(e) { + let t = E(e) ? e : j(); return t?.extensionManager || t?.ui?.extensionManager || null; } -function ge(e) { - let t = k(e); - return w(t) && (t?.sidebarTabStore || t?.sidebarTab || t?.workspaceStore?.sidebarTab) || null; +function pe(e) { + let t = M(e); + return E(t) && (t?.sidebarTabStore || t?.sidebarTab || t?.workspaceStore?.sidebarTab) || null; } -function _e(e) { - return w(e) && (e?.bottomPanel || e?.bottomPanelStore) || null; +function me(e) { + return E(e) && (e?.bottomPanel || e?.bottomPanelStore) || null; } -function ve(e) { - let t = k(e)?.toast || null; +function he(e) { + let t = M(e)?.toast || null; return t && typeof t.add == "function" ? t : null; } -function ye(e) { - let t = k(e)?.dialog || null; +function ge(e) { + let t = M(e)?.dialog || null; return t && (typeof t.alert == "function" || typeof t.confirm == "function" || typeof t.prompt == "function") ? t : null; } -function be(e, t) { - let n = w(e) ? e : O(), r = k(n), i = ge(n), a = String(t || "").trim(); +function _e(e, t) { + let n = E(e) ? e : j(), r = M(n), i = pe(n), a = String(t || "").trim(); if (!r || !a) return !1; let o = [ "activateSidebarTab", @@ -521,8 +435,8 @@ function be(e, t) { } return !1; } -function xe(e, t) { - let n = k(e), r = t && typeof t == "object" ? { ...t } : null; +function ve(e, t) { + let n = M(e), r = t && typeof t == "object" ? { ...t } : null; if (!n || !r) return !1; for (let e of ["registerCommand", "addCommand"]) try { if (typeof n?.[e] == "function") return n[e](r), !0; @@ -531,8 +445,8 @@ function xe(e, t) { } return !1; } -function Se(e, t) { - let n = k(e), r = t && typeof t == "object" ? { ...t } : null; +function ye(e, t) { + let n = M(e), r = t && typeof t == "object" ? { ...t } : null; if (!n || !r) return !1; for (let e of ["registerKeybinding", "addKeybinding"]) try { if (typeof n?.[e] == "function") return n[e](r), !0; @@ -541,18 +455,18 @@ function Se(e, t) { } return !1; } -function Ce(e, t) { +function be(e, t) { try { - let n = w(e) ? e : O(), r = n?.extensionManager || n?.ui?.extensionManager || null, i = ge(n); + let n = E(e) ? e : j(), r = n?.extensionManager || n?.ui?.extensionManager || null, i = pe(n); for (let e of [r, i]) if (e && typeof e.registerSidebarTab == "function") return e.registerSidebarTab(t), !0; } catch (e) { console.debug?.(e); } return !1; } -function we(e, t) { +function xe(e, t) { try { - let n = k(w(e) ? e : O()), r = _e(n), i = String(t || "").trim(); + let n = M(E(e) ? e : j()), r = me(n), i = String(t || "").trim(); if (!i) return !1; let a = [ "activateBottomPanelTab", @@ -571,71 +485,537 @@ function we(e, t) { } return !1; } -function Te(e) { +function Se(e) { return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0))); } -function Ee(e, t) { +function Ce(e, t) { try { console.warn(`[Majoor] ${e} timed out after ${Math.max(0, Number(t) || 0)}ms`); } catch (e) { console.debug?.(e); } } -async function De({ timeoutMs: e = 4e3, intervalMs: t = ce, warnOnTimeout: n = !0, rejectOnTimeout: r = !1 } = {}) { +async function we({ timeoutMs: e = 4e3, intervalMs: t = oe, warnOnTimeout: n = !0, rejectOnTimeout: r = !1 } = {}) { let i = Date.now(), a = Math.max(0, Number(e) || 0); for (; Date.now() - i < a;) { - let e = O(); + let e = j(); if (e && typeof e == "object") return e; - await Te(t); + await Se(t); } - let o = O(); + let o = j(); if (o && typeof o == "object") return o; - if (n && Ee("waitForComfyApp", a), r) throw Error(`waitForComfyApp timeout after ${a}ms`); + if (n && Ce("waitForComfyApp", a), r) throw Error(`waitForComfyApp timeout after ${a}ms`); return null; } -async function Oe({ app: e = null, timeoutMs: t = 4e3, intervalMs: n = ce, warnOnTimeout: r = !0, rejectOnTimeout: i = !1 } = {}) { +async function Te({ app: e = null, timeoutMs: t = 4e3, intervalMs: n = oe, warnOnTimeout: r = !0, rejectOnTimeout: i = !1 } = {}) { let a = Date.now(), o = Math.max(0, Number(t) || 0); for (; Date.now() - a < o;) { - let t = D(e || O()); + let t = A(e || j()); if (t) return t; - await Te(n); + await Se(n); } - let s = D(e || O()); + let s = A(e || j()); if (s) return s; - if (r && Ee("waitForComfyApi", o), i) throw Error(`waitForComfyApi timeout after ${o}ms`); + if (r && Ce("waitForComfyApi", o), i) throw Error(`waitForComfyApi timeout after ${o}ms`); return null; } //#endregion +//#region ui/app/hostAdapter.ts +var N = null, P = Symbol.for("mjr.host.queuePromptBinding"), Ee = [ + "selectionchange", + "selection-change", + "node-selected", + "node-deselected", + "node-selection-change" +]; +function De(e) { + try { + let t = he(N || j()); + t && t.add({ + severity: e?.severity ?? "info", + summary: e?.summary ?? "", + detail: e?.detail ?? "", + life: e?.life ?? 4e3 + }); + } catch {} +} +function Oe(e = null) { + try { + return he(e || N || j()) || null; + } catch { + return null; + } +} +function ke(e = null) { + try { + return ge(e || N || j()) || null; + } catch { + return null; + } +} +function Ae(e, t, n = null) { + try { + return de(e || N || j(), t) ?? n; + } catch { + return n; + } +} +function je(e, t, n) { + try { + return fe(e || N || j(), t, n); + } catch { + return !1; + } +} +function Me(e, t) { + try { + return be(e || N || j(), t); + } catch { + return !1; + } +} +function Ne(e, t) { + try { + return _e(e || N || j(), t); + } catch { + return !1; + } +} +function Pe(e, t) { + try { + return xe(e || N || j(), t); + } catch { + return !1; + } +} +function Fe(e, t) { + try { + return ve(e || N || j(), t); + } catch { + return !1; + } +} +function Ie(e, t) { + try { + return ye(e || N || j(), t); + } catch { + return !1; + } +} +function Le() { + return N || j() || null; +} +function F(e = null) { + try { + return A(e || N || j()) || null; + } catch { + return null; + } +} +async function Re(e = {}) { + try { + return await Te(e); + } catch { + return null; + } +} +async function ze(e, t = null, n = null) { + try { + return await le(e, t, n || N || j()); + } catch { + return fetch(e, { + credentials: "include", + ...t || {} + }); + } +} +function Be(e, t, n) { + if (!e || typeof e.addEventListener != "function") return null; + try { + e.addEventListener(t, n); + } catch { + return null; + } + return () => { + try { + e.removeEventListener?.(t, n); + } catch (e) { + console.debug?.(e); + } + }; +} +function Ve(e, t = {}) { + if (typeof e != "function") return null; + let n = t.app || N || j(), r = n?.canvas; + if (!r) return null; + let i = [], a = !1, o = [ + r, + n, + n?.graph + ].filter((e, t, n) => e && n.indexOf(e) === t), s = () => { + try { + e(); + } catch (e) { + console.debug?.(e); + } + }; + for (let e of o) for (let t of Ee) { + let n = Be(e, t, s); + n && (i.push(n), a = !0); + } + if (!a) { + let e = Object.prototype.hasOwnProperty.call(r, "onNodeSelected"), t = Object.prototype.hasOwnProperty.call(r, "onSelectionChange"), n = Object.prototype.hasOwnProperty.call(r, "onNodeDeselected"), a = r.onNodeSelected, o = r.onSelectionChange, c = r.onNodeDeselected; + r.onNodeSelected = function(e) { + a?.call(this, e), s(); + }, r.onSelectionChange = function(e) { + o?.call(this, e), s(); + }, r.onNodeDeselected = function(e) { + c?.call(this, e), s(); + }, i.push(() => { + try { + e ? r.onNodeSelected = a : delete r.onNodeSelected, t ? r.onSelectionChange = o : delete r.onSelectionChange, n ? r.onNodeDeselected = c : delete r.onNodeDeselected; + } catch (e) { + console.debug?.(e); + } + }); + } + if (t.includePointerFallback !== !1 && r.canvas?.addEventListener) { + let e = Be(r.canvas, "pointerup", s); + e && i.push(e); + } + let c = !1; + return () => { + if (!c) { + c = !0; + for (let e of i.splice(0).reverse()) e(); + } + }; +} +function He(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) : !1; + } catch (e) { + return console.debug?.(e), !1; + } + } + }; + return Object.defineProperty(o, P, { + configurable: !0, + value: s + }), t.queuePrompt = o, s; +} +async function Ue(e = null) { + let t = e || N || j(), n = (t?.api && typeof t.api.interrupt == "function" ? t.api : null) || F(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" }); + if (!e?.ok) throw Error(`POST /interrupt failed (${e?.status})`); + return !0; + } + let r = await fetch("/interrupt", { + method: "POST", + credentials: "include" + }); + if (!r.ok) throw Error(`POST /interrupt failed (${r.status})`); + return !1; +} +function I(e = null) { + return (e || N || j())?.canvas || null; +} +function We(e = null) { + return I(e); +} +function L(e = null) { + let t = e || N || j(); + return t?.graph || t?.canvas?.graph || null; +} +function Ge(e = null) { + return L(e); +} +function Ke(e) { + if (typeof e != "object" || !e) return e; + try { + return typeof structuredClone == "function" ? structuredClone(e) : JSON.parse(JSON.stringify(e)); + } catch { + return e; + } +} +function R(e, t) { + n(e, ({ node: e }) => t(e)); +} +function qe(e) { + let t = []; + return R(e, (e) => { + for (let n of e?.widgets ?? []) t.push({ + widget: n, + value: Ke(n?.value) + }); + }), t; +} +function Je(e, t) { + for (let e of Array.isArray(t) ? t : []) { + let t = e?.widget; + if (!t || typeof t != "object") continue; + let n = Ke(e?.value); + try { + t.value = n; + } catch (e) { + console.debug?.(e); + continue; + } + try { + t.callback?.(n); + } catch (e) { + console.debug?.(e); + } + } + z(e, { change: !1 }); +} +function Ye(e, t) { + let n = [ + e?.clientId, + e?.clientID, + e?.client_id, + t?.clientId, + t?.clientID, + t?.client_id + ]; + for (let e of n) { + let t = String(e || "").trim(); + if (t) return t; + } + return ""; +} +function Xe(e = null) { + let t = I(e); + return t?.selected_nodes ?? t?.selectedNodes ?? null; +} +function Ze(e = null) { + let t = Xe(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 Qe(e = null) { + return Ze(e).map((e) => String(e?.id ?? "").trim()).filter(Boolean); +} +function $e(e = null) { + return Ze(e)[0] || null; +} +function z(e = null, t = {}) { + try { + let n = e || N || j(), r = I(n), i = L(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 et(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); + } catch (e) { + return console.debug?.(e), !1; + } +} +function tt(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), et(e, n), !0); + } catch (e) { + return console.debug?.(e), !1; + } +} +function nt(e, t = null) { + let n = t || N || j(); + if (!e || typeof e != "object") return !1; + try { + if (typeof n?.loadGraphData == "function") return n.loadGraphData(e), !0; + let t = L(n); + if (typeof t?.configure == "function") return t.configure(e), z(n, { + draw: !1, + change: !1 + }), !0; + } catch (e) { + console.debug?.(e); + } + return !1; +} +async function rt(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"); + 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) => { + 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) => { + for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); + }), z(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: Ye(r, n) }); + if (r && typeof r.fetchApi == "function") { + let e = await r.fetchApi("/prompt", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(s) + }); + if (!e?.ok) throw Error(`POST /prompt failed (${e?.status})`); + return R(a, (e) => { + for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); + }), z(n, { change: !1 }), !0; + } + let c = await fetch("/prompt", { + method: "POST", + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(s) + }); + if (!c.ok) throw Error(`POST /prompt failed (${c.status})`); + return R(a, (e) => { + for (let t of e?.widgets ?? []) t.afterQueued?.({ isPartialExecution: !1 }); + }), z(n, { change: !1 }), !1; + } catch (e) { + throw Je(n, o), e; + } +} +function it(e, t = {}) { + if (!e) return !1; + try { + let n = I(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) { + let t = n.canvas || n.element || null, r = Number(t?.width || t?.clientWidth || 800) || 800, i = Number(t?.height || t?.clientHeight || 600) || 600, a = Number(n.ds?.scale || 1) || 1, o = Number(e?.size?.[0] || 100) || 100, s = Number(e?.size?.[1] || 80) || 80, c = -Number(e.pos[0] || 0) + r / (2 * a) - o / 2, l = -Number(e.pos[1] || 0) + i / (2 * a) - s / 2; + Array.isArray(n.ds.offset) ? (n.ds.offset[0] = c, n.ds.offset[1] = l) : n.ds.offset && typeof n.ds.offset == "object" && (n.ds.offset.x = c, n.ds.offset.y = l), n.setDirty?.(!0, !0); + } + return t.focusCanvas !== !1 && n.canvas?.focus?.(), !0; + } catch (e) { + return console.debug?.(e), !1; + } +} +function at(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 ? it(a, { + app: n, + select: !1, + focusCanvas: !1 + }) : !1; + } catch (e) { + return console.debug?.(e), !1; + } +} +function ot() { + 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); + return !Number.isFinite(i) || i <= 0 || !(a > 0) || !(o > 0) ? null : { + app: e, + graphCanvas: t, + ds: n, + scale: i, + width: a, + height: o + }; +} +function st(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 ct(e, t) { + try { + t?.setDirty?.(!0, !0); + } catch (e) { + console.debug?.(e); + } + try { + e?.graph?.setDirtyCanvas?.(!0, !0); + } catch (e) { + console.debug?.(e); + } +} +function lt(e) { + try { + let t = ot(); + 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) || !st(t.ds, a, o) ? !1 : (ct(t.app, t.graphCanvas), !0); + } catch (e) { + return console.debug?.(e), !1; + } +} +function ut() { + try { + let e = ot(); + 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 : { + x0: -n / e.scale, + y0: -r / e.scale, + x1: (e.width - n) / e.scale, + y1: (e.height - r) / e.scale + }; + } catch (e) { + return console.debug?.(e), null; + } +} +//#endregion //#region ui/app/settings/SettingsStore.ts -var A = /* @__PURE__ */ new Map(), j = !1, M = null; -function ke() { +var B = /* @__PURE__ */ new Map(), V = !1, H = null; +function U() { try { return typeof window > "u" ? null : window.localStorage || null; } catch { return null; } } -function Ae(e, t, n) { - let r = A.get(String(e || "")); +function W(e, t, n) { + let r = B.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 je() { - if (!j) try { - M = (e) => { +function dt() { + if (!V) try { + H = (e) => { let t = String(e?.key || ""); - t && Ae(t, e?.newValue ?? null, e?.oldValue ?? null); - }, window.addEventListener("storage", M), j = !0; + t && W(t, e?.newValue ?? null, e?.oldValue ?? null); + }, window.addEventListener("storage", H), V = !0; } catch (e) { console.debug?.(e); } } -var N = { +var G = { get(e) { - let t = ke(); + let t = U(); if (!t) return null; try { return t.getItem(String(e || "")); @@ -646,13 +1026,13 @@ var N = { set(e, t) { let n = String(e || ""); if (!n) return !1; - let r = ke(); + let r = U(); if (!r) return !1; - let i = N.get(n); + let i = G.get(n); try { - if (t == null) return r.removeItem(n), Ae(n, null, i), !0; + if (t == null) return r.removeItem(n), W(n, null, i), !0; let e = String(t); - return r.setItem(n, e), Ae(n, e, i), !0; + return r.setItem(n, e), W(n, e, i), !0; } catch { return !1; } @@ -660,19 +1040,19 @@ var N = { subscribe(e, t) { let n = String(e || ""); if (!n || typeof t != "function") return () => {}; - je(); - let r = A.get(n); - return r || (r = /* @__PURE__ */ new Set(), A.set(n, r)), r.add(t), () => { + dt(); + let r = B.get(n); + return r || (r = /* @__PURE__ */ new Set(), B.set(n, r)), r.add(t), () => { try { - let e = A.get(n); - e?.delete(t), e && !e.size && A.delete(n); + let e = B.get(n); + e?.delete(t), e && !e.size && B.delete(n); } catch (e) { console.debug?.(e); } }; }, getAll() { - let e = {}, t = ke(); + let e = {}, t = U(); if (!t) return e; try { let n = Number(t.length || 0) || 0; @@ -687,17 +1067,17 @@ var N = { }, dispose() { try { - j && M && typeof window < "u" && window.removeEventListener("storage", M); + V && H && typeof window < "u" && window.removeEventListener("storage", H); } catch (e) { console.debug?.(e); } - j = !1, M = null, A.clear(); + V = !1, H = null, B.clear(); } -}, P = "en-US", F = P, Me = /* @__PURE__ */ new Set(), Ne = ["mjr_lang", "majoor.lang"], Pe = "mjr_lang_follow_comfy", Fe = 500, I = /* @__PURE__ */ new Set(), L = null, Ie = new Set([ +}, K = "en-US", q = K, ft = /* @__PURE__ */ new Set(), pt = ["mjr_lang", "majoor.lang"], mt = "mjr_lang_follow_comfy", ht = 500, J = /* @__PURE__ */ new Set(), Y = null, gt = new Set([ "ar-SA", "fa-IR", "he-IL" -]), Le = { +]), _t = { fr: "fr-FR", "fr-fr": "fr-FR", fr_FR: "fr-FR", @@ -803,7 +1183,7 @@ var N = { "el-gr": "el-GR", el_gr: "el-GR", elgr: "el-GR" -}, R = { +}, X = { "en-US": { "cat.grid": "Grid", "cat.cards": "Cards", @@ -974,6 +1354,7 @@ var N = { "label.only": "Only", "label.toastHistory": "History", "label.workflowType": "WF Type", + "label.sameWorkflow": "Generated with Same Workflow", "label.resolution": "Resolution", "label.fileSizeMB": "File size (MB)", "label.min": "Min", @@ -1022,6 +1403,7 @@ var N = { "tooltip.copyFieldValue": "Copy value", "tooltip.filterByFileType": "Filter by file type", "tooltip.filterWorkflowOnly": "Show only assets with embedded workflow data", + "tooltip.filterWorkflowId": "Filter assets generated from the same embedded workflow id", "tooltip.filterMinRating": "Filter by minimum rating", "tooltip.filterByDateRange": "Filter by date range", "tooltip.widthPx": "Width in pixels", @@ -1067,6 +1449,8 @@ var N = { "tooltip.captureView": "Save view as image", "tooltip.pendingRefresh": "Pending: metadata refresh in progress", "tooltip.noAssetsDay": "No assets on this day", + "tooltip.assetsDaySingular": "{count} asset", + "tooltip.assetsDayPlural": "{count} assets", "tooltip.deleteCollection": "Delete collection", "tooltip.viewerShortcuts": "Viewer keyboard shortcuts", "tooltip.singleViewMode": "Single view mode (one image)", @@ -1103,6 +1487,17 @@ var N = { "filter.thisMonth": "This month", "filter.last7days": "Last 7 days", "filter.last30days": "Last 30 days", + "placeholder.workflowId": "Workflow ID", + "action.generate": "Generate", + "action.clear": "Clear", + "action.refresh": "Refresh", + "weekday.monShort": "Mon", + "weekday.tueShort": "Tue", + "weekday.wedShort": "Wed", + "weekday.thuShort": "Thu", + "weekday.friShort": "Fri", + "weekday.satShort": "Sat", + "weekday.sunShort": "Sun", "group.core": "Core", "group.media": "Media", "group.time": "Time", @@ -1116,6 +1511,10 @@ var N = { "sort.sizeAsc": "Size (small)", "status.checking": "Checking...", "status.ready": "Ready", + "status.loading": "Loading", + "status.disabled": "Disabled", + "status.na": "N/A", + "status.generating": "Generating...", "status.scanning": "Scanning...", "status.error": "Error", "status.capabilities": "Capabilities", @@ -1133,6 +1532,8 @@ var N = { "status.available": "available", "status.missing": "missing", "status.path": "Path", + "state.on": "on", + "state.off": "off", "status.pathAuto": "auto / not configured", "status.noAssets": "No assets indexed yet ({scope})", "status.clickToScan": "Click the dot to start a scan", @@ -1271,7 +1672,19 @@ var N = { "viewer.noWorkflow": "No workflow data", "viewer.noMetadata": "No metadata available", "viewer.copySuccess": "Copied to clipboard!", + "viewer.copySuccessShort": "Copied!", "viewer.copyFailed": "Failed to copy", + "viewer.mode": "Viewer mode", + "viewer.mode.simple": "Simple", + "viewer.mode.abCompare": "A/B Compare", + "viewer.mode.sideBySide": "Side-by-side", + "viewer.mode.grid": "Grid", + "viewer.pinSlots": "Pin slots A/B/C/D", + "viewer.loadingGenerationData": "Loading generation data...", + "viewer.errorLoadingMetadata": "Error Loading Metadata", + "viewer.noGenerationDataFile": "No generation data found for this file.", + "viewer.metadataErrorWithCode": "{message}\n\nCode: {code}\nClick to retry.", + "viewer.metadataErrorRetry": "{message}\n\nClick to retry.", "video.controls": "Video controls", "video.previewControls": "Video preview controls", "video.playPause": "Play/Pause", @@ -1319,6 +1732,193 @@ var N = { "sidebar.date": "Date", "sidebar.size": "Size", "sidebar.genTime": "Generation time", + "sidebar.fileInfo.title": "File Info", + "sidebar.fileInfo.dimensionsTooltip": "Image/video resolution in pixels", + "sidebar.fileInfo.duration": "Duration", + "sidebar.fileInfo.durationTooltip": "Video duration", + "sidebar.fileInfo.fpsTooltip": "Native frame rate", + "sidebar.fileInfo.length": "Length", + "sidebar.fileInfo.frames": "{count} frames", + "sidebar.fileInfo.lengthTooltip": "Total frame count", + "sidebar.fileInfo.generationTime": "Generation Time", + "sidebar.fileInfo.generationTimeTooltip": "Time taken to generate this asset (workflow execution time)", + "sidebar.fileInfo.time": "Time", + "sidebar.fileInfo.dateTooltip": "File creation/generation date", + "sidebar.fileInfo.timeTooltip": "File creation/generation time", + "sidebar.fileInfo.fileSize": "File Size", + "sidebar.fileInfo.fileSizeTooltip": "File size on disk", + "sidebar.fileInfo.assetId": "Asset ID", + "sidebar.fileInfo.assetIdTooltip": "Internal database asset identifier", + "sidebar.fileInfo.jobId": "Job ID", + "sidebar.fileInfo.jobIdTooltip": "Workflow execution job identifier (prompt_id)", + "sidebar.fileInfo.sourceNode": "Source Node", + "sidebar.fileInfo.sourceNodeTooltip": "ComfyUI node id that produced this file", + "sidebar.fileInfo.nodeType": "Node Type", + "sidebar.fileInfo.nodeTypeTooltip": "ComfyUI node class that produced this file", + "sidebar.fileInfo.workflowId": "Workflow ID", + "sidebar.fileInfo.workflowIdTooltip": "ComfyUI workflow identifier (from workflow.id in extra_data)", + "sidebar.folder.details": "Folder Details", + "sidebar.folder.name": "Name", + "sidebar.folder.path": "Path", + "sidebar.folder.folders": "Folders", + "sidebar.folder.files": "Files", + "sidebar.folder.created": "Created", + "sidebar.folder.modified": "Modified", + "sidebar.folder.note": "Note", + "sidebar.folder.scanTruncated": "Scan was truncated for performance", + "sidebar.generation.title": "Generation", + "sidebar.generation.workflowEngine": "Workflow engine: {value}", + "sidebar.generation.apiProvider": "API provider: {value}", + "sidebar.generation.override": "Override", + "sidebar.generation.overrideTooltip": "This field was forced by Majoor Gen Info Override", + "sidebar.generation.metadataTruncated": "Metadata Truncated", + "sidebar.generation.metadataTruncatedBody": "Generation data is incomplete because it exceeded the size limit.", + "sidebar.generation.generationData": "Generation Data", + "sidebar.generation.mediaOnlyPipeline": "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters.", + "sidebar.generation.promptPipeline": "Prompt Pipeline ({count} variants)", + "sidebar.generation.promptN": "Prompt {n}", + "sidebar.generation.positive": "POSITIVE", + "sidebar.generation.negative": "NEGATIVE", + "sidebar.generation.positivePrompt": "Positive Prompt", + "sidebar.generation.negativePrompt": "Negative Prompt", + "sidebar.generation.promptAlignment": "Prompt Alignment", + "sidebar.generation.promptAlignmentTooltip": "How closely the generated image matches the prompt (SigLIP2 score)", + "sidebar.generation.aiCaptionTooltip": "AI caption generated by Florence-2", + "sidebar.generation.copyCaptionTooltip": "Click to copy caption", + "sidebar.generation.aiCaptionDisabled": "AI caption controls are disabled", + "sidebar.generation.aiDisabledEnv": "AI features are disabled (enable vector search env var).", + "sidebar.generation.aiDisabledSettings": "AI features are disabled in settings.", + "sidebar.generation.imageDescription": "Image Description", + "sidebar.generation.noImageDescription": "No image description yet.", + "sidebar.generation.lyrics": "Lyrics", + "sidebar.generation.pipeline": "Generation Pipeline", + "sidebar.generation.stageBase": "Base", + "sidebar.generation.stageTextToImage": "Text-to-Image", + "sidebar.generation.stageImageToImage": "Image-to-Image", + "sidebar.generation.stageInpaint": "Inpaint", + "sidebar.generation.stageUpscale": "Upscale", + "sidebar.generation.stageRefine": "Refine", + "sidebar.generation.stageRefineUpscale": "Refine / Upscale", + "sidebar.generation.stagePassN": "Pass {n}", + "sidebar.generation.modelBranches": "Model Branches", + "sidebar.generation.highNoise": "High Noise", + "sidebar.generation.lowNoise": "Low Noise", + "sidebar.generation.loraStack": "LoRA Stack", + "sidebar.generation.modelLora": "Model & LoRA", + "sidebar.generation.model": "Model", + "sidebar.generation.models": "Models", + "sidebar.generation.sampling": "Sampling", + "sidebar.generation.audio": "Audio", + "sidebar.generation.image": "Image", + "sidebar.generation.notes": "Notes", + "sidebar.generation.ttsInstruction": "TTS Instruction", + "sidebar.generation.seed": "Seed", + "sidebar.generation.copySeedTooltip": "Click to copy seed: {seed}", + "sidebar.generation.sourceFiles": "Source Files", + "sidebar.generation.customInfoN": "Custom Info {n}", + "sidebar.generation.checkpoint": "Checkpoint", + "sidebar.generation.checkpointN": "Checkpoint {n}", + "sidebar.generation.upscaler": "Upscaler", + "sidebar.generation.loras": "LoRAs", + "sidebar.generation.sampler": "Sampler", + "sidebar.generation.steps": "Steps", + "sidebar.generation.cfgScale": "CFG Scale", + "sidebar.generation.cfgHighNoise": "CFG High Noise", + "sidebar.generation.cfgLowNoise": "CFG Low Noise", + "sidebar.generation.scheduler": "Scheduler", + "sidebar.generation.denoise": "Denoise", + "sidebar.generation.narratorVoice": "Narrator Voice", + "sidebar.generation.language": "Language", + "sidebar.generation.repetitionPenalty": "Repetition Penalty", + "sidebar.generation.maxNewTokens": "Max New Tokens", + "sidebar.generation.device": "Device", + "sidebar.generation.voicePreset": "Voice Preset", + "sidebar.generation.compileMode": "Compile Mode", + "sidebar.generation.torchCompile": "Torch Compile", + "sidebar.generation.cudaGraphs": "CUDA Graphs", + "sidebar.generation.xVectorOnly": "X-Vector Only", + "sidebar.generation.chunking": "Chunking", + "sidebar.generation.maxCharsChunk": "Max Chars/Chunk", + "sidebar.generation.chunkMethod": "Chunk Method", + "sidebar.generation.silenceBetweenChunks": "Silence Between Chunks (ms)", + "sidebar.generation.audioCache": "Audio Cache", + "sidebar.generation.batchSize": "Batch Size", + "sidebar.generation.lyricsStrength": "Lyrics Strength", + "sidebar.generation.clipSkip": "Clip Skip", + "sidebar.generation.workflowNotes": "Workflow Notes", + "sidebar.generation.temperature": "Temperature", + "sidebar.generation.dtype": "Dtype", + "sidebar.generation.attention": "Attention", + "workflowSidebar.nodes": "Nodes", + "workflowSidebar.links": "Links", + "workflowSidebar.groups": "Groups", + "workflowSidebar.close": "Close sidebar", + "workflowSidebar.graphMap": "Graph Map", + "workflowSidebar.comfyWorkflow": "ComfyUI Workflow", + "workflowSidebar.workflowNodes": "Workflow Nodes", + "workflowSidebar.moreNodes": "+{count} more nodes", + "workflowSidebar.sourceSynthetic": "Synthetic", + "workflowSidebar.sourceEmbedded": "Embedded", + "workflowSidebar.sizeCompact": "Compact", + "workflowSidebar.sizeComfort": "Comfort", + "workflowSidebar.sizeExpanded": "Expanded", + "workflowSidebar.minimapSizeTitle": "{label} minimap", + "workflowSidebar.nodeLabels": "Node Labels", + "workflowSidebar.nodeColors": "Node Colors", + "workflowSidebar.showLinks": "Show Links", + "workflowSidebar.showFramesGroups": "Show Frames/Groups", + "workflowSidebar.renderBypassState": "Render Bypass State", + "workflowSidebar.renderErrorState": "Render Error State", + "workflowSidebar.showViewport": "Show Viewport", + "workflowSidebar.minimapHint": "Click/drag to navigate - wheel to zoom", + "workflowSidebar.showRawJson": "Show raw JSON", + "genInfoOverride.autoFillFromWorkflow": "Auto fill from workflow", + "genInfoOverride.pick": "Pick", + "genInfoOverride.pickField": "Pick {field}", + "genInfoOverride.pickFromWorkflow": "Pick Gen Info from workflow", + "model3d.controlHint": "Rotate: left drag Pan: right drag Zoom: wheel", + "model3d.viewportAction": "3D viewport action", + "model3d.preview": "3D preview", + "model3d.unavailable": "3D viewer unavailable", + "model3d.background": "Background", + "model3d.material": "Material", + "model3d.skeleton": "Skeleton", + "model3d.lights": "Lights", + "model3d.intensity": "Intensity", + "model3d.play": "Play", + "model3d.pause": "Pause", + "model3d.playPause": "Play / Pause", + "model3d.playbackSpeed": "Playback speed", + "model3d.reset": "Reset", + "model3d.resetView": "Reset 3D view", + "model3d.grid": "Grid", + "model3d.toggleGrid": "Toggle grid", + "model3d.persp": "Persp", + "model3d.ortho": "Ortho", + "model3d.switchCamera": "Switch perspective / orthographic", + "model3d.settings": "Settings", + "model3d.downloadFile": "Download {file}", + "badge.collisionName": "Name: {name}", + "badge.collisionPaths": "Paths:", + "badge.collisionSelect": "Click to select collisions in current view", + "badge.workflow.pendingParsing": "Pending: parsing metadata...", + "badge.workflow.complete": "Complete: workflow + generation data detected", + "badge.workflow.partialWorkflowOnly": "Partial: workflow only (generation data missing)", + "badge.workflow.partialGenerationOnly": "Partial: generation data only (workflow missing)", + "badge.workflow.none": "None: no workflow or generation data found", + "badge.workflow.pendingNotParsed": "Pending: metadata not parsed yet", + "badge.workflow.enrichmentQueued": "Pending: database metadata enrichment in progress ({count} queued)", + "badge.workflow.enrichment": "Pending: database metadata enrichment in progress", + "badge.workflow.aiTooltip": "{title}\nAI: {ai}\nClick to rescan this file", + "badge.workflow.tooltip": "{title}\nClick to rescan this file", + "badge.ai.vectorIndexed": "vector indexed", + "badge.ai.tagSuggestions": "AI tag suggestions", + "badge.ai.enhancedPrompt": "enhanced prompt", + "badge.ai.indexed": "indexed", + "badge.rating": "Rating: {rating} star{plural}", + "badge.generationTimeMinutes": "Generation time: {minutes} minutes ({seconds}s)", + "badge.generationTimeSeconds": "Generation time: {seconds} seconds", + "badge.tags": "Tags: {tags}", "ctx.openViewer": "Open in viewer", "ctx.loadWorkflow": "Load workflow", "ctx.copyPath": "Copy path", @@ -1352,6 +1952,7 @@ var N = { "dialog.yes": "Yes", "dialog.no": "No", "dialog.ok": "OK", + "dialog.close": "Close", "dialog.prompt": "Prompt", "dialog.choiceTypeNumber": "Type a number:", "dialog.delete.title": "Delete file?", @@ -1578,6 +2179,9 @@ var N = { "tooltip.openMessages": "Messages et nouveautes", "tooltip.openMessagesUnread": "Messages ({count} non lus)", "tooltip.markMessagesRead": "Marquer tous les messages comme lus", + "tooltip.noAssetsDay": "Aucun asset ce jour", + "tooltip.assetsDaySingular": "{count} asset", + "tooltip.assetsDayPlural": "{count} assets", "tooltip.previewStreamOff": "Preview KSampler : OFF - cliquer pour afficher les images de denoising pendant l'execution", "tooltip.previewStreamOn": "Preview KSampler : ON - affiche les images de denoising pendant l'execution", "tooltip.nodeStreamOff": "Node Stream : OFF - cliquer pour suivre les previews du noeud selectionne, dont les canvas live ImageOps", @@ -1587,7 +2191,228 @@ var N = { "tooltip.queueStop": "Arreter la generation", "tooltip.noUnreadMessages": "Aucun message non lu", "label.toastHistory": "Historique", + "label.sameWorkflow": "Generes avec le meme workflow", "tooltip.tab.similar": "Parcourir les trouvailles similaires courantes", + "tooltip.filterWorkflowId": "Filtrer les assets generes depuis le meme workflow embarque", + "placeholder.workflowId": "Workflow ID", + "action.copy": "Copier", + "action.generate": "Generer", + "action.clickToCopy": "Cliquer pour copier", + "action.clear": "Effacer", + "action.refresh": "Rafraichir", + "status.loading": "Chargement", + "status.disabled": "Desactive", + "status.na": "N/A", + "status.generating": "Generation...", + "status.unavailable": "Indisponible", + "state.on": "on", + "state.off": "off", + "viewer.copySuccessShort": "Copie !", + "viewer.loadingGenerationData": "Chargement des donnees de generation...", + "viewer.errorLoadingMetadata": "Erreur de chargement des metadonnees", + "viewer.noGenerationDataFile": "Aucune donnee de generation trouvee pour ce fichier.", + "viewer.metadataErrorWithCode": "{message}\n\nCode : {code}\nCliquer pour reessayer.", + "viewer.metadataErrorRetry": "{message}\n\nCliquer pour reessayer.", + "sidebar.fileInfo.title": "Infos fichier", + "sidebar.fileInfo.dimensionsTooltip": "Resolution image/video en pixels", + "sidebar.fileInfo.duration": "Duree", + "sidebar.fileInfo.durationTooltip": "Duree de la video", + "sidebar.fileInfo.fpsTooltip": "Frequence d'image native", + "sidebar.fileInfo.length": "Longueur", + "sidebar.fileInfo.frames": "{count} frames", + "sidebar.fileInfo.lengthTooltip": "Nombre total de frames", + "sidebar.fileInfo.generationTime": "Temps de generation", + "sidebar.fileInfo.generationTimeTooltip": "Temps necessaire pour generer cet asset (temps d'execution workflow)", + "sidebar.fileInfo.time": "Heure", + "sidebar.fileInfo.dateTooltip": "Date de creation/generation du fichier", + "sidebar.fileInfo.timeTooltip": "Heure de creation/generation du fichier", + "sidebar.fileInfo.fileSize": "Taille fichier", + "sidebar.fileInfo.fileSizeTooltip": "Taille du fichier sur disque", + "sidebar.fileInfo.assetId": "Asset ID", + "sidebar.fileInfo.assetIdTooltip": "Identifiant interne de l'asset en base", + "sidebar.fileInfo.jobId": "Job ID", + "sidebar.fileInfo.jobIdTooltip": "Identifiant du job workflow (prompt_id)", + "sidebar.fileInfo.sourceNode": "Node source", + "sidebar.fileInfo.sourceNodeTooltip": "ID du node ComfyUI qui a produit ce fichier", + "sidebar.fileInfo.nodeType": "Type de node", + "sidebar.fileInfo.nodeTypeTooltip": "Classe du node ComfyUI qui a produit ce fichier", + "sidebar.fileInfo.workflowId": "Workflow ID", + "sidebar.fileInfo.workflowIdTooltip": "Identifiant du workflow ComfyUI (depuis workflow.id dans extra_data)", + "sidebar.folder.details": "Details dossier", + "sidebar.folder.name": "Nom", + "sidebar.folder.path": "Chemin", + "sidebar.folder.folders": "Dossiers", + "sidebar.folder.files": "Fichiers", + "sidebar.folder.created": "Cree", + "sidebar.folder.modified": "Modifie", + "sidebar.folder.note": "Note", + "sidebar.folder.scanTruncated": "Scan tronque pour les performances", + "sidebar.generation.title": "Generation", + "sidebar.generation.workflowEngine": "Moteur workflow : {value}", + "sidebar.generation.apiProvider": "Provider API : {value}", + "sidebar.generation.override": "Override", + "sidebar.generation.overrideTooltip": "Ce champ a ete force par Majoor Gen Info Override", + "sidebar.generation.metadataTruncated": "Metadonnees tronquees", + "sidebar.generation.metadataTruncatedBody": "Les donnees de generation sont incompletes car elles depassent la limite de taille.", + "sidebar.generation.generationData": "Donnees de generation", + "sidebar.generation.mediaOnlyPipeline": "Ce fichier ressemble a une pipeline media-only (ex. LoadVideo/VideoCombine) et ne contient pas de parametres de generation.", + "sidebar.generation.promptPipeline": "Pipeline prompt ({count} variantes)", + "sidebar.generation.promptN": "Prompt {n}", + "sidebar.generation.positive": "POSITIF", + "sidebar.generation.negative": "NEGATIF", + "sidebar.generation.positivePrompt": "Prompt positif", + "sidebar.generation.negativePrompt": "Prompt negatif", + "sidebar.generation.promptAlignment": "Alignement prompt", + "sidebar.generation.promptAlignmentTooltip": "Mesure a quel point l'image generee correspond au prompt (score SigLIP2)", + "sidebar.generation.aiCaptionTooltip": "Caption IA generee par Florence-2", + "sidebar.generation.copyCaptionTooltip": "Cliquer pour copier la caption", + "sidebar.generation.aiCaptionDisabled": "Les controles de caption IA sont desactives", + "sidebar.generation.aiDisabledEnv": "Les fonctions IA sont desactivees (activez la variable d'environnement vector search).", + "sidebar.generation.aiDisabledSettings": "Les fonctions IA sont desactivees dans les parametres.", + "sidebar.generation.imageDescription": "Description image", + "sidebar.generation.noImageDescription": "Aucune description image pour le moment.", + "sidebar.generation.lyrics": "Lyrics", + "sidebar.generation.pipeline": "Pipeline de generation", + "sidebar.generation.stageBase": "Base", + "sidebar.generation.stageTextToImage": "Texte vers image", + "sidebar.generation.stageImageToImage": "Image vers image", + "sidebar.generation.stageInpaint": "Inpaint", + "sidebar.generation.stageUpscale": "Upscale", + "sidebar.generation.stageRefine": "Refine", + "sidebar.generation.stageRefineUpscale": "Refine / Upscale", + "sidebar.generation.stagePassN": "Pass {n}", + "sidebar.generation.modelBranches": "Branches modele", + "sidebar.generation.highNoise": "High Noise", + "sidebar.generation.lowNoise": "Low Noise", + "sidebar.generation.loraStack": "Stack LoRA", + "sidebar.generation.modelLora": "Modele & LoRA", + "sidebar.generation.model": "Modele", + "sidebar.generation.sampling": "Sampling", + "sidebar.generation.audio": "Audio", + "sidebar.generation.image": "Image", + "sidebar.generation.notes": "Notes", + "sidebar.generation.ttsInstruction": "Instruction TTS", + "sidebar.generation.seed": "Seed", + "sidebar.generation.copySeedTooltip": "Cliquer pour copier le seed : {seed}", + "sidebar.generation.sourceFiles": "Fichiers source", + "sidebar.generation.customInfoN": "Info custom {n}", + "sidebar.generation.checkpoint": "Checkpoint", + "sidebar.generation.checkpointN": "Checkpoint {n}", + "sidebar.generation.upscaler": "Upscaler", + "sidebar.generation.loras": "LoRAs", + "sidebar.generation.sampler": "Sampler", + "sidebar.generation.steps": "Steps", + "sidebar.generation.cfgScale": "CFG Scale", + "sidebar.generation.cfgHighNoise": "CFG High Noise", + "sidebar.generation.cfgLowNoise": "CFG Low Noise", + "sidebar.generation.scheduler": "Scheduler", + "sidebar.generation.denoise": "Denoise", + "sidebar.generation.narratorVoice": "Voix narrateur", + "sidebar.generation.language": "Langue", + "sidebar.generation.repetitionPenalty": "Repetition Penalty", + "sidebar.generation.maxNewTokens": "Max New Tokens", + "sidebar.generation.device": "Device", + "sidebar.generation.voicePreset": "Voice Preset", + "sidebar.generation.compileMode": "Compile Mode", + "sidebar.generation.torchCompile": "Torch Compile", + "sidebar.generation.cudaGraphs": "CUDA Graphs", + "sidebar.generation.xVectorOnly": "X-Vector Only", + "sidebar.generation.chunking": "Chunking", + "sidebar.generation.maxCharsChunk": "Max Chars/Chunk", + "sidebar.generation.chunkMethod": "Methode chunk", + "sidebar.generation.silenceBetweenChunks": "Silence entre chunks (ms)", + "sidebar.generation.audioCache": "Cache audio", + "sidebar.generation.batchSize": "Batch Size", + "sidebar.generation.lyricsStrength": "Lyrics Strength", + "sidebar.generation.clipSkip": "Clip Skip", + "sidebar.generation.workflowNotes": "Notes workflow", + "sidebar.generation.temperature": "Temperature", + "sidebar.generation.dtype": "Dtype", + "sidebar.generation.attention": "Attention", + "viewer.mode": "Mode viewer", + "viewer.mode.simple": "Simple", + "viewer.mode.abCompare": "Comparaison A/B", + "viewer.mode.sideBySide": "Cote a cote", + "viewer.mode.grid": "Grille", + "viewer.pinSlots": "Epingler les slots A/B/C/D", + "workflowSidebar.nodes": "Noeuds", + "workflowSidebar.links": "Liens", + "workflowSidebar.groups": "Groupes", + "workflowSidebar.close": "Fermer la sidebar", + "workflowSidebar.graphMap": "Graph Map", + "workflowSidebar.comfyWorkflow": "Workflow ComfyUI", + "workflowSidebar.workflowNodes": "Noeuds du workflow", + "workflowSidebar.moreNodes": "+{count} noeuds en plus", + "workflowSidebar.sourceSynthetic": "Synthetique", + "workflowSidebar.sourceEmbedded": "Integre", + "workflowSidebar.sizeCompact": "Compact", + "workflowSidebar.sizeComfort": "Confort", + "workflowSidebar.sizeExpanded": "Etendu", + "workflowSidebar.minimapSizeTitle": "Mini-map {label}", + "workflowSidebar.nodeLabels": "Labels des noeuds", + "workflowSidebar.nodeColors": "Couleurs des noeuds", + "workflowSidebar.showLinks": "Afficher les liens", + "workflowSidebar.showFramesGroups": "Afficher frames/groupes", + "workflowSidebar.renderBypassState": "Afficher l'etat bypass", + "workflowSidebar.renderErrorState": "Afficher l'etat erreur", + "workflowSidebar.showViewport": "Afficher le viewport", + "workflowSidebar.minimapHint": "Cliquer/glisser pour naviguer - molette pour zoomer", + "workflowSidebar.showRawJson": "Afficher le JSON brut", + "genInfoOverride.autoFillFromWorkflow": "Auto-fill depuis le workflow", + "genInfoOverride.pick": "Choisir", + "genInfoOverride.pickField": "Choisir {field}", + "genInfoOverride.pickFromWorkflow": "Choisir Gen Info depuis le workflow", + "dialog.close": "Fermer", + "model3d.controlHint": "Rotation : drag gauche Pan : drag droit Zoom : molette", + "model3d.viewportAction": "Action viewport 3D", + "model3d.preview": "Preview 3D", + "model3d.unavailable": "Viewer 3D indisponible", + "model3d.background": "Fond", + "model3d.material": "Materiau", + "model3d.skeleton": "Squelette", + "model3d.lights": "Lumieres", + "model3d.intensity": "Intensite", + "model3d.play": "Lecture", + "model3d.pause": "Pause", + "model3d.playPause": "Lecture / Pause", + "model3d.playbackSpeed": "Vitesse de lecture", + "model3d.reset": "Reset", + "model3d.resetView": "Reset vue 3D", + "model3d.grid": "Grille", + "model3d.toggleGrid": "Afficher/masquer la grille", + "model3d.persp": "Persp", + "model3d.ortho": "Ortho", + "model3d.switchCamera": "Basculer perspective / orthographique", + "model3d.settings": "Parametres", + "model3d.downloadFile": "Telecharger {file}", + "badge.collisionName": "Nom : {name}", + "badge.collisionPaths": "Chemins :", + "badge.collisionSelect": "Cliquer pour selectionner les collisions dans la vue courante", + "badge.workflow.pendingParsing": "En attente : parsing des metadonnees...", + "badge.workflow.complete": "Complet : workflow + donnees de generation detectes", + "badge.workflow.partialWorkflowOnly": "Partiel : workflow seulement (donnees de generation manquantes)", + "badge.workflow.partialGenerationOnly": "Partiel : donnees de generation seulement (workflow manquant)", + "badge.workflow.none": "Aucun : aucun workflow ou donnees de generation trouves", + "badge.workflow.pendingNotParsed": "En attente : metadonnees pas encore parsees", + "badge.workflow.enrichmentQueued": "En attente : enrichissement des metadonnees en base ({count} en file)", + "badge.workflow.enrichment": "En attente : enrichissement des metadonnees en base", + "badge.workflow.aiTooltip": "{title}\nIA : {ai}\nCliquer pour rescanner ce fichier", + "badge.workflow.tooltip": "{title}\nCliquer pour rescanner ce fichier", + "badge.ai.vectorIndexed": "vecteur indexe", + "badge.ai.tagSuggestions": "suggestions de tags IA", + "badge.ai.enhancedPrompt": "prompt enrichi", + "badge.ai.indexed": "indexe", + "badge.rating": "Rating : {rating} etoile{plural}", + "badge.generationTimeMinutes": "Temps de generation : {minutes} minutes ({seconds}s)", + "badge.generationTimeSeconds": "Temps de generation : {seconds} secondes", + "badge.tags": "Tags : {tags}", + "weekday.monShort": "Lun", + "weekday.tueShort": "Mar", + "weekday.wedShort": "Mer", + "weekday.thuShort": "Jeu", + "weekday.friShort": "Ven", + "weekday.satShort": "Sam", + "weekday.sunShort": "Dim", "setting.ai.vector.enabled.name": "Activer la recherche semantique IA", "setting.ai.vector.enabled.desc": "Active la recherche semantique basee sur CLIP. Desactivez pour une recherche par mots-cles uniquement.", "setting.viewer.pauseExecution.name": "Majoor : Pause du viewer principal pendant l'execution", @@ -1752,7 +2577,7 @@ var N = { "msg.newVersionDetail": "La version {latest} est disponible. Version installée : {current}.", "tooltip.starGithub": "Ouvrir GitHub et mettre une etoile" } -}, Re = Object.freeze({ +}, vt = Object.freeze({ "en-US": "English", "fr-FR": "Français", "zh-CN": "Chinese (Simplified)", @@ -1802,43 +2627,43 @@ var N = { "ro-RO", "el-GR" ].forEach((e) => { - R[e] || (R[e] = {}); + X[e] || (X[e] = {}); }); -var z = !1, ze = null; -function Be(e) { - z || (z = !0, Object.entries(e || {}).forEach(([e, t]) => { - R[e] = { - ...R[e] || {}, +var Z = !1, yt = null; +function bt(e) { + Z || (Z = !0, Object.entries(e || {}).forEach(([e, t]) => { + X[e] = { + ...X[e] || {}, ...t || {} }; - }), Ve()); + }), xt()); } -function Ve() { - let e = R["en-US"] || {}; - Object.keys(R).forEach((t) => { - t !== "en-US" && (R[t] = { +function xt() { + let e = X["en-US"] || {}; + Object.keys(X).forEach((t) => { + t !== "en-US" && (X[t] = { ...e, - ...R[t] || {} + ...X[t] || {} }); }); } -function He() { - return z ? Promise.resolve() : (ze ||= import("./i18n.generated-DMwEk0Tb.js").then(({ GENERATED_TRANSLATIONS: e }) => { - Be(e); +function St() { + return Z ? Promise.resolve() : (yt ||= import("./i18n.generated-DMwEk0Tb.js").then(({ GENERATED_TRANSLATIONS: e }) => { + bt(e); }).catch((e) => { - console.warn("[Majoor i18n] Failed to load generated translations:", e), Ve(); - }), ze); + console.warn("[Majoor i18n] Failed to load generated translations:", e), xt(); + }), yt); } -Ve(); -function B(e) { - if (!e) return P; +xt(); +function Q(e) { + if (!e) return K; let t = String(e || "").trim(), n = t.toLowerCase(); - return Le[n] ? Le[n] : R[t] ? t : P; + return _t[n] ? _t[n] : X[t] ? t : K; } -function Ue() { +function Ct() { try { - for (let e of Ne) { - let t = String(N.get(e) || "").trim(); + for (let e of pt) { + let t = String(G.get(e) || "").trim(); if (t) return t; } } catch (e) { @@ -1846,16 +2671,16 @@ function Ue() { } return ""; } -function We(e) { +function wt(e) { try { - N.set(Ne[0], e), N.set(Ne[1], e); + G.set(pt[0], e), G.set(pt[1], e); } catch (e) { console.debug?.(e); } } -function Ge() { +function Tt() { try { - let e = String(N.get(Pe) || "").trim().toLowerCase(); + let e = String(G.get(mt) || "").trim().toLowerCase(); return e ? ![ "0", "false", @@ -1867,14 +2692,14 @@ function Ge() { } return !0; } -function Ke(e) { +function Et(e) { try { - N.set(Pe, e ? "1" : "0"); + G.set(mt, e ? "1" : "0"); } catch (e) { console.debug?.(e); } } -function qe(e) { +function Dt(e) { let t = [], n = (e) => { if (typeof e != "string") return; let n = e.trim(); @@ -1886,10 +2711,10 @@ function qe(e) { "Comfy.LocaleCode", "ComfyUI.Locale", "ComfyUI.Frontend.Locale" - ]) n(me(e, t)); + ]) n(Ae(e, t)); return n(e?.ui?.locale), n(e?.locale), n(e?.ui?.i18n?.locale), t; } -function Je() { +function Ot() { let e = [], t = (t) => { if (typeof t != "string") return; let n = t.trim(); @@ -1911,85 +2736,85 @@ function Je() { } return e; } -function Ye() { +function kt() { try { if (typeof document < "u" && document.documentElement) { - let e = Ie.has(F); + let e = gt.has(q); document.documentElement.dir = e ? "rtl" : "ltr"; } } catch (e) { console.debug?.(e); } } -var Xe = (e) => { +var At = (e) => { try { - let t = Ge(), n = Ue(), r = B(n), i = () => { - let t = qe(e); + let t = Tt(), n = Ct(), r = Q(n), i = () => { + let t = Dt(e); for (let e of t) { - let t = B(e); - if (R[t]) return V(t), !0; + let t = Q(e); + if (X[t]) return $(t), !0; } return !1; }; if (t) { if (i()) return; - if (n && R[r]) { - V(r); + if (n && X[r]) { + $(r); return; } - if (R[F]) return; - V(P); + if (X[q]) return; + $(K); return; } - if (n && R[r]) { - V(r); + if (n && X[r]) { + $(r); return; } if (i()) return; - let a = Je(); + let a = Ot(); for (let e of a) { - let t = B(e); - if (R[t]) { - V(t); + let t = Q(e); + if (X[t]) { + $(t); return; } } - V(P); + $(K); } catch (e) { - console.warn("[Majoor i18n] Failed to detect language:", e), V(P); + console.warn("[Majoor i18n] Failed to detect language:", e), $(K); } -}, V = (e) => { - R[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${P}`), e = P), F !== e && (F = e, We(e), Ye(), e !== P && !z && He().then(() => { - Array.from(Me).forEach((t) => { +}, $ = (e) => { + X[e] || (console.warn(`[Majoor i18n] Unknown language: ${e}, falling back to ${K}`), e = K), q !== e && (q = e, wt(e), kt(), e !== K && !Z && St().then(() => { + Array.from(ft).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } }); - }), Array.from(Me).forEach((t) => { + }), Array.from(ft).forEach((t) => { try { t(e); } catch (e) { console.debug?.(e); } })); -}, Ze = (e) => { - Ke(!!e); -}, Qe = (e) => { +}, jt = (e) => { + Et(!!e); +}, Mt = (e) => { try { - L &&= (clearInterval(L), null), typeof window < "u" && window.__MJR_COMFY_LANG_SYNC_TIMER__ && (clearInterval(window.__MJR_COMFY_LANG_SYNC_TIMER__), window.__MJR_COMFY_LANG_SYNC_TIMER__ = null); + 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); } catch (e) { console.debug?.(e); } - L = setInterval(() => { + Y = setInterval(() => { try { - if (!Ge()) return; - let t = qe(e); + if (!Tt()) return; + let t = Dt(e); for (let e of t) { - let t = B(e); - if (R[t] && t !== F) { - V(t); + let t = Q(e); + if (X[t] && t !== q) { + $(t); return; } } @@ -1998,35 +2823,35 @@ var Xe = (e) => { } }, 2e3); try { - typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = L); + typeof window < "u" && (window.__MJR_COMFY_LANG_SYNC_TIMER__ = Y); } catch (e) { console.debug?.(e); } -}, $e = () => F, et = () => Object.keys(R).map((e) => ({ +}, Nt = () => q, Pt = () => Object.keys(X).map((e) => ({ code: e, - name: Re[e] || e -})), H = (e, t, n) => { - let r = R[F] || R[P], i = R[P], a = r[e] || i[e]; + name: vt[e] || e +})), Ft = (e, t, n) => { + let r = X[q] || X[K], i = X[K], a = r[e] || i[e]; if (!a) { - let n = `${F}:${String(e || "")}`; - if (!I.has(n)) { - if (I.size >= Fe) { - let e = Math.floor(Fe * .2), t = I.values(); + let n = `${q}:${String(e || "")}`; + if (!J.has(n)) { + if (J.size >= ht) { + let e = Math.floor(ht * .2), t = J.values(); for (let n = 0; n < e; n++) { let e = t.next().value; - e && I.delete(e); + e && J.delete(e); } } - I.add(n); + J.add(n); try { - console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${F}"`); + console.warn(`[Majoor i18n] Missing translation key "${e}" for locale "${q}"`); } 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: F + locale: q } })); } catch (e) { console.debug?.(e); @@ -2038,1319 +2863,92 @@ var Xe = (e) => { return o && typeof o == "object" && Object.entries(o).forEach(([e, t]) => { a = a.replaceAll(`{${e}}`, String(t)); }), a; -}, tt = "mjr_toast_history_v1", nt = "mjr_toast_history_last_read_v1", rt = 60, it = "mjr:toast-history-changed", U = null; -function W(e) { - return String(e || "").trim(); -} -function at(e) { - let t = W(e).toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : t || "info"; -} -function ot(e) { - let t = Number(e); - return Number.isFinite(t) ? t : null; -} -function st(e) { - if (!e || typeof e != "object") return null; - let t = Number(e.percent), n = Number.isFinite(t) ? Math.max(0, Math.min(100, Math.round(t))) : null, r = Number(e.current), i = Number(e.total), a = Number.isFinite(r) ? Math.max(0, Math.floor(r)) : null, o = Number.isFinite(i) ? Math.max(0, Math.floor(i)) : null, s = Number(e.indexed), c = Number(e.skipped), l = Number(e.errors), u = Number.isFinite(s) ? Math.max(0, Math.floor(s)) : null, d = Number.isFinite(c) ? Math.max(0, Math.floor(c)) : null, f = Number.isFinite(l) ? Math.max(0, Math.floor(l)) : null, p = W(e.label); - return n === null && a === null && o === null && u === null && d === null && f === null && !p ? null : { - percent: n, - current: a, - total: o, - indexed: u, - skipped: d, - errors: f, - label: p - }; -} -function ct(e, t, n) { - return e && t ? `${e}: ${t}` : t || e || n || ""; -} -function lt(e, t = "info", n = null) { - if (!e || typeof e != "object") return null; - let i = W(e.title || e.summary), a = W(e.detail), o = W(e.message || ct(i, a, W(e.fallbackMessage))); - if (!o) return null; - let s = ot(e.durationMs ?? e.duration ?? n), c = Number(e.createdAt), l = Number.isFinite(c) && c > 0 ? c : Date.now(), u = typeof e.persistent == "boolean" ? e.persistent : !(Number.isFinite(s) && (s ?? 0) > 0); - return { - id: W(e.id) || r(`th-${l}-`, 4), - message: o, - title: i, - detail: a, - type: at(e.type || t), - createdAt: l, - durationMs: s, - persistent: u, - source: W(e.source), - trackId: W(e.trackId), - status: W(e.status), - operation: W(e.operation), - progress: st(e.progress), - forceStore: !!e.forceStore, - actionLabel: W(e.actionLabel), - actionUrl: W(e.actionUrl) - }; -} -function ut() { - if (U === null) try { - let e = localStorage.getItem(tt), t = e ? JSON.parse(e) : []; - U = Array.isArray(t) ? t.map((e) => { - if (e && typeof e == "object") return lt(e); - let t = W(e); - return t ? lt({ message: t }) : null; - }).filter(Boolean) : []; - } catch { - U = []; - } -} -function dt() { - try { - localStorage.setItem(tt, JSON.stringify(U)); - } catch {} -} -function ft() { - try { - window.dispatchEvent(new CustomEvent(it)); - } catch {} -} -function pt() { - try { - return Number(localStorage.getItem(nt)) || 0; - } catch { - return 0; - } -} -function mt(e) { - try { - localStorage.setItem(nt, String(Number(e) || 0)); - } catch {} -} -function ht(e, t, n) { - ut(); - let r = lt(e && typeof e == "object" ? e : { - message: W(e), - type: t, - durationMs: n - }, t, n); - if (!r || !r.forceStore && !r.trackId && r.type === "info" && Number.isFinite(r.durationMs) && r.durationMs != null && r.durationMs > 0 && r.durationMs < 2500) return; - let i = String(r.trackId || "").trim(); - if (i) { - let e = U.findIndex((e) => String(e?.trackId || "").trim() === i); - if (e >= 0) { - let t = U[e] || {}; - U.splice(e, 1), r.id = String(t.id || r.id || "").trim() || r.id; - } - } - U.unshift(r), U.length > rt && (U = U.slice(0, rt)), dt(), ft(); -} -function gt() { - return ut(), U.map((e) => ({ ...e })); -} -function _t() { - ut(); - let e = pt(); - return U.filter((t) => t.createdAt > e).length; -} -function vt() { - mt(Date.now()), ft(); -} -function yt() { - ut(), U = [], dt(), mt(Date.now()), ft(); -} +}, It = Object.freeze({ + DEBUG_SAFE_CALL: !1, + DEBUG_SAFE_LISTENERS: !1, + DEBUG_VIEWER: !1, + VIEWER_ALLOW_PAN_AT_ZOOM_1: !1, + VIEWER_DISABLE_WEBGL_VIDEO: !1, + VIEWER_DISABLE_WEBGL_AUDIO: !1, + VIEWER_VIDEO_GRADE_THROTTLE_FPS: 12, + VIEWER_AUDIO_VISUALIZER_MODE: "artistic", + VIEWER_AUDIO_VIS_FPS: 18, + VIEWER_SCOPES_FPS: 8, + GRID_MIN_SIZE: 120, + FEED_GRID_MIN_SIZE: 120, + GRID_GAP: 10, + GRID_SHOW_BADGES_EXTENSION: !0, + GRID_SHOW_BADGES_RATING: !0, + GRID_SHOW_BADGES_TAGS: !0, + GRID_SHOW_DETAILS: !0, + GRID_SHOW_DETAILS_FILENAME: !0, + GRID_SHOW_DETAILS_DATE: !0, + GRID_SHOW_DETAILS_DIMENSIONS: !0, + GRID_SHOW_DETAILS_GENTIME: !0, + GRID_SHOW_HOVER_INFO: !0, + GRID_SHOW_WORKFLOW_DOT: !0, + GRID_VIDEO_AUTOPLAY_MODE: "hover", + FEED_SHOW_INFO: !0, + FEED_SHOW_FILENAME: !1, + FEED_SHOW_DIMENSIONS: !0, + FEED_SHOW_DATE: !0, + FEED_SHOW_GENTIME: !0, + FEED_SHOW_WORKFLOW_DOT: !1, + FEED_SHOW_BADGES_EXTENSION: !0, + FEED_SHOW_BADGES_RATING: !0, + FEED_SHOW_BADGES_TAGS: !0, + UI_CARD_HOVER_COLOR: "#3D3D3D", + UI_CARD_SELECTION_COLOR: "#4A90E2", + UI_RATING_COLOR: "#FF9500", + UI_TAG_COLOR: "#4A90E2", + BADGE_STAR_COLOR: "#FFD45A", + BADGE_IMAGE_COLOR: "#2196F3", + BADGE_VIDEO_COLOR: "#9C27B0", + BADGE_AUDIO_COLOR: "#FF9800", + BADGE_MODEL3D_COLOR: "#4CAF50", + BADGE_DUPLICATE_ALERT_COLOR: "#FF1744", + DEFAULT_PAGE_SIZE: 80, + MAX_PAGE_SIZE: 2e3, + PREFETCH_NEXT_PAGE: !0, + PREFETCH_NEXT_PAGE_DELAY_MS: 700, + SEARCH_DEFAULT_LIMIT: 500, + INFINITE_SCROLL_ENABLED: !0, + INFINITE_SCROLL_ROOT_MARGIN: "800px", + INFINITE_SCROLL_THRESHOLD: .01, + BOTTOM_GAP_PX: 80, + STATUS_POLL_INTERVAL: 5e3, + AUTO_SCAN_ON_STARTUP: !1, + EXECUTION_GROUPING_ENABLED: !0, + EXECUTION_IDLE_GRACE_MS: 6e3, + DEFER_GRID_FETCH_DURING_EXECUTION: !1, + VIEWER_PAUSE_DURING_EXECUTION: !0, + FLOATING_VIEWER_PAUSE_DURING_EXECUTION: !1, + MFV_SIDEBAR_POSITION: "right", + MFV_LIVE_DEFAULT: !0, + MFV_PREVIEW_DEFAULT: !0, + MFV_LIVE_AUTO_OPEN: !1, + MFV_PREVIEW_AUTO_OPEN: !1, + MFV_NODE_STREAM_AUTO_OPEN: !1, + MFV_PREVIEW_METHOD: "auto", + RT_HYDRATE_CONCURRENCY: 2, + RT_HYDRATE_QUEUE_MAX: 100, + RT_HYDRATE_SEEN_MAX: 2e4, + RT_HYDRATE_PRUNE_BUDGET: 250, + RT_HYDRATE_SEEN_TTL_MS: 600 * 1e3, + VIEWER_META_TTL_MS: 3e4, + VIEWER_META_MAX_ENTRIES: 500, + WORKFLOW_MINIMAP_ENABLED: !0, + WATCHER_DEBOUNCE_MS: 3e3, + WATCHER_DEDUPE_TTL_MS: 3e3, + WATCHER_MAX_PENDING: 500, + WATCHER_MIN_SIZE: 100, + WATCHER_MAX_SIZE: 4294967296, + DB_TIMEOUT_MS: 5e3, + DB_MAX_CONNECTIONS: 10, + DB_QUERY_TIMEOUT_MS: 1e3, + SEARCH_REQUEST_LIMIT: 500, + DELETE_CONFIRMATION: !0, + DEBUG_VERBOSE_ERRORS: !1 +}), Lt = { ...It }; //#endregion -//#region ui/app/toast.ts -function bt(e) { - let t = String(e || "info").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : t === "success" || t === "warning" || t === "error" ? t : "info"; -} -function xt(e) { - if (typeof e == "string") return e; - if (e && typeof e == "object") { - let t = String(e.summary || "").trim(), n = String(e.detail || e.message || "").trim(); - if (t && n) return `${t}: ${n}`; - if (n) return n; - if (t) return t; - } - try { - return String(e?.message || e || "").trim() || "Unknown message"; - } catch { - return "Unknown message"; - } -} -function St(e, t, n, r) { - let i = r?.history && typeof r.history == "object" ? r.history : null, a = { - persistent: !(Number.isFinite(Number(n)) && Number(n) > 0), - source: String(i?.source || r?.source || "").trim(), - trackId: String(i?.trackId || "").trim(), - status: String(i?.status || "").trim(), - operation: String(i?.operation || "").trim(), - progress: i?.progress && typeof i.progress == "object" ? { ...i.progress } : null, - forceStore: !!i?.forceStore, - actionLabel: String(i?.actionLabel || "").trim(), - actionUrl: String(i?.actionUrl || "").trim() - }; - return e && typeof e == "object" ? (a.title = String(i?.title || e.summary || "").trim(), a.detail = String(i?.detail || e.detail || e.message || "").trim(), a.message = xt(e), a) : (a.title = String(i?.title || "").trim(), a.detail = String(i?.detail || "").trim(), a.message = xt(e), a); -} -function Ct(e, t = "info", n, r) { - try { - let i = St(e, t, n, r); - i.forceStore = !0, ht(i, t, n ?? void 0); - } catch {} -} -function wt(e) { - switch (e) { - case "success": return 2e3; - case "info": return 3e3; - case "warning": return 4e3; - case "error": return 5e3; - default: return 5e3; - } -} -function Tt(e) { - if (typeof e != "string") return e; - let t = e.trim(), n = { - "Failed to update rating": H("toast.ratingUpdateFailed", "Failed to update rating"), - "Error updating rating": H("toast.ratingUpdateError", "Error updating rating"), - "Rating cleared": H("toast.ratingCleared", "Rating cleared"), - "Failed to update tags": H("toast.tagsUpdateFailed", "Failed to update tags"), - "Tags updated": H("toast.tagsUpdated", "Tags updated"), - "Failed to toggle watcher": H("toast.watcherToggleFailed", "Failed to toggle watcher"), - "No valid assets selected.": H("toast.noValidAssetsSelected", "No valid assets selected."), - "Name collision in current view": H("toast.nameCollisionInView", "Name collision in current view"), - "Failed to create collection.": H("toast.failedCreateCollectionDot", "Failed to create collection."), - "Failed to add assets to collection.": H("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), - "Failed to remove from collection.": H("toast.removeFromCollectionFailed", "Failed to remove from collection."), - "Collection created": H("toast.collectionCreated", "Collection created"), - "Added to collection": H("toast.addedToCollection", "Added to collection"), - "Removed from collection": H("toast.removedFromCollection", "Removed from collection"), - "File renamed successfully!": H("toast.fileRenamedSuccess", "File renamed successfully!"), - "Failed to rename file": H("toast.fileRenameFailed", "Failed to rename file"), - "Failed to rename file.": H("toast.fileRenameFailed", "Failed to rename file."), - "File deleted successfully!": H("toast.fileDeletedSuccess", "File deleted successfully!"), - "Failed to delete file.": H("toast.fileDeleteFailed", "Failed to delete file."), - "Failed to delete file. ": H("toast.fileDeleteFailed", "Failed to delete file."), - "File deleted": H("toast.deleted", "File deleted"), - "File renamed": H("toast.renamed", "File renamed"), - "Folder created": H("toast.folderCreated", "Folder created"), - "Folder renamed": H("toast.folderRenamed", "Folder renamed"), - "Folder moved": H("toast.folderMoved", "Folder moved"), - "Folder deleted": H("toast.folderDeleted", "Folder deleted"), - "Failed to create folder": H("toast.createFolderFailed", "Failed to create folder"), - "Failed to rename folder": H("toast.renameFolderFailed", "Failed to rename folder"), - "Failed to move folder": H("toast.moveFolderFailed", "Failed to move folder"), - "Failed to delete folder": H("toast.deleteFolderFailed", "Failed to delete folder"), - "Failed to pin folder": H("toast.pinFolderFailed", "Failed to pin folder"), - "Failed to unpin folder": H("toast.unpinFolderFailed", "Failed to unpin folder"), - "Folder pinned as browser root": H("toast.folderPinnedAsBrowserRoot", "Folder pinned as browser root"), - "Folder added": H("toast.folderAdded", "Folder added"), - "Folder removed": H("toast.folderRemoved", "Folder removed"), - "Folder linked successfully": H("toast.folderLinked", "Folder linked successfully"), - "An error occurred while adding the custom folder": H("toast.errorAddingFolder", "An error occurred while adding the custom folder"), - "An error occurred while removing the custom folder": H("toast.errorRemovingFolder", "An error occurred while removing the custom folder"), - "Failed to add custom folder": H("toast.failedAddFolder", "Failed to add custom folder"), - "Failed to remove custom folder": H("toast.failedRemoveFolder", "Failed to remove custom folder"), - "Native folder browser unavailable. Please enter path manually.": H("toast.nativeBrowserUnavailable", "Native folder browser unavailable. Please enter path manually."), - "Opened in folder": H("toast.openedInFolder", "Opened in folder"), - "Failed to open folder": H("toast.openFolderFailed", "Failed to open folder"), - "Failed to open folder.": H("toast.openFolderFailed", "Failed to open folder."), - "File path copied to clipboard": H("toast.pathCopied", "File path copied to clipboard"), - "Failed to copy path": H("toast.pathCopyFailed", "Failed to copy path"), - "Failed to copy to clipboard": H("toast.copyClipboardFailed", "Failed to copy to clipboard"), - "No file path available for this asset.": H("toast.noFilePath", "No file path available for this asset."), - "Failed to refresh metadata.": H("toast.metadataRefreshFailed", "Failed to refresh metadata."), - "Metadata refreshed": H("toast.metadataRefreshed", "Metadata refreshed"), - "Duplicate analysis started": H("toast.dupAnalysisStarted", "Duplicate analysis started"), - "Tags merged": H("toast.tagsMerged", "Tags merged"), - "Duplicates deleted": H("toast.duplicatesDeleted", "Duplicates deleted"), - "Rescanning file...": H("toast.rescanningFile", "Rescanning file..."), - "Metadata enrichment complete": H("toast.enrichmentComplete", "Metadata enrichment complete"), - "Playback speed is available for video media only": H("toast.playbackVideoOnly", "Playback speed is available for video media only"), - "DB backup saved": H("toast.dbSaveSuccess", "DB backup saved"), - "Failed to save DB backup": H("toast.dbSaveFailed", "Failed to save DB backup"), - "DB restore started": H("toast.dbRestoreStarted", "DB restore started"), - "Failed to restore DB backup": H("toast.dbRestoreFailed", "Failed to restore DB backup"), - "Select a DB backup first": H("toast.dbRestoreSelect", "Select a DB backup first"), - "Stopping running workers": H("toast.dbRestoreStopping", "Stopping running workers"), - "Unlocking and resetting database": H("toast.dbRestoreResetting", "Unlocking and resetting database"), - "Recreating database": H("toast.dbRestoreReplacing", "Recreating database"), - "Replacing database files": H("toast.dbRestoreReplacing", "Replacing database files"), - "Restarting scan": H("toast.dbRestoreRescan", "Restarting scan"), - "Deleting database and rebuilding...": H("toast.dbDeleteTriggered", "Deleting database and rebuilding..."), - "Database deleted and rebuilt. Files are being reindexed.": H("toast.dbDeleteSuccess", "Database deleted and rebuilt. Files are being reindexed."), - "Failed to delete database": H("toast.dbDeleteFailed", "Failed to delete database"), - "Database backup restored": H("toast.dbRestoreSuccess", "Database backup restored"), - "Index reset started. Files will be reindexed in the background.": H("toast.resetStarted", "Index reset started. Files will be reindexed in the background."), - "Failed to reset index": H("toast.resetFailed", "Failed to reset index"), - "Reset triggered: Reindexing all files...": H("toast.resetTriggered", "Reset triggered: Reindexing all files..."), - "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild.": H("toast.resetFailedCorrupt", "Reset failed - database is corrupted. Use the \"Delete DB\" button to force-delete and rebuild."), - "Scan started": H("toast.scanStarted", "Scan started"), - "Scan complete": H("toast.scanComplete", "Scan complete"), - "Scan failed": H("toast.scanFailed", "Scan failed"), - "Permission denied": H("toast.permissionDenied", "Permission denied"), - "Language changed. Reload the page for full effect.": H("toast.languageChanged", "Language changed. Reload the page for full effect."), - "Tag added": H("toast.tagAdded", "Tag added"), - "Tag removed": H("toast.tagRemoved", "Tag removed"), - "Rating saved": H("toast.ratingSaved", "Rating saved"), - "Failed to create collection": H("toast.failedCreateCollection", "Failed to create collection"), - "Failed to delete collection": H("toast.failedDeleteCollection", "Failed to delete collection") - }; - if (n[t]) return n[t]; - let r; - if (r = t.match(/Rating set to (\d+) star(?:s)?/i), r) return H("toast.ratingSetN", "Rating set to {n} stars", { n: Number(r[1]) }); - if (r = t.match(/Downloading (.+?)\.\.\./i), r) return H("toast.downloadingFile", "Downloading {filename}...", { filename: r[1] }); - if (r = t.match(/Playback ([0-9]+(?:\.[0-9]+)?)x/i), r) return H("toast.playbackRate", "Playback {rate}x", { rate: Number(r[1]).toFixed(2) }); - if (r = t.match(/Metadata refreshed(?:\s*(.*))?/i), r) return H("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: r[1] ? " (" + r[1] + ")" : "" }); - if (r = t.match(/Error renaming(?: file)?:\s*(.+)/i), r) return H("toast.errorRenaming", "Error renaming file: {error}", { error: r[1] }); - if (r = t.match(/Error deleting(?: files?| file)?:\s*(.+)/i), r) return H("toast.errorDeleting", "Error deleting file: {error}", { error: r[1] }); - if (r = t.match(/Tag merge failed:\s*(.+)/i), r) return H("toast.tagMergeFailed", "Tag merge failed: {error}", { error: r[1] }); - if (r = t.match(/Delete failed:\s*(.+)/i), r) return H("toast.deleteFailed", "Delete failed: {error}", { error: r[1] }); - if (r = t.match(/Analysis not started:\s*(.+)/i), r) return H("toast.analysisNotStarted", "Analysis not started: {error}", { error: r[1] }); - if (r = t.match(/(\d+)\s+files deleted successfully!/i), r) return H("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: Number(r[1]) }); - if (r = t.match(/(\d+)\s+files deleted,\s+(\d+)\s+failed\./i), r) return H("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { - success: Number(r[1]), - failed: Number(r[2]) - }); - if (r = t.match(/(\d+)\s+files?\s+deleted/i), r) return H("toast.filesDeletedShort", "{n} files deleted", { n: Number(r[1]) }); - if (r = t.match(/(\d+)\s+deleted,\s+(\d+)\s+failed/i), r) return H("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", { - success: Number(r[1]), - failed: Number(r[2]) - }); - if (r = t.match(/^(.+?)\s+copied to clipboard!$/i), r) return H("toast.copiedToClipboardNamed", "{name} copied to clipboard!", { name: r[1] }); - if (r = t.match(/Folder created:\s*(.+)/i), r) return H("toast.folderCreated", "Folder created: {name}", { name: r[1] }); - if (r = t.match(/Failed to create folder:\s*(.+)/i), r) return H("toast.createFolderFailedDetail", "Failed to create folder: {error}", { error: r[1] }); - if (r = t.match(/Failed to rename folder:\s*(.+)/i), r) return H("toast.renameFolderFailedDetail", "Failed to rename folder: {error}", { error: r[1] }); - if (r = t.match(/Failed to move folder:\s*(.+)/i), r) return H("toast.moveFolderFailedDetail", "Failed to move folder: {error}", { error: r[1] }); - if (r = t.match(/Failed to delete folder:\s*(.+)/i), r) return H("toast.deleteFolderFailedDetail", "Failed to delete folder: {error}", { error: r[1] }); - if (r = t.match(/Error removing from collection:\s*(.+)/i), r) return H("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: r[1] }); - if (r = t.match(/^Failed to (.+)$/i), r) { - let e = r[1].toLowerCase(), t = { - "add folder": H("toast.failedAddFolder", "Failed to add custom folder"), - "remove folder": H("toast.failedRemoveFolder", "Failed to remove custom folder"), - "create collection": H("toast.failedCreateCollection", "Failed to create collection"), - "delete collection": H("toast.failedDeleteCollection", "Failed to delete collection") - }; - for (let [n, r] of Object.entries(t)) if (e.includes(n)) return r; - } - return t; -} -function Et(e, t = "info", n, r) { - if (t = bt(t), e = Tt(e), n ??= wt(t), !r?.noHistory) try { - ht(St(e, t, n, r), t, n ?? void 0); - } catch {} - let i = !(Number.isFinite(Number(n)) && Number(n) > 0), a = O(); - try { - let r = ve(a); - if (r && typeof r.add == "function") { - let a = t; - a === "warning" && (a = "warn"); - let o = H("manager.title"), s = e; - if (typeof e == "object" && e?.summary) o = e.summary, s = e.detail || ""; - else if (typeof e != "string") try { - s = e.message || String(e); - } catch (e) { - console.debug?.(e); - } - let c = { - severity: a, - summary: o, - detail: s - }; - i || (c.life = n), r.add(c); - return; - } - } catch (e) { - console.debug("Majoor: extensionManager.toast failed", e); - } - if (a?.ui?.toast) try { - return a.ui.toast(e, t); - } catch (e) { - console.debug("Native app.ui.toast failed", e); - } - console.warn("[Majoor Toast] Native toast API unavailable", { - type: t, - message: xt(e), - duration: i ? 0 : n - }); -} -//#endregion -//#region ui/api/clientAuth.ts -var Dt = 2e3, Ot = 15e3, kt = 8e3, At = "__mjr_write_token", G = "token", jt = null, K = null, Mt = null, q = x({ - ttlMs: Dt, - maxSize: 1 -}); -function Nt() { - try { - return String(sessionStorage?.getItem?.(At) || "").trim(); - } catch { - return ""; - } -} -function Pt(e) { - let t = String(e || "").trim(); - try { - return t ? sessionStorage?.setItem?.(At, t) : sessionStorage?.removeItem?.(At), !0; - } catch { - return !1; - } -} -function Ft() { - try { - let e = localStorage?.getItem?.(a), t = e ? JSON.parse(e) : {}, n = t && typeof t == "object" ? t : {}, r = n?.data && typeof n.data == "object" ? n.data : n; - r?.security && typeof r.security == "object" && String(r.security.apiToken || "").trim() && (r.security.apiToken = "", localStorage?.setItem?.(a, JSON.stringify(n))); - } catch (e) { - console.debug?.(e); - } -} -function It() { - try { - q.delete(G); - } catch (e) { - console.debug?.(e); - } - Pt(""), Ft(); -} -function Lt() { - let e = q.get(G); - if (e !== void 0) return e; - let t = Date.now(), n = Nt(); - if (n) return q.set(G, n, { at: t }), n; - try { - let e = localStorage?.getItem?.(a), n = e ? JSON.parse(e) : null, r = n?.data && typeof n.data == "object" ? n.data : n, i = String(r?.security?.apiToken || "").trim(); - if (i) { - Pt(i); - try { - let e = n && typeof n == "object" ? n : {}, t = e?.data && typeof e.data == "object" ? e.data : e; - t?.security && typeof t.security == "object" && (t.security.apiToken = "", localStorage?.setItem?.(a, JSON.stringify(e)), window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } }))); - } catch (e) { - console.debug?.(e); - } - } - return q.set(G, i, { at: t }), i; - } catch { - return q.set(G, "", { at: t }), ""; - } -} -function Rt(e) { - let t = String(e || "").trim(); - if (!t) return !1; - try { - q.set(G, t), K = null, Pt(t), Ft(); - try { - window?.dispatchEvent?.(new CustomEvent("mjr-settings-changed", { detail: { key: "security.apiToken" } })); - } catch (e) { - console.debug?.(e); - } - return !0; - } catch { - return !1; - } -} -var zt = /^[A-Za-z0-9._\-~+/]+=*$/; -function Bt(e) { - let t = String(e || "").trim(); - return t ? zt.test(t) ? Rt(t) : (console.debug?.("[MJR auth] Rejected malformed security token (invalid characters)"), !1) : !1; -} -function Vt(e = {}) { - K = { - code: String(e?.code || "").trim().toUpperCase(), - error: String(e?.error || "").trim(), - status: Number(e?.status || 0) || 0, - at: Date.now() - }; -} -function Ht() { - let e = K; - if (!e) return null; - let t = Date.now() - (Number(e.at || 0) || 0); - return t < 0 || t > Ot ? (K = null, null) : e; -} -function Ut(e) { - let t = Ht(), n = String(e?.code || "").trim().toUpperCase(), r = String(e?.error || "").trim(), i = String(t?.code || "").trim().toUpperCase(), a = String(t?.error || "").trim().toLowerCase(), o = r.toLowerCase(); - return i === "FORBIDDEN" && (a.includes("already configured") || a.includes("rotate-token")) ? H("toast.writeAuthConfiguredTokenRequired", "Write access requires the Majoor API token already configured on the server. Open Settings -> Security -> API Token and enter the matching token.") : i === "AUTH_REQUIRED" && (a.includes("sign in to comfyui") || a.includes("authenticated comfyui user")) ? H("toast.writeAuthSignInRequired", "Write access is blocked. Sign in to ComfyUI first, then retry so Majoor can bootstrap the remote session token automatically.") : i === "BOOTSTRAP_DISABLED" || i === "AUTH_REQUIRED" && a.includes("bootstrap") || n === "AUTH_REQUIRED" && o.includes("api token") ? H("toast.writeAuthBootstrapHelp", "Write access is blocked. Sign in to ComfyUI and retry so Majoor can bootstrap the remote session automatically, or set a Majoor API token in Settings -> Security.") : ""; -} -function Wt(e) { - let t = String(e || "").trim(); - if (!t) return; - let n = Date.now(), r = Mt; - if (!(r && r.message === t && n - (Number(r.at || 0) || 0) < kt)) { - Mt = { - message: t, - at: n - }; - try { - Et({ - summary: H("toast.writeAuthTitle", "Majoor remote write access"), - detail: t - }, "warning", 6500, { noHistory: !0 }); - } catch (e) { - console.debug?.(e); - } - } -} -function Gt(e) { - let t = String(e?.code || "").trim().toUpperCase(), n = String(e?.error || "").trim().toLowerCase(), r = t === "FORBIDDEN" && n.includes("write operation blocked"); - if (t !== "AUTH_REQUIRED" && !r) return e; - let i = Ut(e); - return i ? (Wt(i), { - ...e, - error: i - }) : e; -} -async function Kt() { - try { - let e = await fetch("/mjr/am/settings/security/bootstrap-token", { - method: "POST", - headers: { - "Content-Type": "application/json", - "X-Requested-With": "XMLHttpRequest" - }, - body: "{}" - }); - if (!(e.headers.get("content-type") || "").includes("application/json")) return Vt({ - code: "INVALID_RESPONSE", - error: `Bootstrap token request returned non-JSON response (${e.status})`, - status: e.status - }), { - ok: !1, - token: !1 - }; - let t = await e.json().catch((e) => (console.debug?.("[MJR auth] JSON parse error:", e), null)); - if (!t || typeof t != "object") return Vt({ - code: "INVALID_RESPONSE", - error: "Bootstrap token response was invalid.", - status: e.status - }), { - ok: !1, - token: !1 - }; - if (!t.ok) return Vt({ - code: t?.code, - error: t?.error, - status: e.status - }), { - ok: !1, - token: !1 - }; - let n = String(t?.data?.token || "").trim(); - return n ? { - ok: Rt(n), - token: !0 - } : (K = null, { - ok: !0, - token: !1 - }); - } catch (e) { - return Vt({ - code: "NETWORK_ERROR", - error: e?.message || "Bootstrap token request failed.", - status: 0 - }), { - ok: !1, - token: !1 - }; - } -} -async function qt({ force: e = !1, allowCookieRefresh: t = !1 } = {}) { - let n = Lt(); - if (n && !e) return n; - let r = { - ok: !1, - token: !1 - }; - jt ||= (async () => { - try { - return await Kt(); - } finally { - jt = null; - } - })(); - try { - r = await jt || r; - } catch (e) { - console.debug?.(e); - } - if (e && r?.ok && !r?.token && n) It(); - else if (e && !r?.ok) { - let e = Ht(), t = String(e?.code || "").trim().toUpperCase(); - (!t || !["NETWORK_ERROR", "INVALID_RESPONSE"].includes(t)) && It(); - } - let i = Lt(); - return !i && t && r?.ok ? !0 : i; -} -function Jt() { - q.clear(); -} -//#endregion -//#region ui/api/clientOps.ts -async function Yt(e) { - return !e || typeof e != "string" ? { - ok: !1, - error: "Missing mode", - code: "INVALID_INPUT" - } : Q("/mjr/am/settings/probe-backend", { mode: e }); -} -async function Xt() { - return Z(n.SETTINGS_METADATA_FALLBACK); -} -async function Zt({ image: e, media: t } = {}) { - return Q(n.SETTINGS_METADATA_FALLBACK, { - image: e, - media: t - }); -} -async function Qt() { - return Z(n.SETTINGS_VECTOR_SEARCH); -} -async function $t(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), Q(n.SETTINGS_VECTOR_SEARCH, t); - } - return Q(n.SETTINGS_VECTOR_SEARCH, { enabled: !!e }); -} -async function en() { - return Z(n.SETTINGS_EXECUTION_GROUPING); -} -async function tn(e = !0) { - return Q(n.SETTINGS_EXECUTION_GROUPING, { enabled: !!e }); -} -async function nn() { - return Z(n.SETTINGS_HUGGINGFACE); -} -async function rn(e = "") { - return Q(n.SETTINGS_HUGGINGFACE, { token: String(e ?? "").trim() }); -} -async function an() { - return Z(n.SETTINGS_AI_LOGGING); -} -async function on(e = !1) { - return Q(n.SETTINGS_AI_LOGGING, { enabled: !!e }); -} -async function sn() { - return Z(n.SETTINGS_ROUTE_LOGGING); -} -async function cn(e = !1) { - return Q(n.SETTINGS_ROUTE_LOGGING, { enabled: !!e }); -} -async function ln() { - return Z(n.SETTINGS_STARTUP_LOGGING); -} -async function un(e = !1) { - return Q(n.SETTINGS_STARTUP_LOGGING, { enabled: !!e }); -} -async function dn() { - return Z(n.SETTINGS_LTXAV_RGB_FALLBACK); -} -async function fn(e = !1) { - return Q(n.SETTINGS_LTXAV_RGB_FALLBACK, { enabled: !!e }); -} -async function pn() { - return Z(n.SETTINGS_OUTPUT_DIRECTORY); -} -async function mn(e, t = {}) { - let r = String(e ?? "").trim(); - return Q(n.SETTINGS_OUTPUT_DIRECTORY, { output_directory: r }, t); -} -async function hn() { - return Z(n.SETTINGS_INDEX_DIRECTORY); -} -async function gn(e, t = {}) { - let r = String(e ?? "").trim(); - return Q(n.SETTINGS_INDEX_DIRECTORY, { index_directory: r }, t); -} -async function _n() { - return Z("/mjr/am/settings/security"); -} -async function vn(e) { - return Q("/mjr/am/settings/security", e && typeof e == "object" ? e : {}); -} -async function yn() { - let e = await Q("/mjr/am/settings/security/bootstrap-token", {}); - if (e?.ok) try { - let t = String(e?.data?.token || "").trim(); - t && Rt(t); - } catch (e) { - console.debug?.(e); - } - return e; -} -async function bn(e) { - if (e && typeof e == "object") { - let t = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); - return e.id == null ? Q("/mjr/am/open-in-folder", { filepath: t }) : Q("/mjr/am/open-in-folder", { asset_id: i(e.id) }); - } - return Q("/mjr/am/open-in-folder", { asset_id: i(e) }); -} -async function xn({ op: e = "", path: t = "", name: r = "", destination: i = "", recursive: a = !0 } = {}, o = {}) { - let s = { - op: String(e || "").trim().toLowerCase(), - path: String(t || "").trim() - }; - return r != null && String(r).trim() && (s.name = String(r).trim()), i != null && String(i).trim() && (s.destination = String(i).trim()), s.op === "delete" && (s.recursive = !!a), Q(n.BROWSER_FOLDER_OP, s, o); -} -async function Sn(e = {}) { - let t = (e, t) => e == null ? t : !!e, r = String(e.scope || "output").trim().toLowerCase() || "output", i = e.customRootId ?? e.custom_root_id ?? e.rootId ?? e.root_id ?? e.customRoot ?? null, a = { - scope: r, - reindex: t(e.reindex, !0), - hard_reset_db: t(e.hardResetDb ?? e.hard_reset_db ?? e.deleteDbFiles ?? e.delete_db_files ?? e.deleteDb ?? e.delete_db ?? void 0, r === "all"), - clear_scan_journal: t(e.clearScanJournal ?? e.clear_scan_journal, !0), - clear_metadata_cache: t(e.clearMetadataCache ?? e.clear_metadata_cache, !0), - clear_asset_metadata: t(e.clearAssetMetadata ?? e.clear_asset_metadata, !0), - clear_assets: t(e.clearAssets ?? e.clear_assets, !0), - preserve_vectors: t(e.preserveVectors ?? e.preserve_vectors ?? e.keepVectors ?? e.keep_vectors, !1), - rebuild_fts: t(e.rebuildFts ?? e.rebuild_fts, !0), - incremental: t(e.incremental, !1), - fast: t(e.fast, !0), - background_metadata: t(e.backgroundMetadata ?? e.background_metadata, !0), - maintenance_force: t(e.maintenanceForce ?? e.maintenance_force, !1) - }; - return i && (a.custom_root_id = String(i)), Q(n.INDEX_RESET, a); -} -async function Cn({ scope: e = "output", customRootId: t = "" } = {}) { - let r = String(e || "output").trim().toLowerCase() || "output", i = String(t || "").trim(), a = { scope: r }; - return i && (a.custom_root_id = i), Q(n.WATCHER_SCOPE, a); -} -async function wn(e = {}) { - return Z(n.WATCHER_STATUS, e); -} -async function Tn(e = !0) { - return Q(n.WATCHER_TOGGLE, { enabled: !!e }); -} -async function En() { - return Z(n.WATCHER_SETTINGS); -} -async function Dn(e = {}) { - return Q(n.WATCHER_SETTINGS, e); -} -async function On(e = {}) { - return Z(n.TOOLS_STATUS, e); -} -async function kn(e = {}) { - return Z(n.STATUS, e); -} -async function An() { - return Q("/mjr/am/db/force-delete", {}); -} -async function jn(e = {}) { - return Z(n.DB_BACKUPS, e); -} -async function Mn() { - return Q(n.DB_BACKUP_SAVE, {}); -} -async function Nn({ name: e = "", useLatest: t = !1 } = {}) { - let r = {}; - return e && (r.name = String(e)), t && (r.use_latest = !0), Q(n.DB_BACKUP_RESTORE, r); -} -async function Pn(e = 250) { - return Q("/mjr/am/duplicates/analyze", { limit: Math.max(10, Math.min(5e3, Number(e) || 250)) }); -} -async function Fn({ scope: e = "output", customRootId: t = "", maxGroups: n = 6, maxPairs: r = 10 } = {}, i = {}) { - let a = `/mjr/am/duplicates/alerts?scope=${encodeURIComponent(String(e || "output"))}`; - return t && (a += `&custom_root_id=${encodeURIComponent(String(t))}`), a += `&max_groups=${encodeURIComponent(String(Math.max(1, Number(n) || 6)))}`, a += `&max_pairs=${encodeURIComponent(String(Math.max(1, Number(r) || 10)))}`, Z(a, i); -} -async function In(e, t = []) { - return Q("/mjr/am/duplicates/merge-tags", { - keep_asset_id: Number(e) || 0, - merge_asset_ids: Array.isArray(t) ? t.map((e) => Number(e) || 0).filter((e) => e > 0) : [] - }); -} -async function Ln(e) { - let t, n; - if (e && typeof e == "object") { - t = i(e.id); - let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(); - n = t ? { asset_id: t } : { filepath: r }; - } else t = i(e), n = { asset_id: t }; - let r = await Q("/mjr/am/asset/delete", n); - return r?.ok && t && zn([t]), r; -} -async function Rn(e) { - let t = Array.isArray(e) ? e.map((e) => i(e)).filter(Boolean) : [], n = await Q("/mjr/am/assets/delete", { ids: t }); - return n?.ok && zn(t), n; -} -function zn(e) { - try { - let t = (Array.isArray(e) ? e : [e]).map((e) => String(e || "").trim()).filter(Boolean); - if (!t.length) return; - window.dispatchEvent(new CustomEvent("mjr:assets-deleted", { detail: { ids: t } })); - } catch (e) { - console.debug?.(e); - } -} -async function Bn(e, t) { - let n; - if (e && typeof e == "object") { - n = i(e.id); - let r = String(e.filepath || e.path || e?.file_info?.filepath || "").trim(), a = n ? await Q("/mjr/am/asset/rename", { - asset_id: n, - new_name: t - }) : await Q("/mjr/am/asset/rename", { - filepath: r, - new_name: t - }); - if (a?.ok && n) try { - let e = await Dr(n); - e?.ok && e?.data && (a.data = { - ...a.data || {}, - asset: e.data - }); - } catch (e) { - console.debug?.(e); - } - return a; - } - n = i(e); - let r = await Q("/mjr/am/asset/rename", { - asset_id: n, - new_name: t - }); - if (r?.ok && n) try { - let e = await Dr(n); - e?.ok && e?.data && (r.data = { - ...r.data || {}, - asset: e.data - }); - } catch (e) { - console.debug?.(e); - } - return r; -} -async function Vn() { - let e = typeof AbortController < "u" ? new AbortController() : null, t = null; - try { - return e && (t = setTimeout(() => e.abort(), 1e4)), await Z("/mjr/am/collections", e ? { signal: e.signal } : {}); - } finally { - t && clearTimeout(t); - } -} -async function Hn(e) { - return Q("/mjr/am/collections", { name: String(e || "").trim() }); -} -async function Un(e) { - let t = String(e || "").trim(); - return Q(`/mjr/am/collections/${encodeURIComponent(t)}/delete`, {}); -} -async function Wn(e, t) { - let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; - return Q(`/mjr/am/collections/${encodeURIComponent(n)}/add`, { assets: r }); -} -async function Gn(e, t) { - let n = String(e || "").trim(), r = Array.isArray(t) ? t : []; - return Q(`/mjr/am/collections/${encodeURIComponent(n)}/remove`, { filepaths: r }); -} -async function Kn(e) { - let t = String(e || "").trim(); - return Z(`/mjr/am/collections/${encodeURIComponent(t)}/assets`); -} -async function qn(e, r = 20) { - let i = String(e || "").trim(); - if (!i) return { - ok: !1, - error: "Empty query" - }; - let a = r && typeof r == "object" ? r : { topK: Number(r) }, o = Math.max(1, Math.min(200, Number(a?.topK ?? 20) || 20)), s = String(a?.scope || "").trim(), c = String(a?.customRootId || "").trim(), l = `${n.VECTOR_SEARCH}?q=${encodeURIComponent(i)}&top_k=${o}`; - return s && (l += `&scope=${encodeURIComponent(s)}`), c && (l += `&custom_root_id=${encodeURIComponent(c)}`), l = t(l, { - subfolder: a?.subfolder ?? null, - kind: a?.kind ?? null, - hasWorkflow: a?.hasWorkflow ?? null, - minRating: a?.minRating ?? null, - minSizeMB: a?.minSizeMB ?? null, - maxSizeMB: a?.maxSizeMB ?? null, - minWidth: a?.minWidth ?? null, - minHeight: a?.minHeight ?? null, - maxWidth: a?.maxWidth ?? null, - maxHeight: a?.maxHeight ?? null, - workflowType: a?.workflowType ?? null, - dateRange: a?.dateRange ?? null, - dateExact: a?.dateExact ?? null - }), Z(l, { timeoutMs: 12e4 }); -} -async function Jn(e, t = 20) { - let r = String(e || "").trim(); - if (!r) return { - ok: !1, - error: "Missing asset ID" - }; - let i = t && typeof t == "object" ? t : { topK: Number(t) }, a = Math.max(1, Math.min(200, Number(i?.topK ?? 20) || 20)), o = String(i?.scope || "").trim(), s = String(i?.customRootId || "").trim(), c = `${n.VECTOR_SIMILAR}/${encodeURIComponent(r)}?top_k=${a}`; - return o && (c += `&scope=${encodeURIComponent(o)}`), s && (c += `&custom_root_id=${encodeURIComponent(s)}`), Z(c, { dedupeKey: `vec:${r}:${a}:${o}:${s}` }); -} -async function Yn(e) { - let t = String(e || "").trim(); - return t ? Z(`${n.VECTOR_ALIGNMENT}/${encodeURIComponent(t)}`) : { - ok: !1, - error: "Missing asset ID" - }; -} -async function Xn(e) { - let t = String(e || "").trim(); - return t ? Q(`${n.VECTOR_INDEX}/${encodeURIComponent(t)}`, {}) : { - ok: !1, - error: "Missing asset ID" - }; -} -async function Zn() { - return Z(n.VECTOR_STATS); -} -async function Qn(e = 64, t = {}) { - let r = Math.max(1, Math.min(200, e)), i = typeof t?.onProgress == "function" ? t.onProgress : null, a = String(t?.scope || "").trim().toLowerCase(), o = String(t?.customRootId ?? t?.custom_root_id ?? "").trim(), s = `${n.VECTOR_BACKFILL}?batch_size=${r}&async=1`; - a && (s += `&scope=${encodeURIComponent(a)}`), o && (s += `&custom_root_id=${encodeURIComponent(o)}`); - let c = await Q(s, {}, { timeoutMs: 3e4 }); - if (!c?.ok) return c; - let l = c?.data || {}, u = String(l?.status || "").toLowerCase(), d = String(l?.backfill_id || "").trim(); - try { - i?.(l); - } catch (e) { - console.debug?.(e); - } - if (!d || ![ - "queued", - "running", - "pending" - ].includes(u)) return c; - let f = Number(t?.pollIntervalMs), p = Number(t?.pollTimeoutMs), m = Number.isFinite(f) ? Math.max(500, Math.min(1e4, Math.floor(f))) : or, h = Number.isFinite(p) ? Math.max(1e4, Math.min(cr, Math.floor(p))) : sr, g = Date.now(), _ = null; - for (; Date.now() - g < h;) { - await ee(m); - let e = await Z(`${n.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }); - if (!e?.ok) { - _ = e; - continue; - } - let t = e?.data || {}, r = String(t?.status || "").toLowerCase(); - _ = e; - try { - i?.(t); - } catch (e) { - console.debug?.(e); - } - if (r === "succeeded") return { - ok: !0, - data: t?.result || {}, - code: null, - status: 200 - }; - if (r === "failed") return { - ok: !1, - error: String(t?.error || "Vector backfill failed"), - code: String(t?.code || "DB_ERROR"), - data: t, - status: 500 - }; - } - let v = await Z(`${n.VECTOR_BACKFILL_STATUS}?backfill_id=${encodeURIComponent(d)}`, { timeoutMs: 3e4 }), y = v?.data || _?.data || {}, b = String(y?.status || "").toLowerCase(); - if (v?.ok && [ - "queued", - "running", - "pending" - ].includes(b)) { - try { - i?.(y); - } catch (e) { - console.debug?.(e); - } - return { - ok: !0, - code: "PENDING", - status: 202, - data: { - ...y, - pending: !0, - timed_out: !0, - poll_timeout_ms: h, - backfill_id: String(y?.backfill_id || d), - status: b || "running" - }, - meta: { pending: !0 } - }; - } - return v?.ok && b === "failed" ? { - ok: !1, - error: String(y?.error || "Vector backfill failed"), - code: String(y?.code || "DB_ERROR"), - data: y, - status: 500 - } : { - ok: !1, - error: `Vector backfill polling timed out after ${h}ms`, - code: "TIMEOUT", - data: y || null, - status: 408 - }; -} -async function $n(e) { - let t = String(e || "").trim(); - return t ? Q(`${n.VECTOR_CAPTION}/${encodeURIComponent(t)}`, {}) : { - ok: !1, - error: "Missing asset ID" - }; -} -async function er(e, { topK: r = 50, scope: i = "output", customRootId: a = "", subfolder: o = null, kind: s = null, hasWorkflow: c = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: d = null, minWidth: f = null, minHeight: p = null, maxWidth: m = null, maxHeight: ee = null, workflowType: h = null, dateRange: g = null, dateExact: _ = null } = {}) { - let v = String(e || "").trim(); - if (!v) return { - ok: !1, - error: "Empty query" - }; - let y = `${n.HYBRID_SEARCH}?q=${encodeURIComponent(v)}&top_k=${Math.max(1, Math.min(200, r))}&scope=${encodeURIComponent(i)}`; - return a && (y += `&custom_root_id=${encodeURIComponent(a)}`), y = t(y, { - subfolder: o, - kind: s, - hasWorkflow: c, - minRating: l, - minSizeMB: u, - maxSizeMB: d, - minWidth: f, - minHeight: p, - maxWidth: m, - maxHeight: ee, - workflowType: h, - dateRange: g, - dateExact: _ - }), Z(y, { timeoutMs: 12e4 }); -} -async function tr(e = 8) { - return Q(n.VECTOR_SUGGEST_COLLECTIONS, { k: Math.max(2, Math.min(20, e)) }); -} -//#endregion -//#region ui/api/client.ts -var nr = 3e4, rr = "__MJR_API_CLIENT__", ir = 2e3, ar = 200, or = 1e3, sr = 30 * 6e4, cr = 720 * 6e4, J = "settings", lr = "available-tags", Y = x({ - ttlMs: ir, - maxSize: 1 -}), X = x({ - ttlMs: ir, - maxSize: 1 -}), ur = x({ - ttlMs: () => mr(), - maxSize: 1 -}), dr = new Set([ - "1", - "true", - "yes", - "on" -]), fr = new Set([ - "0", - "false", - "no", - "off" -]); -function pr(e, t = !1) { - if (typeof e == "boolean") return e; - if (typeof e == "number") return e !== 0; - if (typeof e == "string") { - let t = e.trim().toLowerCase(); - if (dr.has(t)) return !0; - if (fr.has(t)) return !1; - } - return !!t; -} -function mr() { - try { - let e = localStorage?.getItem?.("mjrSettings") || "{}", t = JSON.parse(e), n = t?.cache?.tagsTTLms ?? t?.cache?.tagsTTL ?? t?.cache?.tags_ttl_ms ?? null, r = Number(n); - return Number.isFinite(r) ? Math.max(1e3, Math.min(10 * 6e4, Math.floor(r))) : nr; - } catch { - return nr; - } -} -function hr() { - Y.clear(); -} -function gr() { - X.clear(); -} -function _r() { - ur.clear(); -} -function vr(e) { - return String(e ?? "").trim().toLowerCase() || ""; -} -function yr(e) { - let t = [], n = /* @__PURE__ */ new Set(); - for (let r of Array.isArray(e) ? e : []) { - let e = String(r ?? "").trim(); - if (!e) continue; - let i = vr(e); - !i || n.has(i) || (n.add(i), t.push(e)); - } - return t; -} -try { - let e = typeof window < "u" ? window : null; - e && !e[rr] && (e[rr] = { initialized: !0 }, e.addEventListener?.("storage", (e) => { - try { - e?.key === "mjrSettings" && (hr(), gr(), _r(), Jt()); - } catch (e) { - console.debug?.(e); - } - }), e.addEventListener?.("mjr-settings-changed", () => { - hr(), gr(), _r(), Jt(); - })); -} catch (e) { - console.debug?.(e); -} -var br = () => { - let e = Y.get(J); - if (e !== void 0) return e; - let t = Date.now(); - try { - let e = localStorage?.getItem?.(a); - if (!e) return Y.set(J, !1, { at: t }), !1; - let n = !!JSON.parse(e)?.observability?.enabled; - return Y.set(J, n, { at: t }), n; - } catch { - return Y.set(J, !1, { at: t }), !1; - } -}, xr = () => { - let e = X.get(J); - if (e !== void 0) return e; - let t = Date.now(); - try { - let e = localStorage?.getItem?.(a); - if (!e) return X.set(J, !0, { at: t }), !0; - let n = JSON.parse(e)?.ratingTagsSync?.enabled, r = n == null ? !0 : pr(n, !0); - return X.set(J, r, { at: t }), r; - } catch { - return X.set(J, !0, { at: t }), !0; - } -}, Sr = se({ - readObsEnabled: br, - readAuthToken: Lt, - ensureWriteAuthToken: qt, - normalizeWriteAuthFailure: Gt -}), Cr = Sr.fetchAPI; -async function Z(e, t = {}) { - return Sr.get(e, t); -} -async function Q(e, t, n = {}) { - return Sr.post(e, t, n); -} -async function wr(t, n, r = {}) { - let a = xr(), o = t && typeof t == "object" ? t : null, s = i(o ? o.id : t), c = { rating: Math.max(0, Math.min(5, Number(n) || 0)) }; - return s ? c.asset_id = s : o && (c.filepath = o.filepath || o.path || o?.file_info?.filepath || "", c.type = o.type || "output", c.root_id = e(o)), Cr("/mjr/am/asset/rating", { - ...r, - method: "POST", - headers: { - "Content-Type": "application/json", - ...a ? { "X-MJR-RTSYNC": "on" } : {} - }, - body: JSON.stringify(c) - }); -} -async function Tr(t, n, r = {}) { - let a = xr(), o = t && typeof t == "object" ? t : null, s = i(o ? o.id : t), c = { tags: Array.isArray(n) ? n : [] }; - s ? c.asset_id = s : o && (c.filepath = o.filepath || o.path || o?.file_info?.filepath || "", c.type = o.type || "output", c.root_id = e(o)); - let l = await Cr("/mjr/am/asset/tags", { - ...r, - method: "POST", - headers: { - "Content-Type": "application/json", - ...a ? { "X-MJR-RTSYNC": "on" } : {} - }, - body: JSON.stringify(c) - }); - return l?.ok && _r(), l; -} -async function Er() { - let e = ur.get(lr); - if (Array.isArray(e)) return { - ok: !0, - data: e, - error: null, - code: "OK", - meta: { cached: !0 } - }; - let t = await Z("/mjr/am/tags"); - if (t?.ok && Array.isArray(t.data)) { - let e = yr(t.data); - return ur.set(lr, e), { - ...t, - data: e - }; - } - return t; -} -async function Dr(e, t = {}) { - let n = encodeURIComponent(i(e)); - return Z(`/mjr/am/asset/${n}`, { - ...t, - dedupeKey: t?.dedupeKey || `meta:${n}` - }); -} -async function Or(e, t = {}) { - let n = i(e); - if (!n) return { - ok: !1, - data: null, - error: "Missing assetId", - code: "INVALID_INPUT" - }; - let r = `/mjr/am/viewer/info?asset_id=${encodeURIComponent(n)}`; - t.refresh && (r += "&refresh=1"); - let { refresh: a, ...o } = t; - return Z(r, o); -} -async function kr(e, t = {}) { - let n = Array.isArray(e) ? e : [], r = []; - for (let e of n) { - let t = Number(e); - if (Number.isFinite(t) && (r.push(Math.trunc(t)), r.length >= ar)) break; - } - return r.length ? Q("/mjr/am/assets/batch", { asset_ids: r }, t) : { - ok: !0, - data: [], - error: null, - code: "OK" - }; -} -async function Ar({ type: e = "output", filename: t = "", subfolder: n = "", root_id: r = "", rootId: i = "", filepath: a = "" } = {}, o = {}) { - let s = String(e || "output").trim().toLowerCase() || "output", c = String(t || "").trim(), l = String(n || "").trim(), u = String(r || i || "").trim(), d = String(a || "").trim(); - if (!c) return { - ok: !1, - data: null, - error: "Missing filename", - code: "INVALID_INPUT" - }; - let f = `/mjr/am/metadata?type=${encodeURIComponent(s)}&filename=${encodeURIComponent(c)}`; - return d && (f += `&filepath=${encodeURIComponent(d)}`), l && (f += `&subfolder=${encodeURIComponent(l)}`), u && (f += `&root_id=${encodeURIComponent(u)}`), Z(f, o); -} -async function jr({ filepath: e = "", root_id: t = "", subfolder: r = "" } = {}, i = {}) { - try { - if (globalThis.__mjrFolderInfoSupported === !1) return { - ok: !1, - data: null, - error: "Folder info endpoint unavailable", - code: "UNAVAILABLE" - }; - if (globalThis.__mjrFolderInfoSupported == null) { - let e = await Z("/mjr/am/routes"); - if (e?.ok && Array.isArray(e.data)) { - let t = e.data.some((e) => String(e?.path || "").trim() === "/mjr/am/folder-info"); - if (globalThis.__mjrFolderInfoSupported = !!t, !t) return { - ok: !1, - data: null, - error: "Folder info endpoint unavailable", - code: "UNAVAILABLE" - }; - } else globalThis.__mjrFolderInfoSupported = null; - } - } catch (e) { - console.debug?.(e); - } - let a = String(e || "").trim(), o = String(t || "").trim(), s = String(r || "").trim(), c = n.FOLDER_INFO, l = []; - a ? (l.push(`filepath=${encodeURIComponent(a)}`), l.push("browser_mode=1")) : (o && l.push(`root_id=${encodeURIComponent(o)}`), s && l.push(`subfolder=${encodeURIComponent(s)}`)), l.length && (c += `?${l.join("&")}`); - let u = await Z(c, i); - try { - !u?.ok && Number(u?.status || 0) === 404 && (globalThis.__mjrFolderInfoSupported = !1); - } catch (e) { - console.debug?.(e); - } - return u; -} -//#endregion -//#region ui/app/hostAdapter.ts -var $ = null; -function Mr(e, t) { - try { - return Ce(e || $ || O(), t); - } catch { - return !1; - } -} -function Nr(e, t) { - try { - return be(e || $ || O(), t); - } catch { - return !1; - } -} -function Pr(e, t) { - try { - return we(e || $ || O(), t); - } catch { - return !1; - } -} -function Fr(e, t) { - try { - return xe(e || $ || O(), t); - } catch { - return !1; - } -} -function Ir(e, t) { - try { - return Se(e || $ || O(), t); - } catch { - return !1; - } -} -function Lr() { - return $ || O() || null; -} -function Rr(e = null) { - try { - return D(e || $ || O()) || null; - } catch { - return null; - } -} -async function zr(e = {}) { - try { - return await Oe(e); - } catch { - return null; - } -} -function Br() { - let e = $ || O() || 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); - return !Number.isFinite(i) || i <= 0 || !(a > 0) || !(o > 0) ? null : { - app: e, - graphCanvas: t, - ds: n, - scale: i, - width: a, - height: o - }; -} -function Vr(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 Hr(e, t) { - try { - t?.setDirty?.(!0, !0); - } catch (e) { - console.debug?.(e); - } - try { - e?.graph?.setDirtyCanvas?.(!0, !0); - } catch (e) { - console.debug?.(e); - } -} -function Ur(e) { - try { - let t = Br(); - 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) || !Vr(t.ds, a, o) ? !1 : (Hr(t.app, t.graphCanvas), !0); - } catch (e) { - return console.debug?.(e), !1; - } -} -function Wr() { - try { - let e = Br(); - 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 : { - x0: -n / e.scale, - y0: -r / e.scale, - x1: (e.width - n) / e.scale, - y1: (e.height - r) / e.scale - }; - } catch (e) { - return console.debug?.(e), null; - } -} -//#endregion -export { Sn as $, o as $t, Kn as A, yt as At, _n as B, H as Bt, xn as C, qn as Ct, Un as D, Et as Dt, Rn as E, Bt as Et, dn as F, et as Ft, wn as G, ye as Gt, On as H, fe as Ht, Xt as I, Xe as It, jn as J, ue as Jt, er as K, ve as Kt, pn as L, Ze as Lt, en as M, gt as Mt, nn as N, vt as Nt, An as O, Ct as Ot, hn as P, $e as Pt, Bn as Q, x as Qt, sn as R, V as Rt, yn as S, Xn as St, Ln as T, tr as Tt, Qt as U, D as Ut, ln as V, N as Vt, En as W, O as Wt, bn as X, Oe as Xt, In as Y, he as Yt, Gn as Z, De as Zt, Or as _, Dn as _t, Rr as a, gn as at, Tr as b, $n as bt, Ir as c, mn as ct, Z as d, vn as dt, a as en, Nn as et, Dr as f, un as ft, jr as g, Tn as gt, Ar as h, Pn as ht, Wr as i, rn as it, Fn as j, _t as jt, an as k, it as kt, Mr as l, Yt as lt, Er as m, Cn as mt, Nr as n, on as nt, Lr as o, fn as ot, kr as p, $t as pt, Vn as q, de as qt, Ur as r, tn as rt, Fr as s, Zt as st, Pr as t, Mn as tt, zr as u, cn as ut, Q as v, Qn as vt, Hn as w, Zn as wt, Wn as x, Yn as xt, wr as y, Jn as yt, kn as z, Qe as zt }; +export { ee as $, Ve as A, A as B, Oe as C, nt as D, Qe as E, Me as F, g as G, se as H, je as I, te as J, _ as K, De as L, z as M, Fe as N, Ue as O, Ie as P, S as Q, Re as R, Ge as S, Le as T, Te as U, ce as V, we as W, y as X, C as Y, x as Z, it as _, At as a, o as at, We as b, Mt as c, u as ct, Pe as d, ie as et, Ne as f, ze as g, at as h, Pt as i, d as it, rt as j, et as k, Ft as l, lt as m, It as n, v as nt, jt as o, s as ot, tt as p, ae as q, Nt as r, b as rt, $ as s, l as st, Lt as t, re as tt, G as u, $e as v, F as w, ke as x, ut as y, He as z }; diff --git a/dist/chunks/config-dvcltBqE.js b/dist/chunks/config-dvcltBqE.js deleted file mode 100644 index ba56492c..00000000 --- a/dist/chunks/config-dvcltBqE.js +++ /dev/null @@ -1,369 +0,0 @@ -//#region ui/utils/ids.ts -function e(e) { - try { - return String(e ?? "").trim(); - } catch { - return ""; - } -} -var t = 0; -function n(e) { - let t = Math.max(4, Number(e) || 0); - try { - let e = globalThis.crypto; - if (!e?.getRandomValues) return ""; - let n = new Uint8Array(t); - return e.getRandomValues(n), Array.from(n, (e) => e.toString(16).padStart(2, "0")).join(""); - } catch { - return ""; - } -} -function r(e = "", t = 16) { - let r = n(t); - if (!r) throw Error("Secure token generation requires crypto.getRandomValues()."); - return `${String(e || "")}${r}`; -} -function i(e = "", r = 8) { - let i = n(r); - return i ? `${String(e || "")}${i}` : (t += 1, `${String(e || "")}${Date.now().toString(36)}_${t.toString(36)}`); -} -function a(t) { - let n = e(t); - if (!n || !/^\d+$/.test(n)) return ""; - try { - let e = Number(n); - return !Number.isSafeInteger(e) || e <= 0 ? "" : String(e); - } catch { - return ""; - } -} -function o(e) { - return a(e); -} -function s(t) { - try { - if (!t) return ""; - let n = t, r = n.file_info; - return e(n.root_id ?? n.rootId ?? n.custom_root_id ?? n.customRootId ?? n.customRoot ?? r?.root_id ?? r?.rootId ?? ""); - } catch { - return ""; - } -} -//#endregion -//#region ui/utils/path.ts -function c(e) { - return String(e || "").replace(/\\/g, "/"); -} -function l(e) { - let t = c(e).trim(); - if (!t) return { - filename: "", - subfolder: "" - }; - let n = t.lastIndexOf("/"); - return n < 0 ? { - filename: t, - subfolder: "" - } : { - filename: t.slice(n + 1), - subfolder: t.slice(0, n) - }; -} -function u(e) { - return /^[a-zA-Z]:\//.test(String(e || "")); -} -//#endregion -//#region ui/api/endpoints.ts -var d = 200, f = 0, p = { - HEALTH: "/mjr/am/health", - HEALTH_COUNTERS: "/mjr/am/health/counters", - HEALTH_DB: "/mjr/am/health/db", - STATUS: "/mjr/am/status", - RUNTIME_EXECUTION: "/mjr/am/runtime/execution", - CONFIG: "/mjr/am/config", - VERSION: "/mjr/am/version", - SCAN: "/mjr/am/scan", - INDEX_FILES: "/mjr/am/index-files", - INDEX_RESET: "/mjr/am/index/reset", - DB_RESET: "/mjr/am/db/reset", - SEARCH: "/mjr/am/search", - LIST: "/mjr/am/list", - ROOTS: "/mjr/am/roots", - CUSTOM_ROOTS: "/mjr/am/custom-roots", - CUSTOM_ROOTS_REMOVE: "/mjr/am/custom-roots/remove", - BROWSER_FOLDER_OP: "/mjr/am/browser/folder-op", - BROWSE_FOLDER: "/mjr/sys/browse-folder", - FOLDER_INFO: "/mjr/am/folder-info", - METADATA: "/mjr/am/metadata", - WORKFLOW_QUICK: "/mjr/am/workflow-quick", - RETRY_SERVICES: "/mjr/am/retry-services", - STAGE_TO_INPUT: "/mjr/am/stage-to-input", - OPEN_IN_FOLDER: "/mjr/am/open-in-folder", - TOOLS_STATUS: "/mjr/am/tools/status", - SETTINGS_OUTPUT_DIRECTORY: "/mjr/am/settings/output-directory", - SETTINGS_INDEX_DIRECTORY: "/mjr/am/settings/index-directory", - SETTINGS_METADATA_FALLBACK: "/mjr/am/settings/metadata-fallback", - SETTINGS_VECTOR_SEARCH: "/mjr/am/settings/vector-search", - SETTINGS_EXECUTION_GROUPING: "/mjr/am/settings/execution-grouping", - SETTINGS_HUGGINGFACE: "/mjr/am/settings/huggingface", - SETTINGS_AI_LOGGING: "/mjr/am/settings/ai-logging", - SETTINGS_ROUTE_LOGGING: "/mjr/am/settings/route-logging", - SETTINGS_STARTUP_LOGGING: "/mjr/am/settings/startup-logging", - SETTINGS_LTXAV_RGB_FALLBACK: "/mjr/am/settings/ltxav-rgb-fallback", - VIEW: "/view", - CUSTOM_VIEW: "/mjr/am/custom-view", - VIEWER_INFO: "/mjr/am/viewer/info", - VIEWER_RESOURCE: "/mjr/am/viewer/resource", - UPLOAD_INPUT: "/mjr/am/upload_input", - DOWNLOAD: "/mjr/am/download", - DOWNLOAD_CLEAN: "/mjr/am/download-clean", - BATCH_ZIP_CREATE: "/mjr/am/batch-zip", - DATE_HISTOGRAM: "/mjr/am/date-histogram", - ASSET_DELETE: "/mjr/am/asset/delete", - ASSET_RENAME: "/mjr/am/asset/rename", - WATCHER_STATUS: "/mjr/am/watcher/status", - WATCHER_TOGGLE: "/mjr/am/watcher/toggle", - WATCHER_SCOPE: "/mjr/am/watcher/scope", - WATCHER_SETTINGS: "/mjr/am/watcher/settings", - COLLECTIONS: "/mjr/am/collections", - STACKS: "/mjr/am/stacks", - STACKS_MERGE: "/mjr/am/stacks/merge", - STACKS_DISSOLVE: "/mjr/am/stacks/dissolve", - STACKS_AUTO_STACK: "/mjr/am/stacks/auto-stack", - DUPLICATES_ALERTS: "/mjr/am/duplicates/alerts", - DUPLICATES_ANALYZE: "/mjr/am/duplicates/analyze", - DUPLICATES_MERGE_TAGS: "/mjr/am/duplicates/merge-tags", - DB_BACKUPS: "/mjr/am/db/backups", - DB_BACKUP_SAVE: "/mjr/am/db/backup-save", - DB_BACKUP_RESTORE: "/mjr/am/db/backup-restore", - VECTOR_SEARCH: "/mjr/am/vector/search", - VECTOR_SIMILAR: "/mjr/am/vector/similar", - VECTOR_ALIGNMENT: "/mjr/am/vector/alignment", - VECTOR_AUTO_TAGS: "/mjr/am/vector/auto-tags", - VECTOR_CAPTION: "/mjr/am/vector/caption", - VECTOR_ENHANCED_PROMPT: "/mjr/am/vector/enhanced-prompt", - VECTOR_INDEX: "/mjr/am/vector/index", - VECTOR_STATS: "/mjr/am/vector/stats", - VECTOR_SUGGEST_COLLECTIONS: "/mjr/am/vector/suggest-collections", - VECTOR_BACKFILL: "/mjr/am/db/backfill-missing-vectors", - VECTOR_BACKFILL_STATUS: "/mjr/am/db/backfill-missing-vectors/status", - HYBRID_SEARCH: "/mjr/am/search/hybrid", - AUDIT: "/mjr/am/audit" -}; -function m(e, t = {}) { - let n = String(e || ""), r = () => n.includes("?") ? "&" : "?", i = (e) => { - n += r() + e; - }, { subfolder: a = null, kind: o = null, hasWorkflow: s = null, minRating: c = null, minSizeMB: l = null, maxSizeMB: u = null, minWidth: d = null, minHeight: f = null, maxWidth: p = null, maxHeight: m = null, workflowType: h = null, dateRange: g = null, dateExact: _ = null } = t || {}; - return a && i(`subfolder=${encodeURIComponent(String(a))}`), o && i(`kind=${encodeURIComponent(o)}`), s != null && i(`has_workflow=${encodeURIComponent(s ? "true" : "false")}`), c != null && Number(c) > 0 && i(`min_rating=${encodeURIComponent(String(c))}`), l != null && Number(l) > 0 && i(`min_size_mb=${encodeURIComponent(String(l))}`), u != null && Number(u) > 0 && i(`max_size_mb=${encodeURIComponent(String(u))}`), d != null && Number(d) > 0 && i(`min_width=${encodeURIComponent(String(d))}`), f != null && Number(f) > 0 && i(`min_height=${encodeURIComponent(String(f))}`), p != null && Number(p) > 0 && i(`max_width=${encodeURIComponent(String(p))}`), m != null && Number(m) > 0 && i(`max_height=${encodeURIComponent(String(m))}`), h && i(`workflow_type=${encodeURIComponent(String(h))}`), g && i(`date_range=${encodeURIComponent(String(g))}`), _ && i(`date_exact=${encodeURIComponent(String(_))}`), n; -} -function h(e, t = null, n = "output") { - let r = String(e || "").trim(); - if (!r) return ""; - let i = `${p.VIEW}?filename=${encodeURIComponent(r)}`; - return t && (i += `&subfolder=${encodeURIComponent(t)}`), i += `&type=${encodeURIComponent(n)}`, i; -} -function g(e = {}) { - let { q: t = "*", limit: n = d, offset: r = f, scope: i = "output", subfolder: a = "", customRootId: o = null, kind: s = null, hasWorkflow: c = null, minRating: l = null, minSizeMB: u = null, maxSizeMB: h = null, resolutionCompare: g = null, minWidth: _ = null, minHeight: v = null, maxWidth: y = null, maxHeight: b = null, workflowType: x = null, dateRange: S = null, dateExact: C = null, sort: w = null, cursor: T = null, includeTotal: E = !0, groupStacks: D = !1 } = e, O = `${p.LIST}?q=${encodeURIComponent(t)}&limit=${n}&offset=${r}&scope=${encodeURIComponent(i)}`; - return a && (O += `&subfolder=${encodeURIComponent(a)}`), o ? O += `&custom_root_id=${encodeURIComponent(o)}` : String(i || "").toLowerCase() === "custom" && (O += "&browser_mode=1"), O = m(O, { - kind: s, - hasWorkflow: c, - minRating: l, - minSizeMB: u, - maxSizeMB: h, - minWidth: _, - minHeight: v, - maxWidth: y, - maxHeight: b, - workflowType: x, - dateRange: S, - dateExact: C - }), g && (O += `&resolution_compare=${encodeURIComponent(String(g))}`), w && (O += `&sort=${encodeURIComponent(String(w))}`), T && (O += `&cursor=${encodeURIComponent(String(T))}`), E === !1 && (O += "&include_total=0"), D && (O += "&group_stacks=1"), O; -} -function _(e, t = "", n = "") { - let r = String(e || "").trim(), i = String(n || "").trim(); - if (!r || !i) return ""; - let a = `${p.CUSTOM_VIEW}?root_id=${encodeURIComponent(i)}&filename=${encodeURIComponent(r)}`; - return t && (a += `&subfolder=${encodeURIComponent(t)}`), a; -} -function v(e) { - return `${p.BATCH_ZIP_CREATE}/${encodeURIComponent(String(e || ""))}`; -} -function y(e) { - return `${p.STACKS}/${encodeURIComponent(String(e || ""))}`; -} -function b(e) { - return `${y(e)}/members`; -} -function x(e, t = {}) { - let n = String(e || "").trim(), r = `${p.STACKS}/by-node/${encodeURIComponent(n)}/members`, i = [], a = String(t?.jobId || t?.job_id || "").trim(); - a && i.push(`job_id=${encodeURIComponent(a)}`), t?.latest === !1 && i.push("latest=0"); - let o = Number(t?.limit || 0); - return Number.isFinite(o) && o > 0 && i.push(`limit=${encodeURIComponent(String(Math.trunc(o)))}`), i.length && (r += `?${i.join("&")}`), r; -} -function S(e, t = "") { - let n = e && typeof e == "object" ? e : {}, r = String(t || "").trim(); - if (!r) return ""; - let i = o(n?.asset_id ?? n?.id ?? null), a = `${p.VIEWER_RESOURCE}?relpath=${encodeURIComponent(r)}`; - if (i) return `${a}&asset_id=${encodeURIComponent(i)}`; - let l = c(String(n?.filepath || n?.path || n?.fullpath || n?.full_path || n?.file_info?.filepath || n?.file_info?.path || "").trim()); - if (l) return `${a}&filepath=${encodeURIComponent(l)}`; - let u = String(n?.filename || n?.name || n?.file_info?.filename || "").trim(); - if (!u) return ""; - a += `&filename=${encodeURIComponent(u)}`; - let d = String(n?.subfolder || n?.file_info?.subfolder || "").trim(); - d && (a += `&subfolder=${encodeURIComponent(d)}`); - let f = String(n?.type || n?.file_info?.type || "").trim().toLowerCase(); - f && f !== "custom" && (a += `&type=${encodeURIComponent(f)}`); - let m = String(s(n) || n?.root_id || n?.custom_root_id || "").trim(); - return m && (a += `&root_id=${encodeURIComponent(m)}`), a; -} -function C(e = {}) { - let { scope: t = "output", customRootId: n = null, month: r = "", kind: i = null, hasWorkflow: a = null, minRating: o = null } = e, s = `${p.DATE_HISTOGRAM}?scope=${encodeURIComponent(t)}&month=${encodeURIComponent(String(r || ""))}`; - return n && (s += `&custom_root_id=${encodeURIComponent(n)}`), m(s, { - subfolder: e.subfolder ?? null, - kind: i, - hasWorkflow: a, - minRating: o, - minSizeMB: e.minSizeMB ?? null, - maxSizeMB: e.maxSizeMB ?? null, - minWidth: e.minWidth ?? null, - minHeight: e.minHeight ?? null, - maxWidth: e.maxWidth ?? null, - maxHeight: e.maxHeight ?? null, - workflowType: e.workflowType ?? null, - dateRange: e.dateRange ?? null, - dateExact: e.dateExact ?? null - }); -} -function w(e) { - let t = e?.mtime, n = (e) => !e || !t ? e : `${e}${e.includes("?") ? "&" : "?"}v=${encodeURIComponent(t)}`, r = c(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "").trim()), i = String(e?.filename || e?.name || e?.file_info?.filename || "").trim(), a = String(e?.subfolder || e?.file_info?.subfolder || "").trim(), o = ((e) => { - let t = { - type: "", - subfolder: "", - filename: "" - }, n = c(e); - if (!n) return t; - let r = n.toLowerCase(), i = r.indexOf("/output/"), a = r.indexOf("/input/"), o = r.indexOf("/temp/"), s = -1; - if (i >= 0 ? (t.type = "output", s = i + 8) : a >= 0 ? (t.type = "input", s = a + 7) : o >= 0 && (t.type = "temp", s = o + 6), s >= 0) { - let e = n.slice(s), r = e.lastIndexOf("/"); - r >= 0 ? (t.subfolder = e.slice(0, r), t.filename = e.slice(r + 1)) : t.filename = e; - } else t.filename = l(n).filename; - return t; - })(r); - if (!a && i.includes("/")) { - let e = i.lastIndexOf("/"); - e > 0 && (a = i.slice(0, e), i = i.slice(e + 1)); - } - if (!i && o.filename && (i = o.filename), !a && o.subfolder && (a = o.subfolder), !i) return ""; - let d = String(e?.type || e?.file_info?.type || "").toLowerCase().trim(); - d !== "input" && d !== "output" && d !== "temp" && d !== "custom" && (d = ""), !d && o.type && (d = o.type), !d && r && (r.includes("/input/") ? d = "input" : r.includes("/output/") ? d = "output" : r.includes("/temp/") && (d = "temp")), d ||= "output"; - let f = r.includes("/output/") || r.includes("/input/") || r.includes("/temp/"), m = u(a) || a.startsWith("/"); - if (r && d !== "custom" && (m || !f)) return n(T(r, { inline: !0 })); - if (d === "custom") { - let t = String(s(e) || "").trim(); - if (t) return n(_(i, a, t)); - if (r) return n(`${p.CUSTOM_VIEW}?filepath=${encodeURIComponent(r)}&browser_mode=1`); - let c = o.type || "output"; - return n(h(i, a, c)); - } - return r.includes("/output/") && (d = "output"), r.includes("/input/") && (d = "input"), r.includes("/temp/") && (d = "temp"), n(h(i, a, d)); -} -function T(e, t = {}) { - if (!e) return ""; - let n = !!t?.inline, r = `${p.DOWNLOAD}?filepath=${encodeURIComponent(e)}`; - return n && (r += "&preview=1"), r; -} -function E(e) { - return e ? `${p.DOWNLOAD_CLEAN}?filepath=${encodeURIComponent(e)}` : ""; -} -//#endregion -//#region ui/app/config.ts -var D = Object.freeze({ - DEBUG_SAFE_CALL: !1, - DEBUG_SAFE_LISTENERS: !1, - DEBUG_VIEWER: !1, - VIEWER_ALLOW_PAN_AT_ZOOM_1: !1, - VIEWER_DISABLE_WEBGL_VIDEO: !1, - VIEWER_DISABLE_WEBGL_AUDIO: !1, - VIEWER_VIDEO_GRADE_THROTTLE_FPS: 12, - VIEWER_AUDIO_VISUALIZER_MODE: "artistic", - VIEWER_AUDIO_VIS_FPS: 18, - VIEWER_SCOPES_FPS: 8, - GRID_MIN_SIZE: 120, - FEED_GRID_MIN_SIZE: 120, - GRID_GAP: 10, - GRID_SHOW_BADGES_EXTENSION: !0, - GRID_SHOW_BADGES_RATING: !0, - GRID_SHOW_BADGES_TAGS: !0, - GRID_SHOW_DETAILS: !0, - GRID_SHOW_DETAILS_FILENAME: !0, - GRID_SHOW_DETAILS_DATE: !0, - GRID_SHOW_DETAILS_DIMENSIONS: !0, - GRID_SHOW_DETAILS_GENTIME: !0, - GRID_SHOW_HOVER_INFO: !0, - GRID_SHOW_WORKFLOW_DOT: !0, - GRID_VIDEO_AUTOPLAY_MODE: "hover", - FEED_SHOW_INFO: !0, - FEED_SHOW_FILENAME: !1, - FEED_SHOW_DIMENSIONS: !0, - FEED_SHOW_DATE: !0, - FEED_SHOW_GENTIME: !0, - FEED_SHOW_WORKFLOW_DOT: !1, - FEED_SHOW_BADGES_EXTENSION: !0, - FEED_SHOW_BADGES_RATING: !0, - FEED_SHOW_BADGES_TAGS: !0, - UI_CARD_HOVER_COLOR: "#3D3D3D", - UI_CARD_SELECTION_COLOR: "#4A90E2", - UI_RATING_COLOR: "#FF9500", - UI_TAG_COLOR: "#4A90E2", - BADGE_STAR_COLOR: "#FFD45A", - BADGE_IMAGE_COLOR: "#2196F3", - BADGE_VIDEO_COLOR: "#9C27B0", - BADGE_AUDIO_COLOR: "#FF9800", - BADGE_MODEL3D_COLOR: "#4CAF50", - BADGE_DUPLICATE_ALERT_COLOR: "#FF1744", - DEFAULT_PAGE_SIZE: 80, - MAX_PAGE_SIZE: 2e3, - PREFETCH_NEXT_PAGE: !0, - PREFETCH_NEXT_PAGE_DELAY_MS: 700, - SEARCH_DEFAULT_LIMIT: 500, - INFINITE_SCROLL_ENABLED: !0, - INFINITE_SCROLL_ROOT_MARGIN: "800px", - INFINITE_SCROLL_THRESHOLD: .01, - BOTTOM_GAP_PX: 80, - STATUS_POLL_INTERVAL: 5e3, - AUTO_SCAN_ON_STARTUP: !1, - EXECUTION_GROUPING_ENABLED: !0, - EXECUTION_IDLE_GRACE_MS: 6e3, - DEFER_GRID_FETCH_DURING_EXECUTION: !1, - VIEWER_PAUSE_DURING_EXECUTION: !0, - FLOATING_VIEWER_PAUSE_DURING_EXECUTION: !1, - MFV_SIDEBAR_POSITION: "right", - MFV_LIVE_DEFAULT: !0, - MFV_PREVIEW_DEFAULT: !0, - MFV_LIVE_AUTO_OPEN: !1, - MFV_PREVIEW_AUTO_OPEN: !1, - MFV_NODE_STREAM_AUTO_OPEN: !1, - MFV_PREVIEW_METHOD: "auto", - RT_HYDRATE_CONCURRENCY: 2, - RT_HYDRATE_QUEUE_MAX: 100, - RT_HYDRATE_SEEN_MAX: 2e4, - RT_HYDRATE_PRUNE_BUDGET: 250, - RT_HYDRATE_SEEN_TTL_MS: 600 * 1e3, - VIEWER_META_TTL_MS: 3e4, - VIEWER_META_MAX_ENTRIES: 500, - WORKFLOW_MINIMAP_ENABLED: !0, - WATCHER_DEBOUNCE_MS: 3e3, - WATCHER_DEDUPE_TTL_MS: 3e3, - WATCHER_MAX_PENDING: 500, - WATCHER_MIN_SIZE: 100, - WATCHER_MAX_SIZE: 4294967296, - DB_TIMEOUT_MS: 5e3, - DB_MAX_CONNECTIONS: 10, - DB_QUERY_TIMEOUT_MS: 1e3, - SEARCH_REQUEST_LIMIT: 500, - DELETE_CONFIRMATION: !0, - DEBUG_VERBOSE_ERRORS: !1 -}), O = { ...D }; -//#endregion -export { r as _, w as a, s as b, _ as c, g as d, x as f, c as g, S as h, m as i, C as l, h as m, D as n, v as o, b as p, p as r, E as s, O as t, T as u, i as v, o as y }; diff --git a/dist/chunks/floatingViewerManager-Oat0dyM2.js b/dist/chunks/floatingViewerManager-BSQ_h48I.js similarity index 50% rename from dist/chunks/floatingViewerManager-Oat0dyM2.js rename to dist/chunks/floatingViewerManager-BSQ_h48I.js index 44dcf682..10a622e0 100644 --- a/dist/chunks/floatingViewerManager-Oat0dyM2.js +++ b/dist/chunks/floatingViewerManager-BSQ_h48I.js @@ -1,5 +1,5 @@ -import { Dt as e, o as t, p as n } from "./hostAdapter-D6BwD-lN.js"; -import { t as r } from "./config-dvcltBqE.js"; +import { _t as e, r as t } from "./client-DZE_lzdb.js"; +import { A as n, t as r } from "./config-Cxv7acF8.js"; import { r as i } from "./events-BnkL6-b6.js"; //#region ui/utils/logging.ts function a(e, ...t) { @@ -67,7 +67,7 @@ function p(e) { } return t; } -function ee(e, t, n = "") { +function m(e, t, n = "") { let r = Array.from(t || []), i = n ? String(n) : r[0] ? String(r[0]) : ""; try { r.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(r), i ? e.dataset.mjrSelectedAssetId = String(i) : delete e.dataset.mjrSelectedAssetId) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); @@ -76,7 +76,7 @@ function ee(e, t, n = "") { } return r; } -function te(e, t, n) { +function ee(e, t, n) { if (!e) return; let r = t instanceof Set ? t : new Set(Array.from(t || []).map(String)); try { @@ -89,10 +89,10 @@ function te(e, t, n) { console.debug?.(e); } } -function ne(e, t, { activeId: n = "" } = {}, r) { +function te(e, t, { activeId: n = "" } = {}, r) { if (!e) return []; - let i = new Set(Array.from(t || []).map(String).filter(Boolean)), a = ee(e, i, n); - te(e, i, r); + let i = new Set(Array.from(t || []).map(String).filter(Boolean)), a = m(e, i, n); + ee(e, i, r); let o = { selectedIds: a, activeId: n || a[0] || "" @@ -111,53 +111,53 @@ function ne(e, t, { activeId: n = "" } = {}, r) { } //#endregion //#region ui/features/panel/controllers/hotkeysState.ts -var m = { +var h = { suspended: !1, scope: null, ratingHotkeysActive: !1 }; -function re() { - return m; +function ne() { + return h; } -function ie(e) { - m.scope = e == null ? null : String(e); +function re(e) { + h.scope = e == null ? null : String(e); } -function ae() { - return !!m.suspended; +function ie() { + return !!h.suspended; } -function oe(e) { - m.ratingHotkeysActive = !!e; +function ae(e) { + h.ratingHotkeysActive = !!e; } //#endregion //#region ui/features/viewer/viewerRuntimeHosts.ts -var h = null, g = null, se = ".mjr-viewer-overlay", ce = ".mjr-mfv"; -function le(e) { +var g = null, _ = null, v = ".mjr-viewer-overlay", oe = ".mjr-mfv"; +function y(e) { return !!e && typeof e.appendChild == "function"; } -function _() { +function b() { return typeof document > "u" ? null : document?.body || null; } -function ue() { +function se() { return typeof document > "u" ? null : document?.body || document?.documentElement || null; } -function de(e) { - return le(e) ? e === _() ? !0 : typeof e?.isConnected == "boolean" ? e.isConnected : !0 : !1; +function ce(e) { + return y(e) ? e === b() ? !0 : typeof e?.isConnected == "boolean" ? e.isConnected : !0 : !1; } -function fe(e) { - return le(e) ? e : null; +function le(e) { + return y(e) ? e : null; } -function v(e) { - return de(e) ? e : _(); +function x(e) { + return ce(e) ? e : b(); } -function pe(e) { - let t = ue(); - return de(t) ? t : v(e); +function ue(e) { + let t = se(); + return ce(t) ? t : x(e); } -function me(e, t, n = v) { +function de(e, t, n = x) { let r = [], i = /* @__PURE__ */ new Set(); for (let a of [ n(t), - _(), + b(), t ]) { if (!a || i.has(a)) continue; @@ -172,30 +172,30 @@ function me(e, t, n = v) { } return r; } -function he(e, t, n = v) { +function fe(e, t, n = x) { let r = n(t); if (!r) return; - let i = me(e, t, n); + let i = de(e, t, n); for (let e of i) if (e && e.parentNode !== r) try { r.appendChild(e); } catch (e) { console.debug?.(e); } } -function ge(e) { - return h = fe(e), he(se, h), () => _e(e); +function pe(e) { + return g = le(e), fe(v, g), () => me(e); } -function _e(e) { - (!e || h === e) && (h = null); -} -function ve(e) { - return g = fe(e), he(ce, g, pe), () => ye(e); -} -function ye(e) { +function me(e) { (!e || g === e) && (g = null); } -function be(e) { - let t = v(h); +function he(e) { + return _ = le(e), fe(oe, _, ue), () => ge(e); +} +function ge(e) { + (!e || _ === e) && (_ = null); +} +function _e(e) { + let t = x(g); try { t?.appendChild?.(e); } catch (e) { @@ -203,8 +203,8 @@ function be(e) { } return t; } -function xe(e) { - let t = pe(g); +function ve(e) { + let t = ue(_); try { t?.appendChild?.(e); } catch (e) { @@ -212,76 +212,76 @@ function xe(e) { } return t; } -function Se() { - return me(se, h); +function ye() { + return de(v, g); } //#endregion //#region ui/features/viewer/floatingViewerManager.ts -var y = null, Ce = null; -async function we() { - return y || (Ce ||= import("./FloatingViewer-CY901ToM.js").then((e) => (y = e.FloatingViewer, y)), Ce); +var S = null, be = null; +async function xe() { + return S || (be ||= import("./FloatingViewer-A8uTs2JS.js").then((e) => (S = e.FloatingViewer, S)), be); } -var b = null, Te = null; -async function Ee() { - if (!b) return Te ||= import("./NodeStreamController-_rtriits.js").then((e) => { - b = e.setNodeStreamActive; - }), Te; +var C = null, Se = null; +async function Ce() { + if (!C) return Se ||= import("./NodeStreamController-EQygLyLg.js").then((e) => { + C = e.setNodeStreamActive; + }), Se; } -var x = Object.freeze({ +var w = Object.freeze({ SIMPLE: "simple", AB: "ab", SIDE: "side", GRID: "grid", GRAPH: "graph" }); -function De(e) { +function we(e) { let t = String(e || "").trim().toLowerCase(); - return t === "sidebyside" ? x.SIDE : Object.values(x).includes(t) ? t : ""; + return t === "sidebyside" ? w.SIDE : Object.values(w).includes(t) ? t : ""; } -var S = null; -function C() { +var T = null; +function E() { return r.MFV_LIVE_DEFAULT !== !1; } -function w() { +function D() { return r.MFV_PREVIEW_DEFAULT !== !1; } -var T = C(), E = w(), D = !1, O = null, k = !1, A = null, j = 0; -function Oe() { - T = C(), E = w(), S?.setLiveActive(T), S?.setPreviewActive(E); +var O = E(), k = D(), A = !1, j = null, M = !1, N = null, P = 0; +function Te() { + O = E(), k = D(), T?.setLiveActive(O), T?.setPreviewActive(k); } -async function M() { - if (!S) { - let e = await we(); - S || (S = new e({ controller: { - close: () => Q.close(), - toggle: () => Q.toggle(), - toggleLive: () => Q.toggleLive(), - togglePreview: () => Q.togglePreview(), - toggleNodeStream: () => Q.toggleNodeStream(), - popOut: () => Q.popOut(), +async function F() { + if (!T) { + let e = await xe(); + T || (T = new e({ controller: { + close: () => Y.close(), + toggle: () => Y.toggle(), + toggleLive: () => Y.toggleLive(), + togglePreview: () => Y.togglePreview(), + toggleNodeStream: () => Y.toggleNodeStream(), + popOut: () => Y.popOut(), onModeChanged: (e) => { - S?.isVisible && e !== x.SIMPLE && z(); + T?.isVisible && e !== w.SIMPLE && H(); }, - handleForwardedKeydown: (e) => qe(e) - } }), xe(S.render())); + handleForwardedKeydown: (e) => Q(e) + } }), ve(T.render())); } try { - let e = S?.element || null; - e?.isConnected === !1 && xe(e); + let e = T?.element || null; + e?.isConnected === !1 && ve(e); } catch (e) { console.debug?.(e); } - return S; + return T; } -function N() { +function I() { try { - A?.abort(); + N?.abort(); } catch (e) { console.debug?.(e); } - A = null; + N = null; } -function P() { +function L() { try { let e = window.__MJR_LAST_SELECTION_GRID__; if (e?.isConnected) return e; @@ -290,34 +290,34 @@ function P() { } return f(); } -function ke() { - if (S) { +function Ee() { + if (T) { try { - S.dispose?.(); + T.dispose?.(); } catch (e) { console.debug?.(e); } - S = null; + T = null; } } -function F(e) { +function R(e) { typeof window > "u" || window.dispatchEvent(new CustomEvent(i.MFV_VISIBILITY_CHANGED, { detail: { visible: !!e } })); } -function I(e) { - e && (e.setLiveActive(T), e.setPreviewActive(E), e.setNodeStreamActive?.(D)); +function z(e) { + e && (e.setLiveActive(O), e.setPreviewActive(k), e.setNodeStreamActive?.(A)); } -function L(e) { - e?.setNodeStreamSelection && e.setNodeStreamSelection(O || null); +function B(e) { + e?.setNodeStreamSelection && e.setNodeStreamSelection(j || null); } -function Ae(e, t) { +function De(e, t) { if (!e) return; let n = e._mode; - if (!(n === x.AB || n === x.SIDE || n === x.GRID)) { + if (!(n === w.AB || n === w.SIDE || n === w.GRID)) { e.loadMediaA(t, { autoMode: !0 }); return; } let r = e.getPinnedSlots(); - if (n === x.GRID) { + if (n === w.GRID) { let n = [ "A", "B", @@ -343,9 +343,9 @@ function Ae(e, t) { e.loadMediaPair(e._mediaA, t); } } -function je(e) { +function Oe(e) { try { - let t = P(); + let t = L(); if (!t) return null; let n = Array.from(t.querySelectorAll("[data-mjr-asset-id]")), r = n.findIndex((t) => t.dataset.mjrAssetId === String(e)); if (r < 0) return null; @@ -355,30 +355,30 @@ function je(e) { return console.debug?.("[MFV] _findAdjacentGridId error", e), null; } } -async function R(e) { - if (!e.length || !S) return; - N(); - let t = ++j, r = typeof AbortController < "u" ? new AbortController() : null; - A = r; +async function V(e) { + if (!e.length || !T) return; + I(); + let n = ++P, r = typeof AbortController < "u" ? new AbortController() : null; + N = r; try { - let i = S.getPinnedSlots(), a = i.size > 0, o = S._mode, s = o === x.GRID, c = o === x.AB || o === x.SIDE, l = s ? 4 : 2, u = e.slice(0, l); + let i = T.getPinnedSlots(), a = i.size > 0, o = T._mode, s = o === w.GRID, c = o === w.AB || o === w.SIDE, l = s ? 4 : 2, u = e.slice(0, l); if (a && (c || s)) { let e = l - i.size; u = u.slice(0, Math.max(1, e)); } else if (u.length === 1 && c) { - let e = je(u[0]); + let e = Oe(u[0]); e && (u = [u[0], e]); } - let d = await n(u, r ? { signal: r.signal } : {}); - if (r?.signal.aborted || j !== t || !d?.ok || !Array.isArray(d.data) || !d.data.length || !S) return; + let d = await t(u, r ? { signal: r.signal } : {}); + if (r?.signal.aborted || P !== n || !d?.ok || !Array.isArray(d.data) || !d.data.length || !T) return; let f = d.data; if (s) { if (a) { let e = { - A: S._mediaA, - B: S._mediaB, - C: S._mediaC, - D: S._mediaD + A: T._mediaA, + B: T._mediaB, + C: T._mediaC, + D: T._mediaD }, t = [ "A", "B", @@ -386,211 +386,200 @@ async function R(e) { "D" ].filter((e) => !i.has(e)), n = 0; for (let r of t) n < f.length && (e[r] = f[n++]); - S.loadMediaQuad(e.A, e.B, e.C, e.D); - } else f.length >= 3 ? S.loadMediaQuad(f[0], f[1], f[2], f[3] || null) : f.length >= 2 ? S.loadMediaPair(f[0], f[1]) : S.loadMediaA(f[0], { autoMode: !0 }); + T.loadMediaQuad(e.A, e.B, e.C, e.D); + } else f.length >= 3 ? T.loadMediaQuad(f[0], f[1], f[2], f[3] || null) : f.length >= 2 ? T.loadMediaPair(f[0], f[1]) : T.loadMediaA(f[0], { autoMode: !0 }); return; } - if (i.has("A") && i.has("B") && S._mediaA && S._mediaB) return; - i.has("A") && S._mediaA ? S.loadMediaPair(S._mediaA, f[0]) : i.has("B") && S._mediaB ? S.loadMediaPair(f[0], S._mediaB) : u.length >= 2 && f.length >= 2 ? S.loadMediaPair(f[0], f[1]) : S.loadMediaA(f[0], { autoMode: !0 }); + if (i.has("A") && i.has("B") && T._mediaA && T._mediaB) return; + i.has("A") && T._mediaA ? T.loadMediaPair(T._mediaA, f[0]) : i.has("B") && T._mediaB ? T.loadMediaPair(f[0], T._mediaB) : u.length >= 2 && f.length >= 2 ? T.loadMediaPair(f[0], f[1]) : T.loadMediaA(f[0], { autoMode: !0 }); } catch (e) { e?.name !== "AbortError" && o(e, "floatingViewerManager._loadFromIds"); } finally { - A === r && (A = null); + N === r && (N = null); } } -function z() { +function H() { try { - let e = P(); + let e = L(); if (!e) return; let t = p(e); if (!t.size) return; - R(Array.from(t)); + V(Array.from(t)); } catch (e) { console.debug?.("[MFV] Error reading current grid selection", e); } } -function Me(e) { - if (!S?.isVisible) return; +function ke(e) { + if (!T?.isVisible) return; let t = Array.isArray(e?.detail?.selectedAssets) ? e.detail.selectedAssets : [], n = new Set(t.filter((e) => String(e?.kind || "").toLowerCase() === "folder").map((e) => String(e?.id || "")).filter(Boolean)), r = Array.isArray(e?.detail?.selectedIds) ? e.detail.selectedIds.map(String).filter((e) => !!e && !n.has(e)) : []; if (r.length) { - R(r); + V(r); return; } try { - let e = P(); + let e = L(); if (!e) return; let t = Array.from(p(e)).map(String).filter(Boolean); if (!t.length) return; - R(t); + V(t); } catch (e) { console.debug?.("[MFV] selection fallback failed", e); } } -function B() { - k || typeof window > "u" || (window.addEventListener(i.SELECTION_CHANGED, Me), k = !0); +function U() { + M || typeof window > "u" || (window.addEventListener(i.SELECTION_CHANGED, ke), M = !0); } -function Ne() { - typeof window < "u" && window.removeEventListener(i.SELECTION_CHANGED, Me), k = !1, N(); +function Ae() { + typeof window < "u" && window.removeEventListener(i.SELECTION_CHANGED, ke), M = !1, I(); } -var V = !1, H = null, U = null, W = null, G = !1, K = !1, q = !1, J = null, Y = null, X = ""; -function Z() { - S?.isVisible && S.refreshSidebar?.(); +var W = !1, G = null, K = null, q = ""; +function je() { + T?.isVisible && T.refreshSidebar?.(); } -function Pe() { - Fe(); +function Me() { + Ne(); let e = typeof window < "u" ? window : globalThis; if (typeof e.requestAnimationFrame == "function") { - X = "raf", Y = e.requestAnimationFrame(() => { - Y = null, X = "", Z(); + q = "raf", K = e.requestAnimationFrame(() => { + K = null, q = "", je(); }); return; } - X = "timeout", Y = e.setTimeout(() => { - Y = null, X = "", Z(); + q = "timeout", K = e.setTimeout(() => { + K = null, q = "", je(); }, 16); } -function Fe() { - if (Y == null) return; +function Ne() { + if (K == null) return; let e = typeof window < "u" ? window : globalThis; try { - X === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(Y) : typeof e.clearTimeout == "function" && e.clearTimeout(Y); + q === "raf" && typeof e.cancelAnimationFrame == "function" ? e.cancelAnimationFrame(K) : typeof e.clearTimeout == "function" && e.clearTimeout(K); } catch (e) { console.debug?.(e); } - Y = null, X = ""; + K = null, q = ""; } -function Ie() { - if (!V) try { - let e = t()?.canvas; - if (!e) return; - G = Object.prototype.hasOwnProperty.call(e, "onNodeSelected"), K = Object.prototype.hasOwnProperty.call(e, "onSelectionChange"), q = Object.prototype.hasOwnProperty.call(e, "onNodeDeselected"), H = e.onNodeSelected, U = e.onSelectionChange, W = e.onNodeDeselected, e.onNodeSelected = function(e) { - H?.call(this, e), Z(); - }, e.onSelectionChange = function(e) { - U?.call(this, e), Z(); - }, e.onNodeDeselected = function(e) { - W?.call(this, e), Z(); - }; - let n = e.canvas; - n?.addEventListener && (J = Pe, n.addEventListener("pointerup", J)), V = !0; +function J() { + if (!W) try { + G = n(Me, { includePointerFallback: !0 }), W = typeof G == "function"; } catch (e) { console.debug?.("[MFV] _bindNodeSelectionListener error", e); } } -function Le() { - if (V) { - Fe(); +function Pe() { + if (W) { + Ne(); try { - let e = t()?.canvas; - e && (G ? e.onNodeSelected = H : delete e.onNodeSelected, K ? e.onSelectionChange = U : delete e.onSelectionChange, q ? e.onNodeDeselected = W : delete e.onNodeDeselected, J && e.canvas?.removeEventListener && e.canvas.removeEventListener("pointerup", J)); + G?.(); } catch (e) { console.debug?.("[MFV] _unbindNodeSelectionListener error", e); } - H = null, U = null, W = null, G = !1, K = !1, q = !1, J = null, V = !1; + G = null, W = !1; } } -var Q = { +var Y = { async openAssets({ assets: e = [], asset: t = null, index: n = 0, mode: r = "" } = {}) { let i = Array.isArray(e) ? e.filter(Boolean) : t ? [t] : []; if (!i.length) return !1; - let a = await M(), o = !!a.isVisible, s = Math.max(0, Math.min(Number(n) || 0, i.length - 1)), c = De(r); - c && a.setMode(c), a.show(), I(a), B(), Ie(); + let a = await F(), o = !!a.isVisible, s = Math.max(0, Math.min(Number(n) || 0, i.length - 1)), c = we(r); + c && a.setMode(c), a.show(), z(a), U(), J(); let l = a._mode; - return l === x.GRID && i.length >= 3 ? a.loadMediaQuad(i[0], i[1], i[2], i[3] || null) : (l === x.AB || l === x.SIDE) && i.length >= 2 ? a.loadMediaPair(i[0], i[1]) : a.loadMediaA(i[s], { autoMode: !1 }), o || F(!0), !0; + return l === w.GRID && i.length >= 3 ? a.loadMediaQuad(i[0], i[1], i[2], i[3] || null) : (l === w.AB || l === w.SIDE) && i.length >= 2 ? a.loadMediaPair(i[0], i[1]) : a.loadMediaA(i[s], { autoMode: !1 }), o || R(!0), !0; }, async open() { - let e = await M(); - e.show(), I(e), B(), Ie(), V || requestAnimationFrame(() => Ie()), z(), D && L(e), F(!0); + let e = await F(); + e.show(), z(e), U(), J(), W || requestAnimationFrame(() => J()), H(), A && B(e), R(!0); }, close() { - if (S) try { - S.isPopped && S.popIn(), S.hide(); + if (T) try { + T.isPopped && T.popIn(), T.hide(); } catch (e) { console.debug?.(e); } - Ne(), S?.setNodeStreamSelection?.(null), Le(), F(!1); + Ae(), T?.setNodeStreamSelection?.(null), Pe(), R(!1); }, async toggle() { - S?.isVisible ? Q.close() : await Q.open(); + T?.isVisible ? Y.close() : await Y.open(); }, toggleLive() { - Q.setLiveActive(!T); + Y.setLiveActive(!O); }, togglePreview() { - Q.setPreviewActive(!E); + Y.setPreviewActive(!k); }, async toggleCompareAB() { - let e = await M(); + let e = await F(); if (!e.isVisible) { - e.setMode(x.AB), e.show(), I(e), B(), z(), F(!0); + e.setMode(w.AB), e.show(), z(e), U(), H(), R(!0); return; } let t = { - [x.AB]: x.SIDE, - [x.SIDE]: x.SIMPLE, - [x.GRID]: x.SIMPLE, - [x.SIMPLE]: x.AB - }[e._mode] || x.AB; - e.setMode(t), t !== x.SIMPLE && z(); + [w.AB]: w.SIDE, + [w.SIDE]: w.SIMPLE, + [w.GRID]: w.SIMPLE, + [w.SIMPLE]: w.AB + }[e._mode] || w.AB; + e.setMode(t), t !== w.SIMPLE && H(); }, async upsertWithContent(e) { - let t = await M(), n = !!t.isVisible; - !n && r.MFV_LIVE_AUTO_OPEN === !1 || (t.show(), I(t), B(), Ae(t, e), n || F(!0)); + let t = await F(), n = !!t.isVisible; + !n && r.MFV_LIVE_AUTO_OPEN === !1 || (t.show(), z(t), U(), De(t, e), n || R(!0)); }, setLiveActive(e) { - T = !!e, S?.setLiveActive(T); + O = !!e, T?.setLiveActive(O); }, getLiveActive() { - return T; + return O; }, async popOut() { - let e = await M(); - e.isPopped ? e.popIn() : (e.isVisible || await Q.open(), e.popOut()); + let e = await F(); + e.isPopped ? e.popIn() : (e.isVisible || await Y.open(), e.popOut()); }, setPreviewActive(e) { - E = !!e, S?.setPreviewActive(E); + k = !!e, T?.setPreviewActive(k); }, getPreviewActive() { - return E; + return k; }, async feedPreviewBlob(e, t = {}) { - if (!E) return; - let n = await M(), i = !!n.isVisible; - !i && r.MFV_PREVIEW_AUTO_OPEN === !1 || (n.isVisible || n.show(), I(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), i || F(!0)); + if (!k) return; + let n = await F(), i = !!n.isVisible; + !i && r.MFV_PREVIEW_AUTO_OPEN === !1 || (n.isVisible || n.show(), z(n), n.loadPreviewBlob(e, ...Object.keys(t).length ? [t] : []), i || R(!0)); }, toggleNodeStream() { - Q.setNodeStreamActive(!D); + Y.setNodeStreamActive(!A); }, setNodeStreamActive(e) { - D = !!e, D || (O = null), Ee().then(() => { - b && b(D); - }), S?.setNodeStreamActive?.(D), D ? S && L(S) : S?.setNodeStreamSelection?.(null); + A = !!e, A || (j = null), Ce().then(() => { + C && C(A); + }), T?.setNodeStreamActive?.(A), A ? T && B(T) : T?.setNodeStreamSelection?.(null); }, getNodeStreamActive() { - return D; + return A; }, setNodeStreamSelection(e, t, n) { - O = e == null || e === "" ? null : { + j = e == null || e === "" ? null : { nodeId: e, classType: t, title: n }; - let r = S; - r && L(r); + let r = T; + r && B(r); }, async feedNodeStream(e) { - if (!D) return; - let t = await M(), n = !!t.isVisible; - !n && r.MFV_NODE_STREAM_AUTO_OPEN === !1 || (t.isVisible || (t.show(), B()), I(t), L(t), Ae(t, e), n || F(!0)); + if (!A) return; + let t = await F(), n = !!t.isVisible; + !n && r.MFV_NODE_STREAM_AUTO_OPEN === !1 || (t.isVisible || (t.show(), U()), z(t), B(t), De(t, e), n || R(!0)); } -}, $ = !1, Re = () => Q.open(), ze = () => Q.close(), Be = () => Q.toggle(), Ve = () => Q.toggleLive(), He = () => Q.togglePreview(), Ue = () => Q.toggleNodeStream(), We = () => Q.popOut(), Ge = () => { +}, X = !1, Fe = () => Y.open(), Ie = () => Y.close(), Le = () => Y.toggle(), Re = () => Y.toggleLive(), ze = () => Y.togglePreview(), Be = () => Y.toggleNodeStream(), Z = () => Y.popOut(), Ve = () => { try { - S?.isPopped && S.popIn(); + T?.isPopped && T.popIn(); } catch {} -}, Ke = (e) => { +}, He = (e) => { let t = String(e?.detail?.key || ""); - (!t || t === "viewer" || t === "viewer.mfvLiveDefault" || t === "viewer.mfvPreviewDefault") && Oe(); -}, qe = (e) => { - if (!S?.isVisible || ae() || re().scope === "viewer") return; + (!t || t === "viewer" || t === "viewer.mfvLiveDefault" || t === "viewer.mfvPreviewDefault") && Te(); +}, Q = (e) => { + if (!T?.isVisible || ie() || ne().scope === "viewer") return; let t = e?.key?.toLowerCase?.() || ""; if (e?.target?.isContentEditable || e?.target?.closest?.("input, textarea, select, [contenteditable='true']")) return; let n = () => { @@ -598,49 +587,49 @@ var Q = { }; if (!e?.ctrlKey && !e?.metaKey && !e?.altKey && !e?.shiftKey) { if (t === "v") { - n(), Q.toggle(); + n(), Y.toggle(); return; } if (t === "k") { - n(), Q.togglePreview(); + n(), Y.togglePreview(); return; } if (t === "l") { - n(), Q.toggleLive(); + n(), Y.toggleLive(); return; } if (t === "n") { - n(), Q.toggleNodeStream(); + n(), Y.toggleNodeStream(); return; } - t === "c" && (n(), Q.toggleCompareAB()); + t === "c" && (n(), Y.toggleCompareAB()); return; } }; -function Je() { - $ || typeof window > "u" || !window?.addEventListener || (window.addEventListener(i.MFV_OPEN, Re), window.addEventListener(i.MFV_CLOSE, ze), window.addEventListener(i.MFV_TOGGLE, Be), window.addEventListener(i.MFV_LIVE_TOGGLE, Ve), window.addEventListener(i.MFV_PREVIEW_TOGGLE, He), window.addEventListener(i.MFV_NODESTREAM_TOGGLE, Ue), window.addEventListener(i.MFV_POPOUT, We), window.addEventListener(i.SETTINGS_CHANGED, Ke), window.addEventListener("keydown", qe, !0), window.addEventListener("beforeunload", Ge), $ = !0); +function $() { + X || typeof window > "u" || !window?.addEventListener || (window.addEventListener(i.MFV_OPEN, Fe), window.addEventListener(i.MFV_CLOSE, Ie), window.addEventListener(i.MFV_TOGGLE, Le), window.addEventListener(i.MFV_LIVE_TOGGLE, Re), window.addEventListener(i.MFV_PREVIEW_TOGGLE, ze), window.addEventListener(i.MFV_NODESTREAM_TOGGLE, Be), window.addEventListener(i.MFV_POPOUT, Z), window.addEventListener(i.SETTINGS_CHANGED, He), window.addEventListener("keydown", Q, !0), window.addEventListener("beforeunload", Ve), X = !0); } -function Ye() { +function Ue() { if (typeof window > "u" || !window?.removeEventListener) { - $ = !1; + X = !1; return; } - window.removeEventListener(i.MFV_OPEN, Re), window.removeEventListener(i.MFV_CLOSE, ze), window.removeEventListener(i.MFV_TOGGLE, Be), window.removeEventListener(i.MFV_LIVE_TOGGLE, Ve), window.removeEventListener(i.MFV_PREVIEW_TOGGLE, He), window.removeEventListener(i.MFV_NODESTREAM_TOGGLE, Ue), window.removeEventListener(i.MFV_POPOUT, We), window.removeEventListener(i.SETTINGS_CHANGED, Ke), window.removeEventListener("keydown", qe, !0), window.removeEventListener("beforeunload", Ge), $ = !1; + window.removeEventListener(i.MFV_OPEN, Fe), window.removeEventListener(i.MFV_CLOSE, Ie), window.removeEventListener(i.MFV_TOGGLE, Le), window.removeEventListener(i.MFV_LIVE_TOGGLE, Re), window.removeEventListener(i.MFV_PREVIEW_TOGGLE, ze), window.removeEventListener(i.MFV_NODESTREAM_TOGGLE, Be), window.removeEventListener(i.MFV_POPOUT, Z), window.removeEventListener(i.SETTINGS_CHANGED, He), window.removeEventListener("keydown", Q, !0), window.removeEventListener("beforeunload", Ve), X = !1; } -function Xe({ reinstallGlobalHandlers: e = !1 } = {}) { - let t = !!S?.isVisible; +function We({ reinstallGlobalHandlers: e = !1 } = {}) { + let t = !!T?.isVisible; try { - S?.isPopped && S.popIn(); + T?.isPopped && T.popIn(); } catch (e) { console.debug?.(e); } - Ye(), Ne(), Le(), N(), j += 1, T = C(), E = w(), D = !1; + Ue(), Ae(), Pe(), I(), P += 1, O = E(), k = D(), A = !1; try { - b && b(!1); + C && C(!1); } catch (e) { console.debug?.(e); } - ke(), t && F(!1), e && Je(); + Ee(), t && R(!1), e && $(); } //#endregion -export { u as _, Se as a, re as c, oe as d, p as f, f as g, d as h, be as i, ae as l, ne as m, Je as n, ve as o, ee as p, Xe as r, ge as s, Q as t, ie as u, a as v, o as y }; +export { u as _, ye as a, ne as c, ae as d, p as f, f as g, d as h, _e as i, ie as l, te as m, $ as n, he as o, m as p, We as r, pe as s, Y as t, re as u, a as v, o as y }; diff --git a/dist/chunks/genInfo-DPkTyDKA.js b/dist/chunks/genInfo-oNZ5Okna.js similarity index 70% rename from dist/chunks/genInfo-DPkTyDKA.js rename to dist/chunks/genInfo-oNZ5Okna.js index 4e26eda2..d261e704 100644 --- a/dist/chunks/genInfo-DPkTyDKA.js +++ b/dist/chunks/genInfo-oNZ5Okna.js @@ -1,14 +1,14 @@ import { t as e } from "./rolldown-runtime-Dy4uBu1J.js"; -import { t } from "./config-dvcltBqE.js"; -import { S as n, c as r, l as i, p as a, s as o, t as s } from "./SidebarWorkflowSection-CxD2u7Bb.js"; -import { C as c, F as l, S as u, T as d, at as f, ot as p, w as m, x as h } from "./mjr-primevue-DeVPqKdl.js"; +import { l as t, t as n } from "./config-Cxv7acF8.js"; +import { C as r, c as i, l as a, m as o, s, t as c } from "./SidebarWorkflowSection-na0bq_pe.js"; +import { C as l, F as u, S as d, T as f, at as p, ot as m, rt as h, w as g, x as _ } from "./mjr-primevue-DeVPqKdl.js"; //#region ui/vue/components/viewer/ViewerMetadataBlock.vue -var g = { style: { +var v = { style: { display: "flex", "flex-direction": "column", gap: "10px", "margin-bottom": "14px" -} }, _ = { +} }, y = { key: 0, style: { "font-size": "12px", @@ -16,7 +16,7 @@ var g = { style: { "letter-spacing": "0.02em", color: "rgba(255,255,255,0.86)" } -}, v = { +}, b = { key: 1, style: { padding: "10px 12px", @@ -26,10 +26,21 @@ var g = { style: { color: "rgba(255,255,255,0.86)", "white-space": "pre-wrap" } -}, y = { style: { +}, x = { style: { + "font-size": "12px", + "font-weight": "700", + "margin-bottom": "6px" +} }, S = { style: { + "font-size": "12px", + opacity: "0.88" +} }, C = { style: { + "font-size": "12px", + "font-weight": "700", + "margin-bottom": "6px" +} }, w = { style: { "font-size": "12px", opacity: "0.9" -} }, b = { +} }, T = { key: 6, style: { padding: "10px 12px", @@ -38,7 +49,7 @@ var g = { style: { background: "rgba(255,255,255,0.06)", color: "rgba(255,255,255,0.72)" } -}, x = { +}, E = { key: 7, style: { border: "1px solid rgba(255,255,255,0.10)", @@ -46,7 +57,12 @@ var g = { style: { background: "rgba(255,255,255,0.04)", overflow: "hidden" } -}, S = { style: { +}, D = { style: { + cursor: "pointer", + padding: "10px 12px", + color: "rgba(255,255,255,0.78)", + "user-select": "none" +} }, O = { style: { margin: "0", padding: "10px 12px", "max-height": "280px", @@ -54,7 +70,7 @@ var g = { style: { "font-size": "11px", "line-height": "1.35", color: "rgba(255,255,255,0.86)" -} }, C = { +} }, k = { __name: "ViewerMetadataBlock", props: { title: { @@ -75,8 +91,8 @@ var g = { style: { } }, setup(e) { - let n = e; - function a(e) { + let r = e; + function o(e) { try { if (!e || typeof e != "object") return null; let t = e?.metadata_raw; @@ -85,7 +101,7 @@ var g = { style: { return null; } } - function C(e) { + function k(e) { let t = e?.metadata_raw ?? null; if (!t) return null; if (typeof t == "object") return t; @@ -99,7 +115,7 @@ var g = { style: { return null; } } - function w(e) { + function A(e) { try { let t = Object.entries(e || {}); if (!t.length) return !1; @@ -110,8 +126,8 @@ var g = { style: { } return !1; } - function T(e) { - let t = C(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null; + function j(e) { + let t = k(e), n = e?.workflow || e?.Workflow || e?.comfy_workflow || t?.workflow || t?.Workflow || t?.comfy_workflow || null; if (!n) return null; if (typeof n == "object") return n; if (typeof n != "string") return null; @@ -123,94 +139,81 @@ var g = { style: { return null; } } - function E(e) { - let t = C(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null; + function M(e) { + let t = k(e), n = e?.prompt || e?.Prompt || t?.prompt || t?.Prompt || null; if (!n) return null; - if (typeof n == "object") return w(n) ? n : null; + if (typeof n == "object") return A(n) ? n : null; if (typeof n != "string") return null; let r = n.trim(); if (!r) return null; try { let e = JSON.parse(r); - return w(e) ? e : null; + return A(e) ? e : null; } catch { return null; } } - function D(e) { - return !!(T(e) || E(e)); + function N(e) { + return !!(j(e) || M(e)); } - function O(e) { + function P(e) { let t = e || {}, n = t.generation_time || t.file_creation_time || t.mtime || t.created_at; return !!(t.width && t.height || t.duration && t.duration > 0 || n || t.size && t.size > 0 || t.id != null || t.job_id || t.file_info?.job_id || t.source_node_id || t.file_info?.source_node_id || t.source_node_type || t.file_info?.source_node_type || t.workflow_id || t.file_info?.workflow_id || t.user_metadata?.workflow?.id || t.metadata?.workflow_id); } - function k(e) { + function F(e) { if (e == null) return ""; let t = typeof e == "string" ? e : JSON.stringify(e, null, 2); return t ? t.length > 4e4 ? `${t.slice(0, 4e4)}\n...(truncated)` : t : ""; } - function A() { - typeof n.onRetry == "function" && n.onRetry(); + function I() { + typeof r.onRetry == "function" && r.onRetry(); } - let j = h(() => a(n.asset)), M = h(() => r(n.asset)), N = h(() => M.value.kind !== "empty"), P = h(() => O(n.asset)), F = h(() => t.WORKFLOW_MINIMAP_ENABLED !== !1 && D(n.asset)), I = h(() => j.value && typeof j.value == "object" && j.value.kind === "fetch_error"), L = h(() => k(n.asset?.metadata_raw)), R = h(() => !n.loading && !I.value && !P.value && !N.value && !F.value), z = h(() => { - if (!I.value) return ""; - let e = String(j.value?.message || j.value?.error || "Failed to load generation data."), t = String(j.value?.code || j.value?.stage || "").trim(); - return t ? `${e}\n\nCode: ${t}\nClick to retry.` : `${e}\n\nClick to retry.`; + let L = _(() => o(r.asset)), R = _(() => i(r.asset)), z = _(() => R.value.kind !== "empty"), B = _(() => P(r.asset)), V = _(() => n.WORKFLOW_MINIMAP_ENABLED !== !1 && N(r.asset)), H = _(() => L.value && typeof L.value == "object" && L.value.kind === "fetch_error"), U = _(() => F(r.asset?.metadata_raw)), W = _(() => !r.loading && !H.value && !B.value && !z.value && !V.value), G = _(() => { + if (!H.value) return ""; + let e = String(L.value?.message || L.value?.error || "Failed to load generation data."), n = String(L.value?.code || L.value?.stage || "").trim(); + return n ? t("viewer.metadataErrorWithCode", "{message}\n\nCode: {code}\nClick to retry.", { + message: e, + code: n + }) : t("viewer.metadataErrorRetry", "{message}\n\nClick to retry.", { message: e }); }); - return (e, t) => (l(), d("div", g, [ - n.title ? (l(), d("div", _, p(n.title), 1)) : m("", !0), - n.loading ? (l(), d("div", v, [...t[0] ||= [u("div", { style: { - "font-size": "12px", - "font-weight": "700", - "margin-bottom": "6px" - } }, "Loading", -1), u("div", { style: { - "font-size": "12px", - opacity: "0.88" - } }, "Loading generation data...", -1)]])) : m("", !0), - I.value ? (l(), d("div", { + return (e, n) => (u(), f("div", v, [ + r.title ? (u(), f("div", y, m(r.title), 1)) : g("", !0), + r.loading ? (u(), f("div", b, [d("div", x, m(h(t)("status.loading", "Loading")), 1), d("div", S, m(h(t)("viewer.loadingGenerationData", "Loading generation data...")), 1)])) : g("", !0), + H.value ? (u(), f("div", { key: 2, - style: f([{ + style: p([{ padding: "10px 12px", "border-radius": "10px", border: "1px solid rgba(244,67,54,0.35)", background: "rgba(244,67,54,0.08)", color: "rgba(255,255,255,0.9)", "white-space": "pre-wrap" - }, { cursor: n.onRetry ? "pointer" : "default" }]), - onClick: A - }, [t[1] ||= u("div", { style: { - "font-size": "12px", - "font-weight": "700", - "margin-bottom": "6px" - } }, "Error Loading Metadata", -1), u("div", y, p(z.value), 1)], 4)) : m("", !0), - P.value ? (l(), c(i, { + }, { cursor: r.onRetry ? "pointer" : "default" }]), + onClick: I + }, [d("div", C, m(h(t)("viewer.errorLoadingMetadata", "Error Loading Metadata")), 1), d("div", w, m(G.value), 1)], 4)) : g("", !0), + B.value ? (u(), l(a, { key: 3, - asset: n.asset - }, null, 8, ["asset"])) : m("", !0), - N.value ? (l(), c(o, { + asset: r.asset + }, null, 8, ["asset"])) : g("", !0), + z.value ? (u(), l(s, { key: 4, - asset: n.asset - }, null, 8, ["asset"])) : m("", !0), - F.value ? (l(), c(s, { + asset: r.asset + }, null, 8, ["asset"])) : g("", !0), + V.value ? (u(), l(c, { key: 5, - asset: n.asset - }, null, 8, ["asset"])) : m("", !0), - R.value ? (l(), d("div", b, " No generation data found for this file. ")) : m("", !0), - L.value ? (l(), d("details", x, [t[2] ||= u("summary", { style: { - cursor: "pointer", - padding: "10px 12px", - color: "rgba(255,255,255,0.78)", - "user-select": "none" - } }, " Raw metadata ", -1), u("pre", S, p(L.value), 1)])) : m("", !0) + asset: r.asset + }, null, 8, ["asset"])) : g("", !0), + W.value ? (u(), f("div", T, m(h(t)("viewer.noGenerationDataFile", "No generation data found for this file.")), 1)) : g("", !0), + U.value ? (u(), f("details", E, [d("summary", D, m(h(t)("msg.rawMetadata", "Raw metadata")), 1), d("pre", O, m(U.value), 1)])) : g("", !0) ])); } -}, w = /* @__PURE__ */ e({ - buildViewerMetadataBlocks: () => G, - ensureViewerMetadataAsset: () => W -}), T = (e, t = null) => { - let r = n(e); - return r === void 0 ? t : r; -}, E = t?.VIEWER_GENINFO_TTL_MS ?? 3e4, D = t?.VIEWER_GENINFO_ERROR_TTL_MS ?? 8e3, O = t?.VIEWER_GENINFO_MAX_ENTRIES ?? 300, k = /* @__PURE__ */ new Map(), A = /* @__PURE__ */ new Map(), j = /* @__PURE__ */ new Map(), M = (e, t, n) => { +}, A = /* @__PURE__ */ e({ + buildViewerMetadataBlocks: () => Z, + ensureViewerMetadataAsset: () => X +}), j = (e, t = null) => { + let n = r(e); + return n === void 0 ? t : n; +}, M = n?.VIEWER_GENINFO_TTL_MS ?? 3e4, N = n?.VIEWER_GENINFO_ERROR_TTL_MS ?? 8e3, P = n?.VIEWER_GENINFO_MAX_ENTRIES ?? 300, F = /* @__PURE__ */ new Map(), I = /* @__PURE__ */ new Map(), L = /* @__PURE__ */ new Map(), R = (e, t, n) => { try { let r = Date.now(); for (let [n, i] of e.entries()) { @@ -229,27 +232,27 @@ var g = { style: { } catch (e) { console.debug?.(e); } -}, N = (e, t, n) => { +}, z = (e, t, n) => { try { let r = e.get(t); return r ? Date.now() - (r.at || 0) > n ? (e.delete(t), null) : r.data ?? null : null; } catch { return null; } -}, P = (e, t, n, r, i) => { +}, B = (e, t, n, r, i) => { try { e.set(t, { at: Date.now(), data: n - }), M(e, r, i); + }), R(e, r, i); } catch (e) { console.debug?.(e); } -}, F = (e) => { +}, V = (e) => { try { let t = e?.id; if (t != null) return `id:${t}`; - let n = z(e); + let n = G(e); if (n) return `fp:${n}`; let r = String(e?.filename || e?.name || "").trim(), i = String(e?.subfolder || "").trim(), a = String(e?.source || e?.type || "output").trim().toLowerCase(); if (r) return `name:${a}:${i}:${r}`; @@ -257,7 +260,7 @@ var g = { style: { console.debug?.(e); } return null; -}, I = (e) => { +}, H = (e) => { try { if (!e || typeof e != "object") return null; let t = e?.metadata_raw; @@ -265,7 +268,7 @@ var g = { style: { } catch { return null; } -}, L = (e, t) => { +}, U = (e, t) => { try { if (!e || typeof e != "object" || !t || typeof t != "object") return; try { @@ -291,7 +294,7 @@ var g = { style: { } catch (e) { console.debug?.(e); } -}, R = (e) => { +}, W = (e) => { try { if (!e || typeof e != "object") return !1; if (e.geninfo && typeof e.geninfo == "object" && Object.keys(e.geninfo).length || e.prompt != null || e.workflow != null || e.metadata != null || e.exif != null) return !0; @@ -328,13 +331,13 @@ var g = { style: { } catch { return !1; } -}, z = (e) => { +}, G = (e) => { let t = e?.filepath || e?.path || e?.file_info?.filepath || e?.file_info?.path || e?.filePath || null; return typeof t == "string" && t.trim() || null; -}, B = (e) => { +}, K = (e) => { try { if (String(e?.mime || e?.mimetype || e?.type || "").toLowerCase().startsWith("video/")) return !0; - let t = (z(e) || String(e?.filename || e?.name || "")).split(".").pop()?.toLowerCase?.() || ""; + let t = (G(e) || String(e?.filename || e?.name || "")).split(".").pop()?.toLowerCase?.() || ""; return [ "mp4", "webm", @@ -347,19 +350,19 @@ var g = { style: { } catch { return !1; } -}, V = (e) => { +}, q = (e) => { if (!e) return null; if (typeof e == "object") return e; if (typeof e != "string") return null; let t = e.trim(); - return t ? T(() => { + return t ? j(() => { let e = JSON.parse(t); return e && typeof e == "object" ? e : null; }, null) : null; -}, H = (e) => { +}, J = (e) => { try { - if (!B(e) || e?.geninfo || e?.prompt || e?.workflow || e?.metadata) return; - let t = V(e?.metadata_raw) || {}; + if (!K(e) || e?.geninfo || e?.prompt || e?.workflow || e?.metadata) return; + let t = q(e?.metadata_raw) || {}; if (t.geninfo_status) return; if (e?.geninfo_status) { t.geninfo_status = e.geninfo_status, e.metadata_raw = t; @@ -369,7 +372,7 @@ var g = { style: { } catch (e) { console.debug?.(e); } -}, U = (e, t) => { +}, Y = (e, t) => { let n = t && typeof t == "object" ? t : null; if (!n) return e; try { @@ -405,7 +408,7 @@ var g = { style: { try { if (e.metadata_raw == null) e.metadata_raw = n; else { - let t = V(e.metadata_raw); + let t = q(e.metadata_raw); if (t && typeof t == "object") { for (let e of [ "geninfo_status", @@ -421,58 +424,58 @@ var g = { style: { } return e; }; -async function W(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCache: r, signal: i } = {}) { +async function X(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCache: r, signal: i } = {}) { if (!e || typeof e != "object") return e; - let a = e?.id ?? null, o = F(e), s = e, c = o ? N(k, o, E) : null; + let a = e?.id ?? null, o = V(e), s = e, c = o ? z(F, o, M) : null; if (c && typeof c == "object") return { ...e, ...c }; - let l = o ? N(A, o, D) : null; + let l = o ? z(I, o, N) : null; if (l) { try { - L(s, l); + U(s, l); } catch (e) { console.debug?.(e); } return s; } - if (o && j.has(o)) try { - let e = j.get(o); + if (o && L.has(o)) try { + let e = L.get(o); if (e && typeof e.then == "function") return await e; } catch (e) { console.debug?.(e); } let u = async () => { - let c = a == null ? null : T(() => r?.getCached?.(a)?.data || null, null); + let c = a == null ? null : j(() => r?.getCached?.(a)?.data || null, null); c && typeof c == "object" && (s = { ...e, ...c }); let l = !!(s?.has_generation_data || s?.has_workflow || s?.has_generation || s?.has_generation_info), u = !!(s?.geninfo || s?.prompt || s?.workflow || s?.metadata), d = null; - if (a != null && (!R(s) || l && !u)) { - let e = await T(() => t?.(a, i ? { signal: i } : {}), null); + if (a != null && (!W(s) || l && !u)) { + let e = await j(() => t?.(a, i ? { signal: i } : {}), null); e?.ok && e.data && typeof e.data == "object" ? (s = { ...s, ...e.data - }, T(() => r?.setCached?.(a, e.data))) : e && e?.code !== "ABORTED" && (d = { + }, j(() => r?.setCached?.(a, e.data))) : e && e?.code !== "ABORTED" && (d = { kind: "fetch_error", stage: "asset", code: e?.code || "FETCH_ERROR", message: e?.error || "Failed to load asset metadata" }); } - if (!R(s)) try { + if (!W(s)) try { let e = String(s?.source || s?.type || "output").trim().toLowerCase() || "output", t = String(s?.filename || s?.name || s?.file_info?.filename || "").trim(), r = String(s?.subfolder || s?.file_info?.subfolder || "").trim(), a = String(s?.root_id || s?.rootId || s?.file_info?.root_id || "").trim(), o = String(s?.filepath || s?.path || s?.file_info?.filepath || "").trim(); if (t) { - let c = await T(() => n?.({ + let c = await j(() => n?.({ type: e, filename: t, subfolder: r, root_id: a, filepath: o }, i ? { signal: i } : {}), null); - c?.ok && c.data ? s = U({ ...s }, c.data) : c && c?.code !== "ABORTED" && (d = { + c?.ok && c.data ? s = Y({ ...s }, c.data) : c && c?.code !== "ABORTED" && (d = { kind: "fetch_error", stage: "file_scoped", code: c?.code || "FETCH_ERROR", @@ -482,16 +485,16 @@ async function W(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCac } catch (e) { console.debug?.(e); } - if (H(s), !R(s) && d) { - let e = I(s); - e && e.kind === "media_pipeline" || L(s, d); + if (J(s), !W(s) && d) { + let e = H(s); + e && e.kind === "media_pipeline" || U(s, d); } - return R(s) && o ? P(k, o, s, E, O) : d && o && P(A, o, d, D, O), s; + return W(s) && o ? B(F, o, s, M, P) : d && o && B(I, o, d, N, P), s; }; if (o) { let e = () => { try { - j.delete(o); + L.delete(o); } catch (e) { console.debug?.(e); } @@ -508,19 +511,19 @@ async function W(e, { getAssetMetadata: t, getFileMetadataScoped: n, metadataCac console.debug?.(e); } try { - j.delete(o); + L.delete(o); } catch (e) { console.debug?.(e); } }); - return j.set(o, t), await t; + return L.set(o, t), await t; } return await u(); } -function G({ title: e, asset: t, ui: n } = {}) { +function Z({ title: e, asset: t, ui: n } = {}) { let r = document.createElement("div"); try { - let { app: i } = a(C, { + let { app: i } = o(k, { title: e, asset: t, loading: !!n?.loading, @@ -541,18 +544,18 @@ function G({ title: e, asset: t, ui: n } = {}) { let t = document.createElement("div"); t.textContent = e, t.style.cssText = "font-size: 12px; font-weight: 600; letter-spacing: 0.02em; color: rgba(255,255,255,0.86);", i.appendChild(t); } - let o = t?.metadata_raw; - if (o != null) { + let a = t?.metadata_raw; + if (a != null) { let e = document.createElement("details"); e.style.cssText = "border: 1px solid rgba(255,255,255,0.10); border-radius: 10px; background: rgba(255,255,255,0.04); overflow: hidden;"; let t = document.createElement("summary"); t.textContent = "Raw metadata", t.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;"; let n = document.createElement("pre"); n.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 r = typeof o == "string" ? o : JSON.stringify(o, null, 2); + let r = typeof a == "string" ? a : JSON.stringify(a, null, 2); r.length > 4e4 && (r = `${r.slice(0, 4e4)}\n...(truncated)`), n.textContent = r, e.appendChild(t), e.appendChild(n), i.appendChild(e); } return i; } //#endregion -export { w as n, W as t }; +export { A as n, X as t }; diff --git a/dist/chunks/geninfoParser-5vKgjqjD.js b/dist/chunks/geninfoParser-5vKgjqjD.js new file mode 100644 index 00000000..b3388261 --- /dev/null +++ b/dist/chunks/geninfoParser-5vKgjqjD.js @@ -0,0 +1,477 @@ +//#region ui/components/sidebar/parsers/a1111ParamsParser.ts +function e(e) { + if (!e || typeof e != "string") return null; + let t = {}, n = e.split(/\nNegative prompt:\s*/i); + if (n[0] && (t.prompt = n[0].trim()), n[1]) { + let e = n[1].match(/^(.*?)\n?(Steps:.*)$/s); + if (e) { + t.negative_prompt = e[1].trim(); + let n = e[2], r = (e) => { + let t = n.match(e); + return t ? t[1].trim() : null; + }; + t.steps = r(/Steps:\s*(\d+)/i), t.sampler = r(/Sampler:\s*([^,\n]+)/i), t.cfg = r(/CFG scale:\s*([\d.]+)/i), t.seed = r(/Seed:\s*(\d+)/i), t.width = r(/Size:\s*(\d+)x\d+/i), t.height = r(/Size:\s*\d+x(\d+)/i), t.model = r(/Model:\s*([^,\n]+)/i), t.denoising = r(/Denoising strength:\s*([\d.]+)/i), t.clip_skip = r(/Clip skip:\s*(\d+)/i); + } else t.negative_prompt = n[1].trim(); + } + return Object.keys(t).length > 0 ? t : null; +} +//#endregion +//#region ui/components/sidebar/parsers/comfyWorkflowParser.ts +function t(e) { + try { + let t = Object.entries(e || {}); + if (!t.length) return !1; + let n = 0; + for (let [, e] of t.slice(0, 50)) if (!(!e || typeof e != "object") && (e.inputs && typeof e.inputs == "object" && (n += 1), n >= 2)) return !0; + return !1; + } catch { + return !1; + } +} +function n(e) { + if (!e || typeof e != "object") return null; + let t = {}, n = [], o = r(e), l = []; + for (let r of u(e)) { + if (!r || typeof r != "object") continue; + let e = m(r); + if (!e || typeof e != "object") continue; + let u = String(r?.class_type || r?.type || "").toLowerCase(), d = String(r?.title || r?._meta?.title || "").toLowerCase(), f = (e, n) => { + if (t[e] || typeof n != "string") return; + let r = n.trim(); + r && (/^[\d\s.,+-]+$/.test(r) || (t[e] = r)); + }; + if ((u.includes("cliptextencode") || u.includes("clip_text_encode") || d.includes("clip text encode")) && typeof e.text == "string") { + let t = d.includes("negative"); + d.includes("positive") || d.includes("(prompt)") || d.includes("prompt"), f(t ? "negative_prompt" : "prompt", e.text); + } + if (f("negative_prompt", e.negative_prompt), f("negative_prompt", e.negative), !t.prompt && typeof e.text == "string") { + let t = e.text.trim(); + (u.includes("prompt") || u.includes("encode") || u.includes("positive") || u.includes("negative") || d.includes("prompt") || d.includes("positive") || d.includes("negative")) && t.length >= 12 && /[a-zA-Z]/.test(t) && f("prompt", t); + } + if (e.seed !== void 0 && t.seed === void 0 && (t.seed = e.seed), e.steps !== void 0 && t.steps === void 0 && (t.steps = e.steps), e.cfg !== void 0 && t.cfg === void 0 && (t.cfg = e.cfg), e.sampler_name && !t.sampler && (t.sampler = e.sampler_name), e.scheduler && !t.scheduler && (t.scheduler = e.scheduler), e.denoise !== void 0 && t.denoise === void 0 && (t.denoise = e.denoise), i(u)) { + let t = a(r, o), n = s(r, o), i = c(r?.inputs?.model, o); + l.push({ + sampler_name: e.sampler_name || n.sampler_name || e.sampler, + scheduler: e.scheduler || n.scheduler, + steps: e.steps ?? n.steps, + cfg: e.cfg, + denoise: e.denoise ?? n.denoise, + seed: e.seed ?? e.noise_seed, + model: i, + pass_stage: t + }); + } + e.width !== void 0 && t.width === void 0 && (t.width = e.width), e.height !== void 0 && t.height === void 0 && (t.height = e.height); + let p = (e, n) => { + if (t[e] || typeof n != "string") return; + let r = n.trim(); + r && (t[e] = r); + }, h = [ + e.ckpt_name, + e.checkpoint, + e.checkpoint_name, + e.model_name, + e.model + ]; + for (let e of h) t.model || p("model", e); + if (p("vae", e.vae_name || e.vae), p("clip", e.clip_name || e.clip), p("unet", e.unet_name || e.unet), p("diffusion", e.diffusion_name || e.diffusion_model || e.diffusion), u.includes("lora") || u.includes("loraloader")) { + let t = e.lora_name || e.lora || e.name || null, r = e.strength_model ?? e.strength ?? e.weight ?? e.lora_strength ?? null; + t && n.push({ + name: t, + weight: r + }); + } + } + return n.length && (t.loras = n), l.length > 1 && (t.all_samplers = l), Object.keys(t).length > 0 ? t : null; +} +function r(e) { + if (!e || typeof e != "object") return null; + let n = e.prompt && typeof e.prompt == "object" ? e.prompt : e; + return t(n) ? n : null; +} +function i(e) { + return e.includes("ksamplerselect") || e.includes("samplerselect") ? !1 : e.includes("ksampler") || e.includes("samplercustom") || e.includes("sampler_custom"); +} +function a(e, t) { + if (!t) return ""; + let n = c(e?.inputs?.model, t).toLowerCase(); + if (/\b(upscale|upscaler|_to_\d{3,5}|to[_-]?\d{3,5})\b/i.test(n)) return "upscale"; + let r = o(e, t).join(" "); + if (/\b(pidconditioning|upscale|latentupscale|imageupscalewithmodel)\b/i.test(r)) return "upscale"; + let i = o(e, t, "latent_image").join(" "); + return /\b(inpaint|vaeencodeforinpaint|setlatentnoise mask|masktoimage)\b/i.test(i) ? "inpaint" : /\b(upscale|latentupscale|imageupscalewithmodel|ultimate|supir|esrgan|realesrgan)\b/i.test(i) ? "upscale" : /\b(vaeencode|loadimage|imagebatch|imagetolatent)\b/i.test(i) ? "img2img" : /\b(emptylatentimage|emptysd3latentimage|emptychromaradiancelatentimage|empty latent)\b/i.test(i) ? "txt2img" : ""; +} +function o(e, t, n) { + let r = n ? [e?.inputs?.[n]] : Object.values(e?.inputs || {}), i = [], a = /* @__PURE__ */ new Set(), o = (e) => { + let n = String(e?._mjrPromptId || e?.id || ""); + if (n && a.has(n)) return; + n && a.add(n); + let r = String(e?.class_type || e?.type || e?._meta?.title || ""); + r && i.push(r.toLowerCase()); + let s = e?.inputs && typeof e.inputs == "object" ? e.inputs : {}; + for (let e of Object.values(s)) { + let n = l(e, t); + n && o(n); + } + }; + for (let e of r) { + let n = l(e, t); + n && o(n); + } + return i; +} +function s(e, t) { + let n = {}; + if (!t) return n; + let r = l(e?.inputs?.sampler, t)?.inputs || {}; + r.sampler_name && (n.sampler_name = r.sampler_name); + let i = l(e?.inputs?.sigmas, t)?.inputs || {}; + return i.scheduler && (n.scheduler = i.scheduler), i.steps !== void 0 && (n.steps = i.steps), i.denoise !== void 0 && (n.denoise = i.denoise), n; +} +function c(e, t) { + if (!t) return ""; + let n = /* @__PURE__ */ new Set(), r = (e) => { + let i = l(e, t); + if (!i) return ""; + let a = String(i?._mjrPromptId || i?.id || ""); + if (a && n.has(a)) return ""; + a && n.add(a); + let o = i?.inputs || {}, s = o.unet_name || o.ckpt_name || o.model_name || o.model || o.checkpoint || o.checkpoint_name || ""; + if (typeof s == "string" && s.trim()) return s.trim(); + for (let e of Object.values(o)) { + let t = r(e); + if (t) return t; + } + return ""; + }; + return r(e); +} +function l(e, t) { + if (!Array.isArray(e) || e.length < 1) return null; + let n = String(e[0]), r = t[n]; + if (!r || typeof r != "object") return null; + if (!r._mjrPromptId) try { + Object.defineProperty(r, "_mjrPromptId", { + value: n, + enumerable: !1 + }); + } catch {} + return r; +} +function u(e, n = /* @__PURE__ */ new WeakSet()) { + if (!e || typeof e != "object" || n.has(e)) return []; + n.add(e); + let r = [], i = (e.prompt && typeof e.prompt == "object" ? e.prompt : null) || (t(e) ? e : null); + i && r.push(...Object.values(i)); + for (let t of d(e)) { + let e = Array.isArray(t?.nodes) ? t.nodes.filter(Boolean) : []; + r.push(...e); + for (let t of e) for (let e of p(t)) r.push(...u(e, n)); + for (let e of f(t)) r.push(...u(e, n)); + } + return r; +} +function d(e) { + if (!e || typeof e != "object") return []; + let t = [], n = (e) => { + e && typeof e == "object" && Array.isArray(e.nodes) && t.push(e); + }; + n(e); + for (let t of [ + "workflow", + "Workflow", + "template", + "Template", + "subgraph", + "Subgraph", + "graph", + "lgraph" + ]) n(e?.[t]); + return t; +} +function f(e) { + return [ + ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], + ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], + ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] + ].filter((e) => e && typeof e == "object" && Array.isArray(e.nodes)); +} +function p(e) { + return [ + e?.subgraph, + e?._subgraph, + e?.subgraph?.graph, + e?.subgraph?.lgraph, + e?.properties?.subgraph, + e?.subgraph_instance, + e?.subgraph_instance?.graph, + e?.inner_graph, + e?.subgraph_graph + ].filter((e) => e && typeof e == "object" && Array.isArray(e.nodes)); +} +function m(e) { + let t = e?.inputs; + if (t && typeof t == "object" && !Array.isArray(t)) return t; + let n = e?.widgets_values, r = {}; + if (n && typeof n == "object" && !Array.isArray(n)) { + for (let [e, t] of Object.entries(n)) r[e] = t; + return r; + } + if (!Array.isArray(t) || !Array.isArray(n)) return null; + let i = t.filter(h); + for (let e = 0; e < n.length; e += 1) { + let a = i[e] || t[e] || null, o = String(a?.label || a?.localized_name || a?.name || a?.widget?.name || a?.widget?.label || "").trim(); + r[o || `param_${e + 1}`] = n[e]; + } + return r; +} +function h(e) { + if (!e || typeof e != "object") return !1; + if (e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim()) return !0; + if (e.link != null) return !1; + let t = String(e.type || "").trim().toUpperCase(); + return [ + "INT", + "FLOAT", + "STRING", + "BOOLEAN", + "BOOL", + "COMBO", + "ENUM" + ].includes(t); +} +//#endregion +//#region ui/components/sidebar/parsers/geninfoParser.ts +var g = /^(?:[a-z]:[\\/]|[\\/]{1,2}|\.{1,2}[\\/]|~[\\/]).+?[\\/][^\\/\n]+\.(?: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|ckpt|safetensors|pt|pth|bin|gguf|json|ya?ml)$/i, _ = /^(?!.*[,;])(?!.*\b(?:cinematic|portrait|landscape|lighting|style|detailed|masterpiece|photo|render)\b).*(?:[\\/][^\\/\n]+){2,}\.(?: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|ckpt|safetensors|pt|pth|bin|gguf|json|ya?ml)$/i; +function v(r) { + if (!r) return null; + if (typeof r == "object") { + let i = r.geninfo || r.GenInfo || r.generation || null; + if (i && typeof i == "object") { + let e = {}, t = /* @__PURE__ */ new Set(), n = (e, n) => { + if (!(!n || typeof n != "object") && !(n.confidence !== "override" && n.source !== "majoor_geninfo")) for (let n of Array.isArray(e) ? e : [e]) t.add(n); + }, a = i.positive?.value ?? i.positive?.text ?? null, o = i.negative?.value ?? i.negative?.text ?? null; + typeof a == "string" && a.trim() && (e.prompt = a), typeof o == "string" && o.trim() && (e.negative_prompt = o), n("prompt", i.positive), n("negative_prompt", i.negative); + let s = i.checkpoint?.name ?? i.checkpoint ?? null; + typeof s == "string" && s.trim() && (e.model = s), n(["model", "checkpoint"], i.checkpoint); + let c = i.clip?.name ?? i.clip ?? null; + typeof c == "string" && c.trim() && (e.clip = c), n("clip", i.clip); + let l = i.vae?.name ?? i.vae ?? null; + typeof l == "string" && l.trim() && (e.vae = l), n("vae", i.vae); + let u = i.models; + u && typeof u == "object" && (e.models = u); + let d = Array.isArray(i.model_groups) ? i.model_groups : null; + d && d.length && (e.model_groups = d); + let f = Array.isArray(i.loras) ? i.loras : null; + f && (e.loras = f), f?.some((e) => e?.confidence === "override" || e?.source === "majoor_geninfo") && t.add("loras"); + let p = i.sampler?.name ?? i.sampler ?? null; + typeof p == "string" && p.trim() && (e.sampler = p), n("sampler", i.sampler); + let m = i.scheduler?.name ?? i.scheduler ?? null; + typeof m == "string" && m.trim() && (e.scheduler = m), n("scheduler", i.scheduler); + let h = i.steps?.value ?? i.steps ?? null; + h != null && (e.steps = h), n("steps", i.steps); + let g = i.cfg?.value ?? i.cfg ?? null; + g != null && (e.cfg = g), n(["cfg", "cfg_scale"], i.cfg); + let _ = i.cfg_high_noise?.value ?? i.cfg_high_noise ?? null; + _ != null && (e.cfg_high_noise = _); + let v = i.cfg_low_noise?.value ?? i.cfg_low_noise ?? null; + v != null && (e.cfg_low_noise = v); + let b = i.seed?.value ?? i.seed ?? null; + b != null && (e.seed = b), n("seed", i.seed); + let x = i.voice?.name ?? i.voice?.value ?? i.voice ?? null; + x != null && String(x).trim() && (e.voice = String(x).trim()); + let S = i.language?.value ?? i.language ?? null; + S != null && String(S).trim() && (e.language = String(S).trim()); + let C = i.temperature?.value ?? i.temperature ?? null; + C != null && (e.temperature = C); + let w = i.top_k?.value ?? i.top_k ?? null; + w != null && (e.top_k = w); + let T = i.top_p?.value ?? i.top_p ?? null; + T != null && (e.top_p = T); + let E = i.repetition_penalty?.value ?? i.repetition_penalty ?? null; + E != null && (e.repetition_penalty = E); + let D = i.max_new_tokens?.value ?? i.max_new_tokens ?? null; + D != null && (e.max_new_tokens = D); + let O = i.device?.value ?? i.device ?? null; + O != null && String(O).trim() && (e.device = String(O).trim()); + let k = i.voice_preset?.value ?? i.voice_preset ?? null; + k != null && String(k).trim() && (e.voice_preset = String(k).trim()); + let A = i.instruct?.value ?? i.instruct ?? null; + A != null && String(A).trim() && (e.instruct = String(A).trim()); + let j = i.dtype?.value ?? i.dtype ?? null; + j != null && String(j).trim() && (e.dtype = String(j).trim()); + let M = i.attn_implementation?.value ?? i.attn_implementation ?? null; + M != null && String(M).trim() && (e.attn_implementation = String(M).trim()); + let N = i.x_vector_only_mode?.value ?? i.x_vector_only_mode ?? null; + N != null && (e.x_vector_only_mode = N); + let P = i.use_torch_compile?.value ?? i.use_torch_compile ?? null; + P != null && (e.use_torch_compile = P); + let F = i.use_cuda_graphs?.value ?? i.use_cuda_graphs ?? null; + F != null && (e.use_cuda_graphs = F); + let I = i.compile_mode?.value ?? i.compile_mode ?? null; + I != null && String(I).trim() && (e.compile_mode = String(I).trim()); + let L = i.enable_chunking?.value ?? i.enable_chunking ?? null; + L != null && (e.enable_chunking = L); + let R = i.max_chars_per_chunk?.value ?? i.max_chars_per_chunk ?? null; + R != null && (e.max_chars_per_chunk = R); + let z = i.chunk_combination_method?.value ?? i.chunk_combination_method ?? null; + z != null && String(z).trim() && (e.chunk_combination_method = String(z).trim()); + let B = i.silence_between_chunks_ms?.value ?? i.silence_between_chunks_ms ?? null; + B != null && (e.silence_between_chunks_ms = B); + let V = i.enable_audio_cache?.value ?? i.enable_audio_cache ?? null; + V != null && (e.enable_audio_cache = V); + let H = i.batch_size?.value ?? i.batch_size ?? null; + H != null && (e.batch_size = H); + let U = i.denoise?.value ?? i.denoise ?? null; + U != null && (e.denoise = U), n(["denoise", "denoising"], i.denoise); + let W = i.clip_skip?.value ?? i.clip_skip ?? i.clipSkip ?? null; + W != null && (e.clip_skip = W); + let G = i.inputs; + Array.isArray(G) && (e.inputs = G); + let K = i.lyrics?.value ?? i.lyrics ?? null; + typeof K == "string" && K.trim() && (e.lyrics = K); + let q = i.lyrics_strength?.value ?? i.lyrics_strength ?? null; + q != null && (e.lyrics_strength = q); + let J = i.notes?.value ?? i.workflow_notes?.value ?? i.notes ?? i.workflow_notes ?? null; + typeof J == "string" && J.trim() && (e.workflow_notes = J.trim()), n(["workflow_notes", "notes"], i.notes ?? i.workflow_notes), Array.isArray(i.custom_info) && (e.custom_info = i.custom_info), Array.isArray(i.custom_info) && i.engine?.mode === "override" && t.add("custom_info"), Array.isArray(i.all_positive_prompts) && i.all_positive_prompts.length > 1 && (e.all_positive_prompts = i.all_positive_prompts), Array.isArray(i.all_negative_prompts) && i.all_negative_prompts.length > 1 && (e.all_negative_prompts = i.all_negative_prompts), Array.isArray(i.all_samplers) && i.all_samplers.length > 1 && (e.all_samplers = i.all_samplers), Array.isArray(i.chained_passes) && i.chained_passes.length > 1 && (e.chained_passes = i.chained_passes), Array.isArray(i.all_checkpoints) && i.all_checkpoints.length > 1 && (e.all_checkpoints = i.all_checkpoints); + let Y = i.size || null; + if (Y && typeof Y == "object" && (Y.width !== void 0 && (e.width = Y.width), Y.height !== void 0 && (e.height = Y.height)), i.engine && typeof i.engine == "object" && (e.engine = i.engine, (i.engine.mode === "override" || i.engine.parser_version === "geninfo-override-v1" || i.engine.source === "majoor_geninfo") && (e.is_override = !0)), t.size && (e.override_fields = Array.from(t)), y(e, r), Object.keys(e).length) return e; + } + let a = n(r); + if (a) return a; + if (t(r)) { + let e = n({ prompt: r }); + if (e) return e; + } + if ([ + "prompt", + "negative_prompt", + "negativePrompt", + "steps", + "sampler", + "sampler_name", + "cfg", + "cfg_scale", + "seed", + "width", + "height" + ].some((e) => Object.prototype.hasOwnProperty.call(r, e))) return r; + let o = r.parameters || r["PNG:Parameters"] || r["EXIF:UserComment"] || r.UserComment || r.ImageDescription || null; + if (typeof o == "string") { + let t = e(o); + if (t) return t; + } + let s = r.workflow || r.Workflow || r.comfy || r.comfyui || r.ComfyUI || null; + if (s && typeof s == "object") { + let e = n(s); + if (e) return e; + } + return r; + } + if (typeof r == "string") { + let t = r.trim(); + if (!t) return null; + let n = e(t); + if (n) return n; + if (t.startsWith("{") && t.endsWith("}") || t.startsWith("[") && t.endsWith("]")) try { + return v(JSON.parse(t)); + } catch { + return null; + } + return { prompt: t }; + } + return null; +} +function y(e, t) { + let r = t?.workflow || t?.Workflow || t?.comfy_workflow || t?.comfy || t?.comfyui || t?.ComfyUI || null; + if (!r || typeof r != "object") return; + let i = n(r), a = Array.isArray(i?.all_samplers) ? i.all_samplers : []; + if (a.length) { + for (let t of ["all_samplers", "chained_passes"]) { + let n = Array.isArray(e[t]) ? e[t] : []; + n.length && (e[t] = n.map((e, t) => { + let n = a[t]?.pass_stage; + return !n || e?.pass_stage ? e : { + ...e, + pass_stage: n + }; + })); + } + !Array.isArray(e.all_samplers) && a.length > 1 && (e.all_samplers = a); + } +} +function b(e) { + let t = typeof e == "string" ? e.trim() : ""; + return !t || t.includes("\n") ? !1 : g.test(t) || _.test(t); +} +function x(e) { + let t = typeof e == "string" ? e.trim() : ""; + return t ? b(t) ? "" : t : ""; +} +function S(e, t) { + let n = x(e), r = x(t); + if (n) { + let e = /(?:^|\n)\s*Negative prompt:\s*/i; + if (e.test(n)) { + let t = n.split(e), i = (t[0] || "").trim(), a = t.slice(1).join("Negative prompt:").trim(), o = a.search(/\n\s*Steps:\s*\d+/i), s = (o >= 0 ? a.slice(0, o) : a).trim(); + i && (n = x(i)), !r && s && (r = x(s)); + } + } + return n && r && n.trim() === r.trim() && (r = ""), { + positive: n, + negative: r + }; +} +function C(e) { + if (!e) return ""; + let t = String(e).trim().replace(/\\/g, "/"); + return (t.split("/").pop() || t).replace(/\.(safetensors|ckpt|pt|pth|bin|gguf|json)$/i, ""); +} +function w(e) { + if (!e) return ""; + if (typeof e == "string") return C(e); + let t = C(e.name || e.lora_name || ""); + if (!t) return ""; + let n = e.weight ?? e.strength ?? null, r = e.strength_model ?? null, i = e.strength_clip ?? null; + if (r !== null || i !== null) { + let e = []; + return r != null && e.push(`m=${r}`), i != null && e.push(`c=${i}`), e.length ? `${t} (${e.join(", ")})` : t; + } + return n == null ? t : `${t} (${n})`; +} +function T(e) { + let t = String(e || "").trim().toLowerCase(); + return t ? t === "img2vid" ? "Image-to-Video" : t === "txt2vid" ? "Text-to-Video" : t === "img2img" ? "Image-to-Image" : t === "txt2img" ? "Text-to-Image" : t === "vid2vid" ? "Video-to-Video" : t === "tts" ? "Text-to-Speech" : t === "audio" ? "Audio" : t.split(/[_\s-]+/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ") : ""; +} +function E(e) { + let t = String(e || "").trim().toLowerCase(); + if (!t || t === "api") return ""; + let n = { + happy_horse: "Happy Horse", + google_gemini: "Google Gemini", + google_veo: "Google Veo", + openai: "OpenAI", + anthropic: "Anthropic", + black_forest_labs: "Black Forest Labs", + stability_ai: "Stability AI", + alibaba_wan: "Alibaba Wan", + kling_ai: "Kling AI", + luma_dream_machine: "Luma Dream Machine", + minimax_hailuo: "MiniMax Hailuo", + xai_grok: "xAI Grok", + ltxv_api: "LTXV API", + eleven_labs: "ElevenLabs", + bytedance_seedance: "ByteDance Seedance" + }; + return n[t] ? n[t] : t.split(/[_\s-]+/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" "); +} +function D(e) { + let t = e?.engine && typeof e.engine == "object" ? e.engine : null, n = String(t?.type || "").trim(), r = String(t?.sampler_mode || "").trim().toLowerCase(), i = T(n) || n, a = E(t?.api_provider), o = r === "api" ? `API ${i || "Workflow"}` : i; + return { + workflowType: n, + workflowLabel: String(o || n).trim(), + workflowBadge: a + }; +} +//#endregion +export { S as a, v as i, w as n, x as o, C as r, D as t }; diff --git a/dist/chunks/geninfoParser-BE5lWeGw.js b/dist/chunks/geninfoParser-BE5lWeGw.js deleted file mode 100644 index 38c4b865..00000000 --- a/dist/chunks/geninfoParser-BE5lWeGw.js +++ /dev/null @@ -1,372 +0,0 @@ -//#region ui/components/sidebar/parsers/a1111ParamsParser.ts -function e(e) { - if (!e || typeof e != "string") return null; - let t = {}, n = e.split(/\nNegative prompt:\s*/i); - if (n[0] && (t.prompt = n[0].trim()), n[1]) { - let e = n[1].match(/^(.*?)\n?(Steps:.*)$/s); - if (e) { - t.negative_prompt = e[1].trim(); - let n = e[2], r = (e) => { - let t = n.match(e); - return t ? t[1].trim() : null; - }; - t.steps = r(/Steps:\s*(\d+)/i), t.sampler = r(/Sampler:\s*([^,\n]+)/i), t.cfg = r(/CFG scale:\s*([\d.]+)/i), t.seed = r(/Seed:\s*(\d+)/i), t.width = r(/Size:\s*(\d+)x\d+/i), t.height = r(/Size:\s*\d+x(\d+)/i), t.model = r(/Model:\s*([^,\n]+)/i), t.denoising = r(/Denoising strength:\s*([\d.]+)/i), t.clip_skip = r(/Clip skip:\s*(\d+)/i); - } else t.negative_prompt = n[1].trim(); - } - return Object.keys(t).length > 0 ? t : null; -} -//#endregion -//#region ui/components/sidebar/parsers/comfyWorkflowParser.ts -function t(e) { - try { - let t = Object.entries(e || {}); - if (!t.length) return !1; - let n = 0; - for (let [, e] of t.slice(0, 50)) if (!(!e || typeof e != "object") && (e.inputs && typeof e.inputs == "object" && (n += 1), n >= 2)) return !0; - return !1; - } catch { - return !1; - } -} -function n(e) { - if (!e || typeof e != "object") return null; - let t = {}, n = []; - for (let i of r(e)) { - if (!i || typeof i != "object") continue; - let e = s(i); - if (!e || typeof e != "object") continue; - let r = String(i?.class_type || i?.type || "").toLowerCase(), a = String(i?.title || i?._meta?.title || "").toLowerCase(), o = (e, n) => { - if (t[e] || typeof n != "string") return; - let r = n.trim(); - r && (/^[\d\s.,+-]+$/.test(r) || (t[e] = r)); - }; - if ((r.includes("cliptextencode") || r.includes("clip_text_encode") || a.includes("clip text encode")) && typeof e.text == "string") { - let t = a.includes("negative"); - a.includes("positive") || a.includes("(prompt)") || a.includes("prompt"), o(t ? "negative_prompt" : "prompt", e.text); - } - if (o("negative_prompt", e.negative_prompt), o("negative_prompt", e.negative), !t.prompt && typeof e.text == "string") { - let t = e.text.trim(); - (r.includes("prompt") || r.includes("encode") || r.includes("positive") || r.includes("negative") || a.includes("prompt") || a.includes("positive") || a.includes("negative")) && t.length >= 12 && /[a-zA-Z]/.test(t) && o("prompt", t); - } - e.seed !== void 0 && t.seed === void 0 && (t.seed = e.seed), e.steps !== void 0 && t.steps === void 0 && (t.steps = e.steps), e.cfg !== void 0 && t.cfg === void 0 && (t.cfg = e.cfg), e.sampler_name && !t.sampler && (t.sampler = e.sampler_name), e.scheduler && !t.scheduler && (t.scheduler = e.scheduler), e.denoise !== void 0 && t.denoise === void 0 && (t.denoise = e.denoise), e.width !== void 0 && t.width === void 0 && (t.width = e.width), e.height !== void 0 && t.height === void 0 && (t.height = e.height); - let c = (e, n) => { - if (t[e] || typeof n != "string") return; - let r = n.trim(); - r && (t[e] = r); - }, l = [ - e.ckpt_name, - e.checkpoint, - e.checkpoint_name, - e.model_name, - e.model - ]; - for (let e of l) t.model || c("model", e); - if (c("vae", e.vae_name || e.vae), c("clip", e.clip_name || e.clip), c("unet", e.unet_name || e.unet), c("diffusion", e.diffusion_name || e.diffusion_model || e.diffusion), r.includes("lora") || r.includes("loraloader")) { - let t = e.lora_name || e.lora || e.name || null, r = e.strength_model ?? e.strength ?? e.weight ?? e.lora_strength ?? null; - t && n.push({ - name: t, - weight: r - }); - } - } - return n.length && (t.loras = n), Object.keys(t).length > 0 ? t : null; -} -function r(e, n = /* @__PURE__ */ new WeakSet()) { - if (!e || typeof e != "object" || n.has(e)) return []; - n.add(e); - let s = [], c = (e.prompt && typeof e.prompt == "object" ? e.prompt : null) || (t(e) ? e : null); - c && s.push(...Object.values(c)); - for (let t of i(e)) { - let e = Array.isArray(t?.nodes) ? t.nodes.filter(Boolean) : []; - s.push(...e); - for (let t of e) for (let e of o(t)) s.push(...r(e, n)); - for (let e of a(t)) s.push(...r(e, n)); - } - return s; -} -function i(e) { - if (!e || typeof e != "object") return []; - let t = [], n = (e) => { - e && typeof e == "object" && Array.isArray(e.nodes) && t.push(e); - }; - n(e); - for (let t of [ - "workflow", - "Workflow", - "template", - "Template", - "subgraph", - "Subgraph", - "graph", - "lgraph" - ]) n(e?.[t]); - return t; -} -function a(e) { - return [ - ...Array.isArray(e?.definitions?.subgraphs) ? e.definitions.subgraphs : [], - ...Array.isArray(e?.subgraphs) ? e.subgraphs : [], - ...Array.isArray(e?.rootGraph?.subgraphs) ? e.rootGraph.subgraphs : [] - ].filter((e) => e && typeof e == "object" && Array.isArray(e.nodes)); -} -function o(e) { - return [ - e?.subgraph, - e?._subgraph, - e?.subgraph?.graph, - e?.subgraph?.lgraph, - e?.properties?.subgraph, - e?.subgraph_instance, - e?.subgraph_instance?.graph, - e?.inner_graph, - e?.subgraph_graph - ].filter((e) => e && typeof e == "object" && Array.isArray(e.nodes)); -} -function s(e) { - let t = e?.inputs; - if (t && typeof t == "object" && !Array.isArray(t)) return t; - let n = e?.widgets_values, r = {}; - if (n && typeof n == "object" && !Array.isArray(n)) { - for (let [e, t] of Object.entries(n)) r[e] = t; - return r; - } - if (!Array.isArray(t) || !Array.isArray(n)) return null; - let i = t.filter(c); - for (let e = 0; e < n.length; e += 1) { - let a = i[e] || t[e] || null, o = String(a?.label || a?.localized_name || a?.name || a?.widget?.name || a?.widget?.label || "").trim(); - r[o || `param_${e + 1}`] = n[e]; - } - return r; -} -function c(e) { - if (!e || typeof e != "object") return !1; - if (e.widget === !0 || e.widget && typeof e.widget == "object" || typeof e.widget == "string" && e.widget.trim()) return !0; - if (e.link != null) return !1; - let t = String(e.type || "").trim().toUpperCase(); - return [ - "INT", - "FLOAT", - "STRING", - "BOOLEAN", - "BOOL", - "COMBO", - "ENUM" - ].includes(t); -} -//#endregion -//#region ui/components/sidebar/parsers/geninfoParser.ts -var l = /^(?:[a-z]:[\\/]|[\\/]{1,2}|\.{1,2}[\\/]|~[\\/]).+?[\\/][^\\/\n]+\.(?: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|ckpt|safetensors|pt|pth|bin|gguf|json|ya?ml)$/i, u = /^(?!.*[,;])(?!.*\b(?:cinematic|portrait|landscape|lighting|style|detailed|masterpiece|photo|render)\b).*(?:[\\/][^\\/\n]+){2,}\.(?: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|ckpt|safetensors|pt|pth|bin|gguf|json|ya?ml)$/i; -function d(r) { - if (!r) return null; - if (typeof r == "object") { - let i = r.geninfo || r.GenInfo || r.generation || null; - if (i && typeof i == "object") { - let e = {}, t = /* @__PURE__ */ new Set(), n = (e, n) => { - if (!(!n || typeof n != "object") && !(n.confidence !== "override" && n.source !== "majoor_geninfo")) for (let n of Array.isArray(e) ? e : [e]) t.add(n); - }, r = i.positive?.value ?? i.positive?.text ?? null, a = i.negative?.value ?? i.negative?.text ?? null; - typeof r == "string" && r.trim() && (e.prompt = r), typeof a == "string" && a.trim() && (e.negative_prompt = a), n("prompt", i.positive), n("negative_prompt", i.negative); - let o = i.checkpoint?.name ?? i.checkpoint ?? null; - typeof o == "string" && o.trim() && (e.model = o), n(["model", "checkpoint"], i.checkpoint); - let s = i.clip?.name ?? i.clip ?? null; - typeof s == "string" && s.trim() && (e.clip = s), n("clip", i.clip); - let c = i.vae?.name ?? i.vae ?? null; - typeof c == "string" && c.trim() && (e.vae = c), n("vae", i.vae); - let l = i.models; - l && typeof l == "object" && (e.models = l); - let u = Array.isArray(i.model_groups) ? i.model_groups : null; - u && u.length && (e.model_groups = u); - let d = Array.isArray(i.loras) ? i.loras : null; - d && (e.loras = d), d?.some((e) => e?.confidence === "override" || e?.source === "majoor_geninfo") && t.add("loras"); - let f = i.sampler?.name ?? i.sampler ?? null; - typeof f == "string" && f.trim() && (e.sampler = f), n("sampler", i.sampler); - let p = i.scheduler?.name ?? i.scheduler ?? null; - typeof p == "string" && p.trim() && (e.scheduler = p), n("scheduler", i.scheduler); - let m = i.steps?.value ?? i.steps ?? null; - m != null && (e.steps = m), n("steps", i.steps); - let h = i.cfg?.value ?? i.cfg ?? null; - h != null && (e.cfg = h), n(["cfg", "cfg_scale"], i.cfg); - let g = i.cfg_high_noise?.value ?? i.cfg_high_noise ?? null; - g != null && (e.cfg_high_noise = g); - let _ = i.cfg_low_noise?.value ?? i.cfg_low_noise ?? null; - _ != null && (e.cfg_low_noise = _); - let v = i.seed?.value ?? i.seed ?? null; - v != null && (e.seed = v), n("seed", i.seed); - let y = i.voice?.name ?? i.voice?.value ?? i.voice ?? null; - y != null && String(y).trim() && (e.voice = String(y).trim()); - let b = i.language?.value ?? i.language ?? null; - b != null && String(b).trim() && (e.language = String(b).trim()); - let x = i.temperature?.value ?? i.temperature ?? null; - x != null && (e.temperature = x); - let S = i.top_k?.value ?? i.top_k ?? null; - S != null && (e.top_k = S); - let C = i.top_p?.value ?? i.top_p ?? null; - C != null && (e.top_p = C); - let w = i.repetition_penalty?.value ?? i.repetition_penalty ?? null; - w != null && (e.repetition_penalty = w); - let T = i.max_new_tokens?.value ?? i.max_new_tokens ?? null; - T != null && (e.max_new_tokens = T); - let E = i.device?.value ?? i.device ?? null; - E != null && String(E).trim() && (e.device = String(E).trim()); - let D = i.voice_preset?.value ?? i.voice_preset ?? null; - D != null && String(D).trim() && (e.voice_preset = String(D).trim()); - let O = i.instruct?.value ?? i.instruct ?? null; - O != null && String(O).trim() && (e.instruct = String(O).trim()); - let k = i.dtype?.value ?? i.dtype ?? null; - k != null && String(k).trim() && (e.dtype = String(k).trim()); - let A = i.attn_implementation?.value ?? i.attn_implementation ?? null; - A != null && String(A).trim() && (e.attn_implementation = String(A).trim()); - let j = i.x_vector_only_mode?.value ?? i.x_vector_only_mode ?? null; - j != null && (e.x_vector_only_mode = j); - let M = i.use_torch_compile?.value ?? i.use_torch_compile ?? null; - M != null && (e.use_torch_compile = M); - let N = i.use_cuda_graphs?.value ?? i.use_cuda_graphs ?? null; - N != null && (e.use_cuda_graphs = N); - let P = i.compile_mode?.value ?? i.compile_mode ?? null; - P != null && String(P).trim() && (e.compile_mode = String(P).trim()); - let F = i.enable_chunking?.value ?? i.enable_chunking ?? null; - F != null && (e.enable_chunking = F); - let I = i.max_chars_per_chunk?.value ?? i.max_chars_per_chunk ?? null; - I != null && (e.max_chars_per_chunk = I); - let L = i.chunk_combination_method?.value ?? i.chunk_combination_method ?? null; - L != null && String(L).trim() && (e.chunk_combination_method = String(L).trim()); - let R = i.silence_between_chunks_ms?.value ?? i.silence_between_chunks_ms ?? null; - R != null && (e.silence_between_chunks_ms = R); - let z = i.enable_audio_cache?.value ?? i.enable_audio_cache ?? null; - z != null && (e.enable_audio_cache = z); - let B = i.batch_size?.value ?? i.batch_size ?? null; - B != null && (e.batch_size = B); - let V = i.denoise?.value ?? i.denoise ?? null; - V != null && (e.denoise = V), n(["denoise", "denoising"], i.denoise); - let H = i.clip_skip?.value ?? i.clip_skip ?? i.clipSkip ?? null; - H != null && (e.clip_skip = H); - let U = i.inputs; - Array.isArray(U) && (e.inputs = U); - let W = i.lyrics?.value ?? i.lyrics ?? null; - typeof W == "string" && W.trim() && (e.lyrics = W); - let G = i.lyrics_strength?.value ?? i.lyrics_strength ?? null; - G != null && (e.lyrics_strength = G); - let K = i.notes?.value ?? i.workflow_notes?.value ?? i.notes ?? i.workflow_notes ?? null; - typeof K == "string" && K.trim() && (e.workflow_notes = K.trim()), n(["workflow_notes", "notes"], i.notes ?? i.workflow_notes), Array.isArray(i.custom_info) && (e.custom_info = i.custom_info), Array.isArray(i.custom_info) && i.engine?.mode === "override" && t.add("custom_info"), Array.isArray(i.all_positive_prompts) && i.all_positive_prompts.length > 1 && (e.all_positive_prompts = i.all_positive_prompts), Array.isArray(i.all_negative_prompts) && i.all_negative_prompts.length > 1 && (e.all_negative_prompts = i.all_negative_prompts), Array.isArray(i.all_samplers) && i.all_samplers.length > 1 && (e.all_samplers = i.all_samplers), Array.isArray(i.chained_passes) && i.chained_passes.length > 1 && (e.chained_passes = i.chained_passes), Array.isArray(i.all_checkpoints) && i.all_checkpoints.length > 1 && (e.all_checkpoints = i.all_checkpoints); - let q = i.size || null; - if (q && typeof q == "object" && (q.width !== void 0 && (e.width = q.width), q.height !== void 0 && (e.height = q.height)), i.engine && typeof i.engine == "object" && (e.engine = i.engine, (i.engine.mode === "override" || i.engine.parser_version === "geninfo-override-v1" || i.engine.source === "majoor_geninfo") && (e.is_override = !0)), t.size && (e.override_fields = Array.from(t)), Object.keys(e).length) return e; - } - if ([ - "prompt", - "negative_prompt", - "negativePrompt", - "steps", - "sampler", - "sampler_name", - "cfg", - "cfg_scale", - "seed", - "width", - "height" - ].some((e) => Object.prototype.hasOwnProperty.call(r, e))) return r; - let a = n(r); - if (a) return a; - if (t(r)) { - let e = n({ prompt: r }); - if (e) return e; - } - let o = r.parameters || r["PNG:Parameters"] || r["EXIF:UserComment"] || r.UserComment || r.ImageDescription || null; - if (typeof o == "string") { - let t = e(o); - if (t) return t; - } - let s = r.workflow || r.Workflow || r.comfy || r.comfyui || r.ComfyUI || null; - if (s && typeof s == "object") { - let e = n(s); - if (e) return e; - } - return r; - } - if (typeof r == "string") { - let t = r.trim(); - if (!t) return null; - let n = e(t); - if (n) return n; - if (t.startsWith("{") && t.endsWith("}") || t.startsWith("[") && t.endsWith("]")) try { - return d(JSON.parse(t)); - } catch { - return null; - } - return { prompt: t }; - } - return null; -} -function f(e) { - let t = typeof e == "string" ? e.trim() : ""; - return !t || t.includes("\n") ? !1 : l.test(t) || u.test(t); -} -function p(e) { - let t = typeof e == "string" ? e.trim() : ""; - return t ? f(t) ? "" : t : ""; -} -function m(e, t) { - let n = p(e), r = p(t); - if (n) { - let e = /(?:^|\n)\s*Negative prompt:\s*/i; - if (e.test(n)) { - let t = n.split(e), i = (t[0] || "").trim(), a = t.slice(1).join("Negative prompt:").trim(), o = a.search(/\n\s*Steps:\s*\d+/i), s = (o >= 0 ? a.slice(0, o) : a).trim(); - i && (n = p(i)), !r && s && (r = p(s)); - } - } - return n && r && n.trim() === r.trim() && (r = ""), { - positive: n, - negative: r - }; -} -function h(e) { - if (!e) return ""; - let t = String(e).trim().replace(/\\/g, "/"); - return (t.split("/").pop() || t).replace(/\.(safetensors|ckpt|pt|pth|bin|gguf|json)$/i, ""); -} -function g(e) { - if (!e) return ""; - if (typeof e == "string") return h(e); - let t = h(e.name || e.lora_name || ""); - if (!t) return ""; - let n = e.weight ?? e.strength ?? null, r = e.strength_model ?? null, i = e.strength_clip ?? null; - if (r !== null || i !== null) { - let e = []; - return r != null && e.push(`m=${r}`), i != null && e.push(`c=${i}`), e.length ? `${t} (${e.join(", ")})` : t; - } - return n == null ? t : `${t} (${n})`; -} -function _(e) { - let t = String(e || "").trim().toLowerCase(); - return t ? t === "img2vid" ? "Image-to-Video" : t === "txt2vid" ? "Text-to-Video" : t === "img2img" ? "Image-to-Image" : t === "txt2img" ? "Text-to-Image" : t === "vid2vid" ? "Video-to-Video" : t === "tts" ? "Text-to-Speech" : t === "audio" ? "Audio" : t.split(/[_\s-]+/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ") : ""; -} -function v(e) { - let t = String(e || "").trim().toLowerCase(); - if (!t || t === "api") return ""; - let n = { - happy_horse: "Happy Horse", - google_gemini: "Google Gemini", - google_veo: "Google Veo", - openai: "OpenAI", - anthropic: "Anthropic", - black_forest_labs: "Black Forest Labs", - stability_ai: "Stability AI", - alibaba_wan: "Alibaba Wan", - kling_ai: "Kling AI", - luma_dream_machine: "Luma Dream Machine", - minimax_hailuo: "MiniMax Hailuo", - xai_grok: "xAI Grok", - ltxv_api: "LTXV API", - eleven_labs: "ElevenLabs", - bytedance_seedance: "ByteDance Seedance" - }; - return n[t] ? n[t] : t.split(/[_\s-]+/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" "); -} -function y(e) { - let t = e?.engine && typeof e.engine == "object" ? e.engine : null, n = String(t?.type || "").trim(), r = String(t?.sampler_mode || "").trim().toLowerCase(), i = _(n) || n, a = v(t?.api_provider), o = r === "api" ? `API ${i || "Workflow"}` : i; - return { - workflowType: n, - workflowLabel: String(o || n).trim(), - workflowBadge: a - }; -} -//#endregion -export { m as a, d as i, g as n, p as o, h as r, y as t }; diff --git a/dist/chunks/graphTraversal-HdtD9lDa.js b/dist/chunks/graphTraversal-CjIZsRsP.js similarity index 99% rename from dist/chunks/graphTraversal-HdtD9lDa.js rename to dist/chunks/graphTraversal-CjIZsRsP.js index 64c7f819..35ef668e 100644 --- a/dist/chunks/graphTraversal-HdtD9lDa.js +++ b/dist/chunks/graphTraversal-CjIZsRsP.js @@ -1,5 +1,5 @@ //#region ui/app/graphTraversal.ts -function e(e) { +function e(e = null) { return e?.rootGraph ?? e?.graph?.rootGraph ?? e?.graph ?? e?.canvas?.graph ?? null; } function t(e) { diff --git a/dist/chunks/model3dRenderer-DtGg_3hW.js b/dist/chunks/model3dRenderer-BtzSm2ZA.js similarity index 57% rename from dist/chunks/model3dRenderer-DtGg_3hW.js rename to dist/chunks/model3dRenderer-BtzSm2ZA.js index a91a3375..c15fcde8 100644 --- a/dist/chunks/model3dRenderer-DtGg_3hW.js +++ b/dist/chunks/model3dRenderer-BtzSm2ZA.js @@ -1,9 +1,9 @@ import { t as e } from "./rolldown-runtime-Dy4uBu1J.js"; -import { h as t, t as n } from "./config-dvcltBqE.js"; -import { r } from "./events-BnkL6-b6.js"; -import { n as i } from "./state-DPiaUMw1.js"; +import { l as t, rt as n, t as r } from "./config-Cxv7acF8.js"; +import { r as i } from "./events-BnkL6-b6.js"; +import { n as a } from "./state-DPiaUMw1.js"; //#region ui/features/viewer/model3dCore.ts -function a(e, t) { +function o(e, t) { if (!(!e || typeof t != "function")) try { e.traverse?.((e) => { (e?.isMesh || e?.isPoints || e?.isLine) && t(e); @@ -12,7 +12,7 @@ function a(e, t) { console.debug?.(e); } } -function o(e) { +function s(e) { let t = !1; try { e.traverse?.((e) => { @@ -23,14 +23,14 @@ function o(e) { } return t; } -function s(e) { +function c(e) { let t = /* @__PURE__ */ new Map(); - return a(e, (e) => { + return o(e, (e) => { t.set(e.uuid, e.material); }), t; } -function c(e, t, n, r, i) { - a(t, (t) => { +function l(e, t, n, r, i) { + o(t, (t) => { try { if (n === "original") { let e = r?.get(t.uuid); @@ -61,7 +61,7 @@ function c(e, t, n, r, i) { } }); } -function l(e) { +function u(e) { if (e) { for (let t of e) try { t?.dispose?.(); @@ -71,7 +71,7 @@ function l(e) { e.clear(); } } -function u(e, t) { +function d(e, t) { try { if (t === "gltf" || t === "fbx") return Array.isArray(e?.animations) ? e.animations : []; } catch (e) { @@ -79,7 +79,7 @@ function u(e, t) { } return []; } -function d(e, t) { +function f(e, t) { let n = new e.Box3().setFromObject(t); if (n.isEmpty()) return null; let r = n.getSize(new e.Vector3()), i = n.getCenter(new e.Vector3()), a = Math.max(r.x, r.y, r.z, .01); @@ -91,12 +91,12 @@ function d(e, t) { radius: Math.max(a * .72, .5) }; } -function f(e, t, n, r) { +function p(e, t, n, r) { if (!r || !t || !n) return; let i = t.fov * (Math.PI / 180), a = r.maxDim / (2 * Math.tan(i / 2)) * 1.55, o = new e.Vector3(1, .8, 1).normalize(); t.position.copy(r.center).addScaledVector(o, a), t.near = Math.max(.01, a / 250), t.far = Math.max(1e3, a * 60), t.updateProjectionMatrix(), n.target.copy(r.center), n.minDistance = Math.max(.01, a / 25), n.maxDistance = Math.max(10, a * 12), n.minZoom = .25, n.maxZoom = 12, n.update(); } -function p(e, t, n, r) { +function m(e, t, n, r) { if (!n || !e || !t) return null; let i = Math.max(1e-4, Number(r) || 1), a = Math.max(n.maxDim * 1.9, 2), o = a * i; return e.left = -o / 2, e.right = o / 2, e.top = a / 2, e.bottom = -a / 2, e.near = -Math.max(1e3, n.maxDim * 40), e.far = Math.max(1e3, n.maxDim * 40), e.zoom = 1, e.position.copy(n.center).add({ @@ -105,7 +105,7 @@ function p(e, t, n, r) { z: n.radius * 2.1 }), e.updateProjectionMatrix(), t.target.copy(n.center), t.minZoom = .25, t.maxZoom = 12, t.minDistance = 0, t.maxDistance = Math.max(10, n.maxDim * 12), t.update(), a; } -function m(e, t, n) { +function h(e, t, n) { if (!n) return null; if (t === "gltf") return n.scene || null; if (t === "obj" || t === "fbx") return n; @@ -133,8 +133,8 @@ function m(e, t, n) { } //#endregion //#region ui/features/viewer/model3dLoaders.ts -var h = "/mjr/am/vendor/three", g = null; -function ee(e, t, n) { +var g = "/mjr/am/vendor/three", _ = null; +function v(e, t, n) { switch (t) { case "gltf": return new e.GLTFLoader(n); case "obj": return new e.OBJLoader(n); @@ -144,7 +144,7 @@ function ee(e, t, n) { default: return null; } } -function _(e, t, n) { +function ee(e, t, n) { return new Promise((t, r) => { if (!e || !n) { r(/* @__PURE__ */ Error("Missing loader or URL")); @@ -158,38 +158,38 @@ function _(e, t, n) { }); } function te() { - return g || (g = Promise.all([ + return _ || (_ = Promise.all([ import( /* @vite-ignore */ - `${h}/three.module.js` + `${g}/three.module.js` ), import( /* @vite-ignore */ - `${h}/addons/controls/OrbitControls.js` + `${g}/addons/controls/OrbitControls.js` ), import( /* @vite-ignore */ - `${h}/addons/loaders/GLTFLoader.js` + `${g}/addons/loaders/GLTFLoader.js` ), import( /* @vite-ignore */ - `${h}/addons/loaders/FBXLoader.js` + `${g}/addons/loaders/FBXLoader.js` ), import( /* @vite-ignore */ - `${h}/addons/loaders/OBJLoader.js` + `${g}/addons/loaders/OBJLoader.js` ), import( /* @vite-ignore */ - `${h}/addons/loaders/MTLLoader.js` + `${g}/addons/loaders/MTLLoader.js` ), import( /* @vite-ignore */ - `${h}/addons/loaders/STLLoader.js` + `${g}/addons/loaders/STLLoader.js` ), import( /* @vite-ignore */ - `${h}/addons/loaders/PLYLoader.js` + `${g}/addons/loaders/PLYLoader.js` ) ]).then(([e, t, n, r, i, a, o, s]) => ({ THREE: e, @@ -200,11 +200,11 @@ function te() { MTLLoader: a.MTLLoader, STLLoader: o.STLLoader, PLYLoader: s.PLYLoader - })), g); + })), _); } //#endregion //#region ui/features/viewer/processorUtils.ts -function v(e, t, n) { +function y(e, t, n) { try { let r = Number(e) || 0, i = (Number(t) || 0) * (Number(n) || 0); return !(i > 0) || !(r > 0) || i <= r ? 1 : Math.max(.05, Math.min(1, Math.sqrt(r / i))); @@ -214,7 +214,7 @@ function v(e, t, n) { } //#endregion //#region ui/features/viewer/imageProcessor.ts -function y(e, t, n) { +function b(e, t, n) { if (!e) return; try { e.width > 1 && e.height > 1 || (e.width = 960, e.height = 540); @@ -255,7 +255,7 @@ function y(e, t, n) { } } } -function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: a, maxProcPixels: o, onReady: s } = {}) { +function x({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: i, maxProcPixels: o, onReady: s } = {}) { let c = new Image(); try { c.decoding = "async"; @@ -295,7 +295,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: if (e?.isConnected) { f._connectRAF = null, f._connectTries = 0; let e = f._pendingParams; - f._pendingParams = null, e && _(e); + f._pendingParams = null, e && v(e); return; } } catch (e) { @@ -315,7 +315,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: } } } - }, m = (e, t) => v(o, e, t), h = () => { + }, m = (e, t) => y(o, e, t), h = () => { if (f.srcData) return f.srcData; if (!d || !f.ready) return null; try { @@ -353,11 +353,11 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: } catch { return null; } - }, ee = (t, a) => { + }, _ = (t, i) => { if (!l || f._destroyed) return; if (!e?.isConnected) { try { - f._pendingParams = a || f.lastParams || n?.() || null; + f._pendingParams = i || f.lastParams || n?.() || null; } catch (e) { console.debug?.(e); } @@ -370,7 +370,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: let s = u.width, c = u.height; if (!(s > 0 && c > 0)) return; try { - let t = a || n?.() || {}; + let t = i || n?.() || {}; if (typeof r == "function" && r(t)) { l.clearRect(0, 0, e.width, e.height), l.drawImage(u, 0, 0); return; @@ -389,27 +389,27 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: } } if (!d) return; - let m = a || n?.() || {}, g = Number(m.exposureEV) || 0, ee = 1 / Math.max(.1, Math.min(3, Number(m.gamma) || 1)), _ = String(m.channel || "rgb"), te = String(m.analysisMode || "none"), v = i(m.zebraThreshold ?? .95), y = 2 ** g, b = new Float32Array(256); - for (let e = 0; e < 256; e++) b[e] = (e / 255) ** ee; + let m = i || n?.() || {}, g = Number(m.exposureEV) || 0, _ = 1 / Math.max(.1, Math.min(3, Number(m.gamma) || 1)), v = String(m.channel || "rgb"), ee = String(m.analysisMode || "none"), te = a(m.zebraThreshold ?? .95), y = 2 ** g, b = new Float32Array(256); + for (let e = 0; e < 256; e++) b[e] = (e / 255) ** _; let x = d.data, S = o.data, C = s * c * 4, w = 0, T = () => { if (f._destroyed || !e?.isConnected || t !== f.jobId) return; let n = Math.min(C, w + 22e4); for (; w < n; w += 4) { - let e = (S[w] ?? 0) / 255, t = (S[w + 1] ?? 0) / 255, n = (S[w + 2] ?? 0) / 255, r = (S[w + 3] ?? 255) / 255, a = e * y, o = t * y, c = n * y, l = .2126 * a + .7152 * o + .0722 * c; - if (te === "zebra") if (i(l) >= v) { + let e = (S[w] ?? 0) / 255, t = (S[w + 1] ?? 0) / 255, n = (S[w + 2] ?? 0) / 255, r = (S[w + 3] ?? 255) / 255, i = e * y, o = t * y, c = n * y, l = .2126 * i + .7152 * o + .0722 * c; + if (ee === "zebra") if (a(l) >= te) { let e = (Math.floor(w / 4) % s + Math.floor(w / 4 / s) & 7) < 3; - a = +!!e, o = +!!e, c = +!!e; - } else a = b[i(a) * 255 + .5 | 0], o = b[i(o) * 255 + .5 | 0], c = b[i(c) * 255 + .5 | 0]; - else a = b[i(a) * 255 + .5 | 0], o = b[i(o) * 255 + .5 | 0], c = b[i(c) * 255 + .5 | 0]; - if (_ === "r") o = a, c = a; - else if (_ === "g") a = o, c = o; - else if (_ === "b") a = c, o = c; - else if (_ === "a") a = r, o = r, c = r; - else if (_ === "l") { - let e = b[i(l) * 255 + .5 | 0]; - a = e, o = e, c = e; + i = +!!e, o = +!!e, c = +!!e; + } else i = b[a(i) * 255 + .5 | 0], o = b[a(o) * 255 + .5 | 0], c = b[a(c) * 255 + .5 | 0]; + else i = b[a(i) * 255 + .5 | 0], o = b[a(o) * 255 + .5 | 0], c = b[a(c) * 255 + .5 | 0]; + if (v === "r") o = i, c = i; + else if (v === "g") i = o, c = o; + else if (v === "b") i = c, o = c; + else if (v === "a") i = r, o = r, c = r; + else if (v === "l") { + let e = b[a(l) * 255 + .5 | 0]; + i = e, o = e, c = e; } - x[w] = Math.round(i(a) * 255), x[w + 1] = Math.round(i(o) * 255), x[w + 2] = Math.round(i(c) * 255), x[w + 3] = 255; + x[w] = Math.round(a(i) * 255), x[w + 1] = Math.round(a(o) * 255), x[w + 2] = Math.round(a(c) * 255), x[w + 3] = 255; } if (w < C) { try { @@ -430,7 +430,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: } catch (e) { console.debug?.(e); } - }, _ = (t) => { + }, v = (t) => { if (f._destroyed) return; if (f.lastParams = t || f.lastParams || n?.() || null, !e?.isConnected) { try { @@ -444,11 +444,11 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: f.jobId++; let r = f.jobId; try { - ee(r, f.lastParams); + _(r, f.lastParams); } catch (e) { console.debug?.(e); } - }, te = () => { + }, ee = () => { if (!f._destroyed) try { if (f.naturalW = Number(c.naturalWidth) || 0, f.naturalH = Number(c.naturalHeight) || 0, !(f.naturalW > 0 && f.naturalH > 0)) return; f.scale = m(f.naturalW, f.naturalH); @@ -459,7 +459,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: } catch (e) { console.debug?.(e); } - f.ready = !0, f.srcData = null, h(), _(f.lastParams || n?.()); + f.ready = !0, f.srcData = null, h(), v(f.lastParams || n?.()); } finally { try { s?.({ @@ -471,16 +471,16 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: console.debug?.(e); } } - }, b = () => { + }, te = () => { f.ready = !1; try { - y(e, "Failed to load image"); + b(e, "Failed to load image"); } catch (e) { console.debug?.(e); } }; try { - c.onload = te, c.onerror = b; + c.onload = ee, c.onerror = te; } catch (e) { console.debug?.(e); } @@ -490,7 +490,7 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: console.debug?.(e); } return { - setParams: _, + setParams: v, sampleAtOriginal: g, getInfo: () => ({ ...f }), destroy: () => { @@ -537,14 +537,14 @@ function b({ canvas: e, url: t, getGradeParams: n, isDefaultGrade: r, _tonemap: } //#endregion //#region ui/features/viewer/model3dSupport.ts -var x = [ +var S = [ .25, .5, 1, 1.5, 2 -], S = 44; -function C(e, { preventDefault: t = !1, immediate: n = !1 } = {}) { +], C = 44; +function w(e, { preventDefault: t = !1, immediate: n = !1 } = {}) { if (e) { try { t && e.preventDefault?.(); @@ -558,13 +558,13 @@ function C(e, { preventDefault: t = !1, immediate: n = !1 } = {}) { } } } -function w(e) { +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 T(e, t) { - let n = document.createElement("button"); - return n.type = "button", n.textContent = String(e || ""), n.title = String(t || e || ""), n.setAttribute("aria-label", String(t || e || "3D viewport action")), n.style.cssText = [ +function E(e, n) { + 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", @@ -579,14 +579,14 @@ function T(e, t) { "align-items:center", "justify-content:center", "box-shadow:0 4px 18px rgba(0,0,0,0.24)" - ].join(";"), n; + ].join(";"), r; } -function ne(e, t) { +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 E(e, t, n = "", r = "#4CAF50") { +function O(e, n, r = "", i = "#4CAF50") { if (!e) return; try { let t = Math.max(480, Number(e.width) || 960), n = Math.max(270, Number(e.height) || 540); @@ -594,30 +594,30 @@ function E(e, t, n = "", r = "#4CAF50") { } catch (e) { console.debug?.(e); } - let i = (() => { + let a = (() => { try { return e.getContext("2d"); } catch { return null; } })(); - if (!i) return; - let a = Number(e.width) || 960, o = Number(e.height) || 540, s = a / 2, c = o / 2; + if (!a) return; + let o = Number(e.width) || 960, s = Number(e.height) || 540, c = o / 2, l = s / 2; try { - let e = i.createLinearGradient(0, 0, a, o); - e.addColorStop(0, "#0f1419"), e.addColorStop(1, "#11181f"), i.fillStyle = e, i.fillRect(0, 0, a, o), i.save(), i.translate(s, c - 32), i.strokeStyle = r, i.lineWidth = 3, i.globalAlpha = .95, i.beginPath(), i.moveTo(0, -44), i.lineTo(42, -22), i.lineTo(42, 22), i.lineTo(0, 44), i.lineTo(-42, 22), i.lineTo(-42, -22), i.closePath(), i.stroke(), i.beginPath(), i.moveTo(0, -44), i.lineTo(0, 0), i.lineTo(42, 22), i.moveTo(0, 0), i.lineTo(-42, 22), i.moveTo(-42, -22), i.lineTo(0, 0), i.moveTo(42, -22), i.lineTo(0, 0), i.stroke(), i.restore(), i.fillStyle = "rgba(255,255,255,0.94)", i.font = "600 18px system-ui, sans-serif", i.textAlign = "center", i.textBaseline = "middle", i.fillText(String(t || "3D preview"), s, c + 44), n && (i.fillStyle = "rgba(255,255,255,0.62)", i.font = "13px system-ui, sans-serif", i.fillText(String(n), s, c + 72)); - } catch (r) { - console.debug?.(r); + 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)); + } catch (i) { + console.debug?.(i); try { - y(e, t, n || "3D viewer unavailable"); + b(e, n, r || t("model3d.unavailable", "3D viewer unavailable")); } catch (e) { console.debug?.(e); } } } -function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSkeleton: r } = {}) { - let i = document.createElement("div"); - i.className = "mjr-model3d-settings", i.style.cssText = [ +function ne({ defaultBgColor: e, defaultFov: n, defaultLightIntensity: r, hasSkeleton: i } = {}) { + let a = document.createElement("div"); + a.className = "mjr-model3d-settings", a.style.cssText = [ "position:absolute", "right:0", "top:44px", @@ -650,9 +650,9 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke "dragover", "drop" ].forEach((e) => { - i.addEventListener(e, (e) => C(e, { preventDefault: !1 })); + a.addEventListener(e, (e) => w(e, { preventDefault: !1 })); }); - let a = (e) => { + let o = (e) => { let t = document.createElement("div"); t.style.cssText = [ "font:700 10px system-ui,sans-serif", @@ -660,15 +660,15 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke "color:rgba(255,255,255,0.40)", "text-transform:uppercase", "margin:10px 0 6px 0" - ].join(";"), t.textContent = e, i.appendChild(t); + ].join(";"), t.textContent = e, a.appendChild(t); let n = document.createElement("div"); - n.style.cssText = "height:1px;background:rgba(255,255,255,0.07);margin-bottom:8px;", i.appendChild(n); - }, o = (e, t) => { + n.style.cssText = "height:1px;background:rgba(255,255,255,0.07);margin-bottom:8px;", a.appendChild(n); + }, s = (e, t) => { let n = document.createElement("div"); n.style.cssText = "display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;gap:6px;"; let r = document.createElement("span"); - return r.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.65);white-space:nowrap;flex-shrink:0;", r.textContent = e, n.appendChild(r), n.appendChild(t), i.appendChild(n), n; - }, s = (e, t) => { + return r.style.cssText = "font:500 11px system-ui,sans-serif;color:rgba(255,255,255,0.65);white-space:nowrap;flex-shrink:0;", r.textContent = e, n.appendChild(r), n.appendChild(t), a.appendChild(n), n; + }, c = (e, t) => { let n = document.createElement("select"); n.style.cssText = [ "background:rgba(25,30,42,0.95)", @@ -686,7 +686,7 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke e.value = r, e.textContent = i, r === t && (e.selected = !0), n.appendChild(e); } return n; - }, c = (e, t, n, r) => { + }, l = (e, t, n, r) => { let i = document.createElement("div"); i.style.cssText = "display:flex;align-items:center;gap:5px;flex:1;"; let a = document.createElement("input"); @@ -700,18 +700,18 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke valLbl: o }; }; - a("Scene"); - let l = document.createElement("input"); - l.type = "color", l.value = e || "#282828", l.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;", o("Background", l), a("Model"); - let u = s([ + 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"); + let d = c([ ["original", "Original"], ["normal", "Normal map"], ["depth", "Depth"], ["wireframe", "Wireframe"], ["pointcloud", "Point cloud"] ], "original"); - o("Material", u); - let d = s([ + s(t("model3d.material", "Material"), d); + let f = c([ ["original", "Original"], ["+y", "+Y (default)"], ["-y", "-Y"], @@ -720,33 +720,33 @@ function re({ defaultBgColor: e, defaultFov: t, defaultLightIntensity: n, hasSke ["+x", "+X"], ["-x", "-X"] ], "original"); - o("Up", d); - let f = null, p = null; - r && (p = document.createElement("input"), p.type = "checkbox", p.checked = !1, p.style.cssText = "cursor:pointer;accent-color:#4CAF50;flex-shrink:0;", f = o("Skeleton", p)), a("Camera"); - let m = c(15, 120, 1, t ?? 75); - o("FOV", m.wrap), a("Lights"); - let h = c(0, 5, .1, n ?? 1); - return o("Intensity", h.wrap), { - panel: i, - bgInput: l, - materialSel: u, - upSel: d, - skeletonToggle: p, - skeletonRow: f, - fovSlider: m.slider, - fovValLbl: m.valLbl, - lightSlider: h.slider, - lightValLbl: h.valLbl + 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")); + let g = l(0, 5, .1, r ?? 1); + return s(t("model3d.intensity", "Intensity"), g.wrap), { + panel: a, + bgInput: u, + materialSel: d, + upSel: f, + skeletonToggle: m, + skeletonRow: p, + fovSlider: h.slider, + fovValLbl: h.valLbl, + lightSlider: g.slider, + lightValLbl: g.valLbl }; } -function ie() { +function re() { let e = document.createElement("div"); e.className = "mjr-model3d-anim-bar", e.style.cssText = [ "position:absolute", "bottom:0", "left:0", "right:0", - `height:${S}px`, + `height:${C}px`, "display:none", "align-items:center", "gap:7px", @@ -765,10 +765,10 @@ function ie() { "wheel", "click" ].forEach((t) => { - e.addEventListener(t, (e) => C(e, { preventDefault: !1 })); + e.addEventListener(t, (e) => w(e, { preventDefault: !1 })); }); - let t = document.createElement("button"); - t.type = "button", t.textContent = "Play", t.title = "Play / Pause", t.style.cssText = [ + 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%", @@ -784,8 +784,8 @@ function ie() { "align-items:center", "justify-content:center" ].join(";"); - let n = document.createElement("select"); - n.title = "Playback speed", n.style.cssText = [ + 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)", @@ -796,12 +796,12 @@ function ie() { "width:52px", "flex-shrink:0" ].join(";"); - for (let e of x) { + for (let e of S) { let t = document.createElement("option"); - t.value = String(e), t.textContent = `${e}x`, e === 1 && (t.selected = !0), n.appendChild(t); + t.value = String(e), t.textContent = `${e}x`, e === 1 && (t.selected = !0), r.appendChild(t); } - let r = document.createElement("select"); - r.title = "Animation clip", r.style.cssText = [ + let i = document.createElement("select"); + i.title = "Animation clip", i.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)", @@ -813,26 +813,26 @@ function ie() { "flex-shrink:1", "min-width:0" ].join(";"); - let i = document.createElement("input"); - i.type = "range", i.min = "0", i.max = "1000", i.value = "0", i.style.cssText = "flex:1;min-width:50px;cursor:pointer;accent-color:#4CAF50;height:3px;"; - let a = document.createElement("span"); - return a.style.cssText = [ + 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" - ].join(";"), a.textContent = "0s / 0s", e.appendChild(t), e.appendChild(n), e.appendChild(r), e.appendChild(i), e.appendChild(a), { + ].join(";"), o.textContent = "0s / 0s", e.appendChild(n), e.appendChild(r), e.appendChild(i), e.appendChild(a), e.appendChild(o), { bar: e, - playBtn: t, - speedSel: n, - animSel: r, - progressSlider: i, - timeLbl: a + playBtn: n, + speedSel: r, + animSel: i, + progressSlider: a, + timeLbl: o }; } //#endregion //#region ui/features/viewer/model3dRenderer.impl.ts -var ae = Object.freeze({ +var ie = Object.freeze({ ".gltf": "gltf", ".glb": "gltf", ".obj": "obj", @@ -842,13 +842,13 @@ var ae = Object.freeze({ ".splat": "splat", ".ksplat": "splat", ".spz": "splat" -}), D = new Set(Object.keys(ae)), oe = new Set([ +}), k = new Set(Object.keys(ie)), ae = new Set([ "gltf", "obj", "fbx", "stl", "ply" -]), se = "#282828", ce = "Rotate: left drag Pan: right drag Zoom: wheel", O = Object.freeze({ +]), oe = "#282828", se = t("model3d.controlHint", "Rotate: left drag Pan: right drag Zoom: wheel"), A = Object.freeze({ PERSPECTIVE: "perspective", ORTHOGRAPHIC: "orthographic" }); @@ -859,7 +859,7 @@ Object.freeze({ WIREFRAME: "wireframe", POINTCLOUD: "pointcloud" }); -var le = Object.freeze({ +var ce = Object.freeze({ original: [ 0, 0, @@ -895,7 +895,7 @@ var le = Object.freeze({ 0, -Math.PI / 2 ] -}), ue = 75, de = 1, k = Object.freeze({ +}), le = 75, ue = 1, j = Object.freeze({ ambient: .5, main: .8, fill: .3, @@ -903,7 +903,7 @@ var le = Object.freeze({ rim: .3, bottom: .2 }); -function fe(e) { +function de(e) { try { let t = String(e?.ext || "").trim().toLowerCase(); if (t) return t.startsWith(".") ? t : `.${t}`; @@ -918,23 +918,23 @@ function fe(e) { } return ""; } -function pe(e) { +function fe(e) { let t = String(e || "").trim(); return t ? t.startsWith("/") || /^[a-z][\w+\-.]*:/i.test(t) : !1; } +function pe(e) { + return String(e?.loader || e?.viewer_info?.loader || "").trim().toLowerCase() || ie[de(e)] || ""; +} function me(e) { - return String(e?.loader || e?.viewer_info?.loader || "").trim().toLowerCase() || ae[fe(e)] || ""; + return String(e?.kind || "").toLowerCase() === "model3d" ? !0 : k.has(de(e)); } function he(e) { - return String(e?.kind || "").toLowerCase() === "model3d" ? !0 : D.has(fe(e)); + return pe(e) || "gltf"; } -function ge(e) { - return me(e) || "gltf"; +function M() { + return se; } -function A() { - return ce; -} -function j(e) { +function N(e) { try { if (e?.classList?.contains?.("mjr-model3d-render-canvas")) return e; } catch (e) { @@ -946,14 +946,14 @@ function j(e) { return null; } } -function M(e) { +function P(e) { try { return !!e?.closest?.(".mjr-model3d-host, .mjr-viewer-model3d-host, .mjr-mfv-model3d-host"); } catch { return !1; } } -function _e(e, t) { +function ge(e, t) { let n = t || { ROTATE: 0, DOLLY: 1, @@ -965,9 +965,9 @@ function _e(e, t) { RIGHT: n.PAN }; } -function N(e, i, a = {}) { - let h = a?.pauseDuringExecution == null ? !!n?.VIEWER_PAUSE_DURING_EXECUTION : !!a.pauseDuringExecution, g = document.createElement("div"); - g.className = a.hostClassName || "mjr-model3d-host mjr-viewer-model3d-host", g.style.cssText = a.hostStyle || [ +function F(e, a, o = {}) { + let g = o?.pauseDuringExecution == null ? !!r?.VIEWER_PAUSE_DURING_EXECUTION : !!o.pauseDuringExecution, _ = document.createElement("div"); + _.className = o.hostClassName || "mjr-model3d-host mjr-viewer-model3d-host", _.style.cssText = o.hostStyle || [ "width:100%", "height:100%", "display:flex", @@ -978,9 +978,9 @@ function N(e, i, a = {}) { "border-radius:12px", "background:radial-gradient(circle at top, rgba(76,175,80,0.10), rgba(0,0,0,0) 42%), linear-gradient(180deg, rgba(40,40,40,0.98), rgba(19,22,28,0.99))", "box-shadow:inset 0 0 0 1px rgba(255,255,255,0.06)" - ].join(";"), g.setAttribute("data-capture-wheel", "true"), g.tabIndex = -1; - let v = document.createElement("canvas"); - v.className = a.canvasClassName || "mjr-viewer-media mjr-model3d-render-canvas", v.style.cssText = a.canvasStyle || [ + ].join(";"), _.setAttribute("data-capture-wheel", "true"), _.tabIndex = -1; + let y = document.createElement("canvas"); + y.className = o.canvasClassName || "mjr-viewer-media mjr-model3d-render-canvas", y.style.cssText = o.canvasStyle || [ "display:block", "width:100%", "height:100%", @@ -988,15 +988,15 @@ function N(e, i, a = {}) { "max-height:100%", "outline:none", "touch-action:none" - ].join(";"), v.tabIndex = 0, v._mjrDisableViewerTransform = a.disableViewerTransform !== !1; + ].join(";"), y.tabIndex = 0, y._mjrDisableViewerTransform = o.disableViewerTransform !== !1; try { - e?.id != null && (v.dataset.mjrAssetId = String(e.id)); + e?.id != null && (y.dataset.mjrAssetId = String(e.id)); } catch (e) { console.debug?.(e); } - g.appendChild(v); - let y = document.createElement("canvas"); - y.className = "mjr-model3d-status", y.style.cssText = [ + _.appendChild(y); + let b = document.createElement("canvas"); + b.className = "mjr-model3d-status", b.style.cssText = [ "position:absolute", "inset:0", "display:block", @@ -1004,11 +1004,11 @@ function N(e, i, a = {}) { "height:100%", "pointer-events:none", "z-index:1" - ].join(";"), g.appendChild(y); - let b = fe(e).replace(".", "").toUpperCase(); - if (b) { + ].join(";"), _.appendChild(b); + let x = de(e).replace(".", "").toUpperCase(); + if (x) { let e = document.createElement("div"); - e.className = "mjr-model3d-badge", e.textContent = b, e.style.cssText = [ + e.className = "mjr-model3d-badge", e.textContent = x, e.style.cssText = [ "position:absolute", "top:10px", "left:10px", @@ -1020,10 +1020,10 @@ function N(e, i, a = {}) { "background:rgba(76,175,80,0.9)", "pointer-events:none", "z-index:2" - ].join(";"), g.appendChild(e); + ].join(";"), _.appendChild(e); } - let x = document.createElement("div"); - x.className = "mjr-model3d-toolbar", x.style.cssText = [ + let S = document.createElement("div"); + S.className = "mjr-model3d-toolbar", S.style.cssText = [ "position:absolute", "top:10px", "right:10px", @@ -1034,12 +1034,12 @@ function N(e, i, a = {}) { "pointer-events:none", "z-index:5" ].join(";"); - let S = document.createElement("div"); - S.style.cssText = "display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:auto;"; - let ae = T("Reset", "Reset 3D view"), D = T("Grid", "Toggle grid"), me = T("Persp", "Switch perspective / orthographic"), he = T("Settings", "Settings"); - S.append(ae, D, me, he), x.appendChild(S), g.appendChild(x); - let A = document.createElement("div"); - A.className = "mjr-model3d-hint", A.textContent = a.hintText || ce, A.style.cssText = [ + 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")); + 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", @@ -1052,141 +1052,141 @@ function N(e, i, a = {}) { "pointer-events:none", "z-index:2", "transition:bottom 0.2s" - ].join(";"), g.appendChild(A); - let j = re({ - defaultBgColor: se, - defaultFov: ue, - defaultLightIntensity: de, + ].join(";"), _.appendChild(M); + let N = ne({ + defaultBgColor: oe, + defaultFov: le, + defaultLightIntensity: ue, hasSkeleton: !1 }); - g.appendChild(j.panel); - let M = ie(); - g.appendChild(M.bar); - let N = !1, ve = null, P = null, F = null, I = null, L = null, R = null, z = null, B = null, V = null, ye = null, be = !1, H = null, xe = null, U = null, W = null, Se = null, G = null, K = 0, q = O.PERSPECTIVE, Ce = /* @__PURE__ */ new Map(), we = /* @__PURE__ */ new Set(), J = null, Te = !1, Ee = null, De = [], Y = de, X = null, Oe = null, Z = [], Q = [], $ = 0, ke = 1, Ae = !1, je = !1, Me = !1, Ne = String(e?.filename || "3D model"), Pe = () => { + _.appendChild(N.panel); + let P = re(); + _.appendChild(P.bar); + let F = !1, _e = null, I = null, L = null, R = null, z = null, B = null, V = null, H = null, U = null, ve = null, ye = !1, be = null, xe = null, W = null, G = null, Se = null, K = null, Ce = 0, q = A.PERSPECTIVE, we = /* @__PURE__ */ new Map(), Te = /* @__PURE__ */ new Set(), J = null, Ee = !1, De = null, Oe = [], Y = ue, X = null, ke = null, Z = [], Q = [], $ = 0, Ae = 1, je = !1, Me = !1, Ne = !1, Pe = String(e?.filename || "3D model"), Fe = () => { try { - a.scheduleOverlayRedraw?.(); + o.scheduleOverlayRedraw?.(); } catch (e) { console.debug?.(e); } - }, Fe = (e, t = "", n = "#4CAF50") => { - H = { + }, Ie = (e, t = "", n = "#4CAF50") => { + be = { title: e, hintText: t, accent: n - }, y.style.display = "block", E(y, e, t, n); - }, Ie = () => { - H = null, y.style.display = "none"; + }, b.style.display = "block", O(b, e, t, n); }, Le = () => { + be = null, b.style.display = "none"; + }, Re = () => { try { - let e = g.getBoundingClientRect(); - v._mjrNaturalW = Math.max(1, Math.round(e.width || v.width || 1)), v._mjrNaturalH = Math.max(1, Math.round(e.height || v.height || 1)); + let e = _.getBoundingClientRect(); + y._mjrNaturalW = Math.max(1, Math.round(e.width || y.width || 1)), y._mjrNaturalH = Math.max(1, Math.round(e.height || y.height || 1)); } catch (e) { console.debug?.(e); } try { - H && E(y, H.title, H.hintText, H.accent); + be && O(b, be.title, be.hintText, be.accent); } catch (e) { console.debug?.(e); } - }, Re = (e, t) => { - if (!z || !(K > 0)) return; - let n = Math.max(1e-4, (Number(e) || 1) / Math.max(1, Number(t) || 1)), r = K * n; - z.left = -r / 2, z.right = r / 2, z.top = K / 2, z.bottom = -K / 2, z.updateProjectionMatrix(); - }, ze = () => { - if (!(!W || !B || !G)) { - if (q === O.ORTHOGRAPHIC) { - let e = g.getBoundingClientRect(); - K = p(z, B, G, Math.max(1e-4, (e.width || 1) / Math.max(1, e.height || 1))) || K, L = z; - } else f(P, R, B, G), L = R; + }, ze = (e, t) => { + if (!V || !(Ce > 0)) return; + let n = Math.max(1e-4, (Number(e) || 1) / Math.max(1, Number(t) || 1)), r = Ce * n; + V.left = -r / 2, V.right = r / 2, V.top = Ce / 2, V.bottom = -Ce / 2, V.updateProjectionMatrix(); + }, Be = () => { + if (!(!G || !H || !K)) { + if (q === A.ORTHOGRAPHIC) { + let e = _.getBoundingClientRect(); + Ce = m(V, H, K, Math.max(1e-4, (e.width || 1) / Math.max(1, e.height || 1))) || Ce, z = V; + } else p(I, B, H, K), z = B; try { - B.object = L, B.update(); + H.object = z, H.update(); } catch (e) { console.debug?.(e); } } - }, Be = (e, { refit: t = !0 } = {}) => { - q = e === O.ORTHOGRAPHIC ? O.ORTHOGRAPHIC : O.PERSPECTIVE, L = q === O.ORTHOGRAPHIC ? z : R; + }, Ve = (e, { refit: t = !0 } = {}) => { + q = e === A.ORTHOGRAPHIC ? A.ORTHOGRAPHIC : A.PERSPECTIVE, z = q === A.ORTHOGRAPHIC ? V : B; try { - B && (B.object = L); + H && (H.object = z); } catch (e) { console.debug?.(e); } - if (t) ze(); + if (t) Be(); else { try { - L?.updateProjectionMatrix?.(); + z?.updateProjectionMatrix?.(); } catch (e) { console.debug?.(e); } try { - B?.update?.(); + H?.update?.(); } catch (e) { console.debug?.(e); } } - Ye(), Pe(); - }, Ve = (e) => { + Xe(), Fe(); + }, He = (e) => { Y = Math.max(0, Math.min(10, Number(e) || 0)); try { - Ee && (Ee.intensity = k.ambient * Y); + De && (De.intensity = j.ambient * Y); } catch (e) { console.debug?.(e); } let t = [ - k.main, - k.back, - k.fill, - k.fill, - k.bottom + j.main, + j.back, + j.fill, + j.fill, + j.bottom ]; - De.forEach((e, n) => { + Oe.forEach((e, n) => { try { - e && (e.intensity = (t[n] ?? k.fill) * Y); + e && (e.intensity = (t[n] ?? j.fill) * Y); } catch (e) { console.debug?.(e); } }); - }, He = (e) => { - !Se || !P || (l(we), c(P, Se, e, Ce, we), Pe()); }, Ue = (e) => { - if (!W) return; - let t = le[e] || [ + !Se || !I || (u(Te), l(I, Se, e, we, Te), Fe()); + }, We = (e) => { + if (!G) return; + let t = ce[e] || [ 0, 0, 0 ]; try { - W.rotation.set(t[0], t[1], t[2]), W.updateMatrixWorld(!0); + G.rotation.set(t[0], t[1], t[2]), G.updateMatrixWorld(!0); } catch (e) { console.debug?.(e); } - P && (G = d(P, W)), ze(); - }, We = (e) => { + I && (K = f(I, G)), Be(); + }, Ge = (e) => { if (J) try { J.visible = !!e; } catch (e) { console.debug?.(e); } - }, Ge = () => { + }, Ke = () => { if (!X || Z.length === 0) return; let e = Q[$]; if (!e) return; let t = Z[$]?.duration || 0, n = e.time || 0; try { - M.timeLbl.textContent = `${w(n)} / ${w(t)}`; + P.timeLbl.textContent = `${T(n)} / ${T(t)}`; } catch (e) { console.debug?.(e); } - if (!je && t > 0) try { - let e = Number(M.progressSlider.max) || 1e3; - M.progressSlider.value = String(Math.round(n / t * e)); + if (!Me && t > 0) try { + let e = Number(P.progressSlider.max) || 1e3; + P.progressSlider.value = String(Math.round(n / t * e)); } catch (e) { console.debug?.(e); } - }, Ke = (e) => { + }, qe = (e) => { if (!X || !Z.length) return; - let t = Z[e]; - if (!t) return; + let n = Z[e]; + if (!n) return; Q.forEach((e) => { try { e?.stop(); @@ -1194,99 +1194,99 @@ function N(e, i, a = {}) { console.debug?.(e); } }); - let n = X.clipAction(t); - n.timeScale = ke, n.clampWhenFinished = !1, n.loop = P?.LoopRepeat ?? 2201, n.play(), Q[e] = n, $ = e, Ae = !0, M.playBtn.textContent = "Pause"; + 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"); try { - let e = Math.max(100, Math.min(1e4, Math.round((t.duration || 1) * 100))); - M.progressSlider.max = String(e); + let e = Math.max(100, Math.min(1e4, Math.round((n.duration || 1) * 100))); + P.progressSlider.max = String(e); } catch {} - }, qe = () => { - !X || !Z.length || (Ae ? (X.timeScale = 0, Ae = !1, M.playBtn.textContent = "Play") : (X.timeScale = ke, Q[$]?.isRunning?.() ? (Ae = !0, M.playBtn.textContent = "Pause") : Ke($))); - }, Je = (e, t) => { - !e || e.length === 0 || !P || (Z = e, X = new P.AnimationMixer(t), Oe = new P.Clock(), Q = Array(e.length).fill(null), M.animSel.innerHTML = "", e.forEach((e, t) => { + }, 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($))); + }, 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"); - n.value = String(t), n.textContent = e.name || `Animation ${t + 1}`, M.animSel.appendChild(n); - }), M.animSel.style.display = e.length > 1 ? "" : "none", M.bar.style.display = "flex", A.style.bottom = "54px", Ke(0), M.playBtn.addEventListener("click", (e) => { - C(e), qe(); - }), M.speedSel.addEventListener("change", () => { - ke = Number(M.speedSel.value) || 1, X.timeScale = Ae ? ke : 0; + n.value = String(t), n.textContent = e.name || `Animation ${t + 1}`, P.animSel.appendChild(n); + }), P.animSel.style.display = e.length > 1 ? "" : "none", P.bar.style.display = "flex", M.style.bottom = "54px", qe(0), P.playBtn.addEventListener("click", (e) => { + w(e), Je(); + }), P.speedSel.addEventListener("change", () => { + Ae = Number(P.speedSel.value) || 1, X.timeScale = je ? Ae : 0; let e = Q[$]; - e && (e.timeScale = ke); - }), M.animSel.addEventListener("change", () => { - Ke(Number(M.animSel.value) || 0); - }), M.progressSlider.addEventListener("pointerdown", () => { - je = !0; - }), M.progressSlider.addEventListener("pointerup", () => { - je = !1; + e && (e.timeScale = Ae); + }), P.animSel.addEventListener("change", () => { + qe(Number(P.animSel.value) || 0); + }), P.progressSlider.addEventListener("pointerdown", () => { + Me = !0; + }), P.progressSlider.addEventListener("pointerup", () => { + Me = !1; let e = Q[$], t = Z[$]; if (e && t) { - let n = Number(M.progressSlider.max) || 1e3, r = Number(M.progressSlider.value) / n * t.duration; + let n = Number(P.progressSlider.max) || 1e3, r = Number(P.progressSlider.value) / n * t.duration; e.time = Math.max(0, Math.min(r, t.duration)); } - }), M.progressSlider.addEventListener("input", () => { + }), P.progressSlider.addEventListener("input", () => { let e = Q[$], t = Z[$]; - if (e && t && je) { - let n = Number(M.progressSlider.max) || 1e3, r = Number(M.progressSlider.value) / n * t.duration; - e.time = Math.max(0, Math.min(r, t.duration)), M.timeLbl.textContent = `${w(r)} / ${w(t.duration)}`; + if (e && t && Me) { + let n = Number(P.progressSlider.max) || 1e3, r = Number(P.progressSlider.value) / n * t.duration; + e.time = Math.max(0, Math.min(r, t.duration)), P.timeLbl.textContent = `${T(r)} / ${T(t.duration)}`; } })); - }, Ye = () => { - ne(D, !!U?.visible), ne(me, q === O.ORTHOGRAPHIC), me.textContent = q === O.ORTHOGRAPHIC ? "Ortho" : "Persp", ne(he, Me); + }, 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); }; - j.bgInput.addEventListener("input", () => { - let e = j.bgInput.value; + N.bgInput.addEventListener("input", () => { + let e = N.bgInput.value; try { - I && (I.background = new (P?.Color || Object)(e)); + R && (R.background = new (I?.Color || Object)(e)); } catch (e) { console.debug?.(e); } - }), j.materialSel.addEventListener("change", () => { - He(j.materialSel.value); - }), j.upSel.addEventListener("change", () => { - Ue(j.upSel.value); - }), j.skeletonToggle && j.skeletonToggle.addEventListener("change", () => { - We(j.skeletonToggle.checked); - }), j.fovSlider.addEventListener("input", () => { - let e = Math.max(1, Math.min(179, Number(j.fovSlider.value) || ue)); + }), N.materialSel.addEventListener("change", () => { + Ue(N.materialSel.value); + }), N.upSel.addEventListener("change", () => { + We(N.upSel.value); + }), N.skeletonToggle && N.skeletonToggle.addEventListener("change", () => { + Ge(N.skeletonToggle.checked); + }), N.fovSlider.addEventListener("input", () => { + let e = Math.max(1, Math.min(179, Number(N.fovSlider.value) || le)); try { - R && (R.fov = e, R.updateProjectionMatrix()); + B && (B.fov = e, B.updateProjectionMatrix()); } catch (e) { console.debug?.(e); } - }), j.lightSlider.addEventListener("input", () => { - Ve(Number(j.lightSlider.value)); + }), N.lightSlider.addEventListener("input", () => { + He(Number(N.lightSlider.value)); }); - let Xe = () => { + let Ze = () => { let e = [], t = (t, n, r, i) => { t.addEventListener(n, r, i), e.push(() => t.removeEventListener(n, r, i)); }; - return t(g, "pointerdown", () => { + return t(_, "pointerdown", () => { try { - v.focus?.(); + y.focus?.(); } catch (e) { console.debug?.(e); } - }), t(g, "wheel", (e) => C(e)), t(g, "contextmenu", (e) => C(e, { preventDefault: !0 })), t(g, "dragstart", (e) => C(e, { preventDefault: !0 })), t(g, "dragover", (e) => C(e, { preventDefault: !0 })), t(g, "dragleave", (e) => C(e)), t(g, "drop", (e) => C(e, { preventDefault: !0 })), () => { + }), t(_, "wheel", (e) => w(e)), t(_, "contextmenu", (e) => w(e, { preventDefault: !0 })), t(_, "dragstart", (e) => w(e, { preventDefault: !0 })), t(_, "dragover", (e) => w(e, { preventDefault: !0 })), t(_, "dragleave", (e) => w(e)), t(_, "drop", (e) => w(e, { preventDefault: !0 })), () => { for (let t of e) try { t(); } catch (e) { console.debug?.(e); } }; - }, Ze = () => { - N = !0; + }, Qe = () => { + F = !0; try { - window.removeEventListener(r.RUNTIME_STATUS, et); + window.removeEventListener(i.RUNTIME_STATUS, tt); } catch {} try { - g._mjr3D = null; + _._mjr3D = null; } catch {} try { - V != null && cancelAnimationFrame(V); + U != null && cancelAnimationFrame(U); } catch (e) { console.debug?.(e); } - V = null; + U = null; try { xe?.(); } catch (e) { @@ -1294,17 +1294,17 @@ function N(e, i, a = {}) { } xe = null; try { - ve?.disconnect?.(); + _e?.disconnect?.(); } catch (e) { console.debug?.(e); } - ve = null; + _e = null; try { - B?.dispose?.(); + H?.dispose?.(); } catch (e) { console.debug?.(e); } - B = null; + H = null; try { X?.stopAllAction?.(), X?.uncacheRoot?.(X.getRoot?.()); } catch (e) { @@ -1324,15 +1324,15 @@ function N(e, i, a = {}) { } catch (e) { console.debug?.(e); } - X = null, Q = [], Z = [], l(we); + X = null, Q = [], Z = [], u(Te); try { - J && (I?.remove?.(J), J.dispose?.()); + J && (R?.remove?.(J), J.dispose?.()); } catch (e) { console.debug?.(e); } J = null; try { - I?.traverse?.((e) => { + R?.traverse?.((e) => { try { e.geometry?.dispose?.(); } catch {} @@ -1353,7 +1353,7 @@ function N(e, i, a = {}) { console.debug?.(e); } try { - g._mjrAxisScene &&= (g._mjrAxisScene.traverse?.((e) => { + _._mjrAxisScene &&= (_._mjrAxisScene.traverse?.((e) => { try { e.geometry?.dispose?.(); } catch {} @@ -1365,58 +1365,58 @@ function N(e, i, a = {}) { console.debug?.(e); } try { - F?.dispose?.(); + L?.dispose?.(); } catch (e) { console.debug?.(e); } - F = null, I = null, L = null, R = null, z = null, Se = null, W = null, G = null, ye = null; + L = null, R = null, z = null, B = null, V = null, Se = null, G = null, K = null, ve = null; try { - let e = v.getContext("webgl2") || v.getContext("webgl"); + let e = y.getContext("webgl2") || y.getContext("webgl"); e && e.getExtension("WEBGL_lose_context")?.loseContext?.(); } catch (e) { console.debug?.(e); } - }, Qe = () => { - be = !0; - try { - V != null && cancelAnimationFrame(V); - } catch (e) { - console.debug?.(e); - } - V = null; }, $e = () => { - if (be = !1, !(N || V != null || typeof ye != "function")) try { - V = requestAnimationFrame(ye); + ye = !0; + try { + U != null && cancelAnimationFrame(U); } catch (e) { console.debug?.(e); } - }, et = (e) => { - if (h) { + U = null; + }, et = () => { + if (ye = !1, !(F || U != null || typeof ve != "function")) try { + U = requestAnimationFrame(ve); + } catch (e) { + console.debug?.(e); + } + }, tt = (e) => { + if (g) { if (String(e?.detail?.active_prompt_id || "").trim()) { - Qe(); + $e(); return; } - $e(); + et(); } }; - v._mjrProc = { + y._mjrProc = { setParams: () => {}, - destroy: Ze, - captureCanvas: () => v, - pause: Qe, - resume: $e + destroy: Qe, + captureCanvas: () => y, + pause: $e, + resume: et }; try { - h && (window.addEventListener(r.RUNTIME_STATUS, et), String(window.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (be = !0)); + g && (window.addEventListener(i.RUNTIME_STATUS, tt), String(window.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (ye = !0)); } catch (e) { console.debug?.(e); } - return Fe("Preparing 3D preview", Ne), Promise.resolve().then(async () => { - let n = ge(e); - if (!oe.has(n)) { - if (Fe("3D preview unavailable", `${n.toUpperCase()} is not supported in the embedded viewer.`), A.style.display = "none", i) try { - let t = document.createElement("a"); - t.href = i, t.download = String(e?.filename || "model"), t.textContent = `Download ${String(e?.filename || "file")}`, t.style.cssText = [ + return Ie("Preparing 3D preview", Pe), Promise.resolve().then(async () => { + let r = he(e); + if (!ae.has(r)) { + 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%", @@ -1429,121 +1429,121 @@ function N(e, i, a = {}) { "text-decoration:none", "pointer-events:auto", "z-index:3" - ].join(";"), g.appendChild(t); + ].join(";"), _.appendChild(n); } catch {} return; } try { - let r = await te(); - if (N) return; - let c = r.THREE; - P = c; - let l = new c.LoadingManager(); - l.setURLModifier((n) => { - if (!n || pe(n)) return n; - let r = t(e, n); + let t = await te(); + if (F) return; + let i = t.THREE; + I = i; + let l = new i.LoadingManager(); + l.setURLModifier((t) => { + if (!t || fe(t)) return t; + let r = n(e, t); if (r) return r; try { - return new URL(n, i).href; + return new URL(t, a).href; } catch { - return n; + return t; } - }), F = new c.WebGLRenderer({ - canvas: v, + }), L = new i.WebGLRenderer({ + canvas: y, antialias: !0, alpha: !0, preserveDrawingBuffer: !0 - }), F.outputColorSpace = c.SRGBColorSpace, F.setPixelRatio(Math.min(2, window.devicePixelRatio || 1)), I = new c.Scene(), I.background = new c.Color(se), R = new c.PerspectiveCamera(ue, 16 / 9, .01, 1e4), z = new c.OrthographicCamera(-1, 1, 1, -1, -1e4, 1e4), L = R, B = new r.OrbitControls(L, v), B.enableDamping = !0, B.dampingFactor = .08, B.rotateSpeed = .82, B.zoomSpeed = 1, B.panSpeed = .9, B.screenSpacePanning = !0, B.mouseButtons = _e(null, c.MOUSE), xe = Xe(), Ee = new c.AmbientLight(16777215, k.ambient * Y), I.add(Ee); - let f = new c.DirectionalLight(16777215, k.main * Y); - f.position.set(0, 10, 10); - let p = new c.DirectionalLight(16777215, k.back * Y); + }), 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); + let u = new i.DirectionalLight(16777215, j.main * Y); + u.position.set(0, 10, 10); + let p = new i.DirectionalLight(16777215, j.back * Y); p.position.set(-10, 0, -10); - let h = new c.DirectionalLight(15266047, k.fill * Y); - h.position.set(10, 5, -5); - let y = new c.DirectionalLight(16773352, k.fill * Y); - y.position.set(-10, 5, 5); - let b = new c.DirectionalLight(16777215, k.bottom * Y); - b.position.set(0, -10, 0), De = [ - f, + let m = new i.DirectionalLight(15266047, j.fill * Y); + m.position.set(10, 5, -5); + let g = new i.DirectionalLight(16773352, j.fill * Y); + g.position.set(-10, 5, 5); + let b = new i.DirectionalLight(16777215, j.bottom * Y); + b.position.set(0, -10, 0), Oe = [ + u, p, - h, - y, + m, + g, b - ], De.forEach((e) => I.add(e)), U = new c.GridHelper(20, 20, 5068128, 3094338), I.add(U); + ], Oe.forEach((e) => R.add(e)), W = new i.GridHelper(20, 20, 5068128, 3094338), R.add(W); let x = () => { - if (N || !F || !L) return; - let e = g.getBoundingClientRect(), t = Math.max(1, Math.round(e.width || v.clientWidth || 1)), n = Math.max(1, Math.round(e.height || v.clientHeight || 1)); - F.setSize(t, n, !1), R && (R.aspect = t / n, R.updateProjectionMatrix()), Re(t, n), Le(), Pe(); + if (F || !L || !z) return; + let e = _.getBoundingClientRect(), t = Math.max(1, Math.round(e.width || y.clientWidth || 1)), n = Math.max(1, Math.round(e.height || y.clientHeight || 1)); + L.setSize(t, n, !1), B && (B.aspect = t / n, B.updateProjectionMatrix()), ze(t, n), Re(), Fe(); }; - typeof ResizeObserver < "u" && (ve = new ResizeObserver(() => x()), ve.observe(g)); - let S = ee(r, n, l); + typeof ResizeObserver < "u" && (_e = new ResizeObserver(() => x()), _e.observe(_)); + let S = v(t, r, l); if (!S) { - Fe("3D loader unavailable", `${n.toUpperCase()} loader could not be created.`), A.style.display = "none"; + Ie("3D loader unavailable", `${r.toUpperCase()} loader could not be created.`), M.style.display = "none"; return; } - if (n === "obj" && r.MTLLoader) try { - let e = i.replace(/\.obj(\?.*)?$/i, (e, t) => `.mtl${t || ""}`), t = new r.MTLLoader(l), n = await new Promise((n) => { - t.load(e, n, void 0, () => n(null)); + 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)); }); - n && !N && (n.preload(), S.setMaterials(n)); + r && !F && (r.preload(), S.setMaterials(r)); } catch (e) { console.debug?.("[MJR 3D] MTL load skipped:", e?.message); } - let w = await _(S, n, i); - if (N) return; - let T = m(c, n, w); + let C = await ee(S, r, a); + if (F) return; + let T = h(i, r, C); if (!T) { - Fe("Empty 3D scene", "The loader returned no renderable object."), A.style.display = "none"; + Ie("Empty 3D scene", "The loader returned no renderable object."), M.style.display = "none"; return; } try { - let e = new c.Box3().setFromObject(T); + let e = new i.Box3().setFromObject(T); if (!e.isEmpty()) { - let t = e.getSize(new c.Vector3()), n = e.getCenter(new c.Vector3()), r = 5 / Math.max(t.x, t.y, t.z, .001); + let t = e.getSize(new i.Vector3()), n = e.getCenter(new i.Vector3()), r = 5 / Math.max(t.x, t.y, t.z, .001); T.scale.multiplyScalar(r), e.setFromObject(T), e.getCenter(n), T.position.set(-n.x, -e.min.y, -n.z); } } catch (e) { console.debug?.("[MJR 3D] normalize skipped:", e); } - if (Se = T, W = new c.Group(), W.add(T), I.add(W), Ce = s(T), Te = o(T), Te) { - J = new c.SkeletonHelper(T), J.visible = !1, I.add(J); - let e = re({ - defaultBgColor: se, - defaultFov: ue, - defaultLightIntensity: de, + if (Se = T, G = new i.Group(), G.add(T), R.add(G), we = c(T), Ee = s(T), Ee) { + J = new i.SkeletonHelper(T), J.visible = !1, R.add(J); + let e = ne({ + defaultBgColor: oe, + defaultFov: le, + defaultLightIntensity: ue, hasSkeleton: !0 }); - g.replaceChild(e.panel, j.panel), Object.assign(j, e), j.bgInput.addEventListener("input", () => { + _.replaceChild(e.panel, N.panel), Object.assign(N, e), N.bgInput.addEventListener("input", () => { try { - I && (I.background = new c.Color(j.bgInput.value)); + R && (R.background = new i.Color(N.bgInput.value)); } catch (e) { console.debug?.(e); } - }), j.materialSel.addEventListener("change", () => { - He(j.materialSel.value); - }), j.upSel.addEventListener("change", () => { - Ue(j.upSel.value); - }), j.skeletonToggle && j.skeletonToggle.addEventListener("change", () => { - We(j.skeletonToggle.checked); - }), j.fovSlider.addEventListener("input", () => { - let e = Math.max(1, Math.min(179, Number(j.fovSlider.value) || ue)); + }), N.materialSel.addEventListener("change", () => { + Ue(N.materialSel.value); + }), N.upSel.addEventListener("change", () => { + We(N.upSel.value); + }), N.skeletonToggle && N.skeletonToggle.addEventListener("change", () => { + Ge(N.skeletonToggle.checked); + }), N.fovSlider.addEventListener("input", () => { + let e = Math.max(1, Math.min(179, Number(N.fovSlider.value) || le)); try { - R && (R.fov = e, R.updateProjectionMatrix()); + B && (B.fov = e, B.updateProjectionMatrix()); } catch (e) { console.debug?.(e); } - }), j.lightSlider.addEventListener("input", () => { - Ve(Number(j.lightSlider.value)); + }), N.lightSlider.addEventListener("input", () => { + He(Number(N.lightSlider.value)); }); } - G = d(c, W), G && (U.position.y = G.box.min.y), q = O.PERSPECTIVE, ze(), x(), Ie(), Ye(); - let ne = u(w, n); - ne.length > 0 && Je(ne, T); - let E = new c.Scene(); - g._mjrAxisScene = E; - let ie = new c.PerspectiveCamera(50, 1, .1, 100); - ie.position.set(0, 0, 3.2), ie.lookAt(0, 0, 0); - let oe = [ + K = f(i, G), K && (W.position.y = K.box.min.y), q = A.PERSPECTIVE, Be(), x(), Le(), Xe(); + let E = d(C, r); + E.length > 0 && Ye(E, T); + let D = new i.Scene(); + _._mjrAxisScene = D; + let O = new i.PerspectiveCamera(50, 1, .1, 100); + O.position.set(0, 0, 3.2), O.lookAt(0, 0, 0); + let re = [ { dir: [ 1, @@ -1568,94 +1568,94 @@ function N(e, i, a = {}) { ], color: 5605631 } - ], ce = new c.SphereGeometry(.1, 12, 8), le = new c.SphereGeometry(.08, 10, 6), fe = new c.MeshBasicMaterial({ color: 13421772 }); - E.add(new c.Mesh(le, fe)); - for (let { dir: e, color: t } of oe) { - let n = new c.LineBasicMaterial({ color: t }), r = [new c.Vector3(0, 0, 0), new c.Vector3(e[0], e[1], e[2])], i = new c.BufferGeometry().setFromPoints(r); - E.add(new c.Line(i, n)); - let a = new c.MeshBasicMaterial({ color: t }), o = new c.Mesh(ce, a); - o.position.set(e[0], e[1], e[2]), E.add(o); + ], ae = new i.SphereGeometry(.1, 12, 8), se = new i.SphereGeometry(.08, 10, 6), ce = new i.MeshBasicMaterial({ color: 13421772 }); + D.add(new i.Mesh(se, ce)); + for (let { dir: e, color: t } of re) { + let n = new i.LineBasicMaterial({ color: t }), r = [new i.Vector3(0, 0, 0), new i.Vector3(e[0], e[1], e[2])], a = new i.BufferGeometry().setFromPoints(r); + D.add(new i.Line(a, n)); + let o = new i.MeshBasicMaterial({ color: t }), s = new i.Mesh(ae, o); + s.position.set(e[0], e[1], e[2]), D.add(s); } - g._mjr3D = { - controls: B, + _._mjr3D = { + controls: H, get camera() { - return L; + return z; } }; try { - a.onReady?.({ - canvas: v, - host: g, - object: W, - renderer: F, - camera: L, - controls: B + o.onReady?.({ + canvas: y, + host: _, + object: G, + renderer: L, + camera: z, + controls: H }); } catch (e) { console.debug?.(e); } - Pe(); - let ge = () => { - if (!(N || be || !F || !I || !L)) { + Fe(); + let de = () => { + if (!(F || ye || !L || !R || !z)) { try { - if (B?.update?.(), X && Oe) { - let e = Oe.getDelta(); - Ae && X.update(e), Ge(); + if (H?.update?.(), X && ke) { + let e = ke.getDelta(); + je && X.update(e), Ke(); } - F.setScissorTest(!1), F.setViewport(0, 0, v.width, v.height), F.render(I, L); + L.setScissorTest(!1), L.setViewport(0, 0, y.width, y.height), L.render(R, z); let e = Math.min(2, window.devicePixelRatio || 1), t = Math.round(96 * e); - F.setScissorTest(!0), F.setScissor(0, 0, t, t), F.setViewport(0, 0, t, t), F.setClearColor(0, 0), F.clear(!0, !0, !1); - let n = L.quaternion; - ie.position.set(0, 0, 3.2).applyQuaternion(n), ie.quaternion.copy(n), F.render(E, ie), F.setScissorTest(!1); + L.setScissorTest(!0), L.setScissor(0, 0, t, t), L.setViewport(0, 0, t, t), L.setClearColor(0, 0), L.clear(!0, !0, !1); + let n = z.quaternion; + O.position.set(0, 0, 3.2).applyQuaternion(n), O.quaternion.copy(n), L.render(D, O), L.setScissorTest(!1); try { - F.setClearColor(I.background || 0, 1); + L.setClearColor(R.background || 0, 1); } catch {} - Le(); + Re(); } catch (e) { console.debug?.(e); } - be || (V = requestAnimationFrame(ge)); + ye || (U = requestAnimationFrame(de)); } }; - ye = ge; - let M = (e) => C(e, { preventDefault: !0 }); - ae.addEventListener("click", (e) => { - M(e), ze(), Ye(); - }), D.addEventListener("click", (e) => { - M(e), U && (U.visible = !U.visible), Ye(), Pe(); + ve = de; + let he = (e) => w(e, { preventDefault: !0 }); + ie.addEventListener("click", (e) => { + he(e), Be(), Xe(); + }), k.addEventListener("click", (e) => { + he(e), W && (W.visible = !W.visible), Xe(), Fe(); + }), pe.addEventListener("click", (e) => { + he(e), Ve(q === A.PERSPECTIVE ? A.ORTHOGRAPHIC : A.PERSPECTIVE); }), me.addEventListener("click", (e) => { - M(e), Be(q === O.PERSPECTIVE ? O.ORTHOGRAPHIC : O.PERSPECTIVE); - }), he.addEventListener("click", (e) => { - M(e), Me = !Me, j.panel.style.display = Me ? "block" : "none", Ye(); - }), be || ge(); + he(e), Ne = !Ne, N.panel.style.display = Ne ? "block" : "none", Xe(); + }), ye || de(); } catch (e) { - console.warn("[MJR 3D] preview init failed", e), Fe("Failed to load 3D preview", String(e?.message || "Three.js initialization failed.")), A.style.display = "none"; + 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"; } }).catch((e) => { - if (!N) { + if (!F) { console.warn("[MJR 3D] preview init unhandled error", e); try { - Fe("Failed to load 3D preview", String(e?.message || "Initialization failed.")); + Ie("Failed to load 3D preview", String(e?.message || "Initialization failed.")); } catch {} try { - A.style.display = "none"; + M.style.display = "none"; } catch {} } - }), g; + }), _; } //#endregion //#region ui/features/viewer/model3dRenderer.ts -var ve = /* @__PURE__ */ e({ - MODEL3D_EXTS: () => D, - MODEL3D_EXT_TO_LOADER: () => ae, - PREVIEWABLE_MODEL3D_LOADERS: () => oe, - buildModel3DMouseButtons: () => _e, - createModel3DMediaElement: () => N, - findModel3DCanvas: () => j, - getModel3DDefaultControlHint: () => A, - isModel3DAsset: () => he, - isModel3DInteractionTarget: () => M, - resolveModel3DLoader: () => ge +var _e = /* @__PURE__ */ e({ + MODEL3D_EXTS: () => k, + MODEL3D_EXT_TO_LOADER: () => ie, + PREVIEWABLE_MODEL3D_LOADERS: () => ae, + buildModel3DMouseButtons: () => ge, + createModel3DMediaElement: () => F, + findModel3DCanvas: () => N, + getModel3DDefaultControlHint: () => M, + isModel3DAsset: () => me, + isModel3DInteractionTarget: () => P, + resolveModel3DLoader: () => he }); //#endregion -export { M as a, v as c, he as i, D as n, b as o, N as r, y as s, ve as t }; +export { P as a, y as c, me as i, k as n, x as o, F as r, b as s, _e as t }; diff --git a/dist/chunks/openMajoorSettings-CGhSTA_W.js b/dist/chunks/openMajoorSettings-BeNfIQfY.js similarity index 68% rename from dist/chunks/openMajoorSettings-CGhSTA_W.js rename to dist/chunks/openMajoorSettings-BeNfIQfY.js index 6bca6e7d..c044adef 100644 --- a/dist/chunks/openMajoorSettings-CGhSTA_W.js +++ b/dist/chunks/openMajoorSettings-BeNfIQfY.js @@ -1,21 +1,20 @@ -import { Bt as e, Wt as t, a as n, o as r, u as i } from "./hostAdapter-D6BwD-lN.js"; -import { t as a } from "./config-dvcltBqE.js"; -import { B as o, S as s, b as c, g as l, x as u } from "./SidebarWorkflowSection-CxD2u7Bb.js"; -import { a as d, n as f } from "./graphTraversal-HdtD9lDa.js"; -import { n as p, t as m } from "./state-DPiaUMw1.js"; +import { R as e, T as t, b as n, h as r, k as i, l as a, t as o, w as s, z as c } from "./config-Cxv7acF8.js"; +import { a as l, n as u } from "./graphTraversal-CjIZsRsP.js"; +import { C as d, S as f, V as p, _ as m, x as h } from "./SidebarWorkflowSection-na0bq_pe.js"; +import { n as g, t as _ } from "./state-DPiaUMw1.js"; //#region ui/features/viewer/floatingViewerProgress.ts -var h = "progress-update", g = Symbol.for("mjr.mfv.progress.queuePromptPatch"), _ = "__MJR_MFV_PROGRESS_SERVICE__"; -function v() { +var v = "progress-update", y = "__MJR_MFV_PROGRESS_SERVICE__"; +function b() { return typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : {}; } -function y(e, t) { +function x(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 ee = class { - constructor(e, t = () => r()) { - 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; + constructor(e, n = () => t()) { + this.id = String(e || ""), this.promptApi = null, this.executedNodeIds = [], this.totalNodes = 0, this.currentlyExecuting = null, this.errorDetails = null, this._getApp = typeof n == "function" ? n : () => null; } setPrompt(e) { let t = e && typeof e == "object" ? e.output : null; @@ -27,7 +26,7 @@ var ee = class { getNodeLabel(e) { let t = this.getApiNode(e), n = t?._meta?.title || t?.class_type || ""; if (!n) { - let t = this._getApp?.(), r = f(d(t), e); + let t = this._getApp?.(), r = u(l(t), e); n = r?.title || r?.type || ""; } return String(n || "").trim(); @@ -62,9 +61,9 @@ var ee = class { error(e) { this.errorDetails = e || null; } -}, b = class extends EventTarget { - constructor({ getApi: e = (e) => n(e), getApp: t = () => r(), waitForApi: a = (e) => i(e) } = {}) { - super(), this._getApi = e, this._getApp = t, this._waitForApi = a, this.promptsMap = /* @__PURE__ */ new Map(), this.currentExecution = null, this.lastQueueRemaining = 0, this._api = null, this._listenerEntries = [], this._initPromise = null; +}, S = class extends EventTarget { + constructor({ getApi: n = (e) => s(e), getApp: r = () => t(), waitForApi: i = (t) => e(t) } = {}) { + super(), this._getApi = n, 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; } getSnapshot() { return { @@ -108,35 +107,32 @@ var ee = class { }), this._api = e, this._patchQueuePrompt(e), this._attachApiListeners(e)); } _patchQueuePrompt(e) { - if (!e || typeof e.queuePrompt != "function") return; - let t = e.queuePrompt?.[g]; - if (t?.service === this || t?.service && t.service !== this) return; - let n = e.queuePrompt, r = this, i = async function(e, t, ...i) { - let a; - try { - a = await n.apply(this, [ - e, - t, - ...i - ]); - } catch (e) { - let t = r.getOrMakePrompt("error"); - throw t.error({ exception_type: "Unknown." }), r.currentExecution = t, r.dispatchProgressUpdate(), e; + let t = this; + this._queuePromptBinding = c({ + 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(x("queue-prompt", { prompt: e })), t.dispatchProgressUpdate(); + } + return a; + }; } - let o = String(a?.prompt_id || a?.promptId || "").trim(); - if (o) { - let e = r.getOrMakePrompt(o); - e.setPrompt(t), r.currentExecution ||= e, r.dispatchEvent(y("queue-prompt", { prompt: e })), r.dispatchProgressUpdate(); - } - return a; - }; - Object.defineProperty(i, g, { - configurable: !0, - value: { - service: r, - originalQueuePrompt: n - } - }), e.queuePrompt = i; + }); } _attachApiListeners(e) { this._attachListener(e, "status", (e) => { @@ -177,7 +173,7 @@ var ee = class { }); } dispatchProgressUpdate() { - this.dispatchEvent(y(h, this.getSnapshot())); + this.dispatchEvent(x(v, this.getSnapshot())); } dispose({ resetPatchedQueuePrompt: e = !1, keepState: t = !1 } = {}) { for (let { api: e, type: t, handler: n } of this._listenerEntries.splice(0)) try { @@ -185,18 +181,17 @@ var ee = class { } catch (e) { console.debug?.(e); } - if (e && this._api?.queuePrompt?.[g]?.service === this) try { - let e = this._api.queuePrompt[g]?.originalQueuePrompt || null; - typeof e == "function" && (this._api.queuePrompt = e); + if (e && this._queuePromptBinding?.owner === this) try { + this._queuePromptBinding.restore?.(); } catch (e) { console.debug?.(e); } - this._api = null, t || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0); + this._queuePromptBinding = null, this._api = null, t || (this.promptsMap.clear(), this.currentExecution = null, this.lastQueueRemaining = 0); } -}, x = v(), S = x[_] || new b(); -x[_] || (x[_] = S); -function C(e = {}) { - return S.ensureInitialized(e); +}, C = b(), w = C[y] || new S(); +C[y] || (C[y] = w); +function T(e = {}) { + return w.ensureInitialized(e); } function te(e) { let t = Math.max(0, Number(e?.queue) || 0), n = e?.prompt || null; @@ -222,7 +217,7 @@ function te(e) { } return t > 0 ? `(${t}) Running... in another tab` : "Idle"; } -function w(e) { +function ne(e) { let t = e?.prompt || null; if (t?.errorDetails) { let e = t?.errorDetails || {}, n = String(t?.currentlyExecuting?.nodeLabel || e?.node_type || e?.node_id || "Execution").trim(), r = e?.exception_message ?? e?.error ?? e?.message ?? e?.detail ?? e?.reason ?? "", i = (Array.isArray(r) ? r.map((e) => String(e || "").trim()).filter(Boolean).join(" | ") : String(r || "").trim()).replace(/\s+/g, " ").trim(); @@ -233,7 +228,7 @@ function w(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 T(e, t) { +function re(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) { @@ -245,21 +240,20 @@ function T(e, t) { Number.isFinite(e) && Number.isFinite(t) && t > 0 && (a = `${Math.max(0, Math.min(100, e / t * 100))}%`); } else o && (i = "100%", a = "100%"); if (e._progressCurrentNodeId = r || null, e._progressEl && (e._progressNodesEl.style.width = i, e._progressStepsEl.style.width = a, e._progressTextEl.textContent = te(t), e._progressEl.classList.toggle("is-error", o), e._progressEl.classList.toggle("is-clickable", !!r), e._progressEl.title = r ? "Execution progress - click to center active node" : "Execution progress"), e._mediaProgressEl) { - let n = w(t); + let n = ne(t); e._mediaProgressTextEl.textContent = n, e._mediaProgressEl.title = n || "", e._mediaProgressEl.classList.toggle("is-error", o), e._mediaProgressEl.classList.toggle("is-visible", !!n); } } -function ne(e, t) { - let n = String(t || "").trim(); - if (!n) return !1; +function ie(e, n) { + let i = String(n || "").trim(); + if (!i) return !1; try { - let e = r(), t = e?.canvas || null, i = f(d(e), n); - return !i || typeof t?.centerOnNode != "function" ? !1 : (t.centerOnNode(i), !0); + return r(i, t()); } catch (e) { return console.debug?.(e), !1; } } -function re(e) { +function ae(e) { let t = document.createElement("div"); t.className = "mjr-mfv-progress", t.setAttribute("role", "status"), t.setAttribute("aria-live", "polite"); let n = document.createElement("div"); @@ -270,22 +264,22 @@ function re(e) { i.className = "mjr-mfv-progress-overlay", i.setAttribute("aria-hidden", "true"); 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 && ne(e, e._progressCurrentNodeId) && (t.preventDefault(), t.stopPropagation()); - }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && S.removeEventListener(h, e._progressUpdateHandler), e._progressUpdateHandler = (t) => { - T(e, t?.detail || S.getSnapshot()); - }, S.addEventListener(h, e._progressUpdateHandler), C({ timeoutMs: 4e3 }).catch((e) => { + t.button === 0 && ie(e, e._progressCurrentNodeId) && (t.preventDefault(), t.stopPropagation()); + }), e._progressEl = t, e._progressNodesEl = n, e._progressStepsEl = r, e._progressTextEl = a, e._progressUpdateHandler && w.removeEventListener(v, e._progressUpdateHandler), e._progressUpdateHandler = (t) => { + re(e, t?.detail || w.getSnapshot()); + }, w.addEventListener(v, e._progressUpdateHandler), T({ timeoutMs: 4e3 }).catch((e) => { console.debug?.(e); - }), T(e, S.getSnapshot()), t; + }), re(e, w.getSnapshot()), t; } -function ie(e) { +function oe(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, T(e, S.getSnapshot()), t; + return n.className = "mjr-mfv-media-progress-text", t.appendChild(n), e._mediaProgressEl = t, e._mediaProgressTextEl = n, re(e, w.getSnapshot()), t; } -function ae(e) { +function se(e) { if (e?._progressUpdateHandler) try { - S.removeEventListener(h, e._progressUpdateHandler); + w.removeEventListener(v, e._progressUpdateHandler); } catch (e) { console.debug?.(e); } @@ -293,10 +287,10 @@ function ae(e) { } //#endregion //#region ui/components/VideoControls.ts -var oe = 400, se = 1e3, ce = 220; -function le(e, t, n) { +var ce = 400, le = 1e3, ue = 220; +function de(e, t, n) { try { - if (e?.aborted) return c; + if (e?.aborted) return h; let r = setTimeout(() => { try { if (e?.aborted) return; @@ -329,20 +323,20 @@ function le(e, t, n) { } }; } catch { - return c; + return h; } } function E(e) { let t = Math.floor(Number(e) || 0); return t < 10 ? `0${t}` : String(t); } -function ue(e) { +function fe(e) { let t = Number(e); if (!Number.isFinite(t) || t < 0) return "0:00"; let n = Math.floor(t), r = Math.floor(n / 3600), i = Math.floor(n % 3600 / 60), a = n % 60; return r > 0 ? `${r}:${E(i)}:${E(a)}` : `${i}:${E(a)}`; } -function de(e, t, n) { +function pe(e, t, n) { let r = document.createElement("button"); r.type = "button", r.className = `mjr-video-btn ${e || ""}`.trim(), n && (r.title = n); try { @@ -352,7 +346,7 @@ function de(e, t, n) { } return r.textContent = t, r; } -function fe(e, t, n, r) { +function me(e, t, n, r) { let i = document.createElement("button"); i.type = "button", i.className = `mjr-video-btn ${e || ""}`.trim(), n && (i.title = n); try { @@ -366,18 +360,18 @@ function fe(e, t, n, r) { icon: a }; } -function pe(e, { min: t, max: n, step: r, value: i, title: a, ariaLabel: o, widthPx: s } = {}) { +function he(e, { min: t, max: n, step: r, value: i, title: a, ariaLabel: o, widthPx: s } = {}) { let c = document.createElement("input"); return c.type = "number", c.className = `mjr-video-num ${e || ""}`.trim(), a && (c.title = a), o && c.setAttribute("aria-label", o), t != null && (c.min = String(t)), n != null && (c.max = String(n)), r != null && (c.step = String(r)), i != null && (c.value = String(i)), s != null && (c.style.width = `${s}px`), c; } -function me(e) { +function ge(e) { try { return e?.variant === "preview" ? "preview" : e?.variant === "viewerbar" ? "viewerbar" : "viewer"; } catch { return "viewer"; } } -function he(e) { +function _e(e) { try { let t = Number(e?.initialFps); return Number.isFinite(t) && t > 0 ? t : null; @@ -385,24 +379,24 @@ function he(e) { return null; } } -function ge(t, n) { - let r = []; +function ve(e, t) { + let n = []; try { - t.controls = !1, t.loop = !0, t.muted = !0, t.playsInline = !0, t.autoplay = !0; + e.controls = !1, e.loop = !0, e.muted = !0, e.playsInline = !0, e.autoplay = !0; } catch (e) { console.debug?.(e); } - let i = document.createElement("div"); - i.className = "mjr-video-controls mjr-video-controls--preview"; + let r = document.createElement("div"); + r.className = "mjr-video-controls mjr-video-controls--preview"; try { - i.setAttribute("role", "group"), i.setAttribute("aria-label", e("video.previewControls", "Video preview controls")); + r.setAttribute("role", "group"), r.setAttribute("aria-label", a("video.previewControls", "Video preview controls")); } catch (e) { console.debug?.(e); } - let a = document.createElement("button"); - a.type = "button", a.className = "mjr-video-preview-btn", a.title = e("video.playPause", "Play/Pause"); + let i = document.createElement("button"); + i.type = "button", i.className = "mjr-video-preview-btn", i.title = a("video.playPause", "Play/Pause"); try { - a.setAttribute("aria-label", e("video.playPause", "Play/Pause")); + i.setAttribute("aria-label", a("video.playPause", "Play/Pause")); } catch (e) { console.debug?.(e); } @@ -413,154 +407,154 @@ function ge(t, n) { } catch (e) { console.debug?.(e); } - a.appendChild(o), i.appendChild(a); - let c = () => { + i.appendChild(o), r.appendChild(i); + let s = () => { try { - o.className = `pi ${t?.paused ? "pi-play" : "pi-pause"}`; + o.className = `pi ${e?.paused ? "pi-play" : "pi-pause"}`; } catch (e) { console.debug?.(e); } - }, l = () => { + }, c = () => { try { - let e = t.play?.(); - e && typeof e.catch == "function" && e.catch(() => {}); + let t = e.play?.(); + t && typeof t.catch == "function" && t.catch(() => {}); } catch (e) { console.debug?.(e); } - }, d = (e) => { + }, l = (t) => { try { - e?.stopPropagation?.(); + t?.stopPropagation?.(); } catch (e) { console.debug?.(e); } try { - t.paused ? l() : t.pause?.(); + e.paused ? c() : e.pause?.(); } catch (e) { console.debug?.(e); } - c(); + s(); }; try { - n.appendChild(i); + t.appendChild(r); } catch (e) { console.debug?.(e); } - try { - l(); - } catch (e) { - console.debug?.(e); - } - r.push(u(t, "loadedmetadata", () => l(), { passive: !0 })), r.push(u(t, "canplay", () => l(), { passive: !0 })), r.push(u(a, "click", d)), r.push(u(t, "play", c, { passive: !0 })), r.push(u(t, "pause", c, { passive: !0 })), r.push(u(t, "ended", () => l(), { passive: !0 })); try { c(); } catch (e) { console.debug?.(e); } + n.push(f(e, "loadedmetadata", () => c(), { passive: !0 })), n.push(f(e, "canplay", () => c(), { passive: !0 })), n.push(f(i, "click", l)), n.push(f(e, "play", s, { passive: !0 })), n.push(f(e, "pause", s, { passive: !0 })), n.push(f(e, "ended", () => c(), { passive: !0 })); + try { + s(); + } catch (e) { + console.debug?.(e); + } return { - controlsEl: i, + controlsEl: r, destroy: () => { try { - for (let e of r) s(() => e?.()); + for (let e of n) d(() => e?.()); } catch (e) { console.debug?.(e); } try { - i.remove?.(); + r.remove?.(); } catch (e) { console.debug?.(e); } } }; } -function _e(t, n = {}) { +function D(e, t = {}) { try { - let r = me(n), i = String(n?.mediaKind || "video").toLowerCase() === "audio", a = r === "viewerbar", o = r !== "preview" && !i, d = he(n), f = n?.hostEl || t?.parentElement; - if (!t || !f) return { + let n = ge(t), r = String(t?.mediaKind || "video").toLowerCase() === "audio", i = n === "viewerbar", o = n !== "preview" && !r, s = _e(t), c = t?.hostEl || e?.parentElement; + if (!e || !c) return { controlsEl: null, - destroy: c + destroy: h }; - if (r === "preview") return ge(t, f); + if (n === "preview") return ve(e, c); try { - t.loop = !1; + e.loop = !1; } catch (e) { console.debug?.(e); } - s(() => f.classList?.add("mjr-video-host")), s(() => t.classList?.add("mjr-video-el")), s(() => { - window.getComputedStyle?.(f)?.position === "static" && (f.style.position = "relative"); + d(() => c.classList?.add("mjr-video-host")), d(() => e.classList?.add("mjr-video-el")), d(() => { + window.getComputedStyle?.(c)?.position === "static" && (c.style.position = "relative"); }); - let h = document.createElement("div"); - h.className = `mjr-video-controls mjr-video-controls--${r}`, a && h.classList.add("mjr-video-controls--modern"), h.dataset.mjrLayout = "regular", h.setAttribute("role", "group"), h.setAttribute("aria-label", i ? e("video.audioControls", "Audio controls") : e("video.controls", "Video controls")); - let g = document.createElement("div"); - g.className = "mjr-video-row mjr-video-row--top"; - let _ = document.createElement("div"); - _.className = "mjr-video-row mjr-video-row--bottom", h.appendChild(g), h.appendChild(_); + let l = document.createElement("div"); + l.className = `mjr-video-controls mjr-video-controls--${n}`, i && l.classList.add("mjr-video-controls--modern"), l.dataset.mjrLayout = "regular", l.setAttribute("role", "group"), l.setAttribute("aria-label", r ? a("video.audioControls", "Audio controls") : a("video.controls", "Video controls")); + let u = document.createElement("div"); + u.className = "mjr-video-row mjr-video-row--top"; + let p = document.createElement("div"); + p.className = "mjr-video-row mjr-video-row--bottom", l.appendChild(u), l.appendChild(p); let v = document.createElement("div"); v.className = "mjr-video-seek-wrap"; let y = document.createElement("input"); - y.className = "mjr-video-range mjr-video-range--seek", y.type = "range", y.min = "0", y.max = String(se), y.step = "1", y.value = "0", y.setAttribute("aria-label", e("video.seek", "Seek")), y.title = i ? e("video.seekThroughAudio", "Seek through audio") : e("video.seekThrough", "Seek through video"); - let ee = document.createElement("div"); - ee.className = "mjr-video-seek-overlay"; - let b = null, x = null, S = null, C = null; - o && (b = document.createElement("div"), b.className = "mjr-video-seek-zones", x = document.createElement("div"), x.className = "mjr-video-seek-zone mjr-video-seek-zone--leftTrim", S = document.createElement("div"), S.className = "mjr-video-seek-zone mjr-video-seek-zone--selected", C = document.createElement("div"), C.className = "mjr-video-seek-zone mjr-video-seek-zone--rightTrim", b.appendChild(x), b.appendChild(S), b.appendChild(C)); - let te = document.createElement("div"); - te.className = "mjr-video-seek-ticks"; + y.className = "mjr-video-range mjr-video-range--seek", y.type = "range", y.min = "0", y.max = String(le), y.step = "1", y.value = "0", y.setAttribute("aria-label", a("video.seek", "Seek")), y.title = r ? a("video.seekThroughAudio", "Seek through audio") : a("video.seekThrough", "Seek through video"); + let b = document.createElement("div"); + b.className = "mjr-video-seek-overlay"; + let x = null, ee = null, S = null, C = null; + o && (x = document.createElement("div"), x.className = "mjr-video-seek-zones", ee = document.createElement("div"), ee.className = "mjr-video-seek-zone mjr-video-seek-zone--leftTrim", S = document.createElement("div"), S.className = "mjr-video-seek-zone mjr-video-seek-zone--selected", C = document.createElement("div"), C.className = "mjr-video-seek-zone mjr-video-seek-zone--rightTrim", x.appendChild(ee), x.appendChild(S), x.appendChild(C)); let w = document.createElement("div"); - w.className = "mjr-video-seek-labels"; + w.className = "mjr-video-seek-ticks"; let T = document.createElement("div"); - T.className = "mjr-video-seek-mark mjr-video-seek-mark--in"; + T.className = "mjr-video-seek-labels"; + let te = document.createElement("div"); + te.className = "mjr-video-seek-mark mjr-video-seek-mark--in"; let ne = document.createElement("div"); ne.className = "mjr-video-seek-mark mjr-video-seek-mark--out"; let re = document.createElement("div"); re.className = "mjr-video-seek-playhead"; let ie = document.createElement("div"); - ie.className = "mjr-video-seek-playhead-label", ee.appendChild(te), ee.appendChild(w), ee.appendChild(re), ee.appendChild(ie); + ie.className = "mjr-video-seek-playhead-label", b.appendChild(w), b.appendChild(T), b.appendChild(re), b.appendChild(ie); let ae = document.createElement("div"); - ae.className = "mjr-video-seek-handle mjr-video-seek-handle--in", ae.title = e("video.dragSetIn", "Drag to set In"), ae.setAttribute("aria-label", e("video.dragSetIn", "Drag to set In")); - let E = document.createElement("div"); - E.className = "mjr-video-seek-handle mjr-video-seek-handle--out", E.title = e("video.dragSetOut", "Drag to set Out"), E.setAttribute("aria-label", e("video.dragSetOut", "Drag to set Out")), v.appendChild(y), b && v.appendChild(b), v.appendChild(ee), v.appendChild(T), v.appendChild(ne), v.appendChild(ae), v.appendChild(E); - let _e = document.createElement("span"); - _e.className = "mjr-video-time", _e.textContent = "0:00 / 0:00", _e.title = e("video.currentTimeTotal", "Current time / Total duration"); - let D = document.createElement("span"); - D.className = "mjr-video-range-count", D.textContent = ""; + ae.className = "mjr-video-seek-handle mjr-video-seek-handle--in", ae.title = a("video.dragSetIn", "Drag to set In"), ae.setAttribute("aria-label", a("video.dragSetIn", "Drag to set In")); + let oe = document.createElement("div"); + oe.className = "mjr-video-seek-handle mjr-video-seek-handle--out", oe.title = a("video.dragSetOut", "Drag to set Out"), oe.setAttribute("aria-label", a("video.dragSetOut", "Drag to set Out")), v.appendChild(y), x && v.appendChild(x), v.appendChild(b), v.appendChild(te), v.appendChild(ne), v.appendChild(ae), v.appendChild(oe); + let se = document.createElement("span"); + se.className = "mjr-video-time", se.textContent = "0:00 / 0:00", se.title = a("video.currentTimeTotal", "Current time / Total duration"); + let E = document.createElement("span"); + E.className = "mjr-video-range-count", E.textContent = ""; try { - D.style.display = "none"; + E.style.display = "none"; } catch (e) { console.debug?.(e); } - let ve = document.createElement("div"); - ve.className = "mjr-video-timegroup", ve.appendChild(_e), o && ve.appendChild(D); + let D = document.createElement("div"); + D.className = "mjr-video-timegroup", D.appendChild(se), o && D.appendChild(E); let O = document.createElement("span"); - O.className = "mjr-video-frame", O.textContent = "F: 0", O.title = e("video.currentFrame", "Current frame number"); - let ye = de("mjr-video-btn--play", e("btn.play", "Play"), e("video.playPauseSpace", "Play/Pause (Space)")), be = de("mjr-video-btn--step", "<", e("video.stepBack", "Step back")), xe = de("mjr-video-btn--step", ">", e("video.stepForward", "Step forward")), Se = de("mjr-video-btn--jump mjr-video-btn--in", "|<", e("video.goToIn", "Go to In")), Ce = de("mjr-video-btn--jump mjr-video-btn--out", ">|", e("video.goToOut", "Go to Out")), we = de("mjr-video-btn--mark mjr-video-btn--in", "I", e("video.setInFromCurrent", "Set In from current frame")), Te = de("mjr-video-btn--mark mjr-video-btn--out", "O", e("video.setOutFromCurrent", "Set Out from current frame")), Ee = fe("mjr-video-btn--toggle", "pi-refresh", e("video.loopPlaybackInRange", "Loop playback in range"), e("video.loop", "Loop")), De = Ee.btn, k = pe("mjr-video-num--in", { + O.className = "mjr-video-frame", O.textContent = "F: 0", O.title = a("video.currentFrame", "Current frame number"); + let ye = pe("mjr-video-btn--play", a("btn.play", "Play"), a("video.playPauseSpace", "Play/Pause (Space)")), be = pe("mjr-video-btn--step", "<", a("video.stepBack", "Step back")), xe = pe("mjr-video-btn--step", ">", a("video.stepForward", "Step forward")), Se = pe("mjr-video-btn--jump mjr-video-btn--in", "|<", a("video.goToIn", "Go to In")), Ce = pe("mjr-video-btn--jump mjr-video-btn--out", ">|", a("video.goToOut", "Go to Out")), we = pe("mjr-video-btn--mark mjr-video-btn--in", "I", a("video.setInFromCurrent", "Set In from current frame")), Te = pe("mjr-video-btn--mark mjr-video-btn--out", "O", a("video.setOutFromCurrent", "Set Out from current frame")), Ee = me("mjr-video-btn--toggle", "pi-refresh", a("video.loopPlaybackInRange", "Loop playback in range"), a("video.loop", "Loop")), De = Ee.btn, Oe = he("mjr-video-num--in", { min: 0, step: 1, value: 0, - title: e("video.inFrame", "In frame"), - ariaLabel: e("video.inFrame", "In frame"), + title: a("video.inFrame", "In frame"), + ariaLabel: a("video.inFrame", "In frame"), widthPx: 72 - }), Oe = pe("mjr-video-num--out", { + }), ke = he("mjr-video-num--out", { min: 0, step: 1, value: 0, - title: e("video.outFrame", "Out frame"), - ariaLabel: e("video.outFrame", "Out frame"), + title: a("video.outFrame", "Out frame"), + ariaLabel: a("video.outFrame", "Out frame"), widthPx: 72 - }), A = pe("mjr-video-num--step", { + }), k = he("mjr-video-num--step", { min: 1, step: 1, value: 1, - title: e("video.frameIncrement", "Frame increment"), - ariaLabel: e("video.frameIncrement", "Frame increment"), + title: a("video.frameIncrement", "Frame increment"), + ariaLabel: a("video.frameIncrement", "Frame increment"), widthPx: 56 - }), j = pe("mjr-video-num--fps", { + }), A = he("mjr-video-num--fps", { min: 1, step: .001, - value: l(d || 30), - title: e("video.fpsStepping", "FPS (used for frame stepping)"), - ariaLabel: e("video.fps", "FPS"), + value: m(s || 30), + title: a("video.fpsStepping", "FPS (used for frame stepping)"), + ariaLabel: a("video.fps", "FPS"), widthPx: 56 - }), M = document.createElement("select"); - M.className = "mjr-video-num mjr-video-num--speed", M.title = e("video.playbackSpeed", "Playback speed"), M.setAttribute("aria-label", e("video.playbackSpeed", "Playback speed")), M.style.width = "74px"; + }), j = document.createElement("select"); + j.className = "mjr-video-num mjr-video-num--speed", j.title = a("video.playbackSpeed", "Playback speed"), j.setAttribute("aria-label", a("video.playbackSpeed", "Playback speed")), j.style.width = "74px"; for (let e of [ .25, .5, @@ -571,40 +565,40 @@ function _e(t, n = {}) { 2 ]) { let t = document.createElement("option"); - t.value = String(e), t.textContent = `${e}x`, M.appendChild(t); + t.value = String(e), t.textContent = `${e}x`, j.appendChild(t); } - let ke = fe("mjr-video-btn--mute", "pi-volume-up", e("video.mute", "Mute"), e("video.mute", "Mute")), N = ke.btn, P = document.createElement("div"); - P.className = "mjr-video-volume-wrap", P.style.cssText = "display:none; align-items:center; position:relative;"; - let F = null; - F = document.createElement("input"), F.className = "mjr-video-range mjr-video-range--volume", F.type = "range", F.min = "0", F.max = "1", F.step = "0.02", F.value = String(p(Number(t.volume) || 0)), F.setAttribute("aria-label", e("video.volume", "Volume")), F.title = e("video.volume", "Volume"); + let Ae = me("mjr-video-btn--mute", "pi-volume-up", a("video.mute", "Mute"), a("video.mute", "Mute")), M = Ae.btn, N = document.createElement("div"); + N.className = "mjr-video-volume-wrap", N.style.cssText = "display:none; align-items:center; position:relative;"; + let P = null; + P = document.createElement("input"), P.className = "mjr-video-range mjr-video-range--volume", P.type = "range", P.min = "0", P.max = "1", P.step = "0.02", P.value = String(g(Number(e.volume) || 0)), P.setAttribute("aria-label", a("video.volume", "Volume")), P.title = a("video.volume", "Volume"); try { - F.style.width = "120px"; + P.style.width = "120px"; } catch (e) { console.debug?.(e); } - P.appendChild(F); + N.appendChild(P); + let F = document.createElement("div"); + F.className = "mjr-video-group mjr-video-group--in"; + let je = document.createElement("span"); + je.textContent = "In", je.title = a("video.resetInToStart", "Reset In to start"), je.style.cssText = "cursor:pointer; user-select:none;", o && (F.appendChild(je), F.appendChild(Oe)); let I = document.createElement("div"); - I.className = "mjr-video-group mjr-video-group--in"; - let Ae = document.createElement("span"); - Ae.textContent = "In", Ae.title = e("video.resetInToStart", "Reset In to start"), Ae.style.cssText = "cursor:pointer; user-select:none;", o && (I.appendChild(Ae), I.appendChild(k)); - let je = document.createElement("div"); - je.className = "mjr-video-group mjr-video-group--out"; + I.className = "mjr-video-group mjr-video-group--out"; let Me = document.createElement("span"); - Me.textContent = "Out", Me.title = e("video.resetOutToEnd", "Reset Out to end"), Me.style.cssText = "cursor:pointer; user-select:none;", o && (je.appendChild(Me), je.appendChild(Oe)); + Me.textContent = "Out", Me.title = a("video.resetOutToEnd", "Reset Out to end"), Me.style.cssText = "cursor:pointer; user-select:none;", o && (I.appendChild(Me), I.appendChild(ke)); let L = document.createElement("div"); - L.className = "mjr-video-group mjr-video-group--adjust-left", o && (L.appendChild(we), L.appendChild(document.createTextNode(e("video.step", "Step"))), L.appendChild(A), L.appendChild(document.createTextNode(e("video.fps", "FPS"))), L.appendChild(j), L.appendChild(O)); + L.className = "mjr-video-group mjr-video-group--adjust-left", o && (L.appendChild(we), L.appendChild(document.createTextNode(a("video.step", "Step"))), L.appendChild(k), L.appendChild(document.createTextNode(a("video.fps", "FPS"))), L.appendChild(A), L.appendChild(O)); let Ne = document.createElement("div"); - Ne.className = "mjr-video-group mjr-video-group--adjust-right", o && (Ne.appendChild(ve), Ne.appendChild(De)); + Ne.className = "mjr-video-group mjr-video-group--adjust-right", o && (Ne.appendChild(D), Ne.appendChild(De)); let Pe = document.createElement("div"); - Pe.className = "mjr-video-group mjr-video-group--speed", Pe.appendChild(document.createTextNode(e("video.speed", "Speed"))), Pe.appendChild(M); + Pe.className = "mjr-video-group mjr-video-group--speed", Pe.appendChild(document.createTextNode(a("video.speed", "Speed"))), Pe.appendChild(j); let Fe = document.createElement("div"); Fe.className = "mjr-video-bottom mjr-video-bottom--left"; let R = document.createElement("div"); R.className = "mjr-video-transport"; let z = document.createElement("div"); - if (z.className = "mjr-video-bottom mjr-video-bottom--right", i || (R.appendChild(Se), R.appendChild(be)), R.appendChild(ye), i || (R.appendChild(xe), R.appendChild(Ce)), o && Fe.appendChild(L), o && z.appendChild(Ne), z.appendChild(Pe), z.appendChild(N), o && z.appendChild(Te), F && z.appendChild(P), a) { + if (z.className = "mjr-video-bottom mjr-video-bottom--right", r || (R.appendChild(Se), R.appendChild(be)), R.appendChild(ye), r || (R.appendChild(xe), R.appendChild(Ce)), o && Fe.appendChild(L), o && z.appendChild(Ne), z.appendChild(Pe), z.appendChild(M), o && z.appendChild(Te), P && z.appendChild(N), i) { let e = document.createElement("div"); - e.className = "mjr-video-bar-timeline", o && e.appendChild(I), e.appendChild(v), o && e.appendChild(je); + e.className = "mjr-video-bar-timeline", o && e.appendChild(F), e.appendChild(v), o && e.appendChild(I); let t = document.createElement("div"); t.className = "mjr-video-bar-actions"; let n = document.createElement("div"); @@ -612,8 +606,8 @@ function _e(t, n = {}) { let r = document.createElement("div"); r.className = "mjr-video-bar-center", r.appendChild(R); let i = document.createElement("div"); - i.className = "mjr-video-bar-side mjr-video-bar-side--right", o && i.appendChild(Ne), i.appendChild(Pe), i.appendChild(N), o && i.appendChild(Te), F && i.appendChild(P), t.appendChild(n), t.appendChild(r), t.appendChild(i), h.replaceChildren(e, t); - } else o && g.appendChild(O), o && g.appendChild(I), g.appendChild(v), o && g.appendChild(je), g.appendChild(ve), _.appendChild(Fe), _.appendChild(R), _.appendChild(z); + i.className = "mjr-video-bar-side mjr-video-bar-side--right", o && i.appendChild(Ne), i.appendChild(Pe), i.appendChild(M), o && i.appendChild(Te), P && i.appendChild(N), t.appendChild(n), t.appendChild(r), t.appendChild(i), l.replaceChildren(e, t); + } else o && u.appendChild(O), o && u.appendChild(F), u.appendChild(v), o && u.appendChild(I), u.appendChild(D), p.appendChild(Fe), p.appendChild(R), p.appendChild(z); let B = (e) => { try { e.stopPropagation?.(); @@ -634,10 +628,10 @@ function _e(t, n = {}) { return { signal: { aborted: !1, - addEventListener: c, - removeEventListener: c + addEventListener: h, + removeEventListener: h }, - abort: c + abort: h }; } })(); @@ -650,21 +644,21 @@ function _e(t, n = {}) { }); let Le = () => { try { - let e = Number(f?.clientWidth) || Number(h?.clientWidth) || 0, t = "regular"; - e > 0 && e < 560 ? t = "stacked" : e > 0 && e < 860 && (t = "compact"), h.dataset.mjrLayout = t; + let e = Number(c?.clientWidth) || Number(l?.clientWidth) || 0, t = "regular"; + e > 0 && e < 560 ? t = "stacked" : e > 0 && e < 860 && (t = "compact"), l.dataset.mjrLayout = t; } catch (e) { console.debug?.(e); } }; Le(); try { - if (typeof ResizeObserver == "function" && f) { + if (typeof ResizeObserver == "function" && c) { let e = typeof requestAnimationFrame == "function" ? requestAnimationFrame : null, t = typeof cancelAnimationFrame == "function" ? cancelAnimationFrame : null, n = 0, r = new ResizeObserver(e ? () => { n ||= e(() => { n = 0, Le(); }); } : () => Le()); - r.observe(f), H.push(() => { + r.observe(c), H.push(() => { try { n && t && t(n), r.disconnect(); } catch (e) { @@ -675,18 +669,18 @@ function _e(t, n = {}) { } catch (e) { console.debug?.(e); } - H.push(u(h, "pointerdown", B)), H.push(u(h, "dblclick", V, { capture: !0 })), H.push(u(h, "wheel", V, { + H.push(f(l, "pointerdown", B)), H.push(f(l, "dblclick", V, { capture: !0 })), H.push(f(l, "wheel", V, { capture: !0, passive: !1 - })), H.push(u(window, "dblclick", (e) => { + })), H.push(f(window, "dblclick", (e) => { try { - h.contains?.(e?.target) && V(e); + l.contains?.(e?.target) && V(e); } catch (e) { console.debug?.(e); } - }, { capture: !0 })), H.push(u(window, "wheel", (e) => { + }, { capture: !0 })), H.push(f(window, "wheel", (e) => { try { - h.contains?.(e?.target) && V(e); + l.contains?.(e?.target) && V(e); } catch (e) { console.debug?.(e); } @@ -700,7 +694,7 @@ function _e(t, n = {}) { loop: o, pingpong: !1, once: !1, - playbackRate: Math.max(.25, Math.min(2, Number(n?.initialPlaybackRate) || 1)), + playbackRate: Math.max(.25, Math.min(2, Number(t?.initialPlaybackRate) || 1)), _seeking: !1, _ppReverse: !1, _ppRafId: null, @@ -709,7 +703,7 @@ function _e(t, n = {}) { if (!U._userInteracted) { U._userInteracted = !0; try { - t.muted && (t.muted = !1, Qe?.()); + e.muted && (e.muted = !1, Qe?.()); } catch (e) { console.debug?.(e); } @@ -722,7 +716,7 @@ function _e(t, n = {}) { } catch (e) { console.debug?.(e); } - ze = le(Ie.signal, ce, () => { + ze = de(Ie.signal, ue, () => { try { O.classList.remove("is-step"); } catch (e) { @@ -753,19 +747,19 @@ function _e(t, n = {}) { } catch (e) { console.debug?.(e); } - }, He = (e) => { + }, He = (t) => { try { - let n = Number(e); + let n = Number(t); if (!Number.isFinite(n) || n <= 0) return U.playbackRate; let r = Math.max(.25, Math.min(2, Math.round(n * 100) / 100)); U.playbackRate = r; try { - t.playbackRate = r; + e.playbackRate = r; } catch (e) { console.debug?.(e); } try { - M.matches?.(":focus") || (M.value = String(r)); + j.matches?.(":focus") || (j.value = String(r)); } catch (e) { console.debug?.(e); } @@ -777,7 +771,7 @@ function _e(t, n = {}) { try { Ve(De, !!(U.loop || U.pingpong)); try { - Ee?.icon && (U.pingpong ? (Ee.icon.className = "pi pi-sort-alt", De.title = e("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (Ee.icon.className = "pi pi-refresh", De.title = e("video.loopPlaybackInRange", "Loop playback in range"))); + Ee?.icon && (U.pingpong ? (Ee.icon.className = "pi pi-sort-alt", De.title = a("video.pingpongPlayback", "Ping-pong playback (forward then reverse)")) : (Ee.icon.className = "pi pi-refresh", De.title = a("video.loopPlaybackInRange", "Loop playback in range"))); } catch (e) { console.debug?.(e); } @@ -786,28 +780,28 @@ function _e(t, n = {}) { } }, We = () => { try { - let e = Number(U.frameCount); - if (Number.isFinite(e) && e > 0) return Math.max(1, Math.floor(e)); - let n = Number(t?.duration), r = l(U.fps, 30); + let t = Number(U.frameCount); + if (Number.isFinite(t) && t > 0) return Math.max(1, Math.floor(t)); + let n = Number(e?.duration), r = m(U.fps, 30); return !Number.isFinite(n) || n <= 0 ? 0 : Math.max(0, Math.floor(n * r)); } catch { return 0; } - }, W = (e = null) => { + }, W = (t = null) => { try { - let n = e ?? t?.currentTime, r = Number(n), i = l(U.fps, 30); + let n = t ?? e?.currentTime, r = Number(n), i = m(U.fps, 30); return !Number.isFinite(r) || r < 0 ? 0 : Math.max(0, Math.floor(r * i + 1e-6)); } catch { return 0; } }, Ge = (e) => { - let t = l(U.fps, 30); + let t = m(U.fps, 30); return Math.max(0, Number(e) || 0) / t; }, G = () => { try { let e = We(); if (e <= 0) return; - let t = U.inFrame == null ? 0 : m(U.inFrame, 0, e), n = U.outFrame == null ? e : m(U.outFrame, 0, e); + let t = U.inFrame == null ? 0 : _(U.inFrame, 0, e), n = U.outFrame == null ? e : _(U.outFrame, 0, e); n < t ? (U.inFrame = n, U.outFrame = t) : (U.inFrame = t, U.outFrame = n); } catch (e) { console.debug?.(e); @@ -816,8 +810,8 @@ function _e(t, n = {}) { try { let e = We(); return { - inF: U.inFrame == null ? 0 : m(U.inFrame, 0, e), - outF: U.outFrame == null ? e : m(U.outFrame, 0, e), + inF: U.inFrame == null ? 0 : _(U.inFrame, 0, e), + outF: U.outFrame == null ? e : _(U.outFrame, 0, e), maxF: e }; } catch { @@ -829,28 +823,28 @@ function _e(t, n = {}) { } }, q = () => { try { - ye.textContent = !t?.paused || U._ppReverse ? e("video.pause", "Pause") : e("video.play", "Play"); + ye.textContent = !e?.paused || U._ppReverse ? a("video.pause", "Pause") : a("video.play", "Play"); } catch (e) { console.debug?.(e); } }, Ke = () => { try { - let n = !!t?.muted || (Number(t?.volume) || 0) <= .001; + let t = !!e?.muted || (Number(e?.volume) || 0) <= .001; try { - ke.icon.className = `pi ${n ? "pi-volume-off" : "pi-volume-up"}`; + Ae.icon.className = `pi ${t ? "pi-volume-off" : "pi-volume-up"}`; } catch (e) { console.debug?.(e); } - let r = n ? e("video.unmute", "Unmute") : e("video.mute", "Mute"); - N.title = r, N.setAttribute("aria-label", r); + let n = t ? a("video.unmute", "Unmute") : a("video.mute", "Mute"); + M.title = n, M.setAttribute("aria-label", n); } catch (e) { console.debug?.(e); } - }, J = (e = null) => { + }, J = (t = null) => { try { - let n = Number(t?.duration), r = e ?? t?.currentTime, i = Number(r), a = Number.isFinite(n) && n > 0; - if (_e.textContent = `${ue(i)} / ${a ? ue(n) : "0:00"}`, y.disabled = !a, a) { - let e = p((i || 0) / n), t = Math.round(e * 1e3); + let n = Number(e?.duration), r = t ?? e?.currentTime, i = Number(r), a = Number.isFinite(n) && n > 0; + if (se.textContent = `${fe(i)} / ${a ? fe(n) : "0:00"}`, y.disabled = !a, a) { + let e = g((i || 0) / n), t = Math.round(e * 1e3); !Number.isNaN(t) && !U._seeking && !y.matches?.(":active") && (y.value = String(t)); try { re.style.left = `${e * 100}%`; @@ -870,16 +864,16 @@ function _e(t, n = {}) { O.textContent = `F: ${t} / ${e}`; try { if (Number.isFinite(n) && n > 0) { - let e = p((i || 0) / n); + let e = g((i || 0) / n); ie.style.left = `${e * 100}%`, ie.textContent = String(t), ie.style.display = ""; } else ie.style.display = "none"; } catch (e) { console.debug?.(e); } - k.matches?.(":focus") || (k.value = String(U.inFrame ?? 0)), Oe.matches?.(":focus") || (Oe.value = String(U.outFrame ?? e)); + Oe.matches?.(":focus") || (Oe.value = String(U.inFrame ?? 0)), ke.matches?.(":focus") || (ke.value = String(U.outFrame ?? e)); try { let { inF: e, outF: t, maxF: n } = K(), r = e <= 0 && t >= n, i = Math.max(0, Math.floor(t) - Math.floor(e) + 1); - !r && n > 0 ? (D.textContent = `R: ${i}f`, D.style.display = "") : D.style.display = "none"; + !r && n > 0 ? (E.textContent = `R: ${i}f`, E.style.display = "") : E.style.display = "none"; } catch (e) { console.debug?.(e); } @@ -891,18 +885,18 @@ function _e(t, n = {}) { if (o) try { let { inF: e, outF: t, maxF: n } = K(); if (!Number.isFinite(n) || n <= 0) return; - let r = p(e / n) * 100, i = p(t / n) * 100, a = e <= 0 && t >= n; + let r = g(e / n) * 100, i = g(t / n) * 100, a = e <= 0 && t >= n; try { y.style.background = ""; } catch (e) { console.debug?.(e); } try { - let e = p(r / 100) * 100, t = p(i / 100) * 100, n = Math.min(e, t), o = Math.max(e, t); - if (b && x && S && C) { - x.style.left = "0%", x.style.width = `${n}%`, S.style.left = `${n}%`, S.style.width = `${Math.max(0, o - n)}%`, C.style.left = `${o}%`, C.style.width = `${Math.max(0, 100 - o)}%`; + let e = g(r / 100) * 100, t = g(i / 100) * 100, n = Math.min(e, t), o = Math.max(e, t); + if (x && ee && S && C) { + ee.style.left = "0%", ee.style.width = `${n}%`, S.style.left = `${n}%`, S.style.width = `${Math.max(0, o - n)}%`, C.style.left = `${o}%`, C.style.width = `${Math.max(0, 100 - o)}%`; try { - b.classList.toggle("is-trimmed", !a), b.classList.toggle("is-fullrange", a); + x.classList.toggle("is-trimmed", !a), x.classList.toggle("is-fullrange", a); } catch (e) { console.debug?.(e); } @@ -911,31 +905,31 @@ function _e(t, n = {}) { console.debug?.(e); } try { - T.style.left = `${r}%`, ne.style.left = `${i}%`; + te.style.left = `${r}%`, ne.style.left = `${i}%`; } catch (e) { console.debug?.(e); } try { - ae.style.left = `${r}%`, E.style.left = `${i}%`; + ae.style.left = `${r}%`, oe.style.left = `${i}%`; } catch (e) { console.debug?.(e); } try { - let e = Math.max(1, Math.floor(n / oe)), t = Math.max(e, Math.floor(Number(U.step) || 1)), r = t / n * 100, i = r * 10; + let e = Math.max(1, Math.floor(n / ce)), t = Math.max(e, Math.floor(Number(U.step) || 1)), r = t / n * 100, i = r * 10; if (Number.isFinite(r) && r > .02) { let e = `repeating-linear-gradient(to right, rgba(255,255,255,0.16) 0, rgba(255,255,255,0.16) 1px, transparent 1px, transparent ${r}%)`, t = `repeating-linear-gradient(to right, rgba(255,255,255,0.28) 0, rgba(255,255,255,0.28) 1px, transparent 1px, transparent ${i}%)`; - te.style.backgroundImage = `${t}, ${e}`; - } else te.style.backgroundImage = ""; + w.style.backgroundImage = `${t}, ${e}`; + } else w.style.backgroundImage = ""; (() => { try { let e = `${n}|${t}`; - if (w?.dataset?.mjrLabelKey === e) return; - w.dataset.mjrLabelKey = e; + if (T?.dataset?.mjrLabelKey === e) return; + T.dataset.mjrLabelKey = e; } catch (e) { console.debug?.(e); } try { - w.replaceChildren(); + T.replaceChildren(); } catch (e) { console.debug?.(e); } @@ -948,21 +942,21 @@ function _e(t, n = {}) { let r = (e) => { let t = document.createElement("span"); t.className = "mjr-video-seek-label"; - let r = p(e / n) * 100; + let r = g(e / n) * 100; return t.style.left = `${r}%`, t.textContent = String(Math.floor(e)), t; }; try { - w.appendChild(r(0)); + T.appendChild(r(0)); } catch (e) { console.debug?.(e); } for (let t = e; t < n; t += e) try { - w.appendChild(r(t)); + T.appendChild(r(t)); } catch (e) { console.debug?.(e); } try { - w.appendChild(r(n)); + T.appendChild(r(n)); } catch (e) { console.debug?.(e); } @@ -1004,21 +998,21 @@ function _e(t, n = {}) { H.push(Ye); let Xe = () => { try { - Ye(), U._ppReverse = !0, t.pause?.(), q(); - let e = 1e3 / (l(U.fps, 30) * Math.max(.25, Number(U.playbackRate) || 1)), n = performance.now(), r = (i) => { + Ye(), U._ppReverse = !0, e.pause?.(), q(); + let t = 1e3 / (m(U.fps, 30) * Math.max(.25, Number(U.playbackRate) || 1)), n = performance.now(), r = (i) => { try { if (!U._ppReverse || !U.pingpong) { U._ppReverse = !1, q(); return; } let a = i - n; - if (a >= e) { - n = i - a % e; + if (a >= t) { + n = i - a % t; let { inF: r } = K(), o = W(); if (o <= r) { U._ppReverse = !1, Z(r); - let e = t.play?.(); - e && typeof e.catch == "function" && e.catch(() => {}), q(), J(); + let t = e.play?.(); + t && typeof t.catch == "function" && t.catch(() => {}), q(), J(); return; } Z(o - Math.max(1, Math.floor(Number(U.step) || 1))), J(); @@ -1037,12 +1031,12 @@ function _e(t, n = {}) { let e = We(); U.inFrame = 0, U.outFrame = e > 0 ? e : null, U.step = 1, U.loop = !!o, U.pingpong = !1, U._ppReverse = !1, Ye(), U.once = !1, He(1); try { - A.value = "1"; + k.value = "1"; } catch (e) { console.debug?.(e); } try { - M.matches?.(":focus") || (M.value = "1"); + j.matches?.(":focus") || (j.value = "1"); } catch (e) { console.debug?.(e); } @@ -1052,9 +1046,9 @@ function _e(t, n = {}) { } }, Qe = () => { try { - let e = p(Number(t?.volume) || 0); + let t = g(Number(e?.volume) || 0); try { - F && !F.matches?.(":active") && (F.value = String(e)); + P && !P.matches?.(":active") && (P.value = String(t)); } catch (e) { console.debug?.(e); } @@ -1062,21 +1056,21 @@ function _e(t, n = {}) { } catch (e) { console.debug?.(e); } - }, Z = (e) => { + }, Z = (t) => { try { let { maxF: n } = K(); - t.currentTime = Ge(m(e, 0, n > 0 ? n : Infinity)); + e.currentTime = Ge(_(t, 0, n > 0 ? n : Infinity)); } catch (e) { console.debug?.(e); } J(); - }, $e = (e) => { + }, $e = (t) => { Re(); try { - let n = Math.max(1, Math.floor(Number(U.step) || 1)), { inF: r, outF: i } = K(), a = W() + e * n; - U.loop ? (a < r && (a = i), a > i && (a = r)) : a = m(a, r, i); + let n = Math.max(1, Math.floor(Number(U.step) || 1)), { inF: r, outF: i } = K(), a = W() + t * n; + U.loop ? (a < r && (a = i), a > i && (a = r)) : a = _(a, r, i); try { - t.pause?.(); + e.pause?.(); } catch (e) { console.debug?.(e); } @@ -1099,46 +1093,46 @@ function _e(t, n = {}) { U._ppReverse = !1, Ye(), q(); return; } - if (t.paused) { + if (e.paused) { et(); - let e = t.play?.(); - e && typeof e.catch == "function" && e.catch(() => {}); - } else t.pause?.(); + let t = e.play?.(); + t && typeof t.catch == "function" && t.catch(() => {}); + } else e.pause?.(); } catch (e) { console.debug?.(e); } q(); }; - H.push(u(t, "click", (e) => { + H.push(f(e, "click", (t) => { try { - if (e?.target !== t) return; + if (t?.target !== e) return; } catch (e) { console.debug?.(e); } tt(); - })), H.push(u(ye, "click", (e) => { + })), H.push(f(ye, "click", (e) => { B(e), tt(); - })), H.push(u(be, "click", (e) => { + })), H.push(f(be, "click", (e) => { B(e), $e(-1); - })), H.push(u(xe, "click", (e) => { + })), H.push(f(xe, "click", (e) => { B(e), $e(1); - })), H.push(u(Se, "click", (e) => { + })), H.push(f(Se, "click", (e) => { B(e); let { inF: t } = K(); Z(t), Be(); - })), H.push(u(Ce, "click", (e) => { + })), H.push(f(Ce, "click", (e) => { B(e); let { outF: t } = K(); Z(t), Be(); })); - let nt = (e) => { + let nt = (t) => { try { - let n = Number(t?.duration); + let n = Number(e?.duration); if (!Number.isFinite(n) || n <= 0) return !1; let r = v.getBoundingClientRect?.(), i = Number(r?.width) || 0; if (!(i > 0)) return !1; - let a = p(m((Number(e) || 0) - Number(r.left || 0), 0, i) / i), o = a * n; - return t.currentTime = o, y.value = String(Math.round(a * se)), J(o), !0; + let a = g(_((Number(t) || 0) - Number(r.left || 0), 0, i) / i), o = a * n; + return e.currentTime = o, y.value = String(Math.round(a * le)), J(o), !0; } catch (e) { return console.debug?.(e), !1; } @@ -1165,7 +1159,7 @@ function _e(t, n = {}) { }, it = (e) => { Q.active && (V(e), nt(e.clientX)); }; - if (H.push(() => rt()), H.push(u(v, "pointerdown", (e) => { + if (H.push(() => rt()), H.push(f(v, "pointerdown", (e) => { try { if (e?.button != null && e.button !== 0 || e?.target?.closest?.(".mjr-video-seek-handle, .mjr-video-seek-mark")) return; } catch (e) { @@ -1200,157 +1194,157 @@ function _e(t, n = {}) { } catch (e) { console.debug?.(e); } - }, { passive: !1 })), H.push(u(y, "pointerdown", () => { + }, { passive: !1 })), H.push(f(y, "pointerdown", () => { U._seeking = !0; - })), H.push(u(y, "pointerup", () => { + })), H.push(f(y, "pointerup", () => { Q.active || (U._seeking = !1); - })), H.push(u(y, "pointercancel", () => { + })), H.push(f(y, "pointercancel", () => { Q.active || (U._seeking = !1); - })), H.push(u(y, "input", (e) => { - B(e), Re(); + })), H.push(f(y, "input", (t) => { + B(t), Re(); try { - let e = Number(t?.duration); - if (!Number.isFinite(e) || e <= 0) return; + let t = Number(e?.duration); + if (!Number.isFinite(t) || t <= 0) return; let n = Number(y.value); - t.currentTime = p((Number.isFinite(n) ? n : 0) / 1e3) * e; + e.currentTime = g((Number.isFinite(n) ? n : 0) / 1e3) * t; } catch (e) { console.debug?.(e); } J(); })), o) { - H.push(u(we, "click", (e) => { + H.push(f(we, "click", (e) => { B(e), U.inFrame = W(), G(), J(), Y(), X({ prefer: "in" }); - })), H.push(u(Te, "click", (e) => { + })), H.push(f(Te, "click", (e) => { B(e), U.outFrame = W(), G(), J(), Y(), X({ prefer: "out" }); - })), H.push(u(k, "change", (e) => { + })), H.push(f(Oe, "change", (e) => { B(e); try { - let e = Number(k.value); + let e = Number(Oe.value); U.inFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, G(); } catch (e) { console.debug?.(e); } J(), Y(), X({ prefer: "in" }); - })), H.push(u(Oe, "change", (e) => { + })), H.push(f(ke, "change", (e) => { B(e); try { - let e = Number(Oe.value); + let e = Number(ke.value); U.outFrame = Number.isFinite(e) ? Math.max(0, Math.floor(e)) : null, G(); } catch (e) { console.debug?.(e); } J(), Y(), X({ prefer: "out" }); - })), H.push(u(A, "change", (e) => { + })), H.push(f(k, "change", (e) => { B(e); try { - U.step = Math.max(1, Math.floor(Number(A.value) || 1)), A.value = String(U.step); + U.step = Math.max(1, Math.floor(Number(k.value) || 1)), k.value = String(U.step); } catch (e) { console.debug?.(e); } - })), H.push(u(j, "change", (e) => { + })), H.push(f(A, "change", (e) => { B(e); try { - U.fps = l(j.value, 30), j.value = String(U.fps), G(); + U.fps = m(A.value, 30), A.value = String(U.fps), G(); } catch (e) { console.debug?.(e); } J(), Y(); - })), H.push(u(De, "click", (e) => { + })), H.push(f(De, "click", (e) => { B(e), !U.loop && !U.pingpong ? (U.loop = !0, U.pingpong = !1) : U.loop && !U.pingpong ? (U.loop = !1, U.pingpong = !0) : (U.loop = !1, U.pingpong = !1), (U.loop || U.pingpong) && (U.once = !1), U.pingpong || (U._ppReverse = !1, Ye()), Ue(); - })), H.push(u(Ae, "click", (e) => { + })), H.push(f(je, "click", (e) => { B(e), qe(); - })), H.push(u(Me, "click", (e) => { + })), H.push(f(Me, "click", (e) => { B(e), Je(); - })), H.push(u(D, "click", (e) => { + })), H.push(f(E, "click", (e) => { B(e), Ze(); })); try { - D.title = e("video.resetPlayerControls", "Reset player controls"), D.style.cursor = "pointer", D.style.userSelect = "none"; + E.title = a("video.resetPlayerControls", "Reset player controls"), E.style.cursor = "pointer", E.style.userSelect = "none"; } catch (e) { console.debug?.(e); } } - H.push(u(N, "click", (e) => { - B(e); + H.push(f(M, "click", (t) => { + B(t); try { - t.muted = !t.muted, P && (P.style.display = t.muted ? "none" : "inline-flex"); + e.muted = !e.muted, N && (N.style.display = e.muted ? "none" : "inline-flex"); } catch (e) { console.debug?.(e); } Qe(); - })), H.push(u(N, "contextmenu", (e) => { + })), H.push(f(M, "contextmenu", (e) => { V(e); try { - if (!P) return; - let e = P.style.display !== "none"; - P.style.display = e ? "none" : "inline-flex"; + if (!N) return; + let e = N.style.display !== "none"; + N.style.display = e ? "none" : "inline-flex"; } catch (e) { console.debug?.(e); } Qe(); - })), H.push(u(window, "pointerdown", (e) => { + })), H.push(f(window, "pointerdown", (e) => { try { - if (!P || P.style.display === "none" || N.contains?.(e?.target) || P.contains?.(e?.target)) return; - P.style.display = "none"; + if (!N || N.style.display === "none" || M.contains?.(e?.target) || N.contains?.(e?.target)) return; + N.style.display = "none"; } catch (e) { console.debug?.(e); } - }, { capture: !0 })), F && H.push(u(F, "input", (e) => { - B(e); + }, { capture: !0 })), P && H.push(f(P, "input", (t) => { + B(t); try { - let e = p(Number(F.value) || 0); - t.volume = e, e > .001 && (t.muted = !1); + let t = g(Number(P.value) || 0); + e.volume = t, t > .001 && (e.muted = !1); } catch (e) { console.debug?.(e); } Qe(); - })), H.push(u(M, "change", (e) => { + })), H.push(f(j, "change", (e) => { B(e); try { - He(Number(M.value) || 1); + He(Number(j.value) || 1); } catch (e) { console.debug?.(e); } - })), H.push(u(t, "ratechange", () => { + })), H.push(f(e, "ratechange", () => { try { - He(Number(t.playbackRate) || U.playbackRate || 1); + He(Number(e.playbackRate) || U.playbackRate || 1); } catch (e) { console.debug?.(e); } })); let at = () => { if (o) try { - if (U._seeking || t?.paused) return; - let { inF: e, outF: n, maxF: r } = K(); - if (r <= 0 || e <= 0 && n >= r && !U.loop && !U.pingpong && !U.once || U._ppReverse) return; + if (U._seeking || e?.paused) return; + let { inF: t, outF: n, maxF: r } = K(); + if (r <= 0 || t <= 0 && n >= r && !U.loop && !U.pingpong && !U.once || U._ppReverse) return; let i = W(); if (i >= n - Math.max(1, Math.floor(Number(U.step) || 1))) if (U.pingpong) { Xe(); return; } else if (U.loop) { - Z(e); + Z(t); try { - let e = t.play?.(); - e && typeof e.catch == "function" && e.catch(() => {}); + let t = e.play?.(); + t && typeof t.catch == "function" && t.catch(() => {}); } catch (e) { console.debug?.(e); } } else if (U.once) { try { - t.pause?.(); + e.pause?.(); } catch (e) { console.debug?.(e); } Z(n); } else { try { - t.pause?.(); + e.pause?.(); } catch (e) { console.debug?.(e); } Z(n); } - else i < e && Z(e); + else i < t && Z(t); } catch (e) { console.debug?.(e); } @@ -1359,7 +1353,7 @@ function _e(t, n = {}) { rvfcId: null }, ot = () => { try { - $.rvfcId != null && typeof t?.cancelVideoFrameCallback == "function" && t.cancelVideoFrameCallback($.rvfcId); + $.rvfcId != null && typeof e?.cancelVideoFrameCallback == "function" && e.cancelVideoFrameCallback($.rvfcId); } catch (e) { console.debug?.(e); } @@ -1370,66 +1364,66 @@ function _e(t, n = {}) { console.debug?.(e); } $.rafId = null; - }, st = (e = 0, n = null) => { + }, st = (t = 0, n = null) => { $.rafId = null, $.rvfcId = null; try { - s(J, n?.mediaTime), s(at); + d(J, n?.mediaTime), d(at); } catch (e) { console.debug?.(e); } - if (!(!(U._ppReverse || !t?.paused) || Ie.signal?.aborted)) { + if (!(!(U._ppReverse || !e?.paused) || Ie.signal?.aborted)) { try { - if (typeof t?.requestVideoFrameCallback == "function" && !U._ppReverse) { - $.rvfcId = t.requestVideoFrameCallback(st); + if (typeof e?.requestVideoFrameCallback == "function" && !U._ppReverse) { + $.rvfcId = e.requestVideoFrameCallback(st); return; } } catch (e) { console.debug?.(e); } try { - typeof requestAnimationFrame == "function" && ($.rafId = requestAnimationFrame((e) => { - st(e, { mediaTime: Number(t?.currentTime) || 0 }); + typeof requestAnimationFrame == "function" && ($.rafId = requestAnimationFrame((t) => { + st(t, { mediaTime: Number(e?.currentTime) || 0 }); })); } catch (e) { console.debug?.(e); } } }, ct = () => { - ot(), !(!(U._ppReverse || !t?.paused) || Ie.signal?.aborted) && st(0, { mediaTime: Number(t?.currentTime) || 0 }); + ot(), !(!(U._ppReverse || !e?.paused) || Ie.signal?.aborted) && st(0, { mediaTime: Number(e?.currentTime) || 0 }); }; - H.push(ot), H.push(u(t, "play", () => { - s(q), ct(); + H.push(ot), H.push(f(e, "play", () => { + d(q), ct(); })); - for (let e of ["pause", "ended"]) H.push(u(t, e, () => { - ot(), s(q), s(J); + for (let t of ["pause", "ended"]) H.push(f(e, t, () => { + ot(), d(q), d(J); })); - for (let e of [ + for (let t of [ "timeupdate", "loadedmetadata", "durationchange", "seeked" - ]) H.push(u(t, e, () => s(J))); - H.push(u(t, "timeupdate", at)), H.push(u(t, "ended", () => { + ]) H.push(f(e, t, () => d(J))); + H.push(f(e, "timeupdate", at)), H.push(f(e, "ended", () => { if (o) try { - let { inF: e, outF: n, maxF: r } = K(), i = e <= 0 && n >= r; + let { inF: t, outF: n, maxF: r } = K(), i = t <= 0 && n >= r; if (U.pingpong && !U._ppReverse) { Xe(); return; } if (!U.loop && !i) return; - Z(e); + Z(t); try { - let e = t.play?.(); - e && typeof e.catch == "function" && e.catch(() => {}); + let t = e.play?.(); + t && typeof t.catch == "function" && t.catch(() => {}); } catch (e) { console.debug?.(e); } } catch (e) { console.debug?.(e); } - }, { passive: !0 })), o && H.push(u(t, "mjr:frameStep", () => { - s(Be); - })), o && (H.push(u(t, "loadedmetadata", () => { + }, { passive: !0 })), o && H.push(f(e, "mjr:frameStep", () => { + d(Be); + })), o && (H.push(f(e, "loadedmetadata", () => { try { let e = We(); e > 0 && U.inFrame == null && U.outFrame == null && (U.inFrame = 0, U.outFrame = e, G()); @@ -1437,16 +1431,16 @@ function _e(t, n = {}) { console.debug?.(e); } Y(); - })), H.push(u(t, "durationchange", () => s(Y)))); - for (let e of ["volumechange"]) H.push(u(t, e, () => s(Qe))); + })), H.push(f(e, "durationchange", () => d(Y)))); + for (let t of ["volumechange"]) H.push(f(e, t, () => d(Qe))); try { - U.fps = l(j.value, 30), U.step = Math.max(1, Math.floor(Number(A.value) || 1)), G(), Ue(), He(U.playbackRate); + U.fps = m(A.value, 30), U.step = Math.max(1, Math.floor(Number(k.value) || 1)), G(), Ue(), He(U.playbackRate); } catch (e) { console.debug?.(e); } - s(q), s(J), s(Y), s(Qe); + d(q), d(J), d(Y), d(Qe); try { - (!t?.paused || U._ppReverse) && ct(); + (!e?.paused || U._ppReverse) && ct(); } catch (e) { console.debug?.(e); } @@ -1460,9 +1454,9 @@ function _e(t, n = {}) { try { let t = Number(e?.fps); if (Number.isFinite(t) && t > 0) { - U.fps = l(t, U.fps || 30); + U.fps = m(t, U.fps || 30); try { - j?.matches?.(":focus") || (j.value = String(U.fps)); + A?.matches?.(":focus") || (A.value = String(U.fps)); } catch (e) { console.debug?.(e); } @@ -1485,10 +1479,10 @@ function _e(t, n = {}) { }; try { if (o) { - let e = Number(n?.initialFps), t = Number(n?.initialFrameCount); - (Number.isFinite(e) || Number.isFinite(t)) && lt({ + let e = Number(t?.initialFps), n = Number(t?.initialFrameCount); + (Number.isFinite(e) || Number.isFinite(n)) && lt({ fps: e, - frameCount: t + frameCount: n }); } } catch (e) { @@ -1503,8 +1497,8 @@ function _e(t, n = {}) { captureEl: null }, t = (e) => { try { - let t = v.getBoundingClientRect(), n = m((Number(e) || 0) - t.left, 0, t.width || 1), r = t.width > 0 ? n / t.width : 0, { maxF: i } = K(); - return m(Math.round(r * i), 0, i); + let t = v.getBoundingClientRect(), n = _((Number(e) || 0) - t.left, 0, t.width || 1), r = t.width > 0 ? n / t.width : 0, { maxF: i } = K(); + return _(Math.round(r * i), 0, i); } catch { return 0; } @@ -1583,10 +1577,10 @@ function _e(t, n = {}) { e.ac = null; } }; - H.push(u(ae, "pointerdown", (e) => n(e, "in"), { passive: !1 })), H.push(u(E, "pointerdown", (e) => n(e, "out"), { passive: !1 })), H.push(u(T, "pointerdown", (e) => n(e, "in"), { passive: !1 })), H.push(u(ne, "pointerdown", (e) => n(e, "out"), { passive: !1 })), H.push(u(v, "pointermove", r, { passive: !1 })), H.push(u(v, "pointerup", i, { passive: !1 })), H.push(u(v, "pointercancel", i, { passive: !1 })); + H.push(f(ae, "pointerdown", (e) => n(e, "in"), { passive: !1 })), H.push(f(oe, "pointerdown", (e) => n(e, "out"), { passive: !1 })), H.push(f(te, "pointerdown", (e) => n(e, "in"), { passive: !1 })), H.push(f(ne, "pointerdown", (e) => n(e, "out"), { passive: !1 })), H.push(f(v, "pointermove", r, { passive: !1 })), H.push(f(v, "pointerup", i, { passive: !1 })), H.push(f(v, "pointercancel", i, { passive: !1 })); } - return s(() => f.appendChild(h)), { - controlsEl: h, + return d(() => c.appendChild(l)), { + controlsEl: l, setMediaInfo: lt, setPlaybackRate: (e) => { try { @@ -1659,24 +1653,24 @@ function _e(t, n = {}) { } }, destroy: () => { - for (let e of H) s(e); - s(() => h.remove()); + for (let e of H) d(e); + d(() => l.remove()); } }; } catch { return { controlsEl: null, - destroy: c + destroy: h }; } } //#endregion //#region ui/features/viewer/mediaPlayer.ts -function D(e) { +function O(e) { let t = String(e || "").toLowerCase(); return t === "video" || t === "audio"; } -function ve({ mode: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i } = {}) { +function ye({ mode: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i } = {}) { try { let a = n; return e === t?.AB_COMPARE ? a = r : e === t?.SIDE_BY_SIDE && (a = i), a ? Array.from(a.querySelectorAll?.(".mjr-viewer-video-src, .mjr-viewer-audio-src") || []) : []; @@ -1684,7 +1678,7 @@ function ve({ mode: e, VIEWER_MODES: t, singleView: n, abView: r, sideView: i } return []; } } -function O(e) { +function be(e) { try { let t = Array.isArray(e) ? e : []; return t.find((e) => String(e?.dataset?.mjrCompareRole || "") === "A") || t[0] || null; @@ -1692,11 +1686,11 @@ function O(e) { return null; } } -function ye(e, t = {}) { +function xe(e, t = {}) { try { if (!e) return null; let n = String(t?.mediaKind || "").toLowerCase(); - return _e(e, { + return D(e, { ...t, mediaKind: n }); @@ -1706,7 +1700,7 @@ function ye(e, t = {}) { } //#endregion //#region ui/utils/tooltipShortcuts.ts -function be(e, t) { +function Se(e, t) { let n = String(e || "").trim(), r = String(t || "").trim(); if (!r) return n; if (!n) return r; @@ -1716,25 +1710,25 @@ function be(e, t) { } else if (n.toLowerCase().includes(r.toLowerCase())) return n; return `${n} (${r})`; } -function xe(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) { +function Ce(e, t, n, { setAriaLabel: r = !0, ariaLabel: i = null } = {}) { if (!e) return ""; - let a = be(t, n); + let a = Se(t, n); if (e.title = a, r) { let r = i ?? t; - e.setAttribute("aria-label", be(r, n)); + e.setAttribute("aria-label", Se(r, n)); } return a; } //#endregion //#region ui/features/viewer/videoSync.ts -var Se = () => { +var we = () => { try { - return !!a?.DEBUG_VIEWER; + return !!o?.DEBUG_VIEWER; } catch { return !1; } }; -function Ce(e, t, { threshold: n = .15 } = {}) { +function Te(e, t, { threshold: n = .15 } = {}) { let r = new AbortController(); try { if (!e) return r; @@ -1864,7 +1858,7 @@ function Ce(e, t, { threshold: n = .15 } = {}) { console.debug?.(e); } } catch (e) { - if (Se()) try { + if (we()) try { console.warn("[Viewer] follower video sync setup failed", e); } catch (e) { console.debug?.(e); @@ -1874,7 +1868,7 @@ function Ce(e, t, { threshold: n = .15 } = {}) { } //#endregion //#region ui/utils/dom.ts -function we(e, t) { +function Ee(e, t) { if (!t) return null; try { if (!e) return null; @@ -1886,7 +1880,7 @@ function we(e, t) { } return null; } -function Te(e) { +function De(e) { let t = String(e ?? ""); try { if (typeof CSS?.escape == "function") return CSS.escape(t); @@ -1895,7 +1889,7 @@ function Te(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -async function Ee(e) { +async function Oe(e) { try { return navigator?.clipboard?.writeText ? (await navigator.clipboard.writeText(String(e ?? "")), !0) : !1; } catch { @@ -1904,44 +1898,42 @@ async function Ee(e) { } //#endregion //#region ui/features/viewer/workflowSidebar/widgetAdapters.ts -function De(e, t, n = null) { +function ke(e, t, n = null) { switch (String(e?.type || "").toLowerCase()) { case "number": case "int": - case "float": return A(e, t, n); - case "combo": return j(e, t, n); + case "float": return j(e, t, n); + case "combo": return Ae(e, t, n); case "text": case "string": case "customtext": return M(e, t, n); case "toggle": - case "boolean": return ke(e, t, n); - default: return N(e); + case "boolean": return N(e, t, n); + default: return P(e); } } -function k(e, t, n = null) { +function k(e, t, r = null) { if (!e) return !1; - let i = String(e.type || "").toLowerCase(); - if (i === "number" || i === "int" || i === "float") { + let a = String(e.type || "").toLowerCase(); + if (a === "number" || a === "int" || a === "float") { let n = Number(t); if (Number.isNaN(n)) return !1; - let r = e.options ?? {}, a = r.min ?? -Infinity, o = r.max ?? Infinity, s = Math.min(o, Math.max(a, n)); - (i === "int" || r.precision === 0 || r.round === 1) && (s = Math.round(s)), e.value = s; - } else i === "toggle" || i === "boolean" ? e.value = !!t : e.value = t; + let r = e.options ?? {}, i = r.min ?? -Infinity, o = r.max ?? Infinity, s = Math.min(o, Math.max(i, n)); + (a === "int" || r.precision === 0 || r.round === 1) && (s = Math.round(s)), e.value = s; + } else a === "toggle" || a === "boolean" ? e.value = !!t : e.value = t; try { - let t = r(), a = t?.canvas ?? null, o = n ?? e?.parent ?? null, s = e.value; - e.callback?.(e.value, a, o, null, e), (i === "number" || i === "int" || i === "float") && (e.value = s), Oe(e), a?.setDirty?.(!0, !0), a?.draw?.(!0, !0); - let c = o?.graph ?? null; - c && c !== t?.graph && (c.setDirtyCanvas?.(!0, !0), c.change?.()), t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(); + let t = n(), o = r ?? e?.parent ?? null, s = e.value; + e.callback?.(e.value, t, o, null, e), (a === "number" || a === "int" || a === "float") && (e.value = s), A(e), i(o); } catch (e) { console.debug?.("[MFV] writeWidgetValue", e); } return !0; } -function Oe(e) { +function A(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 A(e, t, n = null) { +function j(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; @@ -1957,7 +1949,7 @@ function A(e, t, n = null) { k(e, r.value, n) && (r.value = String(e.value), t?.(e.value)); }), r; } -function j(e, t, n = null) { +function Ae(e, t, n = null) { let r = document.createElement("select"); r.className = "mjr-ws-input"; let i = e.options?.values ?? []; @@ -1989,7 +1981,7 @@ function M(e, t, n = null) { k(e, i.value, n), t?.(e.value), a(); }), r.appendChild(i), r._mjrAutoFit = a, i._mjrAutoFit = a, requestAnimationFrame(a), r; } -function ke(e, t, n = null) { +function N(e, t, n = null) { let r = document.createElement("label"); r.className = "mjr-ws-toggle-label"; let i = document.createElement("input"); @@ -1997,13 +1989,13 @@ function ke(e, t, n = null) { k(e, i.checked, n) && t?.(e.value); }), r.appendChild(i), r; } -function N(e) { +function P(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; } //#endregion //#region ui/app/settings/MajoorSettingsDialog.ts -var P = "mjr-settings-dialog", F = "mjr-settings-dialog-style", I = null, Ae = { +var F = "mjr-settings-dialog", je = "mjr-settings-dialog-style", I = null, Me = { Cards: { icon: "pi pi-th-large", label: "Cards" @@ -2057,11 +2049,11 @@ var P = "mjr-settings-dialog", F = "mjr-settings-dialog-style", I = null, Ae = { label: "General" } }; -function je() { - if (typeof document > "u" || document.getElementById(F)) return; +function L() { + if (typeof document > "u" || document.getElementById(je)) return; let e = document.createElement("style"); - e.id = F, e.textContent = ` -#${P} { + e.id = je, e.textContent = ` +#${F} { position: fixed; inset: 0; z-index: 10080; @@ -2071,8 +2063,8 @@ function je() { color: var(--fg-color, #ddd); font: 13px/1.4 system-ui, -apple-system, Segoe UI, sans-serif; } -#${P}[hidden] { display: none; } -#${P} .mjr-settings-panel { +#${F}[hidden] { display: none; } +#${F} .mjr-settings-panel { width: min(860px, calc(100vw - 32px)); max-height: min(780px, calc(100vh - 32px)); display: grid; @@ -2083,21 +2075,21 @@ function je() { box-shadow: 0 18px 60px rgba(0, 0, 0, 0.45); overflow: hidden; } -#${P} .mjr-settings-head, -#${P} .mjr-settings-tools { +#${F} .mjr-settings-head, +#${F} .mjr-settings-tools { display: flex; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid rgba(255, 255, 255, 0.10); } -#${P} .mjr-settings-title { +#${F} .mjr-settings-title { font-weight: 700; font-size: 14px; flex: 1; } -#${P} .mjr-settings-close, -#${P} .mjr-settings-reset { +#${F} .mjr-settings-close, +#${F} .mjr-settings-reset { border: 1px solid rgba(255, 255, 255, 0.14); background: rgba(255, 255, 255, 0.06); color: inherit; @@ -2106,11 +2098,11 @@ function je() { padding: 0 10px; cursor: pointer; } -#${P} .mjr-settings-close { +#${F} .mjr-settings-close { width: 30px; padding: 0; } -#${P} .mjr-settings-search { +#${F} .mjr-settings-search { flex: 1; min-width: 160px; height: 30px; @@ -2120,21 +2112,21 @@ function je() { color: inherit; padding: 0 10px; } -#${P} .mjr-settings-body { +#${F} .mjr-settings-body { overflow: auto; padding: 12px; } -#${P} .mjr-settings-stack { +#${F} .mjr-settings-stack { display: grid; gap: 10px; } -#${P} .mjr-settings-group { +#${F} .mjr-settings-group { border: 1px solid rgba(255, 255, 255, 0.12); border-radius: 8px; background: rgba(255, 255, 255, 0.035); overflow: hidden; } -#${P} .mjr-settings-group summary { +#${F} .mjr-settings-group summary { min-height: 42px; display: grid; grid-template-columns: 28px 1fr auto 18px; @@ -2145,10 +2137,10 @@ function je() { user-select: none; background: rgba(255, 255, 255, 0.045); } -#${P} .mjr-settings-group summary::-webkit-details-marker { +#${F} .mjr-settings-group summary::-webkit-details-marker { display: none; } -#${P} .mjr-settings-group-icon { +#${F} .mjr-settings-group-icon { width: 28px; height: 28px; display: grid; @@ -2157,27 +2149,27 @@ function je() { background: rgba(255, 255, 255, 0.07); color: var(--input-text, #fff); } -#${P} .mjr-settings-group-title { +#${F} .mjr-settings-group-title { color: var(--input-text, #fff); font-weight: 700; } -#${P} .mjr-settings-group-meta { +#${F} .mjr-settings-group-meta { opacity: 0.68; font-size: 12px; } -#${P} .mjr-settings-chevron { +#${F} .mjr-settings-chevron { transition: transform 0.16s ease; } -#${P} details[open] > summary .mjr-settings-chevron { +#${F} details[open] > summary .mjr-settings-chevron { transform: rotate(90deg); } -#${P} .mjr-settings-group-body { +#${F} .mjr-settings-group-body { padding: 4px 11px 11px; } -#${P} .mjr-settings-subgroup { +#${F} .mjr-settings-subgroup { margin-top: 8px; } -#${P} .mjr-settings-subgroup-title { +#${F} .mjr-settings-subgroup-title { display: flex; align-items: center; gap: 8px; @@ -2188,13 +2180,13 @@ function je() { text-transform: uppercase; opacity: 0.86; } -#${P} .mjr-settings-subgroup-title::after { +#${F} .mjr-settings-subgroup-title::after { content: ""; height: 1px; flex: 1; background: rgba(255, 255, 255, 0.10); } -#${P} .mjr-settings-row { +#${F} .mjr-settings-row { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(180px, 280px); align-items: center; @@ -2202,17 +2194,17 @@ function je() { padding: 9px 0; border-top: 1px solid rgba(255, 255, 255, 0.07); } -#${P} .mjr-settings-name { +#${F} .mjr-settings-name { font-weight: 600; color: var(--p-primary-color, var(--comfy-accent, #8ab4f8)); } -#${P} .mjr-settings-tip { +#${F} .mjr-settings-tip { margin-top: 2px; opacity: 0.72; font-size: 12px; } -#${P} input, -#${P} select { +#${F} input, +#${F} select { min-height: 30px; border-radius: 6px; border: 1px solid rgba(255, 255, 255, 0.16); @@ -2220,41 +2212,41 @@ function je() { color: inherit; padding: 0 8px; } -#${P} input[type="checkbox"] { +#${F} input[type="checkbox"] { justify-self: end; width: 18px; min-height: 18px; } -#${P} input[type="color"] { +#${F} input[type="color"] { padding: 2px; width: 56px; justify-self: end; } @media (max-width: 620px) { - #${P} .mjr-settings-row { + #${F} .mjr-settings-row { grid-template-columns: 1fr; gap: 8px; } } `, document.head.appendChild(e); } -function Me(e) { +function Ne(e) { return String(e || "").replace(/^\s*Majoor:\s*/i, "").trim(); } -function L(e) { +function Pe(e) { let t = Array.isArray(e?.category) ? e.category : []; return String(t[1] || "General").trim() || "General"; } -function Ne(e) { +function Fe(e) { return (Array.isArray(e?.category) ? e.category : []).slice(2).filter(Boolean).join(" / ") || "General"; } -function Pe(e) { - return Ae[e] || { +function R(e) { + return Me[e] || { icon: "pi pi-sliders-h", label: e || "General" }; } -function Fe(e, t) { +function z(e, t) { return t ? [ e?.id, e?.name, @@ -2262,7 +2254,7 @@ function Fe(e, t) { ...Array.isArray(e?.category) ? e.category : [] ].join(" ").toLowerCase().includes(t) : !0; } -function R(e, t) { +function B(e, t) { if (typeof e?.onChange == "function") { e.defaultValue = t; try { @@ -2275,38 +2267,38 @@ function R(e, t) { } } } -function z(e) { +function V(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", () => R(e, r.checked)), r; + if (t === "boolean") return r = document.createElement("input"), r.type = "checkbox", r.checked = !!n, r.addEventListener("change", () => B(e, r.checked)), r; if (t === "combo") { r = document.createElement("select"); for (let t of e?.options || []) { let e = document.createElement("option"), n = t && typeof t == "object" ? t.value ?? t.text ?? t.label : t; e.value = String(n ?? ""), e.textContent = String(t && typeof t == "object" ? t.text ?? t.label ?? t.value : t), r.appendChild(e); } - return r.value = String(n ?? ""), r.addEventListener("change", () => R(e, r.value)), r; + return r.value = String(n ?? ""), r.addEventListener("change", () => B(e, r.value)), r; } if (r = document.createElement("input"), r.type = t === "color" ? "color" : t === "number" ? "number" : t === "password" ? "password" : "text", e?.attrs && typeof e.attrs == "object") for (let [t, n] of Object.entries(e.attrs)) n != null && r.setAttribute(t, String(n)); r.value = String(n ?? ""); let i = t === "color" ? "input" : "change"; return r.addEventListener(i, () => { - R(e, t === "number" ? Number(r.value) : r.value); + B(e, t === "number" ? Number(r.value) : r.value); }), r; } -function B(e, t, n = "") { +function H(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 (!Fe(e, n)) continue; - let t = L(e), r = Ne(e); + if (!z(e, n)) continue; + let t = Pe(e), r = Fe(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 = Pe(e), o = document.createElement("details"); + let i = Array.from(t.values()).flat(), a = R(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"; @@ -2329,60 +2321,60 @@ function B(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 = Me(e?.name) || e?.id || "Setting", r.appendChild(i), e?.tooltip) { + if (i.className = "mjr-settings-name", i.textContent = Ne(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(z(e)), t.appendChild(n); + n.appendChild(r), n.appendChild(V(e)), t.appendChild(n); } p.appendChild(t); } o.appendChild(p), r.appendChild(o); } } -function V() { - je(); - let t = document.createElement("div"); - t.id = P, t.hidden = !0, t.addEventListener("click", (e) => { - e.target === t && H(); +function Ie() { + L(); + let e = document.createElement("div"); + e.id = F, e.hidden = !0, e.addEventListener("click", (t) => { + t.target === e && Le(); }); + let t = document.createElement("div"); + t.className = "mjr-settings-panel", t.setAttribute("role", "dialog"), t.setAttribute("aria-modal", "true"); let n = document.createElement("div"); - n.className = "mjr-settings-panel", n.setAttribute("role", "dialog"), n.setAttribute("aria-modal", "true"); + n.className = "mjr-settings-head"; let r = document.createElement("div"); - r.className = "mjr-settings-head"; - let i = document.createElement("div"); - i.className = "mjr-settings-title", i.textContent = e("settings.majoor.title", "Majoor Assets Manager Settings"); - let a = document.createElement("button"); - a.type = "button", a.className = "mjr-settings-close", a.textContent = "X", a.setAttribute("aria-label", e("btn.close", "Close")), a.addEventListener("click", H), r.append(i, a); + r.className = "mjr-settings-title", r.textContent = a("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", a("btn.close", "Close")), i.addEventListener("click", Le), n.append(r, i); let o = document.createElement("div"); o.className = "mjr-settings-tools"; let s = document.createElement("input"); - s.type = "search", s.className = "mjr-settings-search", s.placeholder = e("placeholder.searchSettings", "Search settings"), o.appendChild(s); + s.type = "search", s.className = "mjr-settings-search", s.placeholder = a("placeholder.searchSettings", "Search settings"), o.appendChild(s); let c = document.createElement("div"); - return c.className = "mjr-settings-body", n.append(r, o, c), t.appendChild(n), document.body.appendChild(t), { + return c.className = "mjr-settings-body", t.append(n, o, c), e.appendChild(t), document.body.appendChild(e), { body: c, - root: t, + root: e, search: s }; } -function H() { +function Le() { I?.root && (I.root.hidden = !0); } -function Ie(e = t()) { +function U(e = t()) { if (typeof document > "u") return !1; - I?.root?.isConnected || (I = V()); - let n = o(e), r = () => B(I.body, n, String(I.search.value || "").trim().toLowerCase()); + I?.root?.isConnected || (I = Ie()); + let n = p(e), r = () => H(I.body, n, String(I.search.value || "").trim().toLowerCase()); return I.search.oninput = r, I.search.value = "", r(), I.root.hidden = !1, setTimeout(() => I?.search?.focus?.(), 0), !0; } //#endregion //#region ui/app/openMajoorSettings.ts -function Le(e = t()) { - return Ie(e); +function Re(e = t()) { + return U(e); } try { - typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.openSettings = Le); + typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.openSettings = Re); } catch (e) { console.debug?.(e); } //#endregion -export { ae as _, we as a, be as c, D as d, ye as f, re as g, ie as h, Ee as i, xe as l, _e as m, De as n, Te as o, O as p, k as r, Ce as s, Le as t, ve as u, C as v, S as y }; +export { se as _, Ee as a, Se as c, O as d, xe as f, ae as g, oe as h, Oe as i, Ce as l, D as m, ke as n, De as o, be as p, k as r, Te as s, Re as t, ye as u, T as v, w as y }; diff --git a/dist/chunks/sideBySide-DX0t_oIi.js b/dist/chunks/sideBySide-Dp8qRb0r.js similarity index 98% rename from dist/chunks/sideBySide-DX0t_oIi.js rename to dist/chunks/sideBySide-Dp8qRb0r.js index ef41ed8c..552b136f 100644 --- a/dist/chunks/sideBySide-DX0t_oIi.js +++ b/dist/chunks/sideBySide-Dp8qRb0r.js @@ -1,5 +1,5 @@ -import { i as e } from "./model3dRenderer-DtGg_3hW.js"; -import { i as t, o as n } from "./geninfoParser-BE5lWeGw.js"; +import { i as e } from "./model3dRenderer-BtzSm2ZA.js"; +import { i as t, o as n } from "./geninfoParser-5vKgjqjD.js"; //#region ui/features/viewer/sideBySide.ts function r(e) { if (!e) return null; diff --git a/dist/entry.js b/dist/entry.js index 8f43a42d..e88051dc 100644 --- a/dist/entry.js +++ b/dist/entry.js @@ -1,14 +1,14 @@ -import { $ as e, A as t, At as n, Bt as r, C as i, Ct as a, D as o, Dt as s, E as c, G as l, H as u, J as d, Jt as f, K as p, Mt as m, Nt as h, O as g, Ot as _, Q as v, Qt as y, St as b, T as x, Tt as S, Ut as C, Vt as w, Wt as T, X as E, Xt as D, Y as O, Z as k, Zt as A, _ as j, b as M, c as N, d as P, et as F, f as ee, g as te, gt as ne, h as re, ht as ie, j as ae, jt as oe, kt as se, l as ce, m as le, mt as ue, n as de, o as fe, p as pe, q as me, qt as he, s as ge, t as _e, tt as ve, v as ye, vt as be, w as xe, wt as Se, x as Ce, y as we, yt as Te } from "./chunks/hostAdapter-D6BwD-lN.js"; -import { _ as Ee, a as De, b as Oe, c as ke, d as Ae, f as je, g as Me, l as Ne, m as Pe, o as Fe, p as Ie, r as Le, s as Re, t as I, u as ze, v as Be, y as Ve } from "./chunks/config-dvcltBqE.js"; -import { _ as He, a as Ue, c as We, d as Ge, f as Ke, g as qe, h as Je, i as Ye, l as L, m as Xe, n as Ze, o as Qe, p as $e, r as et, s as tt, t as nt, u as rt, v as it, y as at } from "./chunks/floatingViewerManager-Oat0dyM2.js"; -import { A as ot, B as st, C as ct, D as lt, E as ut, F as dt, G as ft, H as pt, I as mt, J as ht, K as gt, L as _t, M as vt, N as yt, O as bt, P as xt, R as St, S as R, T as Ct, U as wt, V as Tt, W as Et, _ as Dt, b as Ot, d as kt, f as At, h as jt, j as Mt, k as Nt, l as Pt, m as Ft, p as It, q as Lt, s as Rt, t as zt, u as Bt, v as Vt, w as Ht, x as z, y as Ut, z as Wt } from "./chunks/SidebarWorkflowSection-CxD2u7Bb.js"; -import { i as Gt, n as Kt, r as B, t as qt } from "./chunks/events-BnkL6-b6.js"; -import { a as Jt, i as Yt, n as Xt, t as Zt } from "./chunks/graphTraversal-HdtD9lDa.js"; -import { a as Qt, c as $t, d as en, f as tn, l as nn, m as rn, o as an, p as on, r as sn, s as cn, t as ln, u as un, v as dn } from "./chunks/openMajoorSettings-CGhSTA_W.js"; -import { $ as fn, A as pn, B as mn, C as hn, D as V, E as gn, F as H, H as U, I as _n, L as vn, M as yn, N as bn, O as xn, P as Sn, Q as Cn, R as wn, S as W, T as G, U as Tn, V as En, X as Dn, Y as On, Z as K, _ as kn, at as An, b as jn, it as Mn, j as Nn, nt as Pn, ot as q, rt as J, v as Fn, w as Y, x as X, y as In, z as Ln } from "./chunks/mjr-primevue-DeVPqKdl.js"; -import { n as Rn, r as zn } from "./chunks/mjr-vue-vendor--o0qJuos.js"; +import { B as e, Ct as t, F as n, G as r, H as i, I as a, L as o, M as s, R as c, St as l, U as u, V as d, W as f, _ as p, _t as m, a as h, at as g, b as _, bt as v, c as y, ct as b, d as x, ft as S, g as C, h as w, ht as T, i as E, it as D, l as O, lt as k, m as A, mt as j, n as M, o as N, ot as P, p as F, pt as I, r as ee, s as te, t as ne, u as re, v as ie, vt as ae, wt as oe, x as se, xt as ce, yt as le, z as ue } from "./chunks/client-DZE_lzdb.js"; +import { $ as de, B as fe, F as pe, G as L, H as me, J as he, L as ge, N as _e, P as ve, Q as ye, T as be, U as xe, V as Se, W as Ce, X as we, Y as Te, Z as Ee, at as De, ct as Oe, d as ke, et as Ae, f as je, it as Me, l as R, nt as Ne, ot as Pe, q as Fe, st as Ie, t as z, tt as Le, u as Re, w as ze } from "./chunks/config-Cxv7acF8.js"; +import { a as Be, i as Ve, n as He, t as Ue } from "./chunks/graphTraversal-CjIZsRsP.js"; +import { _ as We, a as Ge, c as Ke, d as B, f as qe, g as Je, h as Ye, i as Xe, l as Ze, m as Qe, n as $e, o as et, p as tt, r as nt, s as rt, t as it, u as at, v as ot, y as st } from "./chunks/floatingViewerManager-BSQ_h48I.js"; +import { A as ct, B as lt, C as V, D as ut, E as dt, F as ft, G as pt, H as mt, I as ht, J as gt, K as _t, L as vt, M as yt, N as bt, O as xt, P as St, R as Ct, S as wt, T as Tt, U as Et, V as Dt, W as Ot, Y as kt, b as At, d as jt, f as Mt, g as Nt, h as Pt, j as Ft, k as It, l as Lt, m as Rt, p as zt, q as Bt, s as Vt, t as Ht, u as Ut, v as Wt, w as Gt, x as Kt, y as qt, z as Jt } from "./chunks/SidebarWorkflowSection-na0bq_pe.js"; +import { i as Yt, n as Xt, r as H, t as Zt } from "./chunks/events-BnkL6-b6.js"; +import { a as Qt, c as $t, d as en, f as tn, l as nn, m as rn, o as an, p as on, r as sn, s as cn, t as ln, u as un, v as dn } from "./chunks/openMajoorSettings-BeNfIQfY.js"; +import { $ as fn, A as pn, B as mn, C as hn, D as U, E as gn, F as W, H as G, I as _n, L as vn, M as yn, N as bn, O as xn, P as Sn, Q as Cn, R as wn, S as K, T as q, U as Tn, V as En, X as Dn, Y as On, Z as J, _ as kn, at as An, b as jn, it as Mn, j as Nn, nt as Pn, ot as Y, rt as X, v as Fn, w as In, x as Z, y as Ln, z as Rn } from "./chunks/mjr-primevue-DeVPqKdl.js"; +import { r as zn } from "./chunks/mjr-vue-vendor--o0qJuos.js"; import { n as Bn, r as Vn } from "./chunks/state-DPiaUMw1.js"; -import { a as Hn, c as Un, i as Wn, o as Gn, r as Kn, s as qn } from "./chunks/model3dRenderer-DtGg_3hW.js"; +import { a as Hn, c as Un, i as Wn, o as Gn, r as Kn, s as qn } from "./chunks/model3dRenderer-BtzSm2ZA.js"; import { app as Jn } from "../../scripts/app.js"; function Yn(e = null) { return null; @@ -17,7 +17,7 @@ function Xn() { return null; } try { - typeof window < "u" && Le && Le.LIST; + typeof window < "u" && L && L.LIST; } catch {} //#endregion //#region ui/integration/comfy_send_to_am.ts @@ -32,6 +32,10 @@ var Zn = "MajoorAssetsManager.SendTo", Qn = "Send to Asset Manager", $n = new Se "SaveAudio" ]); function er(e) { + let t = String(e?.comfyClass || e?.type || "").trim(); + return $n.has(t); +} +function tr(e) { let t = []; try { let n = e?.imgs && Array.isArray(e.imgs) ? e.imgs : null, r = []; @@ -59,17 +63,24 @@ function er(e) { } catch {} return t; } -async function tr(e) { - let t = T(), n = C(t); +async function nr(e) { + let t = be(), n = ze(t); if (!e.length) { - try { - t?.extensionManager?.toast?.add?.({ - severity: "warn", - summary: "Majoor Assets Manager", - detail: "No output to send (run the node first).", - life: 3500 - }); - } catch {} + ge({ + severity: "warn", + summary: "Majoor Assets Manager", + detail: "No output to send (run the node first).", + life: 3500 + }); + return; + } + if (!n || typeof n.fetchApi != "function") { + ge({ + severity: "error", + summary: "Majoor Assets Manager", + detail: "ComfyUI API unavailable.", + life: 4e3 + }); return; } try { @@ -79,17 +90,14 @@ async function tr(e) { body: JSON.stringify({ items: e }) }); if (!r.ok && r.status !== 404) throw Error(`HTTP ${r.status}`); - try { - t?.extensionManager?.sidebarTab?.toggleSidebarTab?.("majoor-assets"); - } catch {} - t?.extensionManager?.toast?.add?.({ + je(t, "majoor-assets"), ge({ severity: "success", summary: "Majoor Assets Manager", detail: `Sent ${e.length} item(s) to the asset grid.`, life: 2500 }); } catch (e) { - t?.extensionManager?.toast?.add?.({ + ge({ severity: "error", summary: "Majoor Assets Manager", detail: `Failed to send: ${e?.message || e}`, @@ -97,40 +105,33 @@ async function tr(e) { }); } } -function nr() { - let e = T(); +function rr() { + let e = be(); if (!e || typeof e.registerExtension != "function") { - setTimeout(nr, 100); + setTimeout(rr, 100); return; } e.registerExtension({ name: Zn, - async beforeRegisterNodeDef(e, t) { + getNodeMenuItems(e) { try { - let n = String(t?.name || ""); - if (!$n.has(n)) return; - let r = e.prototype.getExtraMenuOptions; - e.prototype.getExtraMenuOptions = function(e, t) { - if (typeof r == "function") try { - r.apply(this, arguments); - } catch {} - let n = this; - t.push({ - content: Qn, - callback: () => { - tr(er(n)); - } - }); - }; - } catch {} + return er(e) ? [{ + content: Qn, + callback: () => { + nr(tr(e)); + } + }] : []; + } catch { + return []; + } } }); } -nr(); +rr(); //#endregion //#region ui/app/bootstrap.ts -var rr = !1, ir = null, ar = !1, or = null; -function sr() { +var ir = !1, ar = null, or = !1, sr = null; +function cr() { try { let e = window?.__MJR_EXECUTION_RUNTIME__; return !String(e?.active_prompt_id || "").trim(); @@ -138,31 +139,31 @@ function sr() { return console.debug?.(e), !0; } } -async function cr(e = {}) { - if (!I || typeof I != "object" || !I.AUTO_SCAN_ON_STARTUP || rr) return; +async function lr(e = {}) { + if (!z || typeof z != "object" || !z.AUTO_SCAN_ON_STARTUP || ir) return; let t = Math.max(0, Number(e?.delayMs) || 0), n = e?.idleOnly !== !1; if (t > 0) { - ir && clearTimeout(ir), ir = setTimeout(() => { - ir = null, cr({ + ar && clearTimeout(ar), ar = setTimeout(() => { + ar = null, lr({ ...e, delayMs: 0 }); }, t); return; } - if (n && !sr()) { - ir && clearTimeout(ir), ir = setTimeout(() => { - ir = null, cr({ + if (n && !cr()) { + ar && clearTimeout(ar), ar = setTimeout(() => { + ar = null, lr({ ...e, delayMs: 0 }); }, 5e3); return; } - rr = !0; + ir = !0; try { - it("[Majoor] Starting startup scan of output directory..."); - let e = await ye(Le.SCAN, { + ot("[Majoor] Starting startup scan of output directory..."); + let e = await y(L.SCAN, { recursive: !0, incremental: !0, fast: !0, @@ -170,29 +171,29 @@ async function cr(e = {}) { }); if (e.ok) { let t = e.data; - it(`[Majoor] Startup scan complete - added: ${t.added}, updated: ${t.updated}, skipped: ${t.skipped}`); + ot(`[Majoor] Startup scan complete - added: ${t.added}, updated: ${t.updated}, skipped: ${t.skipped}`); } else console.warn("[Majoor] Majoor [WARN]: Startup scan failed:", e.error); } catch (e) { console.error("[Majoor] ERROR: Startup scan error:", e); } } -async function lr() { +async function ur() { try { await Promise.allSettled([ - P(Le.HEALTH), - P(`${Le.HEALTH_COUNTERS}?scope=output`), - P(Le.HEALTH_DB) + ne(L.HEALTH), + ne(`${L.HEALTH_COUNTERS}?scope=output`), + ne(L.HEALTH_DB) ]); } catch (e) { console.debug?.(e); } } -async function ur(e = {}) { - return ar ? or || Promise.resolve() : (ar = !0, or = (async () => { - await dr(), await lr(), await cr(e); - })(), or); +async function dr(e = {}) { + return or ? sr || Promise.resolve() : (or = !0, sr = (async () => { + await fr(), await ur(), await lr(e); + })(), sr); } -function dr() { +function fr() { return new Promise((e) => { try { if (typeof window > "u") { @@ -211,25 +212,25 @@ function dr() { } }); } -async function fr() { +async function pr() { try { - it("[Majoor] Testing API connection..."); - let e = await P(Le.HEALTH); - e?.ok ? it("[Majoor] API connection successful, health:", e.data.overall) : console.error("[Majoor] ERROR: API health check failed:", e?.error); + ot("[Majoor] Testing API connection..."); + let e = await ne(L.HEALTH); + e?.ok ? ot("[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); } } //#endregion //#region ui/app/versionCheck.ts -var pr = "mjr:version-update-available", mr = "__MJR_VERSION_UPDATE_STATE__", hr = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/latest", gr = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tags/nightly", _r = "majoor_last_update_check", vr = "majoor_version_toast_notice_version", yr = "majoor_nightly_release_marker", br = 1440 * 60 * 1e3, xr = { +var mr = "mjr:version-update-available", hr = "__MJR_VERSION_UPDATE_STATE__", gr = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/latest", _r = "https://api.github.com/repos/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tags/nightly", vr = "majoor_last_update_check", yr = "majoor_version_toast_notice_version", br = "majoor_nightly_release_marker", xr = 1440 * 60 * 1e3, Sr = { available: !1, timestamp: Date.now() }; -function Sr(e) { +function Cr(e) { return e ? String(e).trim().replace(/^v/i, "") : ""; } -function Cr(e, t) { +function wr(e, t) { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = [ "nightly", "dev", @@ -238,15 +239,15 @@ function Cr(e, t) { ].some((e) => n.includes(e) || r.includes(e)), a = n.includes("+") || n.length > 10 && /^[a-f0-9]+$/i.test(n); return i || a; } -function wr(e) { +function Tr(e) { return String(e || "").split("-")[0].split(".").map((e) => { let t = parseInt(e, 10); return Number.isFinite(t) ? Math.max(0, t) : 0; }); } -function Tr(e, t) { +function Er(e, t) { if (!e || !t) return !1; - let n = wr(e), r = wr(t), i = Math.max(n.length, r.length); + let n = Tr(e), r = Tr(t), i = Math.max(n.length, r.length); for (let e = 0; e < i; e += 1) { let t = Number.isFinite(n[e]) ? n[e] : 0, i = Number.isFinite(r[e]) ? r[e] : 0; if (t > i) return !0; @@ -254,7 +255,7 @@ function Tr(e, t) { } return !1; } -function Er(e) { +function Dr(e) { let t = Math.max(1, Number(e) || 1e4); try { if (typeof AbortSignal < "u" && typeof AbortSignal.timeout == "function") return { @@ -292,8 +293,8 @@ function Er(e) { cleanup: () => {} }; } -async function Dr(e) { - let { signal: t, cleanup: n } = Er(1e4), r = await fetch(e, { +async function Or(e) { + let { signal: t, cleanup: n } = Dr(1e4), r = await fetch(e, { cache: "no-cache", signal: t, headers: { Accept: "application/vnd.github+json" } @@ -303,108 +304,108 @@ async function Dr(e) { if (!i || typeof i != "object") throw Error("GitHub release returned invalid payload"); return i; } -async function Or() { - return Sr((await Dr(hr)).tag_name); -} async function kr() { - let e = await Dr(gr); + return Cr((await Or(gr)).tag_name); +} +async function Ar() { + let e = await Or(_r); return String(e.published_at || e.created_at || e.updated_at || e.target_commitish || e.tag_name || "").trim(); } -function Ar(e) { - xr = { +function jr(e) { + Sr = { ...e, timestamp: Date.now() }; let t = typeof window < "u" ? window : null; if (t) { try { - t[mr] = xr; + t[hr] = Sr; } catch (e) { console.debug?.(e); } try { - t.dispatchEvent(new CustomEvent(pr, { detail: xr })); + t.dispatchEvent(new CustomEvent(mr, { detail: Sr })); } catch (e) { console.debug?.(e); } } } -function jr() { - return xr; +function Mr() { + return Sr; } -async function Mr({ force: e = !1 } = {}) { +async function Nr({ force: e = !1 } = {}) { if (typeof window > "u") return null; let t, n; try { - let e = await P(Le.VERSION); - if (!e?.ok) return Ar({ available: !1 }), null; - t = Sr(e.data?.version), n = String(e.data?.branch || "").trim().toLowerCase(); + let e = await ne(L.VERSION); + if (!e?.ok) return jr({ available: !1 }), null; + t = Cr(e.data?.version), n = String(e.data?.branch || "").trim().toLowerCase(); } catch { - return Ar({ available: !1 }), null; + return jr({ available: !1 }), null; } - let i = !1; + let r = !1; try { if (!e) { - let e = Number(w.get(_r) || 0); - Number.isFinite(e) && Date.now() - e < br && (i = !0); + let e = Number(Re.get(vr) || 0); + Number.isFinite(e) && Date.now() - e < xr && (r = !0); } } catch {} - if (!t || Cr(t, n)) { - if (i) return Ar({ available: !1 }), null; + if (!t || wr(t, n)) { + if (r) return jr({ available: !1 }), null; let e; try { - e = await kr(); - let n = String(w.get(yr) || "").trim(), i = !!(n && e && n !== e); - if (Ar({ - available: i, + e = await Ar(); + let n = String(Re.get(br) || "").trim(), r = !!(n && e && n !== e); + if (jr({ + available: r, current: t || "nightly", latest: "nightly", channel: "nightly" - }), i && s({ - summary: r("msg.nightlyUpdateTitle", "Nightly update available"), - detail: r("msg.nightlyUpdateDetail", "A newer nightly build is available. Download it here: https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tag/nightly") + }), r && m({ + summary: R("msg.nightlyUpdateTitle", "Nightly update available"), + detail: R("msg.nightlyUpdateDetail", "A newer nightly build is available. Download it here: https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager/releases/tag/nightly") }, "info", 0), e) try { - w.set(yr, e); + Re.set(br, e); } catch (e) { console.debug?.(e); } } catch (e) { - console.warn("Unable to check Majoor nightly updates:", e), Ar({ available: !1 }); + console.warn("Unable to check Majoor nightly updates:", e), jr({ available: !1 }); } finally { try { - w.set(_r, String(Date.now())); + Re.set(vr, String(Date.now())); } catch {} } return null; } - if (i) return null; - let a; + if (r) return null; + let i; try { - a = await Or(); + i = await kr(); } catch (e) { - return console.warn("Unable to check Majoor updates:", e), Ar({ available: !1 }), null; + return console.warn("Unable to check Majoor updates:", e), jr({ available: !1 }), null; } finally { try { - w.set(_r, String(Date.now())); + Re.set(vr, String(Date.now())); } catch {} } - if (!a || !Tr(a, t)) return Ar({ available: !1 }), null; - Ar({ + if (!i || !Er(i, t)) return jr({ available: !1 }), null; + jr({ available: !0, current: t, - latest: a + latest: i }); try { - if (String(w.get(vr) || "").trim() !== a) { - s({ - summary: r("msg.newVersionTitle", "Majoor Assets Manager update available"), - detail: r("msg.newVersionDetail", "Version {latest} is available. You are currently using {current}.", { - latest: a, + if (String(Re.get(yr) || "").trim() !== i) { + m({ + summary: R("msg.newVersionTitle", "Majoor Assets Manager update available"), + detail: R("msg.newVersionDetail", "Version {latest} is available. You are currently using {current}.", { + latest: i, current: t }) }, "info", 0); try { - w.set(vr, a); + Re.set(yr, i); } catch (e) { console.debug?.(e); } @@ -414,26 +415,26 @@ async function Mr({ force: e = !1 } = {}) { } return { current: t, - latest: a + latest: i }; } //#endregion //#region ui/app/style.ts -function Nr() { +function Pr() { 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 Pr({ enabled: e = !0 } = {}) { +function Fr({ enabled: e = !0 } = {}) { if (!e) return; let t = "mjr-theme-comfy-css"; if (document.getElementById(t)) { - Nr(); + Pr(); return; } try { - let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciDigJQgQ29tZnktbGlrZSB0aGVtZSBsYXllcgogKgogKiBSVUxFUzoKICogLSBEbyBOT1QgaGFyZGNvZGUgYSBjdXN0b20gcGFsZXR0ZTsgdXNlIGV4aXN0aW5nIENvbWZ5VUkgQ1NTIHZhcmlhYmxlcyB2aWEgdmFyKC4uLikuCiAqIC0gS2VlcCBldmVyeXRoaW5nIHNjb3BlZCB1bmRlciBgLm1qci1hc3NldHMtbWFuYWdlcmAgdG8gYXZvaWQgbGVha2luZyBzdHlsZXMgdG8gQ29tZnlVSSAoZXhjZXB0IGAubWpyLXBvcG92ZXIqYCB3aGljaCBjYW4gYmUgcG9ydGFsZWQgdG8gYGRvY3VtZW50LmJvZHlgKS4KICovCgoubWpyLWFzc2V0cy1tYW5hZ2VyIHsKICAgIC8qIFR5cG9ncmFwaHkgKi8KICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHZhcigKICAgICAgICAgICAgLS1mb250LWludGVyLAogICAgICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgICAgICBzeXN0ZW0tdWksCiAgICAgICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgICAgIFJvYm90bywKICAgICAgICAgICAgQXJpYWwsCiAgICAgICAgICAgIHNhbnMtc2VyaWYKICAgICAgICApCiAgICApOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKSk7CgogICAgLyoKICAgICAqIFN1cmZhY2VzIOKAlCBwcmlvcml0eTogQ29tZnlVSSB2MS40MiBkZXNpZ24tc3lzdGVtIHRva2VuIOKGkiBsZWdhY3kgdG9rZW4g4oaSIGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkg4oCUIHVzZSBDb21meVVJIGRlc2lnbi1zeXN0ZW0gcmFkaXVzIHRva2VucyB3aGVuIGF2YWlsYWJsZSAqLwogICAgLS1tanItci1zbTogdmFyKC0tcmFkaXVzLXNtLCA4cHgpOwogICAgLS1tanItci1tZDogdmFyKC0tcmFkaXVzLW1kLCAxMHB4KTsKICAgIC0tbWpyLXItbGc6IHZhcigtLXJhZGl1cy1sZywgMTJweCk7CgogICAgLyogU3BhY2luZyAqLwogICAgLS1tanItcGFkLXNtOiA4cHg7CiAgICAtLW1qci1wYWQtbWQ6IDEycHg7CiAgICAtLW1qci1wYWQtbGc6IDE2cHg7CgogICAgLyogU2VtYW50aWMgU3RhdHVzIENvbG9ycyDigJQgcHJlZmVyIENvbWZ5VUkgdjEuNDIgc2VtYW50aWMgdG9rZW5zICovCiAgICAtLW1qci1zdGF0dXMtc3VjY2VzczogdmFyKC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCkpOwogICAgLS1tanItc3RhdHVzLXdhcm5pbmc6IHZhcigtLXdhcm5pbmctYmFja2dyb3VuZCwgdmFyKC0tY29tZnktc3RhdHVzLXdhcm5pbmcsICNmZmE3MjYpKTsKICAgIC0tbWpyLXN0YXR1cy1lcnJvcjogdmFyKC0tZGVzdHJ1Y3RpdmUtYmFja2dyb3VuZCwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7CiAgICAtLW1qci1zdGF0dXMtaW5mbzogdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpOwogICAgLS1tanItc3RhdHVzLW5ldXRyYWw6IHZhcigtLWNvbWZ5LXN0YXR1cy1uZXV0cmFsLCAjOWU5ZTllKTsKICAgIC0tbWpyLXN0YXItYWN0aXZlOiAjZmZkNDVhOwoKICAgIC8qIEJhZGdlIGNvbG9ycyAob3ZlcnJpZGRlbiBieSBzZXR0aW5ncykgKi8KICAgIC0tbWpyLWJhZGdlLWltYWdlOiAjMjE5NmYzOwogICAgLS1tanItYmFkZ2UtdmlkZW86ICM5YzI3YjA7CiAgICAtLW1qci1iYWRnZS1hdWRpbzogI2ZmOTgwMDsKICAgIC0tbWpyLWJhZGdlLW1vZGVsM2Q6ICM0Y2FmNTA7CiAgICAtLW1qci1jYXJkLWhvdmVyLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgIzNkM2QzZCk7CiAgICAtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsICM0YTkwZTIpOwogICAgLS1tanItcmF0aW5nLWNvbG9yOiAjZmY5NTAwOwogICAgLS1tanItdGFnLWNvbG9yOiAjNGE5MGUyOwp9CgovKiBNYWtlIHRoZSB0aGVtZSB2aXNpYmx5IGFwcGx5IGV2ZW4gd2l0aCBpbmxpbmUgc3R5bGVzICovCi5tanItYXNzZXRzLW1hbmFnZXIgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyLm1qci1hbS1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyIHsKICAgIHBhZGRpbmc6IDE0cHggMTZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgZmxleDogMCAwIGF1dG87CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICByb3ctZ2FwOiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLWxlZnQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItdG9vbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzIHsKICAgIC8qIFF1ZXVlLWxpa2UgdGFicyAoYWN0aXZlIHBpbGwsIG90aGVycyBhcyB0ZXh0KSAqLwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgZ2FwOiAxMHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiczo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWIgewogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYi5pcy1hY3RpdmUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODUlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLWNvbnRleHQtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24g4oCUIHRlYWwgZ2xvdyB3aGVuIHZpZXdlciBpcyBvcGVuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItbWZ2LWJ0bi1hY3RpdmUgewogICAgY29sb3I6ICM0ZGQ5YzA7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDIxNywgMTkyLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDIxNywgMTkyLCAwLjEpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoNzcsIDIxNywgMTkyLCAwLjI1KTsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1lc3NhZ2UtYnRuIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1lc3NhZ2UtaGFzLXVucmVhZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA3NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MiUsIHZhcigtLW1qci1hY2NlbnQpIDExJSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXNzYWdlLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNnB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA1NSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKSk7CiAgICBiYWNrZ3JvdW5kOiAjZWY1MzUwOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bjpkaXNhYmxlZCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWNvbnRyb2w6ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuNDUpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA5MiUsIHRyYW5zcGFyZW50KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQgLm1qci1haS1jb250cm9sOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuNDUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgLm1qci1haS1jb250cm9sLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgYnV0dG9uIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgovKiBQb3BvdmVycyBjYW4gYmUgbW92ZWQgdG8gYGRvY3VtZW50LmJvZHlgIChwb3J0YWwpIHRvIGF2b2lkIGJlaW5nIGNsaXBwZWQuICovCi5tanItcG9wb3ZlciB7CiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qIFByb3ZpZGUgZmFsbGJhY2tzIHdoZW4gb3V0c2lkZSBgLm1qci1hc3NldHMtbWFuYWdlcmAgc2NvcGUgKi8KICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7CiAgICAtLW1qci1hY2NlbnQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7CiAgICAtLW1qci1wb3BvdmVyLXotaW5kZXg6IDIxNDc0ODM2NDc7CgogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdpZHRoOiBtaW4oMjgwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBtYXgtd2lkdGg6IG1pbigzNjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICB6LWluZGV4OiB2YXIoLS1tanItcG9wb3Zlci16LWluZGV4KTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAzNDBweDsKICAgIHdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLXNvcnQtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDIyMHB4OwogICAgd2lkdGg6IG1pbigyNjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItY29sbGVjdGlvbnMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI4MHB4OwogICAgd2lkdGg6IG1pbigzMjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiDigJQgdW5yZWFkIGluZGljYXRvciBkb3QgKi8KLm1qci10YWItdW5yZWFkLWRvdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIEhpc3RvcnkgcGFuZWwgKi8KLm1qci1tZXNzYWdlcy1oaXN0b3J5LXBhbmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItaGlzdG9yeS1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogNHB4IDAgNnB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItaGlzdG9yeS1oZWFkLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07Cn0KCi5tanItaGlzdG9yeS1jbGVhci1idG4gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgcGFkZGluZzogMnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItaGlzdG9yeS1jbGVhci1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWxpc3QgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47Cn0KCi5tanItaGlzdG9yeS1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMiwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLS1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjM2YjZiIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS0tc3VjY2VzcyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS1pY29uIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tY29udGVudCB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1zZyB7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLWhpc3RvcnktaXRlbS10aXRsZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTY7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tZGV0YWlsIHsKICAgIG9wYWNpdHk6IDAuODQ7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWhpc3RvcnktaXRlbS10aW1lIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIG9wYWNpdHk6IDAuNTI7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNoaXAgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMywgdmFyKC0tbWpyLXN1cmZhY2UtMikpIDc4JSwgdHJhbnNwYXJlbnQpOwogICAgb3BhY2l0eTogMC43NjsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tYWN0aW9uIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLXByb2dyZXNzLXN1bW1hcnkgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43NDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLXByb2dyZXNzLWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1maWxsIHsKICAgIGhlaWdodDogMTAwJTsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZiksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICM1OGMwN2QgNzIlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSkKICAgICk7Cn0KCi5tanItc2hvcnRjdXQtZ3VpZGUgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogOHB4Owp9CgoubWpyLXNob3J0Y3V0LWd1aWRlLWludHJvIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgb3BhY2l0eTogMC44NDsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODQlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMywgdmFyKC0tbWpyLXN1cmZhY2UtMikpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXNob3J0Y3V0LXNlY3Rpb24tdGl0bGUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA4OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1zaG9ydGN1dC1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDEzMnB4LCAxNjBweCkgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKfQoKLm1qci1zaG9ydGN1dC1rZXkgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDEyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA5MCUsIHRyYW5zcGFyZW50KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMS4yNTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7Cn0KCi5tanItc2hvcnRjdXQtZGVzYyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgb3BhY2l0eTogMC45MjsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7CiAgICAubWpyLXNob3J0Y3V0LXJvdyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci1zaG9ydGN1dC1rZXkgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KfQoKLm1qci1maWx0ZXItZ3JvdXAgewogICAgcGFkZGluZzogMTBweCAwIDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLWdyb3VwLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zNXB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNzglLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKfQoKLm1qci1wb3BvdmVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLXBvcG92ZXItbGFiZWwgewogICAgd2lkdGg6IDU2cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci1wb3BvdmVyLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKfQoKLm1qci1wb3BvdmVyLXRvZ2dsZSBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1icm93c2UgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIHBhZGRpbmctdG9wOiA0cHg7Cn0KCi8qIFNjcm9sbGJhcnMgKG1hdGNoIENvbWZ5VUkgZmVlbCkgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODUlLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSkgdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDpob3Zlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLWNvcm5lciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWN1c3RvbS1jb250cm9scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoIHsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoIHsKICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW4tYm90dG9tOiA2cHg7Cn0KCi8qIENhcmQgTWV0YWRhdGEgQ29sb3JzICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGNvbG9yOiAjZmZhNzI2OyAvKiBPcmFuZ2UgZm9yIGR1cmF0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1yZXMgewogICAgY29sb3I6ICM0ZmMzZjc7IC8qIExpZ2h0IEJsdWUgZm9yIHJlc29sdXRpb24gKi8KICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXRhLWRhdGUgewogICAgY29sb3I6ICNiOWY2Y2E7IC8qIFBhbGUgR3JlZW4gZm9yIGRhdGUgKi8KICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS10aW1lIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgZm9udC1zaXplOiAwLjllbTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnkgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCA2cHggMDsKICAgIHBhZGRpbmc6IDAgMCA0cHggMDsKICAgIG1pbi1oZWlnaHQ6IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNjUlLCB0cmFuc3BhcmVudCk7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLyogVG9hc3RzIChnbG9iYWw6IGNhbiBiZSBtb3VudGVkIHVuZGVyIGRvY3VtZW50LmJvZHkpICovCi5tanItdG9hc3QtY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMTZweDsKICAgIGxlZnQ6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHotaW5kZXg6IDEwMDAwMDE7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci10b2FzdCB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICMzYTNhM2EpOwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1tanItdG9hc3Qtc3RyaXApOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCAjZWZlZmVmKTsKICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgc3lzdGVtLXVpLAogICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICBSb2JvdG8sCiAgICAgICAgQXJpYWwsCiAgICAgICAgc2Fucy1zZXJpZgogICAgKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTVweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4ycyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4ycyBlYXNlLW91dDsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICBtaW4td2lkdGg6IG1pbigyNTBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIG1heC13aWR0aDogbWluKDQwMHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDRweCk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci10b2FzdC5pcy12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KCi5tanItdG9hc3QtdGV4dCB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLyogVG9hc3QgaWNvbiBzdHlsaW5nICovCi5tanItdG9hc3QtdGV4dDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1pY29uKTsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgY29sb3I6IHZhcigtLW1qci10b2FzdC1pY29uLWNvbG9yKTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLXdpZHRoOiAxNnB4Owp9CgoubWpyLXRvYXN0LXN1Y2Nlc3MgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApKTsKfQoKLm1qci10b2FzdC1lcnJvciB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLWVycm9yLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKfQoKLm1qci10b2FzdC13YXJuaW5nIHsKICAgIC0tbWpyLXRvYXN0LXN0cmlwOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsIHZhcigtLWNvbWZ5LXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsIHZhcigtLWNvbWZ5LXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KSk7Cn0KCi5tanItdG9hc3QtaW5mbyB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS10ZXh0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGV4dC1waWxscyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHJvdy1nYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTAuNXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtaW4taGVpZ2h0OiAyMnB4OwogICAgbWF4LXdpZHRoOiAyMjBweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbDpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA3NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1MCUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3BhY2l0eTogMC45MjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC14IHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXg6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGwgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBoZWlnaHQ6IDEuNzVyZW07CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtdG9vbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBvcG92ZXItYW5jaG9yIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hZ2VuZGEtaW5wdXQgewogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGNvbG9yIDAuMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4ycyBlYXNlOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZmlsbGVkIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA2MCUKICAgICk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDgwJSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKQogICAgKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoubWpyLWFnZW5kYS1pbnB1dC5tanItYWdlbmRhLWVtcHR5IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NSUsIHRyYW5zcGFyZW50IDE1JSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1ib3JkZXIpOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KCi5tanItYWdlbmRhLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtY2FsZW5kYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFnZW5kYS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1hZ2VuZGEtbW9udGggewogICAgZmxleDogMTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtbmF2IHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7Cn0KCi5tanItYWdlbmRhLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItYWdlbmRhLXdlZWtkYXkgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5IHsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hZ2VuZGEtZGF5LWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNXB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICNlNTM5MzU7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAjZTUzOTM1IDY1JSwgI2ZmZmZmZiAzNSUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFnZW5kYS1kYXk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDUlCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgNDUlLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5OmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1ibGFuayB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1oYXMtYXNzZXRzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDgyJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4CiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDU1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFnZW5kYS1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFnZW5kYS1jbGVhciwKLm1qci1hZ2VuZGEtcmVmcmVzaCB7CiAgICBmbGV4OiAxOwp9CgoubWpyLW1lbnUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItcHJpbWUtbWVudS1saXN0LAoubWpyLXNvcnQtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtIl0sCi5tanItcHJpbWUtbWVudS1saXN0IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXByaW1lLW1lbnUgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbWNvbnRlbnQiXSB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZW51LWl0ZW0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW06aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW06aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVudS1pdGVtOmFjdGl2ZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtLWxhYmVsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgd2lkdGg6IDE2cHg7CiAgICBmbGV4OiAwIDAgMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDcyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW0gLnBpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItY29sbGVjdGlvbnMtbWVudSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIC5waSB7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1tZW51LWl0ZW0taGludCB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDYyJSwgdmFyKC0tbWpyLW11dGVkKSk7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2stLXZpc2libGUsCi5tanItbWVudS1pdGVtLmlzLWFjdGl2ZSAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1lbnUtZGl2aWRlciB7CiAgICBoZWlnaHQ6IDFweDsKICAgIG1hcmdpbjogNHB4IDA7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbXV0ZWQgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1zdGF0ZS1ibG9jayB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgYm9yZGVyOiAxcHggZGFzaGVkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zdGF0ZS1ibG9jay5pcy1lcnJvciwKLm1qci1jb250ZXh0LW1lbnUtbm90ZS5pcy1lcnJvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDgyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItY29sbGVjdGlvbi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiA0OHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXZpcnR1YWwtbGlzdCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLWRlbGV0ZS1idG4gewogICAgd2lkdGg6IDQycHg7CiAgICBmbGV4OiAwIDAgNDJweDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA2NSUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDQ1JSk7Cn0KCi5tanItZGVsZXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA0MCUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDY1JSk7Cn0KCi5tanItZGVsZXRlLWJ0biAucGkgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweCAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG9wYWNpdHk6IDAuODg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDcyJSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tY3lhbiB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzglLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tdmlvbGV0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLWhpbnQgewogICAgcGFkZGluZzogMCAxMHB4IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDU1JSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydCwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgewogICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0IC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICNjNDhkZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydDpob3Zlcjpub3QoOmRpc2FibGVkKSwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXI6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXRodW1icyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAzcHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1jbHVzdGVyLXRodW1iIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItaW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNsdXN0ZXItbmFtZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1jbHVzdGVyLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTglLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1jbHVzdGVyLWNyZWF0ZS1idG4gewogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtaWNvbiAucGkgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbCAubWpyLWlucHV0IHsKICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGw6Zm9jdXMtd2l0aGluIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBtYXJnaW4tdG9wOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwp9CgovKiBHcmlkIGxheW91dCAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogQXZvaWQgb3ZlcmZsb3cgd2hlbiB0aGUgcGFuZWwgYmVjb21lcyBuYXJyb3dlciB0aGFuIHRoZSBtaW4gY2FyZCBzaXplICovCiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgKICAgICAgICBhdXRvLWZpbGwsCiAgICAgICAgbWlubWF4KG1pbigxMDAlLCB2YXIoLS1tanItZ3JpZC1taW4tc2l6ZSwgMTgwcHgpKSwgMWZyKQogICAgKTsKICAgIGdhcDogdmFyKC0tbWpyLWdyaWQtZ2FwLCAxMHB4KTsKICAgIG1hcmdpbi10b3A6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIENhcmQgc2VsZWN0aW9uICsgZm9jdXMgKGtlZXBzIGEgdmlzaWJsZSBpbmRpY2F0b3Igd2hlbiBzaWRlYmFyIGlzIG9wZW4pICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkLmlzLXNlbGVjdGVkIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgIDAgMCAwIDZweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkyKSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45MikgIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwOwp9CgpAa2V5ZnJhbWVzIG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIHsKICAgIDAlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgb3BhY2l0eTogMC4zNDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1OCUpOwogICAgICAgIG9wYWNpdHk6IDAuMTg7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgewogICAgMCUsCiAgICAxMDAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjM0KSwKICAgICAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgMXB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC41MiksCiAgICAgICAgICAgIDAgMCAwIDRweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMTIpLAogICAgICAgICAgICAwIDEycHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gewogICAgYW5pbWF0aW9uOiBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSAxLjlzIGVhc2UtaW4tb3V0IGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci10aHVtYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1wbGFjZWhvbGRlci13YXNoIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAtOCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDE7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTE1ZGVnLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwKSAwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMC4wOCkgMzAlLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgNTAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjEyKSA3MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIDIuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNnB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDEyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43OCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWxpdmUtcGlsbC1kb3QgewogICAgd2lkdGg6IDdweDsKICAgIGhlaWdodDogN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiAjNzZkNmZmOwogICAgYm94LXNoYWRvdzogMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xNik7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItbGl2ZS1wbGFjZWhvbGRlcj0idHJ1ZSJdIC5tanItYXNzZXQtc3RhdHVzLWRvdCB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi8qIEdyaWQgbG9hZGluZyBvdmVybGF5ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLWxvYWRpbmctb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzAwMCAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjNweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7Cn0KCkBrZXlmcmFtZXMgbWpyLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEyMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjAlIDA7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgewogICAgd2lsbC1jaGFuZ2U6IGJhY2tncm91bmQtcG9zaXRpb247Cn0KCi8qIEdlbmVyaWMgaGVhZGluZ3MgaW5zaWRlIHBhbmVsICovCi5tanItYXNzZXRzLW1hbmFnZXIgaDMsCi5tanItYXNzZXRzLW1hbmFnZXIgaDQgewogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgovKiBQYW5lbHMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBhbmVsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICBib3gtc2hhZG93OiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtYm94LXNoYWRvdywgMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKfQoKLyogVG9vbGJhciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdG9vbGJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IHZhcigtLW1qci1wYWQtbWQpOwp9CgovKiBCdXR0b25zICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41NTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4ubWpyLXByaW1hcnkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTQlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLyogSW5wdXRzIC8gc2VsZWN0cyAodXNlZCBpbnNpZGUgcG9ydGFsZWQgcG9wb3ZlcnMgdG9vKSAqLwoubWpyLWlucHV0LAoubWpyLXNlbGVjdCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0IHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgb3V0bGluZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQ6OnBsYWNlaG9sZGVyIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW11dGVkKSA4MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1pbnB1dDpmb2N1cywKLm1qci1zZWxlY3Q6Zm9jdXMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dDpmb2N1cywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaW5wdXQsCi5tanItc2VsZWN0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3QgewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDhweDsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7CiAgICBwYWRkaW5nOiAwIDlweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0W2RhdGEtcC1kaXNhYmxlZD0idHJ1ZSJdIHsKICAgIG9wYWNpdHk6IDAuNTU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IFtkYXRhLXBjLXNlY3Rpb249ImxhYmVsIl0gewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCBbZGF0YS1wYy1zZWN0aW9uPSJkcm9wZG93biJdIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMThweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgewogICAgbWluLXdpZHRoOiB2YXIoLS1wLXNlbGVjdC1vdmVybGF5LXdpZHRoLCAxMnJlbSk7CiAgICBtYXgtd2lkdGg6IG1pbigzMjBweCwgY2FsYygxMDB2dyAtIDMycHgpKTsKICAgIG1heC1oZWlnaHQ6IG1pbigzMjBweCwgY2FsYygxMDB2aCAtIDMycHgpKTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM4KTsKICAgIHotaW5kZXg6IGNhbGModmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCwgMjE0NzQ4MzY0NykgKyAxKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Imxpc3QiXSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogMDsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogY2FsYyh2YXIoLS1tanItci1tZCkgLSAycHgpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl06aG92ZXIsCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wLWhpZ2hsaWdodD0idHJ1ZSJdIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoKLyogVGFiczogb3ZlcnJpZGRlbiBhYm92ZSB3aXRoIHF1ZXVlLWxpa2Ugc3R5bGUgKi8KCi8qIFJlbW92ZWQgcmVkdW5kYW50IHRhYiBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIHVzaW5nICFpbXBvcnRhbnQgKi8KCi8qIE11dGVkIHRleHQgaGVscGVyICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tdXRlZCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoKLyogR3JpZCArIGNhcmRzIChvdmVycmlkZSBpbmxpbmUgc3R5bGVzIGZyb20gQ2FyZC5qcykgKi8KLm1qci1hc3NldHMtbWFuYWdlciAjbWpyLWFzc2V0cy1ncmlkIHsKICAgIGdhcDogMTBweCAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZykgIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlcikKICAgICkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1qci1jYXJkLWhvdmVyLWNvbG9yKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMjUpICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIGltZywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgdmlkZW8sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYi1tZWRpYSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgIG9iamVjdC1maXQ6IGNvdmVyICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiB7CiAgICB3aWR0aDogMTAwJTsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODAlLCB0cmFuc3BhcmVudCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBLZWVwIGdlbmVyYXRpb24tdGltZSBiYWRnZSBwaW5uZWQgdG8gdGhlIHRodW1ibmFpbCBjb3JuZXIgYWNyb3NzIGdyaWQvZmVlZCB2YXJpYW50cy4KICAgVGhlICFpbXBvcnRhbnQgb3ZlcnJpZGVzIGFyZSBpbnRlbnRpb25hbDogR2VuVGltZUJhZGdlLnZ1ZSB1c2VzIDxzdHlsZSBzY29wZWQ+IHdob3NlCiAgIGhhc2hlZCBjbGFzcyBoYXMgdGhlIHNhbWUgc3BlY2lmaWNpdHkgYXMgZ2xvYmFsIHNlbGVjdG9ycy4gV2l0aG91dCAhaW1wb3J0YW50LCBhCiAgIGNvbmZsaWN0aW5nIHJ1bGUgKGUuZy4gZnJvbSBhIHRoZW1lIGV4dGVuc2lvbiBvciBhbiBvbGRlciBub24tc2NvcGVkIGNvbnRleHQpIHRoYXQgc2V0cwogICBsZWZ0OjAvdG9wOjAgd291bGQgd2luLiBsZWZ0OmF1dG8gKyB0b3A6YXV0byBleHBsaWNpdGx5IGNhbmNlbCBhbnkgc3VjaCBhY2NpZGVudGFsIHJlc2V0LiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLWdlbnRpbWUtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAycHggNnB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IGNvbG9yLW1peChpbiBzcmdiLCBjdXJyZW50Q29sb3IgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEtlZXAgcmF0aW5nL3RhZ3MgYmFkZ2VzIGFuY2hvcmVkIGV2ZW4gd2hlbiBzY29wZWQgVnVlIHN0eWxlcyBhcmUgbm90IGFwcGxpZWQgYWZ0ZXIgcmVsb2FkLgogICBEbyBub3QgZm9yY2UgZGlzcGxheSBoZXJlIHNvIGdyaWQgdmlzaWJpbGl0eSB0b2dnbGVzICgubWpyLXNob3ctYmFkZ2VzLSopIHN0aWxsIGNvbnRyb2wgc2hvdy9oaWRlLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLXJhdGluZy1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci1yYXRpbmctYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICB0b3A6IDZweCAhaW1wb3J0YW50OwogICAgcmlnaHQ6IDZweCAhaW1wb3J0YW50OwogICAgbGVmdDogYXV0byAhaW1wb3J0YW50OwogICAgYm90dG9tOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC42KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iID4gLm1qci10YWdzLWJhZGdlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgPiAubWpyLXRhZ3MtYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICByaWdodDogYXV0byAhaW1wb3J0YW50OwogICAgdG9wOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMCAhaW1wb3J0YW50OwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA1NnB4KTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMyk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYi1wbGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIHBsYWNlLWl0ZW1zOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDI4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgdGV4dC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC43KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgovKiDilIDilIDilIAgSG92ZXIgaW5mbyBvdmVybGF5IChwb3NpdGl2ZSBwcm9tcHQgKyBnZW4gdGltZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgIFNsaWRlcyB1cCBmcm9tIHRoZSBib3R0b20gb2YgLm1qci10aHVtYiBvbiBjYXJkIGhvdmVyLgogICBwb2ludGVyLWV2ZW50czogbm9uZSAg4oaSIG5ldmVyIGJsb2NrcyB2aWRlbyBtb3VzZWVudGVyIC8gcGxheS1vbi1ob3Zlci4KICAgei1pbmRleDogMiAgICAgICAgICAg4oaSIHNpdHMgYWJvdmUgdGhlIHRodW1ibmFpbCBpbWFnZSwgYmVsb3cgdGhlIHBsYXkgaWNvbi4KICAgQ29udHJvbGxlZCBieSB0aGUgLm1qci1zaG93LWhvdmVyLWluZm8gY2xhc3Mgb24gdGhlIGdyaWQgY29udGFpbmVyLCB3aGljaAogICBpcyB0b2dnbGVkIHZpYSB0aGUgIlNob3cgcHJvbXB0IG9uIGhvdmVyIiBzZXR0aW5nLgogICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBwYWRkaW5nOiAyMnB4IDhweCA3cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCB0cmFuc3BhcmVudCAwJSwgcmdiYSgwLCAwLCAwLCAwLjc4KSAxMDAlKTsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg1cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDE1MG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDE1MG1zIGVhc2U7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogM3B4OwogICAgei1pbmRleDogMjsKfQovKiBPbmx5IHJldmVhbCBvbiBob3ZlciB3aGVuIHRoZSBzZXR0aW5nIGlzIGVuYWJsZWQgKGNsYXNzIG9uIGdyaWQgY29udGFpbmVyKSAqLwoubWpyLWdyaWQubWpyLXNob3ctaG92ZXItaW5mbyAubWpyLWNhcmQ6aG92ZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIC5tanItaG92ZXItcHJvbXB0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICAgIC13ZWJraXQtbGluZS1jbGFtcDogMjsKICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgb3BhY2l0eTogMC45OwogICAgZm9udC1zaXplOiA5LjVweDsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIC5tanItaG92ZXItZ2VudGltZSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIxMCwgMTIwLCAwLjk1KTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDlweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07Cn0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMG1zOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtbWV0YSB7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1kZXRhaWxzIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG9wYWNpdHk6IDAuODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgovKiBSYXRpbmcgJiBUYWdzIEVkaXRvcnMgKi8KQGtleWZyYW1lcyBmYWRlSW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KLyoqCiAqIEFyY2hpdmVkIENTUyBTdHlsZXMgLSBSYXRpbmcgYW5kIFRhZ3MKICogVGhlc2Ugc3R5bGVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZW1lLWNvbWZ5LmNzcwogKi8KCi8qIEFuaW1hdGlvbnMgKi8KQGtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogICAgZnJvbSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KCi8qIFBvcG92ZXJzICovCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZTsKfQoKLm1qci1yYXRpbmctcG9wb3ZlciwKLm1qci10YWdzLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHBhZGRpbmc6IDhweDsKfQoKLyogUmF0aW5nIEVkaXRvciAqLwoubWpyLXJhdGluZy1lZGl0b3IgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHg7Cn0KCi5tanItcmF0aW5nLXN0YXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItcmF0aW5nLXN0YXI6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb21meS1tZW51LXNlY29uZGFyeS1iZywgIzMzMykgNjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItcmF0aW5nLWVkaXRvciAubWpyLXJhdGluZy1zdGFyOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKSAhaW1wb3J0YW50Owp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3RhcjphY3RpdmUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KSAhaW1wb3J0YW50Owp9CgovKiBUYWdzIEVkaXRvciAqLwoubWpyLXRhZ3MtZWRpdG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgbWluLXdpZHRoOiAyNTBweDsKICAgIG1heC13aWR0aDogbWluKDM1MHB4LCBjYWxjKDEwMHZ3IC0gMjBweCkpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KCi5tanItdGFncy1lZGl0b3IuaXMtZGlzYWJsZWQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdGFncy1kaXNwbGF5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDMycHg7Cn0KCi5tanItdGFncy1lbXB0eSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLm1qci10YWctY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMjQlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLm1qci10YWctY2hpcC1yZW1vdmUgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZy1jaGlwLXJlbW92ZTpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItdGFncy1pbnB1dC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci10YWctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXRhZy1pbnB1dDpmb2N1cyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCkgIWltcG9ydGFudDsKfQoKLm1qci10YWctY2hpcDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMzQlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFncy1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwMCU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1heC1oZWlnaHQ6IDE1MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHotaW5kZXg6IDEwMDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXRhZy1zdWdnZXN0aW9uIHsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci10YWctc3VnZ2VzdGlvbi5pcy1hY3RpdmUsCi5tanItdGFnLXN1Z2dlc3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7Cn0KCi8qIEJhZGdlcyBJbnRlcmFjdGl2ZSAqLwoubWpyLXJhdGluZy1iYWRnZSwKLm1qci10YWdzLWJhZGdlIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItcmF0aW5nLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtYmFkZ2UgewogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWJhZGdlOmhvdmVyLAoubWpyLXRhZ3MtYmFkZ2U6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi8qIFNjcm9sbGJhciBmb3IgdGFncyBkcm9wZG93biAqLwoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA2cHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA0OCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi8qIFNpZGViYXIgKGNhbiBiZSBsZWZ0IG9yIHJpZ2h0KSAqLwoubWpyLXNpZGViYXIgewogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXdyYXAgewogICAgbWFyZ2luOiAwIDAgMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kLCA4cHgpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNlYWVhZWEpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtc2Nyb2xsIHsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogMnB4IDRweCA2cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtLCA2cHgpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZSB7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NCkpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtdG9nZ2xlW2RhdGEtcC1sZWFmPSJ0cnVlIl0gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtaWNvbiB7CiAgICB3aWR0aDogOHB4OwogICAgZmxleDogMCAwIDhweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzAlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBmb250LXNpemU6IDdweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLWxhYmVsIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1ub2RlLXR5cGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDc1JSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1zaWRlYmFyLmlzLW9wZW4gewogICAgLyogQm9yZGVyIGlzIHNldCBkeW5hbWljYWxseSBiYXNlZCBvbiBwb3NpdGlvbiAqLwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA4cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Cn0KCi8qIEN1c3RvbSBSb290cyBQb3BvdmVyIFN0eWxpbmcgKi8KLm1qci1jdXN0b20tcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMwMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICB3aWR0aDogNjBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXNlbGVjdCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItYnRuIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1zZWN0aW9uIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMykgIWltcG9ydGFudDsKfQoKLyogSW5saW5lIFNpZGViYXIgKHdpZHRoLWJhc2VkIHRyYW5zaXRpb25zIGxpa2UgYXJjaGl2ZWQgdmVyc2lvbikgKi8KLm1qci1pbmxpbmUtc2lkZWJhciB7CiAgICB3aWR0aDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogNDgwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgd2lkdGggMC4zcyBlYXNlLAogICAgICAgIG1pbi13aWR0aCAwLjNzIGVhc2U7Cn0KCi5tanItaW5saW5lLXNpZGViYXIuaXMtb3BlbiB7CiAgICB3aWR0aDogNDAwcHg7CiAgICBtaW4td2lkdGg6IDI2MHB4Owp9CgovKiBTcGFjZSBiZXR3ZWVuIHNpZGViYXIgYW5kIGdyaWQgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBnYXA6IDA7Cn0KCi8qIEJvcmRlciBiYXNlZCBvbiBwb3NpdGlvbiAqLwoubWpyLWlubGluZS1zaWRlYmFyW2RhdGEtcG9zaXRpb249ImxlZnQiXSB7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJyaWdodCJdIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi8qIFNpZGViYXIgcGxhY2Vob2xkZXIgKi8KLm1qci1zaWRlYmFyLXBsYWNlaG9sZGVyIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qID09PT09PT09PT0gVmlld2VyIENvbXBvbmVudCA9PT09PT09PT09ICovCi5tanItdmlld2VyLW92ZXJsYXkgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYm90dG9tOiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjk1KTsKICAgIC8qIFNpdCBhYm92ZSBNRlYgKDEwMDAwKSBzbyB0aGUgZnVsbCB2aWV3ZXIgYWx3YXlzIGNvdmVycyB0aGUgZmxvYXRpbmcgcGFuZWwgKi8KICAgIHotaW5kZXg6IDEwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQovKiBGYWRlLWluOiBhbmltYXRpb24gcmUtdHJpZ2dlcnMgZWFjaCB0aW1lIEpTIHN3aXRjaGVzIGRpc3BsYXkgYmFjayB0byBmbGV4ICovCi5tanItdmlld2VyLW92ZXJsYXlbc3R5bGUqPSJmbGV4Il0gewogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjE4cyBlYXNlLW91dDsKfQoKQGtleWZyYW1lcyBtanItZmFkZS1pbiB7CiAgICBmcm9tIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIH0KfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE3MGRlZywgcmdiYSgyNCwgMjcsIDMzLCAwLjk2KSwgcmdiYSgxNywgMTksIDI1LCAwLjk3KSk7CiAgICBib3JkZXItYm90dG9tOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMik7CiAgICBjb2xvcjogd2hpdGU7Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBtYXgtd2lkdGg6IDQwMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA0cHggMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4xKSwgcmdiYSgyMDYsIDIxMSwgMjE4LCAwLjAzKSk7CiAgICBib3JkZXI6IDAuOHB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4zKTsKICAgIGNvbG9yOiByZ2JhKDIzMCwgMjMzLCAyMzgsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTZzOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4xNCksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNDIpOwp9CgovKiBWaWV3ZXIgY2xvc2UgYnV0dG9uIHBpbm5lZCB0byBvdmVybGF5IGNvcm5lciAqLwoubWpyLXZpZXdlci1jbG9zZSwKLm1qci12aWV3ZXItZnMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjYpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wOCksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMikpLAogICAgICAgIHJnYmEoMjAsIDIzLCAyOSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1jbG9zZSB7CiAgICBjb2xvcjogI2ZmZjRmNCAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIwNSwgODIsIDgyLCAwLjUpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA1LCA4MiwgODIsIDAuMyksIHJnYmEoMjA1LCA4MiwgODIsIDAuMTIpKSwKICAgICAgICByZ2JhKDU4LCAxOCwgMTgsIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDIxOSwgMjE5LCAwLjE2KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyMDUsIDgyLCA4MiwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2U6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMzgpLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMTYpKSwKICAgICAgICByZ2JhKDcwLCAxOCwgMTgsIDAuOTcpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjM1LCAxMzgsIDEzOCwgMC42NCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItZnM6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKSwKICAgICAgICByZ2JhKDIzLCAyNiwgMzIsIDAuOTUpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC4zOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZXdlci1jb250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItc2luZ2xlLAoubWpyLXZpZXdlci1hYiwKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLm1qci12aWV3ZXItc2luZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSBpbWcsCi5tanItdmlld2VyLXNpbmdsZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzOwp9CgoubWpyLXZpZXdlci1hYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgZ2FwOiAycHg7Cn0KCi5tanItdmlld2VyLXNpZGVieXNpZGUgPiBkaXYgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlIGltZywKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKfQoKLm1qci12aWV3ZXItZm9vdGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMnB4IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgY29sb3I6IHdoaXRlOwogICAgZ2FwOiAyMHB4Owp9CgoubWpyLXZpZXdlci1mb290ZXIgYnV0dG9uIHsKICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBjb2xvcjogd2hpdGU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKfQoKLm1qci12aWV3ZXItZm9vdGVyIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItdmlld2VyLW5hdiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTRweDsKfQoKLm1qci12aWV3ZXItbmF2LWJ0biB7CiAgICB3aWR0aDogNDBweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiA0MHB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuNDIpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4xOCksIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4wNykpLAogICAgICAgIHJnYmEoMzQsIDM4LCA0NCwgMC45MikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDIzNCwgMjM2LCAyNDAsIDAuOTYpICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDIwcHggIWltcG9ydGFudDsKICAgIGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDAuMTRzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjE0cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE0cyBlYXNlICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLW5hdi1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNTYpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA3LCAyMTIsIDIxOSwgMC4yKSwgcmdiYSgyMDcsIDIxMiwgMjE5LCAwLjEpKSwKICAgICAgICByZ2JhKDM5LCA0MywgNDksIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjphY3RpdmU6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDAuOTgpOwogICAgZmlsdGVyOiBub25lOwp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuMzQgIWltcG9ydGFudDsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuMjUpOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1pbmRleCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBtaW4td2lkdGg6IDc0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGNvbG9yOiByZ2JhKDIyNiwgMjI4LCAyMzMsIDAuOTQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTcsIDIwMywgMjExLCAwLjE1KSwgcmdiYSgxOTcsIDIwMywgMjExLCAwLjA2KSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NywgMjAzLCAyMTEsIDAuMzQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBwYWRkaW5nOiA1cHggMTFweDsKICAgIHRleHQtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwp9CgoubWpyLXZpZXdlci1wbGF5ZXJiYXIgewogICAgYm9yZGVyLXJhZGl1czogMThweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgdG9wIGxlZnQsIHJnYmEoOTAsIDE1MCwgMjU1LCAwLjA4KSwgdHJhbnNwYXJlbnQgMzYlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDIwLCAyNCwgMzAsIDAuOTQpLCByZ2JhKDEyLCAxNSwgMjEsIDAuOTgpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLAogICAgICAgIDAgMTZweCAzNnB4IHJnYmEoMCwgMCwgMCwgMC4yMik7CiAgICAvKiBvdmVyZmxvdyBtdXN0IHN0YXkgdmlzaWJsZSBzbyB0aGUgc2VlayBydWxlciB0aWNrcy9sYWJlbHMgKHRvcDotMTZweCAvIHRvcDotMzRweCkKICAgICAgIHRoYXQgYXJlIGFic29sdXRlbHkgcG9zaXRpb25lZCBhYm92ZSB0aGUgc2VlayBiYXIgYXJlIG5vdCBjbGlwcGVkLiAqLwogICAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5tanItdmlld2VyLXRvb2xzIHsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZXdlci1oZWFkZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoubWpyLXZpZXdlci1oZWFkZXI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMThweDsKICAgIHJpZ2h0OiAxOHB4OwogICAgdG9wOiA0NHB4OwogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHRyYW5zcGFyZW50LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLCB0cmFuc3BhcmVudCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDAuNzsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEgewogICAgbWluLWhlaWdodDogMzBweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nLXJpZ2h0OiA4NHB4OwogICAgcGFkZGluZy1sZWZ0OiAxMnB4Owp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tbGVmdCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMSAxIDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGZsZXg6IDEgMSAwOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItdGl0bGUtd3JhcCB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogbWluKDEwMCUsIGNhbGMoMTAwdncgLSAyMjBweCkpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKfQoKLm1qci12aWV3ZXItdGl0bGUtbGluZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW46IDAgYXV0bzsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItYmFkZ2VzIHsKICAgIGdhcDogNHB4Owp9CgoubWpyLXZpZXdlci10aXRsZS1saW5lIC5tanItdmlld2VyLWJhZGdlcyB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0OmVtcHR5IHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICBqdXN0aWZ5LXNlbGY6IGVuZDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIG1heC13aWR0aDogMTAwJTsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgcGFkZGluZzogM3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIHJnYmEoMTAsIDEyLCAxNiwgMC4yNCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwKICAgICAgICAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4xMik7CiAgICBwYWRkaW5nOiA1cHggNnB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMCAwIGF1dG8gMDsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSwgdHJhbnNwYXJlbnQpOwogICAgb3BhY2l0eTogMC43OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWhlYWQgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtaGVhZGluZyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMXB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1leWVicm93IHsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjE0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Nik7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgY29sb3I6IHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45Nik7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJncmFkZSJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0ib3ZlcmxheSJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHksCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9ImFjdGlvbnMiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5LAoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJpbmZvIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cCB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIHJnYmEoMTAsIDEyLCAxNiwgMC4xOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7CiAgICBtaW4td2lkdGg6IGZpdC1jb250ZW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjE1cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW3N0eWxlKj0iLS1tanItZ3JvdXAtYWNjZW50Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuOSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW3N0eWxlKj0iLS1tanItZ3JvdXAtYWNjZW50Il0gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjM1KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY2hhbm5lbCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBtaW4td2lkdGg6IDQycHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Im92ZXJsYXkiXSAubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIHsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSB7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgYWxpZ24tY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjaGFubmVsIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImV4cG9zdXJlIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImdhbW1hIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYXVkaW8tdml6Il0gewogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb25zLAoubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgIHdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMzBweDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uLS1wcmltYXJ5IHsKICAgIG1hcmdpbi1sZWZ0OiAwOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb24gKyAubWpyLXZpZXdlci10b29scy1hY3Rpb24gewogICAgbWFyZ2luLWxlZnQ6IDRweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlLWlucHV0IHsKICAgIHdpZHRoOiA5MnB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlIHNwYW4gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogMTQ4MHB4KSB7CiAgICAubWpyLXZpZXdlci10b29scy1kZWNrIHsKICAgICAgICBnYXA6IDZweDsKICAgIH0KfQoKQG1lZGlhIChtYXgtd2lkdGg6IDEyMjBweCkgewogICAgLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDg0cHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAwOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtcGFuZWwsCiAgICAubWpyLXZpZXdlci10b29scy1hY3Rpb25zLAogICAgLm1qci12aWV3ZXItdG9vbHMtbWV0YSwKICAgIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXVtkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMSk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC42KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjIyKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY29tcGFyZSJdW2RhdGEtYWN0aXZlPSIxIl0gLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC42KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjE4KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0OmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg2NCwgMTYwLCAyNTUsIDAuMjIpOwp9CgovKiBOYXRpdmUgZHJvcGRvd25zOiBoaW50IGRhcmsgVUkgYW5kIHN0eWxlIG9wdGlvbnMgd2hlbiB0aGUgYnJvd3NlciBhbGxvd3MgaXQuICovCi5tanItdmlld2VyLWhlYWRlciB7CiAgICBjb2xvci1zY2hlbWU6IGRhcms7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQ2KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45MikgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogOHB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCBvcHRpb24gewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZS1pbnB1dDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXZpZXdlci10b29sLWJ0bi0tcmVzZXQgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuIHsKICAgIG1pbi1oZWlnaHQ6IDI0cHggIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXdpZHRoOiAxcHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA3NSksCiAgICAgICAgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyNSkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjE2KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwIDhweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4yNCkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjEpLAogICAgICAgIHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4wMzUpCiAgICApICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjU1LCAxNjYsIDkyLCAwLjIyKSwKICAgICAgICByZ2JhKDI1NSwgMTE2LCA2NCwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE2MCwgOTIsIDAuMzQpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIzNiwgMjI0LCAwLjk2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDI1NSwgMTgwLCAxMDgsIDAuMjgpLAogICAgICAgIHJnYmEoMjU1LCAxMjgsIDcyLCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTg0LCAxMTYsIDAuNDYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoOTIsIDIxOSwgMTg2LCAwLjIyKSwKICAgICAgICByZ2JhKDQ0LCAxNzAsIDE0NCwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5MiwgMjE5LCAxODYsIDAuMzQpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMjQsIDI1NSwgMjQ4LCAwLjk2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEwMiwgMjMwLCAxOTYsIDAuMjgpLAogICAgICAgIHJnYmEoNTIsIDE4MiwgMTU2LCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDExMCwgMjM2LCAyMDIsIDAuNDYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEyNCwgMTY2LCAyNTUsIDAuMjIpLAogICAgICAgIHJnYmEoMTA5LCA4OCwgMjIyLCAwLjA4KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEzMiwgMTcwLCAyNTUsIDAuMzYpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0MiwgMjU1LCAwLjk3KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMzgsIDE4MCwgMjU1LCAwLjMpLAogICAgICAgIHJnYmEoMTI0LCAxMDAsIDIzMiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxNDgsIDE4OCwgMjU1LCAwLjQ4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGZpbHRlcjogc2F0dXJhdGUoMS4xMikgYnJpZ2h0bmVzcygxLjA0KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksCiAgICAgICAgMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWhlbHAgewogICAgYm9yZGVyLXJhZGl1czogMTRweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMywgMTcsIDIyLCAwLjk2KSwgcmdiYSg4LCAxMSwgMTYsIDAuOTgpKSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCAxOHB4IDM0cHggcmdiYSgwLCAwLCAwLCAwLjM0KSAhaW1wb3J0YW50Owp9CgpAbWVkaWEgKG1heC13aWR0aDogMTIyMHB4KSB7CiAgICAubWpyLXZpZXdlci10b29scyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucyB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tbGVmdCwKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0LAogICAgLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1ib2R5IHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIyMHB4LCAxZnIpKTsKICAgIH0KfQoKLyogPT09PT09PT09PSBDdXN0b20gVmlkZW8gQ29udHJvbHMgKG5vIG5hdGl2ZSBiYXIpID09PT09PT09PT0gKi8KLm1qci12aWRlby1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci12aWRlby1jb250cm9scyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMnB4OwogICAgcmlnaHQ6IDEycHg7CiAgICBib3R0b206IDEycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIG9wYWNpdHk6IDA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZTsKICAgIHotaW5kZXg6IDU7Cn0KCi5tanItdmlkZW8tcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdhcDogMTJweDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG8gMWZyIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG8gMWZyIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tcHJldmlldyAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgZ2FwOiA4cHg7Cn0KCi5tanItdmlkZW8tZ3JvdXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLW51bSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogNXB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci12aWRlby1udW06Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzgpOwp9CgoubWpyLXZpZGVvLW51bS0tc3BlZWQgewogICAgY29sb3Itc2NoZW1lOiBkYXJrOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLXZpZGVvLW51bS0tc3BlZWQgb3B0aW9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwp9CgoubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBtaW4td2lkdGg6IDUycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLWZyYW1lLmlzLXN0ZXAgewogICAgY29sb3I6ICNmZmQyNGQ7Cn0KCi5tanItdmlkZW8tYm90dG9tIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxOwp9CgoubWpyLXZpZGVvLWJvdHRvbS0tbGVmdCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7Cn0KCi5tanItdmlkZW8tYm90dG9tLS1yaWdodCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi8qIFNob3cgY29udHJvbHMgb24gaG92ZXIvZm9jdXMgKHZpZXdlcikuICovCi5tanItdmlkZW8taG9zdDpob3ZlciAubWpyLXZpZGVvLWNvbnRyb2xzLAoubWpyLXZpZGVvLWNvbnRyb2xzOmZvY3VzLXdpdGhpbiB7CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi8qIFByZXZpZXc6IGtlZXAgY29udHJvbHMgdmlzaWJsZSBiZWNhdXNlIHRoZSBhcmVhIGlzIHNtYWxsLiAqLwoubWpyLXZpZGVvLWNvbnRyb2xzLS1wcmV2aWV3IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMTBweDsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogMTBweDsKICAgIG9wYWNpdHk6IDE7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IGF1dG87CiAgICBiYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogbm9uZTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biB7CiAgICB3aWR0aDogMzhweDsKICAgIGhlaWdodDogMzhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZGVvLXByZXZpZXctYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tYnRuIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgY29sb3I6ICNmZmY7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwp9CgoubWpyLXZpZGVvLWJ0bi5pcy1vbiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxNjAsIDI1NSwgMC4yNSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjU1KTsKfQoKLm1qci12aWRlby1idG4tLWluIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3MCwgMjU1LCAxMjAsIDAuNTUpOwogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuMTIpOwp9CgoubWpyLXZpZGVvLWJ0bi0taW46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuMTgpOwp9CgoubWpyLXZpZGVvLWJ0bi0tb3V0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDcwLCA3MCwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjEpOwp9CgoubWpyLXZpZGVvLWJ0bi0tb3V0OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMTYpOwp9CgoubWpyLXZpZGVvLXRpbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIG1pbi13aWR0aDogOTJweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC45Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC4xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNjQsIDE5MCwgMjU1LCAwLjI1KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgcGFkZGluZzogMXB4IDhweDsKICAgIGxpbmUtaGVpZ2h0OiAxNnB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlIHsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwogICAgLyogV2UgZHJhdyBvdXIgb3duIHBsYXloZWFkL21hcmtlcnM7IGhpZGUgdGhlIG5hdGl2ZSB0aHVtYiAiZG90Ii4gKi8KICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWs6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWluLXdpZHRoOiA4MHB4OwogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKfQoKLyogMC4uSW46IHRyaW1tZWQtb3V0IHJhbmdlLiAqLwoubWpyLXZpZGVvLXNlZWstem9uZS0tbGVmdFRyaW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xOCk7Cn0KCi8qIEluLi5PdXQ6IHNlbGVjdGVkIHBsYXliYWNrIHJhbmdlIGhpZ2hsaWdodC4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjQsIDE5MCwgMjU1LCAwLjU1KTsKfQoKLm1qci12aWRlby1zZWVrLXpvbmVzLmlzLWZ1bGxyYW5nZSAubWpyLXZpZGVvLXNlZWstem9uZS0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKfQoKLyogT3V0Li5FbmQ6IHNob3cgb3V0LW9mLXJhbmdlIGZyYW1lcyBhcyBhIGRpZmZlcmVudCBjb2xvci4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLXJpZ2h0VHJpbSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjIpOwp9CgoubWpyLXZpZGVvLXNlZWstb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IDUwJTsKICAgIGhlaWdodDogMDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMzsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB6LWluZGV4OiA0OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGU6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YWZ0ZXIsCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDUwJTsKICAgIHdpZHRoOiAycHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YWZ0ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YmVmb3JlLAoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YmVmb3JlIHsKICAgIHRvcDogNHB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjpiZWZvcmUgewogICAgYm90dG9tOiA0cHg7CiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItdG9wOiA2cHggc29saWQgcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay10aWNrcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IC0xNnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci12aWRlby1zZWVrLWxhYmVscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IC0zNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC41NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXZpZGVvLXNlZWstcGxheWhlYWQtbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgcGFkZGluZzogMXB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0xMHB4OwogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB0b3VjaC1hY3Rpb246IG5vbmU7CiAgICB6LWluZGV4OiA0OwogICAgLS1tanItbWFyay1jb2xvcjogcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1pbiB7CiAgICAtLW1qci1tYXJrLWNvbG9yOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLW1hcmstY29sb3IpOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHZhcigtLW1qci1tYXJrLWNvbG9yKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmstLWluOjphZnRlciB7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tanItbWFyay1jb2xvcik7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1vdXQ6OmFmdGVyIHsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogLTVweDsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICBib3JkZXItdG9wOiA2cHggc29saWQgdmFyKC0tbWpyLW1hcmstY29sb3IpOwp9CgoubWpyLXZpZGVvLXNlZWstcGxheWhlYWQgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMTJweDsKICAgIHdpZHRoOiAycHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjAwLCA3MCwgMC45NSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMXB4KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIHsKICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IGF1dG87CiAgICBib3R0b206IGF1dG87CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOiAxOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEyKTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCB0b3AgbGVmdCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKSwgdHJhbnNwYXJlbnQgMzQlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5OCwgMjAzLCAyMTAsIDAuMDI1KSwgcmdiYSgxOTgsIDIwMywgMjEwLCAwLjAwOCkpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxNjVkZWcsIHJnYmEoMTgsIDIyLCAyOCwgMC44MiksIHJnYmEoMTIsIDE1LCAyMSwgMC45KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwKICAgICAgICAwIDEwcHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0biB7CiAgICBtaW4taGVpZ2h0OiAzOHB4OwogICAgcGFkZGluZzogOHB4IDEycHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA3KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOCwgMC4xOCk7CiAgICBib3JkZXItd2lkdGg6IDFweDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDAuMTJzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjEycyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xMnMgZWFzZTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjI2KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuLmlzLW9uIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTAwLCAxNzAsIDI1NSwgMC4yKSwgcmdiYSgxMDAsIDE3MCwgMjU1LCAwLjA4KSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTIwLCAxODYsIDI1NSwgMC40Mik7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgxMjAsIDE4NiwgMjU1LCAwLjEyKSBpbnNldDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuIC5waSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpIGF1dG8gbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDEycHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc3RhdHVzLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc2lkZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWNlbnRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc2lkZS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gbWlubWF4KDAsIDFmcikgYXV0bzsKICAgIGdhcDogMTJweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLW1lZGlhLWJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSg3OCwgMjI0LCAxOTYsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3OCwgMjI0LCAxOTYsIDAuMjIpOwogICAgY29sb3I6IHJnYmEoMjIwLCAyNDcsIDI0MSwgMC45Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQ1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWUsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBjb2xvcjogcmdiYSgyMjgsIDIzMCwgMjM0LCAwLjkyKTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IDk0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgY29sb3I6IHJnYmEoMjIyLCAyMjUsIDIzMCwgMC45NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4yNik7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxOTQsIDIwMSwgMjA5LCAwLjA4KTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cCB7CiAgICBtaW4taGVpZ2h0OiAzNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtbGVmdCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLWFkanVzdC1yaWdodCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLXNwZWVkIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1udW0gewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDksIDEyLCAxNiwgMC41NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4tLXBsYXkgewogICAgbWluLXdpZHRoOiA4OHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi1oZWlnaHQ6IDQ0cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdm9sdW1lLXdyYXAgewogICAgcGFkZGluZzogMCA0cHg7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXZvbHVtZSB7CiAgICB3aWR0aDogOTBweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDk4MHB4KSB7CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGdhcDogMTBweDsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgfQp9CgovKiA9PT09PT09PT09IENvbnRleHQgTWVudSBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLWNvbnRleHQtbWVudSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAvKiBBYm92ZSB2aWV3ZXIgb3ZlcmxheSAoMTAwMDEpIGFuZCBNRlYgZGlhbG9nICgxMDAwMCkgKi8KICAgIHotaW5kZXg6IDEwMDAyOwogICAgZGlzcGxheTogbm9uZTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYW5pbWF0aW9uOiBtanItY29udGV4dC1tZW51LWluIDAuMTVzIGVhc2Utb3V0Owp9CgoubWpyLWNvbnRleHQtbWVudSwKLm1qci1jb250ZXh0LW1lbnUgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpAa2V5ZnJhbWVzIG1qci1jb250ZXh0LW1lbnUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW06aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLWRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc2VwYXJhdG9yIHsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyLWNvbG9yKTsKICAgIG1hcmdpbjogNHB4IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1hcmdpbi1sZWZ0OiAxNnB4Owp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLWxlZnQgaSB7CiAgICB3aWR0aDogMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDAuODI7Cn0KCi5tanItY29udGV4dC1tZW51LWhpbnQgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItY29udGV4dC1tZW51LXN1Ym1lbnUtYXJyb3cgewogICAgb3BhY2l0eTogMC43MjsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFkZC10by1jb2xsZWN0aW9uLW1lbnUgewogICAgbWluLXdpZHRoOiAyNjBweDsKICAgIG1heC13aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMTZweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEycHgpOwp9CgoubWpyLWNvbnRleHQtbWVudS10aXRsZSB7CiAgICBwYWRkaW5nOiA4cHggMTRweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvcik7CiAgICBvcGFjaXR5OiAwLjkyOwp9CgoubWpyLWNvbnRleHQtbWVudS1ub3RlIHsKICAgIHBhZGRpbmc6IDEwcHggMTRweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1Owp9CgoubWpyLWdyaWQtcG9wb3ZlciwKLm1qci12aWV3ZXItcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI1MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItdmlld2VyLW92ZXJsYXkgKiwKICAgIC5tanItdmlkZW8tY29udHJvbHMsCiAgICAubWpyLWNvbnRleHQtbWVudSB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogYXV0byAhaW1wb3J0YW50OwogICAgfQp9CgovKiBIaWRlIGhlYWRlciAodG9vbGJhcikgd2hlbiB2aWV3ZXIgb3ZlcmxheSBpcyBpbiBmdWxsc2NyZWVuICovCi5tanItdmlld2VyLW92ZXJsYXk6ZnVsbHNjcmVlbiAubWpyLXZpZXdlci1oZWFkZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIE1ham9vciBGbG9hdGluZyBWaWV3ZXIgKE1GVikg4oCUIHBvcnRhbGVkIHRvIGRvY3VtZW50LmJvZHkKICAgUmVkZWNsYXJlcyBDU1MgdmFyaWFibGVzIHNvIHRoZSBwYW5lbCB3b3JrcyBvdXRzaWRlIC5tanItYXNzZXRzLW1hbmFnZXIKICAgKHNhbWUgcGF0dGVybiBhcyAubWpyLXBvcG92ZXIpCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLm1qci1tZnYgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1jb250ZW50LWJnLCAjMWUxZTFlKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWNvbWZ5LW1lbnUtc2Vjb25kYXJ5LWJnLCAjMzMzKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpOwogICAgLS1tanItc3RhdHVzLXN1Y2Nlc3M6IHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKTsKCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgIC8qIFZpc3VhbCBjaHJvbWUgKi8KICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjU1KSwKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLW1mdiAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCmh0bWwubWpyLW1mdi1wb3BvdXQtZG9jdW1lbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIDEyMDBweCA0MjBweCBhdCA1MCUgMCUsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJSwKICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50CiAgICAgICAgICAgICksCiAgICAgICAgICAgIHRyYW5zcGFyZW50IDYyJQogICAgICAgICksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgdmFyKC0tY29udGVudC1iZywgIzE2MTkxZikpIDgyJSwKICAgICAgICAgICAgICAgICMwMDAgMTglCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMWYyMjI3KSkgODQlLAogICAgICAgICAgICAgICAgIzAwMCAxNiUKICAgICAgICAgICAgKQogICAgICAgICk7Cn0KCmJvZHkubWpyLW1mdi1wb3BvdXQtYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKI21qci1tZnYtcG9wb3V0LXJvb3QsCi5tanItbWZ2LXBvcG91dC1yb290IHsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLyog4pSA4pSAIEhlYWRlciAoZHJhZyBoYW5kbGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgY3Vyc29yOiBtb3ZlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMzRweDsKfQoKLm1qci1tZnYtaGVhZGVyLXRpdGxlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZmxleDogMTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjI4cHg7Cn0KCi8qIOKUgOKUgCBUb29sYmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzZweDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKfQoubWpyLW1mdi10b29sYmFyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICB3aWR0aDogMXB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW46IDAgM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBoZWlnaHQ6IDIycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlOmhvdmVyIHsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjAzKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB3aWR0aDogMCU7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCA3MG1zIGVhc2UtaW4tb3V0Owp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLW5vZGVzIHsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjglLCAjMGIzNTEzIDMyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NCUsICMwYjIzNDAgMzYlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcywKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1zdGVwcyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2Q5NTM0ZiA3OCUsICM0YTE0MTQgMjIlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3Mtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC4xOCkpOwogICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGhlaWdodDogMTAwJTsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtc2hhZG93OiAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC45KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICB3aWR0aDogMjZweDsKICAgIGhlaWdodDogMjZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDglKTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0MiUsIHZhcigtLW1qci1hY2NlbnQpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIOKUgOKUgCBQaW4gZ3JvdXA6IG5vdyBhIGRyb3Bkb3duIG1lbnUgKGRpc3BsYXk6bm9uZSBieSBkZWZhdWx0LCBmbGV4IHdoZW4gLmlzLW9wZW4pIOKUgOKUgCAqLwoubWpyLW1mdi1waW4tZ3JvdXAgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogY2FsYygxMDAlICsgNHB4KTsKICAgIGxlZnQ6IDA7CiAgICB6LWluZGV4OiAxMDAxMDsKICAgIG1pbi13aWR0aDogNzBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7Cn0KLm1qci1tZnYtcGluLWdyb3VwLmlzLW9wZW4gewogICAgZGlzcGxheTogZmxleDsKfQoubWpyLW1mdi1waW4tYnRuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9Ci5tanItbWZ2LXBpbi1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2LXBpbi1idG4uaXMtcGlubmVkIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDQyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNTglKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiDilIDilIAgSWNvbiBEcm9wZG93biBjb21wb25lbnQgKC5tanItbWZ2LWlkcm9wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtaWRyb3AgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LWlkcm9wLW1lbnUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItbWZ2LWlkcm9wLW1lbnUuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLW1mdi1pZHJvcC1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLW1mdi1pZHJvcC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbS5pcy1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1pZHJvcC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogQ2hhbm5lbCB0cmlnZ2VyOiBzbGlnaHRseSB3aWRlciB0byBmaXQgIlJHQiIgKi8KLm1qci1tZnYtY2gtbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBUb29sYmFyIGljb24tYnV0dG9uIHBvcG92ZXJzIChjaGFubmVsLCBndWlkZXMsIHBpbiwgZm9ybWF0IOKAlCBzb3J0LXN0eWxlIGNvbnRleHQgbWVudXMpICovCi5tanItbWZ2LWNoLXBvcG92ZXIsCi5tanItbWZ2LWd1aWRlcy1wb3BvdmVyLAoubWpyLW1mdi1waW4tcG9wb3ZlciwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbWluLXdpZHRoOiAxMjBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgei1pbmRleDogMTAwMTA7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItbWZ2LWNoLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZ3VpZGVzLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtcGluLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBibG9jazsKfQovKiBUb29sYmFyIGljb24gaW1hZ2VzIOKAlCBjaCBpY29uIGlzIGJsYWNrIChpbnZlcnRlZCksIGd1aWRlcyBpY29uIGlzIG5hdGl2ZSB3aGl0ZSAqLwoubWpyLW1mdi1jaC1pY29uIHsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgZmlsdGVyOiBpbnZlcnQoMSk7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtZ3VpZGVzLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtY2gtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWd1aWRlcy10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtcGluLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1mb3JtYXQtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAhaW1wb3J0YW50Owp9Ci8qIFBpbiBzbG90IGFjdGl2ZSBzdGF0ZSAqLwoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTYpOwogICAgY29sb3I6ICNhOGQ4ZmY7Cn0KLm1qci1tZnYtcGluLXBvcG92ZXIgLm1qci1tZW51LWl0ZW0uaXMtcGlubmVkIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDEgIWltcG9ydGFudDsKfQovKiBGb3JtYXQgcG9wb3Zlcjogc2VwYXJhdG9yICsgb3BhY2l0eSBzbGlkZXIgcm93ICovCi5tanItbWZ2LWZvcm1hdC1zZXAgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgbWFyZ2luOiA0cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4IDJweDsKfQoubWpyLW1mdi1mb3JtYXQtc2xpZGVyLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZmxleC1zaHJpbms6IDA7Cn0KLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA3MHB4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBvcGFjaXR5OiAwLjY1OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMzBweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qIFVuaXZlcnNhbCBhY3RpdmUgaGlnaGxpZ2h0IOKAlCBhbnkgYXJpYS1wcmVzc2VkPSJ0cnVlIiBidXR0b24gZ2V0cyBhY2NlbnQgZ2xvdy4KICAgUGxhY2VkIGJlZm9yZSB0aGUgY29sb3JlZCBhY3RpdmUgY2xhc3NlcyBzbyB0aGV5IGNhbiBvdmVycmlkZSB3aXRoIHRoZWlyIG93biBjb2xvci4gKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0blthcmlhLXByZXNzZWQ9InRydWUiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAxMiUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiBQb3AtaW4gbW9kZSAodmlld2VyIHBvcHBlZCBvdXQpOiByYWlzZSBidXR0b24gY29udHJhc3QvYnJpZ2h0bmVzcyAqLwoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDI0cHggNTZweCByZ2JhKDAsIDAsIDAsIDAuNDIpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkwJSwgcmdiYSgwLCAwLCAwLCAwLjI0KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlci10aXRsZSB7CiAgICBvcGFjaXR5OiAwLjk4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXByb2dyZXNzIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzBhMTExOCAxOCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MiUsICMwMDAgOCUpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWNvbnRlbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIGNpcmNsZSBhdCB0b3AsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNDIlCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODIlLCAjMDAwIDE4JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB2YXIoLS1tanItYWNjZW50KSA0MiUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2MiUsIHZhcigtLW1qci1hY2NlbnQpIDM4JSkKICAgICk7CiAgICBjb2xvcjogI2Y0ZjhmZiAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biAucGkgewogICAgb3BhY2l0eTogMTsKICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgI2ZmZmZmZiA0MCUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSg3NiwgMTc1LCA4MCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDI1NSwgMTUyLCAwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDkyJSwgI2ZmZmZmZiA4JSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTYlLCB2YXIoLS1tanItYWNjZW50KSA0NCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUsIHZhcigtLW1qci1hY2NlbnQpIDM2JSkKICAgICk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDk0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDk0JSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA4MiUsIHZhcigtLW1qci1tdXRlZCkgMTglKTsKICAgIG9wYWNpdHk6IDAuODg7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4NiUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSksCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4NiUsIHJnYmEoMCwgMCwgMCwgMC4xNCkpCiAgICAgICAgKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXdpZGdldC1sYWJlbCwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1lbXB0eSwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODQlLCAjZmZmZmZmIDE2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3NCUsICMwNTA3MGEgMjYlKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMCUpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcG9waW4tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDQ1JSwgdmFyKC0tbWpyLWFjY2VudCkgNTUlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiDilIDilIAgQ29udGVudCB3cmFwcGVyIChob3Jpem9udGFsIGZsZXg6IGNvbnRlbnQgKyBzaWRlYmFyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtY29udGVudC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIOKUgOKUgCBTaWRlYmFyIHBvc2l0aW9uIHZhcmlhbnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXIgewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGhlaWdodCAwLjJzIGVhc2UsCiAgICAgICAgd2lkdGggMHM7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhci5vcGVuIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAyMjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgIG1heC1oZWlnaHQ6IDY1JTsKfQoKLyog4pSA4pSAIENvbnRlbnQgYXJlYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMCAwIDMyMHB4OwogICAgd2lkdGg6IDMyMHB4OwogICAgbWluLXdpZHRoOiAyMTBweDsKICAgIG1heC13aWR0aDogbWluKDQyJSwgNDIwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMTgsIDIwLCAwLjk2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBmbGV4OiAwIDAgMTgwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZy10b3A6IDhweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7CiAgICBwYWRkaW5nLXRvcDogMDsKICAgIGJvcmRlci10b3A6IG5vbmU7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWhlYWRpbmcgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tdGltZS1iYWRnZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjQyKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjE2KSwgcmdiYSg3NiwgMTc1LCA4MCwgMC4xKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjEyKSBpbnNldDsKICAgIGN1cnNvcjogY29weTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE2cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE2cyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtbGFiZWwgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtdmFsdWUgewogICAgY29sb3I6ICNlMGZmN2E7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKfQoKLm1qci1tZnYtZ2VuLWNhcmQgewogICAgLS1tanItbWZ2LWdlbi1hY2NlbnQ6ICMyMTk2ZjM7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDQ1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDEzNWRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSAxNiUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpIDEwMCUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgMTQlLCB0cmFuc3BhcmVudCkgaW5zZXQ7CiAgICBjdXJzb3I6IGNvcHk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1zZWVkIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYm9yZGVyLXdpZHRoOiAycHg7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC10aXRsZSwKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQ6aG92ZXIsCi5tanItbWZ2LWdlbi10aW1lLWJhZGdlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgNzAlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgMjQlLCB0cmFuc3BhcmVudCkKICAgICAgICBpbnNldDsKfQoKLm1qci1tZnYtZ2VuLWNvcHktZmxhc2ggewogICAgYmFja2dyb3VuZDogcmdiYSg3NiwgMTc1LCA4MCwgMC4yOCkgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1tdWx0aWxpbmUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tc2VlZCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1nZW4tZmllbGQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDc4cHgsIGF1dG8pIDFmcjsKICAgIGdhcDogMTBweDsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLWxhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMTgwLCAxODAsIDE4MCwgMC43MikpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSk7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgZGl2Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLm1qci1tZnYtb3ZlcmxheS1jYW52YXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTI7Cn0KCi5tanItbWZ2LXRvb2xiYXItc2VsZWN0IHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICB3aWR0aDogNzJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgovKiBFViBzbGlkZXIgYWN0aXZlIHN0YXRlICh2YWx1ZSDiiaAgMCkgKi8KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBhY2NlbnQtY29sb3I6ICNmNWM4NDI7Cn0KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgY29sb3I6ICNmNWM4NDI7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwcHg7CiAgICBsZWZ0OiAxMHB4OwogICAgei1pbmRleDogNjsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMjBweCk7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSkgODglLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg1LCA4LCAxNCwgMC44NikgODYlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxNCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY3ZmEpOwogICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTZzIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzLmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgI2ZmNWM3YSkgNzIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg2MCwgMTAsIDE4LCAwLjkpIDgyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMSkgMTglKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MtdGV4dCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKLyog4pSA4pSAIFdvcmtmbG93IFNpZGViYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3Mtc2lkZWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMnMgZWFzZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMjYwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWluLXdpZHRoOiAxODBweDsKICAgIG1heC13aWR0aDogNjUlOwogICAgdHJhbnNpdGlvbjogbm9uZTsKfQoKLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9Ci5tanItd3Mtc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0KLm1qci13cy1zaWRlYmFyLWJvZHkgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMDsKfQoubWpyLXdzLXNpZGViYXItZW1wdHkgewogICAgcGFkZGluZzogMjRweCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgovKiDilIDilIAgVGFiIGJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci13cy10YWItYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItd3MtdGFiIHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNXMsCiAgICAgICAgY29sb3IgMC4xNXM7Cn0KCi5tanItd3MtdGFiOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKfQoKLm1qci13cy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKICAgIGNvbG9yOiAjNjM5YmZmOwp9CgovKiDilIDilIAgTm9kZXMgdGFiIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLXdzLW5vZGVzLXRhYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogR3JhcGggTWFwIHRhYiAqLwoubWpyLXdnbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDEwMCU7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbWFwLXdyYXAgewogICAgaGVpZ2h0OiAxOTBweDsKICAgIG1pbi1oZWlnaHQ6IDE1MHB4OwogICAgbWFyZ2luOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yMik7Cn0KCi5tanItd2dtLXByZXZpZXcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMyKTsKfQoKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1tZWRpYSwKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1wbGF5ZXItaG9zdCwKLm1qci13Z20tcHJldmlldyAubWpyLW1vZGVsM2QtaG9zdCwKLm1qci13Z20tcHJldmlldy1tZWRpYSB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwp9CgoubWpyLXdnbS1wcmV2aWV3LWVtcHR5IHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1jYW52YXMgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGN1cnNvcjogZ3JhYjsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKfQoKLm1qci13Z20tY2FudmFzOmFjdGl2ZSB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9CgoubWpyLXdnbS0tbGFyZ2UgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLW1hcC13cmFwIHsKICAgIGZsZXg6IDE7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgbWFyZ2luOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogMDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXN0YXR1cyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMHB4OwogICAgdG9wOiAxMHB4OwogICAgei1pbmRleDogMjsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tZGV0YWlscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMTBweDsKICAgIHRvcDogMTBweDsKICAgIGJvdHRvbTogMTBweDsKICAgIHotaW5kZXg6IDI7CiAgICB3aWR0aDogbWluKDMyMHB4LCAzOCUpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjAsIDI2LCAwLjg0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWFjdGlvbiB7CiAgICBtaW4taGVpZ2h0OiAzMHB4Owp9CgoubWpyLXdnbS0tbGFyZ2UgLm1qci13Z20tcGFyYW0gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1zdGF0dXMgewogICAgcGFkZGluZzogMCAxMHB4IDhweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7Cn0KCi5tanItd2dtLWRldGFpbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDAgOHB4IDEwcHg7Cn0KCi5tanItd2dtLW5vZGUtdGl0bGUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLW1ldGEgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1hcmdpbi10b3A6IC00cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoKLm1qci13Z20tYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICBnYXA6IDRweDsKfQoKLm1qci13Z20tYWN0aW9uIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA3cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNXB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5tanItd2dtLWFjdGlvbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjQ1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjEyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwp9CgoubWpyLXdnbS1hY3Rpb24uaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc2LCAxNzUsIDgwLCAwLjU1KTsKICAgIGNvbG9yOiByZ2JhKDE5MCwgMjU1LCAxOTYsIDAuOTYpOwp9CgoubWpyLXdnbS1wYXJhbXMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4OwogICAgbWFyZ2luLXRvcDogMnB4Owp9CgoubWpyLXdnbS1wYXJhbSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoNjRweCwgMC40MmZyKSBtaW5tYXgoMCwgMWZyKTsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNXB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItd2dtLXBhcmFtOmhvdmVyLAoubWpyLXdnbS1wYXJhbTpmb2N1cy12aXNpYmxlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdnbS1wYXJhbS5pcy1vayB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSg3OSwgMjEwLCAxMjUsIDAuMTYpOwp9CgoubWpyLXdnbS1wYXJhbS5pcy1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCA5MCwgOTAsIDAuNyk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjE2KTsKfQoKLm1qci13Z20tcGFyYW0ta2V5IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ4KTsKfQoKLm1qci13Z20tcGFyYW0tdmFsdWUgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwp9CgoubWpyLXdzLXNlYXJjaC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLXdzLXNlYXJjaC1pY29uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoIHsKICAgIGZsZXg6IDE7CiAgICBwYWRkaW5nOiA0cHggMjhweCA0cHggMjZweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44NSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXdzLXNlYXJjaDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yOCk7Cn0KCi5tanItd3Mtc2VhcmNoOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5OSwgMTU1LCAyNTUsIDAuNSk7Cn0KCi5tanItd3Mtc2VhcmNoLWNsZWFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXI6aG92ZXIgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItd3Mtbm9kZXMtbGlzdCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDRweCAwOwp9CgoubWpyLXdzLW5vZGUtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMTJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgbWluLWhlaWdodDogMzJweDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKfQoKLm1qci13cy1ub2RlLXJvdzpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXdzLW5vZGUtcm93LXR5cGUgewogICAgZmxleDogMTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLm1qci13cy1ub2RlLXJvdy10aXRsZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1heC13aWR0aDogODBweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLW5vZGUtbG9jYXRlIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgd2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcywKICAgICAgICBjb2xvciAwLjFzLAogICAgICAgIGJhY2tncm91bmQgMC4xczsKfQoKLm1qci13cy1ub2RlLXJvdzpob3ZlciAubWpyLXdzLW5vZGUtbG9jYXRlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGU6aG92ZXIgewogICAgY29sb3I6ICM2MzliZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xNSk7Cn0KCi8qIOKUgOKUgCBOb2RlIHNlY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLXdzLXRyZWUtaXRlbSB7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLm1qci13cy10cmVlLWl0ZW0gPiAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoubWpyLXdzLXRyZWUtaXRlbS0tc3ViZ3JhcGggewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDQlLCB0cmFuc3BhcmVudCA5NiUpOwp9Ci5tanItd3Mtbm9kZSB7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KLyogU3VidGxlIGhpZ2hsaWdodCB3aGVuIHRoaXMgbm9kZSBtYXRjaGVzIHRoZSBjdXJyZW50IGdyYXBoIHNlbGVjdGlvbi4gKi8KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDIxMCwgOTAsIDAuMDgpOwogICAgYm94LXNoYWRvdzogaW5zZXQgMnB4IDAgMCAwIHJnYmEoMjU1LCAyMTAsIDkwLCAwLjc1KTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZmZkNDVhIDE4JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgODIlKTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdHlwZSB7CiAgICBjb2xvcjogI2ZmZDQ1YTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdGl0bGUgewogICAgY29sb3I6IHJnYmEoMjU1LCAyMjQsIDEzMCwgMC44OCk7Cn0KLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLXRvZ2dsZSwKLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1sb2NhdGUsCi5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS1raW5kIHsKICAgIGNvbG9yOiAjZmZkNDVhOwp9Ci5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAxNHB4OwogICAgei1pbmRleDogMjsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiA0cHg7CiAgICBoZWlnaHQ6IDU2cHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE1cyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMC4xNXMgZWFzZTsKfQoKLm1qci13cy1zaWRlYmFyLm9wZW46aG92ZXIgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLmlzLXJlc2l6aW5nIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci1yZXNpemVyLmlzLWRyYWdnaW5nOjpiZWZvcmUgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci13cy1zaWRlYmFyLmlzLXJlc2l6aW5nIC5tanItd3Mtc2lkZWJhci1yZXNpemVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci1yZXNpemVyOmhvdmVyOjpiZWZvcmUsCi5tanItd3Mtc2lkZWJhci1yZXNpemVyLmlzLWRyYWdnaW5nOjpiZWZvcmUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM0KTsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9InJpZ2h0Il0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgcmlnaHQ6IDA7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJsZWZ0Il0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgbGVmdDogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhci1yZXNpemVyIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSA0MCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgNjAlCiAgICApOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzIGVhc2U7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzaWJsZSAubWpyLXdzLW5vZGUtaGVhZGVyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDI4JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA3MiUKICAgICk7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlLmlzLWNvbGxhcHNlZCAubWpyLXdzLW5vZGUtaGVhZGVyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDkyJQogICAgKTsKfQoubWpyLXdzLW5vZGUtdG9nZ2xlIHsKICAgIGZsZXg6IDAgMCBhdXRvOwp9Ci5tanItd3Mtbm9kZS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMXB4Owp9Ci5tanItd3Mtbm9kZS10eXBlIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ4KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci13cy1ub2RlLWtpbmQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1heC13aWR0aDogMTEwcHg7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDM4JSwgdHJhbnNwYXJlbnQgNjIlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDEyJSwgdHJhbnNwYXJlbnQgODglKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNzglLCAjZmZmZmZmIDIyJSk7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLm1qci13cy1ub2RlLWtpbmQgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoubWpyLXdzLW5vZGUta2luZC1jb3VudCB7CiAgICBtaW4td2lkdGg6IDE0cHg7CiAgICBwYWRkaW5nOiAwIDNweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODIpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5tanItd3Mtbm9kZS5pcy1jb2xsYXBzZWQgLm1qci13cy1ub2RlLWJvZHkgewogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLXdzLW5vZGUtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7Cn0KLm1qci13cy1ub2RlLWVtcHR5IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBwYWRkaW5nOiA0cHggMDsKfQoKLyog4pSA4pSAIE5lc3RlZCBub2RlcyAoaW5zaWRlIHN1YmdyYXBocykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3Mtbm9kZS0tbmVzdGVkIHsKICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgcmdiYSg5MSwgMTM4LCAyNDAsIDAuMzUpOwp9Ci5tanItd3Mtbm9kZS0tbmVzdGVkIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgcGFkZGluZy1sZWZ0OiAxNnB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNSUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTUlCiAgICApOwp9Ci5tanItd3Mtbm9kZS0tbmVzdGVkLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTAlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDkwJQogICAgKTsKfQoKLyog4pSA4pSAIFN1YmdyYXBoIGNoaWxkcmVuIGdyb3VwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLXdzLWNoaWxkcmVuLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA1cHggMTBweCA1cHggMjBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDYlLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDk0JQogICAgKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBvcGFjaXR5OiAwLjg7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQgMC4xcyBlYXNlOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlLS1uZXN0ZWQgewogICAgcGFkZGluZy1sZWZ0OiAyOHB4Owp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMiUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgODglCiAgICApOwp9Ci5tanItd3MtY2hpbGRyZW4tdG9nZ2xlW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBvcGFjaXR5OiAxOwp9Ci5tanItd3MtY2hpbGRyZW4gewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4yNSk7CiAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgcGFkZGluZy1sZWZ0OiA2cHg7Cn0KCi5tanItd3Mtd2lkZ2V0LXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IG5vbmU7CiAgICBwYWRkaW5nLXRvcDogMDsKfQoubWpyLXdzLXdpZGdldC1yb3ctLWJsb2NrIC5tanItd3Mtd2lkZ2V0LWlucHV0IHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3Mtd2lkZ2V0LWxhYmVsIHsKICAgIGZsZXg6IDAgMCA4MHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjU1KSk7CiAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLXdpZGdldC1pbnB1dCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItd3MtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgIzIyMik7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KLm1qci13cy10ZXh0YXJlYSB7CiAgICByZXNpemU6IG5vbmU7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKfQoubWpyLXdzLXRleHQtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLXdzLXRleHQtd3JhcHBlciAubWpyLXdzLXRleHRhcmVhIHsKICAgIHdpZHRoOiAxMDAlOwp9Ci5tanItd3MtZXhwYW5kLWJ0biB7CiAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDRweDsKICAgIG9wYWNpdHk6IDAuODsKfQoubWpyLXdzLWV4cGFuZC1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9Ci5tanItd3MtcmVhZG9ubHkgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5tanItd3MtY2hlY2tib3ggewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgbWFyZ2luLXRvcDogNHB4Owp9Ci5tanItd3MtdG9nZ2xlLWxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgovKiDilIDilIAgTG9jYXRlIGJ1dHRvbiBpbnNpZGUgbm9kZSBoZWFkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3MtbG9jYXRlIHsKICAgIHdpZHRoOiAyNHB4ICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDI0cHggIWltcG9ydGFudDsKICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIG9wYWNpdHk6IDAuNTsKfQoubWpyLXdzLWxvY2F0ZTpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiDilIDilIAgUnVuIGJ1dHRvbiBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtcnVuLWNvbnRyb2xzIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4Owp9Ci5tanItbWZ2LXJ1bi1idG4gLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApOwp9Ci5tanItbWZ2LXJ1bi1idG4ucnVubmluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KLm1qci1tZnYtcnVuLWJ0bi5zdG9wcGluZyAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmYTcyNik7Cn0KLm1qci1tZnYtcnVuLWJ0bi5lcnJvciAucGkgewogICAgY29sb3I6ICNmNDQzMzY7Cn0KCi5tanItbWZ2LXN0b3AtYnRuIC5waSB7CiAgICBjb2xvcjogI2VmNTM1MDsKfQoubWpyLW1mdi1zdG9wLWJ0bi5hY3RpdmUgLnBpIHsKICAgIGNvbG9yOiAjZmY4YTY1Owp9Ci5tanItbWZ2LXN0b3AtYnRuLnN0b3BwaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KTsKfQoKLyog4pSA4pSAIEZsb2F0aW5nIFZpZXdlciBzaW1wbGUgdmlkZW8gcGxheWVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1zaW1wbGUtcGxheWVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIuaXMtYXVkaW8gewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyMCUgMjAlLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4yKSwgcmdiYSgxOCwgMjAsIDI4LCAwLjk1KSk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYXVkaW8tYmFja2Ryb3AgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4ycHg7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBwYWRkaW5nOiAxOHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWNvbnRyb2xzIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEycHg7CiAgICByaWdodDogMTJweDsKICAgIGJvdHRvbTogMTJweDsKICAgIHotaW5kZXg6IDMwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDlweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2JhKDEwLCAxMCwgMTQsIDAuNzYpLCByZ2JhKDE2LCAxNiwgMjQsIDAuNTUpKTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItcm93IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWsgewogICAgLS1tanItc2Vlay1wY3Q6IDAlOwogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgdG8gcmlnaHQsCiAgICAgICAgI2ZmMmY1MiAwJSwKICAgICAgICAjZmYyZjUyIHZhcigtLW1qci1zZWVrLXBjdCksCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSB2YXIoLS1tanItc2Vlay1wY3QpLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgMTAwJQogICAgKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrOjotd2Via2l0LXNsaWRlci10aHVtYiB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIGJhY2tncm91bmQ6ICNmZjJmNTI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuIHsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4gLnBpIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0bi5pcy1kaXNhYmxlZCwKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrLmlzLWRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuNDU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItdGltZSB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1mcmFtZSB7CiAgICBtYXJnaW4tcmlnaHQ6IDJweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgei1pbmRleDogMzA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gewogICAgbGVmdDogOHB4OwogICAgcmlnaHQ6IDhweDsKICAgIGJvdHRvbTogOHB4OwogICAgcGFkZGluZzogOHB4OwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yb3ctLXRvcCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tdGltZWdyb3VwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tdGltZWdyb3VwIHsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tcm93LS1ib3R0b20sCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1yb3ctLWJvdHRvbSB7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWJvdHRvbSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJvdHRvbSB7CiAgICBmbGV4LXNocmluazogMTsKICAgIGZsZXgtd3JhcDogbm93cmFwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tdHJhbnNwb3J0LAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tZ3JvdXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1ncm91cCB7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXNlZWstd3JhcCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1iYXItdGltZWxpbmUsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1zZWVrLXdyYXAsCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgb3JkZXI6IC0xOwogICAgZmxleDogMSAxIDEwMCU7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1pbiwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1vdXQsCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0taW4sCi5tanItbWZ2LXBsYXllci1ob3N0CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdCiAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgLm1qci12aWRlby1ncm91cC0tb3V0IHsKICAgIGZsZXg6IDAgMSBhdXRvOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tcmFuZ2UtY291bnQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IGF1dG87Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1yYW5nZS1jb3VudCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgICBwYWRkaW5nOiAzcHggNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYnRuLS1pbiwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJ0bi0tb3V0LAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYnRuLS1tYXJrIHsKICAgIG1pbi13aWR0aDogMzJweDsKfQoKQGNvbnRhaW5lciAobWF4LXdpZHRoOiA5MDBweCkgewogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICAgICAgbGVmdDogOHB4OwogICAgICAgIHJpZ2h0OiA4cHg7CiAgICAgICAgYm90dG9tOiA4cHg7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tcm93LS10b3AgewogICAgICAgIGdhcDogOHB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdGltZWdyb3VwIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1yb3ctLWJvdHRvbSB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWJvdHRvbSB7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tZ3JvdXAgewogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0CiAgICAgICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyCiAgICAgICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgICAgICAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICAgICAgb3JkZXI6IC0xOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgfQp9CgpAY29udGFpbmVyIChtYXgtd2lkdGg6IDY4MHB4KSB7CiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgICAgICBwYWRkaW5nOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1idG4gewogICAgICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tbnVtIHsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRpbWUsCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWZyYW1lLAogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1yYW5nZS1jb3VudCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgfQp9CgovKiDilIDilIAgU2V0dGluZ3MgYnV0dG9uIGFjdGl2ZSBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDU1JSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKQogICAgKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDcwJSwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAxOCUKICAgICk7Cn0KLm1qci1tZnYtc2V0dGluZ3MtYnRuLmFjdGl2ZSAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9CgovKiDilIDilIAgQ2xvc2UgYnV0dG9uIChyZWQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG4gewogICAgY29sb3I6ICNlODUwNTA7Cn0KLm1qci1tZnYgLm1qci1tZnYtY2xvc2UtYnRuOmhvdmVyIHsKICAgIGNvbG9yOiAjZmY2YjZiOwogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMzIsIDgwLCA4MCwgMC4xNSk7Cn0KCi8qIOKUgOKUgCBFbXB0eSBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtZW1wdHkgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHg7Cn0KCi8qIOKUgOKUgCBDb21wYXJlIGxhYmVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNTgpOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgcGFkZGluZzogMnB4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMjA7CiAgICBsZXR0ZXItc3BhY2luZzogMC40cHg7Cn0KCi5tanItbWZ2LWxhYmVsLmxhYmVsLWxlZnQgewogICAgbGVmdDogOHB4Owp9Ci5tanItbWZ2LWxhYmVsLmxhYmVsLXJpZ2h0IHsKICAgIHJpZ2h0OiA4cHg7Cn0KCi8qIOKUgOKUgCBBQiBkaXZpZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1hYi1kaXZpZGVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIHdpZHRoOiAwLjVweDsKICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgIHotaW5kZXg6IDEwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgMC41cHggcmdiYSgwLCAwLCAwLCAwLjQpLAogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEwMG1zIGVhc2U7Cn0KCi5tanItbWZ2LWFiLWRpdmlkZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLW1mdi1hYi1kaXZpZGVyOmhvdmVyLAoubWpyLW1mdi1hYi1kaXZpZGVyOmFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIE1GViBHZW9tZXRyeSAmIExheW91dCBDbGFzc2VzIChyZXBsYWNlcyBpbmxpbmUgc3R5bGVzIGluIEZsb2F0aW5nVmlld2VyLmpzKQogICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KCi8qIE1haW4gTUZWIGNvbnRhaW5lciBnZW9tZXRyeSAqLwoubWpyLW1mdiB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IHZhcigtLW1qci1tZnYtdG9wLW9mZnNldCwgNjBweCk7CiAgICByaWdodDogMjBweDsKICAgIHdpZHRoOiA2NDBweDsKICAgIGhlaWdodDogMzYwcHg7CiAgICBtaW4td2lkdGg6IDIyMHB4OwogICAgbWluLWhlaWdodDogMTYwcHg7CiAgICAvKiBBbHdheXMgZmxleDsgdmlzaWJpbGl0eSArIG9wYWNpdHkgY29udHJvbCBzaG93L2hpZGUgc28gQ1NTIHRyYW5zaXRpb25zIHdvcmsuCiAgICAgICBwb2ludGVyLWV2ZW50czpub25lIHdoaWxlIGhpZGRlbiBwcmV2ZW50cyBhY2NpZGVudGFsIGludGVyYWN0aW9uLiAqLwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICByZXNpemU6IGJvdGg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgei1pbmRleDogMTAwMDA7CiAgICAvKiBIaWRkZW4gc3RhdGUgKi8KICAgIG9wYWNpdHk6IDA7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNnB4KSBzY2FsZSgwLjk4KTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCByaWdodDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdmlzaWJpbGl0eSAwcyBsaW5lYXIgMC4xOHM7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXJlc2l6aW5nIHsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLW1mdi5pcy12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgc2NhbGUoMSk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdHJhbnNmb3JtIDAuMThzIGVhc2Utb3V0LAogICAgICAgIHZpc2liaWxpdHkgMHMgbGluZWFyIDBzOwp9CgovKiBNZWRpYSBlbGVtZW50cyAoaW1nL3ZpZGVvKSBzaXppbmcgdmFyaWFudHMgKi8KLm1qci1tZnYtbWVkaWEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7Cn0KCi5tanItbWZ2LW1lZGlhLS1maXQtaGVpZ2h0IHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKfQoKLm1qci1tZnYtbWVkaWEtLWZpbGwgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwogICAgZGlzcGxheTogYmxvY2s7Cn0KCi8qIEF1ZGlvIGNhcmQgaW5zaWRlIE1GViAqLwoubWpyLW1mdi1hdWRpby1jYXJkIHsKICAgIHdpZHRoOiBtaW4oOTIlLCA1NjBweCk7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxNjBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpOwogICAgYm94LXNoYWRvdzogMCA2cHggMTZweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwp9CgoubWpyLW1mdi1hdWRpby1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWZ2LWF1ZGlvLWljb24gewogICAgY29sb3I6IHZhcigtLW1qci1iYWRnZS1hdWRpbywgI2ZmOTgwMCk7CiAgICBvcGFjaXR5OiAwLjk1Owp9CgoubWpyLW1mdi1hdWRpby10aXRsZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci1tZnYtYXVkaW8tcGxheWVyIHsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1mdi1zaWRlLXBhbmVsIC5tanItbWZ2LWF1ZGlvLWNhcmQsCi5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LWF1ZGlvLWNhcmQsCi5tanItbWZ2LWdyaWQtY2VsbCAubWpyLW1mdi1hdWRpby1jYXJkIHsKICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKfQoKLyogVmlkZW8gZWxlbWVudCBzcGVjaWZpYyBzdHlsZXMgKi8KLm1qci1tZnYtbWVkaWEtdmlkZW8gewogICAgLyogSW5oZXJpdHMgZnJvbSAubWpyLW1mdi1tZWRpYSBvciAubWpyLW1mdi1tZWRpYS0tZmlsbCAqLwp9CgovKiBOb2RlIFN0cmVhbSDigJQgY3VycmVudGx5LXN0cmVhbWVkIG5vZGUgYmFkZ2UgKHRvcC1sZWZ0IG9mIGNvbnRlbnQgYXJlYSwKICAgZm9sbG93aW5nIHRoZSBzYW1lIG92ZXJsYXkgcGF0dGVybiBhcyAubWpyLW1mdi1nZW5pbmZvKS4gKi8KLm1qci1tZnYtbm9kZS1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogOHB4OwogICAgbGVmdDogOHB4OwogICAgei1pbmRleDogMTI7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgIGNvbG9yOiAjZTZmM2ZmOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTIwLCAxNzAsIDI0MCwgMC40NSk7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAxNnB4KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLyogR2VuIGluZm8gb3ZlcmxheSDigJQgYWxsIG1vZGVzIHNoYXJlIGJhc2UgbGF5b3V0ICovCi5tanItbWZ2LWdlbmluZm8sCi5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgY29sb3I6ICNmZmY7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yLXk6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjQpOwp9CgovKiBLZWVwIEdlbiBJbmZvIGFib3ZlIGN1c3RvbSBzaW1wbGUtcGxheWVyIGNvbnRyb2xzIHdoZW4gcHJlc2VudC4gKi8KLm1qci1tZnYtZ2VuaW5mby5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciwKLm1qci1tZnYtZ2VuaW5mby1hLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyLAoubWpyLW1mdi1nZW5pbmZvLWIubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBGYWxsYmFjazogd2hlbiBzaW1wbGUtcGxheWVyIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgZ2VuaW5mbyBvdmVybGF5LAogICBtb3ZlIGl0IHVwIGV2ZW4gaWYgdGhlIG1vZGlmaWVyIGNsYXNzIHdhcyBub3QgYXR0YWNoZWQuICovCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyICsgLm1qci1tZnYtZ2VuaW5mby1iIHsKICAgIHRvcDogOHB4OwogICAgYm90dG9tOiBhdXRvOwogICAgbWF4LWhlaWdodDogbWluKDQ1JSwgY2FsYygxMDAlIC0gMTI0cHgpKTsKfQoKLyogQUIgbW9kZSBvdmVybGF5cyBhcmUgYXR0YWNoZWQgYXQgY29udGFpbmVyIGxldmVsOyBzaGlmdCB0aGVtIHdoZW4gQUIgbGF5ZXJzIHVzZSBzaW1wbGUtcGxheWVyLiAqLwoubWpyLW1mdi1hYi1jb250YWluZXI6aGFzKC5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LXNpbXBsZS1wbGF5ZXIpIC5tanItbWZ2LWdlbmluZm8tYSwKLm1qci1tZnYtYWItY29udGFpbmVyOmhhcygubWpyLW1mdi1hYi1sYXllciAubWpyLW1mdi1zaW1wbGUtcGxheWVyKSAubWpyLW1mdi1nZW5pbmZvLWIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBTaGFyZWQgc3R5bGUgZm9yIGFsbCBnZW4gaW5mbyBvdmVybGF5IHZhcmlhbnRzICovCi5tanItbWZ2LWdlbmluZm8gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tcmlnaHQ6IDRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOyAvKiBkZWZhdWx0IOKAlCBvdmVycmlkZGVuIHBlciBmaWVsZCBiZWxvdyAqLwp9CgovKiBQZXItZmllbGQgbGFiZWwgY29sb3JzICovCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9IC8qIGJsdWUgICDigJQgUHJvbXB0ICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmZDQ3YTsKfSAvKiBhbWJlciAg4oCUIFNlZWQgICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0gLyogZ3JlZW4gIOKAlCBNb2RlbCAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZDQ4Y2ZmOwp9IC8qIHZpb2xldCDigJQgTG9SQSAgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfSAvKiBvcmFuZ2Ug4oCUIFNhbXBsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY3YTlmOwp9IC8qIHBpbmsgICDigJQgU2NoZWR1bGVyICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhOWZmZjsKfSAvKiBpbmRpZ28g4oCUIENGRyAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcgewogICAgY29sb3I6ICM3YWZmZDQ7Cn0gLyogdGVhbCAgIOKAlCBTdGVwICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2UwZmY3YTsKfSAvKiBsaW1lICAg4oCUIEdlbiBUaW1lICovCgoubWpyLW1mdi1nZW5pbmZvIGRpdiwKLm1qci1tZnYtZ2VuaW5mby1hIGRpdiwKLm1qci1tZnYtZ2VuaW5mby1iIGRpdiB7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKfQoKLm1qci1tZnYtZ2VuaW5mbyBkaXY6bGFzdC1jaGlsZCwKLm1qci1tZnYtZ2VuaW5mby1hIGRpdjpsYXN0LWNoaWxkLAoubWpyLW1mdi1nZW5pbmZvLWIgZGl2Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLyogU2ltcGxlIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LXNpbXBsZS1jb250YWluZXIgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLyogQUIgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtYWItY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6ICMwMDA7Cn0KCi8qIEFCIG1vZGUgbGF5ZXJzICovCi5tanItbWZ2LWFiLWxheWVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci1tZnYtYWItbGF5ZXItLWIgewogICAgLyogY2xpcC1wYXRoIGFwcGxpZWQgaW5saW5lIGZvciBkeW5hbWljIGRpdmlkZXIgcG9zaXRpb24gKi8KfQoKLyogU2lkZS1ieS1zaWRlIG1vZGUgY29udGFpbmVyICovCi5tanItbWZ2LXNpZGUtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGdhcDogMnB4OwogICAgYmFja2dyb3VuZDogIzExMTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIFNpZGUtYnktc2lkZSBoYWxmIHBhbmVscyAqLwoubWpyLW1mdi1zaWRlLXBhbmVsIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7Cn0KCi8qIEdyaWQgY29tcGFyZSAoMsOXMikgY29udGFpbmVyICovCi5tanItbWZ2LWdyaWQtY29udGFpbmVyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmciAxZnI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGdhcDogMnB4OwogICAgYmFja2dyb3VuZDogIzExMTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIEdyaWQgY2VsbHMgKi8KLm1qci1tZnYtZ3JpZC1jZWxsIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIEdlbiBpbmZvIG92ZXJsYXlzIGZvciBncmlkIGNlbGxzIEMgYW5kIEQgKi8KLm1qci1tZnYtZ2VuaW5mby1jLAoubWpyLW1mdi1nZW5pbmZvLWQgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbWF4LWhlaWdodDogNDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7Cn0KCi5tanItbWZ2LWdlbmluZm8tYyBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgZm9yIEMvRCBnZW4gaW5mbyBvdmVybGF5cyAqLwoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmOWY3YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2FmZmQ0Owp9CgovKiBHZW4gaW5mbyBhY3RpdmUgc3RhdGUg4oCUIGJ1dHRvbiBnbG93cyB3aGVuIGF0IGxlYXN0IG9uZSBmaWVsZCBpcyBzZWxlY3RlZCAqLwoubWpyLW1mdiAubWpyLWljb24tYnRuLmlzLW9uIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50LCA5NSwgMTc5LCAyNTUpLCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLmlzLW9wZW4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNjIlLCAjZmZmZmZmIDEyJSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjI4KSwgcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSAyNiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4uaXMtb3BlbiB7CiAgICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50Owp9CgovKiBHZW4gaW5mbyBkcm9wZG93biBwYW5lbCAqLwoubWpyLW1mdi1nZW4tZHJvcGRvd24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgei1pbmRleDogMTAwMDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTYlLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBwYWRkaW5nOiA2cHggNHB4OwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjE4KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpLAogICAgICAgIDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICBkaXNwbGF5OiBub25lOwogICAgbWluLXdpZHRoOiAxNTBweDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duOjpiZWZvcmUgewogICAgY29udGVudDogIkdFTiBJTkZPIjsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1zaXplOiA5cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuOHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7CiAgICBwYWRkaW5nOiAycHggMTBweCA2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEpOwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24uaXMtdmlzaWJsZSB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgcGFkZGluZzogNXB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEwMG1zIGVhc2U7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1tZnYtZ2VuLWRyb3Bkb3duLXJvdzpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDcpOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93IGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgd2lkdGg6IDEzcHg7CiAgICBoZWlnaHQ6IDEzcHg7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIFRyYW5zZm9ybSBmb3IgcGFuL3pvb20gLSBhcHBsaWVkIGlubGluZSBmb3IgZHluYW1pYyB2YWx1ZXMgKi8KLm1qci1tZnYtbWVkaWEtLXRyYW5zZm9ybSB7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXI7Cn0KCi8qIEN1cnNvciBmZWVkYmFjayBmb3IgcGFuL3pvb20gaW50ZXJhY3Rpb25zICovCi5tanItbWZ2LWNvbnRlbnQtLWdyYWIgewogICAgY3Vyc29yOiBncmFiOwp9CgoubWpyLW1mdi1jb250ZW50LS1ncmFiYmluZyB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9CgovKiBTaWRlYmFyIHRhYiBidXR0b246IGFsbG93IDItbGluZSBsYWJlbCB2aWEgXG4gaW4gbGFiZWwgc3RyaW5nICovCi5tYWpvb3ItYXNzZXRzLXRhYi1idXR0b24gLnNpZGUtYmFyLWJ1dHRvbi1sYWJlbCB7CiAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7Cn0KCi8qIEJvdHRvbS1wYW5lbCBnZW5lcmF0ZWQgZmVlZDogY29tcGFjdCBjYXJkcyB3aXRoIG9ubHkgdGhlIGdlbmVyYXRpb24tdGltZSBwaWxsICovCi5tanItYm90dG9tLWZlZWQgewogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbCB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHNjcm9sbGJhci1ndXR0ZXI6IHN0YWJsZTsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogMTBweDsKICAgIGhlaWdodDogMTBweDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiwKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMyZjM1NDApIDcwJSwgIzdmOGVhMyAzMCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2ssCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZCB7CiAgICBnYXA6IDZweCAhaW1wb3J0YW50OwogICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50OwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgobWluKDEwMCUsIDEzMnB4KSwgMWZyKSkgIWltcG9ydGFudDsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBhbGlnbi1jb250ZW50OiBzdGFydDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkIHsKICAgIGJvcmRlci1yYWRpdXM6IDEycHggIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCAjMDAwIDglKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCA2cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMjIpICFpbXBvcnRhbnQ7CiAgICB0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQ6aG92ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI4KSAhaW1wb3J0YW50OwoKICAgIC5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkLmlzLXNlbGVjdGVkIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAzcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgICAgIDAgMCAwIDZweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAgICAgMCAwIDIwcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcikgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgICAgIDAgMTBweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4yOCkgIWltcG9ydGFudDsKICAgICAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAhaW1wb3J0YW50OwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYiB7CiAgICBvdmVyZmxvdzogdmlzaWJsZSAhaW1wb3J0YW50OwogICAgaXNvbGF0aW9uOiBpc29sYXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogLTE7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxNDBtcyBlYXNlLAogICAgICAgIG9wYWNpdHkgMTQwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg1cHgsIDVweCkgc2NhbGUoMC45ODUpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMykpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMjAyNDJiKSA4NCUsICMwMDAgMTYlKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xNik7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDEwcHgsIDEwcHgpIHNjYWxlKDAuOTcpOwogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDIpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODIlLCAjMDAwIDE4JSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDIycHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKICAgIG9wYWNpdHk6IDAuNzU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCA2cHgpIHNjYWxlKDAuOTg1KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTJweCwgMTJweCkgc2NhbGUoMC45Nyk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiB7CiAgICBhc3BlY3QtcmF0aW86IDAuOTUgLyAxICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSkgIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iLXBsYXkgewogICAgYmFja2dyb3VuZDogcmFkaWFsLWdyYWRpZW50KAogICAgICAgIGNpcmNsZSBhdCBjZW50ZXIsCiAgICAgICAgcmdiYSgwLCAwLCAwLCAwLjE4KSwKICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMDQpIDM4JSwKICAgICAgICB0cmFuc3BhcmVudCA3MCUKICAgICk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1leHQsCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1yYXRpbmcsCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS10YWdzIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45Mik7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKfQoKLyog4pSA4pSAIEZlZWQgY2FyZCBpbmZvOiBkZWZhdWx0IGhpZGRlbiwgdG9nZ2xlZCB2aWEgbWpyLWZlZWQtc2hvdy0qIGNsYXNzZXMgb24gLm1qci1ncmlkIOKUgOKUgCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDRweCA2cHggIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWluZm8gLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKfQoKLyogRmVlZCBmaWxlbmFtZSAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1maWxlbmFtZSAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkaW1lbnNpb25zIC8gZHVyYXRpb24gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtcmVzLAoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGltZW5zaW9ucyAubWpyLW1ldGEtZHVyYXRpb24gewogICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZGF0ZS90aW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWRhdGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRhdGUgLm1qci1tZXRhLWRhdGUsCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgZ2VuZXJhdGlvbiB0aW1lIGJhZGdlICovCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWdlbnRpbWUgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZ2VudGltZSAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleCAhaW1wb3J0YW50Owp9CgovKiBGZWVkIHdvcmtmbG93IGRvdCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1kb3Qtd3JhcHBlciB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kb3QgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgYmFkZ2VzICovCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1leHQgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLWV4dCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS1yYXRpbmcgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXJhdGluZyAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWJhZGdlcy10YWdzIC5tanItYmFkZ2UtdGFncyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgbWV0YSByb3cgc3R5bGluZyDigJQgZmxleCBsYXlvdXQgc28gdmlzaWJsZSBpdGVtcyBzdGF5IHNlcGFyYXRlZCAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7CiAgICBmbGV4LXdyYXA6IG5vd3JhcCAhaW1wb3J0YW50OwogICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50OwogICAgZ2FwOiA1cHggIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMCAhaW1wb3J0YW50OwogICAgcGFkZGluZy1yaWdodDogMCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC43OCAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjhlbSAhaW1wb3J0YW50OwogICAgLyogdGV4dC1vdmVyZmxvdyBlbGxpcHNpcyBkb2Vzbid0IGFwcGx5IG9uIGEgZmxleCBjb250YWluZXIgaXRzZWxmICovCn0KLyogRWFjaCBtZXRhIHNwYW4gdHJ1bmNhdGVzIGluZGl2aWR1YWxseSBpZiB0b28gbG9uZyAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZC1tZXRhLXJvdyA+IHNwYW4gewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXgtc2hyaW5rOiAxOwp9Ci8qIEdlbnRpbWUgYmFkZ2UgYW5kIHRpbWUgdmFsdWUgc2hvdWxkIHN0YXkgdmlzaWJsZSAoZG9uJ3Qgc2hyaW5rIGF3YXkpICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLWdlbnRpbWUsCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gLm1qci1tZXRhLXRpbWUtdmFsIHsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWdlbnRpbWUgLm1qci1tZXRhLWdlbnRpbWUgewogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogM3B4OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjIyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA4MDAgIWltcG9ydGFudDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAxNWVtOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45OCk7CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7Cn0KCi8qIOKUgOKUgCBBdWRpbyAvIDNEIHBsYWNlaG9sZGVyIHRodW1ibmFpbHMgaW4gdGhlIGZlZWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgovKiBBdWRpbyBjYXJkcyBzaG93IHRoZSB3YXZlZm9ybSBzcHJpdGU7IGdpdmUgaXQgYSBkaXN0aW5jdCBiYWNrZ3JvdW5kIHNvIGl0CiAgIGRvZXNuJ3QgbG9vayBsaWtlIGEgYnJva2VuIGltYWdlIHBsYWNlaG9sZGVyIGluIHRoZSBmZWVkLiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1raW5kPSJhdWRpbyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ibXAzIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJ3YXYiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9Im9nZyJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZmxhYyJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDYwJSwgIzFhMWYyYiA0MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIDNEIG1vZGVsIGNhcmRzIHVzZSBhbiBpY29uIHBsYWNlaG9sZGVyIOKAlCBhZGQgYSBzdWJ0bGUgZ3JhZGllbnQgc28gdGhleSByZWFkCiAgIGFzIGludGVudGlvbmFsIHJhdGhlciB0aGFuIG1pc3NpbmcuICovCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWtpbmQ9Im1vZGVsM2QiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImdsYiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZ2x0ZiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ib2JqIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJmYngiXSAubWpyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA1MCUsICMwZDExMTcgNTAlKSAhaW1wb3J0YW50Owp9CgovKiDilIDilIAgRmVlZCBncm91cCBidXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubWpyLWJvdHRvbS1mZWVkIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1mZWVkLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24taWNvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24tY291bnQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiDilIDilIAgRmVlZCBncm91cCBwb3BvdmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzIyMik7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICMzYTNhM2EpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcsIDhweCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC40NSk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci10aXRsZSB7CiAgICBwYWRkaW5nOiA4cHggMTBweCA0cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKfQoKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZCB7CiAgICBwYWRkaW5nOiA0cHggOHB4IDEwcHg7CiAgICBtYXgtaGVpZ2h0OiAzNjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSkKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7Cn0KCi5tanItZmVlZC1ncm91cC1idXR0b24taWNvbiwKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1jb3VudCB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1mZWVkLWdyb3VwLW1lbWJlci1jYXJkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMSAhaW1wb3J0YW50Owp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMzRweDsKICAgIHJpZ2h0OiA2cHg7CiAgICB6LWluZGV4OiAxMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDI4cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43NCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk2KTsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4yNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMjQsIDM0LCAwLjkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uID4gKiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA0cHg7CiAgICBoZWlnaHQ6IDRweDsKfQoKLm1qci1maWxtc3RyaXA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwp9CgoubWpyLWZpbG1zdHJpcDpob3Zlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbi1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi8qIOKUgOKUgCBEdXBsaWNhdGUgc3RhY2sgYnV0dG9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwovKiBTaG93cyBvbiB0aGUgcHJpbWFyeSBjYXJkIHdoZW4gc2FtZS1maWxlbmFtZSBkdXBsaWNhdGVzIGV4aXN0LiAgICAgICAgICAgICAqLwovKiBQb3NpdGlvbmVkIGF0IGJvdHRvbS1yaWdodCB0byBub3Qgb3ZlcmxhcCB0aGUgc3RhY2stZ3JvdXAgYnV0dG9uICh0b3AtcmlnaHQpLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDMwcHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMTgwLCAwLCAwLjM4KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgzMCwgMTgsIDAsIDAuODIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyMDAsIDYwLCAwLjk2KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMzIpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE1cywKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDUwLCAzMCwgMCwgMC45NCk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAxODAsIDAsIDAuNik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uID4gKiB7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWR1cC1zdGFja2VkPSJ0cnVlIl0gLm1qci1kdXAtc3RhY2stYnV0dG9uIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zMiksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAxODAsIDAsIDAuMik7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItZmVlZC1ncm91cC1idXR0b24gewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1kdXAtc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiDilIDilIAgVmlzdWFsIHN0YWNraW5nIGVmZmVjdCDigJQgbGF5ZXJlZCBjYXJkcyBiZWhpbmQgdGhlIG1haW4gY2FyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLyogQ3JlYXRlcyBwc2V1ZG8tZWxlbWVudCAiY2FyZHMiIG9mZnNldCBiZWhpbmQgdGhlIHByaW1hcnkgY2FyZCB0byB2aXN1YWxseSAgICAqLwovKiBjb21tdW5pY2F0ZSB0aGF0IHRoaXMgY2FyZCByZXByZXNlbnRzIGEgZ3JvdXAgb2YgbXVsdGlwbGUgaW1hZ2VzLiAgICAgICAgICAgICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmJlZm9yZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMxYTFhMmUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogLTE7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxODBtcyBlYXNlLAogICAgICAgIG9wYWNpdHkgMTgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoM3B4LCAzcHgpIHJvdGF0ZSgxZGVnKTsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNnB4LCA2cHgpIHJvdGF0ZSgyLjJkZWcpOwogICAgb3BhY2l0eTogMC4yNTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNHB4LCA0cHgpIHJvdGF0ZSgxLjVkZWcpOwogICAgb3BhY2l0eTogMC41NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg4cHgsIDhweCkgcm90YXRlKDNkZWcpOwogICAgb3BhY2l0eTogMC4zNTsKfQoKLm1qci1zdGFjay1ncm91cC1wb3BvdmVyIHsKICAgIHdpZHRoOiBtaW4oNDQwcHgsIDkydncpOwp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDEgIWltcG9ydGFudDsKfQoKLm1qci1zdGFjay1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBMaWdodCBtb2RlIG92ZXJyaWRlcyAoQ29tZnlVSSB2MS40MisgaW1wcm92ZWQgbGlnaHQgdGhlbWUpCiAqIFVzZXMgQ29tZnlVSSBkYXRhLXRoZW1lIGF0dHJpYnV0ZSB3aGVuIHNldCwgd2l0aAogKiBwcmVmZXJzLWNvbG9yLXNjaGVtZSBhcyBhIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucy4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiBDb21meVVJIHNldHMgZGF0YS10aGVtZT0ibGlnaHQiIG9uIDxodG1sPiBvciA8Ym9keT4gKi8KOmlzKFtkYXRhLXRoZW1lPSJsaWdodCJdLCBbZGF0YS1jb2xvci1zY2hlbWU9ImxpZ2h0Il0pIC5tanItYXNzZXRzLW1hbmFnZXIsCjppcyhbZGF0YS10aGVtZT0ibGlnaHQiXSwgW2RhdGEtY29sb3Itc2NoZW1lPSJsaWdodCJdKSAubWpyLXBvcG92ZXIgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsICNmYWZhZmEpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgI2U4ZThlOCk7CiAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCByZ2JhKDAsIDAsIDAsIDAuMTQpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCByZ2JhKDAsIDAsIDAsIDAuNTUpKTsKICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKICAgIC8qIEZhbGxiYWNrOiBvbmx5IGFwcGx5IGlmIENvbWZ5VUkgaGFzbid0IHNldCBhbiBleHBsaWNpdCBkYXRhLXRoZW1lICovCiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyOm5vdChbZGF0YS10aGVtZS1hcHBsaWVkXSksCiAgICAubWpyLXBvcG92ZXI6bm90KFtkYXRhLXRoZW1lLWFwcGxpZWRdKSB7CiAgICAgICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgI2YwZjBmMCk7CiAgICAgICAgLS1tanItc3VyZmFjZS0xOiB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCAjZmFmYWZhKTsKICAgICAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZThlOGU4KTsKICAgICAgICAtLW1qci1zdXJmYWNlLTM6IHZhcigtLW1vZGFsLWNhcmQtYmFja2dyb3VuZCwgI2ZmZmZmZik7CiAgICAgICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgcmdiYSgwLCAwLCAwLCAwLjE0KSk7CiAgICAgICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHJnYmEoMCwgMCwgMCwgMC41NSkpOwogICAgICAgIC0tbWpyLWNhcmQtaG92ZXItY29sb3I6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZTBlMGUwKTsKICAgIH0KfQoKLyog4pSA4pSA4pSAIFNrZWxldG9uIGxvYWRlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubWpyLWNhcmQtc2tlbGV0b24gewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCAjM2EzYTNhKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnLCA4cHgpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIC8qIE1hdGNoIC5tanItdGh1bWIgYXNwZWN0IHJhdGlvIHNvIHNrZWxldG9ucyBoYXZlIHRoZSBzYW1lIGZvb3RwcmludCBhcyByZWFsIGNhcmRzLiAqLwogICAgYXNwZWN0LXJhdGlvOiAxIC8gMTsKfQoKLyogU2hpbW1lciBzd2VlcCAqLwoubWpyLWNhcmQtc2tlbGV0b246OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgdHJhbnNwYXJlbnQgMCUsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzYTNhM2EpIDgwJSwgdHJhbnNwYXJlbnQpIDUwJSwKICAgICAgICB0cmFuc3BhcmVudCAxMDAlCiAgICApOwogICAgYW5pbWF0aW9uOiBtanItc2hpbW1lciAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKfQoKQGtleWZyYW1lcyBtanItc2hpbW1lciB7CiAgICBmcm9tIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgfQogICAgdG8gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgIH0KfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgICAgIGFuaW1hdGlvbjogbm9uZTsKICAgIH0KfQoKLyog4pSA4pSA4pSAIFJlc3BvbnNpdmUgc3VtbWFyeSBiYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgovKgogKiBFbmFibGUgY29udGFpbmVyIHF1ZXJpZXMgb24gdGhlIHN1bW1hcnkgYmFyIHNvIGNoaWxkcmVuIGNhbiByZXNwb25kIHRvIGl0cwogKiBhY3R1YWwgcmVuZGVyZWQgd2lkdGggKGUuZy4gd2hlbiB0aGUgcGFuZWwgaXMgZG9ja2VkIGluIGEgbmFycm93IHNpZGViYXIpLgogKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnkgewogICAgY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplOwogICAgY29udGFpbmVyLW5hbWU6IG1qci1zdW1tYXJ5LWJhcjsKfQoKLyogQmVsb3cgfjM4MCBweDogaGlkZSB0aGUgcGlsbHMvcmlnaHQgc2VjdGlvbiB0byBwcmV2ZW50IG92ZXJmbG93LiAqLwpAY29udGFpbmVyIG1qci1zdW1tYXJ5LWJhciAobWF4LXdpZHRoOiAzODBweCkgewogICAgLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnktcmlnaHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS10ZXh0IHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICB9Cn0K", "" + import.meta.url).toString(), n = document.createElement("link"); + let e = new URL("data:text/css;base64,LyoqCiAqIE1ham9vciBBc3NldHMgTWFuYWdlciDigJQgQ29tZnktbGlrZSB0aGVtZSBsYXllcgogKgogKiBSVUxFUzoKICogLSBEbyBOT1QgaGFyZGNvZGUgYSBjdXN0b20gcGFsZXR0ZTsgdXNlIGV4aXN0aW5nIENvbWZ5VUkgQ1NTIHZhcmlhYmxlcyB2aWEgdmFyKC4uLikuCiAqIC0gS2VlcCBldmVyeXRoaW5nIHNjb3BlZCB1bmRlciBgLm1qci1hc3NldHMtbWFuYWdlcmAgdG8gYXZvaWQgbGVha2luZyBzdHlsZXMgdG8gQ29tZnlVSSAoZXhjZXB0IGAubWpyLXBvcG92ZXIqYCB3aGljaCBjYW4gYmUgcG9ydGFsZWQgdG8gYGRvY3VtZW50LmJvZHlgKS4KICovCgoubWpyLWFzc2V0cy1tYW5hZ2VyIHsKICAgIC8qIFR5cG9ncmFwaHkgKi8KICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHZhcigKICAgICAgICAgICAgLS1mb250LWludGVyLAogICAgICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgICAgICBzeXN0ZW0tdWksCiAgICAgICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgICAgIFJvYm90bywKICAgICAgICAgICAgQXJpYWwsCiAgICAgICAgICAgIHNhbnMtc2VyaWYKICAgICAgICApCiAgICApOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IsIHZhcigtLWNvbnRlbnQtZmcsIHZhcigtLWlucHV0LXRleHQsICNkZGQpKSk7CgogICAgLyoKICAgICAqIFN1cmZhY2VzIOKAlCBwcmlvcml0eTogQ29tZnlVSSB2MS40MiBkZXNpZ24tc3lzdGVtIHRva2VuIOKGkiBsZWdhY3kgdG9rZW4g4oaSIGhhcmQgZmFsbGJhY2sKICAgICAqIE5ldyB0b2tlbnM6IC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwKICAgICAqICAgICAgICAgICAgIC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAtLWJ1dHRvbi1zdXJmYWNlLCAtLWJ1dHRvbi1ob3Zlci1zdXJmYWNlLAogICAgICogICAgICAgICAgICAgLS1pbnRlcmZhY2UtcGFuZWwtc2VsZWN0ZWQtc3VyZmFjZSwgLS1wcmltYXJ5LWJhY2tncm91bmQsIC0tbXV0ZWQtZm9yZWdyb3VuZCwKICAgICAqICAgICAgICAgICAgIC0tYm9yZGVyLWRlZmF1bHQsIC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCAtLXdhcm5pbmctYmFja2dyb3VuZCwgLS1kZXN0cnVjdGl2ZS1iYWNrZ3JvdW5kCiAgICAgKi8KICAgIC0tbWpyLXN1cmZhY2UtMDogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXN1cmZhY2UsIHZhcigtLWNvbnRlbnQtYmcsICMxZTFlMWUpKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItc3VyZmFjZS0yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1zZWNvbmRhcnktYmcsICMzMzMpKTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKSk7CiAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIC0tbWpyLWFjY2VudDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIC0tbWpyLWFjY2VudC1ob3ZlcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWhvdmVyLCB2YXIoLS1jb21meS1hY2NlbnQsICM3ZWM4ZmYpKTsKICAgIC0tbWpyLWJ0bi1zdXJmYWNlOiB2YXIoLS1idXR0b24tc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItYnRuLWhvdmVyOiB2YXIoLS1idXR0b24taG92ZXItc3VyZmFjZSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgLS1tanItc2VsZWN0ZWQtc3VyZmFjZTogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE1KSk7CgogICAgLyogUmFkaWkg4oCUIHVzZSBDb21meVVJIGRlc2lnbi1zeXN0ZW0gcmFkaXVzIHRva2VucyB3aGVuIGF2YWlsYWJsZSAqLwogICAgLS1tanItci1zbTogdmFyKC0tcmFkaXVzLXNtLCA4cHgpOwogICAgLS1tanItci1tZDogdmFyKC0tcmFkaXVzLW1kLCAxMHB4KTsKICAgIC0tbWpyLXItbGc6IHZhcigtLXJhZGl1cy1sZywgMTJweCk7CgogICAgLyogU3BhY2luZyAqLwogICAgLS1tanItcGFkLXNtOiA4cHg7CiAgICAtLW1qci1wYWQtbWQ6IDEycHg7CiAgICAtLW1qci1wYWQtbGc6IDE2cHg7CgogICAgLyogU2VtYW50aWMgU3RhdHVzIENvbG9ycyDigJQgcHJlZmVyIENvbWZ5VUkgdjEuNDIgc2VtYW50aWMgdG9rZW5zICovCiAgICAtLW1qci1zdGF0dXMtc3VjY2VzczogdmFyKC0tc3VjY2Vzcy1iYWNrZ3JvdW5kLCB2YXIoLS1jb21meS1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCkpOwogICAgLS1tanItc3RhdHVzLXdhcm5pbmc6IHZhcigtLXdhcm5pbmctYmFja2dyb3VuZCwgdmFyKC0tY29tZnktc3RhdHVzLXdhcm5pbmcsICNmZmE3MjYpKTsKICAgIC0tbWpyLXN0YXR1cy1lcnJvcjogdmFyKC0tZGVzdHJ1Y3RpdmUtYmFja2dyb3VuZCwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7CiAgICAtLW1qci1zdGF0dXMtaW5mbzogdmFyKC0tY29tZnktc3RhdHVzLWluZm8sICMyMTk2ZjMpOwogICAgLS1tanItc3RhdHVzLW5ldXRyYWw6IHZhcigtLWNvbWZ5LXN0YXR1cy1uZXV0cmFsLCAjOWU5ZTllKTsKICAgIC0tbWpyLXN0YXItYWN0aXZlOiAjZmZkNDVhOwoKICAgIC8qIEJhZGdlIGNvbG9ycyAob3ZlcnJpZGRlbiBieSBzZXR0aW5ncykgKi8KICAgIC0tbWpyLWJhZGdlLWltYWdlOiAjMjE5NmYzOwogICAgLS1tanItYmFkZ2UtdmlkZW86ICM5YzI3YjA7CiAgICAtLW1qci1iYWRnZS1hdWRpbzogI2ZmOTgwMDsKICAgIC0tbWpyLWJhZGdlLW1vZGVsM2Q6ICM0Y2FmNTA7CiAgICAtLW1qci1jYXJkLWhvdmVyLWNvbG9yOiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtaG92ZXItc3VyZmFjZSwgIzNkM2QzZCk7CiAgICAtLW1qci1jYXJkLXNlbGVjdGlvbi1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLXNlbGVjdGVkLXN1cmZhY2UsICM0YTkwZTIpOwogICAgLS1tanItcmF0aW5nLWNvbG9yOiAjZmY5NTAwOwogICAgLS1tanItdGFnLWNvbG9yOiAjNGE5MGUyOwp9CgovKiBNYWtlIHRoZSB0aGVtZSB2aXNpYmx5IGFwcGx5IGV2ZW4gd2l0aCBpbmxpbmUgc3R5bGVzICovCi5tanItYXNzZXRzLW1hbmFnZXIgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyLm1qci1hbS1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyIHsKICAgIHBhZGRpbmc6IDE0cHggMTZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgZmxleDogMCAwIGF1dG87CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAyOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICByb3ctZ2FwOiAxMHB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLWxlZnQgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgZmxleDogMCAwIGF1dG87CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItdG9vbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWJzIHsKICAgIC8qIFF1ZXVlLWxpa2UgdGFicyAoYWN0aXZlIHBpbGwsIG90aGVycyBhcyB0ZXh0KSAqLwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgZ2FwOiAxMHB4OwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGFiczo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDA7CiAgICBoZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10YWIgewogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICB0cmFuc2Zvcm0gMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYjpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRhYi5pcy1hY3RpdmUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODUlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMjhweDsKICAgIGhlaWdodDogMjhweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIHRyYW5zZm9ybSAxMjBtcyBlYXNlLAogICAgICAgIGJhY2tncm91bmQtY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLWNvbnRleHQtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDg1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEZsb2F0aW5nIFZpZXdlciBidXR0b24g4oCUIHRlYWwgZ2xvdyB3aGVuIHZpZXdlciBpcyBvcGVuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bi5tanItbWZ2LWJ0bi1hY3RpdmUgewogICAgY29sb3I6ICM0ZGQ5YzA7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzcsIDIxNywgMTkyLCAwLjU1KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzcsIDIxNywgMTkyLCAwLjEpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoNzcsIDIxNywgMTkyLCAwLjI1KTsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1mdi1idG4tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1lc3NhZ2UtYnRuIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaWNvbi1idG4ubWpyLW1lc3NhZ2UtaGFzLXVucmVhZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA3NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3MiUsIHZhcigtLW1qci1hY2NlbnQpIDExJSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXNzYWdlLWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNnB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA1NSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKSk7CiAgICBiYWNrZ3JvdW5kOiAjZWY1MzUwOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pY29uLWJ0bjpkaXNhYmxlZCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFpLWNvbnRyb2w6ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuNDUpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA5MiUsIHRyYW5zcGFyZW50KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQgLm1qci1haS1jb250cm9sOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuNDUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgLm1qci1haS1jb250cm9sLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYWktZGlzYWJsZWQtYmxvY2sgYnV0dG9uIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgovKiBQb3BvdmVycyBjYW4gYmUgbW92ZWQgdG8gYGRvY3VtZW50LmJvZHlgIChwb3J0YWwpIHRvIGF2b2lkIGJlaW5nIGNsaXBwZWQuICovCi5tanItcG9wb3ZlciB7CiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB2YXIoCiAgICAgICAgICAgIC0tZm9udC1pbnRlciwKICAgICAgICAgICAgdWktc2Fucy1zZXJpZiwKICAgICAgICAgICAgc3lzdGVtLXVpLAogICAgICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICAgICAiU2Vnb2UgVUkiLAogICAgICAgICAgICBSb2JvdG8sCiAgICAgICAgICAgIEFyaWFsLAogICAgICAgICAgICBzYW5zLXNlcmlmCiAgICAgICAgKQogICAgKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSkpOwoKICAgIC8qIFByb3ZpZGUgZmFsbGJhY2tzIHdoZW4gb3V0c2lkZSBgLm1qci1hc3NldHMtbWFuYWdlcmAgc2NvcGUgKi8KICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgLS1tanItYm9yZGVyOiB2YXIoLS1ib3JkZXItZGVmYXVsdCwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICAtLW1qci1tdXRlZDogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKSk7CiAgICAtLW1qci1hY2NlbnQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7CiAgICAtLW1qci1wb3BvdmVyLXotaW5kZXg6IDIxNDc0ODM2NDc7CgogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdpZHRoOiBtaW4oMjgwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBtYXgtd2lkdGg6IG1pbigzNjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpKTsKICAgIGJveC1zaGFkb3c6IDAgMTJweCAyOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7CiAgICB6LWluZGV4OiB2YXIoLS1tanItcG9wb3Zlci16LWluZGV4KTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgewogICAgbWluLXdpZHRoOiAzNDBweDsKICAgIHdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAyNHB4KSk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLXNvcnQtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDIyMHB4OwogICAgd2lkdGg6IG1pbigyNjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItY29sbGVjdGlvbnMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI4MHB4OwogICAgd2lkdGg6IG1pbigzMjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItbWVzc2FnZXMtcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgd2lkdGg6IG1pbig0NjBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIHBhZGRpbmc6IDEwcHg7Cn0KCi5tanItaW5saW5lLWRpYWxvZy1tYXNrIHsKICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsKICAgIGluc2V0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKfQoKLm1qci1pbmxpbmUtZGlhbG9nLXJvb3QgewogICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgIHdpZHRoOiAxMDAlOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi5tanItaW5saW5lLWRpYWxvZy1jb250ZW50IHsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItbWVzc2FnZXMtaGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLW1lc3NhZ2VzLXRhYnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiAzcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4OCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA3NCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZXNzYWdlcy10YWIgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA3NiUsIHRyYW5zcGFyZW50KTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDAuMTRzIGVhc2UsCiAgICAgICAgY29sb3IgMC4xNHMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gMC4xNHMgZWFzZTsKfQoKLm1qci1tZXNzYWdlcy10YWI6aG92ZXIsCi5tanItbWVzc2FnZXMtdGFiOmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDE0JSwgdHJhbnNwYXJlbnQpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmMWYxZjEpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyMiUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMzQlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVzc2FnZXMtcGFuZWxzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDhweDsKICAgIG1heC1oZWlnaHQ6IG1pbig1MnZoLCA0MjBweCk7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCwKLm1qci1tZXNzYWdlcy1zaG9ydGN1dHMtcGFuZWwgewogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47Cn0KCi5tanItdGFiLWNvdW50LWJhZGdlIHsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDAgNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyOCUsIHZhcigtLW1qci1zdXJmYWNlLTIpKTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2ZmZikgOTIlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ4JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2VzLXRpdGxlIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLXdpZHRoOiAwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA4MiUsIHZhcigtLW1qci1tdXRlZCkpOwp9CgoubWpyLW1lc3NhZ2VzLWFjdGlvbnMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLW1lc3NhZ2VzLW1hcmstcmVhZC1idG4gewogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjNjODRiIDQyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmM2M4NGIgMTIlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItbWVzc2FnZXMtc3Rhci1saW5rOmhvdmVyLAoubWpyLW1lc3NhZ2VzLXN0YXItbGluazpmb2N1cy12aXNpYmxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWljb24gewogICAgY29sb3I6ICNmM2M4NGI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1tZXNzYWdlcy1zdGFyLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZXMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWVzc2FnZXMtZW1wdHkgewogICAgcGFkZGluZzogOHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItbWVzc2FnZS1pdGVtIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODYlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB0cmFuc3BhcmVudCk7CiAgICBwYWRkaW5nOiA4cHg7Cn0KCi5tanItbWVzc2FnZS1pdGVtLS11bnJlYWQgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTglLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDYyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS0tZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2YzNmI2YiA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tLXN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzU4YzA3ZCA2MiUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1tZXNzYWdlLWl0ZW0taGVhZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1lc3NhZ2UtaXRlbS10aXRsZS13cmFwIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleDogMSAxIGF1dG87Cn0KCi5tanItbWVzc2FnZS1pdGVtLWVtb2ppIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItbWVzc2FnZS1pdGVtLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2YxZjFmMSk7Cn0KCi5tanItbWVzc2FnZS1pdGVtLWNhdGVnb3J5IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDIwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA4NiUsIHRyYW5zcGFyZW50KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItbWVzc2FnZS1pdGVtLW1ldGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43MjsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYm9keSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1lc3NhZ2UtaXRlbS1hY3Rpb24gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKfQoKLm1qci1tZXNzYWdlLWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgovKiBUb2FzdCBIaXN0b3J5IHRhYiDigJQgdW5yZWFkIGluZGljYXRvciBkb3QgKi8KLm1qci10YWItdW5yZWFkLWRvdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogNnB4OwogICAgaGVpZ2h0OiA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIEhpc3RvcnkgcGFuZWwgKi8KLm1qci1tZXNzYWdlcy1oaXN0b3J5LXBhbmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItaGlzdG9yeS1oZWFkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogNHB4IDAgNnB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItaGlzdG9yeS1oZWFkLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07Cn0KCi5tanItaGlzdG9yeS1jbGVhci1idG4gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgcGFkZGluZzogMnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG9wYWNpdHk6IDAuNzI7Cn0KCi5tanItaGlzdG9yeS1jbGVhci1idG46aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1oaXN0b3J5LWxpc3QgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogNHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47Cn0KCi5tanItaGlzdG9yeS1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMiwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLS1lcnJvciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjM2YjZiIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS0td2FybmluZyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjZjBiODVhIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS0tc3VjY2VzcyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjNThjMDdkIDUwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwp9CgoubWpyLWhpc3RvcnktaXRlbS1pY29uIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tY29udGVudCB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLW1zZyB7CiAgICBvcGFjaXR5OiAwLjkyOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLWhpc3RvcnktaXRlbS10aXRsZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIG9wYWNpdHk6IDAuOTY7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tZGV0YWlsIHsKICAgIG9wYWNpdHk6IDAuODQ7CiAgICBsaW5lLWhlaWdodDogMS40NTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlOwogICAgd29yZC1icmVhazogYnJlYWstd29yZDsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWhpc3RvcnktaXRlbS10aW1lIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIG9wYWNpdHk6IDAuNTI7Cn0KCi5tanItaGlzdG9yeS1pdGVtLWNoaXAgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMywgdmFyKC0tbWpyLXN1cmZhY2UtMikpIDc4JSwgdHJhbnNwYXJlbnQpOwogICAgb3BhY2l0eTogMC43NjsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tYWN0aW9uIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1qci1oaXN0b3J5LWl0ZW0tYWN0aW9uOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItaGlzdG9yeS1pdGVtLXByb2dyZXNzLXN1bW1hcnkgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgb3BhY2l0eTogMC43NDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7Cn0KCi5tanItaGlzdG9yeS1pdGVtLXByb2dyZXNzLWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWhpc3RvcnktaXRlbS1wcm9ncmVzcy1maWxsIHsKICAgIGhlaWdodDogMTAwJTsKICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgOTBkZWcsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZiksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsICM1OGMwN2QgNzIlLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSkKICAgICk7Cn0KCi5tanItc2hvcnRjdXQtZ3VpZGUgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdhcDogOHB4Owp9CgoubWpyLXNob3J0Y3V0LWd1aWRlLWludHJvIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgb3BhY2l0eTogMC44NDsKfQoKLm1qci1zaG9ydGN1dC1zZWN0aW9uIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODQlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMywgdmFyKC0tbWpyLXN1cmZhY2UtMikpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXNob3J0Y3V0LXNlY3Rpb24tdGl0bGUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZjFmMWYxKSA4OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zaG9ydGN1dC1saXN0IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDZweDsKfQoKLm1qci1zaG9ydGN1dC1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDEzMnB4LCAxNjBweCkgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKfQoKLm1qci1zaG9ydGN1dC1rZXkgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDEyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMikpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZmZmKSA5MCUsIHRyYW5zcGFyZW50KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMS4yNTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7Cn0KCi5tanItc2hvcnRjdXQtZGVzYyB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgb3BhY2l0eTogMC45MjsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7CiAgICAubWpyLXNob3J0Y3V0LXJvdyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci1zaG9ydGN1dC1rZXkgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgIH0KfQoKLm1qci1maWx0ZXItZ3JvdXAgewogICAgcGFkZGluZzogMTBweCAwIDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1maWx0ZXItZ3JvdXA6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHBhZGRpbmctYm90dG9tOiAycHg7Cn0KCi5tanItZmlsdGVyLWdyb3VwLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zNXB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2RkZCkgNzglLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKfQoKLm1qci1wb3BvdmVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLXBvcG92ZXItbGFiZWwgewogICAgd2lkdGg6IDU2cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci1wb3BvdmVyLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKfQoKLm1qci1wb3BvdmVyLXRvZ2dsZSBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1oZWFkZXItaWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3BhY2l0eTogMC45Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0taGVhZGVyLXRpdGxlIHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgcGFkZGluZzogMTZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1icm93c2UgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIHBhZGRpbmctdG9wOiA0cHg7Cn0KCi8qIFNjcm9sbGJhcnMgKG1hdGNoIENvbWZ5VUkgZmVlbCkgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWdyaWQtc2Nyb2xsIHsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICB0b3VjaC1hY3Rpb246IHBhbi15OwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODUlLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSkgdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDU1JSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwogICAgYm9yZGVyOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1ncmlkLXNjcm9sbDpob3Zlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tY29udGVudC1mZywgI2RkZCkpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLWNvcm5lciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWN1c3RvbS1jb250cm9scyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoIHsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoIHsKICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW4tYm90dG9tOiA2cHg7Cn0KCi8qIENhcmQgTWV0YWRhdGEgQ29sb3JzICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGNvbG9yOiAjZmZhNzI2OyAvKiBPcmFuZ2UgZm9yIGR1cmF0aW9uICovCiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS1yZXMgewogICAgY29sb3I6ICM0ZmMzZjc7IC8qIExpZ2h0IEJsdWUgZm9yIHJlc29sdXRpb24gKi8KICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZXRhLWRhdGUgewogICAgY29sb3I6ICNiOWY2Y2E7IC8qIFBhbGUgR3JlZW4gZm9yIGRhdGUgKi8KICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWV0YS10aW1lIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgZm9udC1zaXplOiAwLjllbTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXN1bW1hcnkgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW46IDAgMCA2cHggMDsKICAgIHBhZGRpbmc6IDAgMCA0cHggMDsKICAgIG1pbi1oZWlnaHQ6IDE2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNjUlLCB0cmFuc3BhcmVudCk7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLyogVG9hc3RzIChnbG9iYWw6IGNhbiBiZSBtb3VudGVkIHVuZGVyIGRvY3VtZW50LmJvZHkpICovCi5tanItdG9hc3QtY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMTZweDsKICAgIGxlZnQ6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHotaW5kZXg6IDEwMDAwMDE7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci10b2FzdCB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsICMzYTNhM2EpOwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1tanItdG9hc3Qtc3RyaXApOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCAjZWZlZmVmKTsKICAgIGZvbnQtZmFtaWx5OiB2YXIoCiAgICAgICAgLS1jb21meS1mb250LAogICAgICAgIHVpLXNhbnMtc2VyaWYsCiAgICAgICAgc3lzdGVtLXVpLAogICAgICAgIC1hcHBsZS1zeXN0ZW0sCiAgICAgICAgIlNlZ29lIFVJIiwKICAgICAgICBSb2JvdG8sCiAgICAgICAgQXJpYWwsCiAgICAgICAgc2Fucy1zZXJpZgogICAgKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDE2cHggcmdiYSgwLCAwLCAwLCAwLjUpOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMTVweCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIG9wYWNpdHkgMC4ycyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4ycyBlYXNlLW91dDsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7CiAgICBtaW4td2lkdGg6IG1pbigyNTBweCwgY2FsYygxMDB2dyAtIDI0cHgpKTsKICAgIG1heC13aWR0aDogbWluKDQwMHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDRweCk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci10b2FzdC5pcy12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KCi5tanItdG9hc3QtdGV4dCB7CiAgICBmbGV4OiAxOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLyogVG9hc3QgaWNvbiBzdHlsaW5nICovCi5tanItdG9hc3QtdGV4dDo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6IGF0dHIoZGF0YS1pY29uKTsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgY29sb3I6IHZhcigtLW1qci10b2FzdC1pY29uLWNvbG9yKTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLXdpZHRoOiAxNnB4Owp9CgoubWpyLXRvYXN0LXN1Y2Nlc3MgewogICAgLS1tanItdG9hc3Qtc3RyaXA6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApKTsKICAgIC0tbWpyLXRvYXN0LWljb24tY29sb3I6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgdmFyKC0tY29tZnktc3RhdHVzLXN1Y2Nlc3MsICM0Y2FmNTApKTsKfQoKLm1qci10b2FzdC1lcnJvciB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgdmFyKC0tY29tZnktc3RhdHVzLWVycm9yLCAjZjQ0MzM2KSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLWVycm9yLCB2YXIoLS1jb21meS1zdGF0dXMtZXJyb3IsICNmNDQzMzYpKTsKfQoKLm1qci10b2FzdC13YXJuaW5nIHsKICAgIC0tbWpyLXRvYXN0LXN0cmlwOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsIHZhcigtLWNvbWZ5LXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KSk7CiAgICAtLW1qci10b2FzdC1pY29uLWNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsIHZhcigtLWNvbWZ5LXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KSk7Cn0KCi5tanItdG9hc3QtaW5mbyB7CiAgICAtLW1qci10b2FzdC1zdHJpcDogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwogICAgLS1tanItdG9hc3QtaWNvbi1jb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1pbmZvLCB2YXIoLS1jb21meS1zdGF0dXMtaW5mbywgIzIxOTZmMykpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS10ZXh0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tY29udGV4dC1waWxscyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHJvdy1nYXA6IDRweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTAuNXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtaW4taGVpZ2h0OiAyMnB4OwogICAgbWF4LXdpZHRoOiAyMjBweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbDpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA3NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1MCUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jb250ZXh0LXBpbGwtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3BhY2l0eTogMC45MjsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNvbnRleHQtcGlsbC14IHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3NSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY29udGV4dC1waWxsLXg6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNTUlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNzAlLCB2YXIoLS1tanItYWNjZW50KSAxMCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmZmYpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGwgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBoZWlnaHQ6IDEuNzVyZW07CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtdG9vbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBvcG92ZXItYW5jaG9yIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1hZ2VuZGEtaW5wdXQgewogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZywgcmdiYSgwLCAwLCAwLCAwLjI1KSk7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlLAogICAgICAgIGNvbG9yIDAuMnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4ycyBlYXNlOwp9Ci5tanItYWdlbmRhLWlucHV0Lm1qci1hZ2VuZGEtZmlsbGVkIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA2MCUKICAgICk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDgwJSwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKQogICAgKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoubWpyLWFnZW5kYS1pbnB1dC5tanItYWdlbmRhLWVtcHR5IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NSUsIHRyYW5zcGFyZW50IDE1JSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1ib3JkZXIpOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7Cn0KCi5tanItYWdlbmRhLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1hZ2VuZGEtY2FsZW5kYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFnZW5kYS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLm1qci1hZ2VuZGEtbW9udGggewogICAgZmxleDogMTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtbmF2IHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7Cn0KCi5tanItYWdlbmRhLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDcsIG1pbm1heCgwLCAxZnIpKTsKICAgIGdhcDogNnB4OwogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItYWdlbmRhLXdlZWtkYXkgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5IHsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1NSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hZ2VuZGEtZGF5LWJhZGdlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIHJpZ2h0OiAtNXB4OwogICAgbWluLXdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6ICNlNTM5MzU7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCAjZTUzOTM1IDY1JSwgI2ZmZmZmZiAzNSUpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgoubWpyLWFnZW5kYS1kYXk6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYm9yZGVyKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgNDUlCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMikgNDUlLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5OmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1ibGFuayB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1oYXMtYXNzZXRzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgODAlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIpCiAgICApOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSkgMTglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTIpIDgyJQogICAgKTsKfQoKLm1qci1hZ2VuZGEtZGF5LS1zZWxlY3RlZCB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4CiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDU1JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWFnZW5kYS1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLWFnZW5kYS1jbGVhciwKLm1qci1hZ2VuZGEtcmVmcmVzaCB7CiAgICBmbGV4OiAxOwp9CgoubWpyLW1lbnUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItcHJpbWUtbWVudS1saXN0LAoubWpyLXNvcnQtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItcHJpbWUtbWVudSBbZGF0YS1wYy1zZWN0aW9uPSJpdGVtIl0sCi5tanItcHJpbWUtbWVudS1saXN0IFtkYXRhLXBjLXNlY3Rpb249Iml0ZW0iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXByaW1lLW1lbnUgW2RhdGEtcGMtc2VjdGlvbj0iaXRlbWNvbnRlbnQiXSB7CiAgICB3aWR0aDogMTAwJTsKfQoKLm1qci1tZW51LWl0ZW0sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW06aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW06aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWVudS1pdGVtOmFjdGl2ZSwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLW1lbnUtaXRlbTphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtLWxhYmVsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2ssCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tZW51LWl0ZW0tY2hlY2sgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgd2lkdGg6IDE2cHg7CiAgICBmbGV4OiAwIDAgMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDcyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci1tZW51LWl0ZW0gLnBpLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbWVudS1pdGVtIC5waSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi5tanItY29sbGVjdGlvbnMtbWVudSB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItbWVudS1pdGVtLWxhYmVsLS1pY29uIC5waSB7CiAgICB3aWR0aDogMTZweDsKICAgIGZsZXg6IDAgMCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgoubWpyLW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1pbi13aWR0aDogMTZweDsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci1tZW51LWl0ZW0taGludCB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDYyJSwgdmFyKC0tbWpyLW11dGVkKSk7CiAgICBvcGFjaXR5OiAwLjcyOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZW51LWl0ZW0tY2hlY2stLXZpc2libGUsCi5tanItbWVudS1pdGVtLmlzLWFjdGl2ZSAubWpyLW1lbnUtaXRlbS1jaGVjayB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1lbnUtZGl2aWRlciB7CiAgICBoZWlnaHQ6IDFweDsKICAgIG1hcmdpbjogNHB4IDA7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbXV0ZWQgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1zdGF0ZS1ibG9jayB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgYm9yZGVyOiAxcHggZGFzaGVkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4NSUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgbWFyZ2luOiA0cHggMDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1zdGF0ZS1ibG9jay5pcy1lcnJvciwKLm1qci1jb250ZXh0LW1lbnUtbm90ZS5pcy1lcnJvciB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDgyJSwgdmFyKC0tY29udGVudC1mZykpOwogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvcikgNDUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi5tanItY29sbGVjdGlvbi1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiA0OHB4Owp9CgoubWpyLWNvbGxlY3Rpb25zLXZpcnR1YWwtbGlzdCB7CiAgICB3aWR0aDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLWRlbGV0ZS1idG4gewogICAgd2lkdGg6IDQycHg7CiAgICBmbGV4OiAwIDAgNDJweDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA2NSUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDQ1JSk7Cn0KCi5tanItZGVsZXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA0MCUsIHZhcigtLW1qci1zdGF0dXMtZXJyb3IpIDY1JSk7Cn0KCi5tanItZGVsZXRlLWJ0biAucGkgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLWVycm9yKSA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLXRpdGxlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweCAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG9wYWNpdHk6IDAuODg7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDcyJSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tY3lhbiB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzglLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItc2VjdGlvbi10aXRsZS0tdmlvbGV0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgI2M0OGRmZiA3OCUsIHZhcigtLWNvbnRlbnQtZmcpKTsKfQoKLm1qci1zZWN0aW9uLWhpbnQgewogICAgcGFkZGluZzogMCAxMHB4IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcpIDU1JSwgdmFyKC0tbWpyLW11dGVkKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydCwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXIgewogICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgoubWpyLW1lbnUtaXRlbS0tY2x1c3RlciB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1tZW51LWl0ZW0tLXNtYXJ0IC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICM2ZmQ0ZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1jbHVzdGVyIC5waSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICNjNDhkZmYgNzQlLCB2YXIoLS1jb250ZW50LWZnKSk7Cn0KCi5tanItbWVudS1pdGVtLS1zbWFydDpob3Zlcjpub3QoOmRpc2FibGVkKSwKLm1qci1tZW51LWl0ZW0tLWNsdXN0ZXI6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgODAlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItY2x1c3Rlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA3MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1jbHVzdGVyLXRodW1icyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAzcHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1jbHVzdGVyLXRodW1iIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDYwJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLWNsdXN0ZXItaW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWNsdXN0ZXItbmFtZSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnKTsKfQoKLm1qci1jbHVzdGVyLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNTglLCB2YXIoLS1tanItbXV0ZWQpKTsKfQoKLm1qci1jbHVzdGVyLWNyZWF0ZS1idG4gewogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTUlLCB0cmFuc3BhcmVudCk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjYyOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgoubWpyLWNsdXN0ZXItY3JlYXRlLWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MCUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA2MiUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLXNlYXJjaC1pY29uIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLW1qci1tdXRlZCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtaWNvbiAucGkgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zZWFyY2gtcGlsbCAubWpyLWlucHV0IHsKICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgIGZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50OwogICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc2VhcmNoLXBpbGw6Zm9jdXMtd2l0aGluIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDY1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBtYXJnaW4tdG9wOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tZ3JpZC1zY3JvbGwgewogICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwp9CgovKiBHcmlkIGxheW91dCAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogQXZvaWQgb3ZlcmZsb3cgd2hlbiB0aGUgcGFuZWwgYmVjb21lcyBuYXJyb3dlciB0aGFuIHRoZSBtaW4gY2FyZCBzaXplICovCiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgKICAgICAgICBhdXRvLWZpbGwsCiAgICAgICAgbWlubWF4KG1pbigxMDAlLCB2YXIoLS1tanItZ3JpZC1taW4tc2l6ZSwgMTgwcHgpKSwgMWZyKQogICAgKTsKICAgIGdhcDogdmFyKC0tbWpyLWdyaWQtZ2FwLCAxMHB4KTsKICAgIG1hcmdpbi10b3A6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi8qIENhcmQgc2VsZWN0aW9uICsgZm9jdXMgKGtlZXBzIGEgdmlzaWJsZSBpbmRpY2F0b3Igd2hlbiBzaWRlYmFyIGlzIG9wZW4pICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIHsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkLmlzLXNlbGVjdGVkIHsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgMCAwIDAgM3B4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDgwJSwgdmFyKC0tY29udGVudC1mZykpLAogICAgICAgIDAgMCAwIDZweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDEwcHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkyKSAhaW1wb3J0YW50OwogICAgei1pbmRleDogMTA7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgODAlLCB2YXIoLS1jb250ZW50LWZnKSksCiAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAzMCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNDAlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45MikgIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwOwp9CgpAa2V5ZnJhbWVzIG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIHsKICAgIDAlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTU4JSk7CiAgICAgICAgb3BhY2l0eTogMC4xODsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgb3BhY2l0eTogMC4zNDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1OCUpOwogICAgICAgIG9wYWNpdHk6IDAuMTg7CiAgICB9Cn0KCkBrZXlmcmFtZXMgbWpyLWxpdmUtcGxhY2Vob2xkZXItcHVsc2UgewogICAgMCUsCiAgICAxMDAlIHsKICAgICAgICBib3gtc2hhZG93OgogICAgICAgICAgICAwIDAgMCAxcHggcmdiYSgxMTgsIDIxNCwgMjU1LCAwLjM0KSwKICAgICAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIH0KICAgIDUwJSB7CiAgICAgICAgYm94LXNoYWRvdzoKICAgICAgICAgICAgMCAwIDAgMXB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC41MiksCiAgICAgICAgICAgIDAgMCAwIDRweCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMTIpLAogICAgICAgICAgICAwIDEycHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgfQp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gewogICAgYW5pbWF0aW9uOiBtanItbGl2ZS1wbGFjZWhvbGRlci1wdWxzZSAxLjlzIGVhc2UtaW4tb3V0IGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1saXZlLXBsYWNlaG9sZGVyPSJ0cnVlIl0gLm1qci10aHVtYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1wbGFjZWhvbGRlci13YXNoIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAtOCU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDE7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTE1ZGVnLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwKSAwJSwKICAgICAgICByZ2JhKDk4LCAxOTksIDI1NSwgMC4wOCkgMzAlLAogICAgICAgIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCkgNTAlLAogICAgICAgIHJnYmEoOTgsIDE5OSwgMjU1LCAwLjEyKSA3MCUsCiAgICAgICAgcmdiYSg5OCwgMTk5LCAyNTUsIDApIDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXNoZWVuIDIuMnMgbGluZWFyIGluZmluaXRlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItbGl2ZS1waWxsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNnB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDEyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgcGFkZGluZzogMCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTAsIDE0LCAyMCwgMC43OCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDExOCwgMjE0LCAyNTUsIDAuMzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWxpdmUtcGlsbC1kb3QgewogICAgd2lkdGg6IDdweDsKICAgIGhlaWdodDogN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiAjNzZkNmZmOwogICAgYm94LXNoYWRvdzogMCAwIDAgNHB4IHJnYmEoMTE4LCAyMTQsIDI1NSwgMC4xNik7CiAgICBmbGV4OiAwIDAgYXV0bzsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItbGl2ZS1wbGFjZWhvbGRlcj0idHJ1ZSJdIC5tanItYXNzZXQtc3RhdHVzLWRvdCB7CiAgICBhbmltYXRpb246IG1qci1saXZlLXBsYWNlaG9sZGVyLXB1bHNlIDEuOXMgZWFzZS1pbi1vdXQgaW5maW5pdGU7Cn0KCi8qIEdyaWQgbG9hZGluZyBvdmVybGF5ICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLWxvYWRpbmctb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgIzAwMCAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjNweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLWxnKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDJweCk7Cn0KCkBrZXlmcmFtZXMgbWpyLXNrZWxldG9uLXNoaW1tZXIgewogICAgMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDEyMCUgMDsKICAgIH0KICAgIDEwMCUgewogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC0xMjAlIDA7CiAgICB9Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1ncmlkLXNrZWxldG9uLXNoaW1tZXIgewogICAgd2lsbC1jaGFuZ2U6IGJhY2tncm91bmQtcG9zaXRpb247Cn0KCi8qIEdlbmVyaWMgaGVhZGluZ3MgaW5zaWRlIHBhbmVsICovCi5tanItYXNzZXRzLW1hbmFnZXIgaDMsCi5tanItYXNzZXRzLW1hbmFnZXIgaDQgewogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwp9CgovKiBQYW5lbHMgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXBhbmVsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZyk7CiAgICBib3gtc2hhZG93OiB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtYm94LXNoYWRvdywgMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKfQoKLyogVG9vbGJhciAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdG9vbGJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IHZhcigtLW1qci1wYWQtbWQpOwp9CgovKiBCdXR0b25zICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBwYWRkaW5nOiA3cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICB0cmFuc2Zvcm0gODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWJ0bjphY3RpdmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDFweCk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG46ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41NTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4ubWpyLXByaW1hcnkgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTQlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1idG4gewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTIpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbWQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDcwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTAlKTsKfQoKLyogSW5wdXRzIC8gc2VsZWN0cyAodXNlZCBpbnNpZGUgcG9ydGFsZWQgcG9wb3ZlcnMgdG9vKSAqLwoubWpyLWlucHV0LAoubWpyLXNlbGVjdCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWlucHV0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc2VsZWN0IHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgb3V0bGluZTogbm9uZTsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQ6OnBsYWNlaG9sZGVyIHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW11dGVkKSA4MCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1pbnB1dDpmb2N1cywKLm1qci1zZWxlY3Q6Zm9jdXMsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1pbnB1dDpmb2N1cywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXNlbGVjdDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjAlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItaW5wdXQsCi5tanItc2VsZWN0LAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItaW5wdXQsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zZWxlY3QgewogICAgLyogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyBpZiBwcmVzZW50ICovCiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCByZ2JhKDAsIDAsIDAsIDAuMjUpKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kKTsKICAgIHBhZGRpbmc6IDhweCAxMHB4Owp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDhweDsKICAgIG1pbi1oZWlnaHQ6IDM0cHg7CiAgICBwYWRkaW5nOiAwIDlweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0W2RhdGEtcC1kaXNhYmxlZD0idHJ1ZSJdIHsKICAgIG9wYWNpdHk6IDAuNTU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItZmlsdGVyLXBvcG92ZXIgLm1qci1maWx0ZXItc2VsZWN0IFtkYXRhLXBjLXNlY3Rpb249ImxhYmVsIl0gewogICAgZmxleDogMSAxIGF1dG87CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLWZpbHRlci1wb3BvdmVyIC5tanItZmlsdGVyLXNlbGVjdCBbZGF0YS1wYy1zZWN0aW9uPSJkcm9wZG93biJdIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMThweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgewogICAgbWluLXdpZHRoOiB2YXIoLS1wLXNlbGVjdC1vdmVybGF5LXdpZHRoLCAxMnJlbSk7CiAgICBtYXgtd2lkdGg6IG1pbigzMjBweCwgY2FsYygxMDB2dyAtIDMycHgpKTsKICAgIG1heC1oZWlnaHQ6IG1pbigzMjBweCwgY2FsYygxMDB2aCAtIDMycHgpKTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1tZCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM4KTsKICAgIHotaW5kZXg6IGNhbGModmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCwgMjE0NzQ4MzY0NykgKyAxKTsKfQoKLm1qci1maWx0ZXItc2VsZWN0LXBhbmVsIFtkYXRhLXBjLXNlY3Rpb249Imxpc3QiXSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogMDsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogY2FsYyh2YXIoLS1tanItci1tZCkgLSAycHgpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwp9CgoubWpyLWZpbHRlci1zZWxlY3QtcGFuZWwgW2RhdGEtcGMtc2VjdGlvbj0ib3B0aW9uIl06aG92ZXIsCi5tanItZmlsdGVyLXNlbGVjdC1wYW5lbCBbZGF0YS1wLWhpZ2hsaWdodD0idHJ1ZSJdIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZmZmKTsKfQoKLyogVGFiczogb3ZlcnJpZGRlbiBhYm92ZSB3aXRoIHF1ZXVlLWxpa2Ugc3R5bGUgKi8KCi8qIFJlbW92ZWQgcmVkdW5kYW50IHRhYiBkZWNsYXJhdGlvbnMgdGhhdCB3ZXJlIHVzaW5nICFpbXBvcnRhbnQgKi8KCi8qIE11dGVkIHRleHQgaGVscGVyICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1tdXRlZCB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKfQoKLyogR3JpZCArIGNhcmRzIChvdmVycmlkZSBpbmxpbmUgc3R5bGVzIGZyb20gQ2FyZC5qcykgKi8KLm1qci1hc3NldHMtbWFuYWdlciAjbWpyLWFzc2V0cy1ncmlkIHsKICAgIGdhcDogMTBweCAhaW1wb3J0YW50Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZCwKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQgewogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSkgIWltcG9ydGFudDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZykgIWltcG9ydGFudDsKICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgIG1pbi13aWR0aDogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkOmhvdmVyLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZDpob3ZlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA1NSUsCiAgICAgICAgdmFyKC0tbWpyLWJvcmRlcikKICAgICkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLW1qci1jYXJkLWhvdmVyLWNvbG9yKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCA4cHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMjUpICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkIGltZywKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmQgdmlkZW8sCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYi1tZWRpYSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgIG9iamVjdC1maXQ6IGNvdmVyICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYiB7CiAgICB3aWR0aDogMTAwJTsKICAgIGFzcGVjdC1yYXRpbzogMSAvIDE7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODAlLCB0cmFuc3BhcmVudCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBLZWVwIGdlbmVyYXRpb24tdGltZSBiYWRnZSBwaW5uZWQgdG8gdGhlIHRodW1ibmFpbCBjb3JuZXIgYWNyb3NzIGdyaWQvZmVlZCB2YXJpYW50cy4KICAgVGhlICFpbXBvcnRhbnQgb3ZlcnJpZGVzIGFyZSBpbnRlbnRpb25hbDogR2VuVGltZUJhZGdlLnZ1ZSB1c2VzIDxzdHlsZSBzY29wZWQ+IHdob3NlCiAgIGhhc2hlZCBjbGFzcyBoYXMgdGhlIHNhbWUgc3BlY2lmaWNpdHkgYXMgZ2xvYmFsIHNlbGVjdG9ycy4gV2l0aG91dCAhaW1wb3J0YW50LCBhCiAgIGNvbmZsaWN0aW5nIHJ1bGUgKGUuZy4gZnJvbSBhIHRoZW1lIGV4dGVuc2lvbiBvciBhbiBvbGRlciBub24tc2NvcGVkIGNvbnRleHQpIHRoYXQgc2V0cwogICBsZWZ0OjAvdG9wOjAgd291bGQgd2luLiBsZWZ0OmF1dG8gKyB0b3A6YXV0byBleHBsaWNpdGx5IGNhbmNlbCBhbnkgc3VjaCBhY2NpZGVudGFsIHJlc2V0LiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLWdlbnRpbWUtYmFkZ2UsCi5tanItYm90dG9tLWZlZWQgLm1qci10aHVtYiA+IC5tanItZ2VudGltZS1iYWRnZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDsKICAgIHJpZ2h0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7CiAgICB0b3A6IGF1dG8gIWltcG9ydGFudDsKICAgIHotaW5kZXg6IDEwICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAycHggNnB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICB0ZXh0LXNoYWRvdzoKICAgICAgICAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjkpLAogICAgICAgIDAgMCAxMHB4IGNvbG9yLW1peChpbiBzcmdiLCBjdXJyZW50Q29sb3IgMzUlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIEtlZXAgcmF0aW5nL3RhZ3MgYmFkZ2VzIGFuY2hvcmVkIGV2ZW4gd2hlbiBzY29wZWQgVnVlIHN0eWxlcyBhcmUgbm90IGFwcGxpZWQgYWZ0ZXIgcmVsb2FkLgogICBEbyBub3QgZm9yY2UgZGlzcGxheSBoZXJlIHNvIGdyaWQgdmlzaWJpbGl0eSB0b2dnbGVzICgubWpyLXNob3ctYmFkZ2VzLSopIHN0aWxsIGNvbnRyb2wgc2hvdy9oaWRlLiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItdGh1bWIgPiAubWpyLXJhdGluZy1iYWRnZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iID4gLm1qci1yYXRpbmctYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICB0b3A6IDZweCAhaW1wb3J0YW50OwogICAgcmlnaHQ6IDZweCAhaW1wb3J0YW50OwogICAgbGVmdDogYXV0byAhaW1wb3J0YW50OwogICAgYm90dG9tOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yNSk7CiAgICB0ZXh0LXNoYWRvdzogMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC42KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXRodW1iID4gLm1qci10YWdzLWJhZGdlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWIgPiAubWpyLXRhZ3MtYmFkZ2UgewogICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7CiAgICBsZWZ0OiA2cHggIWltcG9ydGFudDsKICAgIGJvdHRvbTogNnB4ICFpbXBvcnRhbnQ7CiAgICByaWdodDogYXV0byAhaW1wb3J0YW50OwogICAgdG9wOiBhdXRvICFpbXBvcnRhbnQ7CiAgICB6LWluZGV4OiAxMCAhaW1wb3J0YW50OwogICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA1NnB4KTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMyk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci10aHVtYi1wbGF5IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGluc2V0OiAwOwogICAgZGlzcGxheTogZ3JpZDsKICAgIHBsYWNlLWl0ZW1zOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDI4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgdGV4dC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC43KTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxMjBtcyBlYXNlOwp9CgovKiDilIDilIDilIAgSG92ZXIgaW5mbyBvdmVybGF5IChwb3NpdGl2ZSBwcm9tcHQgKyBnZW4gdGltZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgIFNsaWRlcyB1cCBmcm9tIHRoZSBib3R0b20gb2YgLm1qci10aHVtYiBvbiBjYXJkIGhvdmVyLgogICBwb2ludGVyLWV2ZW50czogbm9uZSAg4oaSIG5ldmVyIGJsb2NrcyB2aWRlbyBtb3VzZWVudGVyIC8gcGxheS1vbi1ob3Zlci4KICAgei1pbmRleDogMiAgICAgICAgICAg4oaSIHNpdHMgYWJvdmUgdGhlIHRodW1ibmFpbCBpbWFnZSwgYmVsb3cgdGhlIHBsYXkgaWNvbi4KICAgQ29udHJvbGxlZCBieSB0aGUgLm1qci1zaG93LWhvdmVyLWluZm8gY2xhc3Mgb24gdGhlIGdyaWQgY29udGFpbmVyLCB3aGljaAogICBpcyB0b2dnbGVkIHZpYSB0aGUgIlNob3cgcHJvbXB0IG9uIGhvdmVyIiBzZXR0aW5nLgogICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtaG92ZXItaW5mbyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3R0b206IDA7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBwYWRkaW5nOiAyMnB4IDhweCA3cHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCB0cmFuc3BhcmVudCAwJSwgcmdiYSgwLCAwLCAwLCAwLjc4KSAxMDAlKTsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSg1cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDE1MG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDE1MG1zIGVhc2U7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogM3B4OwogICAgei1pbmRleDogMjsKfQovKiBPbmx5IHJldmVhbCBvbiBob3ZlciB3aGVuIHRoZSBzZXR0aW5nIGlzIGVuYWJsZWQgKGNsYXNzIG9uIGdyaWQgY29udGFpbmVyKSAqLwoubWpyLWdyaWQubWpyLXNob3ctaG92ZXItaW5mbyAubWpyLWNhcmQ6aG92ZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIC5tanItaG92ZXItcHJvbXB0IHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICAgIC13ZWJraXQtbGluZS1jbGFtcDogMjsKICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgb3BhY2l0eTogMC45OwogICAgZm9udC1zaXplOiA5LjVweDsKfQoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1ob3Zlci1pbmZvIC5tanItaG92ZXItZ2VudGltZSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIxMCwgMTIwLCAwLjk1KTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDlweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07Cn0KQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1jYXJkLWhvdmVyLWluZm8gewogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMG1zOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtbWV0YSB7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItY2FyZC1kZXRhaWxzIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG9wYWNpdHk6IDAuODsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWNhcmQtZmlsZW5hbWUtdGV4dCB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgovKiBSYXRpbmcgJiBUYWdzIEVkaXRvcnMgKi8KQGtleWZyYW1lcyBmYWRlSW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTRweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KLyoqCiAqIEFyY2hpdmVkIENTUyBTdHlsZXMgLSBSYXRpbmcgYW5kIFRhZ3MKICogVGhlc2Ugc3R5bGVzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZW1lLWNvbWZ5LmNzcwogKi8KCi8qIEFuaW1hdGlvbnMgKi8KQGtleWZyYW1lcyBzbGlkZUluUmlnaHQgewogICAgZnJvbSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KCi8qIFBvcG92ZXJzICovCi5tanItcmF0aW5nLXBvcG92ZXIsCi5tanItdGFncy1wb3BvdmVyIHsKICAgIGFuaW1hdGlvbjogZmFkZUluIDAuMnMgZWFzZTsKfQoKLm1qci1yYXRpbmctcG9wb3ZlciwKLm1qci10YWdzLXBvcG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnLCAwLjVyZW0pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHBhZGRpbmc6IDhweDsKfQoKLyogUmF0aW5nIEVkaXRvciAqLwoubWpyLXJhdGluZy1lZGl0b3IgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHg7Cn0KCi5tanItcmF0aW5nLXN0YXIgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2U7Cn0KCi5tanItcmF0aW5nLXN0YXI6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29tZnktYWNjZW50LCAjNWZiM2ZmKSAzNSUsIHRyYW5zcGFyZW50KTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb21meS1tZW51LXNlY29uZGFyeS1iZywgIzMzMykgNjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItcmF0aW5nLWVkaXRvciAubWpyLXJhdGluZy1zdGFyOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4yKSAhaW1wb3J0YW50Owp9CgoubWpyLXJhdGluZy1lZGl0b3IgLm1qci1yYXRpbmctc3RhcjphY3RpdmUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KSAhaW1wb3J0YW50Owp9CgovKiBUYWdzIEVkaXRvciAqLwoubWpyLXRhZ3MtZWRpdG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiAxMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1zbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuNDUpOwogICAgbWluLXdpZHRoOiAyNTBweDsKICAgIG1heC13aWR0aDogbWluKDM1MHB4LCBjYWxjKDEwMHZ3IC0gMjBweCkpOwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7Cn0KCi5tanItdGFncy1lZGl0b3IuaXMtZGlzYWJsZWQgewogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwLjc7Cn0KCi5tanItdGFncy1kaXNwbGF5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDZweDsKICAgIG1pbi1oZWlnaHQ6IDMycHg7Cn0KCi5tanItdGFncy1lbXB0eSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLm1qci10YWctY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMjQlLCB0cmFuc3BhcmVudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNDAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLm1qci10YWctY2hpcC1yZW1vdmUgewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3BhY2l0eTogMC43Owp9CgoubWpyLXRhZy1jaGlwLXJlbW92ZTpkaXNhYmxlZCB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCi5tanItdGFncy1pbnB1dC13cmFwIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci10YWctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDc1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXRhZy1pbnB1dDpmb2N1cyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgODglLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCkgIWltcG9ydGFudDsKfQoKLm1qci10YWctY2hpcDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgMzQlLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpICFpbXBvcnRhbnQ7Cn0KCi5tanItdGFncy1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwMCU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMmEyYTJhKSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1heC1oZWlnaHQ6IDE1MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHotaW5kZXg6IDEwMDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJsaXN0Il0gewogICAgbGlzdC1zdHlsZTogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItdGFncy1kcm9wZG93biBbZGF0YS1wYy1zZWN0aW9uPSJvcHRpb24iXSB7CiAgICBsaXN0LXN0eWxlOiBub25lOwp9CgoubWpyLXRhZy1zdWdnZXN0aW9uIHsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItdGFnLWNvbG9yKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLm1qci10YWctc3VnZ2VzdGlvbi5pcy1hY3RpdmUsCi5tanItdGFnLXN1Z2dlc3Rpb246aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci10YWctY29sb3IpIDI4JSwgdHJhbnNwYXJlbnQpICFpbXBvcnRhbnQ7Cn0KCi8qIEJhZGdlcyBJbnRlcmFjdGl2ZSAqLwoubWpyLXJhdGluZy1iYWRnZSwKLm1qci10YWdzLWJhZGdlIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItcmF0aW5nLWJhZGdlIHsKICAgIGNvbG9yOiB2YXIoLS1tanItcmF0aW5nLWNvbG9yKSAhaW1wb3J0YW50Owp9CgoubWpyLXRhZ3MtYmFkZ2UgewogICAgY29sb3I6IHZhcigtLW1qci10YWctY29sb3IpICFpbXBvcnRhbnQ7Cn0KCi5tanItcmF0aW5nLWJhZGdlOmhvdmVyLAoubWpyLXRhZ3MtYmFkZ2U6aG92ZXIgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA1KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi8qIFNjcm9sbGJhciBmb3IgdGFncyBkcm9wZG93biAqLwoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA2cHg7Cn0KCi5tanItdGFncy1kcm9wZG93bjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDY1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXRhZ3MtZHJvcGRvd246Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItdGFnLWNvbG9yKSA0OCUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLm1qci10YWdzLWRyb3Bkb3duOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXRhZy1jb2xvcikgNjUlLCB2YXIoLS1tanItYm9yZGVyKSk7Cn0KCi8qIFNpZGViYXIgKGNhbiBiZSBsZWZ0IG9yIHJpZ2h0KSAqLwoubWpyLXNpZGViYXIgewogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXdyYXAgewogICAgbWFyZ2luOiAwIDAgMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA4MiUsIHRyYW5zcGFyZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLW1kLCA4cHgpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDcyJSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUgewogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNlYWVhZWEpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgoubWpyLXdvcmtmbG93LXRyZWUtc2Nyb2xsIHsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgcGFkZGluZzogMnB4IDRweCA2cHg7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLW1qci1yLXNtLCA2cHgpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1jb250ZW50OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA1OCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci13b3JrZmxvdy10cmVlLXRvZ2dsZSB7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMjBweDsKICAgIHBhZGRpbmc6IDA7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NCkpOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtdG9nZ2xlW2RhdGEtcC1sZWFmPSJ0cnVlIl0gewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtaWNvbiB7CiAgICB3aWR0aDogOHB4OwogICAgZmxleDogMCAwIDhweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgNzAlLCB2YXIoLS1jb250ZW50LWZnKSk7CiAgICBmb250LXNpemU6IDdweDsKfQoKLm1qci13b3JrZmxvdy10cmVlLWxhYmVsIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdvcmtmbG93LXRyZWUtbm9kZS1uYW1lIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItd29ya2Zsb3ctdHJlZS1ub2RlLXR5cGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbXV0ZWQpIDc1JSwgdmFyKC0tY29udGVudC1mZykpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1zaWRlYmFyLmlzLW9wZW4gewogICAgLyogQm9yZGVyIGlzIHNldCBkeW5hbWljYWxseSBiYXNlZCBvbiBwb3NpdGlvbiAqLwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiA4cHg7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLXNpZGViYXIgLm1qci1zaWRlYmFyLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7Cn0KCi8qIEN1c3RvbSBSb290cyBQb3BvdmVyIFN0eWxpbmcgKi8KLm1qci1jdXN0b20tcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDMwMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSkpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcsIDAuNXJlbSk7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjhweCByZ2JhKDAsIDAsIDAsIDAuMzUpOwogICAgei1pbmRleDogdmFyKC0tbWpyLXBvcG92ZXItei1pbmRleCk7CiAgICBwYWRkaW5nOiAxMnB4Owp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1yb3c6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItcG9wb3Zlci1sYWJlbCB7CiAgICB3aWR0aDogNjBweDsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHZhcigtLWRlc2NyaXAtdGV4dCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjY1KSkpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLXNlbGVjdCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWN1c3RvbS1wb3BvdmVyIC5tanItYnRuIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMTglLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1jdXN0b20tcG9wb3ZlciAubWpyLWJ0bi5tanItcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB2YXIoLS1tanItc3VyZmFjZS0yKSk7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA4MCUsIHZhcigtLW1qci1ib3JkZXIpKTsKfQoKLm1qci1zaWRlYmFyIC5tanItc2lkZWJhci1zZWN0aW9uIHsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5tanItc2lkZWJhciAubWpyLXNpZGViYXItc2VjdGlvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMykgIWltcG9ydGFudDsKfQoKLyogSW5saW5lIFNpZGViYXIgKHdpZHRoLWJhc2VkIHRyYW5zaXRpb25zIGxpa2UgYXJjaGl2ZWQgdmVyc2lvbikgKi8KLm1qci1pbmxpbmUtc2lkZWJhciB7CiAgICB3aWR0aDogMDsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogNDgwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zaXRpb246CiAgICAgICAgd2lkdGggMC4zcyBlYXNlLAogICAgICAgIG1pbi13aWR0aCAwLjNzIGVhc2U7Cn0KCi5tanItaW5saW5lLXNpZGViYXIuaXMtb3BlbiB7CiAgICB3aWR0aDogNDAwcHg7CiAgICBtaW4td2lkdGg6IDI2MHB4Owp9CgovKiBTcGFjZSBiZXR3ZWVuIHNpZGViYXIgYW5kIGdyaWQgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFtLWJyb3dzZSB7CiAgICBnYXA6IDA7Cn0KCi8qIEJvcmRlciBiYXNlZCBvbiBwb3NpdGlvbiAqLwoubWpyLWlubGluZS1zaWRlYmFyW2RhdGEtcG9zaXRpb249ImxlZnQiXSB7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci1pbmxpbmUtc2lkZWJhcltkYXRhLXBvc2l0aW9uPSJyaWdodCJdIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi8qIFNpZGViYXIgcGxhY2Vob2xkZXIgKi8KLm1qci1zaWRlYmFyLXBsYWNlaG9sZGVyIHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi8qID09PT09PT09PT0gVmlld2VyIENvbXBvbmVudCA9PT09PT09PT09ICovCi5tanItdmlld2VyLW92ZXJsYXkgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYm90dG9tOiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjk1KTsKICAgIC8qIFNpdCBhYm92ZSBNRlYgKDEwMDAwKSBzbyB0aGUgZnVsbCB2aWV3ZXIgYWx3YXlzIGNvdmVycyB0aGUgZmxvYXRpbmcgcGFuZWwgKi8KICAgIHotaW5kZXg6IDEwMDAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQovKiBGYWRlLWluOiBhbmltYXRpb24gcmUtdHJpZ2dlcnMgZWFjaCB0aW1lIEpTIHN3aXRjaGVzIGRpc3BsYXkgYmFjayB0byBmbGV4ICovCi5tanItdmlld2VyLW92ZXJsYXlbc3R5bGUqPSJmbGV4Il0gewogICAgYW5pbWF0aW9uOiBtanItZmFkZS1pbiAwLjE4cyBlYXNlLW91dDsKfQoKQGtleWZyYW1lcyBtanItZmFkZS1pbiB7CiAgICBmcm9tIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45OTUpOwogICAgfQogICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgIH0KfQoKLm1qci12aWV3ZXItaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogMTJweCAyMHB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE3MGRlZywgcmdiYSgyNCwgMjcsIDMzLCAwLjk2KSwgcmdiYSgxNywgMTksIDI1LCAwLjk3KSk7CiAgICBib3JkZXItYm90dG9tOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMik7CiAgICBjb2xvcjogd2hpdGU7Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBtYXgtd2lkdGg6IDQwMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA0cHggMTJweDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4xKSwgcmdiYSgyMDYsIDIxMSwgMjE4LCAwLjAzKSk7CiAgICBib3JkZXI6IDAuOHB4IHNvbGlkIHJnYmEoMTk2LCAyMDIsIDIxMCwgMC4zKTsKICAgIGNvbG9yOiByZ2JhKDIzMCwgMjMzLCAyMzgsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTZzOwp9CgoubWpyLXZpZXdlci1tb2RlLWJ1dHRvbnMgYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4xNCksIHJnYmEoMjEwLCAyMTQsIDIyMCwgMC4wNikpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNDIpOwp9CgovKiBWaWV3ZXIgY2xvc2UgYnV0dG9uIHBpbm5lZCB0byBvdmVybGF5IGNvcm5lciAqLwoubWpyLXZpZXdlci1jbG9zZSwKLm1qci12aWV3ZXItZnMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjYpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4ICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wOCksIHJnYmEoMjA2LCAyMTEsIDIxOCwgMC4wMikpLAogICAgICAgIHJnYmEoMjAsIDIzLCAyOSwgMC45NCkgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1jbG9zZSB7CiAgICBjb2xvcjogI2ZmZjRmNCAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIwNSwgODIsIDgyLCAwLjUpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA1LCA4MiwgODIsIDAuMyksIHJnYmEoMjA1LCA4MiwgODIsIDAuMTIpKSwKICAgICAgICByZ2JhKDU4LCAxOCwgMTgsIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDIxOSwgMjE5LCAwLjE2KSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyMDUsIDgyLCA4MiwgMC4wOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2U6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMzgpLCByZ2JhKDIzNSwgMTEwLCAxMTAsIDAuMTYpKSwKICAgICAgICByZ2JhKDcwLCAxOCwgMTgsIDAuOTcpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjM1LCAxMzgsIDEzOCwgMC42NCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItZnM6aG92ZXIgewogICAgYmFja2dyb3VuZDoKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMTQpLCByZ2JhKDIxMCwgMjE0LCAyMjAsIDAuMDYpKSwKICAgICAgICByZ2JhKDIzLCAyNiwgMzIsIDAuOTUpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjE0LCAyMTgsIDIyNCwgMC4zOCkgIWltcG9ydGFudDsKfQoKLm1qci12aWV3ZXItY2xvc2UgLnBpIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZXdlci1jb250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItc2luZ2xlLAoubWpyLXZpZXdlci1hYiwKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKfQoKLm1qci12aWV3ZXItc2luZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5tanItdmlld2VyLXNpbmdsZSBpbWcsCi5tanItdmlld2VyLXNpbmdsZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzOwp9CgoubWpyLXZpZXdlci1hYiB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgZ2FwOiAycHg7Cn0KCi5tanItdmlld2VyLXNpZGVieXNpZGUgPiBkaXYgewogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwp9CgoubWpyLXZpZXdlci1zaWRlYnlzaWRlIGltZywKLm1qci12aWV3ZXItc2lkZWJ5c2lkZSB2aWRlbyB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKfQoKLm1qci12aWV3ZXItZm9vdGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMnB4IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgY29sb3I6IHdoaXRlOwogICAgZ2FwOiAyMHB4Owp9CgoubWpyLXZpZXdlci1mb290ZXIgYnV0dG9uIHsKICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBjb2xvcjogd2hpdGU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4yczsKfQoKLm1qci12aWV3ZXItZm9vdGVyIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItdmlld2VyLW5hdiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTRweDsKfQoKLm1qci12aWV3ZXItbmF2LWJ0biB7CiAgICB3aWR0aDogNDBweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiA0MHB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4ICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuNDIpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4xOCksIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4wNykpLAogICAgICAgIHJnYmEoMzQsIDM4LCA0NCwgMC45MikgIWltcG9ydGFudDsKICAgIGNvbG9yOiByZ2JhKDIzNCwgMjM2LCAyNDAsIDAuOTYpICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDIwcHggIWltcG9ydGFudDsKICAgIGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDsKICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7CiAgICB0ZXh0LXNoYWRvdzogbm9uZTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDAuMTRzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjE0cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE0cyBlYXNlICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLW5hdi1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIxNCwgMjE4LCAyMjQsIDAuNTYpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjA3LCAyMTIsIDIxOSwgMC4yKSwgcmdiYSgyMDcsIDIxMiwgMjE5LCAwLjEpKSwKICAgICAgICByZ2JhKDM5LCA0MywgNDksIDAuOTQpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKfQoKLm1qci12aWV3ZXItbmF2LWJ0bjphY3RpdmU6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDAuOTgpOwogICAgZmlsdGVyOiBub25lOwp9CgoubWpyLXZpZXdlci1uYXYtYnRuOmRpc2FibGVkIHsKICAgIG9wYWNpdHk6IDAuMzQgIWltcG9ydGFudDsKICAgIGZpbHRlcjogZ3JheXNjYWxlKDAuMjUpOwogICAgYm94LXNoYWRvdzogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci1pbmRleCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBtaW4td2lkdGg6IDc0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGNvbG9yOiByZ2JhKDIyNiwgMjI4LCAyMzMsIDAuOTQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxOTcsIDIwMywgMjExLCAwLjE1KSwgcmdiYSgxOTcsIDIwMywgMjExLCAwLjA2KSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NywgMjAzLCAyMTEsIDAuMzQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBwYWRkaW5nOiA1cHggMTFweDsKICAgIHRleHQtc2hhZG93OiBub25lOwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwp9CgoubWpyLXZpZXdlci1wbGF5ZXJiYXIgewogICAgYm9yZGVyLXJhZGl1czogMThweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTk0LCAyMDAsIDIwOCwgMC4xNik7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgdG9wIGxlZnQsIHJnYmEoOTAsIDE1MCwgMjU1LCAwLjA4KSwgdHJhbnNwYXJlbnQgMzYlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTYwZGVnLCByZ2JhKDIwLCAyNCwgMzAsIDAuOTQpLCByZ2JhKDEyLCAxNSwgMjEsIDAuOTgpKTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpLAogICAgICAgIDAgMTZweCAzNnB4IHJnYmEoMCwgMCwgMCwgMC4yMik7CiAgICAvKiBvdmVyZmxvdyBtdXN0IHN0YXkgdmlzaWJsZSBzbyB0aGUgc2VlayBydWxlciB0aWNrcy9sYWJlbHMgKHRvcDotMTZweCAvIHRvcDotMzRweCkKICAgICAgIHRoYXQgYXJlIGFic29sdXRlbHkgcG9zaXRpb25lZCBhYm92ZSB0aGUgc2VlayBiYXIgYXJlIG5vdCBjbGlwcGVkLiAqLwogICAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5tanItdmlld2VyLXRvb2xzIHsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZXdlci1oZWFkZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoubWpyLXZpZXdlci1oZWFkZXI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMThweDsKICAgIHJpZ2h0OiAxOHB4OwogICAgdG9wOiA0NHB4OwogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHRyYW5zcGFyZW50LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLCB0cmFuc3BhcmVudCk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDAuNzsKfQoKLm1qci12aWV3ZXItaGVhZGVyLW1ldGEgewogICAgbWluLWhlaWdodDogMzBweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9CgoubWpyLXZpZXdlci1oZWFkZXItdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBwYWRkaW5nLXJpZ2h0OiA4NHB4OwogICAgcGFkZGluZy1sZWZ0OiAxMnB4Owp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tbGVmdCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMSAxIDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tY2VudGVyIHsKICAgIG1pbi13aWR0aDogMDsKICAgIGZsZXg6IDEgMSBhdXRvOwp9CgoubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgIGZsZXg6IDEgMSAwOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci12aWV3ZXItdGl0bGUtd3JhcCB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC13aWR0aDogbWluKDEwMCUsIGNhbGMoMTAwdncgLSAyMjBweCkpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKfQoKLm1qci12aWV3ZXItdGl0bGUtbGluZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItdmlld2VyLWZpbGVuYW1lIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW46IDAgYXV0bzsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm1qci12aWV3ZXItYmFkZ2VzIHsKICAgIGdhcDogNHB4Owp9CgoubWpyLXZpZXdlci10aXRsZS1saW5lIC5tanItdmlld2VyLWJhZGdlcyB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci1oZWFkZXItbWV0YS0tbGVmdCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB3aWR0aDogZml0LWNvbnRlbnQ7CiAgICBtYXgtd2lkdGg6IDEwMCU7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0OmVtcHR5IHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICBqdXN0aWZ5LXNlbGY6IGVuZDsKICAgIHdpZHRoOiBmaXQtY29udGVudDsKICAgIG1heC13aWR0aDogMTAwJTsKfQoKLm1qci12aWV3ZXItbW9kZS1idXR0b25zIHsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgcGFkZGluZzogM3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiBub3dyYXA7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBtaW4td2lkdGg6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIHJnYmEoMTAsIDEyLCAxNiwgMC4yNCk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwKICAgICAgICAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4xMik7CiAgICBwYWRkaW5nOiA1cHggNnB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMCAwIGF1dG8gMDsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSwgdHJhbnNwYXJlbnQpOwogICAgb3BhY2l0eTogMC43OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWhlYWQgewogICAgZGlzcGxheTogbm9uZTsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtaGVhZGluZyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMXB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbC1leWVicm93IHsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjE0ZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Nik7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMWVtOwogICAgY29sb3I6IHJnYmEoMjQ4LCAyNTAsIDI1MiwgMC45Nik7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIGdhcDogNnB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJncmFkZSJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0ib3ZlcmxheSJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgZGlzcGxheTogZmxleDsKfQoKLm1qci12aWV3ZXItdG9vbHMtcGFuZWxbZGF0YS1wYW5lbD0iaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHksCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9ImFjdGlvbnMiXSAubWpyLXZpZXdlci10b29scy1wYW5lbC1ib2R5LAoubWpyLXZpZXdlci10b29scy1wYW5lbFtkYXRhLXBhbmVsPSJpbmZvIl0gLm1qci12aWV3ZXItdG9vbHMtcGFuZWwtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cCB7CiAgICB3aWR0aDogYXV0bzsKICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzNSksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIHJnYmEoMTAsIDEyLCAxNiwgMC4xOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7CiAgICBtaW4td2lkdGg6IGZpdC1jb250ZW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjE1cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW3N0eWxlKj0iLS1tanItZ3JvdXAtYWNjZW50Il0gLm1qci12aWV3ZXItdG9vbHMtZ3JvdXAtbGFiZWwgewogICAgY29sb3I6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuOSk7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW3N0eWxlKj0iLS1tanItZ3JvdXAtYWNjZW50Il0gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjM1KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY2hhbm5lbCJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2xzLWdyb3VwLWxhYmVsLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29scy1ncm91cC1sYWJlbCB7CiAgICBtaW4td2lkdGg6IDQycHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXBhbmVsW2RhdGEtcGFuZWw9Im92ZXJsYXkiXSAubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIHsKICAgIGZsZXg6IDAgMCBhdXRvOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdLAoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSB7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgYWxpZ24tY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJjaGFubmVsIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImV4cG9zdXJlIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImdhbW1hIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0sCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXSwKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iYXVkaW8tdml6Il0gewogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb25zLAoubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgIHdpZHRoOiBhdXRvOwogICAgbWluLWhlaWdodDogMzBweDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBwYWRkaW5nOiA1cHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tanItdmlld2VyLXRvb2xzLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBnYXA6IDZweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci12aWV3ZXItdG9vbHMtYWN0aW9uLS1wcmltYXJ5IHsKICAgIG1hcmdpbi1sZWZ0OiAwOwp9CgoubWpyLXZpZXdlci10b29scy1hY3Rpb24gKyAubWpyLXZpZXdlci10b29scy1hY3Rpb24gewogICAgbWFyZ2luLWxlZnQ6IDRweDsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIG1pbi1oZWlnaHQ6IDI0cHg7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlLWlucHV0IHsKICAgIHdpZHRoOiA5MnB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLXJhbmdlIHNwYW4gewogICAgZm9udC1zaXplOiAxMXB4Owp9CgpAbWVkaWEgKG1heC13aWR0aDogMTQ4MHB4KSB7CiAgICAubWpyLXZpZXdlci10b29scy1kZWNrIHsKICAgICAgICBnYXA6IDZweDsKICAgIH0KfQoKQG1lZGlhIChtYXgtd2lkdGg6IDEyMjBweCkgewogICAgLm1qci12aWV3ZXItaGVhZGVyLXRvcCB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDg0cHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAwOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1yaWdodCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXg6IDEgMSAxMDAlOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1yaWdodCB7CiAgICAgICAganVzdGlmeS1zZWxmOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtZGVjayB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtcGFuZWwsCiAgICAubWpyLXZpZXdlci10b29scy1hY3Rpb25zLAogICAgLm1qci12aWV3ZXItdG9vbHMtbWV0YSwKICAgIC5tanItdmlld2VyLXRvb2xzLXBhbmVsLWJvZHkgewogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1tZXRhIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB9Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImNvbXBhcmUiXVtkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGJhY2tncm91bmQ6IHJnYmEodmFyKC0tbWpyLWdyb3VwLWFjY2VudCksIDAuMSk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC42KTsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjIyKTsKfQoKLm1qci12aWV3ZXItdG9vbHMtZ3JvdXBbZGF0YS1ncm91cD0iY29tcGFyZSJdW2RhdGEtYWN0aXZlPSIxIl0gLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSh2YXIoLS1tanItZ3JvdXAtYWNjZW50KSwgMC42KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQpLCAwLjE4KTsKfQoKLm1qci12aWV3ZXItdG9vbHMtc2VsZWN0OmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSg2NCwgMTYwLCAyNTUsIDAuMjIpOwp9CgovKiBOYXRpdmUgZHJvcGRvd25zOiBoaW50IGRhcmsgVUkgYW5kIHN0eWxlIG9wdGlvbnMgd2hlbiB0aGUgYnJvd3NlciBhbGxvd3MgaXQuICovCi5tanItdmlld2VyLWhlYWRlciB7CiAgICBjb2xvci1zY2hlbWU6IGRhcms7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCB7CiAgICBtaW4taGVpZ2h0OiAyNHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjQ2KSAhaW1wb3J0YW50OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45MikgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogOHB4ICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLXNlbGVjdCBvcHRpb24gewogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgdmFyKC0taW5wdXQtdGV4dCwgI2RkZCkpOwp9CgoubWpyLXZpZXdlci10b29scy1yYW5nZS1pbnB1dDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLXZpZXdlci10b29sLWJ0bi0tcmVzZXQgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2wtYnRuIHsKICAgIG1pbi1oZWlnaHQ6IDI0cHggIWltcG9ydGFudDsKICAgIGJvcmRlci1yYWRpdXM6IDhweCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXdpZHRoOiAxcHggIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA3NSksCiAgICAgICAgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyNSkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjE2KSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwIDhweCAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4yNCkgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjEpLAogICAgICAgIHJnYmEoMjIwLCAyMjQsIDIzMCwgMC4wMzUpCiAgICApICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9ImFuYWx5c2lzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoMjU1LCAxNjYsIDkyLCAwLjIyKSwKICAgICAgICByZ2JhKDI1NSwgMTE2LCA2NCwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE2MCwgOTIsIDAuMzQpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIzNiwgMjI0LCAwLjk2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJhbmFseXNpcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDI1NSwgMTgwLCAxMDgsIDAuMjgpLAogICAgICAgIHJnYmEoMjU1LCAxMjgsIDcyLCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMTg0LCAxMTYsIDAuNDYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktZ3VpZGVzIl0gLm1qci12aWV3ZXItdG9vbC1idG5bZGF0YS1hY3RpdmU9IjEiXSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIHJnYmEoOTIsIDIxOSwgMTg2LCAwLjIyKSwKICAgICAgICByZ2JhKDQ0LCAxNzAsIDE0NCwgMC4wOCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5MiwgMjE5LCAxODYsIDAuMzQpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMjQsIDI1NSwgMjQ4LCAwLjk2KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWd1aWRlcyJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl06aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEwMiwgMjMwLCAxOTYsIDAuMjgpLAogICAgICAgIHJnYmEoNTIsIDE4MiwgMTU2LCAwLjE0KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDExMCwgMjM2LCAyMDIsIDAuNDYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLXRvb2xzLWdyb3VwW2RhdGEtZ3JvdXA9Im92ZXJsYXktaW5zcGVjdCJdIC5tanItdmlld2VyLXRvb2wtYnRuW2RhdGEtYWN0aXZlPSIxIl0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICByZ2JhKDEyNCwgMTY2LCAyNTUsIDAuMjIpLAogICAgICAgIHJnYmEoMTA5LCA4OCwgMjIyLCAwLjA4KQogICAgKSAhaW1wb3J0YW50OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEzMiwgMTcwLCAyNTUsIDAuMzYpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0MiwgMjU1LCAwLjk3KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29scy1ncm91cFtkYXRhLWdyb3VwPSJvdmVybGF5LWluc3BlY3QiXSAubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgcmdiYSgxMzgsIDE4MCwgMjU1LCAwLjMpLAogICAgICAgIHJnYmEoMTI0LCAxMDAsIDIzMiwgMC4xNCkKICAgICkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgxNDgsIDE4OCwgMjU1LCAwLjQ4KSAhaW1wb3J0YW50Owp9CgoubWpyLXZpZXdlci10b29sLWJ0bltkYXRhLWFjdGl2ZT0iMSJdIHsKICAgIGZpbHRlcjogc2F0dXJhdGUoMS4xMikgYnJpZ2h0bmVzcygxLjA0KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSksCiAgICAgICAgMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksCiAgICAgICAgMCA4cHggMThweCByZ2JhKDAsIDAsIDAsIDAuMTYpICFpbXBvcnRhbnQ7Cn0KCi5tanItdmlld2VyLWhlbHAgewogICAgYm9yZGVyLXJhZGl1czogMTRweCAhaW1wb3J0YW50OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMywgMTcsIDIyLCAwLjk2KSwgcmdiYSg4LCAxMSwgMTYsIDAuOTgpKSAhaW1wb3J0YW50OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSAhaW1wb3J0YW50OwogICAgYm94LXNoYWRvdzogMCAxOHB4IDM0cHggcmdiYSgwLCAwLCAwLCAwLjM0KSAhaW1wb3J0YW50Owp9CgpAbWVkaWEgKG1heC13aWR0aDogMTIyMHB4KSB7CiAgICAubWpyLXZpZXdlci10b29scyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLm1qci12aWV3ZXItdG9vbHMtYWN0aW9ucyB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci10b3AgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tbGVmdCwKICAgIC5tanItdmlld2VyLWhlYWRlci1hcmVhLS1jZW50ZXIsCiAgICAubWpyLXZpZXdlci1oZWFkZXItYXJlYS0tcmlnaHQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQoKICAgIC5tanItdmlld2VyLWhlYWRlci1tZXRhLS1sZWZ0LAogICAgLm1qci12aWV3ZXItaGVhZGVyLW1ldGEtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LXNlbGY6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZXdlci10b29scy1ib2R5IHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIyMHB4LCAxZnIpKTsKICAgIH0KfQoKLyogPT09PT09PT09PSBDdXN0b20gVmlkZW8gQ29udHJvbHMgKG5vIG5hdGl2ZSBiYXIpID09PT09PT09PT0gKi8KLm1qci12aWRlby1ob3N0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLm1qci12aWRlby1jb250cm9scyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMnB4OwogICAgcmlnaHQ6IDEycHg7CiAgICBib3R0b206IDEycHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIG9wYWNpdHk6IDA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZTsKICAgIHotaW5kZXg6IDU7Cn0KCi5tanItdmlkZW8tcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGdhcDogMTJweDsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG8gMWZyIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBhdXRvIGF1dG8gMWZyIGF1dG8gYXV0bzsKfQoKLm1qci12aWRlby1jb250cm9scy0tcHJldmlldyAubWpyLXZpZGVvLXJvdy0tdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7Cn0KCi5tanItdmlkZW8tcm93LS1ib3R0b20gewogICAgZ2FwOiA4cHg7Cn0KCi5tanItdmlkZW8tZ3JvdXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLW51bSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgcGFkZGluZzogNXB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci12aWRlby1udW06Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzgpOwp9CgoubWpyLXZpZGVvLW51bS0tc3BlZWQgewogICAgY29sb3Itc2NoZW1lOiBkYXJrOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYyKTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOwp9CgoubWpyLXZpZGVvLW51bS0tc3BlZWQgb3B0aW9uIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwp9CgoubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICBtaW4td2lkdGg6IDUycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLWZyYW1lLmlzLXN0ZXAgewogICAgY29sb3I6ICNmZmQyNGQ7Cn0KCi5tanItdmlkZW8tYm90dG9tIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4OiAxOwp9CgoubWpyLXZpZGVvLWJvdHRvbS0tbGVmdCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7Cn0KCi5tanItdmlkZW8tYm90dG9tLS1yaWdodCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgoubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMCAwIGF1dG87Cn0KCi8qIFNob3cgY29udHJvbHMgb24gaG92ZXIvZm9jdXMgKHZpZXdlcikuICovCi5tanItdmlkZW8taG9zdDpob3ZlciAubWpyLXZpZGVvLWNvbnRyb2xzLAoubWpyLXZpZGVvLWNvbnRyb2xzOmZvY3VzLXdpdGhpbiB7CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87Cn0KCi8qIFByZXZpZXc6IGtlZXAgY29udHJvbHMgdmlzaWJsZSBiZWNhdXNlIHRoZSBhcmVhIGlzIHNtYWxsLiAqLwoubWpyLXZpZGVvLWNvbnRyb2xzLS1wcmV2aWV3IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IGF1dG87CiAgICByaWdodDogMTBweDsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogMTBweDsKICAgIG9wYWNpdHk6IDE7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IGF1dG87CiAgICBiYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogbm9uZTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biB7CiAgICB3aWR0aDogMzhweDsKICAgIGhlaWdodDogMzhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZGVvLXByZXZpZXctYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci12aWRlby1wcmV2aWV3LWJ0biAucGkgewogICAgZm9udC1zaXplOiAxNnB4OwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5tanItdmlkZW8tYnRuIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgY29sb3I6ICNmZmY7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLXZpZGVvLWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwp9CgoubWpyLXZpZGVvLWJ0bi5pcy1vbiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxNjAsIDI1NSwgMC4yNSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNjQsIDE2MCwgMjU1LCAwLjU1KTsKfQoKLm1qci12aWRlby1idG4tLWluIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3MCwgMjU1LCAxMjAsIDAuNTUpOwogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuMTIpOwp9CgoubWpyLXZpZGVvLWJ0bi0taW46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuMTgpOwp9CgoubWpyLXZpZGVvLWJ0bi0tb3V0IHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDcwLCA3MCwgMC41NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjEpOwp9CgoubWpyLXZpZGVvLWJ0bi0tb3V0OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuMTYpOwp9CgoubWpyLXZpZGVvLXRpbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgIG1pbi13aWR0aDogOTJweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgZ2FwOiAxMHB4OwogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC45Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDY0LCAxOTAsIDI1NSwgMC4xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNjQsIDE5MCwgMjU1LCAwLjI1KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgcGFkZGluZzogMXB4IDhweDsKICAgIGxpbmUtaGVpZ2h0OiAxNnB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLXZpZGVvLXJhbmdlIHsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAxOwogICAgLyogV2UgZHJhdyBvdXIgb3duIHBsYXloZWFkL21hcmtlcnM7IGhpZGUgdGhlIG5hdGl2ZSB0aHVtYiAiZG90Ii4gKi8KICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXNlZWs6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1yYW5nZS0tc2Vlazo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMDsKICAgIGhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbWluLXdpZHRoOiA4MHB4OwogICAgZmxleDogMTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHotaW5kZXg6IDI7Cn0KCi5tanItdmlkZW8tc2Vlay16b25lIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIGJvdHRvbTogMDsKfQoKLyogMC4uSW46IHRyaW1tZWQtb3V0IHJhbmdlLiAqLwoubWpyLXZpZGVvLXNlZWstem9uZS0tbGVmdFRyaW0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDcwLCA3MCwgMC4xOCk7Cn0KCi8qIEluLi5PdXQ6IHNlbGVjdGVkIHBsYXliYWNrIHJhbmdlIGhpZ2hsaWdodC4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLXNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjQsIDE5MCwgMjU1LCAwLjU1KTsKfQoKLm1qci12aWRlby1zZWVrLXpvbmVzLmlzLWZ1bGxyYW5nZSAubWpyLXZpZGVvLXNlZWstem9uZS0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKfQoKLyogT3V0Li5FbmQ6IHNob3cgb3V0LW9mLXJhbmdlIGZyYW1lcyBhcyBhIGRpZmZlcmVudCBjb2xvci4gKi8KLm1qci12aWRlby1zZWVrLXpvbmUtLXJpZ2h0VHJpbSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgNzAsIDcwLCAwLjIpOwp9CgoubWpyLXZpZGVvLXNlZWstb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IDUwJTsKICAgIGhlaWdodDogMDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMzsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICBjdXJzb3I6IGV3LXJlc2l6ZTsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdG91Y2gtYWN0aW9uOiBub25lOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB6LWluZGV4OiA0OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItdmlkZW8tc2Vlay1oYW5kbGU6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YWZ0ZXIsCi5tanItdmlkZW8tc2Vlay1oYW5kbGUtLW91dDo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDUwJTsKICAgIHdpZHRoOiAycHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA3MCwgNzAsIDAuOTUpOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YWZ0ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg3MCwgMjU1LCAxMjAsIDAuOTUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YmVmb3JlLAoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1vdXQ6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwp9CgoubWpyLXZpZGVvLXNlZWstaGFuZGxlLS1pbjo6YmVmb3JlIHsKICAgIHRvcDogNHB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHJnYmEoNzAsIDI1NSwgMTIwLCAwLjk1KTsKfQoKLm1qci12aWRlby1zZWVrLWhhbmRsZS0tb3V0OjpiZWZvcmUgewogICAgYm90dG9tOiA0cHg7CiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItdG9wOiA2cHggc29saWQgcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay10aWNrcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IC0xNnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci12aWRlby1zZWVrLWxhYmVscyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICB0b3A6IC0zNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsaW5lLWhlaWdodDogMTRweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC41NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubWpyLXZpZGVvLXNlZWstcGxheWhlYWQtbGFiZWwgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAxMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgcGFkZGluZzogMXB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjU1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLXZpZGVvLXNlZWstbWFyayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0xMHB4OwogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIGN1cnNvcjogZXctcmVzaXplOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB0b3VjaC1hY3Rpb246IG5vbmU7CiAgICB6LWluZGV4OiA0OwogICAgLS1tanItbWFyay1jb2xvcjogcmdiYSgyNTUsIDcwLCA3MCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1pbiB7CiAgICAtLW1qci1tYXJrLWNvbG9yOiByZ2JhKDcwLCAyNTUsIDEyMCwgMC45NSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiA1MCU7CiAgICB0b3A6IDA7CiAgICBib3R0b206IDA7CiAgICB3aWR0aDogMnB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLW1hcmstY29sb3IpOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrOjphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTVweDsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWJvdHRvbTogNnB4IHNvbGlkIHZhcigtLW1qci1tYXJrLWNvbG9yKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKfQoKLm1qci12aWRlby1zZWVrLW1hcmstLWluOjphZnRlciB7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tanItbWFyay1jb2xvcik7Cn0KCi5tanItdmlkZW8tc2Vlay1tYXJrLS1vdXQ6OmFmdGVyIHsKICAgIHRvcDogYXV0bzsKICAgIGJvdHRvbTogLTVweDsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICBib3JkZXItdG9wOiA2cHggc29saWQgdmFyKC0tbWpyLW1hcmstY29sb3IpOwp9CgoubWpyLXZpZGVvLXNlZWstcGxheWhlYWQgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAtMTJweDsKICAgIHdpZHRoOiAycHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjAwLCA3MCwgMC45NSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMXB4KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIHsKICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICBsZWZ0OiBhdXRvOwogICAgcmlnaHQ6IGF1dG87CiAgICBib3R0b206IGF1dG87CiAgICBvcGFjaXR5OiAxOwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOiAxOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxOTYsIDIwMiwgMjEwLCAwLjEyKTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCB0b3AgbGVmdCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKSwgdHJhbnNwYXJlbnQgMzQlKSwKICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDE5OCwgMjAzLCAyMTAsIDAuMDI1KSwgcmdiYSgxOTgsIDIwMywgMjEwLCAwLjAwOCkpLAogICAgICAgIGxpbmVhci1ncmFkaWVudCgxNjVkZWcsIHJnYmEoMTgsIDIyLCAyOCwgMC44MiksIHJnYmEoMTIsIDE1LCAyMSwgMC45KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwKICAgICAgICAwIDEwcHggMzBweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBub25lOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IG5vbmU7CiAgICBnYXA6IDEycHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJ0biB7CiAgICBtaW4taGVpZ2h0OiAzOHB4OwogICAgcGFkZGluZzogOHB4IDEycHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA3KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOCwgMC4xOCk7CiAgICBib3JkZXItd2lkdGg6IDFweDsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDAuMTJzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjEycyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjEycyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xMnMgZWFzZTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMjAsIDIyNCwgMjMwLCAwLjI2KTsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpLAogICAgICAgIDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE0KTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuLmlzLW9uIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTAwLCAxNzAsIDI1NSwgMC4yKSwgcmdiYSgxMDAsIDE3MCwgMjU1LCAwLjA4KSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTIwLCAxODYsIDI1NSwgMC40Mik7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgxMjAsIDE4NiwgMjU1LCAwLjEyKSBpbnNldDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYnRuIC5waSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWhlYWQsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpIGF1dG8gbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDEycHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc3RhdHVzLAoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc2lkZSB7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLWNlbnRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItc2lkZS0tcmlnaHQgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gbWlubWF4KDAsIDFmcikgYXV0bzsKICAgIGdhcDogMTJweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLW1lZGlhLWJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDAgMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSg3OCwgMjI0LCAxOTYsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3OCwgMjI0LCAxOTYsIDAuMjIpOwogICAgY29sb3I6IHJnYmEoMjIwLCAyNDcsIDI0MSwgMC45Nik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDhlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWVncm91cCB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQ1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXRpbWUsCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWZyYW1lIHsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7CiAgICBjb2xvcjogcmdiYSgyMjgsIDIzMCwgMjM0LCAwLjkyKTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1mcmFtZSB7CiAgICBtaW4td2lkdGg6IDk0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10aW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXJhbmdlLS1zZWVrIHsKICAgIGhlaWdodDogMjJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyMTQsIDIxOCwgMjI0LCAwLjkyKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tcmFuZ2UtY291bnQgewogICAgY29sb3I6IHJnYmEoMjIyLCAyMjUsIDIzMCwgMC45NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTk0LCAyMDEsIDIwOSwgMC4yNik7CiAgICBib3JkZXItd2lkdGg6IDAuOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxOTQsIDIwMSwgMjA5LCAwLjA4KTsKICAgIHRleHQtc2hhZG93OiBub25lOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1ncm91cCB7CiAgICBtaW4taGVpZ2h0OiAzNnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWdyb3VwLS1hZGp1c3QtbGVmdCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLWFkanVzdC1yaWdodCwKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tZ3JvdXAtLXNwZWVkIHsKICAgIGdhcDogOHB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1udW0gewogICAgbWluLWhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDksIDEyLCAxNiwgMC41NSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdHJhbnNwb3J0IHsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0NSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1idG4tLXBsYXkgewogICAgbWluLXdpZHRoOiA4OHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi1oZWlnaHQ6IDQ0cHg7Cn0KCi5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLXNlZWstem9uZXMgewogICAgaGVpZ2h0OiAxMnB4Owp9CgoubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1zZWVrLWhhbmRsZSB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMzRweDsKICAgIGJvcmRlci1yYWRpdXM6IDhweDsKfQoKLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tdm9sdW1lLXdyYXAgewogICAgcGFkZGluZzogMCA0cHg7Cn0KCi5tanItdmlkZW8tcmFuZ2UtLXZvbHVtZSB7CiAgICB3aWR0aDogOTBweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDk4MHB4KSB7CiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItaGVhZCwKICAgIC5tanItdmlkZW8tY29udHJvbHMtLXZpZXdlcmJhciAubWpyLXZpZGVvLWJhci1hY3Rpb25zLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItY2VudGVyLAogICAgLm1qci12aWRlby1jb250cm9scy0tdmlld2VyYmFyIC5tanItdmlkZW8tYmFyLXNpZGUtLXJpZ2h0IHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGdhcDogMTBweDsKICAgIH0KCiAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby10cmFuc3BvcnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgfQp9CgovKiA9PT09PT09PT09IENvbnRleHQgTWVudSBDb21wb25lbnQgPT09PT09PT09PSAqLwoubWpyLWNvbnRleHQtbWVudSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAvKiBBYm92ZSB2aWV3ZXIgb3ZlcmxheSAoMTAwMDEpIGFuZCBNRlYgZGlhbG9nICgxMDAwMCkgKi8KICAgIHotaW5kZXg6IDEwMDAyOwogICAgZGlzcGxheTogbm9uZTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYW5pbWF0aW9uOiBtanItY29udGV4dC1tZW51LWluIDAuMTVzIGVhc2Utb3V0Owp9CgoubWpyLWNvbnRleHQtbWVudSwKLm1qci1jb250ZXh0LW1lbnUgKiB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9CgpAa2V5ZnJhbWVzIG1qci1jb250ZXh0LW1lbnUtaW4gewogICAgZnJvbSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTVweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICBtYXJnaW46IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZmctY29sb3IpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVyIHsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW06aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1pbnB1dC1iZyk7CiAgICBvdXRsaW5lOiBub25lOwp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLmlzLWRpc2FibGVkIHsKICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIG9wYWNpdHk6IDAuNDU7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6aG92ZXIsCi5tanItY29udGV4dC1tZW51LWl0ZW0uaXMtZGlzYWJsZWQ6Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLm1qci1jb250ZXh0LW1lbnUtc2VwYXJhdG9yIHsKICAgIGhlaWdodDogMXB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyLWNvbG9yKTsKICAgIG1hcmdpbjogNHB4IDA7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCwKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7Cn0KCi5tanItY29udGV4dC1tZW51LWl0ZW0tbGVmdCB7CiAgICBmbGV4OiAxIDEgYXV0bzsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1jb250ZXh0LW1lbnUtaXRlbS1yaWdodCB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1hcmdpbi1sZWZ0OiAxNnB4Owp9CgoubWpyLWNvbnRleHQtbWVudS1pdGVtLWxlZnQgaSB7CiAgICB3aWR0aDogMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG9wYWNpdHk6IDAuODI7Cn0KCi5tanItY29udGV4dC1tZW51LWhpbnQgewogICAgb3BhY2l0eTogMC41ODsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5tanItY29udGV4dC1tZW51LXN1Ym1lbnUtYXJyb3cgewogICAgb3BhY2l0eTogMC43MjsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgoubWpyLWFkZC10by1jb2xsZWN0aW9uLW1lbnUgewogICAgbWluLXdpZHRoOiAyNjBweDsKICAgIG1heC13aWR0aDogbWluKDM2MHB4LCBjYWxjKDEwMHZ3IC0gMTZweCkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEycHgpOwp9CgoubWpyLWNvbnRleHQtbWVudS10aXRsZSB7CiAgICBwYWRkaW5nOiA4cHggMTRweCAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvcik7CiAgICBvcGFjaXR5OiAwLjkyOwp9CgoubWpyLWNvbnRleHQtbWVudS1ub3RlIHsKICAgIHBhZGRpbmc6IDEwcHggMTRweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZykgNzIlLCB2YXIoLS1tanItbXV0ZWQpKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ1Owp9CgoubWpyLWdyaWQtcG9wb3ZlciwKLm1qci12aWV3ZXItcG9wb3ZlciB7CiAgICBtaW4td2lkdGg6IDI1MHB4OwogICAgbWF4LXdpZHRoOiBtaW4oMzYwcHgsIGNhbGMoMTAwdncgLSAxNnB4KSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItc20pOwogICAgYm94LXNoYWRvdzogMCAxMnB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjM1KTsKfQoKQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHsKICAgIC5tanItdmlld2VyLW92ZXJsYXkgKiwKICAgIC5tanItdmlkZW8tY29udHJvbHMsCiAgICAubWpyLWNvbnRleHQtbWVudSB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZSAhaW1wb3J0YW50OwogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogYXV0byAhaW1wb3J0YW50OwogICAgfQp9CgovKiBIaWRlIGhlYWRlciAodG9vbGJhcikgd2hlbiB2aWV3ZXIgb3ZlcmxheSBpcyBpbiBmdWxsc2NyZWVuICovCi5tanItdmlld2VyLW92ZXJsYXk6ZnVsbHNjcmVlbiAubWpyLXZpZXdlci1oZWFkZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIE1ham9vciBGbG9hdGluZyBWaWV3ZXIgKE1GVikg4oCUIHBvcnRhbGVkIHRvIGRvY3VtZW50LmJvZHkKICAgUmVkZWNsYXJlcyBDU1MgdmFyaWFibGVzIHNvIHRoZSBwYW5lbCB3b3JrcyBvdXRzaWRlIC5tanItYXNzZXRzLW1hbmFnZXIKICAgKHNhbWUgcGF0dGVybiBhcyAubWpyLXBvcG92ZXIpCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLm1qci1tZnYgewogICAgLS1tanItc3VyZmFjZS0wOiB2YXIoLS1jb250ZW50LWJnLCAjMWUxZTFlKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0tY29tZnktbWVudS1iZywgIzJhMmEyYSk7CiAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWNvbWZ5LW1lbnUtc2Vjb25kYXJ5LWJnLCAjMzMzKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIC0tbWpyLW11dGVkOiB2YXIoLS1kZXNjcmlwLXRleHQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42NSkpOwogICAgLS1tanItYWNjZW50OiB2YXIoLS1jb21meS1hY2NlbnQsICM1ZmIzZmYpOwogICAgLS1tanItc3RhdHVzLXN1Y2Nlc3M6IHZhcigtLWNvbWZ5LXN0YXR1cy1zdWNjZXNzLCAjNGNhZjUwKTsKCiAgICBmb250LWZhbWlseTogdmFyKAogICAgICAgIC0tY29tZnktZm9udCwKICAgICAgICB1aS1zYW5zLXNlcmlmLAogICAgICAgIHN5c3RlbS11aSwKICAgICAgICAtYXBwbGUtc3lzdGVtLAogICAgICAgICJTZWdvZSBVSSIsCiAgICAgICAgUm9ib3RvLAogICAgICAgIEFyaWFsLAogICAgICAgIHNhbnMtc2VyaWYKICAgICk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKSk7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgIC8qIFZpc3VhbCBjaHJvbWUgKi8KICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjU1KSwKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMpOwp9CgoubWpyLW1mdiAqIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCmh0bWwubWpyLW1mdi1wb3BvdXQtZG9jdW1lbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIDEyMDBweCA0MjBweCBhdCA1MCUgMCUsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQsIHZhcigtLWNvbWZ5LWFjY2VudCwgIzVmYjNmZikpIDEwJSwKICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50CiAgICAgICAgICAgICksCiAgICAgICAgICAgIHRyYW5zcGFyZW50IDYyJQogICAgICAgICksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtcGFuZWwtc3VyZmFjZSwgdmFyKC0tY29udGVudC1iZywgIzE2MTkxZikpIDgyJSwKICAgICAgICAgICAgICAgICMwMDAgMTglCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGNvbG9yLW1peCgKICAgICAgICAgICAgICAgIGluIHNyZ2IsCiAgICAgICAgICAgICAgICB2YXIoLS1pbnRlcmZhY2UtbWVudS1zdXJmYWNlLCB2YXIoLS1jb21meS1tZW51LWJnLCAjMWYyMjI3KSkgODQlLAogICAgICAgICAgICAgICAgIzAwMCAxNiUKICAgICAgICAgICAgKQogICAgICAgICk7Cn0KCmJvZHkubWpyLW1mdi1wb3BvdXQtYm9keSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKI21qci1tZnYtcG9wb3V0LXJvb3QsCi5tanItbWZ2LXBvcG91dC1yb290IHsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLyog4pSA4pSAIEhlYWRlciAoZHJhZyBoYW5kbGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgY3Vyc29yOiBtb3ZlOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogNnB4OwogICAgbWluLWhlaWdodDogMzRweDsKfQoKLm1qci1tZnYtaGVhZGVyLXRpdGxlIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBvcGFjaXR5OiAwLjc4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZmxleDogMTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjI4cHg7Cn0KCi8qIOKUgOKUgCBUb29sYmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi10b29sYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNTAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyKTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgbWluLWhlaWdodDogMzZweDsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3cteDogYXV0bzsKICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgIHNjcm9sbGJhci13aWR0aDogbm9uZTsKfQoubWpyLW1mdi10b29sYmFyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICBkaXNwbGF5OiBub25lOwp9CgoubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICB3aWR0aDogMXB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLWJvcmRlcik7CiAgICBtYXJnaW46IDAgM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LXByb2dyZXNzIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBoZWlnaHQ6IDIycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNzIlLCAjMDAwIDI4JSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtY2xpY2thYmxlOmhvdmVyIHsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjAzKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MtYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDA7CiAgICB3aWR0aDogMCU7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCA3MG1zIGVhc2UtaW4tb3V0Owp9CgoubWpyLW1mdi1wcm9ncmVzcy1iYXItLW5vZGVzIHsKICAgIHRvcDogMDsKICAgIGhlaWdodDogNTAlOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjglLCAjMGIzNTEzIDMyJSk7Cn0KCi5tanItbWZ2LXByb2dyZXNzLWJhci0tc3RlcHMgewogICAgdG9wOiA1MCU7CiAgICBoZWlnaHQ6IDUwJTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA2NCUsICMwYjIzNDAgMzYlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1ub2RlcywKLm1qci1tZnYtcHJvZ3Jlc3MuaXMtZXJyb3IgLm1qci1tZnYtcHJvZ3Jlc3MtYmFyLS1zdGVwcyB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2Q5NTM0ZiA3OCUsICM0YTE0MTQgMjIlKTsKfQoKLm1qci1tZnYtcHJvZ3Jlc3Mtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCksIHJnYmEoMCwgMCwgMCwgMC4xOCkpOwogICAgbWl4LWJsZW5kLW1vZGU6IHNjcmVlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGhlaWdodDogMTAwJTsKICAgIHBhZGRpbmc6IDAgOHB4OwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNkZGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtc2hhZG93OiAwIDAgMnB4IHJnYmEoMCwgMCwgMCwgMC45KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5tanItbWZ2LXBpbi1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KLm1qci1tZnYtcGluLWJ0biB7CiAgICB3aWR0aDogMjZweDsKICAgIGhlaWdodDogMjZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tbWpyLXN1cmZhY2UtMik7CiAgICBjb2xvcjogdmFyKC0tY29udGVudC1mZywgI2RkZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMDsKICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm9yZGVyLWNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDEyMG1zIGVhc2U7Cn0KLm1qci1tZnYtcGluLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA0NSUsIHZhcigtLW1qci1ib3JkZXIpKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1hY2NlbnQpIDglKTsKfQoubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgMTIlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA0MiUsIHZhcigtLW1qci1hY2NlbnQpIDU4JSk7CiAgICBjb2xvcjogI2VlZjdmZjsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjQlLCB0cmFuc3BhcmVudCk7Cn0KCi8qIOKUgOKUgCBQaW4gZ3JvdXA6IG5vdyBhIGRyb3Bkb3duIG1lbnUgKGRpc3BsYXk6bm9uZSBieSBkZWZhdWx0LCBmbGV4IHdoZW4gLmlzLW9wZW4pIOKUgOKUgCAqLwoubWpyLW1mdi1waW4tZ3JvdXAgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogY2FsYygxMDAlICsgNHB4KTsKICAgIGxlZnQ6IDA7CiAgICB6LWluZGV4OiAxMDAxMDsKICAgIG1pbi13aWR0aDogNzBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7Cn0KLm1qci1tZnYtcGluLWdyb3VwLmlzLW9wZW4gewogICAgZGlzcGxheTogZmxleDsKfQoubWpyLW1mdi1waW4tYnRuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMzBweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwIDEwcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZSwKICAgICAgICBjb2xvciAxMjBtcyBlYXNlOwp9Ci5tanItbWZ2LXBpbi1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2LXBpbi1idG4uaXMtcGlubmVkIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDQyJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNTglKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiDilIDilIAgSWNvbiBEcm9wZG93biBjb21wb25lbnQgKC5tanItbWZ2LWlkcm9wKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtaWRyb3AgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItbWZ2LWlkcm9wLW1lbnUgewogICAgZGlzcGxheTogbm9uZTsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDJweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHotaW5kZXg6IDEwMDEwOwogICAgbWluLXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5tanItbWZ2LWlkcm9wLW1lbnUuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubWpyLW1mdi1pZHJvcC1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXMgZWFzZTsKfQoubWpyLW1mdi1pZHJvcC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCk7Cn0KLm1qci1tZnYtaWRyb3AtaXRlbS5pcy1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNik7CiAgICBjb2xvcjogI2E4ZDhmZjsKfQoubWpyLW1mdi1pZHJvcC10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cn0KLyogQ2hhbm5lbCB0cmlnZ2VyOiBzbGlnaHRseSB3aWRlciB0byBmaXQgIlJHQiIgKi8KLm1qci1tZnYtY2gtbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBUb29sYmFyIGljb24tYnV0dG9uIHBvcG92ZXJzIChjaGFubmVsLCBndWlkZXMsIHBpbiwgZm9ybWF0IOKAlCBzb3J0LXN0eWxlIGNvbnRleHQgbWVudXMpICovCi5tanItbWZ2LWNoLXBvcG92ZXIsCi5tanItbWZ2LWd1aWRlcy1wb3BvdmVyLAoubWpyLW1mdi1waW4tcG9wb3ZlciwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbWluLXdpZHRoOiAxMjBweDsKICAgIHBhZGRpbmc6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZywgMC41cmVtKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsIHZhcigtLWNvbWZ5LW1lbnUtYmcsICMyYTJhMmEpKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwogICAgei1pbmRleDogMTAwMTA7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItbWZ2LWNoLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZ3VpZGVzLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtcGluLXBvcG92ZXIuaXMtb3BlbiwKLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIuaXMtb3BlbiB7CiAgICBkaXNwbGF5OiBibG9jazsKfQovKiBUb29sYmFyIGljb24gaW1hZ2VzIOKAlCBjaCBpY29uIGlzIGJsYWNrIChpbnZlcnRlZCksIGd1aWRlcyBpY29uIGlzIG5hdGl2ZSB3aGl0ZSAqLwoubWpyLW1mdi1jaC1pY29uIHsKICAgIHdpZHRoOiAxOHB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgZmlsdGVyOiBpbnZlcnQoMSk7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtZ3VpZGVzLWljb24gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBvcGFjaXR5OiAwLjg1OwogICAgZGlzcGxheTogYmxvY2s7Cn0KLm1qci1tZnYtY2gtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0sCi5tanItbWZ2LWd1aWRlcy10cmlnZ2VyW2FyaWEtZXhwYW5kZWQ9InRydWUiXSwKLm1qci1tZnYtcGluLXRyaWdnZXJbYXJpYS1leHBhbmRlZD0idHJ1ZSJdLAoubWpyLW1mdi1mb3JtYXQtdHJpZ2dlclthcmlhLWV4cGFuZGVkPSJ0cnVlIl0gewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSAhaW1wb3J0YW50Owp9Ci8qIFBpbiBzbG90IGFjdGl2ZSBzdGF0ZSAqLwoubWpyLW1mdi1waW4tcG9wb3ZlciAubWpyLW1lbnUtaXRlbS5pcy1waW5uZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg5NSwgMTc5LCAyNTUsIDAuMTYpOwogICAgY29sb3I6ICNhOGQ4ZmY7Cn0KLm1qci1tZnYtcGluLXBvcG92ZXIgLm1qci1tZW51LWl0ZW0uaXMtcGlubmVkIC5tanItbWVudS1pdGVtLWNoZWNrIHsKICAgIG9wYWNpdHk6IDEgIWltcG9ydGFudDsKfQovKiBGb3JtYXQgcG9wb3Zlcjogc2VwYXJhdG9yICsgb3BhY2l0eSBzbGlkZXIgcm93ICovCi5tanItbWZ2LWZvcm1hdC1zZXAgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgbWFyZ2luOiA0cHggMnB4Owp9Ci5tanItbWZ2LWZvcm1hdC1zbGlkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4IDJweDsKfQoubWpyLW1mdi1mb3JtYXQtc2xpZGVyLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIG9wYWNpdHk6IDAuNjU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZmxleC1zaHJpbms6IDA7Cn0KLm1qci1tZnYtZm9ybWF0LXBvcG92ZXIgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiA3MHB4OwogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoubWpyLW1mdi1mb3JtYXQtcG9wb3ZlciAubWpyLW1mdi10b29sYmFyLXJhbmdlLW91dCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0taW5wdXQtdGV4dCwgI2RkZCk7CiAgICBvcGFjaXR5OiAwLjY1OwogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biB7CiAgICB3aWR0aDogMzBweDsKICAgIGhlaWdodDogMzBweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogN3B4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0yKTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDEyMG1zIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZC1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlLAogICAgICAgIGNvbG9yIDEyMG1zIGVhc2UsCiAgICAgICAgYm94LXNoYWRvdyAxMjBtcyBlYXNlOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDQ1JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgOCUpOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuOmZvY3VzLXZpc2libGUgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAyNCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qIFVuaXZlcnNhbCBhY3RpdmUgaGlnaGxpZ2h0IOKAlCBhbnkgYXJpYS1wcmVzc2VkPSJ0cnVlIiBidXR0b24gZ2V0cyBhY2NlbnQgZ2xvdy4KICAgUGxhY2VkIGJlZm9yZSB0aGUgY29sb3JlZCBhY3RpdmUgY2xhc3NlcyBzbyB0aGV5IGNhbiBvdmVycmlkZSB3aXRoIHRoZWlyIG93biBjb2xvci4gKi8KLm1qci1tZnYgLm1qci1pY29uLWJ0blthcmlhLXByZXNzZWQ9InRydWUiXSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjU1KTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMzMzKSA4MCUsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE1JSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI1JSwgdHJhbnNwYXJlbnQpOwp9Ci5tanItbWZ2IC5tanItaWNvbi1idG5bYXJpYS1wcmVzc2VkPSJ0cnVlIl0gLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLWxpdmUtYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgNjAlLCB2YXIoLS1tanItYm9yZGVyKSk7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSAyNSUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItbGl2ZS1hY3RpdmUgLnBpIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCkgMTIlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLXByZXZpZXctYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLW1mdiAubWpyLWljb24tYnRuLm1qci1ub2Rlc3RyZWFtLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYwJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0yKSA4MCUsCiAgICAgICAgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAxMiUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIC5waSB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiBQb3AtaW4gbW9kZSAodmlld2VyIHBvcHBlZCBvdXQpOiByYWlzZSBidXR0b24gY29udHJhc3QvYnJpZ2h0bmVzcyAqLwoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgOTIlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgOTIlLCByZ2JhKDAsIDAsIDAsIDAuMTgpKQogICAgKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDI0cHggNTZweCByZ2JhKDAsIDAsIDAsIDAuNDIpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkwJSwgcmdiYSgwLCAwLCAwLCAwLjI0KSkKICAgICk7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWhlYWRlci10aXRsZSB7CiAgICBvcGFjaXR5OiAwLjk4OwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA5NCUsICNmZmZmZmYgNiUpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1tZnYtdG9vbGJhciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MCUsIHJnYmEoMCwgMCwgMCwgMC4yNCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi10b29sYmFyLXNlcCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzglLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXByb2dyZXNzIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDgyJSwgIzBhMTExOCAxOCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA5MiUsICMwMDAgOCUpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1wcm9ncmVzcy10ZXh0IHsKICAgIGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tY29udGVudC1mZywgI2VlZjRmZikgOTQlLCAjZmZmZmZmIDYlKTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LWNvbnRlbnQgewogICAgYmFja2dyb3VuZDoKICAgICAgICByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgICAgIGNpcmNsZSBhdCB0b3AsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICAgICAgdHJhbnNwYXJlbnQgNDIlCiAgICAgICAgKSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgODIlLCAjMDAwIDE4JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZGRkKSA5MiUsICNmZmZmZmYgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KSwKICAgICAgICAwIDhweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTglLCB2YXIoLS1tanItYWNjZW50KSA0MiUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2MiUsIHZhcigtLW1qci1hY2NlbnQpIDM4JSkKICAgICk7CiAgICBjb2xvcjogI2Y0ZjhmZiAhaW1wb3J0YW50Owp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0biAucGkgewogICAgb3BhY2l0eTogMTsKICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1saXZlLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDYwJSwgI2ZmZmZmZiA0MCUpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1zdWNjZXNzKSA2MiUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXN1Y2Nlc3MpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcykgMjQlLCB0cmFuc3BhcmVudCksCiAgICAgICAgMCAwIDE4cHggcmdiYSg3NiwgMTc1LCA4MCwgMC4xOCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLWljb24tYnRuLm1qci1wcmV2aWV3LWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OgogICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDI0JSwgdHJhbnNwYXJlbnQpLAogICAgICAgIDAgMCAxOHB4IHJnYmEoOTUsIDE3OSwgMjU1LCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItaWNvbi1idG4ubWpyLW5vZGVzdHJlYW0tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgNTglLCAjZmZmZmZmIDQyJSk7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZjk4MDApIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdGF0dXMtd2FybmluZywgI2ZmOTgwMCkgMzYlLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUpCiAgICApOwogICAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsKICAgIGJveC1zaGFkb3c6CiAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpLAogICAgICAgIDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmY5ODAwKSAyNCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAwIDAgMThweCByZ2JhKDI1NSwgMTUyLCAwLCAwLjE4KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItbWZ2LXBpbi1idG4gewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlcikgNzYlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDg0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDkyJSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNkZGQpIDkyJSwgI2ZmZmZmZiA4JSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDUyJSwgdmFyKC0tbWpyLWJvcmRlcikpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDE4MGRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMikgNTYlLCB2YXIoLS1tanItYWNjZW50KSA0NCUpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA2NCUsIHZhcigtLW1qci1hY2NlbnQpIDM2JSkKICAgICk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1waW4tYnRuLmlzLXBpbm5lZCB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSA1OCUsICNmZmZmZmYgNDIlKTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDYyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDM2JSwgdmFyKC0tbWpyLXN1cmZhY2UtMSkgNjQlKQogICAgKTsKICAgIGNvbG9yOiAjZmZmZmZmOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICAxODBkZWcsCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEpIDk0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDk0JSwgcmdiYSgwLCAwLCAwLCAwLjE4KSkKICAgICk7CiAgICBib3JkZXItbGVmdC1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc4JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSk7CiAgICBib3gtc2hhZG93OiBpbnNldCAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItd3Mtc2lkZWJhciB7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYm9yZGVyKSA3OCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNikpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoCiAgICAgICAgMTgwZGVnLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yKSA4NCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSkpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsIHJnYmEoMCwgMCwgMCwgMC4xOCkpCiAgICApOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc2JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXNpZGViYXItdGl0bGUgewogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1jb250ZW50LWZnLCAjZWVmNGZmKSA4MiUsIHZhcigtLW1qci1tdXRlZCkgMTglKTsKICAgIG9wYWNpdHk6IDAuODg7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDcyJSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSksCiAgICAgICAgbGluZWFyLWdyYWRpZW50KAogICAgICAgICAgICAxODBkZWcsCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA4NiUsIHZhcigtLW1qci1hY2NlbnQpIDE0JSksCiAgICAgICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA4NiUsIHJnYmEoMCwgMCwgMCwgMC4xNCkpCiAgICAgICAgKTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKfQoKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWNvbnRlbnQtZmcsICNlZWY0ZmYpIDk0JSwgI2ZmZmZmZiA2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLXdpZGdldC1sYWJlbCwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtc2lkZWJhci1lbXB0eSwKLm1qci1tZnYubWpyLW1mdi0tcG9wcGVkIC5tanItd3Mtbm9kZS1lbXB0eSB7CiAgICBjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tdXRlZCkgODQlLCAjZmZmZmZmIDE2JSk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0IHsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3NCUsICMwNTA3MGEgMjYlKTsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1ib3JkZXIpIDc0JSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7Cn0KCi5tanItbWZ2Lm1qci1tZnYtLXBvcHBlZCAubWpyLXdzLWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiAxMCUpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCksCiAgICAgICAgMCAwIDAgMnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50KSAxOCUsIHRyYW5zcGFyZW50KTsKfQoKLm1qci1tZnYgLm1qci1pY29uLWJ0bi5tanItcG9waW4tYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQpIDU4JSwgI2ZmZmZmZiA0MiUpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIpIDQ1JSwgdmFyKC0tbWpyLWFjY2VudCkgNTUlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwp9CgovKiDilIDilIAgQ29udGVudCB3cmFwcGVyIChob3Jpem9udGFsIGZsZXg6IGNvbnRlbnQgKyBzaWRlYmFyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtY29udGVudC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIOKUgOKUgCBTaWRlYmFyIHBvc2l0aW9uIHZhcmlhbnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXIgewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDA7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGhlaWdodCAwLjJzIGVhc2UsCiAgICAgICAgd2lkdGggMHM7Cn0KLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImJvdHRvbSJdIC5tanItd3Mtc2lkZWJhci5vcGVuIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAyMjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAxMjBweDsKICAgIG1heC1oZWlnaHQ6IDY1JTsKfQoKLyog4pSA4pSAIENvbnRlbnQgYXJlYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci1tZnYtY29udGVudCB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGJhY2tncm91bmQ6ICMwZDBkMGQ7CiAgICBtaW4taGVpZ2h0OiAwOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBkaXNwbGF5OiBub25lOwogICAgZmxleDogMCAwIDMyMHB4OwogICAgd2lkdGg6IDMyMHB4OwogICAgbWluLXdpZHRoOiAyMTBweDsKICAgIG1heC13aWR0aDogbWluKDQyJSwgNDIwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIHBhZGRpbmc6IDEwcHg7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYmFja2dyb3VuZDogcmdiYSgxOCwgMTgsIDIwLCAwLjk2KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci5vcGVuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4Owp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0ibGVmdCJdIC5tanItbWZ2LWdlbi1zaWRlYmFyIHsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCi5tanItbWZ2LWNvbnRlbnQtd3JhcHBlcltkYXRhLXNpZGViYXItcG9zPSJib3R0b20iXSAubWpyLW1mdi1nZW4tc2lkZWJhciB7CiAgICBmbGV4OiAwIDAgMTgwcHg7CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogbm9uZTsKICAgIG1pbi13aWR0aDogMDsKICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGV0dGVyLXNwYWNpbmc6IDA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk0KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItc2VjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZy10b3A6IDhweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7CiAgICBwYWRkaW5nLXRvcDogMDsKICAgIGJvcmRlci10b3A6IG5vbmU7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWhlYWRpbmcgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzIpOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDU7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tdGltZS1iYWRnZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjQyKTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjE2KSwgcmdiYSg3NiwgMTc1LCA4MCwgMC4xKSk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgyMjQsIDI1NSwgMTIyLCAwLjEyKSBpbnNldDsKICAgIGN1cnNvcjogY29weTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAwLjE2cyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAwLjE2cyBlYXNlLAogICAgICAgIGJveC1zaGFkb3cgMC4xNnMgZWFzZTsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtbGFiZWwgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43Mik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLXRpbWUtdmFsdWUgewogICAgY29sb3I6ICNlMGZmN2E7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogODAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKfQoKLm1qci1tZnYtZ2VuLWNhcmQgewogICAgLS1tanItbWZ2LWdlbi1hY2NlbnQ6ICMyMTk2ZjM7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItbWZ2LWdlbi1hY2NlbnQpIDQ1JSwgdHJhbnNwYXJlbnQpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDEzNWRlZywKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSAxNiUsIHRyYW5zcGFyZW50KSAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLW1mdi1nZW4tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpIDEwMCUKICAgICk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCkgMTQlLCB0cmFuc3BhcmVudCkgaW5zZXQ7CiAgICBjdXJzb3I6IGNvcHk7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNnMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMC4xNnMgZWFzZSwKICAgICAgICBib3gtc2hhZG93IDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1zZWVkIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYm9yZGVyLXdpZHRoOiAycHg7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLS1jb21wYWN0IHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMnB4Owp9CgoubWpyLW1mdi1nZW4tY2FyZC0tY29tcGFjdCAubWpyLW1mdi1nZW4tY2FyZC10aXRsZSwKLm1qci1tZnYtZ2VuLWNhcmQtLWNvbXBhY3QgLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQ6aG92ZXIsCi5tanItbWZ2LWdlbi10aW1lLWJhZGdlOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgNzAlLCB0cmFuc3BhcmVudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCwgI2UwZmY3YSkgMjQlLCB0cmFuc3BhcmVudCkKICAgICAgICBpbnNldDsKfQoKLm1qci1tZnYtZ2VuLWNvcHktZmxhc2ggewogICAgYmFja2dyb3VuZDogcmdiYSg3NiwgMTc1LCA4MCwgMC4yOCkgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdGl0bGUgewogICAgY29sb3I6IHZhcigtLW1qci1tZnYtZ2VuLWFjY2VudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUgewogICAgY29sb3I6IHZhcigtLWZnLWNvbG9yLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG1pbi13aWR0aDogMDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Cn0KCi5tanItbWZ2LWdlbi1jYXJkLXZhbHVlLmlzLWNvbXBhY3QgewogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXdlaWdodDogNzAwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC12YWx1ZS5pcy1tdWx0aWxpbmUgewogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwp9CgoubWpyLW1mdi1nZW4tY2FyZC0tc2VlZCAubWpyLW1mdi1nZW4tY2FyZC12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgZm9udC1mYW1pbHk6IENvbnNvbGFzLCBNb25hY28sIG1vbm9zcGFjZTsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLm1qci1tZnYtZ2VuLWNhcmQtdmFsdWUuaXMtZmllbGRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIGdhcDogOHB4Owp9CgoubWpyLW1mdi1nZW4tZmllbGQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDc4cHgsIGF1dG8pIDFmcjsKICAgIGdhcDogMTBweDsKICAgIGFsaWduLWl0ZW1zOiBzdGFydDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLWxhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1tanItbXV0ZWQsIHJnYmEoMTgwLCAxODAsIDE4MCwgMC43MikpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLm1qci1tZnYtZ2VuLWZpZWxkLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1mZy1jb2xvciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSk7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2VjOGZmOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZmQ0N2E7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibW9kZWwiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZGRhOGE7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2Q0OGNmZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuLXNpZGViYXItYm9keSBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfQoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9CgoubWpyLW1mdi1nZW4tc2lkZWJhci1ib2R5IGRpdiB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KCi5tanItbWZ2LWdlbi1zaWRlYmFyLWJvZHkgZGl2Omxhc3QtY2hpbGQgewogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLm1qci1tZnYtb3ZlcmxheS1jYW52YXMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgei1pbmRleDogMTI7Cn0KCi5tanItbWZ2LXRvb2xiYXItc2VsZWN0IHsKICAgIGhlaWdodDogMjRweDsKICAgIHBhZGRpbmc6IDAgNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAwLjhweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMjQpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjA2KSwgcmdiYSgyMTAsIDIxNCwgMjIwLCAwLjAyKSk7CiAgICBjb2xvcjogcmdiYSgyMzAsIDIzMywgMjM4LCAwLjkyKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXRvb2xiYXItcmFuZ2UgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICB3aWR0aDogNzJweDsKICAgIGFjY2VudC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKfQoKLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgbWluLXdpZHRoOiAzMHB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgovKiBFViBzbGlkZXIgYWN0aXZlIHN0YXRlICh2YWx1ZSDiiaAgMCkgKi8KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBhY2NlbnQtY29sb3I6ICNmNWM4NDI7Cn0KLm1qci1tZnYtdG9vbGJhci1yYW5nZS5pcy1hY3RpdmUgLm1qci1tZnYtdG9vbGJhci1yYW5nZS1vdXQgewogICAgY29sb3I6ICNmNWM4NDI7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgoubWpyLW1mdi1tZWRpYS1wcm9ncmVzcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDEwcHg7CiAgICBsZWZ0OiAxMHB4OwogICAgei1pbmRleDogNjsKICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gMjBweCk7CiAgICBwYWRkaW5nOiA1cHggOXB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KSkgODglLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg1LCA4LCAxNCwgMC44NikgODYlLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTExKSAxNCUpOwogICAgY29sb3I6IHZhcigtLWNvbnRlbnQtZmcsICNmNWY3ZmEpOwogICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMjgpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00cHgpOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTZzIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDAuMTZzIGVhc2U7Cn0KCi5tanItbWZ2LW1lZGlhLXByb2dyZXNzLmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN0YXR1cy1lcnJvciwgI2ZmNWM3YSkgNzIlLCB0cmFuc3BhcmVudCk7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgcmdiYSg2MCwgMTAsIDE4LCAwLjkpIDgyJSwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzExMSkgMTglKTsKfQoKLm1qci1tZnYtbWVkaWEtcHJvZ3Jlc3MtdGV4dCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IDEuMjsKfQoKLyog4pSA4pSAIFdvcmtmbG93IFNpZGViYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3Mtc2lkZWJhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMnMgZWFzZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubWpyLXdzLXNpZGViYXIub3BlbiB7CiAgICB3aWR0aDogMjYwcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWluLXdpZHRoOiAxODBweDsKICAgIG1heC13aWR0aDogNjUlOwogICAgdHJhbnNpdGlvbjogbm9uZTsKfQoKLm1qci13cy1zaWRlYmFyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4taGVpZ2h0OiAzNHB4Owp9Ci5tanItd3Mtc2lkZWJhci10aXRsZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIG9wYWNpdHk6IDAuNjU7Cn0KLm1qci13cy1zaWRlYmFyLWJvZHkgewogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMDsKfQoubWpyLXdzLXNpZGViYXItZW1wdHkgewogICAgcGFkZGluZzogMjRweCAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgovKiDilIDilIAgVGFiIGJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci13cy10YWItYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGdhcDogMnB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7Cn0KCi5tanItd3MtdGFiIHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMC4xNXMsCiAgICAgICAgY29sb3IgMC4xNXM7Cn0KCi5tanItd3MtdGFiOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc1KTsKfQoKLm1qci13cy10YWIuaXMtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKICAgIGNvbG9yOiAjNjM5YmZmOwp9CgovKiDilIDilIAgTm9kZXMgdGFiIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLXdzLW5vZGVzLXRhYiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGZsZXg6IDE7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogR3JhcGggTWFwIHRhYiAqLwoubWpyLXdnbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDEwMCU7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbWFwLXdyYXAgewogICAgaGVpZ2h0OiAxOTBweDsKICAgIG1pbi1oZWlnaHQ6IDE1MHB4OwogICAgbWFyZ2luOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4yMik7Cn0KCi5tanItd2dtLXByZXZpZXcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjMyKTsKfQoKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1tZWRpYSwKLm1qci13Z20tcHJldmlldyAubWpyLW1mdi1wbGF5ZXItaG9zdCwKLm1qci13Z20tcHJldmlldyAubWpyLW1vZGVsM2QtaG9zdCwKLm1qci13Z20tcHJldmlldy1tZWRpYSB7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwp9CgoubWpyLXdnbS1wcmV2aWV3LWVtcHR5IHsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubWpyLXdnbS1jYW52YXMgewogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGN1cnNvcjogZ3JhYjsKICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKfQoKLm1qci13Z20tY2FudmFzOmFjdGl2ZSB7CiAgICBjdXJzb3I6IGdyYWJiaW5nOwp9CgoubWpyLXdnbS0tbGFyZ2UgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLW1hcC13cmFwIHsKICAgIGZsZXg6IDE7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBtaW4taGVpZ2h0OiAwOwogICAgbWFyZ2luOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogMDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXN0YXR1cyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAxMHB4OwogICAgdG9wOiAxMHB4OwogICAgei1pbmRleDogMjsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjc0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLXdnbS10b29sYmFyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDEwcHg7CiAgICB0b3A6IDQ2cHg7CiAgICB6LWluZGV4OiAyOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBnYXA6IDZweDsKICAgIG1heC13aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7Cn0KCi5tanItd2dtLW1vZGUgewogICAgbWluLWhlaWdodDogMjZweDsKICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLm1qci13Z20tbW9kZTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTQ5LCAxODMsIDI1NSwgMC40NSk7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLXdnbS1tb2RlLmlzLWFjdGl2ZSB7CiAgICBib3JkZXItY29sb3I6IHJnYmEoMTI0LCAxODYsIDI1NSwgMC42Mik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc5LCAxMjMsIDIxNCwgMC4yNik7CiAgICBjb2xvcjogcmdiYSgyMzUsIDI0NSwgMjU1LCAwLjk2KTsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLWRldGFpbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDEwcHg7CiAgICB0b3A6IDEwcHg7CiAgICBib3R0b206IDEwcHg7CiAgICB6LWluZGV4OiAyOwogICAgd2lkdGg6IG1pbigzMjBweCwgMzglKTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDIwLCAyNiwgMC44NCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7Cn0KCi5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1hY3Rpb24gewogICAgbWluLWhlaWdodDogMzBweDsKfQoKLm1qci13Z20tLWxhcmdlIC5tanItd2dtLXBhcmFtIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLm1qci13Z20tc3RhdHVzIHsKICAgIHBhZGRpbmc6IDAgMTBweCA4cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQyKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1Owp9CgoubWpyLXdnbS1kZXRhaWxzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBwYWRkaW5nOiAwIDhweCAxMHB4Owp9CgoubWpyLXdnbS1ub2RlLXRpdGxlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1tZXRhIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40Mik7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5tanItd2dtLWFjdGlvbnMgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLWFjdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogN3B4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDVweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzYpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLXdnbS1hY3Rpb246aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC40NSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC4xMik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkyKTsKfQoKLm1qci13Z20tYWN0aW9uLmlzLW9rIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NiwgMTc1LCA4MCwgMC41NSk7CiAgICBjb2xvcjogcmdiYSgxOTAsIDI1NSwgMTk2LCAwLjk2KTsKfQoKLm1qci13Z20tcGFyYW1zIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBnYXA6IDRweDsKICAgIG1hcmdpbi10b3A6IDJweDsKfQoKLm1qci13Z20tcGFyYW0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDY0cHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDVweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTgpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgbGluZS1oZWlnaHQ6IDEuMzU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgYmFja2dyb3VuZCAxMjBtcyBlYXNlLAogICAgICAgIGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9CgoubWpyLXdnbS1wYXJhbTpob3ZlciwKLm1qci13Z20tcGFyYW06Zm9jdXMtdmlzaWJsZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tcGFyYW0uaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tcGFyYW0uaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLXBhcmFtLWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40OCk7Cn0KCi5tanItd2dtLXBhcmFtLXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgyKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDExNSwgMTU1LCAyNTUsIDAuODgpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTE1LCAxNTUsIDI1NSwgMC4yMik7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA4cHg7CiAgICBtYXJnaW4tdG9wOiAycHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXdnbS1ub2RlLWFjY2VudCkgMzQlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wOCksCiAgICAgICAgMCAxMHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tncm91bmQ6CiAgICAgICAgbGluZWFyLWdyYWRpZW50KDE4MGRlZywgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdCkgMTAwJSwgdHJhbnNwYXJlbnQpLCByZ2JhKDQ0LCA1NiwgODgsIDAuMikpLAogICAgICAgIHJnYmEoMTMsIDE2LCAyNCwgMC44NSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsOjpiZWZvcmUgewogICAgY29udGVudDogIiI7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGhlaWdodDogMnB4OwogICAgbWFyZ2luOiAtOHB4IC04cHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDA7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHZhcigtLW1qci13Z20tbm9kZS1hY2NlbnQpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbW9kZWwgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDEyNCwgMTg2LCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg3MCwgMTIzLCAxODEsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy1zYW1wbGVyIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxNDMsIDIyOCwgMTY3LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoNjQsIDEzMywgODgsIDAuMzQpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC5pcy10ZXh0IHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgyNTUsIDE5MiwgMTE0LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTU0LCAxMDIsIDQ5LCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwuaXMtbWVkaWEgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDE1NCwgMTcwLCAyNTUsIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSg4MywgOTMsIDE2NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWNvbnRyb2wgewogICAgLS1tanItd2dtLW5vZGUtYWNjZW50OiByZ2JhKDI1NSwgMTM5LCAxNjksIDAuOSk7CiAgICAtLW1qci13Z20tbm9kZS1hY2NlbnQtc29mdDogcmdiYSgxNDUsIDcwLCA5NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLmlzLWxvZ2ljIHsKICAgIC0tbWpyLXdnbS1ub2RlLWFjY2VudDogcmdiYSgxODgsIDE2OCwgMjU1LCAwLjkpOwogICAgLS1tanItd2dtLW5vZGUtYWNjZW50LXNvZnQ6IHJnYmEoMTA1LCA4NiwgMTUzLCAwLjM0KTsKfQoKLm1qci13Z20tbm9kZS12aXN1YWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItd2dtLW5vZGUtYWNjZW50KSAyNSUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCkpOwp9CgoubWpyLXdnbS1ub2RlLXZpc3VhbC10eXBlIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogcmdiYSgyMzYsIDI0NCwgMjU1LCAwLjk0KTsKICAgIHRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItd2dtLW5vZGUtdmlzdWFsLWlkIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDE5NCwgMjEzLCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgICBnYXA6IDhweDsKfQoKLm1qci13Z20tbm9kZS1wb3J0cy1jb2wgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXdnbS1ub2RlLXBvcnRzLXRpdGxlIHsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40NSk7Cn0KCi5tanItd2dtLW5vZGUtcG9ydHMtbGlzdCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiAzcHg7Cn0KCi5tanItd2dtLW5vZGUtcG9ydCwKLm1qci13Z20tbm9kZS1wb3J0LWVtcHR5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBtaW4taGVpZ2h0OiAxOHB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjQpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZW1wdHkgewogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNik7Cn0KCi5tanItd2dtLW5vZGUtcG9ydC1kb3QgewogICAgd2lkdGg6IDhweDsKICAgIGhlaWdodDogOHB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpIGluc2V0Owp9CgoubWpyLXdnbS1ub2RlLXBvcnQtZG90LmlzLWluIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTM1LCAxOTYsIDI1NSwgMC45KTsKfQoKLm1qci13Z20tbm9kZS1wb3J0LWRvdC5pcy1vdXQgewogICAgYmFja2dyb3VuZDogcmdiYSgxNDQsIDIzOCwgMTc0LCAwLjkpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtbmFtZSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzgpOwp9CgoubWpyLXdnbS1ub2RlLXBvcnQtdHlwZSB7CiAgICBmbGV4OiAwIDAgYXV0bzsKICAgIG1heC13aWR0aDogNDUlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBwYWRkaW5nOiAxcHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGNvbG9yOiByZ2JhKDIyNCwgMjM2LCAyNTUsIDAuOSk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0cy10aXRsZSB7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wMmVtOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDUpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCwKLm1qci13Z20tbm9kZS13aWRnZXQtZW1wdHkgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWlubWF4KDcwcHgsIDAuNDJmcikgbWlubWF4KDAsIDFmcik7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwp9CgoubWpyLXdnbS1ub2RlLXdpZGdldCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOgogICAgICAgIGJhY2tncm91bmQgMTIwbXMgZWFzZSwKICAgICAgICBib3JkZXItY29sb3IgMTIwbXMgZWFzZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQ6aG92ZXIsCi5tanItd2dtLW5vZGUtd2lkZ2V0OmZvY3VzLXZpc2libGUgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgb3V0bGluZTogbm9uZTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtb2sgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc5LCAyMTAsIDEyNSwgMC43KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzksIDIxMCwgMTI1LCAwLjE2KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtZXJyb3IgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgOTAsIDkwLCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDkwLCA5MCwgMC4xNik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWVtcHR5IHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNCk7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LWtleSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41Mik7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg4KTsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgYWxpZ24taXRlbXM6IHN0YXJ0OwogICAgZ2FwOiA0cHg7Cn0KCi5tanItd2dtLW5vZGUtd2lkZ2V0LmlzLW11bHRpbGluZSAubWpyLXdnbS1ub2RlLXdpZGdldC1rZXkgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQuaXMtbXVsdGlsaW5lIC5tanItd2dtLW5vZGUtd2lkZ2V0LXZhbHVlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWF4LWhlaWdodDogOS4yZW07CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZy1yaWdodDogMnB4Owp9CgoubWpyLXdnbS1ub2RlLXdpZGdldC5pcy1tdWx0aWxpbmUuaXMtdGV4dC1maWVsZCAubWpyLXdnbS1ub2RlLXdpZGdldC12YWx1ZSB7CiAgICBtYXgtaGVpZ2h0OiAxNmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLm1qci13Z20tbm9kZS13aWRnZXQtbW9yZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQ2KTsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgpAbWVkaWEgKG1heC13aWR0aDogODIwcHgpIHsKICAgIC5tanItd2dtLS1sYXJnZSAubWpyLXdnbS1kZXRhaWxzIHsKICAgICAgICB3aWR0aDogbWluKDM4MHB4LCBjYWxjKDEwMCUgLSAyMHB4KSk7CiAgICB9CgogICAgLm1qci13Z20tbm9kZS1wb3J0cyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9Cn0KCi5tanItd3Mtc2VhcmNoLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tbWpyLWJvcmRlciwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSk7Cn0KCi5tanItd3Mtc2VhcmNoLWljb24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLm1qci13cy1zZWFyY2ggewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IDRweCAyOHB4IDRweCAyNnB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjM1KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjg1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5tanItd3Mtc2VhcmNoOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI4KTsKfQoKLm1qci13cy1zZWFyY2g6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDk5LCAxNTUsIDI1NSwgMC41KTsKfQoKLm1qci13cy1zZWFyY2gtY2xlYXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgcmlnaHQ6IDE0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgoubWpyLXdzLXNlYXJjaC1jbGVhcjpob3ZlciB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKfQoKLm1qci13cy1ub2Rlcy1saXN0IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogNHB4IDA7Cn0KCi5tanItd3Mtbm9kZS1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7CiAgICBtaW4taGVpZ2h0OiAzMnB4OwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7Cn0KCi5tanItd3Mtbm9kZS1yb3ctdHlwZSB7CiAgICBmbGV4OiAxOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43OCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgoubWpyLXdzLW5vZGUtcm93LXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWF4LXdpZHRoOiA4MHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgZmxleC1zaHJpbms6IDA7CiAgICB3aWR0aDogMjJweDsKICAgIGhlaWdodDogMjJweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjFzLAogICAgICAgIGNvbG9yIDAuMXMsCiAgICAgICAgYmFja2dyb3VuZCAwLjFzOwp9CgoubWpyLXdzLW5vZGUtcm93OmhvdmVyIC5tanItd3Mtbm9kZS1sb2NhdGUgewogICAgb3BhY2l0eTogMTsKfQoKLm1qci13cy1ub2RlLWxvY2F0ZTpob3ZlciB7CiAgICBjb2xvcjogIzYzOWJmZjsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTksIDE1NSwgMjU1LCAwLjE1KTsKfQoKLyog4pSA4pSAIE5vZGUgc2VjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3MtdHJlZS1pdGVtIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQoubWpyLXdzLXRyZWUtaXRlbSA+IC5tanItd3Mtbm9kZSB7CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9Ci5tanItd3MtdHJlZS1pdGVtLS1zdWJncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNCUsIHRyYW5zcGFyZW50IDk2JSk7Cn0KLm1qci13cy1ub2RlIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1tanItYm9yZGVyLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpKTsKfQovKiBTdWJ0bGUgaGlnaGxpZ2h0IHdoZW4gdGhpcyBub2RlIG1hdGNoZXMgdGhlIGN1cnJlbnQgZ3JhcGggc2VsZWN0aW9uLiAqLwoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjEwLCA5MCwgMC4wOCk7CiAgICBib3gtc2hhZG93OiBpbnNldCAycHggMCAwIDAgcmdiYSgyNTUsIDIxMCwgOTAsIDAuNzUpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS1oZWFkZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICNmZmQ0NWEgMTglLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA4MiUpOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10eXBlIHsKICAgIGNvbG9yOiAjZmZkNDVhOwp9Ci5tanItd3Mtbm9kZS5pcy1zZWxlY3RlZC1mcm9tLWdyYXBoIC5tanItd3Mtbm9kZS10aXRsZSB7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIyNCwgMTMwLCAwLjg4KTsKfQoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLW5vZGUtdG9nZ2xlLAoubWpyLXdzLW5vZGUuaXMtc2VsZWN0ZWQtZnJvbS1ncmFwaCAubWpyLXdzLWxvY2F0ZSwKLm1qci13cy1ub2RlLmlzLXNlbGVjdGVkLWZyb20tZ3JhcGggLm1qci13cy1ub2RlLWtpbmQgewogICAgY29sb3I6ICNmZmQ0NWE7Cn0KLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDE0cHg7CiAgICB6LWluZGV4OiAyOwogICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogNTAlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDRweDsKICAgIGhlaWdodDogNTZweDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMTVzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZCAwLjE1cyBlYXNlOwp9CgoubWpyLXdzLXNpZGViYXIub3Blbjpob3ZlciAubWpyLXdzLXNpZGViYXItcmVzaXplcjo6YmVmb3JlLAoubWpyLXdzLXNpZGViYXIuaXMtcmVzaXppbmcgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIuaXMtZHJhZ2dpbmc6OmJlZm9yZSB7CiAgICBvcGFjaXR5OiAxOwp9CgoubWpyLXdzLXNpZGViYXIuaXMtcmVzaXppbmcgLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXI6aG92ZXI6OmJlZm9yZSwKLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIuaXMtZHJhZ2dpbmc6OmJlZm9yZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzQpOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0icmlnaHQiXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICByaWdodDogMDsKfQoKLm1qci1tZnYtY29udGVudC13cmFwcGVyW2RhdGEtc2lkZWJhci1wb3M9ImxlZnQiXSAubWpyLXdzLXNpZGViYXItcmVzaXplciB7CiAgICBsZWZ0OiAwOwp9CgoubWpyLW1mdi1jb250ZW50LXdyYXBwZXJbZGF0YS1zaWRlYmFyLXBvcz0iYm90dG9tIl0gLm1qci13cy1zaWRlYmFyLXJlc2l6ZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoubWpyLXdzLW5vZGUtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTAsICMxZTFlMWUpIDQwJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA2MCUKICAgICk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnMgZWFzZTsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNpYmxlIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgMjglLAogICAgICAgIHZhcigtLW1qci1zdXJmYWNlLTEsICMyYTJhMmEpIDcyJQogICAgKTsKfQoubWpyLXdzLW5vZGUuaXMtY29sbGFwc2libGUuaXMtY29sbGFwc2VkIC5tanItd3Mtbm9kZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgOCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTIlCiAgICApOwp9Ci5tanItd3Mtbm9kZS10b2dnbGUgewogICAgZmxleDogMCAwIGF1dG87Cn0KLm1qci13cy1ub2RlLXRpdGxlLXdyYXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxcHg7Cn0KLm1qci13cy1ub2RlLXR5cGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLm1qci13cy1ub2RlLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNDgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoubWpyLXdzLW5vZGUta2luZCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGZsZXg6IDAgMCBhdXRvOwogICAgbWF4LXdpZHRoOiAxMTBweDsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMzglLCB0cmFuc3BhcmVudCA2MiUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgMTIlLCB0cmFuc3BhcmVudCA4OCUpOwogICAgY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA3OCUsICNmZmZmZmYgMjIlKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMS4yOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoubWpyLXdzLW5vZGUta2luZCAucGkgewogICAgZm9udC1zaXplOiAxMHB4Owp9Ci5tanItd3Mtbm9kZS1raW5kLWNvdW50IHsKICAgIG1pbi13aWR0aDogMTRweDsKICAgIHBhZGRpbmc6IDAgM3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44Mik7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLm1qci13cy1ub2RlLmlzLWNvbGxhcHNlZCAubWpyLXdzLW5vZGUtYm9keSB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5tanItd3Mtbm9kZS1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKfQoubWpyLXdzLW5vZGUtZW1wdHkgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKTsKICAgIHBhZGRpbmc6IDRweCAwOwp9CgovKiDilIDilIAgTmVzdGVkIG5vZGVzIChpbnNpZGUgc3ViZ3JhcGhzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci13cy1ub2RlLS1uZXN0ZWQgewogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDkxLCAxMzgsIDI0MCwgMC4zNSk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQgLm1qci13cy1ub2RlLWhlYWRlciB7CiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSA1JSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NSUKICAgICk7Cn0KLm1qci13cy1ub2RlLS1uZXN0ZWQuaXMtY29sbGFwc2libGUgLm1qci13cy1ub2RlLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoCiAgICAgICAgaW4gc3JnYiwKICAgICAgICB2YXIoLS1tanItYWNjZW50LCAjNWI4YWYwKSAxMCUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMSwgIzJhMmEyYSkgOTAlCiAgICApOwp9CgovKiDilIDilIAgU3ViZ3JhcGggY2hpbGRyZW4gZ3JvdXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItd3MtY2hpbGRyZW4tdG9nZ2xlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDVweCAxMHB4IDVweCAyMHB4OwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzViOGFmMCkgNiUsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzFlMWUxZSkgOTQlCiAgICApOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIG9wYWNpdHk6IDAuODsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjFzIGVhc2UsCiAgICAgICAgYmFja2dyb3VuZCAwLjFzIGVhc2U7Cn0KLm1qci13cy1jaGlsZHJlbi10b2dnbGUtLW5lc3RlZCB7CiAgICBwYWRkaW5nLWxlZnQ6IDI4cHg7Cn0KLm1qci13cy1jaGlsZHJlbi10b2dnbGU6aG92ZXIgewogICAgb3BhY2l0eTogMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peCgKICAgICAgICBpbiBzcmdiLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1YjhhZjApIDEyJSwKICAgICAgICB2YXIoLS1tanItc3VyZmFjZS0wLCAjMWUxZTFlKSA4OCUKICAgICk7Cn0KLm1qci13cy1jaGlsZHJlbi10b2dnbGVbYXJpYS1leHBhbmRlZD0idHJ1ZSJdIHsKICAgIG9wYWNpdHk6IDE7Cn0KLm1qci13cy1jaGlsZHJlbiB7CiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIHJnYmEoOTEsIDEzOCwgMjQwLCAwLjI1KTsKICAgIG1hcmdpbi1sZWZ0OiA2cHg7CiAgICBwYWRkaW5nLWxlZnQ6IDZweDsKfQoKLm1qci13cy13aWRnZXQtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogOHB4Owp9Ci5tanItd3Mtd2lkZ2V0LXJvdy0tYmxvY2sgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4Owp9Ci5tanItd3Mtd2lkZ2V0LXJvdy0tYmxvY2sgLm1qci13cy13aWRnZXQtbGFiZWwgewogICAgZmxleDogbm9uZTsKICAgIHBhZGRpbmctdG9wOiAwOwp9Ci5tanItd3Mtd2lkZ2V0LXJvdy0tYmxvY2sgLm1qci13cy13aWRnZXQtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7Cn0KLm1qci13cy13aWRnZXQtbGFiZWwgewogICAgZmxleDogMCAwIDgwcHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tZGVzY3JpcC10ZXh0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNTUpKTsKICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9Ci5tanItd3Mtd2lkZ2V0LWlucHV0IHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KLm1qci13cy1pbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbWZ5LWlucHV0LWJnLCAjMjIyKTsKICAgIGNvbG9yOiB2YXIoLS1pbnB1dC10ZXh0LCAjZGRkKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcGFkZGluZzogNHB4IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAxMjBtcyBlYXNlOwp9Ci5tanItd3MtaW5wdXQ6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKfQoubWpyLXdzLXRleHRhcmVhIHsKICAgIHJlc2l6ZTogbm9uZTsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgb3ZlcmZsb3cteTogaGlkZGVuOwp9Ci5tanItd3MtdGV4dC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItd3MtdGV4dC13cmFwcGVyIC5tanItd3MtdGV4dGFyZWEgewogICAgd2lkdGg6IDEwMCU7Cn0KLm1qci13cy1leHBhbmQtYnRuIHsKICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDAgNHB4OwogICAgb3BhY2l0eTogMC44Owp9Ci5tanItd3MtZXhwYW5kLWJ0bjpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KLm1qci13cy1yZWFkb25seSB7CiAgICBvcGFjaXR5OiAwLjU7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KLm1qci13cy1jaGVja2JveCB7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgd2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBtYXJnaW4tdG9wOiA0cHg7Cn0KLm1qci13cy10b2dnbGUtbGFiZWwgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi8qIOKUgOKUgCBMb2NhdGUgYnV0dG9uIGluc2lkZSBub2RlIGhlYWRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm1qci13cy1sb2NhdGUgewogICAgd2lkdGg6IDI0cHggIWltcG9ydGFudDsKICAgIGhlaWdodDogMjRweCAhaW1wb3J0YW50OwogICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgb3BhY2l0eTogMC41Owp9Ci5tanItd3MtbG9jYXRlOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi8qIOKUgOKUgCBSdW4gYnV0dG9uIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1ydW4tY29udHJvbHMgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7Cn0KLm1qci1tZnYtcnVuLWJ0biAucGkgewogICAgY29sb3I6IHZhcigtLW1qci1zdGF0dXMtc3VjY2VzcywgIzRjYWY1MCk7Cn0KLm1qci1tZnYtcnVuLWJ0bi5ydW5uaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLW11dGVkLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNjUpKTsKfQoubWpyLW1mdi1ydW4tYnRuLnN0b3BwaW5nIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLXN0YXR1cy13YXJuaW5nLCAjZmZhNzI2KTsKfQoubWpyLW1mdi1ydW4tYnRuLmVycm9yIC5waSB7CiAgICBjb2xvcjogI2Y0NDMzNjsKfQoKLm1qci1tZnYtc3RvcC1idG4gLnBpIHsKICAgIGNvbG9yOiAjZWY1MzUwOwp9Ci5tanItbWZ2LXN0b3AtYnRuLmFjdGl2ZSAucGkgewogICAgY29sb3I6ICNmZjhhNjU7Cn0KLm1qci1tZnYtc3RvcC1idG4uc3RvcHBpbmcgLnBpIHsKICAgIGNvbG9yOiB2YXIoLS1tanItc3RhdHVzLXdhcm5pbmcsICNmZmE3MjYpOwp9CgovKiDilIDilIAgRmxvYXRpbmcgVmlld2VyIHNpbXBsZSB2aWRlbyBwbGF5ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci5pcy1hdWRpbyB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDIwJSAyMCUsIHJnYmEoOTUsIDE3OSwgMjU1LCAwLjIpLCByZ2JhKDE4LCAyMCwgMjgsIDAuOTUpKTsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1hdWRpby1iYWNrZHJvcCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjJweDsKICAgIHRleHQtc2hhZG93OiAwIDJweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC40NSk7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIHBhZGRpbmc6IDE4cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItY29udHJvbHMgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogMTJweDsKICAgIHJpZ2h0OiAxMnB4OwogICAgYm90dG9tOiAxMnB4OwogICAgei1pbmRleDogMzA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogOXB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiAxNHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byB0b3AsIHJnYmEoMTAsIDEwLCAxNCwgMC43NiksIHJnYmEoMTYsIDE2LCAyNCwgMC41NSkpOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1yb3cgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItc2VlayB7CiAgICAtLW1qci1zZWVrLXBjdDogMCU7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICB0byByaWdodCwKICAgICAgICAjZmYyZjUyIDAlLAogICAgICAgICNmZjJmNTIgdmFyKC0tbWpyLXNlZWstcGN0KSwKICAgICAgICByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjQpIHZhcigtLW1qci1zZWVrLXBjdCksCiAgICAgICAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KSAxMDAlCiAgICApOwogICAgY3Vyc29yOiBwb2ludGVyOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWs6Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgYmFja2dyb3VuZDogI2ZmMmY1MjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1zZWVrOjotbW96LXJhbmdlLXRodW1iIHsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpOwogICAgYmFja2dyb3VuZDogI2ZmMmY1MjsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci1idG4gewogICAgd2lkdGg6IDMwcHg7CiAgICBoZWlnaHQ6IDMwcHg7CiAgICBtaW4td2lkdGg6IDMwcHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yMik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWJ0biAucGkgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7Cn0KCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXItYnRuLmlzLWRpc2FibGVkLAoubWpyLW1mdi1zaW1wbGUtcGxheWVyLXNlZWsuaXMtZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC40NTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLm1qci1tZnYtc2ltcGxlLXBsYXllci10aW1lIHsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Mik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwp9CgoubWpyLW1mdi1zaW1wbGUtcGxheWVyLWZyYW1lIHsKICAgIG1hcmdpbi1yaWdodDogMnB4OwogICAgcGFkZGluZzogM3B4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGNvbnRhaW5lci10eXBlOiBpbmxpbmUtc2l6ZTsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9scyB7CiAgICB6LWluZGV4OiAzMDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSB7CiAgICBsZWZ0OiA4cHg7CiAgICByaWdodDogOHB4OwogICAgYm90dG9tOiA4cHg7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBnYXA6IDZweDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLXJvdy0tdG9wLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tcm93LS10b3AgewogICAgZ2FwOiA4cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby10aW1lZ3JvdXAsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby10aW1lZ3JvdXAgewogICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgZ2FwOiA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yb3ctLWJvdHRvbSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGdhcDogNnB4Owp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tYm90dG9tLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYm90dG9tIHsKICAgIGZsZXgtc2hyaW5rOiAxOwogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby10cmFuc3BvcnQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby10cmFuc3BvcnQgewogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1ncm91cCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWdyb3VwIHsKICAgIGZsZXgtd3JhcDogbm93cmFwOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0iY29tcGFjdCJdIC5tanItdmlkZW8tc2Vlay13cmFwLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWJhci10aW1lbGluZSwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWJhci10aW1lbGluZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLXNlZWstd3JhcCwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLXNlZWstd3JhcCB7CiAgICBvcmRlcjogLTE7CiAgICBmbGV4OiAxIDEgMTAwJTsKICAgIHdpZHRoOiAxMDAlOwp9CgoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdAogICAgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXQogICAgLm1qci12aWRlby1iYXItdGltZWxpbmUKICAgIC5tanItdmlkZW8tZ3JvdXAtLW91dCwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1pbiwKLm1qci1tZnYtcGxheWVyLWhvc3QKICAgIC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0KICAgIC5tanItdmlkZW8tYmFyLXRpbWVsaW5lCiAgICAubWpyLXZpZGVvLWdyb3VwLS1vdXQgewogICAgZmxleDogMCAxIGF1dG87Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJjb21wYWN0Il0gLm1qci12aWRlby1yYW5nZS1jb3VudCwKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9ImNvbXBhY3QiXSAubWpyLXZpZGVvLWZyYW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1jb250cm9sc1tkYXRhLW1qci1sYXlvdXQ9InN0YWNrZWQiXSAubWpyLXZpZGVvLWZyYW1lIHsKICAgIG1pbi13aWR0aDogYXV0bzsKICAgIHBhZGRpbmc6IDNweCA2cHg7Cn0KCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLWluLAoubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzW2RhdGEtbWpyLWxheW91dD0ic3RhY2tlZCJdIC5tanItdmlkZW8tYnRuLS1vdXQsCi5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHNbZGF0YS1tanItbGF5b3V0PSJzdGFja2VkIl0gLm1qci12aWRlby1idG4tLW1hcmsgewogICAgbWluLXdpZHRoOiAzMnB4Owp9CgpAY29udGFpbmVyIChtYXgtd2lkdGg6IDkwMHB4KSB7CiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzIHsKICAgICAgICBsZWZ0OiA4cHg7CiAgICAgICAgcmlnaHQ6IDhweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgZ2FwOiA2cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1yb3ctLXRvcCB7CiAgICAgICAgZ2FwOiA4cHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby10aW1lZ3JvdXAgewogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBnYXA6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJvdy0tYm90dG9tIHsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGdhcDogNnB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tYm90dG9tIHsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXRyYW5zcG9ydCB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1ncm91cCB7CiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1zZWVrLXdyYXAgewogICAgICAgIG1pbi13aWR0aDogMDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIgLm1qci12aWRlby1iYXItdGltZWxpbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QKICAgICAgICAubWpyLXZpZGVvLWNvbnRyb2xzLS12aWV3ZXJiYXIKICAgICAgICAubWpyLXZpZGVvLWJhci10aW1lbGluZQogICAgICAgIC5tanItdmlkZW8tc2Vlay13cmFwIHsKICAgICAgICBvcmRlcjogLTE7CiAgICAgICAgZmxleDogMSAxIDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICB9Cn0KCkBjb250YWluZXIgKG1heC13aWR0aDogNjgwcHgpIHsKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tY29udHJvbHMgewogICAgICAgIHBhZGRpbmc6IDZweDsKICAgIH0KCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLWJ0biB7CiAgICAgICAgcGFkZGluZzogNXB4IDhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICB9CgogICAgLm1qci1tZnYtcGxheWVyLWhvc3QgLm1qci12aWRlby1udW0gewogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgfQoKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tdGltZSwKICAgIC5tanItbWZ2LXBsYXllci1ob3N0IC5tanItdmlkZW8tZnJhbWUsCiAgICAubWpyLW1mdi1wbGF5ZXItaG9zdCAubWpyLXZpZGVvLXJhbmdlLWNvdW50IHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICB9Cn0KCi8qIOKUgOKUgCBTZXR0aW5ncyBidXR0b24gYWN0aXZlIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1zZXR0aW5ncy1idG4uYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgNTUlLAogICAgICAgIHZhcigtLW1qci1ib3JkZXIsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMikpCiAgICApOwogICAgYmFja2dyb3VuZC1jb2xvcjogY29sb3ItbWl4KAogICAgICAgIGluIHNyZ2IsCiAgICAgICAgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzMzMykgNzAlLAogICAgICAgIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDE4JQogICAgKTsKfQoubWpyLW1mdi1zZXR0aW5ncy1idG4uYWN0aXZlIC5waSB7CiAgICBjb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7Cn0KCi8qIOKUgOKUgCBDbG9zZSBidXR0b24gKHJlZCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItbWZ2IC5tanItbWZ2LWNsb3NlLWJ0biB7CiAgICBjb2xvcjogI2U4NTA1MDsKfQoubWpyLW1mdiAubWpyLW1mdi1jbG9zZS1idG46aG92ZXIgewogICAgY29sb3I6ICNmZjZiNmI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIzMiwgODAsIDgwLCAwLjE1KTsKfQoKLyog4pSA4pSAIEVtcHR5IHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1lbXB0eSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMTJweDsKfQoKLyog4pSA4pSAIENvbXBhcmUgbGFiZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoubWpyLW1mdi1sYWJlbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41OCk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBwYWRkaW5nOiAycHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAyMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKfQoKLm1qci1tZnYtbGFiZWwubGFiZWwtbGVmdCB7CiAgICBsZWZ0OiA4cHg7Cn0KLm1qci1tZnYtbGFiZWwubGFiZWwtcmlnaHQgewogICAgcmlnaHQ6IDhweDsKfQoKLyog4pSA4pSAIEFCIGRpdmlkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5tanItbWZ2LWFiLWRpdmlkZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgd2lkdGg6IDAuNXB4OwogICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgei1pbmRleDogMTA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuODgpOwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDAgMCAwLjVweCByZ2JhKDAsIDAsIDAsIDAuNCksCiAgICAgICAgMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTAwbXMgZWFzZTsKfQoKLm1qci1tZnYtYWItZGl2aWRlcjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAwOwogICAgYm90dG9tOiAwOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDEycHg7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7Cn0KCi5tanItbWZ2LWFiLWRpdmlkZXI6aG92ZXIsCi5tanItbWZ2LWFiLWRpdmlkZXI6YWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgTUZWIEdlb21ldHJ5ICYgTGF5b3V0IENsYXNzZXMgKHJlcGxhY2VzIGlubGluZSBzdHlsZXMgaW4gRmxvYXRpbmdWaWV3ZXIuanMpCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLyogTWFpbiBNRlYgY29udGFpbmVyIGdlb21ldHJ5ICovCi5tanItbWZ2IHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogdmFyKC0tbWpyLW1mdi10b3Atb2Zmc2V0LCA2MHB4KTsKICAgIHJpZ2h0OiAyMHB4OwogICAgd2lkdGg6IDY0MHB4OwogICAgaGVpZ2h0OiAzNjBweDsKICAgIG1pbi13aWR0aDogMjIwcHg7CiAgICBtaW4taGVpZ2h0OiAxNjBweDsKICAgIC8qIEFsd2F5cyBmbGV4OyB2aXNpYmlsaXR5ICsgb3BhY2l0eSBjb250cm9sIHNob3cvaGlkZSBzbyBDU1MgdHJhbnNpdGlvbnMgd29yay4KICAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmUgd2hpbGUgaGlkZGVuIHByZXZlbnRzIGFjY2lkZW50YWwgaW50ZXJhY3Rpb24uICovCiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHJlc2l6ZTogYm90aDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB6LWluZGV4OiAxMDAwMDsKICAgIC8qIEhpZGRlbiBzdGF0ZSAqLwogICAgb3BhY2l0eTogMDsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC02cHgpIHNjYWxlKDAuOTgpOwogICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wIHJpZ2h0OwogICAgdHJhbnNpdGlvbjoKICAgICAgICBvcGFjaXR5IDAuMThzIGVhc2Utb3V0LAogICAgICAgIHRyYW5zZm9ybSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB2aXNpYmlsaXR5IDBzIGxpbmVhciAwLjE4czsKfQoKLm1qci1tZnYubWpyLW1mdi0tcmVzaXppbmcgewogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5tanItbWZ2LmlzLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgb3BhY2l0eSAwLjE4cyBlYXNlLW91dCwKICAgICAgICB0cmFuc2Zvcm0gMC4xOHMgZWFzZS1vdXQsCiAgICAgICAgdmlzaWJpbGl0eSAwcyBsaW5lYXIgMHM7Cn0KCi8qIE1lZGlhIGVsZW1lbnRzIChpbWcvdmlkZW8pIHNpemluZyB2YXJpYW50cyAqLwoubWpyLW1mdi1tZWRpYSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG9iamVjdC1maXQ6IGNvbnRhaW47CiAgICBvYmplY3QtcG9zaXRpb246IGNlbnRlcjsKfQoKLm1qci1tZnYtbWVkaWEtLWZpdC1oZWlnaHQgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgIG9iamVjdC1wb3NpdGlvbjogY2VudGVyOwp9CgoubWpyLW1mdi1tZWRpYS0tZmlsbCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgb2JqZWN0LXBvc2l0aW9uOiBjZW50ZXI7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLyogQXVkaW8gY2FyZCBpbnNpZGUgTUZWICovCi5tanItbWZ2LWF1ZGlvLWNhcmQgewogICAgd2lkdGg6IG1pbig5MiUsIDU2MHB4KTsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE2MGRlZywgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAyKSk7CiAgICBib3gtc2hhZG93OiAwIDZweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC4zNSk7Cn0KCi5tanItbWZ2LWF1ZGlvLWhlYWQgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLm1qci1tZnYtYXVkaW8taWNvbiB7CiAgICBjb2xvcjogdmFyKC0tbWpyLWJhZGdlLWF1ZGlvLCAjZmY5ODAwKTsKICAgIG9wYWNpdHk6IDAuOTU7Cn0KCi5tanItbWZ2LWF1ZGlvLXRpdGxlIHsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwp9CgoubWpyLW1mdi1hdWRpby1wbGF5ZXIgewogICAgd2lkdGg6IDEwMCU7Cn0KCi5tanItbWZ2LXNpZGUtcGFuZWwgLm1qci1tZnYtYXVkaW8tY2FyZCwKLm1qci1tZnYtYWItbGF5ZXIgLm1qci1tZnYtYXVkaW8tY2FyZCwKLm1qci1tZnYtZ3JpZC1jZWxsIC5tanItbWZ2LWF1ZGlvLWNhcmQgewogICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwp9CgovKiBWaWRlbyBlbGVtZW50IHNwZWNpZmljIHN0eWxlcyAqLwoubWpyLW1mdi1tZWRpYS12aWRlbyB7CiAgICAvKiBJbmhlcml0cyBmcm9tIC5tanItbWZ2LW1lZGlhIG9yIC5tanItbWZ2LW1lZGlhLS1maWxsICovCn0KCi8qIE5vZGUgU3RyZWFtIOKAlCBjdXJyZW50bHktc3RyZWFtZWQgbm9kZSBiYWRnZSAodG9wLWxlZnQgb2YgY29udGVudCBhcmVhLAogICBmb2xsb3dpbmcgdGhlIHNhbWUgb3ZlcmxheSBwYXR0ZXJuIGFzIC5tanItbWZ2LWdlbmluZm8pLiAqLwoubWpyLW1mdi1ub2RlLW92ZXJsYXkgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA4cHg7CiAgICBsZWZ0OiA4cHg7CiAgICB6LWluZGV4OiAxMjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgY29sb3I6ICNlNmYzZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNjUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMjAsIDE3MCwgMjQwLCAwLjQ1KTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDE2cHgpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQovKiBHZW4gaW5mbyBvdmVybGF5IOKAlCBhbGwgbW9kZXMgc2hhcmUgYmFzZSBsYXlvdXQgKi8KLm1qci1tZnYtZ2VuaW5mbywKLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1nZW5pbmZvLWIgewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDhweDsKICAgIHJpZ2h0OiA4cHg7CiAgICBib3R0b206IDhweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42NSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogNnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbWF4LWhlaWdodDogNDAlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3IteTogY29udGFpbjsKICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuNCk7Cn0KCi8qIEtlZXAgR2VuIEluZm8gYWJvdmUgY3VzdG9tIHNpbXBsZS1wbGF5ZXIgY29udHJvbHMgd2hlbiBwcmVzZW50LiAqLwoubWpyLW1mdi1nZW5pbmZvLm1qci1tZnYtZ2VuaW5mby0tYWJvdmUtcGxheWVyLAoubWpyLW1mdi1nZW5pbmZvLWEubWpyLW1mdi1nZW5pbmZvLS1hYm92ZS1wbGF5ZXIsCi5tanItbWZ2LWdlbmluZm8tYi5tanItbWZ2LWdlbmluZm8tLWFib3ZlLXBsYXllciB7CiAgICB0b3A6IDhweDsKICAgIGJvdHRvbTogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbig0NSUsIGNhbGMoMTAwJSAtIDEyNHB4KSk7Cn0KCi8qIEZhbGxiYWNrOiB3aGVuIHNpbXBsZS1wbGF5ZXIgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBnZW5pbmZvIG92ZXJsYXksCiAgIG1vdmUgaXQgdXAgZXZlbiBpZiB0aGUgbW9kaWZpZXIgY2xhc3Mgd2FzIG5vdCBhdHRhY2hlZC4gKi8KLm1qci1tZnYtc2ltcGxlLXBsYXllciArIC5tanItbWZ2LWdlbmluZm8sCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLWEsCi5tanItbWZ2LXNpbXBsZS1wbGF5ZXIgKyAubWpyLW1mdi1nZW5pbmZvLWIgewogICAgdG9wOiA4cHg7CiAgICBib3R0b206IGF1dG87CiAgICBtYXgtaGVpZ2h0OiBtaW4oNDUlLCBjYWxjKDEwMCUgLSAxMjRweCkpOwp9CgovKiBBQiBtb2RlIG92ZXJsYXlzIGFyZSBhdHRhY2hlZCBhdCBjb250YWluZXIgbGV2ZWw7IHNoaWZ0IHRoZW0gd2hlbiBBQiBsYXllcnMgdXNlIHNpbXBsZS1wbGF5ZXIuICovCi5tanItbWZ2LWFiLWNvbnRhaW5lcjpoYXMoLm1qci1tZnYtYWItbGF5ZXIgLm1qci1tZnYtc2ltcGxlLXBsYXllcikgLm1qci1tZnYtZ2VuaW5mby1hLAoubWpyLW1mdi1hYi1jb250YWluZXI6aGFzKC5tanItbWZ2LWFiLWxheWVyIC5tanItbWZ2LXNpbXBsZS1wbGF5ZXIpIC5tanItbWZ2LWdlbmluZm8tYiB7CiAgICB0b3A6IDhweDsKICAgIGJvdHRvbTogYXV0bzsKICAgIG1heC1oZWlnaHQ6IG1pbig0NSUsIGNhbGMoMTAwJSAtIDEyNHB4KSk7Cn0KCi8qIFNoYXJlZCBzdHlsZSBmb3IgYWxsIGdlbiBpbmZvIG92ZXJsYXkgdmFyaWFudHMgKi8KLm1qci1tZnYtZ2VuaW5mbyBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi1yaWdodDogNHB4OwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7IC8qIGRlZmF1bHQg4oCUIG92ZXJyaWRkZW4gcGVyIGZpZWxkIGJlbG93ICovCn0KCi8qIFBlci1maWVsZCBsYWJlbCBjb2xvcnMgKi8KLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJwcm9tcHQiXSBzdHJvbmcgewogICAgY29sb3I6ICM3ZWM4ZmY7Cn0gLyogYmx1ZSAgIOKAlCBQcm9tcHQgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzZWVkIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmZkNDdhOwp9IC8qIGFtYmVyICDigJQgU2VlZCAgICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJtb2RlbCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdkZGE4YTsKfSAvKiBncmVlbiAg4oCUIE1vZGVsICAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWIgW2RhdGEtZmllbGQ9ImxvcmEiXSBzdHJvbmcgewogICAgY29sb3I6ICNkNDhjZmY7Cn0gLyogdmlvbGV0IOKAlCBMb1JBICAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9InNhbXBsZXIiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9IC8qIG9yYW5nZSDigJQgU2FtcGxlciAqLwoKLm1qci1tZnYtZ2VuaW5mbyBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJzY2hlZHVsZXIiXSBzdHJvbmcgewogICAgY29sb3I6ICNmZjdhOWY7Cn0gLyogcGluayAgIOKAlCBTY2hlZHVsZXIgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1hIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0iY2ZnIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2E5ZmZmOwp9IC8qIGluZGlnbyDigJQgQ0ZHICovCgoubWpyLW1mdi1nZW5pbmZvIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWEgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYiBbZGF0YS1maWVsZD0ic3RlcCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdhZmZkNDsKfSAvKiB0ZWFsICAg4oCUIFN0ZXAgKi8KCi5tanItbWZ2LWdlbmluZm8gW2RhdGEtZmllbGQ9ImdlblRpbWUiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tYSBbZGF0YS1maWVsZD0iZ2VuVGltZSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1iIFtkYXRhLWZpZWxkPSJnZW5UaW1lIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZTBmZjdhOwp9IC8qIGxpbWUgICDigJQgR2VuIFRpbWUgKi8KCi5tanItbWZ2LWdlbmluZm8gZGl2LAoubWpyLW1mdi1nZW5pbmZvLWEgZGl2LAoubWpyLW1mdi1nZW5pbmZvLWIgZGl2IHsKICAgIGxpbmUtaGVpZ2h0OiAxLjM1OwogICAgbWFyZ2luLWJvdHRvbTogM3B4Owp9CgoubWpyLW1mdi1nZW5pbmZvIGRpdjpsYXN0LWNoaWxkLAoubWpyLW1mdi1nZW5pbmZvLWEgZGl2Omxhc3QtY2hpbGQsCi5tanItbWZ2LWdlbmluZm8tYiBkaXY6bGFzdC1jaGlsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgovKiBTaW1wbGUgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtc2ltcGxlLWNvbnRhaW5lciB7CiAgICB3aWR0aDogMTAwJTsKICAgIGhlaWdodDogMTAwJTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgovKiBBQiBtb2RlIGNvbnRhaW5lciAqLwoubWpyLW1mdi1hYi1jb250YWluZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYmFja2dyb3VuZDogIzAwMDsKfQoKLyogQUIgbW9kZSBsYXllcnMgKi8KLm1qci1tZnYtYWItbGF5ZXIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgoubWpyLW1mdi1hYi1sYXllci0tYiB7CiAgICAvKiBjbGlwLXBhdGggYXBwbGllZCBpbmxpbmUgZm9yIGR5bmFtaWMgZGl2aWRlciBwb3NpdGlvbiAqLwp9CgovKiBTaWRlLWJ5LXNpZGUgbW9kZSBjb250YWluZXIgKi8KLm1qci1tZnYtc2lkZS1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZ2FwOiAycHg7CiAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogU2lkZS1ieS1zaWRlIGhhbGYgcGFuZWxzICovCi5tanItbWZ2LXNpZGUtcGFuZWwgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYmFja2dyb3VuZDogIzBkMGQwZDsKfQoKLyogR3JpZCBjb21wYXJlICgyw5cyKSBjb250YWluZXIgKi8KLm1qci1tZnYtZ3JpZC1jb250YWluZXIgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIGdyaWQtdGVtcGxhdGUtcm93czogMWZyIDFmcjsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZ2FwOiAycHg7CiAgICBiYWNrZ3JvdW5kOiAjMTExOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLyogR3JpZCBjZWxscyAqLwoubWpyLW1mdi1ncmlkLWNlbGwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiAjMGQwZDBkOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogMDsKfQoKLyogR2VuIGluZm8gb3ZlcmxheXMgZm9yIGdyaWQgY2VsbHMgQyBhbmQgRCAqLwoubWpyLW1mdi1nZW5pbmZvLWMsCi5tanItbWZ2LWdlbmluZm8tZCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogOHB4OwogICAgcmlnaHQ6IDhweDsKICAgIGJvdHRvbTogOHB4OwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjY1KTsKICAgIGNvbG9yOiAjZmZmOwogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBtYXgtaGVpZ2h0OiA0MCU7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKfQoKLm1qci1tZnYtZ2VuaW5mby1jIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KTsKfQoKLyogUGVyLWZpZWxkIGxhYmVsIGNvbG9ycyBmb3IgQy9EIGdlbiBpbmZvIG92ZXJsYXlzICovCi5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0icHJvbXB0Il0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InByb21wdCJdIHN0cm9uZyB7CiAgICBjb2xvcjogIzdlYzhmZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9InNlZWQiXSBzdHJvbmcsCi5tanItbWZ2LWdlbmluZm8tZCBbZGF0YS1maWVsZD0ic2VlZCJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmZDQ3YTsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9Im1vZGVsIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjN2RkYThhOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ibG9yYSJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJsb3JhIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZDQ4Y2ZmOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic2FtcGxlciJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJzYW1wbGVyIl0gc3Ryb25nIHsKICAgIGNvbG9yOiAjZmY5ZjdhOwp9Ci5tanItbWZ2LWdlbmluZm8tYyBbZGF0YS1maWVsZD0ic2NoZWR1bGVyIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InNjaGVkdWxlciJdIHN0cm9uZyB7CiAgICBjb2xvcjogI2ZmN2E5ZjsKfQoubWpyLW1mdi1nZW5pbmZvLWMgW2RhdGEtZmllbGQ9ImNmZyJdIHN0cm9uZywKLm1qci1tZnYtZ2VuaW5mby1kIFtkYXRhLWZpZWxkPSJjZmciXSBzdHJvbmcgewogICAgY29sb3I6ICM3YTlmZmY7Cn0KLm1qci1tZnYtZ2VuaW5mby1jIFtkYXRhLWZpZWxkPSJzdGVwIl0gc3Ryb25nLAoubWpyLW1mdi1nZW5pbmZvLWQgW2RhdGEtZmllbGQ9InN0ZXAiXSBzdHJvbmcgewogICAgY29sb3I6ICM3YWZmZDQ7Cn0KCi8qIEdlbiBpbmZvIGFjdGl2ZSBzdGF0ZSDigJQgYnV0dG9uIGdsb3dzIHdoZW4gYXQgbGVhc3Qgb25lIGZpZWxkIGlzIHNlbGVjdGVkICovCi5tanItbWZ2IC5tanItaWNvbi1idG4uaXMtb24gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKHZhcigtLW1qci1ncm91cC1hY2NlbnQsIDk1LCAxNzksIDI1NSksIDAuNTUpOwogICAgY29sb3I6IHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpOwogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTIsICMzMzMpIDgwJSwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMTUlKTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZikgMjUlLCB0cmFuc3BhcmVudCk7Cn0KCi5tanItbWZ2IC5tanItaWNvbi1idG4uaXMtb3BlbiB7CiAgICBib3JkZXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItYWNjZW50LCAjNWZiM2ZmKSA2MiUsICNmZmZmZmYgMTIlKTsKICAgIGNvbG9yOiAjZWVmN2ZmOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSg5NSwgMTc5LCAyNTUsIDAuMjgpLCByZ2JhKDk1LCAxNzksIDI1NSwgMC4xNCkpOwogICAgYm94LXNoYWRvdzoKICAgICAgICBpbnNldCAwIDAgMCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KSwKICAgICAgICAwIDAgMCAxcHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1hY2NlbnQsICM1ZmIzZmYpIDI2JSwgdHJhbnNwYXJlbnQpOwp9CgoubWpyLW1mdi5tanItbWZ2LS1wb3BwZWQgLm1qci1pY29uLWJ0bi5pcy1vcGVuIHsKICAgIGNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7Cn0KCi8qIEdlbiBpbmZvIGRyb3Bkb3duIHBhbmVsICovCi5tanItbWZ2LWdlbi1kcm9wZG93biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiAxMDAwMTsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKSA5NiUsIHRyYW5zcGFyZW50KTsKICAgIGNvbG9yOiB2YXIoLS1jb250ZW50LWZnLCAjZGRkKTsKICAgIHBhZGRpbmc6IDZweCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMTgpOwogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41NSksCiAgICAgICAgMCAycHggNnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7CiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd246OmJlZm9yZSB7CiAgICBjb250ZW50OiAiR0VOIElORk8iOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsZXR0ZXItc3BhY2luZzogMC44cHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjM1KTsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDZweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDE5NiwgMjAyLCAyMTAsIDAuMSk7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi5pcy12aXNpYmxlIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTAwbXMgZWFzZTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgoubWpyLW1mdi1nZW4tZHJvcGRvd24tcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNyk7Cn0KCi5tanItbWZ2LWdlbi1kcm9wZG93bi1yb3cgaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CiAgICB3aWR0aDogMTNweDsKICAgIGhlaWdodDogMTNweDsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tbWpyLWFjY2VudCwgIzVmYjNmZik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKfQoKLyogVHJhbnNmb3JtIGZvciBwYW4vem9vbSAtIGFwcGxpZWQgaW5saW5lIGZvciBkeW5hbWljIHZhbHVlcyAqLwoubWpyLW1mdi1tZWRpYS0tdHJhbnNmb3JtIHsKICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlcjsKfQoKLyogQ3Vyc29yIGZlZWRiYWNrIGZvciBwYW4vem9vbSBpbnRlcmFjdGlvbnMgKi8KLm1qci1tZnYtY29udGVudC0tZ3JhYiB7CiAgICBjdXJzb3I6IGdyYWI7Cn0KCi5tanItbWZ2LWNvbnRlbnQtLWdyYWJiaW5nIHsKICAgIGN1cnNvcjogZ3JhYmJpbmc7Cn0KCi8qIFNpZGViYXIgdGFiIGJ1dHRvbjogYWxsb3cgMi1saW5lIGxhYmVsIHZpYSBcbiBpbiBsYWJlbCBzdHJpbmcgKi8KLm1ham9vci1hc3NldHMtdGFiLWJ1dHRvbiAuc2lkZS1iYXItYnV0dG9uLWxhYmVsIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTsKfQoKLyogQm90dG9tLXBhbmVsIGdlbmVyYXRlZCBmZWVkOiBjb21wYWN0IGNhcmRzIHdpdGggb25seSB0aGUgZ2VuZXJhdGlvbi10aW1lIHBpbGwgKi8KLm1qci1ib3R0b20tZmVlZCB7CiAgICBtaW4taGVpZ2h0OiAwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgbWluLWhlaWdodDogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgc2Nyb2xsYmFyLWd1dHRlcjogc3RhYmxlOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgdG91Y2gtYWN0aW9uOiBwYW4teTsKICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwogICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluOwogICAgc2Nyb2xsYmFyLWNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSkKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCwgIzE2MTkxZikgODglLCAjMDAwIDEyJSk7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1hbS1ncmlkLXNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIsCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLWdyaWQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItYW0tZ3JpZC1zY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLAoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzJmMzU0MCkgNzAlLCAjN2Y4ZWEzIDMwJSk7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWFtLWdyaWQtc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10cmFjaywKLm1qci1mZWVkLWdyb3VwLXBvcG92ZXItZ3JpZDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTAsICMxNjE5MWYpIDg4JSwgIzAwMCAxMiUpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkIHsKICAgIGdhcDogNnB4ICFpbXBvcnRhbnQ7CiAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heChtaW4oMTAwJSwgMTMycHgpLCAxZnIpKSAhaW1wb3J0YW50OwogICAgbWluLWhlaWdodDogMDsKICAgIGhlaWdodDogYXV0bzsKICAgIGFsaWduLWNvbnRlbnQ6IHN0YXJ0Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZCwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQgewogICAgYm9yZGVyLXJhZGl1czogMTJweCAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0xKSA5MiUsICMwMDAgOCUpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDZweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMikgIWltcG9ydGFudDsKICAgIHRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItY2FyZDpob3ZlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQ6aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpICFpbXBvcnRhbnQ7CiAgICBib3gtc2hhZG93OiAwIDEwcHggMjRweCByZ2JhKDAsIDAsIDAsIDAuMjgpICFpbXBvcnRhbnQ7CgogICAgLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmQuaXMtc2VsZWN0ZWQgewogICAgICAgIGJveC1zaGFkb3c6CiAgICAgICAgICAgIDAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA4MCUsIHZhcigtLWNvbnRlbnQtZmcpKSwKICAgICAgICAgICAgMCAwIDAgNnB4IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpIDMwJSwgdHJhbnNwYXJlbnQpLAogICAgICAgICAgICAwIDAgMjBweCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLWNhcmQtc2VsZWN0aW9uLWNvbG9yKSA0MCUsIHRyYW5zcGFyZW50KSwKICAgICAgICAgICAgMCAxMHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjI4KSAhaW1wb3J0YW50OwogICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCB2YXIoLS1tanItY2FyZC1zZWxlY3Rpb24tY29sb3IpICFpbXBvcnRhbnQ7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKICAgIH0KfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gewogICAgb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjpiZWZvcmUsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXSAubWpyLXRodW1iOjphZnRlciwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAtMTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDE0MG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxNDBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDVweCwgNXB4KSBzY2FsZSgwLjk4NSk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKSksCiAgICAgICAgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTEsICMyMDI0MmIpIDg0JSwgIzAwMCAxNiUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDE4cHggcmdiYSgwLCAwLCAwLCAwLjE2KTsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItdGh1bWI6OmFmdGVyLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci10aHVtYjo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTBweCwgMTBweCkgc2NhbGUoMC45Nyk7CiAgICBiYWNrZ3JvdW5kOgogICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNiksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMikpLAogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4MiUsICMwMDAgMTglKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNik7CiAgICBib3gtc2hhZG93OiAwIDEycHggMjJweCByZ2JhKDAsIDAsIDAsIDAuMTQpOwogICAgb3BhY2l0eTogMC43NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmJlZm9yZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOmhvdmVyIC5tanItdGh1bWI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg2cHgsIDZweCkgc2NhbGUoMC45ODUpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIgLm1qci10aHVtYjo6YWZ0ZXIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTpob3ZlciAubWpyLXRodW1iOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMnB4LCAxMnB4KSBzY2FsZSgwLjk3KTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLXRodW1iIHsKICAgIGFzcGVjdC1yYXRpbzogMC45NSAvIDEgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wKSA3MiUsICMwMDAgMjglKSAhaW1wb3J0YW50Owp9CgoubWpyLWJvdHRvbS1mZWVkIC5tanItdGh1bWItcGxheSB7CiAgICBiYWNrZ3JvdW5kOiByYWRpYWwtZ3JhZGllbnQoCiAgICAgICAgY2lyY2xlIGF0IGNlbnRlciwKICAgICAgICByZ2JhKDAsIDAsIDAsIDAuMTgpLAogICAgICAgIHJnYmEoMCwgMCwgMCwgMC4wNCkgMzglLAogICAgICAgIHRyYW5zcGFyZW50IDcwJQogICAgKTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCwKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZywKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkyKTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCBsZWZ0Owp9CgovKiDilIDilIAgRmVlZCBjYXJkIGluZm86IGRlZmF1bHQgaGlkZGVuLCB0b2dnbGVkIHZpYSBtanItZmVlZC1zaG93LSogY2xhc3NlcyBvbiAubWpyLWdyaWQg4pSA4pSAICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWluZm8gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgcGFkZGluZzogNHB4IDZweCAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctaW5mbyAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGZpbGVuYW1lICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWZpbGVuYW1lIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWZpbGVuYW1lIC5tanItY2FyZC1maWxlbmFtZSB7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9CgovKiBGZWVkIGRpbWVuc2lvbnMgLyBkdXJhdGlvbiAqLwoubWpyLWJvdHRvbS1mZWVkIC5tanItbWV0YS1yZXMsCi5tanItYm90dG9tLWZlZWQgLm1qci1tZXRhLWR1cmF0aW9uIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRpbWVuc2lvbnMgLm1qci1tZXRhLXJlcywKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kaW1lbnNpb25zIC5tanItbWV0YS1kdXJhdGlvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBkYXRlL3RpbWUgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtdGltZS12YWwgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZGF0ZSAubWpyLW1ldGEtZGF0ZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1kYXRlIC5tanItbWV0YS10aW1lLXZhbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQoKLyogRmVlZCBnZW5lcmF0aW9uIHRpbWUgYmFkZ2UgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1nZW50aW1lIC5tanItbWV0YS1nZW50aW1lIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4ICFpbXBvcnRhbnQ7Cn0KCi8qIEZlZWQgd29ya2Zsb3cgZG90ICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLWRvdC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoubWpyLWJvdHRvbS1mZWVkIC5tanItZ3JpZC5tanItZmVlZC1zaG93LWRvdCAubWpyLWNhcmQtZG90LXdyYXBwZXIgewogICAgZGlzcGxheTogaW5saW5lLWZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBiYWRnZXMgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLWV4dCB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtZXh0IC5tanItYmFkZ2UtZXh0IHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXJhdGluZyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KLm1qci1ib3R0b20tZmVlZCAubWpyLWdyaWQubWpyLWZlZWQtc2hvdy1iYWRnZXMtcmF0aW5nIC5tanItYmFkZ2UtcmF0aW5nIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWJhZGdlLXRhZ3MgewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9Ci5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctYmFkZ2VzLXRhZ3MgLm1qci1iYWRnZS10YWdzIHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKfQoKLyogRmVlZCBtZXRhIHJvdyBzdHlsaW5nIOKAlCBmbGV4IGxheW91dCBzbyB2aXNpYmxlIGl0ZW1zIHN0YXkgc2VwYXJhdGVkICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93IHsKICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDsKICAgIGZsZXgtd3JhcDogbm93cmFwICFpbXBvcnRhbnQ7CiAgICBhbGlnbi1pdGVtczogY2VudGVyICFpbXBvcnRhbnQ7CiAgICBnYXA6IDVweCAhaW1wb3J0YW50OwogICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICBsaW5lLWhlaWdodDogMS4zICFpbXBvcnRhbnQ7CiAgICBvcGFjaXR5OiAwLjc4ICFpbXBvcnRhbnQ7CiAgICBmb250LXNpemU6IDAuOGVtICFpbXBvcnRhbnQ7CiAgICAvKiB0ZXh0LW92ZXJmbG93IGVsbGlwc2lzIGRvZXNuJ3QgYXBwbHkgb24gYSBmbGV4IGNvbnRhaW5lciBpdHNlbGYgKi8KfQovKiBFYWNoIG1ldGEgc3BhbiB0cnVuY2F0ZXMgaW5kaXZpZHVhbGx5IGlmIHRvbyBsb25nICovCi5tanItYm90dG9tLWZlZWQgLm1qci1jYXJkLW1ldGEtcm93ID4gc3BhbiB7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbWluLXdpZHRoOiAwOwogICAgZmxleC1zaHJpbms6IDE7Cn0KLyogR2VudGltZSBiYWRnZSBhbmQgdGltZSB2YWx1ZSBzaG91bGQgc3RheSB2aXNpYmxlIChkb24ndCBzaHJpbmsgYXdheSkgKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgPiAubWpyLW1ldGEtZ2VudGltZSwKLm1qci1ib3R0b20tZmVlZCAubWpyLWNhcmQtbWV0YS1yb3cgPiAubWpyLW1ldGEtdGltZS12YWwgewogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5tanItYm90dG9tLWZlZWQgLm1qci1ncmlkLm1qci1mZWVkLXNob3ctZ2VudGltZSAubWpyLW1ldGEtZ2VudGltZSB7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAzcHg7CiAgICBwYWRkaW5nOiAzcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjIpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMCAhaW1wb3J0YW50OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE1ZW07CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk4KTsKICAgIHRleHQtc2hhZG93OgogICAgICAgIDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuOSksCiAgICAgICAgMCAwIDEwcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKfQoKLyog4pSA4pSAIEF1ZGlvIC8gM0QgcGxhY2Vob2xkZXIgdGh1bWJuYWlscyBpbiB0aGUgZmVlZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi8qIEF1ZGlvIGNhcmRzIHNob3cgdGhlIHdhdmVmb3JtIHNwcml0ZTsgZ2l2ZSBpdCBhIGRpc3RpbmN0IGJhY2tncm91bmQgc28gaXQKICAgZG9lc24ndCBsb29rIGxpa2UgYSBicm9rZW4gaW1hZ2UgcGxhY2Vob2xkZXIgaW4gdGhlIGZlZWQuICovCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWtpbmQ9ImF1ZGlvIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJtcDMiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9IndhdiJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0ib2dnIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJmbGFjIl0gLm1qci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMCkgNjAlLCAjMWExZjJiIDQwJSkgIWltcG9ydGFudDsKfQoKLyogM0QgbW9kZWwgY2FyZHMgdXNlIGFuIGljb24gcGxhY2Vob2xkZXIg4oCUIGFkZCBhIHN1YnRsZSBncmFkaWVudCBzbyB0aGV5IHJlYWQKICAgYXMgaW50ZW50aW9uYWwgcmF0aGVyIHRoYW4gbWlzc2luZy4gKi8KLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanIta2luZD0ibW9kZWwzZCJdIC5tanItdGh1bWIsCi5tanItYm90dG9tLWZlZWQgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWV4dD0iZ2xiIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJnbHRmIl0gLm1qci10aHVtYiwKLm1qci1ib3R0b20tZmVlZCAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZXh0PSJvYmoiXSAubWpyLXRodW1iLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1leHQ9ImZieCJdIC5tanItdGh1bWIgewogICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1qci1zdXJmYWNlLTApIDUwJSwgIzBkMTExNyA1MCUpICFpbXBvcnRhbnQ7Cn0KCi8qIOKUgOKUgCBGZWVkIGdyb3VwIGJ1dHRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5tanItYm90dG9tLWZlZWQgLm1qci1mZWVkLWdyb3VwLWJ1dHRvbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDM0cHg7CiAgICByaWdodDogNnB4OwogICAgei1pbmRleDogMTE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgbWluLWhlaWdodDogMjhweDsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwLCAxNCwgMjAsIDAuNzQpOwogICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1ib3R0b20tZmVlZCAubWpyLWZlZWQtZ3JvdXAtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTgsIDI0LCAzNCwgMC45KTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1pY29uIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG9wYWNpdHk6IDAuOTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1jb3VudCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi8qIOKUgOKUgCBGZWVkIGdyb3VwIHBvcG92ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubWpyLWZlZWQtZ3JvdXAtcG9wb3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb21meS1tZW51LWJnLCAjMjIyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvciwgIzNhM2EzYSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1tanItci1sZywgOHB4KTsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDI4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5tanItZmVlZC1ncm91cC1wb3BvdmVyLXRpdGxlIHsKICAgIHBhZGRpbmc6IDhweCAxMHB4IDRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgoubWpyLWZlZWQtZ3JvdXAtcG9wb3Zlci1ncmlkIHsKICAgIHBhZGRpbmc6IDRweCA4cHggMTBweDsKICAgIG1heC1oZWlnaHQ6IDM2MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBzY3JvbGxiYXItZ3V0dGVyOiBzdGFibGU7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0yLCAjMmYzNTQwKSA3MCUsICM3ZjhlYTMgMzAlKQogICAgICAgIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tanItc3VyZmFjZS0wLCAjMTYxOTFmKSA4OCUsICMwMDAgMTIlKTsKfQoKLm1qci1mZWVkLWdyb3VwLWJ1dHRvbi1pY29uLAoubWpyLWZlZWQtZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLWZlZWQtZ3JvdXAtbWVtYmVyLWNhcmQgLm1qci10aHVtYiB7CiAgICBhc3BlY3QtcmF0aW86IDEgLyAxICFpbXBvcnRhbnQ7Cn0KCi5tanItZmVlZC1ncm91cC1tZW1iZXItY2FyZCAubWpyLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAzNHB4OwogICAgcmlnaHQ6IDZweDsKICAgIHotaW5kZXg6IDExOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIG1pbi13aWR0aDogMjhweDsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KTsKICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTQsIDIwLCAwLjc0KTsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTYpOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjI0KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig2cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDEyMG1zIGVhc2UsCiAgICAgICAgdHJhbnNmb3JtIDgwbXMgZWFzZTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLXN0YWNrLWdyb3VwLWJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDE4LCAyNCwgMzQsIDAuOSk7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1zdGFjay1ncm91cC1idXR0b24gPiAqIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDRweDsKICAgIGhlaWdodDogNHB4Owp9CgoubWpyLWZpbG1zdHJpcDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5tanItZmlsbXN0cmlwOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNCk7Cn0KCi5tanItZmlsbXN0cmlwOmhvdmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjIpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLyog4pSA4pSAIER1cGxpY2F0ZSBzdGFjayBidXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi8qIFNob3dzIG9uIHRoZSBwcmltYXJ5IGNhcmQgd2hlbiBzYW1lLWZpbGVuYW1lIGR1cGxpY2F0ZXMgZXhpc3QuICAgICAgICAgICAgICovCi8qIFBvc2l0aW9uZWQgYXQgYm90dG9tLXJpZ2h0IHRvIG5vdCBvdmVybGFwIHRoZSBzdGFjay1ncm91cCBidXR0b24gKHRvcC1yaWdodCkuICovCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogMzBweDsKICAgIHJpZ2h0OiA2cHg7CiAgICB6LWluZGV4OiAxMTsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBtaW4td2lkdGg6IDI4cHg7CiAgICBtaW4taGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAxODAsIDAsIDAuMzgpOwogICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDMwLCAxOCwgMCwgMC44Mik7CiAgICBjb2xvcjogcmdiYSgyNTUsIDIwMCwgNjAsIDAuOTYpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zMik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNnB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgdHJhbnNpdGlvbjoKICAgICAgICBiYWNrZ3JvdW5kIDAuMTVzLAogICAgICAgIHRyYW5zZm9ybSA4MG1zIGVhc2U7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1kdXAtc3RhY2stYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNTAsIDMwLCAwLCAwLjk0KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE4MCwgMCwgMC42KTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWR1cC1zdGFjay1idXR0b24gPiAqIHsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItZHVwLXN0YWNrLWNvdW50IHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItZHVwLXN0YWNrZWQ9InRydWUiXSAubWpyLWR1cC1zdGFjay1idXR0b24gewogICAgYm94LXNoYWRvdzoKICAgICAgICAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjMyKSwKICAgICAgICAwIDAgMCAxcHggcmdiYSgyNTUsIDE4MCwgMCwgMC4yKTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIC5tanItc3RhY2stZ3JvdXAtYnV0dG9uLAoubWpyLWJvdHRvbS1mZWVkIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl0gLm1qci1mZWVkLWdyb3VwLWJ1dHRvbiB7CiAgICBib3gtc2hhZG93OgogICAgICAgIDAgMnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMjQpLAogICAgICAgIDAgMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDQpOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXIsCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLWR1cC1zdGFja2VkPSJ0cnVlIl06aG92ZXIgewogICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7Cn0KCi8qIOKUgOKUgCBWaXN1YWwgc3RhY2tpbmcgZWZmZWN0IOKAlCBsYXllcmVkIGNhcmRzIGJlaGluZCB0aGUgbWFpbiBjYXJkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwovKiBDcmVhdGVzIHBzZXVkby1lbGVtZW50ICJjYXJkcyIgb2Zmc2V0IGJlaGluZCB0aGUgcHJpbWFyeSBjYXJkIHRvIHZpc3VhbGx5ICAgICovCi8qIGNvbW11bmljYXRlIHRoYXQgdGhpcyBjYXJkIHJlcHJlc2VudHMgYSBncm91cCBvZiBtdWx0aXBsZSBpbWFnZXMuICAgICAgICAgICAgKi8KLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHotaW5kZXg6IDE7Cn0KCi5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hc3NldC1jYXJkW2RhdGEtbWpyLXN0YWNrZWQ9InRydWUiXTo6YmVmb3JlLAoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaW5zZXQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgYmFja2dyb3VuZDogdmFyKC0tY29tZnktbWVudS1iZywgIzFhMWEyZSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB6LWluZGV4OiAtMTsKICAgIHRyYW5zaXRpb246CiAgICAgICAgdHJhbnNmb3JtIDE4MG1zIGVhc2UsCiAgICAgICAgb3BhY2l0eSAxODBtcyBlYXNlOwp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgzcHgsIDNweCkgcm90YXRlKDFkZWcpOwogICAgb3BhY2l0eTogMC40NTsKfQoKLm1qci1hc3NldHMtbWFuYWdlciAubWpyLWFzc2V0LWNhcmRbZGF0YS1tanItc3RhY2tlZD0idHJ1ZSJdOjphZnRlciB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg2cHgsIDZweCkgcm90YXRlKDIuMmRlZyk7CiAgICBvcGFjaXR5OiAwLjI1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXI6OmJlZm9yZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSg0cHgsIDRweCkgcm90YXRlKDEuNWRlZyk7CiAgICBvcGFjaXR5OiAwLjU1Owp9CgoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYXNzZXQtY2FyZFtkYXRhLW1qci1zdGFja2VkPSJ0cnVlIl06aG92ZXI6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDhweCwgOHB4KSByb3RhdGUoM2RlZyk7CiAgICBvcGFjaXR5OiAwLjM1Owp9CgoubWpyLXN0YWNrLWdyb3VwLXBvcG92ZXIgewogICAgd2lkdGg6IG1pbig0NDBweCwgOTJ2dyk7Cn0KCi5tanItc3RhY2stZ3JvdXAtbWVtYmVyLWNhcmQgewogICAgbWluLXdpZHRoOiAwOwp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIC5tanItdGh1bWIgewogICAgYXNwZWN0LXJhdGlvOiAxIC8gMSAhaW1wb3J0YW50Owp9CgoubWpyLXN0YWNrLWdyb3VwLW1lbWJlci1jYXJkIC5tanItY2FyZC1pbmZvIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIExpZ2h0IG1vZGUgb3ZlcnJpZGVzIChDb21meVVJIHYxLjQyKyBpbXByb3ZlZCBsaWdodCB0aGVtZSkKICogVXNlcyBDb21meVVJIGRhdGEtdGhlbWUgYXR0cmlidXRlIHdoZW4gc2V0LCB3aXRoCiAqIHByZWZlcnMtY29sb3Itc2NoZW1lIGFzIGEgZmFsbGJhY2sgZm9yIG9sZGVyIHZlcnNpb25zLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qIENvbWZ5VUkgc2V0cyBkYXRhLXRoZW1lPSJsaWdodCIgb24gPGh0bWw+IG9yIDxib2R5PiAqLwo6aXMoW2RhdGEtdGhlbWU9ImxpZ2h0Il0sIFtkYXRhLWNvbG9yLXNjaGVtZT0ibGlnaHQiXSkgLm1qci1hc3NldHMtbWFuYWdlciwKOmlzKFtkYXRhLXRoZW1lPSJsaWdodCJdLCBbZGF0YS1jb2xvci1zY2hlbWU9ImxpZ2h0Il0pIC5tanItcG9wb3ZlciB7CiAgICAtLW1qci1zdXJmYWNlLTA6IHZhcigtLWludGVyZmFjZS1wYW5lbC1zdXJmYWNlLCAjZjBmMGYwKTsKICAgIC0tbWpyLXN1cmZhY2UtMTogdmFyKC0taW50ZXJmYWNlLW1lbnUtc3VyZmFjZSwgI2ZhZmFmYSk7CiAgICAtLW1qci1zdXJmYWNlLTI6IHZhcigtLWludGVyZmFjZS1wYW5lbC1ob3Zlci1zdXJmYWNlLCAjZThlOGU4KTsKICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAjZmZmZmZmKTsKICAgIC0tbWpyLWJvcmRlcjogdmFyKC0tYm9yZGVyLWRlZmF1bHQsIHJnYmEoMCwgMCwgMCwgMC4xNCkpOwogICAgLS1tanItbXV0ZWQ6IHZhcigtLW11dGVkLWZvcmVncm91bmQsIHJnYmEoMCwgMCwgMCwgMC41NSkpOwogICAgLS1tanItY2FyZC1ob3Zlci1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlMGUwZTApOwp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewogICAgLyogRmFsbGJhY2s6IG9ubHkgYXBwbHkgaWYgQ29tZnlVSSBoYXNuJ3Qgc2V0IGFuIGV4cGxpY2l0IGRhdGEtdGhlbWUgKi8KICAgIC5tanItYXNzZXRzLW1hbmFnZXI6bm90KFtkYXRhLXRoZW1lLWFwcGxpZWRdKSwKICAgIC5tanItcG9wb3Zlcjpub3QoW2RhdGEtdGhlbWUtYXBwbGllZF0pIHsKICAgICAgICAtLW1qci1zdXJmYWNlLTA6IHZhcigtLWludGVyZmFjZS1wYW5lbC1zdXJmYWNlLCAjZjBmMGYwKTsKICAgICAgICAtLW1qci1zdXJmYWNlLTE6IHZhcigtLWludGVyZmFjZS1tZW51LXN1cmZhY2UsICNmYWZhZmEpOwogICAgICAgIC0tbWpyLXN1cmZhY2UtMjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlOGU4ZTgpOwogICAgICAgIC0tbWpyLXN1cmZhY2UtMzogdmFyKC0tbW9kYWwtY2FyZC1iYWNrZ3JvdW5kLCAjZmZmZmZmKTsKICAgICAgICAtLW1qci1ib3JkZXI6IHZhcigtLWJvcmRlci1kZWZhdWx0LCByZ2JhKDAsIDAsIDAsIDAuMTQpKTsKICAgICAgICAtLW1qci1tdXRlZDogdmFyKC0tbXV0ZWQtZm9yZWdyb3VuZCwgcmdiYSgwLCAwLCAwLCAwLjU1KSk7CiAgICAgICAgLS1tanItY2FyZC1ob3Zlci1jb2xvcjogdmFyKC0taW50ZXJmYWNlLXBhbmVsLWhvdmVyLXN1cmZhY2UsICNlMGUwZTApOwogICAgfQp9CgovKiDilIDilIDilIAgU2tlbGV0b24gbG9hZGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5tanItY2FyZC1za2VsZXRvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1tanItc3VyZmFjZS0xLCAjMmEyYTJhKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLW1qci1ib3JkZXIsICMzYTNhM2EpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbWpyLXItbGcsIDhweCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgLyogTWF0Y2ggLm1qci10aHVtYiBhc3BlY3QgcmF0aW8gc28gc2tlbGV0b25zIGhhdmUgdGhlIHNhbWUgZm9vdHByaW50IGFzIHJlYWwgY2FyZHMuICovCiAgICBhc3BlY3QtcmF0aW86IDEgLyAxOwp9CgovKiBTaGltbWVyIHN3ZWVwICovCi5tanItY2FyZC1za2VsZXRvbjo6YWZ0ZXIgewogICAgY29udGVudDogIiI7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgKICAgICAgICA5MGRlZywKICAgICAgICB0cmFuc3BhcmVudCAwJSwKICAgICAgICBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWpyLXN1cmZhY2UtMiwgIzNhM2EzYSkgODAlLCB0cmFuc3BhcmVudCkgNTAlLAogICAgICAgIHRyYW5zcGFyZW50IDEwMCUKICAgICk7CiAgICBhbmltYXRpb246IG1qci1zaGltbWVyIDEuNHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpOwp9CgpAa2V5ZnJhbWVzIG1qci1zaGltbWVyIHsKICAgIGZyb20gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7CiAgICB9CiAgICB0byB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOwogICAgfQp9CgpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgLm1qci1jYXJkLXNrZWxldG9uOjphZnRlciB7CiAgICAgICAgYW5pbWF0aW9uOiBub25lOwogICAgfQp9CgovKiDilIDilIDilIAgUmVzcG9uc2l2ZSBzdW1tYXJ5IGJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi8qCiAqIEVuYWJsZSBjb250YWluZXIgcXVlcmllcyBvbiB0aGUgc3VtbWFyeSBiYXIgc28gY2hpbGRyZW4gY2FuIHJlc3BvbmQgdG8gaXRzCiAqIGFjdHVhbCByZW5kZXJlZCB3aWR0aCAoZS5nLiB3aGVuIHRoZSBwYW5lbCBpcyBkb2NrZWQgaW4gYSBuYXJyb3cgc2lkZWJhcikuCiAqLwoubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeSB7CiAgICBjb250YWluZXItdHlwZTogaW5saW5lLXNpemU7CiAgICBjb250YWluZXItbmFtZTogbWpyLXN1bW1hcnktYmFyOwp9CgovKiBCZWxvdyB+MzgwIHB4OiBoaWRlIHRoZSBwaWxscy9yaWdodCBzZWN0aW9uIHRvIHByZXZlbnQgb3ZlcmZsb3cuICovCkBjb250YWluZXIgbWpyLXN1bW1hcnktYmFyIChtYXgtd2lkdGg6IDM4MHB4KSB7CiAgICAubWpyLWFzc2V0cy1tYW5hZ2VyIC5tanItYW0tc3VtbWFyeS1yaWdodCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KICAgIC5tanItYXNzZXRzLW1hbmFnZXIgLm1qci1hbS1zdW1tYXJ5LXRleHQgewogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgIH0KfQo=", "" + import.meta.url).toString(), n = document.createElement("link"); n.id = t, n.rel = "stylesheet", n.type = "text/css", n.href = e, n.onerror = () => { try { n.remove(); @@ -442,7 +443,7 @@ function Pr({ enabled: e = !0 } = {}) { } }, document.head.appendChild(n), n.onload = () => { try { - document.documentElement.dataset.mjrThemeComfy = "1", Nr(); + document.documentElement.dataset.mjrThemeComfy = "1", Pr(); } catch (e) { console.debug?.(e); } @@ -451,30 +452,30 @@ function Pr({ enabled: e = !0 } = {}) { console.warn("Majoor: failed to load Comfy theme CSS", e); } } -Nr(); +Pr(); //#endregion //#region ui/features/grid/gridApi.ts -function Fr() { +function Ir() { 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: 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 Ir(e) { +function Lr(e) { if (!e) return; - Fr(); + Ir(); let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; - t("mjr-show-filename", I.GRID_SHOW_DETAILS_FILENAME), t("mjr-show-dimensions", I.GRID_SHOW_DETAILS_DIMENSIONS), t("mjr-show-date", I.GRID_SHOW_DETAILS_DATE), t("mjr-show-gentime", I.GRID_SHOW_DETAILS_GENTIME), t("mjr-show-hover-info", I.GRID_SHOW_HOVER_INFO), t("mjr-show-dot", I.GRID_SHOW_WORKFLOW_DOT), t("mjr-show-badges-ext", I.GRID_SHOW_BADGES_EXTENSION), t("mjr-show-badges-rating", I.GRID_SHOW_BADGES_RATING), t("mjr-show-badges-tags", I.GRID_SHOW_BADGES_TAGS), t("mjr-show-details", I.GRID_SHOW_DETAILS), e.style.setProperty("--mjr-grid-min-size", `${I.GRID_MIN_SIZE}px`), e.style.setProperty("--mjr-grid-gap", `${I.GRID_GAP}px`), e.style.setProperty("--mjr-star-active", I.BADGE_STAR_COLOR), e.style.setProperty("--mjr-badge-image", I.BADGE_IMAGE_COLOR), e.style.setProperty("--mjr-badge-video", I.BADGE_VIDEO_COLOR), e.style.setProperty("--mjr-badge-audio", I.BADGE_AUDIO_COLOR), e.style.setProperty("--mjr-badge-model3d", I.BADGE_MODEL3D_COLOR), e.style.setProperty("--mjr-badge-duplicate-alert", I.BADGE_DUPLICATE_ALERT_COLOR), e.style.setProperty("--mjr-card-hover-color", I.UI_CARD_HOVER_COLOR), e.style.setProperty("--mjr-card-selection-color", I.UI_CARD_SELECTION_COLOR), e.style.setProperty("--mjr-rating-color", I.UI_RATING_COLOR), e.style.setProperty("--mjr-tag-color", I.UI_TAG_COLOR); + t("mjr-show-filename", z.GRID_SHOW_DETAILS_FILENAME), t("mjr-show-dimensions", z.GRID_SHOW_DETAILS_DIMENSIONS), t("mjr-show-date", z.GRID_SHOW_DETAILS_DATE), t("mjr-show-gentime", z.GRID_SHOW_DETAILS_GENTIME), t("mjr-show-hover-info", z.GRID_SHOW_HOVER_INFO), t("mjr-show-dot", z.GRID_SHOW_WORKFLOW_DOT), t("mjr-show-badges-ext", z.GRID_SHOW_BADGES_EXTENSION), t("mjr-show-badges-rating", z.GRID_SHOW_BADGES_RATING), t("mjr-show-badges-tags", z.GRID_SHOW_BADGES_TAGS), t("mjr-show-details", z.GRID_SHOW_DETAILS), e.style.setProperty("--mjr-grid-min-size", `${z.GRID_MIN_SIZE}px`), e.style.setProperty("--mjr-grid-gap", `${z.GRID_GAP}px`), e.style.setProperty("--mjr-star-active", z.BADGE_STAR_COLOR), e.style.setProperty("--mjr-badge-image", z.BADGE_IMAGE_COLOR), e.style.setProperty("--mjr-badge-video", z.BADGE_VIDEO_COLOR), e.style.setProperty("--mjr-badge-audio", z.BADGE_AUDIO_COLOR), e.style.setProperty("--mjr-badge-model3d", z.BADGE_MODEL3D_COLOR), e.style.setProperty("--mjr-badge-duplicate-alert", z.BADGE_DUPLICATE_ALERT_COLOR), e.style.setProperty("--mjr-card-hover-color", z.UI_CARD_HOVER_COLOR), e.style.setProperty("--mjr-card-selection-color", z.UI_CARD_SELECTION_COLOR), e.style.setProperty("--mjr-rating-color", z.UI_RATING_COLOR), e.style.setProperty("--mjr-tag-color", z.UI_TAG_COLOR); } -function Lr(e, { applySettingsClasses: t = !0 } = {}) { +function Rr(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) { - Ir(e); + Lr(e); let t = () => { requestAnimationFrame(() => { - Ir(e); + Lr(e); }); }; try { @@ -492,7 +493,7 @@ function Lr(e, { applySettingsClasses: t = !0 } = {}) { } return e; } -function Rr(e, t, ...n) { +function zr(e, t, ...n) { let r = { _mjrCaptureAnchor: "captureAnchor", _mjrDispose: "dispose", @@ -515,78 +516,78 @@ function Rr(e, t, ...n) { console.debug?.(e); } } -function zr(e, t = {}, n = {}) { - return Rr(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; +function Br(e, t = {}, n = {}) { + return zr(e, "_mjrHydrateFromSnapshot", t, n) ?? !1; } -function Br(e, t = "*", n = {}) { - return Rr(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ +function Vr(e, t = "*", n = {}) { + return zr(e, "_mjrLoadAssets", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function Vr(e, t, n = {}) { - return Rr(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ +function Hr(e, t, n = {}) { + return zr(e, "_mjrLoadAssetsFromList", t, n) ?? Promise.resolve({ ok: !1, error: "Grid API unavailable" }); } -function Hr(e) { - return Rr(e, "_mjrPrepareForScopeSwitch"); -} function Ur(e) { + return zr(e, "_mjrPrepareForScopeSwitch"); +} +function Wr(e) { try { e?._mjrSettingsChangedCleanup?.(); } catch (e) { console.debug?.(e); } - return Rr(e, "_mjrDispose"); -} -function Wr(e) { - return Rr(e, "_mjrRefreshGrid"); + return zr(e, "_mjrDispose"); } function Gr(e) { - return Rr(e, "_mjrCaptureAnchor") ?? null; + return zr(e, "_mjrRefreshGrid"); } -function Kr(e, t) { - return Rr(e, "_mjrRestoreAnchor", t); +function Kr(e) { + return zr(e, "_mjrCaptureAnchor") ?? null; } -function qr(e, t, n = {}) { - return Rr(e, "_mjrRemoveAssets", t, n) ?? { +function qr(e, t) { + return zr(e, "_mjrRestoreAnchor", t); +} +function Jr(e, t, n = {}) { + return zr(e, "_mjrRemoveAssets", t, n) ?? { ok: !1, removed: 0, selectedIds: [] }; } -function Jr(e, t) { - return !!Rr(e, "_mjrUpsertAsset", t); -} function Yr(e, t) { - return !!Rr(e, "_mjrUpsertAssetNow", t); + return !!zr(e, "_mjrUpsertAsset", t); +} +function Xr(e, t) { + return !!zr(e, "_mjrUpsertAssetNow", t); } //#endregion //#region ui/features/collections/contextmenu/addToCollectionMenuState.ts -var Xr = Dn({ +var Zr = Dn({ open: !1, x: 0, y: 0, assets: [] }); -function Zr() { +function Qr() { try { window.dispatchEvent(new CustomEvent("mjr-close-all-menus")); } catch (e) { console.debug?.(e); } } -function Qr({ x: e = 0, y: t = 0, assets: n = [] } = {}) { - Zr(), Xr.open = Array.isArray(n) && n.length > 0, Xr.x = Number(e) || 0, Xr.y = Number(t) || 0, Xr.assets = Array.isArray(n) ? [...n] : []; +function $r({ x: e = 0, y: t = 0, assets: n = [] } = {}) { + Qr(), Zr.open = Array.isArray(n) && n.length > 0, Zr.x = Number(e) || 0, Zr.y = Number(t) || 0, Zr.assets = Array.isArray(n) ? [...n] : []; } -function $r() { - Xr.open = !1, Xr.x = 0, Xr.y = 0, Xr.assets = []; +function ei() { + Zr.open = !1, Zr.x = 0, Zr.y = 0, Zr.assets = []; } //#endregion //#region ui/features/collections/contextmenu/addToCollectionMenu.ts -function ei(e) { +function ti(e) { if (!e || typeof e != "object") return null; let t = e.filepath || e.path || e?.file_info?.filepath || ""; return t ? { @@ -598,26 +599,26 @@ function ei(e) { kind: e.kind || "" } : null; } -async function ti({ x: e, y: t, assets: n }) { - let i = Array.isArray(n) ? n.map(ei).filter(Boolean) : []; - if (!i.length) { - s(r("toast.noValidAssetsSelected", "No valid assets selected."), "warning"); +async function ni({ x: e, y: t, assets: n }) { + let r = Array.isArray(n) ? n.map(ti).filter(Boolean) : []; + if (!r.length) { + m(R("toast.noValidAssetsSelected", "No valid assets selected."), "warning"); return; } - Qr({ + $r({ x: Number(e) || 0, y: Number(t) || 0, - assets: i + assets: r }); } //#endregion //#region ui/utils/deleteGuard.ts -async function ni(e, t) { - return I.DELETE_CONFIRMATION ? !!await gt(e > 1 ? r("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : r("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || r("label.thisFile", "this file")) }), r("dialog.confirmDeleteTitle", "Majoor: Confirm delete")) : !0; +async function ri(e, t) { + return z.DELETE_CONFIRMATION ? !!await Bt(e > 1 ? R("dialog.deleteSelectedFiles", "Delete {count} selected files?", { count: e }) : R("dialog.deleteSingleFile", "Delete \"{label}\"?", { label: String(t || R("label.thisFile", "this file")) }), R("dialog.confirmDeleteTitle", "Majoor: Confirm delete")) : !0; } //#endregion //#region ui/utils/filenames.ts -var ri = new Set([ +var ii = new Set([ "CON", "PRN", "AUX", @@ -640,17 +641,17 @@ var ri = new Set([ "LPT7", "LPT8", "LPT9" -]), ii = 255; -function ai(e) { +]), ai = 255; +function oi(e) { try { let t = String(e ?? "").trim(); if (!t) return { valid: !1, reason: "Filename cannot be empty" }; - if (t.length > ii) return { + if (t.length > ai) return { valid: !1, - reason: `Filename is too long (max ${ii} characters)` + reason: `Filename is too long (max ${ai} characters)` }; if (t.includes("/") || t.includes("\\")) return { valid: !1, @@ -673,7 +674,7 @@ function ai(e) { reason: "Filename cannot end with a dot or space" }; let n = t.split(".")[0].toUpperCase(); - return ri.has(n) ? { + return ii.has(n) ? { valid: !1, reason: "Filename uses a reserved Windows name" } : { @@ -687,15 +688,15 @@ function ai(e) { }; } } -function oi(e) { +function si(e) { try { return String(e ?? "").trim(); } catch { return ""; } } -function si(e) { - let t = oi(e); +function ci(e) { + let t = si(e); if (!t) return { stem: "", ext: "" @@ -709,17 +710,17 @@ function si(e) { ext: t.slice(n) }; } -function ci(e, t) { - let n = oi(e); +function li(e, t) { + let n = si(e); if (!n) return ""; - let r = si(t); - return !si(n).ext && r.ext ? `${n}${r.ext}` : n; + let r = ci(t); + return !ci(n).ext && r.ext ? `${n}${r.ext}` : n; } //#endregion //#region ui/features/contextmenu/ratingUpdater.ts -var li = 350, ui = /* @__PURE__ */ new Map(); -function di(e) { - let t = ui.get(e); +var ui = 350, di = /* @__PURE__ */ new Map(); +function fi(e) { + let t = di.get(e); if (t) { try { clearTimeout(t.timer); @@ -731,39 +732,39 @@ function di(e) { } catch (e) { console.debug?.(e); } - ui.delete(e); + di.delete(e); } } -function fi(e) { - e && di(String(e)); +function pi(e) { + e && fi(String(e)); } -function pi() { - for (let e of Array.from(ui.keys())) fi(e); +function mi() { + for (let e of Array.from(di.keys())) pi(e); } -function mi(e, t, { onSuccess: n, onFailure: r, successMessage: i = null, errorMessage: a = null, warnPrefix: o = "[RatingUpdater]" } = {}) { +function hi(e, t, { onSuccess: n, onFailure: r, successMessage: i = null, errorMessage: a = null, warnPrefix: o = "[RatingUpdater]" } = {}) { if (!e) return; - fi(e); - let c = new AbortController(), l = setTimeout(async () => { - ui.delete(String(e)); + pi(e); + let s = new AbortController(), c = setTimeout(async () => { + di.delete(String(e)); try { - let o = await we(e, t, { signal: c.signal }); + let o = await O(e, t, { signal: s.signal }); if (!o?.ok) { - s(o?.error || a || "Failed to update rating", "error"), r?.(o); + m(o?.error || a || "Failed to update rating", "error"), r?.(o); return; } - i && s(i, "success", 1500), n?.(o); + i && m(i, "success", 1500), n?.(o); } catch (e) { - at(e, o, { showToast: !0 }), r?.(e); + st(e, o, { showToast: !0 }), r?.(e); } - }, li); - ui.set(String(e), { - timer: l, - controller: c + }, ui); + di.set(String(e), { + timer: c, + controller: s }); } //#endregion //#region ui/features/contextmenu/viewerContextMenuState.ts -function hi() { +function gi() { return { open: !1, x: 0, @@ -772,11 +773,11 @@ function hi() { title: "" }; } -var Z = Dn({ +var _i = Dn({ portalOwnerId: "", mountedPortalIds: [], - main: hi(), - submenu: hi(), + main: gi(), + submenu: gi(), tags: { open: !1, x: 0, @@ -784,52 +785,52 @@ var Z = Dn({ asset: null, onChanged: null } -}), gi = 1; -function _i(e) { +}), vi = 1; +function yi(e) { e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = ""); } -function vi(e = "") { +function bi(e = "") { try { window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } })); } catch (e) { console.debug?.(e); } } -function yi() { - let e = `mjr-viewer-context-menu-portal-${gi++}`; - return Z.mountedPortalIds.push(e), Z.portalOwnerId ||= e, e; +function xi() { + let e = `mjr-viewer-context-menu-portal-${vi++}`; + return _i.mountedPortalIds.push(e), _i.portalOwnerId ||= e, e; } -function bi(e) { - let t = Z.mountedPortalIds.filter((t) => t !== e); - Z.mountedPortalIds.splice(0, Z.mountedPortalIds.length, ...t), Z.portalOwnerId === e && (Z.portalOwnerId = Z.mountedPortalIds[0] || ""); +function Si(e) { + let t = _i.mountedPortalIds.filter((t) => t !== e); + _i.mountedPortalIds.splice(0, _i.mountedPortalIds.length, ...t), _i.portalOwnerId === e && (_i.portalOwnerId = _i.mountedPortalIds[0] || ""); } -function xi(e) { - return String(Z.portalOwnerId || "") === String(e || ""); -} -function Si({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - vi("viewer"), Di(), Ti(), Z.main.open = !0, Z.main.x = Number(e) || 0, Z.main.y = Number(t) || 0, Z.main.items = Array.isArray(n) ? n.filter(Boolean) : [], Z.main.title = String(r || ""); -} -function Ci() { - _i(Z.main), Ti(); +function Ci(e) { + return String(_i.portalOwnerId || "") === String(e || ""); } function wi({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - Z.submenu.open = !0, Z.submenu.x = Number(e) || 0, Z.submenu.y = Number(t) || 0, Z.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], Z.submenu.title = String(r || ""); + bi("viewer"), ki(), Di(), _i.main.open = !0, _i.main.x = Number(e) || 0, _i.main.y = Number(t) || 0, _i.main.items = Array.isArray(n) ? n.filter(Boolean) : [], _i.main.title = String(r || ""); } function Ti() { - _i(Z.submenu); + yi(_i.main), Di(); } -function Ei({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { - Ci(), Z.tags.open = !!n, Z.tags.x = Number(e) || 0, Z.tags.y = Number(t) || 0, Z.tags.asset = n || null, Z.tags.onChanged = typeof r == "function" ? r : null; +function Ei({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { + _i.submenu.open = !0, _i.submenu.x = Number(e) || 0, _i.submenu.y = Number(t) || 0, _i.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], _i.submenu.title = String(r || ""); } function Di() { - Z.tags.open = !1, Z.tags.x = 0, Z.tags.y = 0, Z.tags.asset = null, Z.tags.onChanged = null; + yi(_i.submenu); } -function Oi() { - Ci(), Di(); +function Oi({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { + Ti(), _i.tags.open = !!n, _i.tags.x = Number(e) || 0, _i.tags.y = Number(t) || 0, _i.tags.asset = n || null, _i.tags.onChanged = typeof r == "function" ? r : null; +} +function ki() { + _i.tags.open = !1, _i.tags.x = 0, _i.tags.y = 0, _i.tags.asset = null, _i.tags.onChanged = null; +} +function Ai() { + Ti(), ki(); } //#endregion //#region ui/features/viewer/ViewerContextMenu.ts -var ki = { +var ji = { COPY_PATH: "Ctrl+Shift+C", DOWNLOAD: "S", OPEN_IN_FOLDER: "Ctrl+Shift+E", @@ -838,19 +839,19 @@ var ki = { RATING_SUBMENU: "1-5", RENAME: "F2", DELETE: "Del" -}, Ai = [ +}, Mi = [ "B", "KB", "MB", "GB", "TB" -], ji = /* @__PURE__ */ new WeakMap(), Mi = 1; -function Ni(e = "viewer-menu-item") { - return `${e}-${Mi++}`; +], Ni = /* @__PURE__ */ new WeakMap(), Pi = 1; +function Fi(e = "viewer-menu-item") { + return `${e}-${Pi++}`; } -function Pi(e, t, n, r, i = {}) { +function Ii(e, t, n, r, i = {}) { return { - id: Ni(), + id: Fi(), type: "item", label: String(e || ""), iconClass: t ? String(t) : "", @@ -861,13 +862,13 @@ function Pi(e, t, n, r, i = {}) { submenu: Array.isArray(i.submenu) ? i.submenu.filter(Boolean) : null }; } -function Fi() { +function Li() { return { - id: Ni("viewer-menu-separator"), + id: Fi("viewer-menu-separator"), type: "separator" }; } -function Ii(e) { +function Ri(e) { let t = String(e || "").trim(); if (!t) return !1; if (t.startsWith("/")) return !0; @@ -878,7 +879,7 @@ function Ii(e) { return !1; } } -function Li(e, t, n) { +function zi(e, t, n) { let r = e?.id; try { e.rating = t; @@ -891,181 +892,181 @@ function Li(e, t, n) { console.debug?.(e); } if (r) { - mi(String(r), t, { + hi(String(r), t, { successMessage: t > 0 ? `Rating set to ${t} stars` : "Rating cleared", errorMessage: "Failed to update rating", warnPrefix: "[ViewerContextMenu]", onSuccess: () => { - ht(qt, { + kt(Zt, { assetId: String(r), rating: t }, { warnPrefix: "[ViewerContextMenu]" }); }, onFailure: (e) => { - at(e, "[ViewerContextMenu] Rating update", { showToast: !0 }); + st(e, "[ViewerContextMenu] Rating update", { showToast: !0 }); } }); return; } - we(e, t).catch((e) => { - at(e, "[ViewerContextMenu] Rating update", { showToast: !0 }); + O(e, t).catch((e) => { + st(e, "[ViewerContextMenu] Rating update", { showToast: !0 }); }); } -function Ri(e) { +function Bi(e) { let t = Number(e); if (!Number.isFinite(t) || t < 0) return ""; let n = 0; - for (; t >= 1024 && n < Ai.length - 1;) t /= 1024, n += 1; - return `${n === 0 ? `${Math.round(t)}` : t.toFixed(2)} ${Ai[n]}`; + for (; t >= 1024 && n < Mi.length - 1;) t /= 1024, n += 1; + return `${n === 0 ? `${Math.round(t)}` : t.toFixed(2)} ${Mi[n]}`; } -function zi(e, t, n) { - let i = [ +function Vi(e, t, n) { + let r = [ 5, 4, 3, 2, 1 - ].map((r) => Pi(`${r} Stars`, "pi pi-star", null, async () => { - Li(e, r, t); + ].map((r) => Ii(`${r} Stars`, "pi pi-star", null, async () => { + zi(e, r, t); }, { disabled: !n })); - return i.push(Fi()), i.push(Pi(r("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { - Li(e, 0, t); - }, { disabled: !n })), i; + return r.push(Li()), r.push(Ii(R("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { + zi(e, 0, t); + }, { disabled: !n })), r; } -function Bi({ asset: e, event: t, getCurrentViewUrl: n, onAssetChanged: i }) { - let a = typeof n == "function" ? n(e) : De(e), o = !!(e?.id || e?.filepath); +function Hi({ asset: t, event: n, getCurrentViewUrl: r, onAssetChanged: a }) { + let o = typeof r == "function" ? r(t) : Fe(t), s = !!(t?.id || t?.filepath); return [ - Pi(r("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => { - Ii(a) && window.open(a, "_blank", "noopener,noreferrer"); + Ii(R("ctx.openInNewTab", "Open in New Tab"), "pi pi-external-link", null, async () => { + Ri(o) && window.open(o, "_blank", "noopener,noreferrer"); }), - Pi(r("ctx.copyPath", "Copy path"), "pi pi-copy", ki.COPY_PATH, async () => { - let t = e?.filepath ? String(e.filepath) : ""; - if (!t) { - s(r("toast.noFilePath"), "error"); + Ii(R("ctx.copyPath", "Copy path"), "pi pi-copy", ji.COPY_PATH, async () => { + let e = t?.filepath ? String(t.filepath) : ""; + if (!e) { + m(R("toast.noFilePath"), "error"); return; } try { - await navigator.clipboard.writeText(t), s(r("toast.pathCopied"), "success", 2e3); + await navigator.clipboard.writeText(e), m(R("toast.pathCopied"), "success", 2e3); } catch (e) { - console.error("[ViewerContextMenu] Copy failed:", e), s(r("toast.pathCopyFailed"), "error"); + console.error("[ViewerContextMenu] Copy failed:", e), m(R("toast.pathCopyFailed"), "error"); } }), - Pi(r("ctx.downloadOriginal", "Download Original"), "pi pi-download", ki.DOWNLOAD, async () => { - if (!e || !e.filepath) return; - let t = ze(e.filepath), n = document.createElement("a"); - n.href = t, n.download = e.filename, document.body.appendChild(n), n.click(), document.body.removeChild(n), s(r("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3); - }, { disabled: !e?.filepath }), - Pi(r("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", ki.OPEN_IN_FOLDER, async () => { - let t = await E(e); - t?.ok ? s(r("toast.openedInFolder"), "info", 2e3) : s(t?.error || r("toast.openFolderFailed"), "error"); - }, { disabled: !(e?.id || e?.filepath) }), - Pi(r("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", ki.ADD_TO_COLLECTION, async () => { + Ii(R("ctx.downloadOriginal", "Download Original"), "pi pi-download", ji.DOWNLOAD, async () => { + if (!t || !t.filepath) return; + let e = ye(t.filepath), n = document.createElement("a"); + n.href = e, n.download = t.filename, document.body.appendChild(n), n.click(), document.body.removeChild(n), m(R("toast.downloadingFile", "Downloading {filename}...", { filename: t.filename }), "info", 3e3); + }, { disabled: !t?.filepath }), + Ii(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", ji.OPEN_IN_FOLDER, async () => { + let n = await e(t); + n?.ok ? m(R("toast.openedInFolder"), "info", 2e3) : m(n?.error || R("toast.openFolderFailed"), "error"); + }, { disabled: !(t?.id || t?.filepath) }), + Ii(R("ctx.addToCollection", "Add to collection"), "pi pi-bookmark", ji.ADD_TO_COLLECTION, async () => { try { - await ti({ - x: t?.clientX, - y: t?.clientY, - assets: [e] + await ni({ + x: n?.clientX, + y: n?.clientY, + assets: [t] }); } catch (e) { console.error("[ViewerContextMenu] Add to collection failed:", e); } }), - Fi(), - Pi(r("ctx.editTags", "Edit tags"), "pi pi-tags", ki.EDIT_TAGS, async () => { - Ei({ - x: (Number(t?.clientX) || 0) + 6, - y: (Number(t?.clientY) || 0) + 6, - asset: e, - onChanged: ((...t) => { - let n = t[0]; - e.tags = n, ht(Kt, { - assetId: String(e.id), + Li(), + Ii(R("ctx.editTags", "Edit tags"), "pi pi-tags", ji.EDIT_TAGS, async () => { + Oi({ + x: (Number(n?.clientX) || 0) + 6, + y: (Number(n?.clientY) || 0) + 6, + asset: t, + onChanged: ((...e) => { + let n = e[0]; + t.tags = n, kt(Xt, { + assetId: String(t.id), tags: n }, { warnPrefix: "[ViewerContextMenu]" }); try { - i?.(); + a?.(); } catch (e) { console.debug?.(e); } }) }); }, { closeOnSelect: !1 }), - Fi(), - Pi(r("ctx.setRating", "Set rating"), "pi pi-star", `${ki.RATING_SUBMENU} >`, null, { - disabled: !o, + Li(), + Ii(R("ctx.setRating", "Set rating"), "pi pi-star", `${ji.RATING_SUBMENU} >`, null, { + disabled: !s, closeOnSelect: !1, - submenu: zi(e, i, o) + submenu: Vi(t, a, s) }), - Pi(r("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => { - if (e?.id) try { - let t = await j(e.id, { refresh: !0 }); - if (!t?.ok || !t?.data) { - s(t?.error || r("toast.metadataRefreshFailed", "Failed to refresh metadata."), "error"); + Ii(R("ctx.refreshMetadata", "Refresh metadata"), "pi pi-sync", "R", async () => { + if (t?.id) try { + let e = await te(t.id, { refresh: !0 }); + if (!e?.ok || !e?.data) { + m(e?.error || R("toast.metadataRefreshFailed", "Failed to refresh metadata."), "error"); return; } - let n = t.data; + let n = e.data; try { - ht(Gt, { - assetId: String(e.id), + kt(Yt, { + assetId: String(t.id), info: n }, { warnPrefix: "[ViewerContextMenu]" }); } catch (e) { console.debug?.(e); } - let i = [], a = Ri(n?.size_bytes); - a && i.push(a), n?.mime && i.push(n.mime), s(r("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: i.length ? ` (${i.join(", ")})` : "" }), "success", 3e3); + let r = [], i = Bi(n?.size_bytes); + i && r.push(i), n?.mime && r.push(n.mime), m(R("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: r.length ? ` (${r.join(", ")})` : "" }), "success", 3e3); } catch (e) { - at(e, "[ViewerContextMenu] Metadata refresh", { showToast: !0 }); + st(e, "[ViewerContextMenu] Metadata refresh", { showToast: !0 }); } - }, { disabled: !e?.id }), - Fi(), - Pi(r("ctx.rename", "Rename"), "pi pi-pencil", ki.RENAME, async () => { - if (!(e?.id || e?.filepath)) return; - let t = e.filename || "", n = ci(await Lt(r("dialog.rename.title", "Rename file"), t), t); - if (!n || n === t) return; - let a = ai(n); - if (!a.valid) { - s(a.reason, "error"); + }, { disabled: !t?.id }), + Li(), + Ii(R("ctx.rename", "Rename"), "pi pi-pencil", ji.RENAME, async () => { + if (!(t?.id || t?.filepath)) return; + let e = t.filename || "", n = li(await gt(R("dialog.rename.title", "Rename file"), e), e); + if (!n || n === e) return; + let r = oi(n); + if (!r.valid) { + m(r.reason, "error"); return; } try { - let t = await v(e, n); - if (t?.ok) { - let a = t?.data?.asset; - a && typeof a == "object" ? Object.assign(e, a) : (e.filename = n, e.filepath = e.filepath.replace(/[^\\/]+$/, n), e.path &&= String(e.path).replace(/[^\\/]+$/, n), e.file_info && typeof e.file_info == "object" && (e.file_info.filename = n, e.file_info.filepath && (e.file_info.filepath = String(e.file_info.filepath).replace(/[^\\/]+$/, n)), e.file_info.path && (e.file_info.path = String(e.file_info.path).replace(/[^\\/]+$/, n)))), s(r("toast.fileRenamedSuccess"), "success"); + let e = await i(t, n); + if (e?.ok) { + let r = e?.data?.asset; + r && typeof r == "object" ? Object.assign(t, r) : (t.filename = n, t.filepath = t.filepath.replace(/[^\\/]+$/, n), t.path &&= String(t.path).replace(/[^\\/]+$/, n), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = n, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, n)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, n)))), m(R("toast.fileRenamedSuccess"), "success"); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "viewer-rename" } })); } catch (e) { console.debug?.(e); } - i?.(); - } else s(t?.error || r("toast.fileRenameFailed"), "error"); + a?.(); + } else m(e?.error || R("toast.fileRenameFailed"), "error"); } catch (e) { - s(r("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); + m(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); } - }, { disabled: !(e?.id || e?.filepath) }), - Pi(r("ctx.delete", "Delete"), "pi pi-trash", ki.DELETE, async () => { - if ((e?.id || e?.filepath) && await ni(1, e?.filename)) try { - let t = await x(e); - t?.ok ? (s(r("toast.fileDeletedSuccess"), "success"), i?.()) : s(t?.error || r("toast.fileDeleteFailed"), "error"); + }, { disabled: !(t?.id || t?.filepath) }), + Ii(R("ctx.delete", "Delete"), "pi pi-trash", ji.DELETE, async () => { + if ((t?.id || t?.filepath) && await ri(1, t?.filename)) try { + let e = await w(t); + e?.ok ? (m(R("toast.fileDeletedSuccess"), "success"), a?.()) : m(e?.error || R("toast.fileDeleteFailed"), "error"); } catch (e) { - s(r("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); + m(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); } - }, { disabled: !(e?.id || e?.filepath) }) + }, { disabled: !(t?.id || t?.filepath) }) ]; } -function Vi({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetChanged: r } = {}) { +function Ui({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetChanged: r } = {}) { if (!e || typeof t != "function") return; - let i = ji.get(e); + let i = Ni.get(e); if (typeof i?.unbind == "function") return i.unbind; let a = async (i) => { if (!e.contains(i.target)) return; i.preventDefault(), i.stopPropagation(); let a = t(); - a && Si({ + a && wi({ x: i.clientX, y: i.clientY, - items: Bi({ + items: Hi({ asset: a, event: i, getCurrentViewUrl: n, @@ -1085,23 +1086,23 @@ function Vi({ overlayEl: e, getCurrentAsset: t, getCurrentViewUrl: n, onAssetCha console.debug?.(e); } try { - pi(); + mi(); let e = globalThis?._ratingDebounceTimers; e && typeof e.clear == "function" && e.clear(); } catch (e) { console.debug?.(e); } try { - Oi(); + Ai(); } catch (e) { console.debug?.(e); } - ji.delete(e); + Ni.delete(e); }; - return ji.set(e, { unbind: o }), o; + return Ni.set(e, { unbind: o }), o; } -function Hi(e) { - let t = e ? ji.get(e) : null; +function Wi(e) { + let t = e ? Ni.get(e) : null; try { t?.unbind?.(); } catch (e) { @@ -1110,10 +1111,10 @@ function Hi(e) { } //#endregion //#region ui/features/viewer/ViewerState.ts -var Ui = "mjr_viewer_prefs_v1"; -function Wi() { +var Gi = "mjr_viewer_prefs_v1"; +function Ki() { try { - let e = w.get(Ui); + let e = Re.get(Gi); if (!e) return {}; let t = JSON.parse(e); return t && typeof t == "object" ? t : {}; @@ -1121,7 +1122,7 @@ function Wi() { return {}; } } -function Gi(e) { +function qi(e) { try { if (!e) return; let t = { @@ -1133,14 +1134,14 @@ function Gi(e) { audioVisualizerMode: String(e.audioVisualizerMode || "artistic"), abWipePercent: Number.isFinite(Number(e._abWipePercent)) ? Number(e._abWipePercent) : 50 }; - w.set(Ui, JSON.stringify(t)); + Re.set(Gi, JSON.stringify(t)); } catch (e) { console.debug?.(e); } } //#endregion //#region ui/features/viewer/lifecycle.ts -function Ki(e) { +function Ji(e) { if (e) { try { e._mjrSyncAbort?.abort?.(); @@ -1213,7 +1214,7 @@ function Ki(e) { } } } -function qi(e) { +function Yi(e) { let t = []; try { e._mjrViewerUnsubs = t; @@ -1222,9 +1223,9 @@ function qi(e) { } let n = { unsubs: t, - safeAddListener: z, - safeCall: R, - destroyMediaProcessorsIn: Ki, + safeAddListener: wt, + safeCall: V, + destroyMediaProcessorsIn: Ji, _observer: null, disposeAll: () => { try { @@ -1233,7 +1234,7 @@ function qi(e) { console.debug?.(e); } try { - for (let e of t) R(e); + for (let e of t) V(e); } catch (e) { console.debug?.(e); } @@ -1254,7 +1255,7 @@ function qi(e) { } catch (e) { console.debug?.(e); } - R(() => n.disposeAll?.(), "lifecycle:autoDispose"); + V(() => n.disposeAll?.(), "lifecycle:autoDispose"); } } catch (e) { console.debug?.(e); @@ -1274,7 +1275,7 @@ function qi(e) { } //#endregion //#region ui/components/buttons.ts -function Ji(e, t) { +function Xi(e, t) { let n = document.createElement("button"); n.textContent = e, n.title = t || ""; try { @@ -1288,7 +1289,7 @@ function Ji(e, t) { n.disabled || (n.style.background = "transparent"); }, n; } -function Yi(e, t) { +function Zi(e, t) { let n = document.createElement("button"); n.textContent = e, n.dataset.mode = t; try { @@ -1300,8 +1301,8 @@ function Yi(e, t) { } //#endregion //#region ui/features/viewer/toolbarControls.ts -function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged: i, onExportFrame: a, onCopyFrame: o, onAudioVizModeChanged: s, getCanAB: c } = {}) { - let l = { +function Qi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged: r, onExportFrame: i, onCopyFrame: a, onAudioVizModeChanged: o, getCanAB: s } = {}) { + let c = { channel: "rgb", exposureEV: 0, gamma: 1, @@ -1318,11 +1319,11 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged genInfoOpen: !0, abCompareMode: "wipe", audioVisualizerMode: "artistic" - }, u = document.createElement("div"); - u.className = "mjr-viewer-tools", u.style.cssText = "\n display: block;\n padding: 8px 8px 6px;\n border-top: 0.8px solid rgba(196, 202, 210, 0.16);\n background: rgba(12, 14, 19, 0.22);\n "; - let d = document.createElement("div"); - d.className = "mjr-viewer-tools-deck", d.style.cssText = "display:flex; flex-wrap:nowrap; gap:8px; align-items:center; min-width:0; overflow-x:auto; overflow-y:hidden;"; - let f = ({ key: e, eyebrow: t, title: n } = {}) => { + }, l = document.createElement("div"); + l.className = "mjr-viewer-tools", l.style.cssText = "\n display: block;\n padding: 8px 8px 6px;\n border-top: 0.8px solid rgba(196, 202, 210, 0.16);\n background: rgba(12, 14, 19, 0.22);\n "; + let u = document.createElement("div"); + u.className = "mjr-viewer-tools-deck", u.style.cssText = "display:flex; flex-wrap:nowrap; gap:8px; align-items:center; min-width:0; overflow-x:auto; overflow-y:hidden;"; + let d = ({ key: e, eyebrow: t, title: n } = {}) => { let r = document.createElement("section"); r.className = "mjr-viewer-tools-panel", e && (r.dataset.panel = String(e)), r.style.cssText = "display:flex; flex-direction:column; gap:4px; min-width:0; padding:5px 6px; border-radius:10px; border:1px solid rgba(255,255,255,0.08); background:linear-gradient(180deg, rgba(255,255,255,0.045), rgba(255,255,255,0.02)); box-shadow:inset 0 1px 0 rgba(255,255,255,0.04); flex:0 0 auto;"; let i = document.createElement("div"); @@ -1342,38 +1343,38 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged eyebrowEl: o, titleEl: s }; - }, p = f({ + }, f = d({ key: "grade", eyebrow: "Image", title: "Adjustments" - }), m = f({ + }), p = d({ key: "overlay", eyebrow: "Viewer", title: "Guides & Compare" - }), h = f({ + }), m = d({ key: "inspect", eyebrow: "Inspect", title: "Probe" - }), g = f({ + }), h = d({ key: "actions", eyebrow: "Actions", title: "Reset & Export" - }), _ = f({ + }), g = d({ key: "info", eyebrow: "Infos", title: "Help" - }), v = document.createElement("div"); - v.className = "mjr-viewer-tools-actions", v.style.cssText = "display:flex; align-items:center; justify-content:flex-start; gap:6px; flex-wrap:wrap; min-width:0;"; - let y = document.createElement("div"); - y.className = "mjr-viewer-tools-meta", y.style.cssText = "display:flex; align-items:center; justify-content:flex-start; gap:6px; flex-wrap:nowrap; min-width:0;"; - let b = ({ key: e, label: t, accentRgb: n } = {}) => { + }), _ = document.createElement("div"); + _.className = "mjr-viewer-tools-actions", _.style.cssText = "display:flex; align-items:center; justify-content:flex-start; gap:6px; flex-wrap:wrap; min-width:0;"; + let v = document.createElement("div"); + v.className = "mjr-viewer-tools-meta", v.style.cssText = "display:flex; align-items:center; justify-content:flex-start; gap:6px; flex-wrap:nowrap; min-width:0;"; + let y = ({ key: e, label: t, accentRgb: n } = {}) => { let r = document.createElement("div"); if (r.className = "mjr-viewer-tools-group", e && (r.dataset.group = String(e)), n && r.style.setProperty("--mjr-group-accent", String(n)), r.style.cssText = "display:flex; align-items:center; gap:6px; padding:2px 6px; border-radius:8px; border:1px solid rgba(196,202,210,0.14); background:rgba(10,12,16,0.22);", t) { let e = document.createElement("span"); e.className = "mjr-viewer-tools-group-label", e.textContent = t, e.style.cssText = "font-size: 10px; color: rgba(255,255,255,0.7);", r.appendChild(e); } return r; - }, x = (e, t) => { + }, b = (e, t) => { let n = document.createElement("select"); n.title = e || "", n.className = "mjr-viewer-tools-select", n.style.cssText = "\n height: 24px;\n padding: 0 6px;\n border-radius: 6px;\n border: 0.8px solid rgba(196, 202, 210, 0.24);\n background: linear-gradient(180deg, rgba(210, 214, 220, 0.06), rgba(210, 214, 220, 0.02));\n color: rgba(230,233,238,0.92);\n font-size: 11px;\n outline: none;\n "; for (let e of t || []) { @@ -1381,7 +1382,7 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged t.value = String(e.value), t.textContent = String(e.label), n.appendChild(t); } return n; - }, S = (e, { min: t, max: n, step: r, value: i }) => { + }, x = (e, { min: t, max: n, step: r, value: i }) => { let a = document.createElement("div"); a.className = "mjr-viewer-tools-range", a.style.cssText = "display:flex; align-items:center; gap:6px;"; let o = document.createElement("input"); @@ -1392,7 +1393,7 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged input: o, out: s }; - }, C = (e, t, { iconClass: n = null, accentRgb: r = null } = {}) => { + }, S = (e, t, { iconClass: n = null, accentRgb: r = null } = {}) => { let i = document.createElement("button"); if (i.type = "button", i.className = "mjr-viewer-tool-btn", i.setAttribute("aria-label", t || e || "Toggle"), i.setAttribute("aria-pressed", "false"), r) try { i.dataset.accentRgb = String(r); @@ -1421,7 +1422,7 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged b: i, setActive: a }; - }, w = x("Channel View", [ + }, C = b("Channel View", [ { value: "rgb", label: "RGB" @@ -1447,18 +1448,18 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Luma" } ]); - w.title = r("tooltip.colorChannels", "View color channels or luminance"); - let T = S("Exposure (EV)", { + C.title = R("tooltip.colorChannels", "View color channels or luminance"); + let w = x("Exposure (EV)", { min: -10, max: 10, step: .1, value: 0 - }), E = S("Gamma", { + }), T = x("Gamma", { min: .1, max: 3, step: .01, value: 1 - }), D = Object.freeze({ + }), E = Object.freeze({ channel: "120, 180, 255", exposure: "255, 200, 70", gamma: "190, 150, 255", @@ -1470,15 +1471,15 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged compare: "90, 220, 220", geninfo: "200, 170, 255", audioviz: "255, 150, 80" - }), O = Object.freeze({ + }), D = Object.freeze({ borderColor: "rgba(255,255,255,0.14)", background: "rgba(255,255,255,0.08)", boxShadow: "" - }), k = (e, { accentRgb: t, active: n, title: r } = {}) => { + }), O = (e, { accentRgb: t, active: n, title: r } = {}) => { try { if (!e) return; if (r && (e.title = String(r)), !n) { - e.style.borderColor = O.borderColor, e.style.background = O.background, e.style.boxShadow = O.boxShadow; + e.style.borderColor = D.borderColor, e.style.background = D.background, e.style.boxShadow = D.boxShadow; return; } let i = String(t || "").trim(); @@ -1487,38 +1488,38 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged } catch (e) { console.debug?.(e); } - }, A = (e) => { + }, k = (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); } - }, j = (e, { accentRgb: t, active: n } = {}) => { + }, A = (e, { accentRgb: t, active: n } = {}) => { try { if (!e) return; if (!n) { @@ -1531,7 +1532,7 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged } catch (e) { console.debug?.(e); } - }, M = (e, { accentRgb: t, active: n } = {}) => { + }, j = (e, { accentRgb: t, active: n } = {}) => { try { if (!e) return; if (!n) { @@ -1544,13 +1545,13 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged } catch (e) { console.debug?.(e); } - }, N = C("Zebra", "Zebra Highlights (Z)", { + }, M = S("Zebra", "Zebra Highlights (Z)", { iconClass: "pi-bars", - accentRgb: D.zebra - }), P = C("Scopes", "Scopes overlay", { + accentRgb: E.zebra + }), N = S("Scopes", "Scopes overlay", { iconClass: "pi-chart-bar", - accentRgb: D.analysis - }), F = x("Scopes", [ + accentRgb: E.analysis + }), P = b("Scopes", [ { value: "off", label: "Off" @@ -1568,11 +1569,11 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Both" } ]); - F.title = r("tooltip.scopesHistogram", "Show histogram/waveform scopes"); - let ee = C("Grid", "Grid (G)", { + P.title = R("tooltip.scopesHistogram", "Show histogram/waveform scopes"); + let F = S("Grid", "Grid (G)", { iconClass: "pi-th-large", - accentRgb: D.overlay - }), te = x("Grid Overlay", [ + accentRgb: E.overlay + }), I = b("Grid Overlay", [ { value: 0, label: "Off" @@ -1594,11 +1595,11 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Golden" } ]); - te.title = $t(r("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G"); - let ne = C("Mask", "Format mask (dim outside)", { + I.title = $t(R("tooltip.gridOverlay", "Grid overlay (rule of thirds, center)"), "G"); + let ee = S("Mask", "Format mask (dim outside)", { iconClass: "pi-stop", - accentRgb: D.overlay - }), re = x("Format", [ + accentRgb: E.overlay + }), te = b("Format", [ { value: "image", label: "Image" @@ -1624,28 +1625,28 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "9:16" } ]); - re.title = r("tooltip.aspectRatioMask", "Aspect ratio overlay mask"); - let ie = S("Mask Opacity", { + te.title = R("tooltip.aspectRatioMask", "Aspect ratio overlay mask"); + let ne = x("Mask Opacity", { min: 0, max: .9, step: .05, value: .65 - }), ae = C("Probe", "Pixel Probe (I)", { + }), re = S("Probe", "Pixel Probe (I)", { iconClass: "pi-eye", - accentRgb: D.probe - }), oe = C("Loupe", "Loupe (L)", { + accentRgb: E.probe + }), ie = S("Loupe", "Loupe (L)", { iconClass: "pi-search-plus", - accentRgb: D.loupe - }), se = C("HUD", "Viewer HUD", { + accentRgb: E.loupe + }), ae = S("HUD", "Viewer HUD", { iconClass: "pi-info-circle", - accentRgb: D.overlay - }), ce = C("Focus", "Distraction-free mode (X)", { + accentRgb: E.overlay + }), oe = S("Focus", "Distraction-free mode (X)", { iconClass: "pi-window-maximize", - accentRgb: D.overlay - }), le = C("Gen", $t("Generation info (prompt/model)", "D"), { + accentRgb: E.overlay + }), se = S("Gen", $t("Generation info (prompt/model)", "D"), { iconClass: "pi-book", - accentRgb: D.geninfo - }), ue = x("A/B Compare Mode", [ + accentRgb: E.geninfo + }), ce = b("A/B Compare Mode", [ { value: "wipe", label: "Wipe (H)" @@ -1679,147 +1680,147 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged label: "Screen" } ]); - ue.title = r("tooltip.compareBlendMode", "Compare blend mode"); - let de = x("Audio Visualizer", [{ + ce.title = R("tooltip.compareBlendMode", "Compare blend mode"); + let le = b("Audio Visualizer", [{ value: "simple", label: "Simple" }, { value: "artistic", label: "Artistic" }]); - de.title = r("tooltip.audioVisualizer", "Audio visualizer mode"); - let fe = Ji("Reset", r("tooltip.resetPlayerControls", "Reset all viewer controls")); - fe.style.height = "26px", fe.style.fontSize = "11px", fe.style.padding = "0 8px", fe.classList?.add?.("mjr-viewer-tool-btn", "mjr-viewer-tool-btn--reset"), fe.classList?.add?.("mjr-viewer-tools-action", "mjr-viewer-tools-action--primary"), fe.style.marginLeft = "auto"; + le.title = R("tooltip.audioVisualizer", "Audio visualizer mode"); + let ue = Xi("Reset", R("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 = R("tooltip.exportFrame", "Save current frame as PNG"), de.setAttribute("aria-label", R("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 fe = document.createElement("span"); + fe.className = "pi pi-download", fe.setAttribute("aria-hidden", "true"), fe.style.fontSize = "14px", de.appendChild(fe), de.classList?.add?.("mjr-viewer-tools-action"); + try { + de.style.display = "none"; + } catch (e) { + console.debug?.(e); + } let pe = document.createElement("button"); - pe.type = "button", pe.title = r("tooltip.exportFrame", "Save current frame as PNG"), pe.setAttribute("aria-label", r("tooltip.exportFrame", "Save frame as PNG")), pe.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", pe.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; - let me = document.createElement("span"); - me.className = "pi pi-download", me.setAttribute("aria-hidden", "true"), me.style.fontSize = "14px", pe.appendChild(me), pe.classList?.add?.("mjr-viewer-tools-action"); + pe.type = "button", pe.title = R("tooltip.copyFrame", "Copy current frame to clipboard"), pe.setAttribute("aria-label", R("tooltip.copyFrame", "Copy frame to clipboard")), pe.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", pe.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; + let L = document.createElement("span"); + L.className = "pi pi-copy", L.setAttribute("aria-hidden", "true"), L.style.fontSize = "14px", pe.appendChild(L), pe.classList?.add?.("mjr-viewer-tools-action"); try { pe.style.display = "none"; } catch (e) { console.debug?.(e); } - let he = document.createElement("button"); - he.type = "button", he.title = r("tooltip.copyFrame", "Copy current frame to clipboard"), he.setAttribute("aria-label", r("tooltip.copyFrame", "Copy frame to clipboard")), he.className = "mjr-viewer-tool-btn mjr-viewer-tool-btn--reset", he.style.cssText = "height:24px; padding:0 8px; display:inline-flex; align-items:center; justify-content:center;"; - let ge = document.createElement("span"); - ge.className = "pi pi-copy", ge.setAttribute("aria-hidden", "true"), ge.style.fontSize = "14px", he.appendChild(ge), he.classList?.add?.("mjr-viewer-tools-action"); - try { - he.style.display = "none"; - } catch (e) { - console.debug?.(e); - } - let _e = b({ + let me = y({ key: "channel", label: "Channel", - accentRgb: D.channel + accentRgb: E.channel }); - _e.appendChild(w), p.body.appendChild(_e); - let ve = b({ + me.appendChild(C), f.body.appendChild(me); + let he = y({ key: "exposure", label: "EV", - accentRgb: D.exposure + accentRgb: E.exposure }); - ve.appendChild(T.wrap), p.body.appendChild(ve); - let ye = b({ + he.appendChild(w.wrap), f.body.appendChild(he); + let ge = y({ key: "gamma", label: "Gamma", - accentRgb: D.gamma + accentRgb: E.gamma }); - ye.appendChild(E.wrap), p.body.appendChild(ye); - let be = () => { + ge.appendChild(T.wrap), f.body.appendChild(ge); + let _e = () => { try { t.exposureEV = 0; } catch (e) { console.debug?.(e); } try { - T.input.value = "0", T.out.textContent = "0.0EV"; + w.input.value = "0", w.out.textContent = "0.0EV"; } catch (e) { console.debug?.(e); } - R(n); - }, xe = () => { + V(n); + }, ve = () => { try { t.gamma = 1; } catch (e) { console.debug?.(e); } try { - E.input.value = "1", E.out.textContent = "1.00"; + T.input.value = "1", T.out.textContent = "1.00"; } catch (e) { console.debug?.(e); } - R(n); - }, Se = () => { + V(n); + }, ye = () => { try { - Object.assign(t, l); + Object.assign(t, c); } catch (e) { console.debug?.(e); } - R(i), R(s), R(n); + V(r), V(o), V(n); }; try { - let e = ve.querySelector?.(".mjr-viewer-tools-group-label"); - e && (e.title = r("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none"); + let e = he.querySelector?.(".mjr-viewer-tools-group-label"); + e && (e.title = R("tooltip.resetExposure", "Reset EV to 0"), e.style.cursor = "pointer", e.style.userSelect = "none"); } catch (e) { console.debug?.(e); } try { - T.out.title = r("tooltip.resetExposure", "Reset EV to 0"), T.out.style.cursor = "pointer", T.out.style.userSelect = "none"; + w.out.title = R("tooltip.resetExposure", "Reset EV to 0"), w.out.style.cursor = "pointer", w.out.style.userSelect = "none"; } catch (e) { console.debug?.(e); } try { - let e = ye.querySelector?.(".mjr-viewer-tools-group-label"); - e && (e.title = r("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none"); + let e = ge.querySelector?.(".mjr-viewer-tools-group-label"); + e && (e.title = R("tooltip.resetGamma", "Reset Gamma to 1.00"), e.style.cursor = "pointer", e.style.userSelect = "none"); } catch (e) { console.debug?.(e); } try { - E.out.title = r("tooltip.resetGamma", "Reset Gamma to 1.00"), E.out.style.cursor = "pointer", E.out.style.userSelect = "none"; + T.out.title = R("tooltip.resetGamma", "Reset Gamma to 1.00"), T.out.style.cursor = "pointer", T.out.style.userSelect = "none"; } catch (e) { console.debug?.(e); } - let Ce = b({ + let be = y({ key: "analysis", label: "Analysis", - accentRgb: D.analysis + accentRgb: E.analysis }); - Ce.appendChild(N.b), Ce.appendChild(P.b), Ce.appendChild(F), p.body.appendChild(Ce); - let we = b({ + be.appendChild(M.b), be.appendChild(N.b), be.appendChild(P), f.body.appendChild(be); + let xe = y({ key: "overlay-guides", label: "Guides", - accentRgb: D.overlay + accentRgb: E.overlay }); - we.appendChild(ee.b), we.appendChild(te), we.appendChild(ne.b), we.appendChild(re), we.appendChild(ie.wrap), m.body.appendChild(we); - let Te = b({ + xe.appendChild(F.b), xe.appendChild(I), xe.appendChild(ee.b), xe.appendChild(te), xe.appendChild(ne.wrap), p.body.appendChild(xe); + let Se = y({ key: "overlay-inspect", label: "Inspect", - accentRgb: D.overlay + accentRgb: E.overlay }); [ + re.b, + ie.b, ae.b, oe.b, - se.b, - ce.b, - le.b + se.b ].forEach((e, t) => { - t > 0 && (e.style.marginLeft = "4px"), Te.appendChild(e); - }), h.body.appendChild(Te); - let Ee = b({ + t > 0 && (e.style.marginLeft = "4px"), Se.appendChild(e); + }), m.body.appendChild(Se); + let Ce = y({ key: "compare", label: "Compare", - accentRgb: D.compare + accentRgb: E.compare }); - Ee.style.borderRadius = "8px", Ee.style.padding = "4px 6px", Ee.style.border = "1px solid transparent", Ee.style.transition = "background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease", Ee.appendChild(ue), m.body.appendChild(Ee); - let De = b({ + Ce.style.borderRadius = "8px", Ce.style.padding = "4px 6px", Ce.style.border = "1px solid transparent", Ce.style.transition = "background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease", Ce.appendChild(ce), p.body.appendChild(Ce); + let we = y({ key: "audio-viz", label: "Audio Viz", - accentRgb: D.audioviz + accentRgb: E.audioviz }); - De.appendChild(de), m.body.appendChild(De), v.appendChild(fe), v.appendChild(pe), v.appendChild(he); - let Oe = document.createElement("div"); - Oe.className = "mjr-viewer-tools-group mjr-viewer-tools-group--3d", Oe.textContent = "LMB rotate · RMB pan · Scroll zoom", Oe.style.cssText = [ + we.appendChild(le), p.body.appendChild(we), _.appendChild(ue), _.appendChild(de), _.appendChild(pe); + let Te = document.createElement("div"); + Te.className = "mjr-viewer-tools-group mjr-viewer-tools-group--3d", Te.textContent = "LMB rotate · RMB pan · Scroll zoom", Te.style.cssText = [ "display:none", "align-items:center", "padding:2px 8px", @@ -1830,15 +1831,15 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged "font-size:10px", "font-weight:400", "letter-spacing:0.01em" - ].join(";"), y.appendChild(Oe); + ].join(";"), v.appendChild(Te); + let Ee = document.createElement("div"); + Ee.style.cssText = "position: relative; display:inline-flex; align-items:center;", Ee.className = "mjr-viewer-tools-action", Ee.style.marginLeft = "4px"; + let De = document.createElement("button"); + De.type = "button", De.title = R("tooltip.viewerShortcuts", "Viewer shortcuts"), De.setAttribute("aria-label", R("tooltip.viewerShortcuts", "Viewer shortcuts")), De.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 Oe = document.createElement("span"); + Oe.className = "pi pi-question-circle", Oe.setAttribute("aria-hidden", "true"), Oe.style.fontSize = "14px", De.appendChild(Oe); let ke = document.createElement("div"); - ke.style.cssText = "position: relative; display:inline-flex; align-items:center;", ke.className = "mjr-viewer-tools-action", ke.style.marginLeft = "4px"; - let Ae = document.createElement("button"); - Ae.type = "button", Ae.title = r("tooltip.viewerShortcuts", "Viewer shortcuts"), Ae.setAttribute("aria-label", r("tooltip.viewerShortcuts", "Viewer shortcuts")), Ae.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 je = document.createElement("span"); - je.className = "pi pi-question-circle", je.setAttribute("aria-hidden", "true"), je.style.fontSize = "14px", Ae.appendChild(je); - let Me = document.createElement("div"); - Me.className = "mjr-viewer-help", Me.style.cssText = "\n position: absolute;\n right: 0;\n top: 32px;\n min-width: 260px;\n max-width: 360px;\n padding: 10px 12px;\n border-radius: 8px;\n background: rgba(0,0,0,0.88);\n border: 1px solid rgba(255,255,255,0.16);\n color: rgba(255,255,255,0.92);\n font-size: 12px;\n line-height: 1.4;\n box-shadow: 0 8px 24px rgba(0,0,0,0.35);\n display: none;\n z-index: 10002;\n "; + ke.className = "mjr-viewer-help", ke.style.cssText = "\n position: absolute;\n right: 0;\n top: 32px;\n min-width: 260px;\n max-width: 360px;\n padding: 10px 12px;\n border-radius: 8px;\n background: rgba(0,0,0,0.88);\n border: 1px solid rgba(255,255,255,0.16);\n color: rgba(255,255,255,0.92);\n font-size: 12px;\n line-height: 1.4;\n box-shadow: 0 8px 24px rgba(0,0,0,0.35);\n display: none;\n z-index: 10002;\n "; try { let e = document.createElement("div"); e.textContent = "Shortcuts", e.style.cssText = "font-weight:600; margin-bottom:6px;"; @@ -1848,88 +1849,88 @@ function Xi({ VIEWER_MODES: e, state: t, onToolsChanged: n, onCompareModeChanged let r = document.createElement("div"), i = document.createElement("span"); i.style.cssText = "opacity:.75;", i.textContent = String(e || ""), r.appendChild(i), r.appendChild(document.createTextNode(` ${String(n || "")}`)), t.appendChild(r); }; - n("Esc", "Close"), n("Space", "Play/Pause"), n("+", "Zoom In"), n("-", "Zoom Out"), n("Alt+1", "1:1 Zoom"), n("G", "Grid"), n("D", "Gen Info"), n("Z", "Zebra"), n("I", "Probe"), n("L", "Loupe"), n("X", "Focus Mode"), n("C", "Copy Color"), n("[ / ]", "Speed -/+"), n("\\", "Speed 1x"), n("< / >", "Prev/Next"), n("0-5", "Rating"), Me.appendChild(e), Me.appendChild(t); + n("Esc", "Close"), n("Space", "Play/Pause"), n("+", "Zoom In"), n("-", "Zoom Out"), n("Alt+1", "1:1 Zoom"), n("G", "Grid"), n("D", "Gen Info"), n("Z", "Zebra"), n("I", "Probe"), n("L", "Loupe"), n("X", "Focus Mode"), n("C", "Copy Color"), n("[ / ]", "Speed -/+"), n("\\", "Speed 1x"), n("< / >", "Prev/Next"), n("0-5", "Rating"), ke.appendChild(e), ke.appendChild(t); } catch (e) { console.debug?.(e); } - return ke.appendChild(Ae), ke.appendChild(Me), y.appendChild(ke), g.body.appendChild(v), _.body.appendChild(y), d.appendChild(p.panel), d.appendChild(m.panel), d.appendChild(h.panel), d.appendChild(g.panel), d.appendChild(_.panel), u.appendChild(d), { - toolsRow: u, - gradePanel: p, - overlayPanel: m, - inspectPanel: h, - actionPanel: g, - infoPanel: _, - toolsActions: v, - toolsMeta: y, - chGroup: _e, - expGroup: ve, - gamGroup: ye, - anaGroup: Ce, - ovGuidesGroup: we, - ovInspectGroup: Te, - cmpGroup: Ee, - audGroup: De, - model3dHint: Oe, - helpWrap: ke, - helpBtn: Ae, - helpPop: Me, - channelsSelect: w, - exposureCtl: T, - gammaCtl: E, - zebraToggle: N, - scopesToggle: P, - scopesSelect: F, - gridToggle: ee, - gridModeSelect: te, - maskToggle: ne, - formatSelect: re, - maskOpacityCtl: ie, - probeToggle: ae, - loupeToggle: oe, - hudToggle: se, - focusToggle: ce, - genInfoToggle: le, - compareModeSelect: ue, - audioVizModeSelect: de, - resetGradeBtn: fe, - exportBtn: pe, - copyBtn: he, - resetExposure: be, - resetGamma: xe, - resetViewerTools: Se, - ACCENT: D, - setSelectHighlighted: k, - setChannelSelectStyle: A, - setValueHighlighted: j, - setGroupHighlighted: M, - DEFAULT_TOOL_STATE: l + return Ee.appendChild(De), Ee.appendChild(ke), v.appendChild(Ee), h.body.appendChild(_), g.body.appendChild(v), u.appendChild(f.panel), u.appendChild(p.panel), u.appendChild(m.panel), u.appendChild(h.panel), u.appendChild(g.panel), l.appendChild(u), { + toolsRow: l, + gradePanel: f, + overlayPanel: p, + inspectPanel: m, + actionPanel: h, + infoPanel: g, + toolsActions: _, + toolsMeta: v, + chGroup: me, + expGroup: he, + gamGroup: ge, + anaGroup: be, + ovGuidesGroup: xe, + ovInspectGroup: Se, + cmpGroup: Ce, + audGroup: we, + model3dHint: Te, + helpWrap: Ee, + helpBtn: De, + helpPop: ke, + channelsSelect: C, + exposureCtl: w, + gammaCtl: T, + zebraToggle: M, + scopesToggle: N, + scopesSelect: P, + gridToggle: F, + gridModeSelect: I, + maskToggle: ee, + formatSelect: te, + maskOpacityCtl: ne, + probeToggle: re, + loupeToggle: ie, + hudToggle: ae, + focusToggle: oe, + genInfoToggle: se, + compareModeSelect: ce, + audioVizModeSelect: le, + resetGradeBtn: ue, + exportBtn: de, + copyBtn: pe, + resetExposure: _e, + resetGamma: ve, + resetViewerTools: ye, + ACCENT: E, + setSelectHighlighted: O, + setChannelSelectStyle: k, + setValueHighlighted: A, + setGroupHighlighted: j, + DEFAULT_TOOL_STATE: c }; } //#endregion //#region ui/features/viewer/toolbarActions.ts -function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToolsChanged: a, onCompareModeChanged: o, onAudioVizModeChanged: s, onExportFrame: c, onCopyFrame: l, singleBtn: u, abBtn: d, sideBtn: f, closeBtn: p, channelsSelect: m, compareModeSelect: h, audioVizModeSelect: g, exposureCtl: _, gammaCtl: v, zebraToggle: y, scopesToggle: b, scopesSelect: x, gridToggle: S, gridModeSelect: C, maskToggle: w, formatSelect: T, maskOpacityCtl: E, probeToggle: D, loupeToggle: O, hudToggle: k, focusToggle: A, genInfoToggle: j, resetGradeBtn: M, exportBtn: N, copyBtn: P, resetExposure: F, resetGamma: ee, resetViewerTools: te, expGroup: ne, gamGroup: re }) { - e.push(z(u, "click", () => r?.(n.SINGLE))), e.push(z(d, "click", () => r?.(n.AB_COMPARE))), e.push(z(f, "click", () => r?.(n.SIDE_BY_SIDE))), e.push(z(p, "click", () => i?.())), e.push(z(m, "change", () => { +function $i({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToolsChanged: a, onCompareModeChanged: o, onAudioVizModeChanged: s, onExportFrame: c, onCopyFrame: l, singleBtn: u, abBtn: d, sideBtn: f, closeBtn: p, channelsSelect: m, compareModeSelect: h, audioVizModeSelect: g, exposureCtl: _, gammaCtl: v, zebraToggle: y, scopesToggle: b, scopesSelect: x, gridToggle: S, gridModeSelect: C, maskToggle: w, formatSelect: T, maskOpacityCtl: E, probeToggle: D, loupeToggle: O, hudToggle: k, focusToggle: A, genInfoToggle: j, resetGradeBtn: M, exportBtn: N, copyBtn: P, resetExposure: F, resetGamma: I, resetViewerTools: ee, expGroup: te, gamGroup: ne }) { + e.push(wt(u, "click", () => r?.(n.SINGLE))), e.push(wt(d, "click", () => r?.(n.AB_COMPARE))), e.push(wt(f, "click", () => r?.(n.SIDE_BY_SIDE))), e.push(wt(p, "click", () => i?.())), e.push(wt(m, "change", () => { try { t.channel = String(m.value || "rgb"); } catch (e) { console.debug?.(e); } - R(a); - })), e.push(z(h, "change", () => { + V(a); + })), e.push(wt(h, "change", () => { try { t.abCompareMode = String(h.value || "wipe"); } catch (e) { console.debug?.(e); } - R(o), R(a); - })), e.push(z(g, "change", () => { + V(o), V(a); + })), e.push(wt(g, "change", () => { try { t.audioVisualizerMode = String(g.value || "artistic"); } catch (e) { console.debug?.(e); } - R(s), R(a); - })), e.push(z(_.input, "input", () => { + V(s), V(a); + })), e.push(wt(_.input, "input", () => { let e = Math.max(-10, Math.min(10, Number(_.input.value) || 0)); t.exposureEV = Math.round(e * 10) / 10; try { @@ -1937,8 +1938,8 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo } catch (e) { console.debug?.(e); } - R(a); - })), e.push(z(_.input, "dblclick", F)), e.push(z(_.out, "click", F)), e.push(z(ne.querySelector?.(".mjr-viewer-tools-group-label"), "click", F)), e.push(z(v.input, "input", () => { + V(a); + })), e.push(wt(_.input, "dblclick", F)), e.push(wt(_.out, "click", F)), e.push(wt(te.querySelector?.(".mjr-viewer-tools-group-label"), "click", F)), e.push(wt(v.input, "input", () => { let e = Math.max(.1, Math.min(3, Number(v.input.value) || 1)); t.gamma = Math.round(e * 100) / 100; try { @@ -1946,10 +1947,10 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo } catch (e) { console.debug?.(e); } - R(a); - })), e.push(z(v.input, "dblclick", ee)), e.push(z(v.out, "click", ee)), e.push(z(re.querySelector?.(".mjr-viewer-tools-group-label"), "click", ee)), e.push(z(y.b, "click", () => { - t.analysisMode = t.analysisMode === "zebra" ? "none" : "zebra", R(a); - })), e.push(z(b.b, "click", () => { + V(a); + })), e.push(wt(v.input, "dblclick", I)), e.push(wt(v.out, "click", I)), e.push(wt(ne.querySelector?.(".mjr-viewer-tools-group-label"), "click", I)), e.push(wt(y.b, "click", () => { + t.analysisMode = t.analysisMode === "zebra" ? "none" : "zebra", V(a); + })), e.push(wt(b.b, "click", () => { try { let e = String(t.scopesMode || "off") === "off" ? "both" : "off"; t.scopesMode = e; @@ -1961,8 +1962,8 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo } catch (e) { console.debug?.(e); } - R(a); - })), e.push(z(x, "change", () => { + V(a); + })), e.push(wt(x, "change", () => { try { t.scopesMode = String(x.value || "off"); } catch { @@ -1972,10 +1973,10 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo console.debug?.(e); } } - R(a); - })), e.push(z(S.b, "click", () => { - t.gridMode = +!Number(t.gridMode), R(a); - })), e.push(z(C, "change", () => { + V(a); + })), e.push(wt(S.b, "click", () => { + t.gridMode = +!Number(t.gridMode), V(a); + })), e.push(wt(C, "change", () => { try { let e = Number(C.value); t.gridMode = Number.isFinite(e) ? e : 0; @@ -1986,15 +1987,15 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo console.debug?.(e); } } - R(a); - })), e.push(z(w.b, "click", () => { + V(a); + })), e.push(wt(w.b, "click", () => { try { t.overlayMaskEnabled = !t.overlayMaskEnabled; } catch (e) { console.debug?.(e); } - R(a); - })), e.push(z(T, "change", () => { + V(a); + })), e.push(wt(T, "change", () => { try { t.overlayFormat = String(T.value || "image"); } catch { @@ -2004,39 +2005,39 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo console.debug?.(e); } } - R(a); - })), e.push(z(E.input, "input", () => { + V(a); + })), e.push(wt(E.input, "input", () => { try { let e = Number(E.input.value); t.overlayMaskOpacity = Math.round(Math.max(0, Math.min(.9, Number.isFinite(e) ? e : .65)) * 100) / 100, E.out.textContent = t.overlayMaskOpacity.toFixed(2); } catch (e) { console.debug?.(e); } - R(a); - })), e.push(z(D.b, "click", () => { - t.probeEnabled = !t.probeEnabled, R(a); - })), e.push(z(O.b, "click", () => { - t.loupeEnabled = !t.loupeEnabled, R(a); - })), e.push(z(k.b, "click", () => { - t.hudEnabled = !t.hudEnabled, R(a); - })), e.push(z(A.b, "click", () => { - t.distractionFree = !t.distractionFree, R(a); - })), e.push(z(j.b, "click", () => { + V(a); + })), e.push(wt(D.b, "click", () => { + t.probeEnabled = !t.probeEnabled, V(a); + })), e.push(wt(O.b, "click", () => { + t.loupeEnabled = !t.loupeEnabled, V(a); + })), e.push(wt(k.b, "click", () => { + t.hudEnabled = !t.hudEnabled, V(a); + })), e.push(wt(A.b, "click", () => { + t.distractionFree = !t.distractionFree, V(a); + })), e.push(wt(j.b, "click", () => { try { t.genInfoOpen = !t.genInfoOpen; } catch (e) { console.debug?.(e); } - R(a); - })), e.push(z(M, "click", () => { - te(); - })), e.push(z(N, "click", () => { + V(a); + })), e.push(wt(M, "click", () => { + ee(); + })), e.push(wt(N, "click", () => { try { c?.(); } catch (e) { console.debug?.(e); } - })), e.push(z(P, "click", () => { + })), e.push(wt(P, "click", () => { try { l?.(); } catch (e) { @@ -2044,13 +2045,13 @@ function Zi({ unsubs: e, state: t, VIEWER_MODES: n, onMode: r, onClose: i, onToo } })); } -function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, chGroup: a, expGroup: o, gamGroup: s, anaGroup: c, gradePanel: l, overlayPanel: u, inspectPanel: d, infoPanel: f, actionPanel: p, ovGuidesGroup: m, ovInspectGroup: h, model3dHint: g, helpWrap: _, channelsSelect: v, compareModeSelect: y, audioVizModeSelect: b, exposureCtl: x, gammaCtl: S, zebraToggle: C, scopesToggle: w, scopesSelect: T, gridToggle: E, gridModeSelect: D, maskToggle: O, formatSelect: k, maskOpacityCtl: A, probeToggle: j, loupeToggle: M, hudToggle: N, focusToggle: P, genInfoToggle: F, exportBtn: ee, copyBtn: te, resetGradeBtn: ne, cmpGroup: re, audGroup: ie, ACCENT: ae, setSelectHighlighted: oe, setChannelSelectStyle: se, setValueHighlighted: ce, setGroupHighlighted: le }) { - let ue = e?.assets?.[e?.currentIndex] || null, de = String(ue?.kind || "").toLowerCase() === "model3d"; +function ea({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, chGroup: a, expGroup: o, gamGroup: s, anaGroup: c, gradePanel: l, overlayPanel: u, inspectPanel: d, infoPanel: f, actionPanel: p, ovGuidesGroup: m, ovInspectGroup: h, model3dHint: g, helpWrap: _, channelsSelect: v, compareModeSelect: y, audioVizModeSelect: b, exposureCtl: x, gammaCtl: S, zebraToggle: C, scopesToggle: w, scopesSelect: T, gridToggle: E, gridModeSelect: D, maskToggle: O, formatSelect: k, maskOpacityCtl: A, probeToggle: j, loupeToggle: M, hudToggle: N, focusToggle: P, genInfoToggle: F, exportBtn: I, copyBtn: ee, resetGradeBtn: te, cmpGroup: ne, audGroup: re, ACCENT: ie, setSelectHighlighted: ae, setChannelSelectStyle: oe, setValueHighlighted: se, setGroupHighlighted: ce }) { + let le = e?.assets?.[e?.currentIndex] || null, ue = String(le?.kind || "").toLowerCase() === "model3d"; try { - let e = de ? "none" : ""; - a.style.display = e, o.style.display = e, s.style.display = e, c.style.display = e, ne.style.display = e, g.style.display = de ? "inline-flex" : "none", l.panel.style.display = de ? "none" : "", u.panel.style.display = de ? "none" : "", f.panel.style.display = "", p.panel.style.display = ""; + let e = ue ? "none" : ""; + a.style.display = e, o.style.display = e, s.style.display = e, c.style.display = e, te.style.display = e, g.style.display = ue ? "inline-flex" : "none", l.panel.style.display = ue ? "none" : "", u.panel.style.display = ue ? "none" : "", f.panel.style.display = "", p.panel.style.display = ""; let t = h.querySelector?.(".mjr-viewer-tools-group-label"); - if (de) { + if (ue) { m.style.display = "none", h.style.display = "", t && (t.style.display = "none"), _.style.display = "none", r.style.padding = "10px 16px", r.style.gap = "6px", i.style.padding = "6px 8px 6px"; for (let e of [ E.b, @@ -2092,10 +2093,10 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch let r = typeof n == "function" ? !!n() : !1, i = e.mode === t.AB_COMPARE && r, a = e.mode === t.SIDE_BY_SIDE, o = i || a; y.disabled = !i; try { - re.dataset.active = o ? "1" : "0", re.style.display = o ? "" : "none", le(re, { - accentRgb: ae.compare, + ne.dataset.active = o ? "1" : "0", ne.style.display = o ? "" : "none", ce(ne, { + accentRgb: ie.compare, active: o - }), re.title = o ? "Compare tools (active)" : "Compare tools"; + }), ne.title = o ? "Compare tools (active)" : "Compare tools"; } catch (e) { console.debug?.(e); } @@ -2103,8 +2104,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch console.debug?.(e); } try { - let t = String(ue?.kind || "") === "audio"; - ie.style.display = t ? "" : "none", b.disabled = !t, b.value = String(e.audioVisualizerMode || "artistic"); + let t = String(le?.kind || "") === "audio"; + re.style.display = t ? "" : "none", b.disabled = !t, b.value = String(e.audioVisualizerMode || "artistic"); } catch (e) { console.debug?.(e); } @@ -2132,10 +2133,10 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch console.debug?.(e); } try { - let e = String(ue?.kind || ""), t = e === "video" || e === "model3d"; - ee.style.display = t ? "" : "none", te.style.display = t ? "" : "none"; + let e = String(le?.kind || ""), t = e === "video" || e === "model3d"; + I.style.display = t ? "" : "none", ee.style.display = t ? "" : "none"; let n = !!(globalThis?.ClipboardItem && navigator?.clipboard?.write); - te.style.display = t && n ? "" : "none"; + ee.style.display = t && n ? "" : "none"; } catch (e) { console.debug?.(e); } @@ -2175,14 +2176,14 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch console.debug?.(e); } try { - se(String(e.channel || "rgb")); + oe(String(e.channel || "rgb")); } catch (e) { console.debug?.(e); } try { let t = Math.round((Number(e.exposureEV) || 0) * 10) / 10; - ce(x.out, { - accentRgb: ae.exposure, + se(x.out, { + accentRgb: ie.exposure, active: Math.abs(t) > 1e-4 }); } catch (e) { @@ -2190,8 +2191,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch } try { let t = Math.round((Number(e.gamma) || 1) * 100) / 100; - ce(S.out, { - accentRgb: ae.gamma, + se(S.out, { + accentRgb: ie.gamma, active: Math.abs(t - 1) > 1e-4 }); } catch (e) { @@ -2199,8 +2200,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch } try { let t = String(e.scopesMode || "off"); - oe(T, { - accentRgb: ae.analysis, + ae(T, { + accentRgb: ie.analysis, active: t !== "off", title: t === "off" ? "Scopes" : "Scopes (active)" }); @@ -2209,8 +2210,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch } try { let t = Number(e.gridMode) || 0; - oe(D, { - accentRgb: ae.overlay, + ae(D, { + accentRgb: ie.overlay, active: t !== 0, title: t === 0 ? "Grid Overlay" : "Grid Overlay (active)" }); @@ -2219,8 +2220,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch } try { let t = String(e.overlayFormat || "image"); - oe(k, { - accentRgb: ae.overlay, + ae(k, { + accentRgb: ie.overlay, active: t !== "image", title: t === "image" ? "Format" : "Format (active)" }); @@ -2229,8 +2230,8 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch } try { let r = typeof n == "function" ? !!n() : !1, i = e.mode === t.AB_COMPARE && r, a = String(e.abCompareMode || "wipe"); - oe(y, { - accentRgb: ae.compare, + ae(y, { + accentRgb: ie.compare, active: i && a !== "wipe", title: i && a !== "wipe" ? "Compare Mode (modified)" : "A/B Compare Mode" }); @@ -2238,9 +2239,9 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch console.debug?.(e); } try { - let t = String(ue?.kind || "") === "audio", n = String(e.audioVisualizerMode || "artistic"); - oe(b, { - accentRgb: ae.audioviz, + let t = String(le?.kind || "") === "audio", n = String(e.audioVisualizerMode || "artistic"); + ae(b, { + accentRgb: ie.audioviz, active: t && n !== "simple", title: "Audio visualizer mode" }); @@ -2249,12 +2250,12 @@ function Qi({ state: e, VIEWER_MODES: t, getCanAB: n, header: r, toolsRow: i, ch } try { let t = !!e.genInfoOpen, n = F?.b; - n && t && (n.style.borderColor = `rgba(${ae.geninfo},0.55)`, n.style.background = `rgba(${ae.geninfo},0.14)`); + n && t && (n.style.borderColor = `rgba(${ie.geninfo},0.55)`, n.style.background = `rgba(${ie.geninfo},0.14)`); } catch (e) { console.debug?.(e); } } -function $i({ state: e, VIEWER_MODES: t, singleBtn: n, abBtn: r, sideBtn: i, canAB: a, canSide: o }) { +function ta({ state: e, VIEWER_MODES: t, singleBtn: n, abBtn: r, sideBtn: i, canAB: a, canSide: o }) { try { let s = !!a?.(), c = !!o?.(); r.disabled = !s, i.disabled = !c, r.style.opacity = r.disabled ? "0.35" : e.mode === t.AB_COMPARE ? "1" : "0.6", i.style.opacity = i.disabled ? "0.35" : e.mode === t.SIDE_BY_SIDE ? "1" : "0.6", n.style.opacity = e.mode === t.SINGLE ? "1" : "0.6", n.style.fontWeight = e.mode === t.SINGLE ? "600" : "400"; @@ -2269,65 +2270,65 @@ function $i({ state: e, VIEWER_MODES: t, singleBtn: n, abBtn: r, sideBtn: i, can } //#endregion //#region ui/features/viewer/toolbar.ts -function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a, _onZoomOut: o, _onZoomReset: s, _onZoomOneToOne: c, onMode: l, onToolsChanged: u, onCompareModeChanged: d, onExportFrame: f, onCopyFrame: p, onAudioVizModeChanged: m, onToggleFullscreen: h, getCanAB: g } = {}) { - let _ = n?.unsubs || [], v = document.createElement("div"); - v.className = "mjr-viewer-header", v.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px 16px;\n background: linear-gradient(170deg, rgba(24, 27, 33, 0.96), rgba(17, 19, 25, 0.97));\n border-bottom: 0.8px solid rgba(196, 202, 210, 0.2);\n color: white;\n box-sizing: border-box;\n "; +function na({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: r, _onZoomIn: i, _onZoomOut: a, _onZoomReset: o, _onZoomOneToOne: s, onMode: c, onToolsChanged: l, onCompareModeChanged: u, onExportFrame: d, onCopyFrame: f, onAudioVizModeChanged: p, onToggleFullscreen: m, getCanAB: h } = {}) { + let g = n?.unsubs || [], _ = document.createElement("div"); + _.className = "mjr-viewer-header", _.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px 16px;\n background: linear-gradient(170deg, rgba(24, 27, 33, 0.96), rgba(17, 19, 25, 0.97));\n border-bottom: 0.8px solid rgba(196, 202, 210, 0.2);\n color: white;\n box-sizing: border-box;\n "; + let v = document.createElement("div"); + v.className = "mjr-viewer-header-top", v.style.cssText = "\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n position: relative;\n padding-right: 84px;\n padding-left: 12px;\n min-width: 0;\n box-sizing: border-box;\n "; let y = document.createElement("div"); - y.className = "mjr-viewer-header-top", y.style.cssText = "\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n position: relative;\n padding-right: 84px;\n padding-left: 12px;\n min-width: 0;\n box-sizing: border-box;\n "; + y.className = "mjr-viewer-header-meta mjr-viewer-header-meta--left", y.style.cssText = "display:flex; align-items:center; gap:10px; min-width:0; overflow:hidden;"; let b = document.createElement("div"); - b.className = "mjr-viewer-header-meta mjr-viewer-header-meta--left", b.style.cssText = "display:flex; align-items:center; gap:10px; min-width:0; overflow:hidden;"; + b.className = "mjr-viewer-title-line", b.style.cssText = "display:flex; align-items:center; justify-content:center; gap:8px; min-width:0; flex-wrap:nowrap; overflow:hidden;"; let x = document.createElement("div"); - x.className = "mjr-viewer-title-line", x.style.cssText = "display:flex; align-items:center; justify-content:center; gap:8px; min-width:0; flex-wrap:nowrap; overflow:hidden;"; - let S = document.createElement("div"); - S.className = "mjr-viewer-title-wrap", S.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 C = document.createElement("span"); - C.className = "mjr-viewer-filename", C.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;"; + 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 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 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 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;"; + w.className = "mjr-viewer-header-meta mjr-viewer-header-meta--right", w.style.cssText = "display:none; align-items:center; gap:10px; min-width:0; justify-content:flex-end; overflow:hidden;"; + let T = document.createElement("span"); + T.className = "mjr-viewer-filename mjr-viewer-filename--right", T.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:right;"; + let E = document.createElement("div"); + E.className = "mjr-viewer-badges mjr-viewer-badges--right", E.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), w.appendChild(E), w.appendChild(T); 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;", x.appendChild(C), x.appendChild(w), S.appendChild(x), 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 = Yi("Single", e.SINGLE); - k.title = r("tooltip.singleViewMode", "Single view mode (one image)"); - let A = Yi("A/B", e.AB_COMPARE); - A.title = r("tooltip.compareOverlayMode", "A/B compare mode (overlay)"); - let j = Yi("Side", e.SIDE_BY_SIDE); - j.title = r("tooltip.compareSideBySide", "Side-by-side comparison mode"), O.appendChild(k), O.appendChild(A), O.appendChild(j); - let M = Ji("X", "Close (Esc)"); - M.style.fontSize = "18px"; + D.className = "mjr-viewer-mode-buttons", D.style.cssText = "display: flex; gap: 4px;"; + let O = Zi("Single", e.SINGLE); + O.title = R("tooltip.singleViewMode", "Single view mode (one image)"); + let k = Zi("A/B", e.AB_COMPARE); + k.title = R("tooltip.compareOverlayMode", "A/B compare mode (overlay)"); + let A = Zi("Side", e.SIDE_BY_SIDE); + A.title = R("tooltip.compareSideBySide", "Side-by-side comparison mode"), D.appendChild(O), D.appendChild(k), D.appendChild(A); + let j = Xi("X", "Close (Esc)"); + j.style.fontSize = "18px"; try { - M.classList.add("mjr-viewer-close"), M.textContent = ""; + j.classList.add("mjr-viewer-close"), j.textContent = ""; let e = document.createElement("span"); - e.className = "pi pi-times", e.setAttribute("aria-hidden", "true"), M.appendChild(e); + e.className = "pi pi-times", e.setAttribute("aria-hidden", "true"), j.appendChild(e); } catch (e) { console.debug?.(e); } - let N = Ji("[ ]", "Toggle Fullscreen (F)"); + let M = Xi("[ ]", "Toggle Fullscreen (F)"); try { - N.classList.add("mjr-viewer-fs"); + M.classList.add("mjr-viewer-fs"); } catch (e) { console.debug?.(e); } - N.style.fontSize = "16px"; + M.style.fontSize = "16px"; try { - N.style.position = "absolute", N.style.top = "8px", N.style.left = "", N.style.right = "48px", N.style.zIndex = "10002", N.style.width = "34px", N.style.height = "34px", N.style.padding = "0", N.style.display = "inline-flex", N.style.alignItems = "center", N.style.justifyContent = "center", N.style.borderRadius = "8px"; + M.style.position = "absolute", M.style.top = "8px", M.style.left = "", M.style.right = "48px", M.style.zIndex = "10002", M.style.width = "34px", M.style.height = "34px", M.style.padding = "0", M.style.display = "inline-flex", M.style.alignItems = "center", M.style.justifyContent = "center", M.style.borderRadius = "8px"; let e = document.createElement("span"); - e.className = "pi pi-window-maximize", e.setAttribute("aria-hidden", "true"), N.textContent = "", N.appendChild(e); + e.className = "pi pi-window-maximize", e.setAttribute("aria-hidden", "true"), M.textContent = "", M.appendChild(e); let t = () => { try { let t = document.fullscreenElement != null; - e.className = t ? "pi pi-window-minimize" : "pi pi-window-maximize", N.title = t ? "Exit Fullscreen (F)" : "Enter Fullscreen (F)"; + e.className = t ? "pi pi-window-minimize" : "pi pi-window-maximize", M.title = t ? "Exit Fullscreen (F)" : "Enter Fullscreen (F)"; } catch (e) { console.debug?.(e); } }; - if (N.onclick = (e) => { - e.stopPropagation(), h?.(); + if (M.onclick = (e) => { + e.stopPropagation(), m?.(); }, n?.safeAddListener) n.safeAddListener(document, "fullscreenchange", t); else try { document.addEventListener("fullscreenchange", t); @@ -2338,7 +2339,7 @@ function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a, console.debug?.(e); } }; - v._mjrCleanup ? v._mjrCleanup.push(e) : v._mjrCleanup = [e]; + _._mjrCleanup ? _._mjrCleanup.push(e) : _._mjrCleanup = [e]; } catch (e) { console.debug?.(e); } @@ -2346,123 +2347,123 @@ function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a, } catch (e) { console.debug?.(e); } + let N = document.createElement("div"); + N.className = "mjr-viewer-header-area mjr-viewer-header-area--left", N.style.cssText = "display:none; align-items:center; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", N.appendChild(y); let P = document.createElement("div"); - P.className = "mjr-viewer-header-area mjr-viewer-header-area--left", P.style.cssText = "display:none; align-items:center; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", P.appendChild(b); + P.className = "mjr-viewer-header-area mjr-viewer-header-area--center", P.style.cssText = "display:flex; align-items:center; justify-content:center; gap:12px; flex:1 1 auto; min-width:0;", x.appendChild(D), P.appendChild(x); let F = document.createElement("div"); - F.className = "mjr-viewer-header-area mjr-viewer-header-area--center", F.style.cssText = "display:flex; align-items:center; justify-content:center; gap:12px; flex:1 1 auto; min-width:0;", S.appendChild(O), F.appendChild(S); - let ee = document.createElement("div"); - ee.className = "mjr-viewer-header-area mjr-viewer-header-area--right", ee.style.cssText = "display:none; align-items:center; justify-content:flex-end; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", ee.appendChild(T), y.appendChild(P), y.appendChild(F), y.appendChild(ee); + F.className = "mjr-viewer-header-area mjr-viewer-header-area--right", F.style.cssText = "display:none; align-items:center; justify-content:flex-end; gap:12px; min-width:0; flex:1 1 0; overflow:hidden;", F.appendChild(w), v.appendChild(N), v.appendChild(P), v.appendChild(F); try { - M.style.position = "absolute", M.style.top = "8px", M.style.left = "", M.style.right = "8px", M.style.transform = "", M.style.zIndex = "10002", M.style.width = "34px", M.style.height = "34px", M.style.padding = "0", M.style.display = "inline-flex", M.style.alignItems = "center", M.style.justifyContent = "center", M.style.borderRadius = "8px"; + j.style.position = "absolute", j.style.top = "8px", j.style.left = "", j.style.right = "8px", j.style.transform = "", j.style.zIndex = "10002", j.style.width = "34px", j.style.height = "34px", j.style.padding = "0", j.style.display = "inline-flex", j.style.alignItems = "center", j.style.justifyContent = "center", j.style.borderRadius = "8px"; } catch (e) { console.debug?.(e); } - v.appendChild(y), v.appendChild(N), v.appendChild(M); - let { toolsRow: te, gradePanel: ne, overlayPanel: re, inspectPanel: ie, actionPanel: ae, infoPanel: oe, toolsActions: se, toolsMeta: ce, chGroup: le, expGroup: ue, gamGroup: de, anaGroup: fe, ovGuidesGroup: pe, ovInspectGroup: me, cmpGroup: he, audGroup: ge, model3dHint: _e, helpWrap: ve, helpBtn: ye, helpPop: be, channelsSelect: xe, exposureCtl: Se, gammaCtl: Ce, zebraToggle: we, scopesToggle: Te, scopesSelect: Ee, gridToggle: De, gridModeSelect: Oe, maskToggle: ke, formatSelect: Ae, maskOpacityCtl: je, probeToggle: Me, loupeToggle: Ne, hudToggle: Pe, focusToggle: Fe, genInfoToggle: Ie, compareModeSelect: Le, audioVizModeSelect: Re, resetGradeBtn: I, exportBtn: ze, copyBtn: Be, resetExposure: Ve, resetGamma: He, resetViewerTools: Ue, ACCENT: We, setSelectHighlighted: Ge, setChannelSelectStyle: Ke, setValueHighlighted: qe, setGroupHighlighted: Je } = Xi({ + _.appendChild(v), _.appendChild(M), _.appendChild(j); + let { toolsRow: I, gradePanel: ee, overlayPanel: te, inspectPanel: ne, actionPanel: re, infoPanel: ie, toolsActions: ae, toolsMeta: oe, chGroup: se, expGroup: ce, gamGroup: le, anaGroup: ue, ovGuidesGroup: de, ovInspectGroup: fe, cmpGroup: pe, audGroup: L, model3dHint: me, helpWrap: he, helpBtn: ge, helpPop: _e, channelsSelect: ve, exposureCtl: ye, gammaCtl: be, zebraToggle: xe, scopesToggle: Se, scopesSelect: Ce, gridToggle: we, gridModeSelect: Te, maskToggle: Ee, formatSelect: De, maskOpacityCtl: Oe, probeToggle: ke, loupeToggle: Ae, hudToggle: je, focusToggle: Me, genInfoToggle: Ne, compareModeSelect: Pe, audioVizModeSelect: Fe, resetGradeBtn: Ie, exportBtn: z, copyBtn: Le, resetExposure: Re, resetGamma: ze, resetViewerTools: Be, ACCENT: Ve, setSelectHighlighted: He, setChannelSelectStyle: Ue, setValueHighlighted: We, setGroupHighlighted: Ge } = Qi({ VIEWER_MODES: e, state: t, - onToolsChanged: u, - onCompareModeChanged: d, - onExportFrame: f, - onCopyFrame: p, - onAudioVizModeChanged: m, - getCanAB: g + onToolsChanged: l, + onCompareModeChanged: u, + onExportFrame: d, + onCopyFrame: f, + onAudioVizModeChanged: p, + getCanAB: h }); - v.appendChild(te), Zi({ - unsubs: _, + _.appendChild(I), $i({ + unsubs: g, state: t, VIEWER_MODES: e, - onMode: l, - onClose: i, - onToolsChanged: u, - onCompareModeChanged: d, - onAudioVizModeChanged: m, - onExportFrame: f, - onCopyFrame: p, - singleBtn: k, - abBtn: A, - sideBtn: j, - closeBtn: M, - channelsSelect: xe, - compareModeSelect: Le, - audioVizModeSelect: Re, - exposureCtl: Se, - gammaCtl: Ce, - zebraToggle: we, - scopesToggle: Te, - scopesSelect: Ee, - gridToggle: De, - gridModeSelect: Oe, - maskToggle: ke, - formatSelect: Ae, - maskOpacityCtl: je, - probeToggle: Me, - loupeToggle: Ne, - hudToggle: Pe, - focusToggle: Fe, - genInfoToggle: Ie, - resetGradeBtn: I, - exportBtn: ze, - copyBtn: Be, - resetExposure: Ve, - resetGamma: He, - resetViewerTools: Ue, - expGroup: ue, - gamGroup: de + onMode: c, + onClose: r, + onToolsChanged: l, + onCompareModeChanged: u, + onAudioVizModeChanged: p, + onExportFrame: d, + onCopyFrame: f, + singleBtn: O, + abBtn: k, + sideBtn: A, + closeBtn: j, + channelsSelect: ve, + compareModeSelect: Pe, + audioVizModeSelect: Fe, + exposureCtl: ye, + gammaCtl: be, + zebraToggle: xe, + scopesToggle: Se, + scopesSelect: Ce, + gridToggle: we, + gridModeSelect: Te, + maskToggle: Ee, + formatSelect: De, + maskOpacityCtl: Oe, + probeToggle: ke, + loupeToggle: Ae, + hudToggle: je, + focusToggle: Me, + genInfoToggle: Ne, + resetGradeBtn: Ie, + exportBtn: z, + copyBtn: Le, + resetExposure: Re, + resetGamma: ze, + resetViewerTools: Be, + expGroup: ce, + gamGroup: le }); - let Ye = () => Qi({ + let Ke = () => ea({ state: t, VIEWER_MODES: e, - getCanAB: g, - header: v, - toolsRow: te, - chGroup: le, - expGroup: ue, - gamGroup: de, - anaGroup: fe, - gradePanel: ne, - overlayPanel: re, - inspectPanel: ie, - infoPanel: oe, - actionPanel: ae, - ovGuidesGroup: pe, - ovInspectGroup: me, - model3dHint: _e, - helpWrap: ve, - channelsSelect: xe, - compareModeSelect: Le, - audioVizModeSelect: Re, - exposureCtl: Se, - gammaCtl: Ce, - zebraToggle: we, - scopesToggle: Te, - scopesSelect: Ee, - gridToggle: De, - gridModeSelect: Oe, - maskToggle: ke, - formatSelect: Ae, - maskOpacityCtl: je, - probeToggle: Me, - loupeToggle: Ne, - hudToggle: Pe, - focusToggle: Fe, - genInfoToggle: Ie, - exportBtn: ze, - copyBtn: Be, - resetGradeBtn: I, - cmpGroup: he, - audGroup: ge, - ACCENT: We, - setSelectHighlighted: Ge, - setChannelSelectStyle: Ke, - setValueHighlighted: qe, - setGroupHighlighted: Je - }), L = ({ canAB: n, canSide: r } = {}) => $i({ + getCanAB: h, + header: _, + toolsRow: I, + chGroup: se, + expGroup: ce, + gamGroup: le, + anaGroup: ue, + gradePanel: ee, + overlayPanel: te, + inspectPanel: ne, + infoPanel: ie, + actionPanel: re, + ovGuidesGroup: de, + ovInspectGroup: fe, + model3dHint: me, + helpWrap: he, + channelsSelect: ve, + compareModeSelect: Pe, + audioVizModeSelect: Fe, + exposureCtl: ye, + gammaCtl: be, + zebraToggle: xe, + scopesToggle: Se, + scopesSelect: Ce, + gridToggle: we, + gridModeSelect: Te, + maskToggle: Ee, + formatSelect: De, + maskOpacityCtl: Oe, + probeToggle: ke, + loupeToggle: Ae, + hudToggle: je, + focusToggle: Me, + genInfoToggle: Ne, + exportBtn: z, + copyBtn: Le, + resetGradeBtn: Ie, + cmpGroup: pe, + audGroup: L, + ACCENT: Ve, + setSelectHighlighted: He, + setChannelSelectStyle: Ue, + setValueHighlighted: We, + setGroupHighlighted: Ge + }), B = ({ canAB: n, canSide: r } = {}) => ta({ state: t, VIEWER_MODES: e, - singleBtn: k, - abBtn: A, - sideBtn: j, + singleBtn: O, + abBtn: k, + sideBtn: A, canAB: n, canSide: r }); @@ -2475,20 +2476,20 @@ function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a, } e = null; try { - be.style.display = "none"; + _e.style.display = "none"; } catch (e) { console.debug?.(e); } }, n = () => { t(), e = new AbortController(); try { - be.style.display = ""; + _e.style.display = ""; } catch (e) { console.debug?.(e); } try { document.addEventListener("mousedown", (e) => { - ve.contains(e.target) || t(); + he.contains(e.target) || t(); }, { capture: !0, signal: e.signal @@ -2506,34 +2507,34 @@ function ea({ VIEWER_MODES: e, state: t, lifecycle: n, onClose: i, _onZoomIn: a, console.debug?.(e); } }; - _.push(() => t()), _.push(z(ye, "click", () => { - be.style.display === "none" ? n() : t(); + g.push(() => t()), g.push(wt(ge, "click", () => { + _e.style.display === "none" ? n() : t(); })); } catch (e) { console.debug?.(e); } return { - headerEl: v, - headerTopEl: y, - filenameEl: C, - badgesBarEl: w, - filenameRightEl: E, - badgesBarRightEl: D, - leftAreaEl: P, - leftMetaEl: b, - centerAreaEl: F, - rightMetaEl: T, - rightAreaEl: ee, - titleLineEl: x, - titleWrapEl: S, - modeButtonsEl: O, - syncToolsUIFromState: Ye, - syncModeButtons: L + headerEl: _, + headerTopEl: v, + filenameEl: S, + badgesBarEl: C, + filenameRightEl: T, + badgesBarRightEl: E, + leftAreaEl: N, + leftMetaEl: y, + centerAreaEl: P, + rightMetaEl: w, + rightAreaEl: F, + titleLineEl: b, + titleWrapEl: x, + modeButtonsEl: D, + syncToolsUIFromState: Ke, + syncModeButtons: B }; } //#endregion //#region ui/features/viewer/keyboard.ts -function ta(e) { +function ra(e) { if (!e) return null; try { if (typeof e.prompt == "string" && e.prompt.trim()) return e.prompt.trim(); @@ -2563,49 +2564,49 @@ function ta(e) { } return null; } -function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, computeOneToOneZoom: o, setZoom: c, scheduleOverlayRedraw: l, scheduleApplyGrade: u, syncToolsUIFromState: d, 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 w = S?.unsubs || [], T = null, E = null, D = () => { +function ia({ overlay: e, _content: t, singleView: n, state: r, VIEWER_MODES: i, computeOneToOneZoom: a, setZoom: o, scheduleOverlayRedraw: s, scheduleApplyGrade: c, syncToolsUIFromState: l, applyDistractionFreeUI: u, navigateViewerAssets: d, closeViewer: f, renderBadges: p, updateAssetRating: h, safeDispatchCustomEvent: g, ASSET_RATING_CHANGED_EVENT: _, probeTooltip: v, loupeWrap: y, getVideoControls: b, lifecycle: x, renderGenInfoPanel: S } = {}) { + let C = x?.unsubs || [], w = null, T = null, E = () => { try { - T && clearTimeout(T); + w && clearTimeout(w); } catch (e) { console.debug?.(e); } - T = null, E = null; - }, O = (e, t) => { - D(), E = { + w = null, T = null; + }, D = (e, t) => { + E(), T = { assetId: e, rating: t - }, T = setTimeout(async () => { - let e = E; - if (T = null, E = null, e?.assetId) try { - let t = await g?.(e.assetId, e.rating); + }, w = setTimeout(async () => { + let e = T; + if (w = null, T = null, e?.assetId) try { + let t = await h?.(e.assetId, e.rating); if (!t?.ok) { - s(t?.error || r("toast.ratingUpdateFailed"), "error"); + m(t?.error || R("toast.ratingUpdateFailed"), "error"); return; } - s(r("toast.ratingSetN", { n: e.rating }), "success", 1500), _?.(v, { + m(R("toast.ratingSetN", { n: e.rating }), "success", 1500), g?.(_, { assetId: String(e.assetId), rating: e.rating }, { warnPrefix: "[Viewer]" }); } catch { - s(r("toast.ratingUpdateError"), "error"); + m(R("toast.ratingUpdateError"), "error"); } }, 300); - }, k = () => { + }, O = () => { try { document.fullscreenElement ? document?.exitFullscreen?.() : e?.requestFullscreen?.(); } catch (e) { console.debug?.(e); } - }, A = (t) => { - let g = () => { + }, k = (t) => { + let h = () => { try { t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.(); } catch (e) { console.debug?.(e); } }; - if (L()) return; + if (Ze()) return; try { if (e?.style?.display === "none") return; } catch (e) { @@ -2615,34 +2616,34 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, let e = t?.target; if (e && (e.tagName === "INPUT" || e.tagName === "TEXTAREA" || e.isContentEditable)) { if (t.key === "f" || t.key === "F") { - g(), k(); + h(), O(); return; } - t.key === "Escape" && (g(), R(m)); + t.key === "Escape" && (h(), V(f)); return; } } catch (e) { console.debug?.(e); } - let _ = i?.mode === a?.SINGLE, v = i?.assets?.[i?.currentIndex], S = async (e) => { - if (!_ || !v?.id || e !== "0" && e !== "1" && e !== "2" && e !== "3" && e !== "4" && e !== "5") return !1; + let g = r?.mode === i?.SINGLE, _ = r?.assets?.[r?.currentIndex], x = async (e) => { + if (!g || !_?.id || e !== "0" && e !== "1" && e !== "2" && e !== "3" && e !== "4" && e !== "5") return !1; let t = e === "0" ? 0 : Number(e); if (!Number.isFinite(t)) return !1; try { - return v.rating = t, R(h), O(v.id, t), !0; + return _.rating = t, V(p), D(_.id, t), !0; } catch { return !0; } - }, w = () => { + }, C = () => { try { - return x?.() || null; + return b?.() || null; } catch { return null; } - }, T = async (e) => { - if (!_ || v?.kind !== "video") return !1; + }, w = async (e) => { + if (!g || _?.kind !== "video") return !1; try { - let t = w(); + let t = C(); if (t?.stepFrames) return t.stepFrames(e), !0; } catch (e) { console.debug?.(e); @@ -2670,44 +2671,44 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, } catch { return !0; } - }, E = (e, { absolute: t = !1 } = {}) => { + }, T = (e, { absolute: t = !1 } = {}) => { try { - let n = w(); + let n = C(); if (!n) return !1; if (t) { let t = n.setPlaybackRate?.(e); - return Number.isFinite(Number(t)) ? (i.playbackRate = Number(t), s(r("toast.playbackRate", "Playback {rate}x", { rate: Number(t).toFixed(2) }), "info", 1200), !0) : !1; + return Number.isFinite(Number(t)) ? (r.playbackRate = Number(t), m(R("toast.playbackRate", "Playback {rate}x", { rate: Number(t).toFixed(2) }), "info", 1200), !0) : !1; } - let a = n.adjustPlaybackRate?.(e); - return Number.isFinite(Number(a)) ? (i.playbackRate = Number(a), s(r("toast.playbackRate", "Playback {rate}x", { rate: Number(a).toFixed(2) }), "info", 1200), !0) : !1; + let i = n.adjustPlaybackRate?.(e); + return Number.isFinite(Number(i)) ? (r.playbackRate = Number(i), m(R("toast.playbackRate", "Playback {rate}x", { rate: Number(i).toFixed(2) }), "info", 1200), !0) : !1; } catch { return !1; } }; if ((t.ctrlKey || t.metaKey) && (t.key === "c" || t.key === "C")) try { - let e = ta(v); + let e = ra(_); if (e) { - g(), navigator.clipboard?.writeText?.(e).then(() => s(r("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => s(r("toast.copyFailed", "Copy failed"), "error", 1500)); + h(), navigator.clipboard?.writeText?.(e).then(() => m(R("toast.promptCopied", "Prompt copied to clipboard"), "success", 1500)).catch(() => m(R("toast.copyFailed", "Copy failed"), "error", 1500)); return; } } catch (e) { console.debug?.(e); } - if (_ && !t.altKey && !t.ctrlKey && !t.metaKey && (t.key === "0" || t.key === "1" || t.key === "2" || t.key === "3" || t.key === "4" || t.key === "5")) { - g(), S(t.key); + if (g && !t.altKey && !t.ctrlKey && !t.metaKey && (t.key === "0" || t.key === "1" || t.key === "2" || t.key === "3" || t.key === "4" || t.key === "5")) { + h(), x(t.key); return; } switch (t.key) { case "1": { if (!t.altKey) break; - let e = R(o); + let e = V(a); if (e == null) break; - g(); + h(); try { - let t = Math.abs((Number(i?.zoom) || 1) - e) < .01; - c?.(t ? 1 : e, { - clientX: i?._lastPointerX, - clientY: i?._lastPointerY + let t = Math.abs((Number(r?.zoom) || 1) - e) < .01; + o?.(t ? 1 : e, { + clientX: r?._lastPointerX, + clientY: r?._lastPointerY }); } catch (e) { console.debug?.(e); @@ -2716,104 +2717,104 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, } case "g": case "G": - g(); + h(); try { - i.gridMode = ((Number(i.gridMode) || 0) + 1) % 5; + r.gridMode = ((Number(r.gridMode) || 0) + 1) % 5; } catch (e) { console.debug?.(e); } - R(l), R(d); + V(s), V(l); break; case "f": case "F": - g(), k(); + h(), O(); break; case "d": case "D": - g(); + h(); try { - i.genInfoOpen = !i.genInfoOpen; + r.genInfoOpen = !r.genInfoOpen; } catch (e) { console.debug?.(e); } - R(d), R(C); + V(l), V(S); break; case "z": case "Z": - g(); + h(); try { - i.analysisMode = i.analysisMode === "zebra" ? "none" : "zebra"; + r.analysisMode = r.analysisMode === "zebra" ? "none" : "zebra"; } catch (e) { console.debug?.(e); } - R(d), R(u); + V(l), V(c); break; case "i": case "I": - if (_ && v?.kind === "video" && w()?.setInPoint?.()) { - g(), s(r("toast.inPointSet", "In point set"), "info", 1200); + if (g && _?.kind === "video" && C()?.setInPoint?.()) { + h(), m(R("toast.inPointSet", "In point set"), "info", 1200); break; } - g(); + h(); try { - i.probeEnabled = !i.probeEnabled; + r.probeEnabled = !r.probeEnabled; } catch (e) { console.debug?.(e); } try { - i.probeEnabled || (y.style.display = "none"); + r.probeEnabled || (v.style.display = "none"); } catch (e) { console.debug?.(e); } - R(d); + V(l); break; case "o": case "O": - if (_ && v?.kind === "video" && w()?.setOutPoint?.()) { - g(), s(r("toast.outPointSet", "Out point set"), "info", 1200); + if (g && _?.kind === "video" && C()?.setOutPoint?.()) { + h(), m(R("toast.outPointSet", "Out point set"), "info", 1200); break; } break; case "Home": - if (_ && v?.kind === "video" && w()?.goToIn?.()) { - g(); + if (g && _?.kind === "video" && C()?.goToIn?.()) { + h(); break; } break; case "End": - if (_ && v?.kind === "video" && w()?.goToOut?.()) { - g(); + if (g && _?.kind === "video" && C()?.goToOut?.()) { + h(); break; } break; case "l": case "L": - g(); + h(); try { - i.loupeEnabled = !i.loupeEnabled; + r.loupeEnabled = !r.loupeEnabled; } catch (e) { console.debug?.(e); } try { - i.loupeEnabled || (b.style.display = "none"); + r.loupeEnabled || (y.style.display = "none"); } catch (e) { console.debug?.(e); } - R(d); + V(l); break; case "x": case "X": - g(); + h(); try { - i.distractionFree = !i.distractionFree; + r.distractionFree = !r.distractionFree; } catch (e) { console.debug?.(e); } - R(d), R(f), R(C); + V(l), V(u), V(S); break; case "c": case "C": { - let e = i?._probe; + let e = r?._probe; if (!e || e.r == null || e.g == null || e.b == null) break; let t = `#${[ e.r, @@ -2822,7 +2823,7 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, ].map((e) => Math.max(0, Math.min(255, Number(e) || 0)).toString(16).padStart(2, "0")).join("")}`; try { let e = navigator?.clipboard; - e?.writeText && (g(), e.writeText(t).catch(() => {})); + e?.writeText && (h(), e.writeText(t).catch(() => {})); } catch (e) { console.debug?.(e); } @@ -2830,12 +2831,12 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, } case " ": case "Spacebar": - if (_ && v?.kind === "video") { + if (g && _?.kind === "video") { let e = n?.querySelector?.("video"); if (e) { - g(); + h(); try { - let e = w(); + let e = C(); if (e?.togglePlay) { e.togglePlay(); break; @@ -2856,7 +2857,7 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, } break; case "Tab": - g(); + h(); try { e?.contains?.(document.activeElement) || e?.focus?.(); } catch (e) { @@ -2864,41 +2865,41 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, } break; case "Escape": - g(), R(m); + h(), V(f); break; case "ArrowLeft": - if (_ && t.target?.closest?.(".mjr-viewer-playerbar")) { - g(), T(-1); + if (g && t.target?.closest?.(".mjr-viewer-playerbar")) { + h(), w(-1); break; } - g(), R(() => p?.(-1)); + h(), V(() => d?.(-1)); break; case "ArrowRight": - if (_ && t.target?.closest?.(".mjr-viewer-playerbar")) { - g(), T(1); + if (g && t.target?.closest?.(".mjr-viewer-playerbar")) { + h(), w(1); break; } - g(), R(() => p?.(1)); + h(), V(() => d?.(1)); break; case "[": case "{": - g(), E(-.25) || s(r("toast.playbackVideoOnly"), "warning", 1400); + h(), T(-.25) || m(R("toast.playbackVideoOnly"), "warning", 1400); break; case "]": case "}": - g(), E(.25) || s(r("toast.playbackVideoOnly"), "warning", 1400); + h(), T(.25) || m(R("toast.playbackVideoOnly"), "warning", 1400); break; case "\\": case "|": - g(), E(1, { absolute: !0 }) || s(r("toast.playbackVideoOnly"), "warning", 1400); + h(), T(1, { absolute: !0 }) || m(R("toast.playbackVideoOnly"), "warning", 1400); break; case "+": case "=": - g(); + h(); try { - c?.((Number(i?.zoom) || 1) + .25, { - clientX: i?._lastPointerX, - clientY: i?._lastPointerY + o?.((Number(r?.zoom) || 1) + .25, { + clientX: r?._lastPointerX, + clientY: r?._lastPointerY }); } catch (e) { console.debug?.(e); @@ -2906,43 +2907,43 @@ function na({ overlay: e, _content: t, singleView: n, state: i, VIEWER_MODES: a, break; case "-": case "_": - g(); + h(); try { - c?.((Number(i?.zoom) || 1) - .25, { - clientX: i?._lastPointerX, - clientY: i?._lastPointerY + o?.((Number(r?.zoom) || 1) - .25, { + clientX: r?._lastPointerX, + clientY: r?._lastPointerY }); } catch (e) { console.debug?.(e); } break; } - }, j = null, M = () => { + }, A = null, j = () => { try { - if (j) return; - j = z(window, "keydown", A, !0); + if (A) return; + A = wt(window, "keydown", k, !0); } catch (e) { console.debug?.(e); } - }, N = () => { + }, M = () => { try { - R(j); + V(A); } catch (e) { console.debug?.(e); } - j = null; + A = null; }; - return w.push(() => D()), w.push(() => N()), { - bind: M, - unbind: N, + return C.push(() => E()), C.push(() => M()), { + bind: j, + unbind: M, dispose: () => { - D(), N(); + E(), M(); } }; } //#endregion //#region ui/features/viewer/grid.ts -function ra({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getViewportRect: a, clearCanvas: o } = {}) { +function aa({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getViewportRect: a, clearCanvas: o } = {}) { let s = () => { try { let e = n?.mode; @@ -3356,7 +3357,7 @@ function ra({ gridCanvas: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMe } //#endregion //#region ui/features/viewer/probe.ts -function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getMediaNaturalSize: a, _getViewportRect: o, positionOverlayBox: s, probeTooltip: c, loupeWrap: l, onLoupeRedraw: u, lifecycle: d } = {}) { +function oa({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia: i, getMediaNaturalSize: a, _getViewportRect: o, positionOverlayBox: s, probeTooltip: c, loupeWrap: l, onLoupeRedraw: u, lifecycle: d } = {}) { let f = d?.unsubs || [], p = document.createElement("canvas"); p.width = 1, p.height = 1; let m = null; @@ -3472,7 +3473,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia } catch (e) { console.debug?.(e); } - R(() => s?.(c, t, o, { + V(() => s?.(c, t, o, { offsetX: 18, offsetY: 18 })); @@ -3481,7 +3482,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia } catch (e) { console.debug?.(e); } - if (n?.loupeEnabled) R(() => u?.(d, S, C, t, o)); + if (n?.loupeEnabled) V(() => u?.(d, S, C, t, o)); else try { l.style.display = "none"; } catch (e) { @@ -3502,7 +3503,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia } }; try { - t && !t._mjrProbeBound && (f.push(z(t, "mousemove", (e) => { + t && !t._mjrProbeBound && (f.push(wt(t, "mousemove", (e) => { try { S(e.clientX, e.clientY); } catch (e) { @@ -3511,7 +3512,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia }, { passive: !0, capture: !0 - })), f.push(z(t, "mouseleave", () => { + })), f.push(wt(t, "mouseleave", () => { v(); }, { passive: !0, @@ -3534,7 +3535,7 @@ function ia({ overlay: e, content: t, state: n, VIEWER_MODES: r, getPrimaryMedia } //#endregion //#region ui/features/viewer/loupe.ts -function aa({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, positionOverlayBox: i } = {}) { +function sa({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, positionOverlayBox: i } = {}) { let a = null; try { a = t?.getContext?.("2d", { willReadFrequently: !0 }); @@ -3588,7 +3589,7 @@ function aa({ state: e, loupeCanvas: t, loupeWrap: n, getMediaNaturalSize: r, po } //#endregion //#region ui/features/viewer/metadata.ts -function oa({ state: e, VIEWER_MODES: t, APP_CONFIG: n, getAssetMetadata: r, getAssetsBatch: i } = {}) { +function ca({ state: e, VIEWER_MODES: t, APP_CONFIG: n, getAssetMetadata: r, getAssetsBatch: i } = {}) { let a = /* @__PURE__ */ new Map(), o = n?.VIEWER_META_TTL_MS ?? 3e4, s = n?.VIEWER_META_MAX_ENTRIES ?? 500, c = 0, l = null, u = () => { if (a.size <= s) return; let e = Date.now(); @@ -3716,27 +3717,27 @@ function oa({ state: e, VIEWER_MODES: t, APP_CONFIG: n, getAssetMetadata: r, get } }, abort: () => { - R(() => l?.abort?.()), l = null; + V(() => l?.abort?.()), l = null; }, dispose: () => { - R(() => l?.abort?.()), l = null, R(() => a.clear()); + V(() => l?.abort?.()), l = null, V(() => a.clear()); }, cleanupCache: () => { - R(u); + V(u); }, - _noop: Ot + _noop: Kt }; } //#endregion //#region ui/features/viewer/constants.ts -var sa = Object.freeze({ +var la = Object.freeze({ MIN: .1, MAX: 16 }); //#endregion //#region ui/features/viewer/panzoom.ts -function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, state: a, VIEWER_MODES: o, scheduleOverlayRedraw: s, lifecycle: c } = {}) { - let l = c?.safeCall || R, u = c?.safeAddListener || z, d = c?.unsubs || [], f = () => { +function ua({ overlay: e, content: t, singleView: n, abView: r, sideView: i, state: a, VIEWER_MODES: o, scheduleOverlayRedraw: s, lifecycle: c } = {}) { + let l = c?.safeCall || V, u = c?.safeAddListener || wt, d = c?.unsubs || [], f = () => { try { return a?.mode === o?.SINGLE && n?.querySelector?.(".mjr-viewer-media") || null; } catch { @@ -3814,7 +3815,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta }, _ = () => { try { if (!e || e.style.display === "none") return; - let s = Math.max(sa.MIN, Math.min(sa.MAX, Number(a?.zoom) || 1)), c = a?.assets?.[a?.currentIndex], l = Number(c?.width) || 0, u = Number(c?.height) || 0; + let s = Math.max(la.MIN, Math.min(la.MAX, Number(a?.zoom) || 1)), c = a?.assets?.[a?.currentIndex], l = Number(c?.width) || 0, u = Number(c?.height) || 0; if (l > 0 && u > 0 || (h(), l = Number(a?._mediaW) || 0, u = Number(a?._mediaH) || 0), !(l > 0 && u > 0)) return; let d = l / u; if (!Number.isFinite(d) || d <= 0) return; @@ -3879,7 +3880,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta console.debug?.(e); } }, v = () => { - let e = Math.max(sa.MIN, Math.min(sa.MAX, Number(a?.zoom) || 1)), t = Number(a?.panX) || 0, n = Number(a?.panY) || 0; + let e = Math.max(la.MIN, Math.min(la.MAX, Number(a?.zoom) || 1)), t = Number(a?.panX) || 0, n = Number(a?.panY) || 0; return `translate3d(${t / e}px, ${n / e}px, 0) scale(${e})`; }, y = () => { try { @@ -3934,7 +3935,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta } }, x = (e, { clientX: n = null, clientY: r = null } = {}) => { try { - let i = Math.max(sa.MIN, Math.min(sa.MAX, Number(a?.zoom) || 1)), o = Math.max(sa.MIN, Math.min(sa.MAX, Number(e) || i)); + let i = Math.max(la.MIN, Math.min(la.MAX, Number(a?.zoom) || 1)), o = Math.max(la.MIN, Math.min(la.MAX, Number(e) || i)); try { a._userInteracted = !0; } catch (e) { @@ -4006,7 +4007,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta try { let a = S(e, t, n, r); if (!(a.w > 0 && a.h > 0)) return !1; - let o = Math.max(sa.MIN, Math.min(sa.MAX, Number(i) || 1)), s = a.w * o, c = a.h * o; + let o = Math.max(la.MIN, Math.min(la.MAX, Number(i) || 1)), s = a.w * o, c = a.h * o; return s > (Number(n) || 0) + 1 || c > (Number(r) || 0) + 1; } catch { return !1; @@ -4022,7 +4023,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta let i = S(t, n, r.width, r.height); if (!(i.w > 0 && i.h > 0)) return null; let a = t / i.w; - return !Number.isFinite(a) || a <= 0 ? null : Math.max(sa.MIN, Math.min(sa.MAX, a)); + return !Number.isFinite(a) || a <= 0 ? null : Math.max(la.MIN, Math.min(la.MAX, a)); } catch { return null; } @@ -4037,7 +4038,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta if (!e || e.style.display === "none" || Hn(n?.target)) return; let r = Number(a?.zoom) || 1, i = (() => { try { - return !!I?.VIEWER_ALLOW_PAN_AT_ZOOM_1; + return !!z?.VIEWER_ALLOW_PAN_AT_ZOOM_1; } catch { return !1; } @@ -4138,7 +4139,7 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta } catch (e) { console.debug?.(e); } - let t = (Number(e.clientX) || 0) - D.startX, n = (Number(e.clientY) || 0) - D.startY, r = Math.max(sa.MIN, Math.min(sa.MAX, Number(a?.zoom) || 1)), i = Math.max(1, r); + let t = (Number(e.clientX) || 0) - D.startX, n = (Number(e.clientY) || 0) - D.startY, r = Math.max(la.MIN, Math.min(la.MAX, Number(a?.zoom) || 1)), i = Math.max(1, r); a.panX = D.startPanX + t * i, a.panY = D.startPanY + n * i; try { a._lastPointerX = e.clientX, a._lastPointerY = e.clientY; @@ -4228,12 +4229,12 @@ function ca({ overlay: e, content: t, singleView: n, abView: r, sideView: i, sta } //#endregion //#region ui/features/viewer/videoProcessorWebGL.ts -var la = "\nattribute vec2 a_position;\nvarying vec2 v_uv;\nvoid main() {\n // Quad covers -1..1\n gl_Position = vec4(a_position, 0, 1);\n // Map -1..1 to 0..1\n v_uv = a_position * 0.5 + 0.5;\n // In WebGL, textures are usually flipped relative to Image/Video elements if not handled.\n // We'll flip Y in fragment shader or here.\n v_uv.y = 1.0 - v_uv.y;\n}\n", ua = "\nprecision mediump float;\nvarying vec2 v_uv;\nuniform sampler2D u_image;\nuniform float u_exposure_scale;\nuniform float u_gamma_inv;\nuniform int u_channel; // 0=RGB, 1=R, 2=G, 3=B\nuniform int u_analysis; // 0=None, 1=Zebra\nuniform float u_zebra_threshold;\nuniform vec2 u_resolution;\n\nfloat getLuma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); }\n\nvoid main() {\n vec4 texColor = texture2D(u_image, v_uv);\n vec3 color = texColor.rgb;\n\n // Exposure\n color *= u_exposure_scale;\n\n // Analysis (Zebra) or Gamma\n bool isZebra = false;\n if (u_analysis == 1) {\n float luma = getLuma(color);\n if (luma >= u_zebra_threshold) {\n isZebra = true;\n // Stripe pattern: (x + y) % 16 < 8\n // gl_FragCoord is in window pixels\n float stripe = mod(gl_FragCoord.x + gl_FragCoord.y, 32.0);\n if (stripe < 16.0) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); // Black\n } else {\n gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); // White\n }\n }\n }\n\n if (!isZebra) {\n // Gamma\n // fast pow?\n color = pow(clamp(color, 0.0, 1.0), vec3(u_gamma_inv));\n\n // Channel Selector\n if (u_channel == 1) color = vec3(color.r);\n else if (u_channel == 2) color = vec3(color.g);\n else if (u_channel == 3) color = vec3(color.b);\n\n gl_FragColor = vec4(color, texColor.a);\n }\n}\n"; -function da(e, t, n) { +var da = "\nattribute vec2 a_position;\nvarying vec2 v_uv;\nvoid main() {\n // Quad covers -1..1\n gl_Position = vec4(a_position, 0, 1);\n // Map -1..1 to 0..1\n v_uv = a_position * 0.5 + 0.5;\n // In WebGL, textures are usually flipped relative to Image/Video elements if not handled.\n // We'll flip Y in fragment shader or here.\n v_uv.y = 1.0 - v_uv.y;\n}\n", fa = "\nprecision mediump float;\nvarying vec2 v_uv;\nuniform sampler2D u_image;\nuniform float u_exposure_scale;\nuniform float u_gamma_inv;\nuniform int u_channel; // 0=RGB, 1=R, 2=G, 3=B\nuniform int u_analysis; // 0=None, 1=Zebra\nuniform float u_zebra_threshold;\nuniform vec2 u_resolution;\n\nfloat getLuma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); }\n\nvoid main() {\n vec4 texColor = texture2D(u_image, v_uv);\n vec3 color = texColor.rgb;\n\n // Exposure\n color *= u_exposure_scale;\n\n // Analysis (Zebra) or Gamma\n bool isZebra = false;\n if (u_analysis == 1) {\n float luma = getLuma(color);\n if (luma >= u_zebra_threshold) {\n isZebra = true;\n // Stripe pattern: (x + y) % 16 < 8\n // gl_FragCoord is in window pixels\n float stripe = mod(gl_FragCoord.x + gl_FragCoord.y, 32.0);\n if (stripe < 16.0) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); // Black\n } else {\n gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); // White\n }\n }\n }\n\n if (!isZebra) {\n // Gamma\n // fast pow?\n color = pow(clamp(color, 0.0, 1.0), vec3(u_gamma_inv));\n\n // Channel Selector\n if (u_channel == 1) color = vec3(color.r);\n else if (u_channel == 2) color = vec3(color.g);\n else if (u_channel == 3) color = vec3(color.b);\n\n gl_FragColor = vec4(color, texColor.a);\n }\n}\n"; +function pa(e, t, n) { let r = e.createShader(t); return e.shaderSource(r, n), e.compileShader(r), e.getShaderParameter(r, e.COMPILE_STATUS) ? r : (console.warn("WebGL Shader Error:", e.getShaderInfoLog(r)), e.deleteShader(r), null); } -function fa(e, t, n) { +function ma(e, t, n) { let r = e.createProgram(); if (e.attachShader(r, t), e.attachShader(r, n), e.linkProgram(r), !e.getProgramParameter(r, e.LINK_STATUS)) { console.warn("WebGL Program Error:", e.getProgramInfoLog(r)); @@ -4246,7 +4247,7 @@ function fa(e, t, n) { } return r; } -function pa() { +function ha() { try { let e = document.createElement("canvas"); return !!(window.WebGLRenderingContext && (e.getContext("webgl") || e.getContext("experimental-webgl"))); @@ -4254,7 +4255,7 @@ function pa() { return !1; } } -function ma(e) { +function ga(e) { let { canvas: t, videoEl: n, getGradeParams: r } = e, i = null, a = null, o = 4096, s = !1, c = { type: "webgl", ready: !1, @@ -4324,9 +4325,9 @@ function ma(e) { }, f = () => { if (!i) return null; d(); - let e = da(i, i.VERTEX_SHADER, la), t = da(i, i.FRAGMENT_SHADER, ua); + let e = pa(i, i.VERTEX_SHADER, da), t = pa(i, i.FRAGMENT_SHADER, fa); if (!e || !t) return e && i.deleteShader(e), t && i.deleteShader(t), null; - let n = fa(i, e, t); + let n = ma(i, e, t); if (i.deleteShader(e), i.deleteShader(t), !n) return null; u("setupResources:createProgram"); let r = { @@ -4403,10 +4404,10 @@ function ma(e) { } //#endregion //#region ui/features/viewer/videoProcessor.ts -function ha({ 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 ? !!I?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null; - if (!n && pa()) try { - p = ma({ +function _a({ 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 ? !!z?.VIEWER_PAUSE_DURING_EXECUTION : !!r, p = null; + if (!n && ha()) try { + p = ga({ canvas: e, videoEl: t, getGradeParams: i, @@ -4786,7 +4787,7 @@ function ha({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = } catch (e) { console.debug?.(e); } - }, { passive: !0 }) || (() => {})), f && (window.addEventListener(B.RUNTIME_STATUS, F), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && j()); + }, { passive: !0 }) || (() => {})), f && (window.addEventListener(H.RUNTIME_STATUS, F), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && j()); } catch (e) { console.debug?.(e); } @@ -4802,7 +4803,7 @@ function ha({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = destroy: () => { p && p.destroy(), y._destroyed = !0; try { - window.removeEventListener(B.RUNTIME_STATUS, F); + window.removeEventListener(H.RUNTIME_STATUS, F); } catch (e) { console.debug?.(e); } @@ -4854,11 +4855,11 @@ function ha({ canvas: e, videoEl: t, disableWebGL: n, pauseDuringExecution: r = } //#endregion //#region ui/features/viewer/audioVisualizer.ts -function ga(e, t, n) { +function va(e, t, n) { let r = Number(e); return Number.isFinite(r) ? Math.max(t, Math.min(n, r)) : t; } -function _a(e) { +function ya(e) { try { let t = String(e || "").toLowerCase(); if (t === "simple" || t === "artistic") return t; @@ -4867,7 +4868,7 @@ function _a(e) { console.debug?.(e); } try { - let e = String(I?.VIEWER_AUDIO_VISUALIZER_MODE || "simple").toLowerCase(); + let e = String(z?.VIEWER_AUDIO_VISUALIZER_MODE || "simple").toLowerCase(); if (e === "artistic") return "artistic"; if (e === "webgl3d" || e === "webgl") return "simple"; } catch (e) { @@ -4875,7 +4876,7 @@ function _a(e) { } return "simple"; } -function va(e) { +function ba(e) { let t = e.getContext("2d"); if (!t) return null; let n = (e, t) => { @@ -4925,7 +4926,7 @@ function va(e) { destroy() {} }; } -function ya(e, { pseudo3d: t = !1 } = {}) { +function xa(e, { pseudo3d: t = !1 } = {}) { let n = null; try { n = e.getContext("webgl", { @@ -4972,7 +4973,7 @@ function ya(e, { pseudo3d: t = !1 } = {}) { n.viewport(0, 0, e.width || 1, e.height || 1), n.clearColor(0, 0, 0, 0), n.clear(n.COLOR_BUFFER_BIT); let i = Math.max(48, Math.min(180, Math.floor((e.width || 640) / 7))), o = Number(a) * .001, s = new Float32Array(i * 2); for (let e = 0; e < i; e++) { - let n = e / Math.max(1, i - 1), a = n * 2 - 1, c = f(r, n), l = t ? Math.sin(n * Math.PI * 4 + o * 1.1) * .18 : 0, u = t ? 1 / (1 + Math.max(-.7, l) * .8) : 1, d = ga((.18 + c * .32) * u, -.95, .95); + let n = e / Math.max(1, i - 1), a = n * 2 - 1, c = f(r, n), l = t ? Math.sin(n * Math.PI * 4 + o * 1.1) * .18 : 0, u = t ? 1 / (1 + Math.max(-.7, l) * .8) : 1, d = va((.18 + c * .32) * u, -.95, .95); s[e * 2] = a, s[e * 2 + 1] = d; } u(s, [ @@ -4983,7 +4984,7 @@ function ya(e, { pseudo3d: t = !1 } = {}) { ]); let c = new Float32Array(i * 2); for (let e = 0; e < i; e++) { - let n = e / Math.max(1, i - 1), a = n * 2 - 1, s = p(r, n), l = m(r, n), u = s * .62 + l * .38, d = t ? Math.sin(n * Math.PI * 3 + o * 1) * .14 : 0, f = t ? 1 / (1 + Math.max(-.7, d) * .8) : 1, h = ga(-u * .62 * f, -.95, 0); + let n = e / Math.max(1, i - 1), a = n * 2 - 1, s = p(r, n), l = m(r, n), u = s * .62 + l * .38, d = t ? Math.sin(n * Math.PI * 3 + o * 1) * .14 : 0, f = t ? 1 / (1 + Math.max(-.7, d) * .8) : 1, h = va(-u * .62 * f, -.95, 0); c[e * 2] = a, c[e * 2 + 1] = h; } u(c, [ @@ -5020,17 +5021,17 @@ function ya(e, { pseudo3d: t = !1 } = {}) { } }; } -function ba({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = {}) { +function Sa({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = {}) { if (!e || !t) return { destroy() {} }; - let i = r == null ? !!I?.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 / ga(I?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = _a(n), _ = () => { + let i = r == null ? !!z?.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 / va(z?.VIEWER_AUDIO_VIS_FPS ?? 24, 8, 60), g = ya(n), _ = () => { try { - let t = ga(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)); + let t = va(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); } catch (e) { console.debug?.(e); } }, v = (t = g) => { - g = _a(t); + g = ya(t); try { f?.destroy?.(); } catch (e) { @@ -5043,12 +5044,12 @@ function ba({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = console.debug?.(e); } try { - g === "artistic" && !I?.VIEWER_DISABLE_WEBGL_AUDIO && (f = ya(e, { pseudo3d: !0 })); + g === "artistic" && !z?.VIEWER_DISABLE_WEBGL_AUDIO && (f = xa(e, { pseudo3d: !0 })); } catch (e) { console.debug?.(e); } if (!f) try { - f = va(e); + f = ba(e); } catch (e) { console.debug?.(e), f = null; } @@ -5114,7 +5115,7 @@ function ba({ 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", T, { passive: !0 }), window.addEventListener("resize", E, { passive: !0 }), i && (window.addEventListener(B.RUNTIME_STATUS, D), 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", E, { passive: !0 }), i && (window.addEventListener(H.RUNTIME_STATUS, D), String(window?.__MJR_EXECUTION_RUNTIME__?.active_prompt_id || "").trim() && (m = !0)); } catch (e) { console.debug?.(e); } @@ -5126,7 +5127,7 @@ function ba({ 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", T), window.removeEventListener("resize", E), window.removeEventListener(B.RUNTIME_STATUS, D); + t.removeEventListener("play", C), t.removeEventListener("pause", w), t.removeEventListener("ended", T), window.removeEventListener("resize", E), window.removeEventListener(H.RUNTIME_STATUS, D); } catch (e) { console.debug?.(e); } @@ -5157,8 +5158,8 @@ function ba({ canvas: e, audioEl: t, mode: n, pauseDuringExecution: r = null } = } //#endregion //#region ui/features/viewer/mediaFactory.ts -function xa({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r, clampPanToBounds: i, applyTransform: a, scheduleOverlayRedraw: o, getGradeParams: s, isDefaultGrade: c, tonemap: l, maxProcPixels: u, maxProcPixelsVideo: d, disableWebGL: f, videoGradeThrottleFps: p, safeAddListener: m, safeCall: h } = {}) { - let g = h || R, _ = m || z, v = (e) => { +function Ca({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r, clampPanToBounds: i, applyTransform: a, scheduleOverlayRedraw: o, getGradeParams: s, isDefaultGrade: c, tonemap: l, maxProcPixels: u, maxProcPixelsVideo: d, disableWebGL: f, videoGradeThrottleFps: p, safeAddListener: m, safeCall: h } = {}) { + let g = h || V, _ = m || wt, v = (e) => { try { let t = String(e?.ext || "").trim().toLowerCase(); if (t) return t.startsWith(".") ? t : `.${t}`; @@ -5355,7 +5356,7 @@ function xa({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r let o = document.createElement("audio"); o.className = "mjr-viewer-audio-src", o.src = n, o.controls = !1, o.autoplay = !0, o.preload = "metadata", o.style.cssText = "width: min(680px, 90%);"; try { - let e = ba({ + let e = Sa({ canvas: a, audioEl: o, mode: t?.audioVisualizerMode, @@ -5441,10 +5442,10 @@ function xa({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } catch {} v.style.cssText = "position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;", T(v, e); try { - u._mjrProc = ha({ + u._mjrProc = _a({ canvas: u, videoEl: v, - disableWebGL: f || !!I.VIEWER_DISABLE_WEBGL_VIDEO, + disableWebGL: f || !!z.VIEWER_DISABLE_WEBGL_VIDEO, pauseDuringExecution: !0, getGradeParams: s, isDefaultGrade: c, @@ -5621,7 +5622,7 @@ function xa({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } catch {} h.style.cssText = "position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;", T(h, e); try { - m._mjrProc = ha({ + m._mjrProc = _a({ canvas: m, videoEl: h, pauseDuringExecution: !0, @@ -5723,7 +5724,7 @@ function xa({ overlay: e, state: t, mediaTransform: n, updateMediaNaturalSize: r } //#endregion //#region ui/features/viewer/imagePreloader.ts -function Sa({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) { +function wa({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) { function r(e) { if (!e) return null; if (e.id != null) return `id:${e.id}`; @@ -5807,8 +5808,8 @@ function Sa({ buildAssetViewURL: e, IMAGE_PRELOAD_EXTENSIONS: t, state: n }) { } //#endregion //#region ui/features/viewer/viewerInstanceManager.ts -function Ca(e) { - let t = Ue(); +function Ta(e) { + let t = Ge(); if (t.length) { let e = t[t.length - 1]; for (let n of t) if (n !== e) { @@ -5831,11 +5832,11 @@ function Ca(e) { } } let n = e(); - return Ye(n), n._mjrViewerAPI; + return Xe(n), n._mjrViewerAPI; } //#endregion //#region ui/features/viewer/playerBarManager.ts -function wa({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, playerBarHost: a, singleView: o, abView: s, sideView: c, metadataHydrator: l, isPlayableViewerKind: u, collectPlayableMediaElements: d, pickPrimaryPlayableMedia: f, mountUnifiedMediaControls: p, installFollowerVideoSync: m, getViewerInfo: h, scheduleOverlayRedraw: g, viewerInfoCacheGet: _, viewerInfoCacheSet: v }) { +function Ea({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, playerBarHost: a, singleView: o, abView: s, sideView: c, metadataHydrator: l, isPlayableViewerKind: u, collectPlayableMediaElements: d, pickPrimaryPlayableMedia: f, mountUnifiedMediaControls: p, installFollowerVideoSync: m, getViewerInfo: h, scheduleOverlayRedraw: g, viewerInfoCacheGet: _, viewerInfoCacheSet: v }) { function y() { try { e._videoControlsDestroy && e._videoControlsDestroy(); @@ -5934,10 +5935,10 @@ function wa({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, p try { let e = (e) => { try { - let t = Vt(e); + let t = qt(e); return { fps: t, - frameCount: Ut(e, t) + frameCount: At(e, t) }; } catch { return { @@ -6076,7 +6077,7 @@ function wa({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, p } if (E === "video") { try { - let t = (e) => Dt(e), n = (e) => { + let t = (e) => Wt(e), n = (e) => { let t = Number(e); return !Number.isFinite(t) || t <= 0 ? null : Math.floor(t); }, r = (e) => { @@ -6169,12 +6170,12 @@ function wa({ state: e, APP_CONFIG: t, VIEWER_MODES: n, overlay: r, navBar: i, p } //#endregion //#region ui/features/viewer/viewerThemeStyles.ts -var Ta = "min(400px, 42vw)", Ea = `calc(${Ta} + 24px)`, Da = "mjr-viewer-modern-theme"; -function Oa() { +var Da = "min(400px, 42vw)", Oa = `calc(${Da} + 24px)`, ka = "mjr-viewer-modern-theme"; +function Aa() { try { - if (document.getElementById(Da)) return; + if (document.getElementById(ka)) return; let e = document.createElement("style"); - e.id = Da, e.textContent = ` + e.id = ka, e.textContent = ` .mjr-viewer-overlay { --mjr-viewer-surface: rgba(14, 18, 24, 0.78); --mjr-viewer-surface-strong: rgba(10, 13, 18, 0.9); @@ -6277,7 +6278,7 @@ function Oa() { } .mjr-viewer-geninfo { - width: ${Ta} !important; + width: ${Da} !important; top: 16px !important; bottom: 16px !important; border-radius: 20px; @@ -6376,15 +6377,15 @@ function Oa() { } //#endregion //#region ui/features/viewer/filmstrip.ts -var ka = 84, Aa = 56, ja = 74, Ma = .45, Na = "0px 240px 0px 240px", Pa = 3500; -function Fa(e) { +var ja = 84, Ma = 56, Na = 74, Pa = .45, Fa = "0px 240px 0px 240px", Ia = 3500; +function La(e) { try { e?._mjrFilmstripReleaseTimer && (clearTimeout(e._mjrFilmstripReleaseTimer), e._mjrFilmstripReleaseTimer = null); } catch (e) { console.debug?.(e); } } -function Ia(e) { +function Ra(e) { if (!e) return; let t = String(e.dataset.lazySrc || "").trim(); if (t) try { @@ -6393,7 +6394,7 @@ function Ia(e) { console.debug?.(e); } } -function La(e) { +function za(e) { if (e) try { let t = e.play?.(); t && typeof t.catch == "function" && t.catch(() => {}); @@ -6401,16 +6402,16 @@ function La(e) { console.debug?.(e); } } -function Ra(e) { +function Ba(e) { if (e) try { e.pause?.(); } catch (e) { console.debug?.(e); } } -function za(e, { releaseSrc: t = !0 } = {}) { +function Va(e, { releaseSrc: t = !0 } = {}) { if (e) { - Fa(e), Ra(e); + La(e), Ba(e); try { e._mjrFilmstripInView = !1; } catch (e) { @@ -6423,11 +6424,11 @@ function za(e, { releaseSrc: t = !0 } = {}) { } } } -function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { +function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { let i = document.createElement("div"); i.className = "mjr-filmstrip", i.style.cssText = ` width: 100%; - height: ${ja}px; + height: ${Na}px; overflow-x: auto; overflow-y: hidden; background: linear-gradient(180deg, rgba(16, 20, 27, 0.82), rgba(10, 13, 18, 0.92)); @@ -6455,20 +6456,20 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } catch (e) { console.debug?.(e); } - if (i && (Fa(e), Ia(e)), i && r.intersectionRatio >= Ma && t && n ? La(e) : Ra(e), !i) { - Fa(e); + if (i && (La(e), Ra(e)), i && r.intersectionRatio >= Pa && t && n ? za(e) : Ba(e), !i) { + La(e); try { e._mjrFilmstripReleaseTimer = setTimeout(() => { try { if (!e.isConnected) { - za(e, { releaseSrc: !0 }); + Va(e, { releaseSrc: !0 }); return; } - e._mjrFilmstripInView || za(e, { releaseSrc: !0 }); + e._mjrFilmstripInView || Va(e, { releaseSrc: !0 }); } catch (e) { console.debug?.(e); } - }, Pa); + }, Ia); } catch (e) { console.debug?.(e); } @@ -6476,8 +6477,8 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } }, { root: i, - rootMargin: Na, - threshold: [0, Ma] + rootMargin: Fa, + threshold: [0, Pa] }); } catch { return null; @@ -6497,11 +6498,11 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } } }, p = ({ releaseSrc: e = !1 } = {}) => { - for (let t of Array.from(c)) za(t, { releaseSrc: e }); + for (let t of Array.from(c)) Va(t, { releaseSrc: e }); }, m = () => { for (let e of Array.from(c)) try { if (!e?._mjrFilmstripInView || !e?.isConnected) continue; - Ia(e), La(e); + Ra(e), za(e); } catch (e) { console.debug?.(e); } @@ -6551,8 +6552,8 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { let r = document.createElement("div"); r.className = "mjr-filmstrip-item", r.dataset.fidx = String(n), r.style.cssText = ` position: relative; - width: ${ka}px; - height: ${Aa}px; + width: ${ja}px; + height: ${Ma}px; border-radius: 14px; overflow: hidden; cursor: pointer; @@ -6575,7 +6576,7 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } return e.addEventListener("loadeddata", () => { try { - e._mjrFilmstripInView && i.style.display !== "none" && !document.hidden && La(e); + e._mjrFilmstripInView && i.style.display !== "none" && !document.hidden && za(e); } catch (e) { console.debug?.(e); } @@ -6585,7 +6586,7 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } catch (e) { console.debug?.(e); } - za(e, { releaseSrc: !0 }), y(r); + Va(e, { releaseSrc: !0 }), y(r); }, { once: !0 }), r.appendChild(e), S(r), f(e), r; } if (a === "audio") { @@ -6613,7 +6614,7 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { ...e, filename: r, kind: "image" - }) : Pe(r, i || null, a); + }) : Ne(r, i || null, a); } catch { return ""; } @@ -6764,11 +6765,11 @@ function Ba({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } //#endregion //#region ui/features/viewer/viewerShell.ts -function Va() { +function Ua() { let e = document.createElement("div"); return e.className = "mjr-viewer-overlay mjr-assets-manager", e.style.cssText = "\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(180deg, rgba(6, 8, 12, 0.94), rgba(5, 7, 10, 0.985));\n z-index: 10000;\n pointer-events: auto;\n display: none;\n flex-direction: column;\n box-sizing: border-box;\n overflow: hidden;\n ", e.tabIndex = -1, e.setAttribute("role", "dialog"), e; } -function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { +function Wa({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { let i = document.createElement("div"); i.className = "mjr-viewer-content-row", i.style.cssText = "\n flex: 1;\n display: flex;\n min-height: 0;\n overflow: hidden;\n min-width: 0;\n "; let a = document.createElement("div"); @@ -6795,7 +6796,7 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { top: 16px; right: 16px; bottom: 16px; - width: ${Ta}; + width: ${Da}; display: none; flex-direction: column; overflow: hidden; @@ -6817,7 +6818,7 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { top: 16px; left: 16px; bottom: 16px; - width: ${Ta}; + width: ${Da}; display: none; flex-direction: column; overflow: hidden; @@ -6835,11 +6836,11 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { x.style.cssText = "\n flex: 1;\n overflow: auto;\n padding: 14px;\n color: rgba(255,255,255,0.92);\n ", v.appendChild(y), v.appendChild(x), i.appendChild(a); let S = document.createElement("div"); S.className = "mjr-viewer-footer", S.style.cssText = "\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: rgba(13, 16, 22, 0.78);\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n color: white;\n gap: 14px 20px;\n flex-wrap: wrap;\n "; - let C = Ji("<", "Previous (Left Arrow)"); + let C = Xi("<", "Previous (Left Arrow)"); C.classList.add("mjr-viewer-nav-btn", "mjr-viewer-nav-btn--prev"), C.style.fontSize = "24px"; let w = document.createElement("span"); w.className = "mjr-viewer-index", w.style.cssText = "font-size: 14px; font-weight: 500;"; - let T = Ji(">", "Next (Right Arrow)"); + let T = Xi(">", "Next (Right Arrow)"); T.classList.add("mjr-viewer-nav-btn", "mjr-viewer-nav-btn--next"), T.style.fontSize = "24px"; let E = document.createElement("div"); E.className = "mjr-viewer-nav", E.style.cssText = "display:flex; align-items:center; gap:20px;", E.appendChild(C), E.appendChild(w), E.appendChild(T); @@ -6867,7 +6868,7 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { nextBtn: T, navBar: E, playerBarHost: D, - filmstrip: Ba({ + filmstrip: Ha({ state: e, buildAssetViewURL: t, onNavigate: n, @@ -6877,7 +6878,7 @@ function Ha({ state: e, buildAssetViewURL: t, onNavigate: n, onCompare: r }) { } //#endregion //#region ui/features/viewer/viewerOverlayDismiss.ts -function Ua({ overlay: e, requestClose: t }) { +function Ga({ overlay: e, requestClose: t }) { try { let n = null; e.addEventListener("pointerdown", (e) => { @@ -6909,20 +6910,20 @@ function Ua({ overlay: e, requestClose: t }) { } //#endregion //#region ui/components/ViewerRuntime.ts -var Wa = null, Ga = null, Ka = null, qa = null, Ja = null, Ya = null; -function Xa() { - Wa || import("./chunks/abCompare-BXOoRlmV.js").then((e) => { - Wa = e; - }), Ga || import("./chunks/sideBySide-DX0t_oIi.js").then((e) => { - Ga = e; - }), Ka || import("./chunks/model3dRenderer-DtGg_3hW.js").then((e) => e.t).then((e) => { +var Ka = null, qa = null, Ja = null, Ya = null, Xa = null, Za = null; +function Qa() { + Ka || import("./chunks/abCompare-BXOoRlmV.js").then((e) => { Ka = e; - }), qa || import("./chunks/scopes-X1iFrTle.js").then((e) => { + }), qa || import("./chunks/sideBySide-Dp8qRb0r.js").then((e) => { qa = e; - }), Ja || import("./chunks/genInfo-DPkTyDKA.js").then((e) => e.n).then((e) => { + }), Ja || import("./chunks/model3dRenderer-BtzSm2ZA.js").then((e) => e.t).then((e) => { Ja = e; - }), Ya || import("./chunks/frameExport-tksSZ7sb.js").then((e) => { + }), Ya || import("./chunks/scopes-X1iFrTle.js").then((e) => { Ya = e; + }), Xa || import("./chunks/genInfo-oNZ5Okna.js").then((e) => e.n).then((e) => { + Xa = e; + }), Za || import("./chunks/frameExport-tksSZ7sb.js").then((e) => { + Za = e; }); } var Q = { @@ -6930,12 +6931,12 @@ var Q = { AB_COMPARE: "ab", SIDE_BY_SIDE: "sidebyside" }; -function Za() { - Xa(), Oa(); - let e = Va(), t = qi(e), n = t.unsubs || [], r = Vn(); +function $a() { + Qa(), Aa(); + let e = Ua(), t = Yi(e), n = t.unsubs || [], r = Vn(); r.mode = Q.SINGLE; try { - let e = Wi(); + let e = Ki(); e && typeof e == "object" && (typeof e.analysisMode == "string" && (r.analysisMode = e.analysisMode || "none"), typeof e.loupeEnabled == "boolean" && (r.loupeEnabled = e.loupeEnabled), typeof e.probeEnabled == "boolean" && (r.probeEnabled = e.probeEnabled), typeof e.hudEnabled == "boolean" && (r.hudEnabled = e.hudEnabled), typeof e.genInfoOpen == "boolean" && (r.genInfoOpen = e.genInfoOpen), typeof e.audioVisualizerMode == "string" && (r.audioVisualizerMode = e.audioVisualizerMode || "artistic"), typeof e.abWipePercent == "number" && Number.isFinite(e.abWipePercent) && e.abWipePercent >= 0 && e.abWipePercent <= 100 && (r._abWipePercent = e.abWipePercent)); } catch (e) { console.debug?.(e); @@ -7016,38 +7017,38 @@ function Za() { return null; } } - function h() { + function g() { try { return a?.computeOneToOneZoom?.() ?? null; } catch { return null; } } - function g() { + function _() { try { a?.updateMediaNaturalSize?.(); } catch (e) { console.debug?.(e); } } - function _(e, t) { + function v(e, t) { try { return o?.createMediaElement?.(e, t) || document.createElement("div"); } catch { return document.createElement("div"); } } - function v(e, t) { + function y(e, t) { try { return o?.createCompareMediaElement?.(e, t) || document.createElement("div"); } catch { return document.createElement("div"); } } - function y() { + function b() { let e = !1; try { - let t = r.mode === Q.AB_COMPARE ? oe : r.mode === Q.SIDE_BY_SIDE ? se : ae, n = Array.from(t?.querySelectorAll?.(".mjr-viewer-audio-viz") || []); + let t = r.mode === Q.AB_COMPARE ? se : r.mode === Q.SIDE_BY_SIDE ? ce : oe, n = Array.from(t?.querySelectorAll?.(".mjr-viewer-audio-viz") || []); for (let t of n) try { let n = t?._mjrProc || null; if (!n?.setMode) continue; @@ -7060,24 +7061,24 @@ function Za() { } return e; } - let b = null, x = () => kt(), S = document.createElement("div"); - S.className = "mjr-viewer-header", S.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px 20px;\n background: var(--mjr-surface-0, rgba(0, 0, 0, 0.8));\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n color: white;\n box-sizing: border-box;\n "; - let C = document.createElement("span"); - C.className = "mjr-viewer-filename", C.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;"; - let w = document.createElement("div"); - w.className = "mjr-viewer-badges", w.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap;"; - let T = null, E = null, D = null, O = null, k = null, A = null, M = null, N = null, P = null, F = null, te = null; + let x = null, S = () => Ot(), C = document.createElement("div"); + C.className = "mjr-viewer-header", C.style.cssText = "\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 12px 20px;\n background: var(--mjr-surface-0, rgba(0, 0, 0, 0.8));\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n color: white;\n box-sizing: border-box;\n "; + let w = document.createElement("span"); + w.className = "mjr-viewer-filename", w.style.cssText = "font-size: 14px; font-weight: 500; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;"; + let T = document.createElement("div"); + T.className = "mjr-viewer-badges", T.style.cssText = "display:flex; gap:8px; align-items:center; flex-wrap:wrap;"; + let E = null, D = null, k = null, A = null, j = null, N = null, P = null, F = null, I = null, ne = null, re = null; try { - S.appendChild(C), S.appendChild(w); + C.appendChild(w), C.appendChild(T); } catch (e) { console.debug?.(e); } try { - b = ea({ + x = na({ VIEWER_MODES: Q, state: r, lifecycle: t, - getCanAB: () => Ze(), + getCanAB: () => Ye(), onToggleFullscreen: () => { try { if (document.fullscreenElement) try { @@ -7094,13 +7095,13 @@ function Za() { console.debug?.(e); } }, - onClose: () => x?.(), + onClose: () => S?.(), onMode: (e) => { try { - if (e === Q.AB_COMPARE && !Ze() || e === Q.SIDE_BY_SIDE && !Qe()) return; - r.mode = e, et(); + if (e === Q.AB_COMPARE && !Ye() || e === Q.SIDE_BY_SIDE && !Xe()) return; + r.mode = e, Qe(); try { - b?.syncToolsUIFromState?.(); + x?.syncToolsUIFromState?.(); } catch (e) { console.debug?.(e); } @@ -7138,7 +7139,7 @@ function Za() { onZoomOneToOne: () => { try { let e = () => { - let e = h(); + let e = g(); return e == null ? !1 : (u(Math.abs((Number(r.zoom) || 1) - e) < .01 ? 1 : e, { clientX: r._lastPointerX, clientY: r._lastPointerY @@ -7148,7 +7149,7 @@ function Za() { try { requestAnimationFrame(() => { try { - g(); + _(); } catch (e) { console.debug?.(e); } @@ -7167,21 +7168,21 @@ function Za() { }, onCompareModeChanged: () => { try { - r.mode === Q.AB_COMPARE && (tt(), ct()); + r.mode === Q.AB_COMPARE && ($e(), ot()); } catch (e) { console.debug?.(e); } }, onExportFrame: () => { try { - L({ toClipboard: !1 }); + qe({ toClipboard: !1 }); } catch (e) { console.debug?.(e); } }, onCopyFrame: () => { try { - L({ toClipboard: !0 }); + qe({ toClipboard: !0 }); } catch (e) { console.debug?.(e); } @@ -7190,71 +7191,71 @@ function Za() { try { let e = r.assets[r.currentIndex]; if (String(e?.kind || "") !== "audio") return; - y() || (tt(), ct()); + b() || ($e(), ot()); } catch (e) { console.debug?.(e); } }, onToolsChanged: () => { try { - b?.syncToolsUIFromState?.(); + x?.syncToolsUIFromState?.(); } catch (e) { console.debug?.(e); } try { - Gi(r); + qi(r); } catch (e) { console.debug?.(e); } try { - $e(); + Ze(); } catch (e) { console.debug?.(e); } try { if (r.mode === Q.AB_COMPARE) { let e = String(r.abCompareMode || "wipe"); - e !== "wipe" && e !== "wipeV" && oe?._mjrDiffRequest?.(); + e !== "wipe" && e !== "wipeV" && se?._mjrDiffRequest?.(); } } catch (e) { console.debug?.(e); } try { - r.probeEnabled || (ue.style.display = "none"); + r.probeEnabled || (de.style.display = "none"); } catch (e) { console.debug?.(e); } try { - r.loupeEnabled || (de.style.display = "none"); + r.loupeEnabled || (fe.style.display = "none"); } catch (e) { console.debug?.(e); } try { - Be(); + Re(); } catch (e) { console.debug?.(e); } try { - vt?.(); + gt?.(); } catch (e) { console.debug?.(e); } try { - Je(); + Ge(); } catch (e) { console.debug?.(e); } } - }), b?.headerEl && (S = b.headerEl), b?.headerTopEl && (te = b.headerTopEl), b?.filenameEl && (C = b.filenameEl), b?.badgesBarEl && (w = b.badgesBarEl), b?.filenameRightEl && (T = b.filenameRightEl), b?.badgesBarRightEl && (E = b.badgesBarRightEl), b?.leftAreaEl && (k = b.leftAreaEl), b?.leftMetaEl && (A = b.leftMetaEl), b?.centerAreaEl && (M = b.centerAreaEl), b?.rightMetaEl && (D = b.rightMetaEl), b?.rightAreaEl && (O = b.rightAreaEl), b?.titleLineEl && (N = b.titleLineEl), b?.titleWrapEl && (P = b.titleWrapEl), b?.modeButtonsEl && (F = b.modeButtonsEl); + }), x?.headerEl && (C = x.headerEl), x?.headerTopEl && (re = x.headerTopEl), x?.filenameEl && (w = x.filenameEl), x?.badgesBarEl && (T = x.badgesBarEl), x?.filenameRightEl && (E = x.filenameRightEl), x?.badgesBarRightEl && (D = x.badgesBarRightEl), x?.leftAreaEl && (j = x.leftAreaEl), x?.leftMetaEl && (N = x.leftMetaEl), x?.centerAreaEl && (P = x.centerAreaEl), x?.rightMetaEl && (k = x.rightMetaEl), x?.rightAreaEl && (A = x.rightAreaEl), x?.titleLineEl && (F = x.titleLineEl), x?.titleWrapEl && (I = x.titleWrapEl), x?.modeButtonsEl && (ne = x.modeButtonsEl); } catch (e) { console.debug?.(e); } - let { contentRow: ne, content: ie, singleView: ae, abView: oe, sideView: se, overlayLayer: ce, gridCanvas: le, probeTooltip: ue, loupeWrap: de, loupeCanvas: fe, genInfoOverlay: me, genInfoTitle: he, genInfoBody: ge, genInfoOverlayLeft: _e, genInfoTitleLeft: ve, genInfoBodyLeft: ye, footer: be, prevBtn: xe, indexInfo: Se, nextBtn: Ce, navBar: Te, playerBarHost: Ee, filmstrip: Oe } = Ha({ + let { contentRow: ie, content: ae, singleView: oe, abView: se, sideView: ce, overlayLayer: le, gridCanvas: ue, probeTooltip: de, loupeWrap: fe, loupeCanvas: pe, genInfoOverlay: L, genInfoTitle: me, genInfoBody: he, genInfoOverlayLeft: ge, genInfoTitleLeft: _e, genInfoBodyLeft: ve, footer: ye, prevBtn: be, indexInfo: xe, nextBtn: Se, navBar: Ce, playerBarHost: we, filmstrip: Te } = Wa({ state: r, - buildAssetViewURL: De, + buildAssetViewURL: Fe, onNavigate: (e) => { try { - r.compareAsset != null && (r.compareAsset = null, r.mode = Q.SINGLE), r.currentIndex = e, et(); + r.compareAsset != null && (r.compareAsset = null, r.mode = Q.SINGLE), r.currentIndex = e, Qe(); } catch (e) { console.debug?.(e); } @@ -7264,17 +7265,17 @@ function Za() { let t = Array.isArray(r.assets) ? r.assets : [], n = t[e]; if (!n || n === t[r.currentIndex]) return; if (n === r.compareAsset) { - r.compareAsset = null, r.mode = Q.SINGLE, et(); + r.compareAsset = null, r.mode = Q.SINGLE, Qe(); return; } - t.length === 2 ? (r.compareAsset = t[1 - r.currentIndex], r.mode = Ae() ? Q.SIDE_BY_SIDE : Q.AB_COMPARE) : (r.compareAsset = n, r.mode = Qe() ? Q.SIDE_BY_SIDE : Q.AB_COMPARE), et(); + t.length === 2 ? (r.compareAsset = t[1 - r.currentIndex], r.mode = De() ? Q.SIDE_BY_SIDE : Q.AB_COMPARE) : (r.compareAsset = n, r.mode = Xe() ? Q.SIDE_BY_SIDE : Q.AB_COMPARE), Qe(); } catch (e) { console.debug?.(e); } } }); - e.appendChild(S), e.appendChild(ne); - function ke() { + e.appendChild(C), e.appendChild(ie); + function Ee() { try { if (r.compareAsset) return r.compareAsset; let e = Array.isArray(r.assets) ? r.assets : []; @@ -7284,109 +7285,109 @@ function Za() { } return null; } - function Ae() { + function De() { try { let e = r.assets?.[r.currentIndex] || null; - return (Ka?.isModel3DAsset?.(e) ?? !1) || (Ka?.isModel3DAsset?.(ke()) ?? !1); + return (Ja?.isModel3DAsset?.(e) ?? !1) || (Ja?.isModel3DAsset?.(Ee()) ?? !1); } catch (e) { console.debug?.(e); } return !1; } - e.appendChild(Oe.el), e.appendChild(be), e.appendChild(me), e.appendChild(_e), Ua({ + e.appendChild(Te.el), e.appendChild(ye), e.appendChild(L), e.appendChild(ge), Ga({ overlay: e, - requestClose: () => x() + requestClose: () => S() }); - let je = oa({ + let Oe = ca({ state: r, VIEWER_MODES: Q, - APP_CONFIG: I, - getAssetMetadata: ee, - getAssetsBatch: pe - }), Me = 300 * 1e3, Ne = /* @__PURE__ */ new Map(), Pe = () => { + APP_CONFIG: z, + getAssetMetadata: M, + getAssetsBatch: ee + }), ke = 300 * 1e3, Ae = /* @__PURE__ */ new Map(), je = () => { try { let e = Date.now(); - for (let [t, n] of Ne.entries()) { + for (let [t, n] of Ae.entries()) { let r = Number(n?.at) || 0; - (!r || e - r > Me) && Ne.delete(t); + (!r || e - r > ke) && Ae.delete(t); } - if (Ne.size <= 256) return; - let t = Array.from(Ne.entries()).sort((e, t) => (Number(e?.[1]?.at) || 0) - (Number(t?.[1]?.at) || 0)), n = Ne.size - 256; + if (Ae.size <= 256) return; + let t = Array.from(Ae.entries()).sort((e, t) => (Number(e?.[1]?.at) || 0) - (Number(t?.[1]?.at) || 0)), n = Ae.size - 256; for (let e = 0; e < n; e += 1) { let n = t?.[e]?.[0]; - n != null && Ne.delete(n); + n != null && Ae.delete(n); } } catch (e) { console.debug?.(e); } - }, Fe = (e) => { + }, Me = (e) => { try { let t = String(e ?? ""); if (!t) return null; - let n = Ne.get(t); + let n = Ae.get(t); if (!n || typeof n != "object") return null; let r = Number(n?.at) || 0; - return !r || Date.now() - r > Me ? (Ne.delete(t), null) : n?.data || null; + return !r || Date.now() - r > ke ? (Ae.delete(t), null) : n?.data || null; } catch { return null; } - }, Ie = (e, t) => { + }, Ne = (e, t) => { try { let n = String(e ?? ""); if (!n || !t) return; - Ne.set(n, { + Ae.set(n, { data: t, at: Date.now() - }), Pe(); + }), je(); } catch (e) { console.debug?.(e); } - }, Le = async () => { + }, Pe = async () => { try { - await je?.hydrateVisibleMetadata?.(); + await Oe?.hydrateVisibleMetadata?.(); } catch (e) { console.debug?.(e); } }; try { - a = ca({ + a = ua({ overlay: e, - content: ie, - singleView: ae, - abView: oe, - sideView: se, + content: ae, + singleView: oe, + abView: se, + sideView: ce, state: r, VIEWER_MODES: Q, - scheduleOverlayRedraw: Be, + scheduleOverlayRedraw: Re, lifecycle: t }); } catch { a = null; } - let Re = (e, t, n) => { + let Ie = (e, t, n) => { try { e.clearRect(0, 0, t, n); } catch (e) { console.debug?.(e); } - }, ze = null; - function Be(t) { + }, Le = null; + function Re(t) { try { if (e.style.display === "none") return; if (t === !0) { - ze != null && (cancelAnimationFrame(ze), ze = null); + Le != null && (cancelAnimationFrame(Le), Le = null); try { - He(); + Be(); } catch (e) { console.debug?.(e); } return; } - if (ze != null) return; - ze = requestAnimationFrame(() => { - ze = null; + if (Le != null) return; + Le = requestAnimationFrame(() => { + Le = null; try { - He(); + Be(); } catch (e) { console.debug?.(e); } @@ -7395,24 +7396,24 @@ function Za() { console.debug?.(e); } } - let Ve = ra({ - gridCanvas: le, - content: ie, + let ze = aa({ + gridCanvas: ue, + content: ae, state: r, VIEWER_MODES: Q, getPrimaryMedia: () => { try { - if (r?.mode === Q.SINGLE) return ae?.querySelector?.(".mjr-viewer-media") || null; - if (r?.mode === Q.AB_COMPARE) return oe?.querySelector?.(".mjr-viewer-media") || null; - if (r?.mode === Q.SIDE_BY_SIDE) return se?.querySelector?.(".mjr-viewer-media") || null; + if (r?.mode === Q.SINGLE) return oe?.querySelector?.(".mjr-viewer-media") || null; + if (r?.mode === Q.AB_COMPARE) return se?.querySelector?.(".mjr-viewer-media") || null; + if (r?.mode === Q.SIDE_BY_SIDE) return ce?.querySelector?.(".mjr-viewer-media") || null; } catch (e) { console.debug?.(e); } return null; }, getViewportRect: m, - clearCanvas: Re - }), He = () => { + clearCanvas: Ie + }), Be = () => { let t = (() => { try { let e = Number(r?._panHintAt) || 0; @@ -7423,26 +7424,26 @@ function Za() { })(); try { let e = r?.mode === Q.SINGLE && !!r?.hudEnabled, n = String(r?.scopesMode || "off") !== "off", i = !!r?.overlayMaskEnabled; - le.style.display = r.gridMode === 0 && !i && !t && !e && !n ? "none" : ""; + ue.style.display = r.gridMode === 0 && !i && !t && !e && !n ? "none" : ""; } catch (e) { console.debug?.(e); } - let n = Ve.ensureCanvasSize(); + let n = ze.ensureCanvasSize(); if (n.w > 0 && n.h > 0) { if ((() => { let e = r?.mode === Q.SINGLE && !!r?.hudEnabled; return (Number(r.gridMode) || 0) !== 0 || !!r?.overlayMaskEnabled || e; - })()) Ve.redrawGrid(n); + })()) ze.redrawGrid(n); else try { - let e = le.getContext("2d"); - e && Re(e, n.w, n.h); + let e = ue.getContext("2d"); + e && Ie(e, n.w, n.h); } catch (e) { console.debug?.(e); } if (t) try { - let e = le.getContext("2d"); + let e = ue.getContext("2d"); if (e) { - let t = ie?.getBoundingClientRect?.(), i = Number(r?._panHintX), a = Number(r?._panHintY), o = t && Number.isFinite(i) ? i - t.left : n.w / 2, s = t && Number.isFinite(a) ? a - t.top : n.h * .78, c = Math.max(10, Math.min(n.w - 10, o)), l = Math.max(10, Math.min(n.h - 10, s)); + let t = ae?.getBoundingClientRect?.(), i = Number(r?._panHintX), a = Number(r?._panHintY), o = t && Number.isFinite(i) ? i - t.left : n.w / 2, s = t && Number.isFinite(a) ? a - t.top : n.h * .78, c = Math.max(10, Math.min(n.w - 10, o)), l = Math.max(10, Math.min(n.h - 10, s)); e.save(), e.font = "12px var(--comfy-font, ui-sans-serif, system-ui)", e.textAlign = "center", e.textBaseline = "middle"; let u = "Zoom in to pan", d = e.measureText(u), f = Math.min(n.w - 20, Math.max(140, d.width + 26)); e.fillStyle = "rgba(0,0,0,0.65)", e.strokeStyle = "rgba(255,255,255,0.18)", e.lineWidth = 1, e.beginPath(); @@ -7455,12 +7456,12 @@ function Za() { try { let t = String(r?.scopesMode || "off"); if (t !== "off") { - let i = le.getContext("2d"); + let i = ue.getContext("2d"); if (i) { - let a = ae; - r?.mode === Q.AB_COMPARE ? a = oe : r?.mode === Q.SIDE_BY_SIDE && (a = se); + let a = oe; + r?.mode === Q.AB_COMPARE ? a = se : r?.mode === Q.SIDE_BY_SIDE && (a = ce); let o = a?.querySelector?.("canvas.mjr-viewer-media") || e?.querySelector?.("canvas.mjr-viewer-media"); - o && o instanceof HTMLCanvasElement && qa?.drawScopesLight?.(i, { + o && o instanceof HTMLCanvasElement && Ya?.drawScopesLight?.(i, { w: n.w, h: n.h }, o, { @@ -7474,18 +7475,18 @@ function Za() { } if (r.mode !== Q.SINGLE) { try { - ue.style.display = "none"; + de.style.display = "none"; } catch (e) { console.debug?.(e); } try { - de.style.display = "none"; + fe.style.display = "none"; } catch (e) { console.debug?.(e); } } } - }, Ue = (e) => { + }, Ve = (e) => { if (e) { try { for (let t of Array.from(e.childNodes || [])) try { @@ -7502,7 +7503,7 @@ function Za() { console.debug?.(e); } } - }, Ge = () => { + }, He = () => { try { r._genInfoAbort?.abort?.(); } catch (e) { @@ -7514,18 +7515,18 @@ function Za() { } catch (e) { console.debug?.(e); } - }, Ke = async (e, { signal: t } = {}) => { + }, Ue = async (e, { signal: t } = {}) => { try { - return await Ja?.ensureViewerMetadataAsset?.(e, { - getAssetMetadata: ee, - getFileMetadataScoped: re, - metadataCache: je, + return await Xa?.ensureViewerMetadataAsset?.(e, { + getAssetMetadata: M, + getFileMetadataScoped: h, + metadataCache: Oe, signal: t }); } catch { return e; } - }, qe = (e) => { + }, We = (e) => { try { if (!e || typeof e != "object" || e?.geninfo || e?.prompt || e?.workflow || e?.metadata) return !1; if (String(e?.mime || e?.mimetype || e?.type || "").toLowerCase().startsWith("video/")) return !0; @@ -7542,18 +7543,18 @@ function Za() { } catch { return !1; } - }, Je = async () => { - let t = Ze(), n = Qe(), i = r.mode, a = !!r?.genInfoOpen && !r?.distractionFree, o = a && (i === Q.AB_COMPARE && t || i === Q.SIDE_BY_SIDE && n), s = o && i === Q.SIDE_BY_SIDE && !r?.compareAsset && (r?.assets?.length ?? 0) > 2; + }, Ge = async () => { + let t = Ye(), n = Xe(), i = r.mode, a = !!r?.genInfoOpen && !r?.distractionFree, o = a && (i === Q.AB_COMPARE && t || i === Q.SIDE_BY_SIDE && n), s = o && i === Q.SIDE_BY_SIDE && !r?.compareAsset && (r?.assets?.length ?? 0) > 2; try { - if (me.style.display = a ? "flex" : "none", _e.style.display = o ? "flex" : "none", e.style.paddingRight = a ? Ea : "0px", e.style.paddingLeft = o ? Ea : "0px", !a) { - Ge(); + if (L.style.display = a ? "flex" : "none", ge.style.display = o ? "flex" : "none", e.style.paddingRight = a ? Oa : "0px", e.style.paddingLeft = o ? Oa : "0px", !a) { + He(); try { - Ue(ge); + Ve(he); } catch (e) { console.debug?.(e); } try { - Ue(ye); + Ve(ve); } catch (e) { console.debug?.(e); } @@ -7562,7 +7563,7 @@ function Za() { } catch { return; } - Ge(); + He(); let c = (Number(r?._genInfoReqId) || 0) + 1; try { r._genInfoReqId = c; @@ -7573,25 +7574,25 @@ function Za() { r._genInfoAbort = l; let u = ({ left: e = null, leftExtra: t = null, right: n = null, rightExtra: i = null, single: a = null } = {}) => { try { - Ue(ge); + Ve(he); } catch (e) { console.debug?.(e); } try { - Ue(ye); + Ve(ve); } catch (e) { console.debug?.(e); } let s = () => { try { - r?.genInfoOpen || (r.genInfoOpen = !0), Je(); + r?.genInfoOpen || (r.genInfoOpen = !0), Ge(); } catch (e) { console.debug?.(e); } }, c = (e, t, n, r) => { if (e) try { try { - let i = Ja?.buildViewerMetadataBlocks?.({ + let i = Xa?.buildViewerMetadataBlocks?.({ title: t, asset: n, ui: { @@ -7612,14 +7613,14 @@ function Za() { 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 a = document.createElement("div"); - a.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);", a.textContent = "No generation data found for this file.", i.appendChild(a); + a.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);", a.textContent = R("viewer.noGenerationDataFile", "No generation data found for this file."), i.appendChild(a); 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 = "Raw metadata", n.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;"; + n.textContent = R("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 = ""; @@ -7638,7 +7639,7 @@ function Za() { console.debug?.(e); } }; - o ? (e && (ve.textContent = e.title || "Asset A", c(ye, t ? "Asset A" : "", e.asset, e.loading)), t && c(ye, "Asset C", t.asset, t.loading), n && (he.textContent = n.title || "Asset B", c(ge, i ? "Asset B" : "", n.asset, n.loading)), i && c(ge, "Asset D", i.asset, i.loading)) : a && (he.textContent = a.title || "Generation Info", c(ge, "", a.asset, a.loading)); + o ? (e && (_e.textContent = e.title || "Asset A", c(ve, t ? "Asset A" : "", e.asset, e.loading)), t && c(ve, "Asset C", t.asset, t.loading), n && (me.textContent = n.title || "Asset B", c(he, i ? "Asset B" : "", n.asset, n.loading)), i && c(he, "Asset D", i.asset, i.loading)) : a && (me.textContent = a.title || "Generation Info", c(he, "", a.asset, a.loading)); }; try { let e = r?.assets?.[r?.currentIndex] || null; @@ -7648,34 +7649,34 @@ function Za() { } let t = null, n = null, a = null, d = null, f = null; o ? i === Q.SIDE_BY_SIDE ? r?.compareAsset ? (t = e, n = r.compareAsset) : (t = r.assets[0] || null, n = r.assets[1] || null, s && (a = r.assets[2] || null, d = r.assets[3] || null)) : (t = e, n = r?.compareAsset || (r.assets.length === 2 ? r.assets[1 - r.currentIndex] : null)) : f = e; - let p = (e) => e ? je?.getCached?.(e.id)?.data || e : null; + let p = (e) => e ? Oe?.getCached?.(e.id)?.data || e : null; if (u({ left: o ? { title: s ? "Assets A & C" : "Asset A", asset: p(t), - loading: qe(p(t)) + loading: We(p(t)) } : null, leftExtra: s && a ? { asset: p(a), - loading: qe(p(a)) + loading: We(p(a)) } : null, right: o ? { title: s ? "Assets B & D" : "Asset B", asset: p(n), - loading: qe(p(n)) + loading: We(p(n)) } : null, rightExtra: s && d ? { asset: p(d), - loading: qe(p(d)) + loading: We(p(d)) } : null, single: o ? null : { title: "Generation Info", asset: p(f), - loading: qe(p(f)) + loading: We(p(f)) } }), r._genInfoReqId !== c) return; if (o) { - let e = t ? await Ke(t, { signal: l.signal }) : null, i = n ? await Ke(n, { signal: l.signal }) : null, o = a ? await Ke(a, { signal: l.signal }) : null, f = d ? await Ke(d, { signal: l.signal }) : null; + let e = t ? await Ue(t, { signal: l.signal }) : null, i = n ? await Ue(n, { signal: l.signal }) : null, o = a ? await Ue(a, { signal: l.signal }) : null, f = d ? await Ue(d, { signal: l.signal }) : null; if (r._genInfoReqId !== c) return; u({ left: { @@ -7698,7 +7699,7 @@ function Za() { } : null }); } else { - let e = f ? await Ke(f, { signal: l.signal }) : null; + let e = f ? await Ue(f, { signal: l.signal }) : null; if (r._genInfoReqId !== c) return; u({ single: { title: "Generation Info", @@ -7709,21 +7710,21 @@ function Za() { } catch (e) { console.debug?.(e); } - }, Ye = null; - function L(e) { + }, B = null; + function qe(e) { try { - return !Ye && Ya && (Ye = Ya.createFrameExporter({ + return !B && Za && (B = Za.createFrameExporter({ state: r, VIEWER_MODES: Q, - singleView: ae, - abView: oe, - sideView: se - })), Ye?.exportCurrentFrame?.(e); + singleView: oe, + abView: se, + sideView: ce + })), B?.exportCurrentFrame?.(e); } catch (e) { console.debug?.(e); } } - let Xe = () => { + let Je = () => { let e = (e) => { try { e && e.replaceChildren(); @@ -7731,20 +7732,20 @@ function Za() { console.debug?.(e); } }; - e(w), e(E); + e(T), e(D); let t = (e, { showName: t } = {}) => { if (!e) return null; let n = document.createElement("div"); n.className = "mjr-viewer-asset-pill", n.style.cssText = "\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 2px 8px;\n border-radius: 999px;\n border: 1px solid rgba(255,255,255,0.14);\n background: rgba(255,255,255,0.08);\n font-size: 12px;\n max-width: 360px;\n overflow: hidden;\n "; let r = document.createElement("span"); r.textContent = String(e.filename || ""), r.style.cssText = "max-width:200px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; opacity:0.95;"; - let i = Ht(e.filename, e.kind, !!e?._mjrNameCollision); + let i = Tt(e.filename, e.kind, !!e?._mjrNameCollision); try { i.style.position = "static", i.style.top = "", i.style.left = "", i.style.padding = "2px 6px", i.style.fontSize = "10px", i.style.borderRadius = "6px", i.style.pointerEvents = "none"; } catch (e) { console.debug?.(e); } - let a = Ct(e.rating || 0); + let a = dt(e.rating || 0); if (a) try { a.style.position = "static", a.style.top = "", a.style.right = "", a.style.padding = "2px 6px", a.style.fontSize = "12px"; } catch (e) { @@ -7763,16 +7764,16 @@ function Za() { console.debug?.(e); } return n; - }, n = r.mode === Q.SINGLE, i = r.mode === Q.AB_COMPARE && Ze(), a = r.mode === Q.SIDE_BY_SIDE && Qe(); - if ((i || a) && E) { + }, n = r.mode === Q.SINGLE, i = r.mode === Q.AB_COMPARE && Ye(), a = r.mode === Q.SIDE_BY_SIDE && Xe(); + if ((i || a) && D) { let e = r.assets?.[r.currentIndex] || null, n = a && r.compareAsset != null, o = i ? r.compareAsset == null ? r.assets?.[0] || null : e : n ? e : r.assets?.[0] || null, s = i ? r.compareAsset == null ? r.assets?.[1] || null : r.compareAsset : n ? r.compareAsset : r.assets?.[Math.max(0, (r.assets?.length || 1) - 1)] || null, c = t(o, { showName: !1 }), l = t(s, { showName: !1 }); try { - c && w.appendChild(c); + c && T.appendChild(c); } catch (e) { console.debug?.(e); } try { - l && E.appendChild(l); + l && D.appendChild(l); } catch (e) { console.debug?.(e); } @@ -7782,28 +7783,28 @@ function Za() { for (let e of o) { let r = t(e, { showName: !n }); if (r) try { - w.appendChild(r); + T.appendChild(r); } catch (e) { console.debug?.(e); } } }; - function Ze() { - return (r.assets.length === 2 || r.compareAsset != null) && !Ae(); + function Ye() { + return (r.assets.length === 2 || r.compareAsset != null) && !De(); } - function Qe() { + function Xe() { let e = r.assets.length; return e >= 2 && e <= 4 || e >= 1 && r.compareAsset != null; } - function $e() { + function Ze() { let t = !!r?.distractionFree; try { - S.style.display = t ? "none" : ""; + C.style.display = t ? "none" : ""; } catch (e) { console.debug?.(e); } try { - be.style.display = t ? "none" : ""; + ye.style.display = t ? "none" : ""; } catch (e) { console.debug?.(e); } @@ -7813,87 +7814,87 @@ function Za() { console.debug?.(e); } try { - t && (e.style.paddingRight = "0px", e.style.paddingLeft = "0px", me.style.display = "none", _e.style.display = "none"); + t && (e.style.paddingRight = "0px", e.style.paddingLeft = "0px", L.style.display = "none", ge.style.display = "none"); } catch (e) { console.debug?.(e); } } - function et() { + function Qe() { r.zoom = 1, r.panX = 0, r.panY = 0, r.targetZoom = 1; try { r.mode !== Q.AB_COMPARE && r.mode !== Q.SIDE_BY_SIDE && r.compareAsset != null && (r.compareAsset = null); } catch (e) { console.debug?.(e); } - let e = r.assets[r.currentIndex], t = r.mode === Q.AB_COMPARE && Ze(), n = r.mode === Q.SIDE_BY_SIDE && Qe(), i = t && r.compareAsset != null, a = n && r.compareAsset != null, o = t ? (i ? e : r.assets?.[0]) || null : n ? (a ? e : r.assets?.[0]) || null : e || null, s = t ? (i ? r.compareAsset : r.assets?.[1]) || null : n ? a ? r.compareAsset : Array.isArray(r.assets) && r.assets.length >= 2 ? r.assets[r.assets.length - 1] : null : null; + let e = r.assets[r.currentIndex], t = r.mode === Q.AB_COMPARE && Ye(), n = r.mode === Q.SIDE_BY_SIDE && Xe(), i = t && r.compareAsset != null, a = n && r.compareAsset != null, o = t ? (i ? e : r.assets?.[0]) || null : n ? (a ? e : r.assets?.[0]) || null : e || null, s = t ? (i ? r.compareAsset : r.assets?.[1]) || null : n ? a ? r.compareAsset : Array.isArray(r.assets) && r.assets.length >= 2 ? r.assets[r.assets.length - 1] : null : null; try { - C.textContent = o?.filename || ""; + w.textContent = o?.filename || ""; } catch (e) { console.debug?.(e); } try { - D && T && s && s !== o ? (D.style.display = "flex", O && (O.style.display = "flex"), T.textContent = s?.filename || "", k && A && N && (k.style.display = "flex", A.appendChild(N), N.style.justifyContent = "flex-start"), te && (te.style.justifyContent = "center", te.style.paddingLeft = "84px"), M && (M.style.flex = "0 0 auto"), P && (P.style.flex = "0 0 auto"), C && (C.style.textAlign = "left")) : D && T && (D.style.display = "none", O && (O.style.display = "none"), T.textContent = "", k && (k.style.display = "none"), P && N && F && (P.insertBefore(N, F), N.style.justifyContent = "center"), te && (te.style.justifyContent = "center", te.style.paddingLeft = "12px"), M && (M.style.flex = "1 1 auto"), P && (P.style.flex = ""), C && (C.style.textAlign = "center")); + k && E && s && s !== o ? (k.style.display = "flex", A && (A.style.display = "flex"), E.textContent = s?.filename || "", j && N && F && (j.style.display = "flex", N.appendChild(F), F.style.justifyContent = "flex-start"), re && (re.style.justifyContent = "center", re.style.paddingLeft = "84px"), P && (P.style.flex = "0 0 auto"), I && (I.style.flex = "0 0 auto"), w && (w.style.textAlign = "left")) : k && E && (k.style.display = "none", A && (A.style.display = "none"), E.textContent = "", j && (j.style.display = "none"), I && F && ne && (I.insertBefore(F, ne), F.style.justifyContent = "center"), re && (re.style.justifyContent = "center", re.style.paddingLeft = "12px"), P && (P.style.flex = "1 1 auto"), I && (I.style.flex = ""), w && (w.style.textAlign = "center")); } catch (e) { console.debug?.(e); } - r.mode === Q.AB_COMPARE && Ze() ? Se.textContent = "2 selected" : r.mode === Q.SIDE_BY_SIDE && Qe() ? Se.textContent = r.compareAsset == null ? `${r.assets.length} selected` : "2 selected" : Se.textContent = `${r.currentIndex + 1} / ${r.assets.length}`, r.mode === Q.AB_COMPARE && !Ze() && (r.mode = Qe() ? Q.SIDE_BY_SIDE : Q.SINGLE), r.mode === Q.SIDE_BY_SIDE && !Qe() && (r.mode = Q.SINGLE); + r.mode === Q.AB_COMPARE && Ye() ? xe.textContent = "2 selected" : r.mode === Q.SIDE_BY_SIDE && Xe() ? xe.textContent = r.compareAsset == null ? `${r.assets.length} selected` : "2 selected" : xe.textContent = `${r.currentIndex + 1} / ${r.assets.length}`, r.mode === Q.AB_COMPARE && !Ye() && (r.mode = Xe() ? Q.SIDE_BY_SIDE : Q.SINGLE), r.mode === Q.SIDE_BY_SIDE && !Xe() && (r.mode = Q.SINGLE); try { - b?.syncModeButtons?.({ - canAB: Ze, - canSide: Qe + x?.syncModeButtons?.({ + canAB: Ye, + canSide: Xe }); } catch (e) { console.debug?.(e); } - ae.style.display = r.mode === Q.SINGLE ? "flex" : "none", oe.style.display = r.mode === Q.AB_COMPARE ? "block" : "none", se.style.display = r.mode === Q.SIDE_BY_SIDE ? "flex" : "none"; + oe.style.display = r.mode === Q.SINGLE ? "flex" : "none", se.style.display = r.mode === Q.AB_COMPARE ? "block" : "none", ce.style.display = r.mode === Q.SIDE_BY_SIDE ? "flex" : "none"; try { - r.mode !== Q.SINGLE && (Ki(ae), ae.replaceChildren()); + r.mode !== Q.SINGLE && (Ji(oe), oe.replaceChildren()); } catch (e) { console.debug?.(e); } try { - r.mode !== Q.AB_COMPARE && (Ki(oe), oe.replaceChildren()); + r.mode !== Q.AB_COMPARE && (Ji(se), se.replaceChildren()); } catch (e) { console.debug?.(e); } try { - r.mode !== Q.SIDE_BY_SIDE && (Ki(se), se.replaceChildren()); + r.mode !== Q.SIDE_BY_SIDE && (Ji(ce), ce.replaceChildren()); } catch (e) { console.debug?.(e); } - Xe(); - let c = r.mode === Q.AB_COMPARE && Ze() || r.mode === Q.SIDE_BY_SIDE && Qe(); + Je(); + let c = r.mode === Q.AB_COMPARE && Ye() || r.mode === Q.SIDE_BY_SIDE && Xe(); try { - xe.style.display = c ? "none" : "", Ce.style.display = c ? "none" : ""; + be.style.display = c ? "none" : "", Se.style.display = c ? "none" : ""; } catch (e) { console.debug?.(e); } - tt(), nt(r.assets, r.currentIndex), ct(); + $e(), et(r.assets, r.currentIndex), ot(); try { - b?.syncToolsUIFromState?.(); + x?.syncToolsUIFromState?.(); } catch (e) { console.debug?.(e); } try { - $e(); + Ze(); } catch (e) { console.debug?.(e); } try { - vt?.(); + gt?.(); } catch (e) { console.debug?.(e); } - Be(); + Re(); try { - Je(); + Ge(); } catch (e) { console.debug?.(e); } try { - Le().then(() => { + Pe().then(() => { try { - Xe(); + Je(); } catch (e) { console.debug?.(e); } @@ -7903,25 +7904,25 @@ function Za() { } try { let e = r.mode === Q.SINGLE; - Oe.sync({ isSingle: e }); + Te.sync({ isSingle: e }); } catch (e) { console.debug?.(e); } } - function tt() { + function $e() { let e = r.assets[r.currentIndex]; if (!e) return; - let t = De(e); + let t = Fe(e); if (!t) { try { - Ki(ae); + Ji(oe); } catch (e) { console.debug?.(e); } try { - ae.replaceChildren(); + oe.replaceChildren(); let e = document.createElement("div"); - e.className = "mjr-viewer-media", e.style.cssText = "color:#ff9a9a; font-size:13px; padding:16px; text-align:center;", e.textContent = "Cannot open asset: missing or invalid filename/path.", ae.appendChild(e); + e.className = "mjr-viewer-media", e.style.cssText = "color:#ff9a9a; font-size:13px; padding:16px; text-align:center;", e.textContent = "Cannot open asset: missing or invalid filename/path.", oe.appendChild(e); } catch (e) { console.debug?.(e); } @@ -7929,64 +7930,64 @@ function Za() { } if (r.mode === Q.SINGLE) { try { - Ki(ae); + Ji(oe); } catch (e) { console.debug?.(e); } - ae.innerHTML = "", r._mediaW = 0, r._mediaH = 0; - let n = _(e, t); - ae.appendChild(n); - } else r.mode === Q.AB_COMPARE ? Ze() && Wa?.renderABCompareView?.({ - abView: oe, + oe.innerHTML = "", r._mediaW = 0, r._mediaH = 0; + let n = v(e, t); + oe.appendChild(n); + } else r.mode === Q.AB_COMPARE ? Ye() && Ka?.renderABCompareView?.({ + abView: se, state: r, currentAsset: e, viewUrl: t, - buildAssetViewURL: De, - createCompareMediaElement: v, - destroyMediaProcessorsIn: Ki - }) : r.mode === Q.SIDE_BY_SIDE && Qe() && Ga?.renderSideBySideView?.({ - sideView: se, + buildAssetViewURL: Fe, + createCompareMediaElement: y, + destroyMediaProcessorsIn: Ji + }) : r.mode === Q.SIDE_BY_SIDE && Xe() && qa?.renderSideBySideView?.({ + sideView: ce, state: r, currentAsset: e, viewUrl: t, - buildAssetViewURL: De, - createMediaElement: _, - destroyMediaProcessorsIn: Ki + buildAssetViewURL: Fe, + createMediaElement: v, + destroyMediaProcessorsIn: Ji }); l(), d(); } - let { preloadAdjacentAssets: nt, preloadImageForAsset: it, trackPreloadRef: at } = Sa({ - buildAssetViewURL: De, + let { preloadAdjacentAssets: et, preloadImageForAsset: tt, trackPreloadRef: nt } = wa({ + buildAssetViewURL: Fe, IMAGE_PRELOAD_EXTENSIONS: i, state: r - }), { destroyPlayerBar: ot, syncPlayerBar: st } = wa({ + }), { destroyPlayerBar: rt, syncPlayerBar: it } = Ea({ state: r, - APP_CONFIG: I, + APP_CONFIG: z, VIEWER_MODES: Q, overlay: e, - navBar: Te, - playerBarHost: Ee, - singleView: ae, - abView: oe, - sideView: se, - metadataHydrator: je, + navBar: Ce, + playerBarHost: we, + singleView: oe, + abView: se, + sideView: ce, + metadataHydrator: Oe, isPlayableViewerKind: en, collectPlayableMediaElements: un, pickPrimaryPlayableMedia: on, mountUnifiedMediaControls: tn, installFollowerVideoSync: cn, - getViewerInfo: j, - scheduleOverlayRedraw: Be, - viewerInfoCacheGet: Fe, - viewerInfoCacheSet: Ie - }), ct = () => st(), lt = I.VIEWER_MAX_PROC_PIXELS ?? 12e6, dt = () => ({ + getViewerInfo: te, + scheduleOverlayRedraw: Re, + viewerInfoCacheGet: Me, + viewerInfoCacheSet: Ne + }), ot = () => it(), st = z.VIEWER_MAX_PROC_PIXELS ?? 12e6, ct = () => ({ exposureEV: Number(r.exposureEV) || 0, gamma: Math.max(.1, Math.min(3, Number(r.gamma) || 1)), channel: r.channel || "rgb", analysisMode: r.analysisMode || "none", zebraThreshold: Math.max(0, Math.min(1, Number(r.zebraThreshold) || .95)) - }), ft = () => { - let t = dt(); + }), lt = () => { + let t = ct(); try { let n = e.querySelectorAll(".mjr-viewer-media"); for (let e of n) try { @@ -7999,11 +8000,11 @@ function Za() { console.debug?.(e); } try { - r?.mode === Q.AB_COMPARE && oe?._mjrDiffRequest?.(); + r?.mode === Q.AB_COMPARE && se?._mjrDiffRequest?.(); } catch (e) { console.debug?.(e); } - }, pt = (e) => { + }, ft = (e) => { try { if (!e) return !0; let t = Number(e.exposureEV) || 0, n = Number(e.gamma) || 1, r = String(e.channel || "rgb"), i = String(e.analysisMode || "none"); @@ -8011,41 +8012,41 @@ function Za() { } catch { return !0; } - }, mt = I.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, gt = I.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15; + }, pt = z.VIEWER_MAX_PROC_PIXELS_VIDEO ?? 3e6, mt = z.VIEWER_VIDEO_GRADE_THROTTLE_FPS ?? 15; try { - o = xa({ + o = Ca({ overlay: e, state: r, mediaTransform: s, - updateMediaNaturalSize: g, + updateMediaNaturalSize: _, clampPanToBounds: c, applyTransform: l, - scheduleOverlayRedraw: Be, - getGradeParams: dt, - isDefaultGrade: pt, + scheduleOverlayRedraw: Re, + getGradeParams: ct, + isDefaultGrade: ft, tonemap: null, - maxProcPixels: lt, - maxProcPixelsVideo: mt, - disableWebGL: !!I.VIEWER_DISABLE_WEBGL_VIDEO, - videoGradeThrottleFps: gt, - safeAddListener: z, - safeCall: R + maxProcPixels: st, + maxProcPixelsVideo: pt, + disableWebGL: !!z.VIEWER_DISABLE_WEBGL_VIDEO, + videoGradeThrottleFps: mt, + safeAddListener: wt, + safeCall: V }); } catch { o = null; } - n.push(z(xe, "click", () => { - r.currentIndex > 0 && (r.currentIndex--, et()); - })), n.push(z(Ce, "click", () => { - r.currentIndex < r.assets.length - 1 && (r.currentIndex++, et()); + n.push(wt(be, "click", () => { + r.currentIndex > 0 && (r.currentIndex--, Qe()); + })), n.push(wt(Se, "click", () => { + r.currentIndex < r.assets.length - 1 && (r.currentIndex++, Qe()); })); - let _t = null, vt = () => { + let ht = null, gt = () => { try { - if (_t != null) return; - _t = requestAnimationFrame(() => { - _t = null; + if (ht != null) return; + ht = requestAnimationFrame(() => { + ht = null; try { - ft(); + lt(); } catch (e) { console.debug?.(e); } @@ -8053,17 +8054,17 @@ function Za() { } catch (e) { console.debug?.(e); } - }, yt = () => { + }, _t = () => { try { - b?.syncToolsUIFromState?.(); + x?.syncToolsUIFromState?.(); } catch (e) { console.debug?.(e); } - }, bt = (e) => { + }, vt = (e) => { if (!Array.isArray(r.assets) || r.assets.length === 0) return !1; let t = r.currentIndex + e; - return t < 0 || t >= r.assets.length ? !1 : (r.currentIndex = t, et(), !0); - }, xt = (t) => { + return t < 0 || t >= r.assets.length ? !1 : (r.currentIndex = t, Qe(), !0); + }, yt = (t) => { if (e.style.display === "none") return; try { let e = t.target; @@ -8072,12 +8073,12 @@ function Za() { console.debug?.(e); } try { - if (!ie.contains(t.target)) return; + if (!ae.contains(t.target)) return; } catch (e) { console.debug?.(e); } try { - if (Ka?.isModel3DInteractionTarget?.(t?.target)) return; + if (Ja?.isModel3DInteractionTarget?.(t?.target)) return; } catch (e) { console.debug?.(e); } @@ -8087,43 +8088,43 @@ function Za() { console.debug?.(e); } let n = Number(t.deltaX) || 0, i = Number(t.deltaY) || 0; - if (t.shiftKey && i && bt(i > 0 ? 1 : -1) || Math.abs(n) > Math.abs(i) && Math.abs(n) > 30 && bt(n > 0 ? 1 : -1) || !i) return; + if (t.shiftKey && i && vt(i > 0 ? 1 : -1) || Math.abs(n) > Math.abs(i) && Math.abs(n) > 30 && vt(n > 0 ? 1 : -1) || !i) return; let a = Math.exp(-i * .0015); u((Number(r.zoom) || 1) * a, { clientX: t.clientX, clientY: t.clientY }); - }, St = (e, t, n, { offsetX: r = 16, offsetY: i = 16 } = {}) => { + }, bt = (e, t, n, { offsetX: r = 16, offsetY: i = 16 } = {}) => { try { let a = m(); if (!a) return; - let o = ie.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; + let o = ae.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`; } catch (e) { console.debug?.(e); } - }, wt = ia({ + }, xt = oa({ overlay: e, - content: ie, + content: ae, state: r, VIEWER_MODES: Q, getPrimaryMedia: f, getMediaNaturalSize: p, getViewportRect: m, - positionOverlayBox: St, - probeTooltip: ue, - loupeWrap: de, - onLoupeRedraw: aa({ + positionOverlayBox: bt, + probeTooltip: de, + loupeWrap: fe, + onLoupeRedraw: sa({ state: r, - loupeCanvas: fe, - loupeWrap: de, + loupeCanvas: pe, + loupeWrap: fe, getMediaNaturalSize: p, - positionOverlayBox: St + positionOverlayBox: bt }).redraw, lifecycle: t }); try { - if (!ie._mjrOverlayResizeBound && "ResizeObserver" in window) { + if (!ae._mjrOverlayResizeBound && "ResizeObserver" in window) { try { e._mjrResizeObserver?.disconnect?.(); } catch (e) { @@ -8135,10 +8136,10 @@ function Za() { } catch (e) { console.debug?.(e); } - Be(); + Re(); }); try { - t.observe(ie); + t.observe(ae); } catch (e) { console.debug?.(e); } @@ -8148,32 +8149,32 @@ function Za() { } catch (e) { console.debug?.(e); } - }), ie._mjrOverlayResizeBound = !0; + }), ae._mjrOverlayResizeBound = !0; } } catch (e) { console.debug?.(e); } - let Tt = na({ + let St = ia({ overlay: e, - content: ie, - singleView: ae, + content: ae, + singleView: oe, state: r, VIEWER_MODES: Q, - computeOneToOneZoom: h, + computeOneToOneZoom: g, setZoom: u, - scheduleOverlayRedraw: Be, - scheduleApplyGrade: vt, - syncToolsUIFromState: yt, - applyDistractionFreeUI: $e, - navigateViewerAssets: bt, - closeViewer: kt, - renderBadges: Xe, - updateAssetRating: we, - safeDispatchCustomEvent: ht, - ASSET_RATING_CHANGED_EVENT: qt, - probeTooltip: ue, - loupeWrap: de, - renderGenInfoPanel: Je, + scheduleOverlayRedraw: Re, + scheduleApplyGrade: gt, + syncToolsUIFromState: _t, + applyDistractionFreeUI: Ze, + navigateViewerAssets: vt, + closeViewer: Ot, + renderBadges: Je, + updateAssetRating: O, + safeDispatchCustomEvent: kt, + ASSET_RATING_CHANGED_EVENT: Zt, + probeTooltip: de, + loupeWrap: fe, + renderGenInfoPanel: Ge, getVideoControls: () => { try { return r?._videoControlsMounted || null; @@ -8182,34 +8183,34 @@ function Za() { } }, lifecycle: t - }), Et = [], Dt = () => { + }), Ct = [], Et = () => { try { - for (let e of Et) R(e); + for (let e of Ct) V(e); } catch (e) { console.debug?.(e); } - Et = []; + Ct = []; try { - Tt?.unbind?.(); + St?.unbind?.(); } catch (e) { console.debug?.(e); } - }, Ot = () => { - Dt(); + }, Dt = () => { + Et(); try { - Et.push(z(e, "click", (t) => { + Ct.push(wt(e, "click", (t) => { try { if (t.target !== e) return; } catch (e) { console.debug?.(e); } - kt(); + Ot(); })); } catch (e) { console.debug?.(e); } try { - Et.push(z(ie, "wheel", xt, { + Ct.push(wt(ae, "wheel", yt, { passive: !1, capture: !0 })); @@ -8218,7 +8219,7 @@ function Za() { } try { let e = null; - Et.push(z(ie, "touchstart", (t) => { + Ct.push(wt(ae, "touchstart", (t) => { try { if (t.touches?.length !== 1) return; let n = t.touches[0]; @@ -8230,7 +8231,7 @@ function Za() { } catch (e) { console.debug?.(e); } - }, { passive: !0 })), Et.push(z(ie, "touchend", (t) => { + }, { passive: !0 })), Ct.push(wt(ae, "touchend", (t) => { try { if (!e) return; if (t.changedTouches?.length !== 1) { @@ -8239,18 +8240,18 @@ function Za() { } let n = t.changedTouches[0], r = n.clientX - e.x, i = n.clientY - e.y, a = Date.now() - e.t; if (e = null, a > 600 || Math.abs(i) > 80) return; - Math.abs(r) >= 60 && bt(r < 0 ? 1 : -1); + Math.abs(r) >= 60 && vt(r < 0 ? 1 : -1); } catch (e) { console.debug?.(e); } - }, { passive: !0 })), Et.push(z(ie, "touchcancel", () => { + }, { passive: !0 })), Ct.push(wt(ae, "touchcancel", () => { e = null; }, { passive: !0 })); } catch (e) { console.debug?.(e); } try { - Et.push(z(ie, "mousemove", (e) => { + Ct.push(wt(ae, "mousemove", (e) => { try { r._lastPointerX = e.clientX, r._lastPointerY = e.clientY; } catch (e) { @@ -8264,37 +8265,37 @@ function Za() { console.debug?.(e); } try { - Tt?.bind?.(); + St?.bind?.(); } catch (e) { console.debug?.(e); } }; try { - e._mjrBadgeSyncBound ||= (n.push(z(window, qt, (e) => { + e._mjrBadgeSyncBound ||= (n.push(wt(window, Zt, (e) => { try { let t = e?.detail?.assetId, n = e?.detail?.rating; if (t == null) return; for (let e of r.assets || []) e?.id != null && String(e.id) === String(t) && (e.rating = n); try { - je?.deleteCached?.(t); + Oe?.deleteCached?.(t); } catch (e) { console.debug?.(e); } - Xe(); + Je(); } catch (e) { console.debug?.(e); } - }, { passive: !0 })), n.push(z(window, Kt, (e) => { + }, { passive: !0 })), n.push(wt(window, Xt, (e) => { try { let t = e?.detail?.assetId, n = e?.detail?.tags; if (t == null) return; for (let e of r.assets || []) e?.id != null && String(e.id) === String(t) && (e.tags = n); try { - je?.deleteCached?.(t); + Oe?.deleteCached?.(t); } catch (e) { console.debug?.(e); } - Xe(); + Je(); } catch (e) { console.debug?.(e); } @@ -8302,19 +8303,19 @@ function Za() { } catch (e) { console.debug?.(e); } - function kt() { + function Ot() { try { - r.distractionFree = !1, $e(); + r.distractionFree = !1, Ze(); } catch (e) { console.debug?.(e); } try { - je?.abort?.(); + Oe?.abort?.(); } catch (e) { console.debug?.(e); } try { - ot(); + rt(); } catch (e) { console.debug?.(e); } @@ -8335,43 +8336,43 @@ function Za() { } catch (e) { console.debug?.(e); } - try { - oe?._mjrSyncAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - oe?._mjrDiffAbort?.abort?.(); - } catch (e) { - console.debug?.(e); - } - try { - oe._mjrSyncAbort = null; - } catch (e) { - console.debug?.(e); - } - try { - oe._mjrDiffAbort = null; - } catch (e) { - console.debug?.(e); - } try { se?._mjrSyncAbort?.abort?.(); } catch (e) { console.debug?.(e); } + try { + se?._mjrDiffAbort?.abort?.(); + } catch (e) { + console.debug?.(e); + } try { se._mjrSyncAbort = null; } catch (e) { console.debug?.(e); } try { - oe?._mjrSliderAbort?.abort?.(); + se._mjrDiffAbort = null; } catch (e) { console.debug?.(e); } try { - oe._mjrSliderAbort = null; + ce?._mjrSyncAbort?.abort?.(); + } catch (e) { + console.debug?.(e); + } + try { + ce._mjrSyncAbort = null; + } catch (e) { + console.debug?.(e); + } + try { + se?._mjrSliderAbort?.abort?.(); + } catch (e) { + console.debug?.(e); + } + try { + se._mjrSliderAbort = null; } catch (e) { console.debug?.(e); } @@ -8418,17 +8419,17 @@ function Za() { console.debug?.(e); } try { - Ki(ae), ae.replaceChildren(); + Ji(oe), oe.replaceChildren(); } catch (e) { console.debug?.(e); } try { - Ki(oe), oe.replaceChildren(); + Ji(se), se.replaceChildren(); } catch (e) { console.debug?.(e); } try { - Ki(se), se.replaceChildren(); + Ji(ce), ce.replaceChildren(); } catch (e) { console.debug?.(e); } @@ -8438,21 +8439,21 @@ function Za() { console.debug?.(e); } try { - Ge(); + He(); } catch (e) { console.debug?.(e); } try { - me.style.display = "none", Ue(ge); + L.style.display = "none", Ve(he); } catch (e) { console.debug?.(e); } try { - _e.style.display = "none", Ue(ye); + ge.style.display = "none", Ve(ve); } catch (e) { console.debug?.(e); } - e.style.display = "none", e.style.pointerEvents = "none", Dt(); + e.style.display = "none", e.style.pointerEvents = "none", Et(); try { document.body.style.overflow = r._prevBodyOverflow ?? ""; } catch { @@ -8464,13 +8465,13 @@ function Za() { console.debug?.(e); } let t = r?._prevHotkeyScope; - rt(t || "panel"), r._prevHotkeyScope = null; + at(t || "panel"), r._prevHotkeyScope = null; } let At = { open(t, n = 0, i = null) { - Ot(), r.assets = Array.isArray(t) ? t : [t], r.currentIndex = Math.max(0, Math.min(n, r.assets.length - 1)), r.distractionFree = !1; + Dt(), r.assets = Array.isArray(t) ? t : [t], r.currentIndex = Math.max(0, Math.min(n, r.assets.length - 1)), r.distractionFree = !1; try { - Oe.rebuild(); + Te.rebuild(); } catch (e) { console.debug?.(e); } @@ -8480,14 +8481,14 @@ function Za() { } catch (e) { console.debug?.(e); } - r._panHintTimer = null, r._lastPointerX = null, r._lastPointerY = null, r._mediaW = 0, r._mediaH = 0, r.compareAsset = i, r.gridMode = 0, Ge(), r._probe = null; + r._panHintTimer = null, r._lastPointerX = null, r._lastPointerY = null, r._mediaW = 0, r._mediaH = 0, r.compareAsset = i, r.gridMode = 0, He(), r._probe = null; try { - ue.style.display = "none"; + de.style.display = "none"; } catch (e) { console.debug?.(e); } try { - de.style.display = "none"; + fe.style.display = "none"; } catch (e) { console.debug?.(e); } @@ -8503,71 +8504,71 @@ function Za() { } catch { r._prevBodyOverflow = ""; } - document.body.style.overflow = "hidden", r._prevHotkeyScope = We().scope || null, rt("viewer"), et(); + document.body.style.overflow = "hidden", r._prevHotkeyScope = Ke().scope || null, at("viewer"), Qe(); try { - yt(); + _t(); } catch (e) { console.debug?.(e); } try { - vt(); + gt(); } catch (e) { console.debug?.(e); } - Be(); + Re(); }, close() { - kt(); + Ot(); }, setMode(e) { - Object.values(Q).includes(e) && (r.mode = e, et()); + Object.values(Q).includes(e) && (r.mode = e, Qe()); }, setCompareAsset(e) { - r.compareAsset = e, et(); + r.compareAsset = e, Qe(); }, dispose() { try { - kt(); + Ot(); } catch (e) { console.debug?.(e); } try { - Ne.clear(); + Ae.clear(); } catch (e) { console.debug?.(e); } try { - Ki(ae); + Ji(oe); } catch (e) { console.debug?.(e); } try { - Ki(oe); + Ji(se); } catch (e) { console.debug?.(e); } try { - Ki(se); + Ji(ce); } catch (e) { console.debug?.(e); } try { - ze != null && cancelAnimationFrame(ze); + Le != null && cancelAnimationFrame(Le); } catch (e) { console.debug?.(e); } try { - _t != null && cancelAnimationFrame(_t); + ht != null && cancelAnimationFrame(ht); } catch (e) { console.debug?.(e); } try { - wt?.dispose?.(); + xt?.dispose?.(); } catch (e) { console.debug?.(e); } try { - Tt?.dispose?.(); + St?.dispose?.(); } catch (e) { console.debug?.(e); } @@ -8582,17 +8583,17 @@ function Za() { console.debug?.(e); } try { - je?.dispose?.(); + Oe?.dispose?.(); } catch (e) { console.debug?.(e); } try { - Hi(e); + Wi(e); } catch (e) { console.debug?.(e); } try { - for (let t of e._mjrViewerUnsubs || []) R(t); + for (let t of e._mjrViewerUnsubs || []) V(t); } catch (e) { console.debug?.(e); } @@ -8619,19 +8620,19 @@ function Za() { } }; try { - x = () => At.close(); + S = () => At.close(); } catch (e) { console.debug?.(e); } e._mjrViewerAPI = At; try { - Vi({ + Ui({ overlayEl: e, getCurrentAsset: () => r.assets[r.currentIndex], - getCurrentViewUrl: (e) => De(e), + getCurrentViewUrl: (e) => Fe(e), onAssetChanged: () => { try { - Xe(); + Je(); } catch (e) { console.debug?.(e); } @@ -8642,35 +8643,35 @@ function Za() { } return e; } -function Qa() { - return Ca(Za); +function eo() { + return Ta($a); } //#endregion //#region ui/features/viewer/viewerOpenRequest.ts -function $a(e) { +function to(e) { let t = String(e || "").trim().toLowerCase(); return t === "ab" || t === "sidebyside" ? t : ""; } -function eo(e, t) { +function no(e, t) { let n = Array.isArray(e) ? e.filter(Boolean) : []; return n.length ? n : t ? [t] : []; } -function to({ assets: e = [], asset: t = null, index: n = 0, mode: r = "" } = {}) { - let i = eo(e, t); +function ro({ assets: e = [], asset: t = null, index: n = 0, mode: r = "" } = {}) { + let i = no(e, t); if (!i.length) return !1; - let a = Math.max(0, Math.min(Number(n) || 0, i.length - 1)), o = $a(r), s = { + let a = Math.max(0, Math.min(Number(n) || 0, i.length - 1)), o = to(r), s = { assets: i, index: a, mode: o, handled: !1 }; try { - if (window.dispatchEvent(new CustomEvent(B.OPEN_VIEWER, { detail: s })), s.handled === !0) return !0; + if (window.dispatchEvent(new CustomEvent(H.OPEN_VIEWER, { detail: s })), s.handled === !0) return !0; } catch (e) { console.debug?.(e); } try { - let e = Qa(); + let e = eo(); return e.open(i, a), o && e.setMode?.(o), !0; } catch (e) { console.debug?.(e); @@ -8679,7 +8680,7 @@ function to({ assets: e = [], asset: t = null, index: n = 0, mode: r = "" } = {} } //#endregion //#region ui/features/panel/views/popoverManager.ts -function no(e, t) { +function io(e, t) { if (!e || !t?.size) return !1; for (let n of t.values()) { let t = n?.popover || null; @@ -8694,7 +8695,7 @@ function no(e, t) { } return !1; } -function ro(e) { +function ao(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 = (e, t = "y") => { if (!e) return !1; let n = globalThis.getComputedStyle?.(e), r = String(t === "x" ? n?.overflowX || n?.overflow || "" : n?.overflowY || n?.overflow || ""); @@ -8780,7 +8781,7 @@ function ro(e) { for (let e of t.values()) g(e.popover, e.anchor); })); }, v = (e) => { - no(e?.target, t) || _(); + io(e?.target, t) || _(); }, y = () => { if (t.size) { try { @@ -8977,7 +8978,7 @@ function ro(e) { } //#endregion //#region ui/features/grid/GridKeyboard.ts -var io = { +var oo = { OPEN_VIEWER: { key: "Enter", description: "Open selected in viewer" @@ -9094,25 +9095,25 @@ var io = { description: "Navigate right" } }; -function ao(e) { +function so(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 oo(e, t) { +function co(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 so = /* @__PURE__ */ new Map(); -function co(e, t, n) { - let i = e?.id; - if (!i) return; - let a = String(i); +var lo = /* @__PURE__ */ new Map(); +function uo(e, t, n) { + let r = e?.id; + if (!r) return; + let i = String(r); try { - let e = so.get(a); + let e = lo.get(i); e && clearTimeout(e); } catch (e) { console.debug?.(e); @@ -9122,138 +9123,138 @@ function co(e, t, n) { } catch (e) { console.debug?.(e); } - let o = setTimeout(async () => { + let a = setTimeout(async () => { try { - so.delete(a); - let e = await we(i, t); + lo.delete(i); + let e = await O(r, t); if (!e?.ok) { - s(e?.error || r("toast.ratingUpdateFailed"), "error"); + m(e?.error || R("toast.ratingUpdateFailed"), "error"); return; } - s(r("toast.ratingSetN", { n: t }), "success", 1500), ht(qt, { - assetId: String(i), + m(R("toast.ratingSetN", { n: t }), "success", 1500), kt(Zt, { + assetId: String(r), rating: t }, { warnPrefix: "[GridKeyboard]" }); } catch (e) { - console.error("[GridKeyboard] Rating update failed:", e), s(r("toast.ratingUpdateError"), "error"); + console.error("[GridKeyboard] Rating update failed:", e), m(R("toast.ratingUpdateError"), "error"); } }, 350); - so.set(a, o); + lo.set(i, a); } -function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = () => [], getActiveAsset: i = () => null, onOpenDetails: a = () => {}, onOpenTagsEditor: o = () => {}, onSelectionChanged: c = () => {}, onAssetChanged: l = () => {} } = {}) { - if (!e) return { +function fo({ gridContainer: t, getState: n = () => ({}), getSelectedAssets: r = () => [], getActiveAsset: a = () => null, onOpenDetails: o = () => {}, onOpenTagsEditor: s = () => {}, onSelectionChanged: c = () => {}, onAssetChanged: l = () => {} } = {}) { + 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 = "" } = {}) => { - to({ + let u = null, f = null, p = null, h = null, g = !1, _ = !1, v = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => { + ro({ assets: e, index: t, mode: n }); - }, _ = () => { - try { - He(e); - } catch (e) { - console.debug?.(e); - } - try { - window.__MJR_LAST_SELECTION_GRID__ = e; - } catch (e) { - console.debug?.(e); - } }, y = () => { try { - return n() || []; - } catch { - return []; + We(t); + } catch (e) { + console.debug?.(e); + } + try { + window.__MJR_LAST_SELECTION_GRID__ = t; + } catch (e) { + console.debug?.(e); } }, b = () => { try { - if (typeof e?._mjrGetRenderedCards == "function") { - let t = e._mjrGetRenderedCards(); - if (Array.isArray(t)) return t; + return r() || []; + } catch { + return []; + } + }, x = () => { + try { + if (typeof t?._mjrGetRenderedCards == "function") { + let e = t._mjrGetRenderedCards(); + if (Array.isArray(e)) return e; } } catch (e) { console.debug?.(e); } try { - return Array.from(e.querySelectorAll(".mjr-asset-card")); + return Array.from(t.querySelectorAll(".mjr-asset-card")); } catch { return []; } }, S = () => { try { - return i() || y()[0] || null; + return a() || b()[0] || null; } catch { return null; } }, C = (e) => { if (!e?.filepath) return !1; - let t = ze(e.filepath), n = document.createElement("a"); - return n.href = t, n.download = e.filename || "download", document.body.appendChild(n), n.click(), document.body.removeChild(n), s(r("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3), !0; - }, w = () => { + let t = ye(e.filepath), n = document.createElement("a"); + return n.href = t, n.download = e.filename || "download", document.body.appendChild(n), n.click(), document.body.removeChild(n), m(R("toast.downloadingFile", "Downloading {filename}...", { filename: e.filename }), "info", 3e3), !0; + }, T = () => { try { - if (Array.isArray(t?.()?.assets) && t().assets.length) return t().assets; + if (Array.isArray(n?.()?.assets) && n().assets.length) return n().assets; } catch (e) { console.debug?.(e); } try { - if (typeof e?._mjrGetAssets == "function") { - let t = e._mjrGetAssets(); - if (Array.isArray(t) && t.length) return t; + if (typeof t?._mjrGetAssets == "function") { + let e = t._mjrGetAssets(); + if (Array.isArray(e) && e.length) return e; } } catch (e) { console.debug?.(e); } try { - return b().map((e) => e?._mjrAsset).filter(Boolean); + return x().map((e) => e?._mjrAsset).filter(Boolean); } catch { return []; } - }, T = () => { + }, E = () => { try { - let t = b(); - if (t.length >= 2) { - let e = Math.round(t[0].getBoundingClientRect().top), n = t.filter((t) => { + let e = x(); + if (e.length >= 2) { + let t = Math.round(e[0].getBoundingClientRect().top), n = e.filter((e) => { try { - return Math.abs(Math.round(t.getBoundingClientRect().top) - e) <= 4; + return Math.abs(Math.round(e.getBoundingClientRect().top) - t) <= 4; } catch { return !1; } }); if (n.length >= 1) return Math.max(1, n.length); } - if (t.length >= 1) { - let n = t[0].getBoundingClientRect(), r = e.getBoundingClientRect(), i = Math.max(1, Math.round(n.width)), a = Math.max(1, Math.round(r.width)); + if (e.length >= 1) { + let n = e[0].getBoundingClientRect(), r = t.getBoundingClientRect(), i = Math.max(1, Math.round(n.width)), a = Math.max(1, Math.round(r.width)); return Math.max(1, Math.floor(a / i)); } } catch (e) { console.debug?.(e); } return 1; - }, D = (t, n) => { - let r = Array.isArray(t) ? t.map(String).filter(Boolean) : [], i = String(n || r[0] || ""); + }, D = (e, n) => { + let r = Array.isArray(e) ? e.map(String).filter(Boolean) : [], i = String(n || r[0] || ""); try { - typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection(r, i) : (e.dataset.mjrSelectedAssetIds = JSON.stringify(r), e.dataset.mjrSelectedAssetId = i); + typeof t?._mjrSetSelection == "function" ? t._mjrSetSelection(r, i) : (t.dataset.mjrSelectedAssetIds = JSON.stringify(r), t.dataset.mjrSelectedAssetId = i); } catch (e) { console.debug?.(e); } - }, O = (t) => { - let n = String(t || "").trim(); + }, O = (e) => { + let n = String(e || "").trim(); if (n) { try { - if (typeof e?._mjrScrollToAssetId == "function") { - e._mjrScrollToAssetId(n); + if (typeof t?._mjrScrollToAssetId == "function") { + t._mjrScrollToAssetId(n); return; } } catch (e) { console.debug?.(e); } try { - let t = typeof CSS < "u" && CSS?.escape ? CSS.escape(n) : n.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); - e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${t}"]`)?.scrollIntoView?.({ + let e = typeof CSS < "u" && CSS?.escape ? CSS.escape(n) : n.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); + t.querySelector(`.mjr-asset-card[data-mjr-asset-id="${e}"]`)?.scrollIntoView?.({ block: "nearest", inline: "nearest" }); @@ -9261,23 +9262,23 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = console.debug?.(e); } } - }, A = (t) => { - let n = String(t.key || ""); - if (!(n === "ArrowLeft" || n === "ArrowRight" || n === "ArrowUp" || n === "ArrowDown") && !(n === "Home" || n === "End") || t.ctrlKey || t.altKey || t.metaKey) return !1; - let r = w(); + }, k = (e) => { + let n = String(e.key || ""); + if (!(n === "ArrowLeft" || n === "ArrowRight" || n === "ArrowUp" || n === "ArrowDown") && !(n === "Home" || n === "End") || e.ctrlKey || e.altKey || e.metaKey) return !1; + let r = T(); if (!Array.isArray(r) || r.length === 0) return !1; - let i = S(), a = String(i?.id || e?.dataset?.mjrSelectedAssetId || ""), o = r.findIndex((e) => String(e?.id || "") === a), s = o >= 0; + let i = S(), a = String(i?.id || t?.dataset?.mjrSelectedAssetId || ""), o = r.findIndex((e) => String(e?.id || "") === a), s = o >= 0; o < 0 && (o = 0); - let l = Math.max(1, T()), u = o; + let l = Math.max(1, E()), u = o; if (n === "ArrowLeft" ? --u : n === "ArrowRight" ? u += 1 : n === "ArrowUp" ? u -= l : n === "ArrowDown" ? u += l : n === "Home" ? u = 0 : n === "End" && (u = r.length - 1), u = Math.max(0, Math.min(r.length - 1, u)), s && u === o && n !== "Home" && n !== "End") return !1; let d = String(r[u]?.id || ""); if (!d) return !1; - if (_(), t.shiftKey) { - let t = String(e?._mjrSelectionAnchorId || ""); - t ||= a || d; - let n = r.findIndex((e) => String(e?.id || "") === t), i = n >= 0 ? n : o, s = Math.min(i, u), c = Math.max(i, u); + if (y(), e.shiftKey) { + let e = String(t?._mjrSelectionAnchorId || ""); + e ||= a || d; + let n = r.findIndex((t) => String(t?.id || "") === e), i = n >= 0 ? n : o, s = Math.min(i, u), c = Math.max(i, u); D(r.slice(s, c + 1).map((e) => String(e?.id || "")).filter(Boolean), d); - } else e._mjrSelectionAnchorId = d, D([d], d); + } else t._mjrSelectionAnchorId = d, D([d], d); O(d); try { c?.(); @@ -9285,76 +9286,76 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = console.debug?.(e); } return !0; - }, j = async (n) => { - let i = n.target; - if (i && (i.tagName === "INPUT" || i.tagName === "TEXTAREA" || i.isContentEditable) || L() || We().scope === "viewer") return; + }, A = async (r) => { + let a = r.target; + if (a && (a.tagName === "INPUT" || a.tagName === "TEXTAREA" || a.isContentEditable) || Ze() || Ke().scope === "viewer") return; if (document.activeElement !== document.body) { - let t = document.activeElement, n = e.contains(t), r = t && t.contains && t.contains(e), i = t?.closest?.(".mjr-asset-card"); + 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 t = qe(); - if (t && t !== e) return; + let e = Je(); + if (e && e !== t) return; } let u = () => { - n.preventDefault(), n.stopPropagation(); + r.preventDefault(), r.stopPropagation(); }; try { - if (A(n)) { + if (k(r)) { u(); return; } } catch (e) { console.debug?.(e); } - let d = y(), f = S(), p = t(); - if (oo(n, io.DOWNLOAD) && f?.filepath) { - u(), h = !0; + let f = b(), p = S(), h = n(); + if (co(r, oo.DOWNLOAD) && p?.filepath) { + u(), _ = !0; return; } - let m = !!We().ratingHotkeysActive; - if (!n.ctrlKey && !n.altKey && !n.metaKey && !n.shiftKey) { - if (!m && oo(n, io.RATING_1) && f?.id) { - u(), co(f, 1, l); + let g = !!Ke().ratingHotkeysActive; + if (!r.ctrlKey && !r.altKey && !r.metaKey && !r.shiftKey) { + if (!g && co(r, oo.RATING_1) && p?.id) { + u(), uo(p, 1, l); return; } - if (!m && oo(n, io.RATING_2) && f?.id) { - u(), co(f, 2, l); + if (!g && co(r, oo.RATING_2) && p?.id) { + u(), uo(p, 2, l); return; } - if (!m && oo(n, io.RATING_3) && f?.id) { - u(), co(f, 3, l); + if (!g && co(r, oo.RATING_3) && p?.id) { + u(), uo(p, 3, l); return; } - if (!m && oo(n, io.RATING_4) && f?.id) { - u(), co(f, 4, l); + if (!g && co(r, oo.RATING_4) && p?.id) { + u(), uo(p, 4, l); return; } - if (!m && oo(n, io.RATING_5) && f?.id) { - u(), co(f, 5, l); + if (!g && co(r, oo.RATING_5) && p?.id) { + u(), uo(p, 5, l); return; } - if (!m && oo(n, io.RATING_RESET) && f?.id) { - u(), co(f, 0, l); + if (!g && co(r, oo.RATING_RESET) && p?.id) { + u(), uo(p, 0, l); return; } } - if ((oo(n, io.OPEN_VIEWER) || oo(n, io.OPEN_VIEWER_ALT)) && d.length > 0) { + if ((co(r, oo.OPEN_VIEWER) || co(r, oo.OPEN_VIEWER_ALT)) && f.length > 0) { u(); try { - if (d.length >= 2 && d.length <= 4) g({ - assets: d, + if (f.length >= 2 && f.length <= 4) v({ + assets: f, index: 0 }); else { - let t = []; - if (Array.isArray(p?.assets) && p.assets.length) t = p.assets; - else if (typeof e?._mjrGetAssets == "function") { - let n = e._mjrGetAssets(); - Array.isArray(n) && n.length && (t = n); - } else t = b().map((e) => e._mjrAsset).filter(Boolean); - let n = t.findIndex((e) => String(e?.id) === String(f?.id)); - g({ - assets: t, + let e = []; + if (Array.isArray(h?.assets) && h.assets.length) e = h.assets; + else if (typeof t?._mjrGetAssets == "function") { + let n = t._mjrGetAssets(); + Array.isArray(n) && n.length && (e = n); + } else e = x().map((e) => e._mjrAsset).filter(Boolean); + let n = e.findIndex((e) => String(e?.id) === String(p?.id)); + v({ + assets: e, index: Math.max(0, n) }); } @@ -9363,15 +9364,15 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } return; } - if (oo(n, io.METADATA_PANEL) && f) { - u(), a(f); + if (co(r, oo.METADATA_PANEL) && p) { + u(), o(p); return; } - if (oo(n, io.COMPARE_AB) && d.length === 2) { + if (co(r, oo.COMPARE_AB) && f.length === 2) { u(); try { - g({ - assets: d, + v({ + assets: f, index: 0, mode: "ab" }); @@ -9380,11 +9381,11 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } return; } - if (oo(n, io.SIDE_BY_SIDE) && d.length >= 2 && d.length <= 4) { + if (co(r, oo.SIDE_BY_SIDE) && f.length >= 2 && f.length <= 4) { u(); try { - g({ - assets: d, + v({ + assets: f, index: 0, mode: "sidebyside" }); @@ -9393,33 +9394,33 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } return; } - if (oo(n, io.EDIT_TAGS) && f?.id) { - u(), o(f); + if (co(r, oo.EDIT_TAGS) && p?.id) { + u(), s(p); return; } - if (oo(n, io.ADD_TO_COLLECTION) && (d.length > 0 || f)) { + if (co(r, oo.ADD_TO_COLLECTION) && (f.length > 0 || p)) { u(); - let t = d.length > 0 ? d : [f], n = e.getBoundingClientRect(); - await ti({ + let e = f.length > 0 ? f : [p], n = t.getBoundingClientRect(); + await ni({ x: n.left + n.width / 2, y: n.top + n.height / 2, - assets: t + assets: e }); return; } - if (oo(n, io.REMOVE_FROM_COLLECTION)) { - let e = p?.collectionId; - if (e && (d.length > 0 || f)) { + if (co(r, oo.REMOVE_FROM_COLLECTION)) { + let e = h?.collectionId; + if (e && (f.length > 0 || p)) { u(); try { - let t = (d.length > 0 ? d : [f]).map((e) => String(e?.filepath || e?.path || e?.file_info?.filepath || "").trim()).filter(Boolean); + let t = (f.length > 0 ? f : [p]).map((e) => String(e?.filepath || e?.path || e?.file_info?.filepath || "").trim()).filter(Boolean); if (!t.length) { - s(r("toast.removeFromCollectionFailed", "No valid files to remove from collection"), "warning"); + m(R("toast.removeFromCollectionFailed", "No valid files to remove from collection"), "warning"); return; } - let n = await k(e, t); + let n = await d(e, t); if (!n?.ok) { - s(n?.error || r("toast.removeFromCollectionFailed", "Failed to remove from collection"), "error"); + m(n?.error || R("toast.removeFromCollectionFailed", "Failed to remove from collection"), "error"); return; } try { @@ -9427,78 +9428,78 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = } catch (e) { console.debug?.(e); } - s(r("toast.removedFromCollection", "Removed from collection"), "success", 1400); + m(R("toast.removedFromCollection", "Removed from collection"), "success", 1400); } catch (e) { - s(r("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: e?.message || String(e || "") }), "error"); + m(R("toast.removeFromCollectionError", "Error removing from collection: {error}", { error: e?.message || String(e || "") }), "error"); } return; } } - if (oo(n, io.COPY_PATH) && f?.filepath) { + if (co(r, oo.COPY_PATH) && p?.filepath) { u(); try { - await navigator.clipboard.writeText(f.filepath), s(r("toast.pathCopied"), "success", 2e3); + await navigator.clipboard.writeText(p.filepath), m(R("toast.pathCopied"), "success", 2e3); } catch { - s(r("toast.pathCopyFailed"), "error"); + m(R("toast.pathCopyFailed"), "error"); } return; } - if (oo(n, io.OPEN_IN_FOLDER) && f?.id) { + if (co(r, oo.OPEN_IN_FOLDER) && p?.id) { u(); - let e = await E(f.id); - e?.ok ? s(r("toast.openedInFolder"), "info", 2e3) : s(e?.error || r("toast.openFolderFailed"), "error"); + let t = await e(p.id); + t?.ok ? m(R("toast.openedInFolder"), "info", 2e3) : m(t?.error || R("toast.openFolderFailed"), "error"); return; } - if (oo(n, io.RENAME) && f?.id) { + if (co(r, oo.RENAME) && p?.id) { u(); - let e = f.filename || "", t = ci(await Lt(r("dialog.rename.title", "Rename file"), e), e); + let e = p.filename || "", t = li(await gt(R("dialog.rename.title", "Rename file"), e), e); if (t && t !== e) { - let e = ai(t); + let e = oi(t); if (!e.valid) { - s(e.reason, "error"); + m(e.reason, "error"); return; } try { - let e = await v(f, t); + let e = await i(p, t); if (e?.ok) { let n = e?.data?.asset; - n && typeof n == "object" ? Object.assign(f, n) : (f.filename = t, f.filepath = f.filepath?.replace(/[^\\/]+$/, t), f.path &&= String(f.path).replace(/[^\\/]+$/, t), f.file_info && typeof f.file_info == "object" && (f.file_info.filename = t, f.file_info.filepath && (f.file_info.filepath = String(f.file_info.filepath).replace(/[^\\/]+$/, t)), f.file_info.path && (f.file_info.path = String(f.file_info.path).replace(/[^\\/]+$/, t)))), s(r("toast.fileRenamedSuccess"), "success"); + n && typeof n == "object" ? Object.assign(p, n) : (p.filename = t, p.filepath = p.filepath?.replace(/[^\\/]+$/, t), p.path &&= String(p.path).replace(/[^\\/]+$/, t), p.file_info && typeof p.file_info == "object" && (p.file_info.filename = t, p.file_info.filepath && (p.file_info.filepath = String(p.file_info.filepath).replace(/[^\\/]+$/, t)), p.file_info.path && (p.file_info.path = String(p.file_info.path).replace(/[^\\/]+$/, t)))), m(R("toast.fileRenamedSuccess"), "success"); try { window.dispatchEvent(new CustomEvent("mjr:reload-grid", { detail: { reason: "rename-keyboard" } })); } catch (e) { console.debug?.(e); } l(); - } else s(e?.error || r("toast.fileRenameFailed"), "error"); + } else m(e?.error || R("toast.fileRenameFailed"), "error"); } catch (e) { - s(r("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); + m(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); } } return; } - if ((oo(n, io.DELETE) || oo(n, io.DELETE_ALT)) && (f?.id || d.length > 0)) { + if ((co(r, oo.DELETE) || co(r, oo.DELETE_ALT)) && (p?.id || f.length > 0)) { u(); - let t = d.length > 0 ? d : [f], n = 0, i = 0, a = []; - for (let e of t) if (e?.id) try { - (await x(e.id))?.ok ? (n++, a.push(String(e.id))) : i++; + let e = f.length > 0 ? f : [p], n = 0, r = 0, i = []; + for (let t of e) if (t?.id) try { + (await w(t.id))?.ok ? (n++, i.push(String(t.id))) : r++; } catch { - i++; + r++; } - if (a.length) try { - let t = e?._mjrRemoveAssets; - if (typeof t == "function") t(a); - else for (let t of a) e.querySelector(`[data-mjr-asset-id="${t}"]`)?.remove?.(); + if (i.length) try { + let e = t?._mjrRemoveAssets; + if (typeof e == "function") e(i); + else for (let e of i) t.querySelector(`[data-mjr-asset-id="${e}"]`)?.remove?.(); } catch (e) { console.debug?.(e); } - i === 0 ? s(r("toast.filesDeletedShort", "{n} files deleted", { n }), "success") : s(r("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", { + r === 0 ? m(R("toast.filesDeletedShort", "{n} files deleted", { n }), "success") : m(R("toast.filesDeletedShortPartial", "{success} deleted, {failed} failed", { success: n, - failed: i + failed: r }), "warning"); try { - if (typeof e?._mjrSetSelection == "function") { - let t = d.filter((e) => !a.includes(String(e?.id || ""))).map((e) => String(e?.id || "")).filter(Boolean); - e._mjrSetSelection(t, t[0] || ""); + if (typeof t?._mjrSetSelection == "function") { + let e = f.filter((e) => !i.includes(String(e?.id || ""))).map((e) => String(e?.id || "")).filter(Boolean); + t._mjrSetSelection(e, e[0] || ""); } } catch (e) { console.debug?.(e); @@ -9506,96 +9507,96 @@ function lo({ gridContainer: e, getState: t = () => ({}), getSelectedAssets: n = c(); return; } - if (oo(n, io.SELECT_ALL)) { + if (co(r, oo.SELECT_ALL)) { u(); - let t = []; + let e = []; try { - if (Array.isArray(p?.assets) && p.assets.length) t = p.assets.map((e) => String(e?.id || "")).filter(Boolean); - else if (typeof e?._mjrGetAssets == "function") { - let n = e._mjrGetAssets(); - Array.isArray(n) && (t = n.map((e) => String(e?.id || "")).filter(Boolean)); + if (Array.isArray(h?.assets) && h.assets.length) e = h.assets.map((e) => String(e?.id || "")).filter(Boolean); + else if (typeof t?._mjrGetAssets == "function") { + let n = t._mjrGetAssets(); + Array.isArray(n) && (e = n.map((e) => String(e?.id || "")).filter(Boolean)); } } catch (e) { console.debug?.(e); } - if (!t.length) try { - t = b().map((e) => String(e?._mjrAsset?.id || "")).filter(Boolean); + if (!e.length) try { + e = x().map((e) => String(e?._mjrAsset?.id || "")).filter(Boolean); } catch (e) { console.debug?.(e); } try { - typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection(t, t[0] || "") : (b().forEach((e) => { + typeof t?._mjrSetSelection == "function" ? t._mjrSetSelection(e, e[0] || "") : (x().forEach((e) => { e.classList.add("is-selected"), e.setAttribute("aria-selected", "true"); - }), e.dataset.mjrSelectedAssetIds = JSON.stringify(t), e.dataset.mjrSelectedAssetId = String(t[0] || "")); + }), t.dataset.mjrSelectedAssetIds = JSON.stringify(e), t.dataset.mjrSelectedAssetId = String(e[0] || "")); } catch (e) { console.debug?.(e); } c(); return; } - if (oo(n, io.DESELECT_ALL)) { + if (co(r, oo.DESELECT_ALL)) { u(); try { - typeof e?._mjrSetSelection == "function" ? e._mjrSetSelection([], "") : (b().filter((e) => e?.classList?.contains?.("is-selected")).forEach((e) => { + typeof t?._mjrSetSelection == "function" ? t._mjrSetSelection([], "") : (x().filter((e) => e?.classList?.contains?.("is-selected")).forEach((e) => { e.classList.remove("is-selected"), e.setAttribute("aria-selected", "false"); - }), delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); + }), delete t.dataset.mjrSelectedAssetIds, delete t.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } c(); return; } - }, M = (e) => { - if (String(e?.key || "").toLowerCase() !== "s" || !h || (h = !1, L()) || We().scope === "viewer") return; + }, j = (e) => { + if (String(e?.key || "").toLowerCase() !== "s" || !_ || (_ = !1, Ze()) || Ke().scope === "viewer") return; let t = S(); t?.filepath && (e.preventDefault?.(), e.stopPropagation?.(), e.stopImmediatePropagation?.(), C(t)); + }, M = () => { + _ = !1; }, N = () => { - h = !1; + g ||= (u = A, f = j, p = M, h = () => y(), document.addEventListener("keydown", u, !0), document.addEventListener("keyup", f, !0), document.addEventListener("dragstart", p, !0), t.addEventListener("pointerdown", h, !0), t.addEventListener("focusin", h, !0), !0); }, P = () => { - m ||= (u = j, d = M, f = N, p = () => _(), document.addEventListener("keydown", u, !0), document.addEventListener("keyup", d, !0), document.addEventListener("dragstart", f, !0), e.addEventListener("pointerdown", p, !0), e.addEventListener("focusin", p, !0), !0); - }, F = () => { - if (!(!m || !u)) { - document.removeEventListener("keydown", u, !0), d && document.removeEventListener("keyup", d, !0), f && document.removeEventListener("dragstart", f, !0), p && (e.removeEventListener("pointerdown", p, !0), e.removeEventListener("focusin", p, !0)), u = null, d = null, f = null, p = null, h = !1; + if (!(!g || !u)) { + document.removeEventListener("keydown", u, !0), f && document.removeEventListener("keyup", f, !0), p && document.removeEventListener("dragstart", p, !0), h && (t.removeEventListener("pointerdown", h, !0), t.removeEventListener("focusin", h, !0)), u = null, f = null, p = null, h = null, _ = !1; try { - Je(e); + Ye(t); } catch (e) { console.debug?.(e); } try { - window.__MJR_LAST_SELECTION_GRID__ === e && delete window.__MJR_LAST_SELECTION_GRID__; + window.__MJR_LAST_SELECTION_GRID__ === t && delete window.__MJR_LAST_SELECTION_GRID__; } catch (e) { console.debug?.(e); } - m = !1; - for (let e of so.values()) try { + g = !1; + for (let e of lo.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - so.clear(); + lo.clear(); } }; return { - bind: P, - unbind: F, + bind: N, + unbind: P, dispose: () => { - F(); - for (let e of so.values()) try { + P(); + for (let e of lo.values()) try { clearTimeout(e); } catch (e) { console.debug?.(e); } - so.clear(); + lo.clear(); } }; } -function uo(e) { - let t = io[e]; - return t ? ao(t) : ""; +function po(e) { + let t = oo[e]; + return t ? so(t) : ""; } //#endregion //#region ui/features/contextmenu/gridContextMenuState.ts -function fo() { +function mo() { return { open: !1, x: 0, @@ -9607,8 +9608,8 @@ function fo() { var $ = Dn({ portalOwnerId: "", mountedPortalIds: [], - main: fo(), - submenu: fo(), + main: mo(), + submenu: mo(), tags: { open: !1, x: 0, @@ -9616,52 +9617,52 @@ var $ = Dn({ asset: null, onChanged: null } -}), po = 1; -function mo(e) { +}), ho = 1; +function go(e) { e && (e.open = !1, e.x = 0, e.y = 0, e.items = [], e.title = ""); } -function ho(e = "") { +function _o(e = "") { try { window.dispatchEvent(new CustomEvent("mjr-close-all-menus", { detail: { source: String(e || "") } })); } catch (e) { console.debug?.(e); } } -function go() { - let e = `mjr-grid-context-menu-portal-${po++}`; +function vo() { + let e = `mjr-grid-context-menu-portal-${ho++}`; return $.mountedPortalIds.push(e), $.portalOwnerId ||= e, e; } -function _o(e) { +function yo(e) { let t = $.mountedPortalIds.filter((t) => t !== e); $.mountedPortalIds.splice(0, $.mountedPortalIds.length, ...t), $.portalOwnerId === e && ($.portalOwnerId = $.mountedPortalIds[0] || ""); } -function vo(e) { +function bo(e) { return String($.portalOwnerId || "") === String(e || ""); } -function yo({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - ho("grid"), wo(), So(), $.main.open = !0, $.main.x = Number(e) || 0, $.main.y = Number(t) || 0, $.main.items = Array.isArray(n) ? n.filter(Boolean) : [], $.main.title = String(r || ""); -} -function bo() { - mo($.main), So(); -} function xo({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { - $.submenu.open = !0, $.submenu.x = Number(e) || 0, $.submenu.y = Number(t) || 0, $.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], $.submenu.title = String(r || ""); + _o("grid"), Eo(), wo(), $.main.open = !0, $.main.x = Number(e) || 0, $.main.y = Number(t) || 0, $.main.items = Array.isArray(n) ? n.filter(Boolean) : [], $.main.title = String(r || ""); } function So() { - mo($.submenu); + go($.main), wo(); } -function Co({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { - bo(), $.tags.open = !!n, $.tags.x = Number(e) || 0, $.tags.y = Number(t) || 0, $.tags.asset = n || null, $.tags.onChanged = typeof r == "function" ? r : null; +function Co({ x: e = 0, y: t = 0, items: n = [], title: r = "" } = {}) { + $.submenu.open = !0, $.submenu.x = Number(e) || 0, $.submenu.y = Number(t) || 0, $.submenu.items = Array.isArray(n) ? n.filter(Boolean) : [], $.submenu.title = String(r || ""); } function wo() { + go($.submenu); +} +function To({ x: e = 0, y: t = 0, asset: n = null, onChanged: r = null } = {}) { + So(), $.tags.open = !!n, $.tags.x = Number(e) || 0, $.tags.y = Number(t) || 0, $.tags.asset = n || null, $.tags.onChanged = typeof r == "function" ? r : null; +} +function Eo() { $.tags.open = !1, $.tags.x = 0, $.tags.y = 0, $.tags.asset = null, $.tags.onChanged = null; } -function To() { - bo(), wo(); +function Do() { + So(), Eo(); } //#endregion //#region ui/features/dnd/utils/constants.ts -var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "application/x-comfy-asset-info", ko = new Set([ +var Oo = "application/x-mjr-asset", ko = "application/x-mjr-assets", Ao = "application/x-comfy-asset-info", jo = new Set([ ".png", ".jpg", ".jpeg", @@ -9669,13 +9670,13 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli ".gif", ".bmp", ".avif" -]), Ao = new Set([ +]), Mo = new Set([ ".mp4", ".mov", ".mkv", ".webm", ".avi" -]), jo = new Set([ +]), No = new Set([ ".wav", ".mp3", ".flac", @@ -9683,7 +9684,7 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli ".m4a", ".aac", ".opus" -]), Mo = new Set([ +]), Po = new Set([ ".obj", ".fbx", ".glb", @@ -9693,23 +9694,23 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli ".splat", ".ksplat", ".spz" -]), No = (e) => { - if (!e) return !1; - let t = e.lastIndexOf("."); - return t === -1 ? !1 : ko.has(e.slice(t).toLowerCase()); -}, Po = (e) => e ? String(e.kind || "").toLowerCase() === "image" ? !0 : No(e.filename) : !1, Fo = (e) => { - if (!e) return !1; - let t = e.lastIndexOf("."); - return t === -1 ? !1 : Ao.has(e.slice(t).toLowerCase()); -}, Io = (e) => e ? String(e.kind || "").toLowerCase() === "video" ? !0 : Fo(e.filename) : !1, Lo = (e) => { +]), Fo = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); return t === -1 ? !1 : jo.has(e.slice(t).toLowerCase()); -}, Ro = (e) => e ? String(e.kind || "").toLowerCase() === "audio" ? !0 : Lo(e.filename) : !1, zo = (e) => { +}, Io = (e) => e ? String(e.kind || "").toLowerCase() === "image" ? !0 : Fo(e.filename) : !1, Lo = (e) => { if (!e) return !1; let t = e.lastIndexOf("."); return t === -1 ? !1 : Mo.has(e.slice(t).toLowerCase()); -}, Bo = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" ? !0 : zo(e.filename) : !1, Vo = (e) => Po(e) || Io(e) || Ro(e) || Bo(e), Ho = { +}, Ro = (e) => e ? String(e.kind || "").toLowerCase() === "video" ? !0 : Lo(e.filename) : !1, zo = (e) => { + if (!e) return !1; + let t = e.lastIndexOf("."); + return t === -1 ? !1 : No.has(e.slice(t).toLowerCase()); +}, Bo = (e) => e ? String(e.kind || "").toLowerCase() === "audio" ? !0 : zo(e.filename) : !1, Vo = (e) => { + if (!e) return !1; + let t = e.lastIndexOf("."); + return t === -1 ? !1 : Po.has(e.slice(t).toLowerCase()); +}, Ho = (e) => e ? String(e.kind || "").toLowerCase() === "model3d" ? !0 : Vo(e.filename) : !1, Uo = (e) => Io(e) || Ro(e) || Bo(e) || Ho(e), Wo = { mp4: "video/mp4", mov: "video/quicktime", webm: "video/webm", @@ -9719,45 +9720,45 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli obj: "model/obj", stl: "model/stl", ply: "application/ply" -}, Uo = (e) => Ho[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", Wo = (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 : Ao.has(`.${r}`) : !1; -}, Go = (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; -}, Ko = (e, t) => Go(e, t, Wo), qo = (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 : ko.has(`.${r}`) : !1; -}, Jo = (e, t) => Go(e, t, qo), Yo = (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 : jo.has(`.${r}`) : !1; -}, Xo = (e, t) => Go(e, t, Yo), Zo = (e, t) => { +}, Go = (e) => Wo[String(e || "").split(".").pop()?.toLowerCase()] ?? "application/octet-stream", Ko = (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 : Mo.has(`.${r}`) : !1; -}, Qo = (e, t) => Go(e, t, Zo), $o = /* @__PURE__ */ new WeakMap(), es = (e) => { +}, qo = (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; +}, Jo = (e, t) => qo(e, t, Ko), Yo = (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 : jo.has(`.${r}`) : !1; +}, Xo = (e, t) => qo(e, t, Yo), Zo = (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 : No.has(`.${r}`) : !1; +}, Qo = (e, t) => qo(e, t, Zo), $o = (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 : Po.has(`.${r}`) : !1; +}, es = (e, t) => qo(e, t, $o), ts = /* @__PURE__ */ new WeakMap(), ns = (e) => { if (!e || typeof e != "object") return { node: null, prev: null }; - let t = $o.get(e); + let t = ts.get(e); return t || (t = { node: null, prev: null - }, $o.set(e, t)), t; -}, ts = (e, t, n) => { + }, ts.set(e, t)), t; +}, rs = (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(); @@ -9772,14 +9773,14 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "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; -}, ns = (e, t, n) => { - let r = es(e); - !t || r.node === t || (rs(e, n), r.node = t, r.prev = { +}, is = (e, t, n) => { + let r = ns(e); + !t || r.node === t || (as(e, n), r.node = t, r.prev = { color: t.color, bgcolor: t.bgcolor }, t.bgcolor = "#3355ff", t.color = "#a9c4ff", n(e)); -}, rs = (e, t) => { - let n = es(e); +}, as = (e, t) => { + let n = ns(e); if (n.node) { try { n.prev && (n.node.color = n.prev.color, n.node.bgcolor = n.prev.bgcolor); @@ -9788,7 +9789,7 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli } n.node = null, n.prev = null, t(e); } -}, is = (e, t) => { +}, os = (e, t) => { if (!e || e.type !== "combo" || !e.options) return; let n = e.options.values, r = e.options; if (typeof n != "function") { @@ -9800,41 +9801,41 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli value: t }), r.values = n); } -}, as = new Set([ +}, ss = new Set([ "number", "int", "float", "boolean", "toggle", "checkbox" -]), os = [ +]), cs = [ "output", "save", "export", "folder", "dir" -], ss = ["file", "path"], cs = [ +], ls = ["file", "path"], us = [ "path", "file", "input", "src", "source" -], ls = (e, t, n) => { +], ds = (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 (as.has(t) || typeof r == "number" || typeof r == "boolean") continue; + if (ss.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 = cs.some((e) => l.includes(e)); - d && f && (u += 80), ss.some((e) => l.includes(e)) && (u += 35); + let d = n.mediaTerms.some((e) => l.includes(e)), f = us.some((e) => l.includes(e)); + d && f && (u += 80), ls.some((e) => l.includes(e)) && (u += 35); for (let { terms: e, score: t } of n.extraTerms) e.some((e) => l.includes(e)) && (u += t); - os.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); + cs.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, @@ -9853,7 +9854,7 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli console.debug?.(e); } return c.w; -}, us = { +}, fs = { exactNames: new Set([ "video_path", "input_video", @@ -9896,10 +9897,10 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli score: 45 }], exactSingleNames: new Set(["video"]), - looksLikeFn: Wo, - comboChecker: Ko, + looksLikeFn: Ko, + comboChecker: Jo, scoreKey: "__mjrVideoPickScore" -}, ds = { +}, ps = { exactNames: new Set([ "image", "image_path", @@ -9954,10 +9955,10 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli score: 35 }], exactSingleNames: new Set(["image", "face"]), - looksLikeFn: qo, - comboChecker: Jo, + looksLikeFn: Yo, + comboChecker: Xo, scoreKey: "__mjrImagePickScore" -}, fs = { +}, ms = { exactNames: new Set([ "audio_path", "input_audio", @@ -10005,10 +10006,10 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli score: 45 }], exactSingleNames: new Set(["audio", "voice"]), - looksLikeFn: Yo, - comboChecker: Xo, + looksLikeFn: Zo, + comboChecker: Qo, scoreKey: "__mjrAudioPickScore" -}, ps = { +}, hs = { exactNames: new Set([ "model_path", "input_model", @@ -10067,13 +10068,13 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli "mesh", "geometry" ]), - looksLikeFn: Zo, - comboChecker: Qo, + looksLikeFn: $o, + comboChecker: es, scoreKey: "__mjrModel3DPickScore" -}, ms = (e, t, n) => { +}, gs = (e, t, n) => { let r = String(t?.kind || "").toLowerCase(); - return ls(e, n, r === "model3d" ? ps : r === "audio" ? fs : r === "image" ? ds : us); -}, hs = (e, t, n, r) => { + return ds(e, n, r === "model3d" ? hs : r === "audio" ? ms : r === "image" ? ps : fs); +}, _s = (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; @@ -10086,15 +10087,15 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli }; } return null; -}, gs = (e) => { +}, vs = (e) => { let t = e?.canvas?.canvas || document.querySelector("canvas"); return t ? t.getBoundingClientRect() : null; -}, _s = (e, t) => { - let n = gs(e); +}, ys = (e, t) => { + let n = vs(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; -}, vs = (e) => { +}, bs = (e) => { try { e?.graph?.setDirtyCanvas?.(!0, !0); } catch (e) { @@ -10105,21 +10106,21 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli } catch (e) { console.debug?.(e); } -}, ys = (e) => { +}, xs = (e) => { let t = String(e?.filename || ""), n = t.lastIndexOf("."); return n >= 0 ? t.slice(n).toLowerCase() : ""; -}, bs = (e) => { - let t = String(e?.kind || "").toLowerCase(), n = ys(e); - return t === "image" || ko.has(n) ? ["LoadImage"] : t === "video" || Ao.has(n) ? [ +}, Ss = (e) => { + let t = String(e?.kind || "").toLowerCase(), n = xs(e); + return t === "image" || jo.has(n) ? ["LoadImage"] : t === "video" || Mo.has(n) ? [ "LoadVideo", "VHS_LoadVideo", "VideoLoader" - ] : t === "audio" || jo.has(n) ? [ + ] : t === "audio" || No.has(n) ? [ "LoadAudio", "VHS_LoadAudioUpload", "VHS_LoadAudio", "AudioLoader" - ] : t === "model3d" || Mo.has(n) ? [ + ] : t === "model3d" || Po.has(n) ? [ "Load3D", "LoadModel", "LoadMesh", @@ -10128,9 +10129,9 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli "LoadSTL", "LoadPLY" ] : []; -}, xs = (e, t) => { +}, Cs = (e, t) => { if (e) { - e.type === "combo" && is(e, t), e.value = t; + e.type === "combo" && os(e, t), e.value = t; try { e.callback?.(e.value); } catch (e) { @@ -10142,41 +10143,41 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli console.debug?.(e); } } -}, Ss = (e) => { +}, ws = (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 Cs(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2)); -}, Cs = (e, t, n) => { + return Ts(e, s + Math.max(0, a / 2), c + Math.max(0, o / 2)); +}, Ts = (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)) ? Ss(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c]; -}, ws = (e, t = null) => { - if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return Cs(e, t.clientX, t.clientY); + return !r || !Number.isFinite(Number(t)) || !Number.isFinite(Number(n)) ? ws(e) : [(Number(t) - r.left) / a - s, (Number(n) - r.top) / a - c]; +}, Es = (e, t = null) => { + if (Number.isFinite(Number(t?.clientX)) && Number.isFinite(Number(t?.clientY))) return Ts(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 Cs(e, t?.clientX, t?.clientY); -}, Ts = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => { + return Ts(e, t?.clientX, t?.clientY); +}, Ds = ({ app: e, payload: t, relativePath: n, event: r = null, droppedExt: i = "", position: a = null }) => { let o = e?.graph ?? e?.canvas?.graph ?? null, s = globalThis?.LiteGraph || globalThis?.window?.LiteGraph || null; if (!o || typeof o.add != "function" || !s?.createNode) return !1; let c = null; - for (let e of bs(t)) try { + for (let e of Ss(t)) try { if (c = s.createNode(e), c) break; } catch (e) { console.debug?.(e); } if (!c) return !1; - c.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : ws(e, r), o.add(c); - let l = ms(c, t, i); - return l && xs(l, n), vs(e), !0; -}, Es = ({ app: e, items: t = [], event: n = null, gap: r = 90 }) => { + c.pos = Array.isArray(a) ? [Number(a[0]) || 0, Number(a[1]) || 0] : Es(e, r), o.add(c); + let l = gs(c, t, i); + return l && Cs(l, n), bs(e), !0; +}, Os = ({ 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 = ws(e, n), o = 0; - for (let t of i) Ts({ + let a = Es(e, n), o = 0; + for (let t of i) Ds({ app: e, payload: t.payload, relativePath: t.relativePath, @@ -10185,11 +10186,11 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli position: [a[0] + o * Number(r || 90), a[1]] }) && (o += 1); return o; -}, Ds = xs, Os = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => { +}, ks = Cs, As = ({ app: e, payload: t, relativePath: n, targetNode: r, inputSlotIndex: i, event: a = null }) => { let o = e?.graph ?? e?.canvas?.graph ?? null, s = globalThis?.LiteGraph || globalThis?.window?.LiteGraph || null; if (!o || typeof o.add != "function" || !s?.createNode || !r) return !1; let c = null; - for (let e of bs(t)) try { + for (let e of Ss(t)) try { if (c = s.createNode(e), c) break; } catch (e) { console.debug?.(e); @@ -10197,15 +10198,15 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli if (!c) return !1; let l = Number(r.pos[0]) || 0, u = Number(r.pos[1]) || 0, d = Array.isArray(c.size) && Number(c.size[0]) || 220; c.pos = [l - d - 60, u + Number(i) * 20], o.add(c); - let f = ys(t), p = ms(c, t, f); - p && xs(p, n); + let f = xs(t), p = gs(c, t, f); + p && Cs(p, n); try { c.connect(0, r, i); } catch (e) { console.debug?.(e); } - return vs(e), !0; -}, ks = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { + return bs(e), !0; +}, js = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { let a = { index: !!r, files: [{ @@ -10217,8 +10218,8 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli }] }; return i && (a.purpose = i), e(t, a); -}, As = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { - let a = await ks({ +}, Ms = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => { + let a = await js({ post: e, endpoint: t, payload: n, @@ -10233,16 +10234,16 @@ var Eo = "application/x-mjr-asset", Do = "application/x-mjr-assets", Oo = "appli name: o?.name || null, subfolder: o?.subfolder || "" } : null; -}, js = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await As({ +}, Ns = async ({ post: e, endpoint: t, payload: n, index: r = !0, purpose: i = null }) => (await Ms({ post: e, endpoint: t, payload: n, index: r, purpose: i -}))?.relativePath || null, Ms = 1; -function Ns(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = null } = {}) { +}))?.relativePath || null, Ps = 1; +function Fs(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = null } = {}) { return { - id: `mjr-grid-menu-item-${Ms++}`, + id: `mjr-grid-menu-item-${Ps++}`, type: "item", label: String(e || ""), iconClass: t ? String(t) : "", @@ -10253,13 +10254,13 @@ function Ns(e, t, n, r, { disabled: i = !1, closeOnSelect: a = !0, submenu: o = action: typeof r == "function" ? r : null }; } -function Ps() { +function Is() { return { - id: `mjr-grid-menu-separator-${Ms++}`, + id: `mjr-grid-menu-separator-${Ps++}`, type: "separator" }; } -var Fs = (e) => { +var Ls = (e) => { let t = /* @__PURE__ */ new Set(); if (!e) return t; try { @@ -10281,7 +10282,7 @@ var Fs = (e) => { console.debug?.(e); } return t; -}, Is = (e) => { +}, Rs = (e) => { let t = []; if (!e) return t; try { @@ -10316,14 +10317,14 @@ var Fs = (e) => { console.debug?.(e); } return t; -}, Ls = (e) => { +}, zs = (e) => { try { let t = e?.filepath || e?.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; } catch { return ""; } -}, Rs = (e) => { +}, Bs = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); return t ? { @@ -10333,7 +10334,7 @@ var Fs = (e) => { root_id: Oe(e) || void 0, kind: String(e.kind || "").toLowerCase() } : null; -}, zs = (e) => { +}, Vs = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || e.name || "").trim(); return t ? { @@ -10343,44 +10344,44 @@ var Fs = (e) => { root_id: Oe(e) || void 0 } : null; }; -function Bs(e, t = "") { +function Hs(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 Vs(e) { - let t = (Array.isArray(e) ? e.filter((e) => !$s(e)) : []).map(zs).filter(Boolean); +async function Us(e) { + let t = (Array.isArray(e) ? e.filter((e) => !tc(e)) : []).map(Vs).filter(Boolean); if (t.length < 2) { - s("Select at least two files to download a ZIP.", "warning", 2600); + m("Select at least two files to download a ZIP.", "warning", 2600); return; } let n = ""; try { - n = Ee("mjr_", 24); + n = De("mjr_", 24); } catch (e) { - at(e, "[GridContextMenu] Batch ZIP token", { showToast: I.DEBUG_VERBOSE_ERRORS }), s("Could not create a secure ZIP token.", "error"); + st(e, "[GridContextMenu] Batch ZIP token", { showToast: z.DEBUG_VERBOSE_ERRORS }), m("Could not create a secure ZIP token.", "error"); return; } - s(`Preparing ZIP for ${t.length} files...`, "info", 1800); - let r = await ye(Le.BATCH_ZIP_CREATE, { + m(`Preparing ZIP for ${t.length} files...`, "info", 1800); + let r = await y(L.BATCH_ZIP_CREATE, { token: n, items: t, strip_metadata: !1 }); if (!r?.ok) { - s(r?.error || "Failed to create ZIP.", "error"); + m(r?.error || "Failed to create ZIP.", "error"); return; } let i = r?.data?.filename || `Majoor_Batch_${t.length}.zip`; - Bs(Fe(n), i), s(`Downloading ${i}...`, "info", 3e3); + Hs(he(n), i), m(`Downloading ${i}...`, "info", 3e3); } -async function Hs(e) { +async function Ws(e) { let t = Array.isArray(e) ? e.filter(Boolean) : [], n = await Promise.all(t.map(async (e) => { - let t = Rs(e); + let t = Bs(e); if (!t) return null; - let n = (await As({ - post: ye, - endpoint: Le.STAGE_TO_INPUT, + let n = (await Ms({ + post: y, + endpoint: L.STAGE_TO_INPUT, payload: t, index: !1 }))?.relativePath; @@ -10390,13 +10391,13 @@ async function Hs(e) { droppedExt: String(t.filename || "").split(".").pop() || "" } : null; })); - return Es({ - app: fe(), + return Os({ + app: be(), items: n.filter(Boolean), event: null }); } -var Us = (e) => { +var Gs = (e) => { if (e) { try { if (typeof e?._mjrSetSelection == "function") e._mjrSetSelection([], ""); @@ -10408,15 +10409,15 @@ var Us = (e) => { } catch (e) { console.debug?.(e); } - ht("mjr:selection-changed", { selectedIds: [] }, { + kt("mjr:selection-changed", { selectedIds: [] }, { target: e, warnPrefix: "[GridContextMenu]" }); } -}, Ws = (e, t, n, r) => { +}, Ks = (e, t, n, r) => { if (!e) return; try { - Us(e); + Gs(e); } catch (e) { console.debug?.(e); } @@ -10436,7 +10437,7 @@ var Us = (e) => { } catch (e) { console.debug?.(e); } -}, Gs = (e) => { +}, qs = (e) => { let t = []; if (!e) return t; try { @@ -10458,7 +10459,7 @@ var Us = (e) => { console.debug?.(e); } return t; -}, Ks = (e, t) => { +}, Js = (e, t) => { try { let n = String(t ?? ""); return (e || []).findIndex((e) => String(e?.id ?? "") === n); @@ -10466,7 +10467,7 @@ var Us = (e) => { return -1; } }; -function qs(e) { +function Ys(e) { if (e == null) return null; try { return document.querySelector(`[data-mjr-asset-id="${an(e)}"]`); @@ -10474,8 +10475,8 @@ function qs(e) { return console.debug?.(e), null; } } -function Js(e, t = null) { - let n = qs(e?.id); +function Xs(e, t = null) { + let n = Ys(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); @@ -10484,7 +10485,7 @@ function Js(e, t = null) { } return n; } -var Ys = (e) => { +var Zs = (e) => { try { let t = e ? "grid-contextmenu" : "grid-contextmenu-global"; window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: t } })); @@ -10492,7 +10493,7 @@ var Ys = (e) => { console.debug?.(e); } }; -async function Xs(e, t) { +async function Qs(e, t) { if (!e) return { ok: !1, error: "Missing asset" @@ -10507,7 +10508,7 @@ async function Xs(e, t) { ok: !1, error: "Missing filename" }; - let r = await ye(Le.INDEX_FILES, { + let r = await y(L.INDEX_FILES, { files: [n], incremental: !1 }); @@ -10516,24 +10517,24 @@ async function Xs(e, t) { error: "Index refresh failed" }; if (e?.id != null) try { - let t = await ee(e.id); + let t = await M(e.id); if (t?.ok && t?.data && typeof t.data == "object") { Object.assign(e, t.data); - let n = Js(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); + let n = Xs(e, t.data), r = n?.querySelector?.(".mjr-workflow-dot"); if (r) { - let e = lt(n._mjrAsset); + let e = xt(n._mjrAsset); e && r.replaceWith(e); } } } catch (e) { console.debug?.(e); } - return Ys(t), { + return Zs(t), { ok: !0, data: { refreshed: !0 } }; } -function Zs(e, t, n) { +function $s(e, t, n) { let r = e?.id; try { e.rating = t; @@ -10546,34 +10547,34 @@ function Zs(e, t, n) { console.debug?.(e); } if (r) { - mi(String(r), t, { + hi(String(r), t, { successMessage: t > 0 ? `Rating set to ${t} stars` : "Rating cleared", errorMessage: "Failed to update rating", warnPrefix: "[GridContextMenu]", onSuccess: () => { - ht(qt, { + kt(Zt, { assetId: String(r), rating: t }, { warnPrefix: "[GridContextMenu]" }); }, onFailure: (e) => { - at(e, "[GridContextMenu] Rating update", { showToast: I.DEBUG_VERBOSE_ERRORS }); + st(e, "[GridContextMenu] Rating update", { showToast: z.DEBUG_VERBOSE_ERRORS }); } }); return; } - we(e, t).catch((e) => { - at(e, "[GridContextMenu] Rating update", { showToast: I.DEBUG_VERBOSE_ERRORS }); + O(e, t).catch((e) => { + st(e, "[GridContextMenu] Rating update", { showToast: z.DEBUG_VERBOSE_ERRORS }); }); } -function Qs(e) { +function ec(e) { return String(e?.scope || "").toLowerCase() === "custom"; } -function $s(e) { +function tc(e) { return String(e?.kind || "").toLowerCase() === "folder"; } -function ec(e) { - let t = Fs(e), n = Is(e), r = n.length || t.size; +function nc(e) { + let t = Ls(e), n = Rs(e), r = n.length || t.size; return { selectedIds: t, selectedAssetsNow: n, @@ -10582,54 +10583,54 @@ function ec(e) { hasSelection: r > 0 }; } -function tc(e, t) { - let n = (e) => "*".repeat(e) + "o".repeat(Math.max(0, 5 - e)), i = (t) => { - Js(e, { rating: t }); +function rc(e, t) { + let n = (e) => "*".repeat(e) + "o".repeat(Math.max(0, 5 - e)), r = (t) => { + Xs(e, { rating: t }); }; return [ - Ns(n(5), "pi pi-star", null, async () => { - Zs(e, 5, () => i(5)); + Fs(n(5), "pi pi-star", null, async () => { + $s(e, 5, () => r(5)); }, { disabled: !t }), - Ns(n(4), "pi pi-star", null, async () => { - Zs(e, 4, () => i(4)); + Fs(n(4), "pi pi-star", null, async () => { + $s(e, 4, () => r(4)); }, { disabled: !t }), - Ns(n(3), "pi pi-star", null, async () => { - Zs(e, 3, () => i(3)); + Fs(n(3), "pi pi-star", null, async () => { + $s(e, 3, () => r(3)); }, { disabled: !t }), - Ns(n(2), "pi pi-star", null, async () => { - Zs(e, 2, () => i(2)); + Fs(n(2), "pi pi-star", null, async () => { + $s(e, 2, () => r(2)); }, { disabled: !t }), - Ns(n(1), "pi pi-star", null, async () => { - Zs(e, 1, () => i(1)); + Fs(n(1), "pi pi-star", null, async () => { + $s(e, 1, () => r(1)); }, { disabled: !t }), - Ps(), - Ns(r("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { - Zs(e, 0, () => i(0)); + Is(), + Fs(R("ctx.resetRating", "Reset rating"), "pi pi-star", "0", async () => { + $s(e, 0, () => r(0)); }, { disabled: !t }) ]; } -function nc({ currentPath: e, gridContainer: t } = {}) { - return [Ns(r("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => { +function ic({ currentPath: e, gridContainer: t } = {}) { + return [Fs(R("ctx.createFolderHere", "Create folder here..."), "pi pi-plus", null, async () => { try { - let n = await Lt(r("dialog.newFolderName", "New folder name"), ""), a = String(n || "").trim(); - if (!a) return; - let o = await i({ + let n = await gt(R("dialog.newFolderName", "New folder name"), ""), r = String(n || "").trim(); + if (!r) return; + let i = await F({ op: "create", path: e, - name: a + name: r }); - if (!o?.ok) { - s(o?.error || "Failed to create folder", "error"); + if (!i?.ok) { + m(i?.error || "Failed to create folder", "error"); return; } - Ys(t), s(r("toast.folderCreated", "Folder created: {name}", { name: a }), "success"); + Zs(t), m(R("toast.folderCreated", "Folder created: {name}", { name: r }), "success"); } catch (e) { - s(r("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: e?.message || String(e || "") }), "error"); + m(R("toast.createFolderFailedDetail", "Create folder failed: {error}", { error: e?.message || String(e || "") }), "error"); } })]; } -function rc({ asset: e, gridContainer: t, panelState: n } = {}) { - let a = String(e?.filepath || "").trim(), o = [Ns(r("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => { +function ac({ asset: e, gridContainer: t, panelState: n } = {}) { + let r = String(e?.filepath || "").trim(), i = [Fs(R("ctx.openFolder", "Open folder"), "pi pi-folder-open", null, () => { try { t.dispatchEvent(new CustomEvent("mjr:open-folder-asset", { bubbles: !0, @@ -10638,311 +10639,311 @@ function rc({ asset: e, gridContainer: t, panelState: n } = {}) { } catch (e) { console.debug?.(e); } - }), Ns(r("ctx.pinAsBrowserRoot"), "pi pi-bookmark", null, async () => { - if (!a) { - s(r("toast.unableResolveFolderPath"), "error"); + }), Fs(R("ctx.pinAsBrowserRoot"), "pi pi-bookmark", null, async () => { + if (!r) { + m(R("toast.unableResolveFolderPath"), "error"); return; } - let t = await Lt(r("dialog.browserRootLabelOptional"), String(e?.filename || "")), n = await ye(Le.CUSTOM_ROOTS, { - path: a, + let t = await gt(R("dialog.browserRootLabelOptional"), String(e?.filename || "")), n = await y(L.CUSTOM_ROOTS, { + path: r, label: String(t || "").trim() || void 0 }); if (!n?.ok) { - s(n?.error || r("toast.pinFolderFailed"), "error"); + m(n?.error || R("toast.pinFolderFailed"), "error"); return; } - s(r("toast.folderPinnedAsBrowserRoot"), "success"); + m(R("toast.folderPinnedAsBrowserRoot"), "success"); try { window.dispatchEvent(new CustomEvent("mjr:custom-roots-changed", { detail: { preferredId: String(n?.data?.id || "") } })); } catch (e) { console.debug?.(e); } })]; - return Qs(n) && a && o.push(Ps(), Ns(r("ctx.createFolderHere"), "pi pi-plus", null, async () => { + return ec(n) && r && i.push(Is(), Fs(R("ctx.createFolderHere"), "pi pi-plus", null, async () => { try { - let e = await Lt(r("dialog.newFolderName"), ""), n = String(e || "").trim(); + let e = await gt(R("dialog.newFolderName"), ""), n = String(e || "").trim(); if (!n) return; - let o = await i({ + let i = await F({ op: "create", - path: a, + path: r, name: n }); - if (!o?.ok) { - s(o?.error || r("toast.createFolderFailed"), "error"); + if (!i?.ok) { + m(i?.error || R("toast.createFolderFailed"), "error"); return; } - Ys(t), s(r("toast.folderCreated", { name: n }), "success"); + Zs(t), m(R("toast.folderCreated", { name: n }), "success"); } catch (e) { - s(r("toast.createFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); + m(R("toast.createFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } - }), Ns(r("ctx.renameFolder"), "pi pi-pencil", null, async () => { + }), Fs(R("ctx.renameFolder"), "pi pi-pencil", null, async () => { try { - let n = String(e?.filename || "").trim(), o = await Lt(r("dialog.renameFolder"), n), c = String(o || "").trim(); - if (!c || c === n) return; - let l = await i({ + let n = String(e?.filename || "").trim(), i = await gt(R("dialog.renameFolder"), n), a = String(i || "").trim(); + if (!a || a === n) return; + let o = await F({ op: "rename", - path: a, - name: c + path: r, + name: a }); - if (!l?.ok) { - s(l?.error || r("toast.renameFolderFailed"), "error"); + if (!o?.ok) { + m(o?.error || R("toast.renameFolderFailed"), "error"); return; } - Ys(t), s(r("toast.folderRenamed"), "success"); + Zs(t), m(R("toast.folderRenamed"), "success"); } catch (e) { - s(r("toast.renameFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); + m(R("toast.renameFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } - }), Ns(r("ctx.moveFolder"), "pi pi-arrow-right", null, async () => { + }), Fs(R("ctx.moveFolder"), "pi pi-arrow-right", null, async () => { try { - let e = await Lt(r("dialog.destinationDirectoryPath"), ""), n = String(e || "").trim(); + let e = await gt(R("dialog.destinationDirectoryPath"), ""), n = String(e || "").trim(); if (!n) return; - let o = await i({ + let i = await F({ op: "move", - path: a, + path: r, destination: n }); - if (!o?.ok) { - s(o?.error || r("toast.moveFolderFailed"), "error"); + if (!i?.ok) { + m(i?.error || R("toast.moveFolderFailed"), "error"); return; } - Ys(t), s(r("toast.folderMoved"), "success"); + Zs(t), m(R("toast.folderMoved"), "success"); } catch (e) { - s(r("toast.moveFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); + m(R("toast.moveFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } - }), Ns(r("ctx.deleteFolder"), "pi pi-trash", null, async () => { + }), Fs(R("ctx.deleteFolder"), "pi pi-trash", null, async () => { try { - if (!await gt(r("dialog.deleteFolderRecursive", { name: String(e?.filename || r("label.thisFolder", "this folder")) }))) return; - let n = await i({ + if (!await Bt(R("dialog.deleteFolderRecursive", { name: String(e?.filename || R("label.thisFolder", "this folder")) }))) return; + let n = await F({ op: "delete", - path: a, + path: r, recursive: !0 }); if (!n?.ok) { - s(n?.error || r("toast.deleteFolderFailed"), "error"); + m(n?.error || R("toast.deleteFolderFailed"), "error"); return; } - Ys(t), s(r("toast.folderDeleted"), "success"); + Zs(t), m(R("toast.folderDeleted"), "success"); } catch (e) { - s(r("toast.deleteFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); + m(R("toast.deleteFolderFailedDetail", { error: e?.message || String(e || "") }), "error"); } - })), o; + })), i; } -function ic({ asset: e, card: t, gridContainer: n, panelState: i, pointerX: a, pointerY: o, selection: c } = {}) { - let { selectedAssetsNow: l, effectiveSelectionCount: u, isMultiSelected: d, hasSelection: f } = c, p = [], m = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => to({ +function oc({ asset: t, card: n, gridContainer: r, panelState: a, pointerX: o, pointerY: s, selection: c } = {}) { + let { selectedAssetsNow: l, effectiveSelectionCount: u, isMultiSelected: f, hasSelection: p } = c, h = [], g = ({ assets: e = [], index: t = 0, mode: n = "" } = {}) => ro({ assets: e, index: t, mode: n }); - p.push(Ns("Open Viewer", "pi pi-image", uo("OPEN_VIEWER"), () => { + h.push(Fs("Open Viewer", "pi pi-image", po("OPEN_VIEWER"), () => { try { - let t = (f ? Is(n) : []).filter((e) => !$s(e)), r = t.length; - if (r >= 2 && r <= 4) { - m({ - assets: t, + let e = (p ? Rs(r) : []).filter((e) => !tc(e)), n = e.length; + if (n >= 2 && n <= 4) { + g({ + assets: e, index: 0 }); return; } - let i = Gs(n).filter((e) => !$s(e)), a = Ks(i, e?.id); + let i = qs(r).filter((e) => !tc(e)), a = Js(i, t?.id); if (!i.length || a < 0) return; - m({ + g({ assets: i, index: Math.max(0, a) }); } catch (e) { console.debug?.(e); } - }), Ns("Open in Floating Viewer", "pi pi-window-maximize", uo("OPEN_FLOATING_VIEWER"), async () => { + }), Fs("Open in Floating Viewer", "pi pi-window-maximize", po("OPEN_FLOATING_VIEWER"), async () => { try { - let t = (f ? Is(n) : []).filter((e) => !$s(e)); - if (t.length) { - await nt.openAssets({ - assets: t, - index: Math.max(0, t.findIndex((t) => String(t?.id || "") === String(e?.id || ""))) + let e = (p ? Rs(r) : []).filter((e) => !tc(e)); + if (e.length) { + await it.openAssets({ + assets: e, + index: Math.max(0, e.findIndex((e) => String(e?.id || "") === String(t?.id || ""))) }); return; } - await nt.openAssets({ - assets: [e], + await it.openAssets({ + assets: [t], index: 0 }); } catch (e) { console.debug?.(e); } - }), Ns("Load Asset", "pi pi-upload", "L / L+Drop", async () => { - let t = (f ? Is(n) : []).filter((e) => !$s(e)); - await Hs(t.length ? t : [e]) || s("Failed to create a loader node for this asset.", "error"); - }), Ns("Open Graph Map", "pi pi-sitemap", null, async () => { + }), Fs("Load Asset", "pi pi-upload", "L / L+Drop", async () => { + let e = (p ? Rs(r) : []).filter((e) => !tc(e)); + await Ws(e.length ? e : [t]) || m("Failed to create a loader node for this asset.", "error"); + }), Fs("Open Graph Map", "pi pi-sitemap", null, async () => { try { - await nt.openAssets({ - assets: [e], + await it.openAssets({ + assets: [t], index: 0, mode: "graph" }); } catch (e) { console.debug?.(e); } - }), Ns(r("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", uo("METADATA_PANEL"), () => { + }), Fs(R("ctx.showMetadataPanel", "Show metadata panel"), "pi pi-info-circle", po("METADATA_PANEL"), () => { try { - Ws(n, t, e, i); - let r = n?._mjrOpenDetails; - typeof r == "function" && r(); + Ks(r, n, t, a); + let e = r?._mjrOpenDetails; + typeof e == "function" && e(); } catch (e) { console.debug?.(e); } })); - let h = (f ? l : []).filter((e) => !$s(e)), g = h.length; - g === 2 && p.push(Ns("Compare A/B (2 selected)", "pi pi-clone", uo("COMPARE_AB"), () => { + let _ = (p ? l : []).filter((e) => !tc(e)), v = _.length; + v === 2 && h.push(Fs("Compare A/B (2 selected)", "pi pi-clone", po("COMPARE_AB"), () => { try { - m({ - assets: h, + g({ + assets: _, index: 0, mode: "ab" }); } catch (e) { console.debug?.(e); } - })), g >= 2 && g <= 4 && p.push(Ns(`Side-by-side (2x2) (${g} selected)`, "pi pi-table", uo("SIDE_BY_SIDE"), () => { + })), v >= 2 && v <= 4 && h.push(Fs(`Side-by-side (2x2) (${v} selected)`, "pi pi-table", po("SIDE_BY_SIDE"), () => { try { - m({ - assets: h, + g({ + assets: _, index: 0, mode: "sidebyside" }); } catch (e) { console.debug?.(e); } - })), p.push(Ns(r("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", uo("OPEN_IN_FOLDER"), async () => { - let t = await E(e); - t?.ok ? s(r("toast.openedInFolder"), "info", 2e3) : s(t?.error || r("toast.openFolderFailed"), "error"); - }, { disabled: !(e?.id || Ls(e)) }), Ns(r("ctx.copyPath", "Copy path"), "pi pi-copy", uo("COPY_PATH"), async () => { - let t = e?.filepath ? String(e.filepath) : ""; - if (!t) { - s(r("toast.noFilePath"), "error"); + })), h.push(Fs(R("ctx.openInFolder", "Open in folder"), "pi pi-folder-open", po("OPEN_IN_FOLDER"), async () => { + let n = await e(t); + n?.ok ? m(R("toast.openedInFolder"), "info", 2e3) : m(n?.error || R("toast.openFolderFailed"), "error"); + }, { disabled: !(t?.id || zs(t)) }), Fs(R("ctx.copyPath", "Copy path"), "pi pi-copy", po("COPY_PATH"), async () => { + let e = t?.filepath ? String(t.filepath) : ""; + if (!e) { + m(R("toast.noFilePath"), "error"); return; } try { - await navigator.clipboard.writeText(t), s(r("toast.pathCopied"), "success", 2e3); + await navigator.clipboard.writeText(e), m(R("toast.pathCopied"), "success", 2e3); } catch (e) { - console.warn(r("log.clipboardCopyFailed", "Clipboard copy failed"), e), s(r("toast.pathCopyFailed"), "error"); + console.warn(R("log.clipboardCopyFailed", "Clipboard copy failed"), e), m(R("toast.pathCopyFailed"), "error"); } - }), Ns(r("ctx.download", "Download"), "pi pi-download", uo("DOWNLOAD"), () => { - if (!e?.filepath) return; - let t = ze(e.filepath), n = e.filename || "download"; - Bs(t, n), s(r("toast.downloadingFile", "Downloading {filename}...", { filename: n }), "info", 3e3); - }, { disabled: !e?.filepath }), Ns(`Download selected as ZIP (${g})`, "pi pi-file-zip", null, async () => { - await Vs(h); - }, { disabled: g < 2 }), Ns("Add to collection...", "pi pi-bookmark", uo("ADD_TO_COLLECTION"), async () => { - let t = Is(n); - await ti({ - x: a, - y: o, - assets: t.length ? t : [e] + }), Fs(R("ctx.download", "Download"), "pi pi-download", po("DOWNLOAD"), () => { + if (!t?.filepath) return; + let e = ye(t.filepath), n = t.filename || "download"; + Hs(e, n), m(R("toast.downloadingFile", "Downloading {filename}...", { filename: n }), "info", 3e3); + }, { disabled: !t?.filepath }), Fs(`Download selected as ZIP (${v})`, "pi pi-file-zip", null, async () => { + await Us(_); + }, { disabled: v < 2 }), Fs("Add to collection...", "pi pi-bookmark", po("ADD_TO_COLLECTION"), async () => { + let e = Rs(r); + await ni({ + x: o, + y: s, + assets: e.length ? e : [t] }); })); - let _ = String(i?.collectionId || "").trim(); - if (_) { - let t = Is(n), i = (t.length ? t : [e]).map(Ls).filter(Boolean), a = i.length > 1 ? `Remove from collection (${i.length})` : "Remove from collection"; - p.push(Ns(a, "pi pi-bookmark", null, async () => { - if (!i.length) { - s(r("toast.noFilePath"), "error"); + let y = String(a?.collectionId || "").trim(); + if (y) { + let e = Rs(r), n = (e.length ? e : [t]).map(zs).filter(Boolean), i = n.length > 1 ? `Remove from collection (${n.length})` : "Remove from collection"; + h.push(Fs(i, "pi pi-bookmark", null, async () => { + if (!n.length) { + m(R("toast.noFilePath"), "error"); return; } - let e = await k(_, i); + let e = await d(y, n); if (!e?.ok) { - s(e?.error || r("toast.removeFromCollectionFailed"), "error"); + m(e?.error || R("toast.removeFromCollectionFailed"), "error"); return; } - Ys(n); + Zs(r); })); } - let y = !!(e?.id || Ls(e)); - return p.push(Ps(), Ns(r("ctx.editTags", "Edit tags"), "pi pi-tags", uo("EDIT_TAGS"), () => { - ac(a + 6, o + 6, e, () => { - Js(e, { tags: Array.isArray(e?.tags) ? [...e.tags] : [] }); + let b = !!(t?.id || zs(t)); + return h.push(Is(), Fs(R("ctx.editTags", "Edit tags"), "pi pi-tags", po("EDIT_TAGS"), () => { + sc(o + 6, s + 6, t, () => { + Xs(t, { tags: Array.isArray(t?.tags) ? [...t.tags] : [] }); }); - }, { closeOnSelect: !1 }), Ps(), Ns(r("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { - disabled: !y, + }, { closeOnSelect: !1 }), Is(), Fs(R("ctx.setRating", "Set rating"), "pi pi-star", "1-5 >", null, { + disabled: !b, closeOnSelect: !1, - submenu: tc(e, y) - }), Ps(), Ns(r("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { - if (e?.filename || e?.id) { - s(r("toast.rescanningFile", "Rescanning file..."), "info", 1600); + submenu: rc(t, b) + }), Is(), Fs(R("ctx.resetIndexFile", "Reset index (this file)"), "pi pi-refresh", null, async () => { + if (t?.filename || t?.id) { + m(R("toast.rescanningFile", "Rescanning file..."), "info", 1600); try { - let t = await Xs(e, n); - t?.ok ? s(r("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : s(t?.error || r("toast.resetFailed", "Failed to reset index"), "error"); + let e = await Qs(t, r); + e?.ok ? m(R("toast.metadataRefreshed", "Metadata refreshed{suffix}", { suffix: "" }), "success", 1800) : m(e?.error || R("toast.resetFailed", "Failed to reset index"), "error"); } catch (e) { - s(`${r("toast.resetFailed", "Failed to reset index")}: ${e?.message || String(e || "")}`, "error"); + m(`${R("toast.resetFailed", "Failed to reset index")}: ${e?.message || String(e || "")}`, "error"); } } - }, { disabled: !(e?.filename || e?.id) }), Ns("Rename...", "pi pi-pencil", uo("RENAME"), async () => { - if (!(e?.id || Ls(e))) return; - let t = e.filename || "", i = ci(await Lt(r("dialog.rename.title", "Rename file"), t), t); - if (!i || i === t) return; - let a = ai(i); + }, { disabled: !(t?.filename || t?.id) }), Fs("Rename...", "pi pi-pencil", po("RENAME"), async () => { + if (!(t?.id || zs(t))) return; + let e = t.filename || "", n = li(await gt(R("dialog.rename.title", "Rename file"), e), e); + if (!n || n === e) return; + let a = oi(n); if (!a.valid) { - s(a.reason, "error"); + m(a.reason, "error"); return; } try { - let t = await v(e, i); - if (!t?.ok) { - s(t?.error || r("toast.fileRenameFailed"), "error"); + let e = await i(t, n); + if (!e?.ok) { + m(e?.error || R("toast.fileRenameFailed"), "error"); return; } - let a = t?.data?.asset; - a && typeof a == "object" ? (Object.assign(e, a), Js(e, a)) : (e.filename = i, e.filepath &&= String(e.filepath).replace(/[^\\/]+$/, i), e.path &&= String(e.path).replace(/[^\\/]+$/, i), e.file_info && typeof e.file_info == "object" && (e.file_info.filename = i, e.file_info.filepath && (e.file_info.filepath = String(e.file_info.filepath).replace(/[^\\/]+$/, i)), e.file_info.path && (e.file_info.path = String(e.file_info.path).replace(/[^\\/]+$/, i))), Js(e, { - filename: e.filename, - filepath: e.filepath, - path: e.path, - file_info: e.file_info + let a = e?.data?.asset; + a && typeof a == "object" ? (Object.assign(t, a), Xs(t, a)) : (t.filename = n, t.filepath &&= String(t.filepath).replace(/[^\\/]+$/, n), t.path &&= String(t.path).replace(/[^\\/]+$/, n), t.file_info && typeof t.file_info == "object" && (t.file_info.filename = n, t.file_info.filepath && (t.file_info.filepath = String(t.file_info.filepath).replace(/[^\\/]+$/, n)), t.file_info.path && (t.file_info.path = String(t.file_info.path).replace(/[^\\/]+$/, n))), Xs(t, { + filename: t.filename, + filepath: t.filepath, + path: t.path, + file_info: t.file_info })); - let o = qs(e.id)?.querySelector?.(".mjr-filename"); - o && (o.textContent = e.filename || i), s(r("toast.fileRenamedSuccess"), "success"), Ys(n); + let o = Ys(t.id)?.querySelector?.(".mjr-filename"); + o && (o.textContent = t.filename || n), m(R("toast.fileRenamedSuccess"), "success"), Zs(r); } catch (e) { - s(r("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); + m(R("toast.errorRenaming", "Error renaming file: {error}", { error: e?.message || String(e || "") }), "error"); } - }, { disabled: !(e?.id || Ls(e)) })), d ? p.push(Ns(`Delete ${u} files...`, "pi pi-trash", uo("DELETE"), async () => { - if (await ni(Number(u) || 0)) try { - let t = 0, a = 0, o = [], c = 0, u = l.length ? l : [e]; - for (let e of u) (await x(e))?.ok ? (t += 1, e?.id == null ? c += 1 : o.push(String(e.id))) : a += 1; - if (o.length) { - let e = qr(n, o); - i && Array.isArray(e?.selectedIds) && (i.selectedAssetIds = e.selectedIds, i.activeAssetId = e.selectedIds[0] || ""); + }, { disabled: !(t?.id || zs(t)) })), f ? h.push(Fs(`Delete ${u} files...`, "pi pi-trash", po("DELETE"), async () => { + if (await ri(Number(u) || 0)) try { + let e = 0, n = 0, i = [], o = 0, s = l.length ? l : [t]; + for (let t of s) (await w(t))?.ok ? (e += 1, t?.id == null ? o += 1 : i.push(String(t.id))) : n += 1; + if (i.length) { + let e = Jr(r, i); + a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || ""); } - c > 0 && Ys(n), a === 0 ? s(r("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: t }), "success") : s(r("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { - success: t, - failed: a + o > 0 && Zs(r), n === 0 ? m(R("toast.filesDeletedSuccessN", "{n} files deleted successfully!", { n: e }), "success") : m(R("toast.filesDeletedPartial", "{success} files deleted, {failed} failed.", { + success: e, + failed: n }), "warning"); } catch (e) { - s(r("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); + m(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); } - })) : p.push(Ns(r("ctx.delete", "Delete"), "pi pi-trash", uo("DELETE"), async () => { - if (await ni(1, e?.filename)) try { - let t = await x(e); - if (!t?.ok) { - s(t?.error || r("toast.fileDeleteFailed"), "error"); + })) : h.push(Fs(R("ctx.delete", "Delete"), "pi pi-trash", po("DELETE"), async () => { + if (await ri(1, t?.filename)) try { + let e = await w(t); + if (!e?.ok) { + m(e?.error || R("toast.fileDeleteFailed"), "error"); return; } - if (e?.id) { - let t = qr(n, [String(e.id)]); - i && Array.isArray(t?.selectedIds) && (i.selectedAssetIds = t.selectedIds, i.activeAssetId = t.selectedIds[0] || ""); - } else Ys(n); - s(r("toast.fileDeletedSuccess"), "success"); + if (t?.id) { + let e = Jr(r, [String(t.id)]); + a && Array.isArray(e?.selectedIds) && (a.selectedAssetIds = e.selectedIds, a.activeAssetId = e.selectedIds[0] || ""); + } else Zs(r); + m(R("toast.fileDeletedSuccess"), "success"); } catch (e) { - s(r("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); + m(R("toast.errorDeleting", "Error deleting file: {error}", { error: e?.message || String(e || "") }), "error"); } - }, { disabled: !(e?.id || Ls(e)) })), p; + }, { disabled: !(t?.id || zs(t)) })), h; } -function ac(e, t, n, r) { - n && Co({ +function sc(e, t, n, r) { + n && To({ x: e, y: t, asset: n, onChanged: r }); } -function oc({ gridContainer: e, getState: t = () => ({}) } = {}) { +function cc({ gridContainer: e, getState: t = () => ({}) } = {}) { if (!e) return; if (e._mjrGridContextMenuBound && typeof e._mjrGridContextMenuUnbind == "function") return e._mjrGridContextMenuUnbind; let n = async (n) => { @@ -10954,13 +10955,13 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) { } })(), i = Qt(n.target, ".mjr-asset-card"); if (!i) { - if (!Qs(r)) return; + if (!ec(r)) return; let t = String(e?.dataset?.mjrSubfolder || "").trim(); if (!t) return; - n.preventDefault(), n.stopPropagation(), yo({ + n.preventDefault(), n.stopPropagation(), xo({ x: n.clientX, y: n.clientY, - items: nc({ + items: ic({ currentPath: t, gridContainer: e }) @@ -10970,11 +10971,11 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) { n.preventDefault(), n.stopPropagation(); let a = i._mjrAsset; if (!a) return; - let o = ec(e), s = $s(a) ? rc({ + let o = nc(e), s = tc(a) ? ac({ asset: a, gridContainer: e, panelState: r - }) : ic({ + }) : oc({ asset: a, card: i, gridContainer: e, @@ -10983,7 +10984,7 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) { pointerY: n.clientY, selection: o }); - yo({ + xo({ x: n.clientX, y: n.clientY, items: s @@ -11012,12 +11013,12 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) { console.debug?.(e); } try { - pi(); + mi(); } catch (e) { console.debug?.(e); } try { - To(); + Do(); } catch (e) { console.debug?.(e); } @@ -11026,8 +11027,8 @@ function oc({ gridContainer: e, getState: t = () => ({}) } = {}) { } //#endregion //#region ui/features/panel/controllers/ratingHotkeysController.ts -var sc = qt; -function cc(e) { +var lc = Zt; +function uc(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -11036,7 +11037,7 @@ function cc(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function lc(e, t = null) { +function dc(e, t = null) { if (!e) return []; try { let t = Array.from(e.querySelectorAll(".mjr-asset-card.is-selected")); @@ -11052,7 +11053,7 @@ function lc(e, t = null) { } return []; } -function uc(e, t, n) { +function fc(e, t, n) { if (!e) return; let r = e._mjrAsset; r && (r.rating = n); @@ -11065,7 +11066,7 @@ function uc(e, t, n) { console.debug?.(e); } } -async function dc(e, t, n = 5) { +async function pc(e, t, n = 5) { let r = Math.max(1, Number(n) || 1), i = 0, a = [], o = async () => { for (; i < e.length;) { let n = i; @@ -11080,53 +11081,53 @@ async function dc(e, t, n = 5) { for (let t = 0; t < Math.min(r, e.length); t += 1) a.push(o()); await Promise.all(a); } -function fc({ gridContainer: e, createRatingBadge: t } = {}) { - let n = !1, i = null, a = null, o = async (e, n) => { - let i = e?._mjrAsset?.id; - if (i != null) { +function mc({ gridContainer: e, createRatingBadge: t } = {}) { + let n = !1, r = null, i = null, a = async (e, n) => { + let r = e?._mjrAsset?.id; + if (r != null) { try { - let e = await we(i, n); + let e = await O(r, n); if (!e?.ok) { - s(e?.error || r("toast.ratingUpdateFailed"), "error"); + m(e?.error || R("toast.ratingUpdateFailed"), "error"); return; } - s(r("toast.ratingSetN", { n }), "success", 1500); + m(R("toast.ratingSetN", { n }), "success", 1500); } catch { - s(r("toast.ratingUpdateError"), "error"); + m(R("toast.ratingUpdateError"), "error"); return; } - uc(e, t, n); + fc(e, t, n); } }; return { bind: () => { if (!(n || !e)) { - n = !0, Ge(!0), i = async (t) => { - if (L() || We().scope === "viewer" || t.defaultPrevented) return; + n = !0, B(!0), r = async (t) => { + if (Ze() || Ke().scope === "viewer" || t.defaultPrevented) return; let n = String(t.key || ""); if (n !== "0" && n !== "1" && n !== "2" && n !== "3" && n !== "4" && n !== "5") return; let r = document.querySelector(".mjr-viewer-overlay"); if (r && r.style.display !== "none" || !(e.contains(t.target) || e === t.target)) return; let i = n === "0" ? 0 : Number(n); if (!Number.isFinite(i)) return; - let a = lc(e, t.target); - a.length && (a.length > 0 && (t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.()), await dc(a, (e) => o(e, i), 5)); - }, a = (n) => { + let o = dc(e, t.target); + o.length && (o.length > 0 && (t.preventDefault(), t.stopPropagation(), t.stopImmediatePropagation?.()), await pc(o, (e) => a(e, i), 5)); + }, i = (n) => { let r = n?.detail || {}, i = r.assetId ?? r.id ?? null, a = Number(r.rating); if (!(!i || !Number.isFinite(a))) try { - let n = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${cc(i)}"]`); - n && uc(n, t, a); + let n = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${uc(i)}"]`); + n && fc(n, t, a); } catch (e) { console.debug?.(e); } }; try { - window.addEventListener("keydown", i, { capture: !0 }); + window.addEventListener("keydown", r, { capture: !0 }); } catch (e) { console.debug?.(e); } try { - window.addEventListener(sc, a); + window.addEventListener(lc, i); } catch (e) { console.debug?.(e); } @@ -11134,25 +11135,25 @@ function fc({ gridContainer: e, createRatingBadge: t } = {}) { }, dispose: () => { if (n) { - n = !1, Ge(!1); + n = !1, B(!1); try { - window.removeEventListener("keydown", i, { capture: !0 }); + window.removeEventListener("keydown", r, { capture: !0 }); } catch (e) { console.debug?.(e); } try { - window.removeEventListener(sc, a); + window.removeEventListener(lc, i); } catch (e) { console.debug?.(e); } - i = null, a = null; + r = null, i = null; } } }; } //#endregion //#region ui/features/grid/StackGroupCards.ts -function pc(e) { +function hc(e) { if (!e || e.dataset?.mjrOverlayButtonBound === "1") return e; try { e.dataset.mjrOverlayButtonBound = "1"; @@ -11171,7 +11172,7 @@ function pc(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 mc(e, t, n = null, r = "mjr-stack-group-button-count") { +function gc(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) { @@ -11179,24 +11180,24 @@ function mc(e, t, n = null, r = "mjr-stack-group-button-count") { t.className = r, t.textContent = String(n), e.appendChild(t); } } -function hc(e) { +function _c(e) { return String(e?.dataset?.mjrGroupStacks || "") === "1"; } -function gc(e) { +function vc(e) { let t = String(e?.stack_id || "").trim(); return t ? `stack:${t}` : ""; } -function _c(e, t, n) { - return hc(e) && gc(t) || n; +function yc(e, t, n) { + return _c(e) && vc(t) || n; } -function vc(e) { +function bc(e) { try { e._mjrStackMembersCache?.clear?.(); } catch (e) { console.debug?.(e); } } -function yc(e, t, n) { +function xc(e, t, n) { if (!t || !n || t._mjrIsVue) return; let r = !!n._mjrDupStack, i = Number(n._mjrDupCount || 0) || 0; if (!r || i < 2) { @@ -11206,13 +11207,13 @@ function yc(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"), pc(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"), hc(a), a.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(); try { let e = a?._mjrGridContainer, t = a?._mjrAsset; if (!e || !t) return; let n = Array.isArray(t._mjrDupMembers) ? t._mjrDupMembers : [t], r = n.length; - e.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, { + e.dispatchEvent(new CustomEvent(H.OPEN_STACK_GROUP, { bubbles: !0, detail: { asset: t, @@ -11226,22 +11227,22 @@ function yc(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`, mc(a, "pi pi-copy", i, "mjr-dup-stack-count"); + a.title = `${o} - click to compare all copies`, gc(a, "pi pi-copy", i, "mjr-dup-stack-count"); } //#endregion //#region ui/features/dnd/utils/log.ts -var bc = () => { +var Sc = () => { try { return !!window?.MJR_DND_DEBUG; } catch { return !1; } -}, xc = (...e) => { - bc() && console.debug("[Majoor.DnD]", ...e); -}, Sc = (e, { buildCustomViewURL: t, buildViewURL: n }) => { +}, Cc = (...e) => { + Sc() && console.debug("[Majoor.DnD]", ...e); +}, wc = (e, { buildCustomViewURL: t, buildViewURL: n }) => { let r = String(e?.type || "output").toLowerCase(); return r === "custom" ? t(e?.filename || "", e?.subfolder || "", Oe(e)) : r === "input" ? n(e?.filename || "", e?.subfolder || "", "input") : r === "temp" ? n(e?.filename || "", e?.subfolder || "", "temp") : n(e?.filename || "", e?.subfolder || "", "output"); -}, Cc = (e) => { +}, Tc = (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; @@ -11253,42 +11254,42 @@ var bc = () => { root_id: a || void 0, kind: o || void 0 }; -}, wc = Cc, Tc = (e, t) => { +}, Ec = Tc, Dc = (e, t) => { let n = e?.dataTransfer?.getData?.(t); if (!n) return null; try { - return Cc(JSON.parse(n)); + return Tc(JSON.parse(n)); } catch { return null; } -}, Ec = /* @__PURE__ */ new WeakMap(), Dc = !1; -function Oc(e) { - return e && Ec.get(e) || null; -} -function kc(e, t) { - return e ? typeof t == "function" ? (Ec.set(e, t), t) : (Ec.delete(e), null) : null; -} +}, Oc = /* @__PURE__ */ new WeakMap(), kc = !1; function Ac(e) { - e && Ec.delete(e); + return e && Oc.get(e) || null; } -function jc() { - Dc = !0; +function jc(e, t) { + return e ? typeof t == "function" ? (Oc.set(e, t), t) : (Oc.delete(e), null) : null; } -function Mc() { - return Dc ? (Dc = !1, !0) : !1; +function Mc(e) { + e && Oc.delete(e); } function Nc() { - Dc = !1; + kc = !0; +} +function Pc() { + return kc ? (kc = !1, !0) : !1; +} +function Fc() { + kc = !1; } //#endregion //#region ui/features/dnd/out/DragOut.ts -var Pc = (e) => { +var Ic = (e) => { try { return new URL(String(e || ""), window.location.href).href; } catch { return String(e || ""); } -}, Fc = () => Ee("mjr_", 24), Ic = (e) => { +}, Lc = () => De("mjr_", 24), Rc = (e) => { let t = e && typeof e == "object" ? e : null; if (!t) return null; let n = t.filename || t.name; @@ -11298,7 +11299,7 @@ var Pc = (e) => { type: String(t.type || "output").toLowerCase(), root_id: Oe(t) || void 0 } : null; -}, Lc = (e, t) => { +}, zc = (e, t) => { let n = []; if (!e || !t) return n; let r = t?.dataset?.mjrAssetId ? String(t.dataset.mjrAssetId) : ""; @@ -11348,25 +11349,25 @@ var Pc = (e) => { !t || typeof t != "object" || n.push(t); } return n; -}, Rc = (e) => { +}, Bc = (e) => { if (!e || typeof e != "object") return ""; let t = e.filepath || e.path || e?.file_info?.filepath || ""; return t ? String(t) : ""; -}, zc = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { +}, Vc = ({ dt: e, asset: t, containerEl: n, card: r, viewUrl: i, stripMetadata: a = !1 }) => { if (!e || !t) return; - let o = Lc(n, r); + let o = zc(n, r); if (Array.isArray(o) && o.length > 1) { - let t = o.map(Ic).filter(Boolean); + let t = o.map(Rc).filter(Boolean); if (t.length > 1) { let n = ""; try { - n = Fc(); + n = Lc(); } catch (e) { console.warn("[DragOut] failed to create secure batch token", e); } if (n) { try { - ye(Le.BATCH_ZIP_CREATE, { + y(L.BATCH_ZIP_CREATE, { token: n, items: t, strip_metadata: !!a @@ -11374,7 +11375,7 @@ var Pc = (e) => { } catch (e) { console.debug?.(e); } - let r = Pc(Fe(n)), i = a ? `Majoor_Clean_Batch_${t.length}.zip` : `Majoor_Batch_${t.length}.zip`; + let r = Ic(he(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 = "copy"; } catch (e) { @@ -11386,38 +11387,38 @@ var Pc = (e) => { } let s = t.filename || t.name; if (!s) return; - let c = a ? Rc(t) : "", l = Pc((c ? Re(c) : "") || i), u = Uo(s); + let c = a ? Bc(t) : "", l = Ic((c ? Te(c) : "") || i), u = Go(s); try { e.setData("text/uri-list", l), e.setData("DownloadURL", `${u}:${s}:${l}`), e.effectAllowed = "copy"; } catch (e) { console.debug?.(e); } -}, Bc = (e, { asset: t, containerEl: n, card: r }) => { +}, Hc = (e, { asset: t, containerEl: n, card: r }) => { if (!(!e || !t)) try { let t = e?.dataTransfer?.dropEffect; - !t || t === "none" || Mc(); + !t || t === "none" || Pc(); return; } catch (e) { console.debug?.(e); } -}, Vc = () => { - let e = fe(); +}, Uc = () => { + let e = be(); return e && typeof e == "object" ? e : null; -}, Hc = (e) => Sc(e, { - buildCustomViewURL: ke, - buildViewURL: Pe -}), Uc = !1, Wc = !1, Gc = (e) => { +}, Wc = (e) => wc(e, { + buildCustomViewURL: we, + buildViewURL: Ne +}), Gc = !1, Kc = !1, qc = (e) => { try { return !!e?.closest?.("input, textarea, select, [contenteditable='true']"); } catch { return !1; } -}, Kc = () => Uc === !0, qc = () => Wc === !0, Jc = (e) => [ +}, Jc = () => Gc === !0, Yc = () => Kc === !0, Xc = (e) => [ String(e?.type || "output"), String(e?.filename || ""), String(e?.subfolder || ""), String(Oe(e) || "") -].join("\n"), Yc = (e, t) => { +].join("\n"), Zc = (e, t) => { if (String(e?.type || e?.file_info?.type || "").toLowerCase() === "custom") return null; let n = Me(String(e?.filepath || e?.path || e?.fullpath || e?.full_path || e?.file_info?.filepath || e?.file_info?.path || "")).trim(); if (!n || !t) return null; @@ -11447,11 +11448,11 @@ var Pc = (e) => { }; } return null; -}, Xc = (e) => { +}, Qc = (e) => { if (!e || typeof e != "object") return null; let t = String(e.filename || "").trim(); if (!t) return null; - let n = Yc(e, t); + let n = Zc(e, t); return { filename: t, subfolder: n?.subfolder ?? e.subfolder ?? "", @@ -11459,7 +11460,7 @@ var Pc = (e) => { root_id: Oe(e) || void 0, kind: String(e.kind || "").toLowerCase() }; -}, Zc = (e, t, n) => { +}, $c = (e, t, n) => { if (!e || !t || n == null) return !1; let r = String(n); try { @@ -11473,10 +11474,10 @@ var Pc = (e) => { console.debug?.(e); } return !1; -}, Qc = ({ dt: e, asset: t, payload: n, viewUrl: r }) => { +}, el = ({ 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 ? Jc(n) : String(t.id), + id: t.id == null ? Xc(n) : String(t.id), name: t.filename || n.filename, display_name: t.filename || n.filename, filename: n.filename, @@ -11492,46 +11493,46 @@ var Pc = (e) => { }, tags: Array.isArray(t.tags) ? t.tags : [] }; - Zc(e, Oo, JSON.stringify(a)), r && Zc(e, "text/uri-list", r); -}, $c = (e) => { + $c(e, Ao, JSON.stringify(a)), r && $c(e, "text/uri-list", r); +}, tl = (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(Xc).filter(Vo), r = Jc(t); - if (e.some((e) => Jc(e) === r)) return e; + let e = n.map(Qc).filter(Uo), r = Xc(t); + if (e.some((e) => Xc(e) === r)) return e; } } catch (e) { console.debug?.(e); } return [t]; -}, el = (e, t) => { +}, nl = (e, t) => { try { let n = typeof e?._mjrGetSelectedAssets == "function" ? e._mjrGetSelectedAssets() : []; if (!Array.isArray(n) || n.length <= 1) return []; - let r = n.map(Xc).filter(Vo), i = Jc(t); - return r.some((e) => Jc(e) === i) ? r : []; + let r = n.map(Qc).filter(Uo), i = Xc(t); + return r.some((e) => Xc(e) === i) ? r : []; } catch (e) { return console.debug?.(e), []; } -}, tl = (e, t) => { +}, rl = (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(wc).filter(Vo); + let e = JSON.parse(t), n = (Array.isArray(e?.items) ? e.items : Array.isArray(e) ? e : []).map(Ec).filter(Uo); if (n.length) return n; } } catch (e) { console.debug?.(e); } - return $c(t); -}, nl = async (e) => { + return tl(t); +}, il = async (e) => { let t = Array.isArray(e) ? e.filter(Boolean) : []; return t.length ? (await Promise.all(t.map(async (e) => { - let t = (await As({ - post: ye, - endpoint: Le.STAGE_TO_INPUT, + let t = (await Ms({ + post: y, + endpoint: L.STAGE_TO_INPUT, payload: e, index: !1 }))?.relativePath; @@ -11541,43 +11542,43 @@ var Pc = (e) => { droppedExt: String(e?.filename || "").split(".").pop() || "" } : null; }))).filter(Boolean) : []; -}, rl = /* @__PURE__ */ new Map(), il = 6e4, al = 20, ol = 5 * 1024 * 1024, sl = 5e3, cl = 2e4, ll = 256, ul = 8192, dl = /[\u0000-\u001f\u007f]/, fl = /\u0000/, pl = (e) => dl.test(String(e || "")), ml = (e) => fl.test(String(e || "")), hl = (e) => { +}, al = /* @__PURE__ */ new Map(), ol = 6e4, sl = 20, cl = 5 * 1024 * 1024, ll = 5e3, ul = 2e4, dl = 256, fl = 8192, pl = /[\u0000-\u001f\u007f]/, ml = /\u0000/, hl = (e) => pl.test(String(e || "")), gl = (e) => ml.test(String(e || "")), _l = (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 > ll || pl(n))) return !1; + if (n && (n.length > dl || hl(n))) return !1; let r = e.widgets_values; if (Array.isArray(r)) { - for (let e of r) if (typeof e == "string" && (e.length > ul || ml(e))) return !1; + for (let e of r) if (typeof e == "string" && (e.length > fl || gl(e))) return !1; } return !0; -}, gl = (e) => { +}, vl = (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; -}, _l = (e) => { - if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > sl || e.links.length > cl || !e.nodes.every(hl) || !e.links.every(gl)) return !1; +}, yl = (e) => { + if (!e || typeof e != "object" || !Array.isArray(e.nodes) || !Array.isArray(e.links) || e.nodes.length > ll || e.links.length > ul || !e.nodes.every(_l) || !e.links.every(vl)) return !1; try { let t = JSON.stringify(e).length; - if (!Number.isFinite(t) || t <= 0 || t > ol) return !1; + if (!Number.isFinite(t) || t <= 0 || t > cl) return !1; } catch { return !1; } return !0; -}, vl = () => { +}, bl = () => { let e = Date.now(); - for (let [t, n] of rl.entries()) e - (n?.at || 0) > il && rl.delete(t); - rl.size > al && Array.from(rl.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, rl.size - al).forEach(([e]) => rl.delete(e)); -}, yl = async (e, t = null) => { - let n = e && typeof e == "object" ? e : null, r = Oe(n), i = Vc(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; + for (let [t, n] of al.entries()) e - (n?.at || 0) > ol && al.delete(t); + al.size > sl && Array.from(al.entries()).sort((e, t) => (e[1]?.at || 0) - (t[1]?.at || 0)).slice(0, al.size - sl).forEach(([e]) => al.delete(e)); +}, xl = async (e, t = null) => { + let n = e && typeof e == "object" ? e : null, r = Oe(n), i = Uc(), a = n?.filename ? `${n.type || "output"}:${n.filename}:${n.subfolder || ""}:${r}` : t ? `path:${t}` : null; if (a) { - let e = rl.get(a); - if (e && Date.now() - (e.at || 0) < il) { - if (e.workflow && _l(e.workflow)) try { + let e = al.get(a); + if (e && Date.now() - (e.at || 0) < ol) { + if (e.workflow && yl(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); @@ -11598,19 +11599,19 @@ var Pc = (e) => { try { let e = null, o = null; if (n?.filename) { - let t = await P(`${Le.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : "")); - t?.ok && t.workflow && (o = t.workflow), o || (e = `${Le.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); - } else t && (e = `${Le.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); + let t = await ne(`${L.WORKFLOW_QUICK}?type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}` + (r ? `&root_id=${encodeURIComponent(r)}` : "")); + t?.ok && t.workflow && (o = t.workflow), o || (e = `${L.METADATA}?workflow_only=1&type=${encodeURIComponent(n.type || "output")}&filename=${encodeURIComponent(n.filename)}&subfolder=${encodeURIComponent(n.subfolder || "")}&root_id=${encodeURIComponent(r)}`); + } else t && (e = `${L.METADATA}?workflow_only=1&path=${encodeURIComponent(String(t))}`); if (!o && e) { - let t = await P(e); + let t = await ne(e); if (!t?.ok || !t.data) return !1; o = t.data?.workflow; } - if (!_l(o)) return !1; - if (a && (rl.set(a, { + if (!yl(o)) return !1; + if (a && (al.set(a, { workflow: o, at: Date.now() - }), vl()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; + }), bl()), typeof i?.loadGraphData == "function") return i.loadGraphData(o), !0; if (typeof i?.canvas?.graph?.configure == "function") { i.canvas.graph.configure(o); try { @@ -11626,7 +11627,7 @@ var Pc = (e) => { } return !1; }; -function bl(e) { +function Sl(e) { return (t) => { let n = t?.dataTransfer; if (!n) return; @@ -11634,7 +11635,7 @@ function bl(e) { if (!r) return; let i = r._mjrAsset; if (!i || typeof i != "object") return; - let a = String(i?.kind || "").toLowerCase(), o = Yc(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { + let a = String(i?.kind || "").toLowerCase(), o = Zc(i, String(i.filename || "")), s = o?.type ?? String(i?.type || "output").toLowerCase(), c = { filename: i.filename, subfolder: o?.subfolder ?? i.subfolder ?? "", type: s, @@ -11642,17 +11643,17 @@ function bl(e) { kind: a }; try { - let t = Kc(); - Zc(n, Eo, JSON.stringify(c)); - let a = el(e, c); - a.length > 1 && Zc(n, Do, JSON.stringify({ items: a })), Zc(n, "text/plain", String(i.filename || "")); - let o = Hc(c); - Qc({ + let t = Jc(); + $c(n, Oo, JSON.stringify(c)); + let a = nl(e, c); + a.length > 1 && $c(n, ko, JSON.stringify({ items: a })), $c(n, "text/plain", String(i.filename || "")); + let o = Wc(c); + el({ dt: n, asset: i, payload: c, viewUrl: o - }), zc({ + }), Vc({ dt: n, asset: i, containerEl: e, @@ -11665,7 +11666,7 @@ function bl(e) { } try { r.addEventListener("dragend", (t) => { - Bc(t, { + Hc(t, { asset: i, containerEl: e, card: r @@ -11682,30 +11683,30 @@ function bl(e) { } }; } -var xl = (e) => { +var Cl = (e) => { if (!e) return () => {}; - let t = Oc(e); + let t = Ac(e); if (typeof t == "function") return t; - let n = bl(e); - return e.addEventListener("dragstart", n, !0), kc(e, () => { + let n = Sl(e); + return e.addEventListener("dragstart", n, !0), jc(e, () => { try { e.removeEventListener("dragstart", n, !0); } catch (e) { console.debug?.(e); } - Ac(e); + Mc(e); }); -}, Sl = null, Cl = 0; -function wl() { +}, wl = null, Tl = 0; +function El() { let e = (e) => { - if (Gc(e?.target)) return; + if (qc(e?.target)) return; let t = String(e?.key || "").toLowerCase(); - t === "s" ? Uc = !0 : t === "l" && (Wc = !0); + t === "s" ? Gc = !0 : t === "l" && (Kc = !0); }, t = (e) => { let t = String(e?.key || "").toLowerCase(); - t === "s" ? Uc = !1 : t === "l" && (Wc = !1); + t === "s" ? Gc = !1 : t === "l" && (Kc = !1); }, n = () => { - Uc = !1, Wc = !1; + Gc = !1, Kc = !1; }, r = new Set([ "mp3", "wav", @@ -11721,94 +11722,94 @@ function wl() { t && (i = t.resolvedStart === void 0 ? t.start : t.resolvedStart); } e._ghostSegmentId = null, e._ghostTrack = null, e._ghostInitialTimeline = null, e._previewSegments = null, e.render?.(); - let a = String(n || "").toLowerCase(), o = r.has(a), c = await As({ - post: ye, - endpoint: Le.STAGE_TO_INPUT, + let a = String(n || "").toLowerCase(), o = r.has(a), s = await Ms({ + post: y, + endpoint: L.STAGE_TO_INPUT, payload: t, index: !1 }); - if (!c?.name) { - s(`Failed to stage: "${t?.filename}"`, "error"); + if (!s?.name) { + m(`Failed to stage: "${t?.filename}"`, "error"); return; } - let { name: l, subfolder: u = "" } = c, d = u ? `${u}/${l}` : l, f = `/view?filename=${encodeURIComponent(l)}&type=input&subfolder=${encodeURIComponent(u)}`; + let { name: c, subfolder: l = "" } = s, u = l ? `${l}/${c}` : c, d = `/view?filename=${encodeURIComponent(c)}&type=input&subfolder=${encodeURIComponent(l)}`; if (o) { try { - let t = await fetch(f); + let t = await fetch(d); if (!t.ok) throw Error(`HTTP ${t.status}`); - let n = await t.arrayBuffer(), r = await new (window.AudioContext || window.webkitAudioContext)().decodeAudioData(n), a = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, o = Math.max(1, Math.ceil(r.duration * a)), c = r.getChannelData(0), u = Math.max(1, Math.floor(c.length / 200)), p = []; + let n = await t.arrayBuffer(), r = await new (window.AudioContext || window.webkitAudioContext)().decodeAudioData(n), a = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, o = Math.max(1, Math.ceil(r.duration * a)), s = r.getChannelData(0), l = Math.max(1, Math.floor(s.length / 200)), f = []; for (let e = 0; e < 200; e++) { let t = 0; - for (let n = 0; n < u; n++) { - let r = Math.abs(c[e * u + n] || 0); + for (let n = 0; n < l; n++) { + let r = Math.abs(s[e * l + n] || 0); r > t && (t = r); } - p.push(t); + f.push(t); } - let m = i ?? 0; + let p = i ?? 0; if (i === null) { let t = Array.isArray(e.timeline?.audioSegments) ? [...e.timeline.audioSegments] : []; t.sort((e, t) => e.start - t.start); for (let e of t) { - if (m + o <= e.start) break; - m = Math.max(m, e.start + e.length); + if (p + o <= e.start) break; + p = Math.max(p, e.start + e.length); } } let h = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), g = { id: h, type: "audio", - start: m, + start: p, length: o, trimStart: 0, audioDurationFrames: o, - audioFile: d, - fileName: l, - waveformPeaks: p + audioFile: u, + fileName: c, + waveformPeaks: f }; if (!e.timeline?.audioSegments) { - xc("ltxdirector inject: no audioSegments", {}); + Cc("ltxdirector inject: no audioSegments", {}); return; } - e.timeline.audioSegments.push(g), e.timeline.audioSegments.sort((e, t) => e.start - t.start), e.selectionType = "audio", e.selectedIndex = e.timeline.audioSegments.findIndex((e) => e.id === h), e.updateUIFromSelection?.(), e.commitChanges?.(!0), e.render?.(), s(`Added audio to LTX Director: ${l}`, "success", 3e3), xc("drop ltxdirector inject audio", { - file: l, - start: m + e.timeline.audioSegments.push(g), e.timeline.audioSegments.sort((e, t) => e.start - t.start), e.selectionType = "audio", e.selectedIndex = e.timeline.audioSegments.findIndex((e) => e.id === h), e.updateUIFromSelection?.(), e.commitChanges?.(!0), e.render?.(), m(`Added audio to LTX Director: ${c}`, "success", 3e3), Cc("drop ltxdirector inject audio", { + file: c, + start: p }); } catch (e) { - console.error("[Majoor] LTX Director audio inject failed", e), s(`Audio decode failed for: ${l}`, "error"); + console.error("[Majoor] LTX Director audio inject failed", e), m(`Audio decode failed for: ${c}`, "error"); } return; } - let p = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, m = i ?? 0; + let f = typeof e.getFrameRate == "function" ? e.getFrameRate() : 25, p = i ?? 0; if (i === null) { let t = Array.isArray(e.timeline?.segments) ? [...e.timeline.segments] : []; t.sort((e, t) => e.start - t.start); for (let e of t) { - if (m + p <= e.start) break; - m = Math.max(m, e.start + e.length); + if (p + f <= e.start) break; + p = Math.max(p, e.start + e.length); } } let h = Date.now().toString(36) + Math.random().toString(36).slice(2, 7), g = { id: h, - start: m, - length: p, + start: p, + length: f, prompt: "", type: "image", - imageFile: d, - imageB64: f + imageFile: u, + imageB64: d }; if (!e.timeline?.segments) { - xc("ltxdirector inject: no timeline", {}); + Cc("ltxdirector inject: no timeline", {}); return; } e.timeline.segments.push(g), e.timeline.segments.sort((e, t) => e.start - t.start); let _ = new Image(); _.onload = () => { g.imgObj = _, e.render?.(); - }, _.src = f; + }, _.src = d; let v = e.timeline.segments.findIndex((e) => e.id === h); - v >= 0 && (e.selectionType = "image", e.selectedIndex = v, e.updateUIFromSelection?.()), e.commitChanges?.(!0), e.render?.(), s(`Added to LTX Director: ${l}`, "success", 3e3), xc("drop ltxdirector inject", { - file: l, - start: m, + v >= 0 && (e.selectionType = "image", e.selectedIndex = v, e.updateUIFromSelection?.()), e.commitChanges?.(!0), e.render?.(), m(`Added to LTX Director: ${c}`, "success", 3e3), Cc("drop ltxdirector inject", { + file: c, + start: p, ext: a }); }; @@ -11817,171 +11818,171 @@ function wl() { onKeyUp: t, onWindowBlur: n, onDragOver: (e) => { - let t = Vc(); + let t = Uc(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; - let n = Tc(e, Eo); - if (!Vo(n)) return; - let r = ts(t, e.clientX, e.clientY), i = r ? hs(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? ms(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; + let n = Dc(e, Oo); + if (!Uo(n)) return; + let r = rs(t, e.clientX, e.clientY), i = r ? _s(t, r, e.clientX, e.clientY) : null, a = String(n?.filename || "").split(".").pop() || "", o = r && !i ? gs(r, n, a) : null, s = r && !i && !o && !!r._timelineEditor; if (r && (i || o || s)) { - e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), ns(t, r, vs), e.dataTransfer.dropEffect = "copy", i ? xc("dragover slot", { + e.preventDefault(), s || (e.stopImmediatePropagation?.(), e.stopPropagation()), is(t, r, bs), e.dataTransfer.dropEffect = "copy", i ? Cc("dragover slot", { node: r?.title, slot: i.input?.name - }) : s ? xc("dragover ltxdirector", { node: r?.title }) : xc("dragover widget", { + }) : s ? Cc("dragover ltxdirector", { node: r?.title }) : Cc("dragover widget", { node: r?.title, widget: o?.name }); return; } - rs(t, vs), _s(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy"); + as(t, bs), ys(t, e) && (e.preventDefault(), e.dataTransfer.dropEffect = "copy"); }, onDrop: async (e) => { - let t = Vc(); + let t = Uc(); if (!Array.from(e?.dataTransfer?.types || []).includes("application/x-mjr-asset")) return; - let n = Tc(e, Eo); - if (!Vo(n) || !_s(t, e)) return; - jc(); - let r = qc(), a = r ? tl(e, n) : [n], o = ts(t, e.clientX, e.clientY), c = o ? hs(t, o, e.clientX, e.clientY) : null, l = String(n?.filename || "").split(".").pop() || "", u = o && !c ? ms(o, n, l) : null; - if (o && c) { - e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), rs(t, vs); - let r = await js({ - post: ye, - endpoint: Le.STAGE_TO_INPUT, + let n = Dc(e, Oo); + if (!Uo(n) || !ys(t, e)) return; + Nc(); + let r = Yc(), a = r ? rl(e, n) : [n], o = rs(t, e.clientX, e.clientY), s = o ? _s(t, o, e.clientX, e.clientY) : null, c = String(n?.filename || "").split(".").pop() || "", l = o && !s ? gs(o, n, c) : null; + if (o && s) { + e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), as(t, bs); + let r = await Ns({ + post: y, + endpoint: L.STAGE_TO_INPUT, payload: n, index: !1 }); if (!r) return; - if (Os({ + if (As({ app: t, payload: n, relativePath: r, targetNode: o, - inputSlotIndex: c.index, + inputSlotIndex: s.index, event: e })) { - xc("drop slot created and connected loader", { + Cc("drop slot created and connected loader", { node: o?.title, - slot: c.input?.name, + slot: s.input?.name, value: r }); return; } - s(`Staged to input: ${r}`, "success", 4e3); + m(`Staged to input: ${r}`, "success", 4e3); return; } - if (o && !c && !u && o._timelineEditor && !r) { - e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), rs(t, vs), await i(o._timelineEditor, n, l); + if (o && !s && !l && o._timelineEditor && !r) { + e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), as(t, bs), await i(o._timelineEditor, n, c); return; } - if (!o || !u) { - if (rs(t, vs), e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), r) { - let r = Es({ + if (!o || !l) { + if (as(t, bs), e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), r) { + let r = Os({ app: t, - items: await nl(a), + items: await il(a), event: e }); if (r > 0) { - xc("drop canvas created loaders", { count: r }); + Cc("drop canvas created loaders", { count: r }); return; } - s(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); + m(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); return; } - let i = !o && !r, c = As({ - post: ye, - endpoint: Le.STAGE_TO_INPUT, + let i = !o && !r, s = Ms({ + post: y, + endpoint: L.STAGE_TO_INPUT, payload: n, index: !1 - }), u = i ? yl(n) : Promise.resolve(!1), [d, f] = await Promise.all([u, c]); - if (d) { - xc("drop canvas loaded workflow", { file: n?.filename }); + }), l = i ? xl(n) : Promise.resolve(!1), [u, d] = await Promise.all([l, s]); + if (u) { + Cc("drop canvas loaded workflow", { file: n?.filename }); return; } - let p = f?.relativePath; - if (!p) { - xc("drop canvas stage failed"), s(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); + let f = d?.relativePath; + if (!f) { + Cc("drop canvas stage failed"), m(`Failed to load file: "${n?.filename}". Staging failed.`, "error"); return; } - if (xc("drop canvas staged", { value: p }), Es({ + if (Cc("drop canvas staged", { value: f }), Os({ app: t, items: [{ payload: n, - relativePath: p, - droppedExt: l + relativePath: f, + droppedExt: c }], event: e })) { - xc("drop canvas created loader", { value: p }); + Cc("drop canvas created loader", { value: f }); return; } - s(`Staged to input: ${p}`, "success", 4e3); + m(`Staged to input: ${f}`, "success", 4e3); return; } - e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), rs(t, vs); - let d = await js({ - post: ye, - endpoint: Le.STAGE_TO_INPUT, + e.preventDefault(), e.stopImmediatePropagation?.(), e.stopPropagation(), as(t, bs); + let u = await Ns({ + post: y, + endpoint: L.STAGE_TO_INPUT, payload: n, index: !1 }); - d && (Ds(u, d), vs(t), xc("drop inject", { + u && (ks(l, u), bs(t), Cc("drop inject", { node: o?.title, - widget: u?.name, - value: d + widget: l?.name, + value: u })); }, onDragLeave: () => { - rs(Vc(), vs), xc("dragleave"); + as(Uc(), bs), Cc("dragleave"); } }; } -function Tl() { +function Dl() { if (typeof window > "u" || !window?.addEventListener) return { dispose() {} }; - let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = wl(); + let { onKeyDown: e, onKeyUp: t, onWindowBlur: n, onDragOver: r, onDrop: i, onDragLeave: a } = El(); 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); } - Uc = !1, Wc = !1; + Gc = !1, Kc = !1; try { - rs(Vc(), vs); + as(Uc(), bs); } catch (e) { console.debug?.(e); } } }; } -function El() { - Sl || (Sl = Tl(), Cl = 0), Cl += 1; +function Ol() { + wl || (wl = Dl(), Tl = 0), Tl += 1; let e = !1; return ({ force: t = !1 } = {}) => { - e || (e = !0, Dl({ force: t })); + e || (e = !0, kl({ force: t })); }; } -function Dl({ force: e = !1 } = {}) { - if (!Sl) { - Cl = 0, Nc(); +function kl({ force: e = !1 } = {}) { + if (!wl) { + Tl = 0, Fc(); return; } - if (!e && Cl > 1) { - --Cl; + if (!e && Tl > 1) { + --Tl; return; } - Cl = 0; + Tl = 0; try { - Sl.dispose?.(); + wl.dispose?.(); } catch (e) { console.debug?.(e); } - Sl = null, Nc(); + wl = null, Fc(); } //#endregion //#region ui/features/grid/MediaBlobCache.ts -var Ol = "__MJR_MEDIA_BLOB_CACHE__", kl = 2e3, Al = 1440 * 60 * 1e3, jl = 600 * 1e3, Ml = 6; -function Nl() { +var Al = "__MJR_MEDIA_BLOB_CACHE__", jl = 2e3, Ml = 1440 * 60 * 1e3, Nl = 600 * 1e3, Pl = 6; +function Fl() { let e = /* @__PURE__ */ new Map(), t = null, n = 0, r = []; async function i(e) { - n >= Ml && await new Promise((e) => r.push(e)), n += 1; + n >= Pl && await new Promise((e) => r.push(e)), n += 1; try { return await e(); } finally { @@ -11991,7 +11992,7 @@ function Nl() { } } function a() { - t ||= setInterval(o, jl); + t ||= setInterval(o, Nl); } function o() { try { @@ -12014,7 +12015,7 @@ function Nl() { t && (s(e.get(t)), e.delete(t)); } function l(e) { - e.expiresAt = Date.now() + Al; + e.expiresAt = Date.now() + Ml; } function u(e) { try { @@ -12028,10 +12029,10 @@ function Nl() { let n = u(t); if (!n) return; let r = e.get(n); - r ? (r.hasError = !0, l(r)) : (e.size >= kl && c(), e.set(n, { + r ? (r.hasError = !0, l(r)) : (e.size >= jl && c(), e.set(n, { blobUrl: null, refcount: 0, - expiresAt: Date.now() + Al, + expiresAt: Date.now() + Ml, hasError: !0 }), a()); } catch (e) { @@ -12062,10 +12063,10 @@ function Nl() { if (!f) return null; if (!f.ok) return d(t), null; let p = await f.blob(), m = URL.createObjectURL(p); - return e.size >= kl && c(), e.set(r, { + return e.size >= jl && c(), e.set(r, { blobUrl: m, refcount: 1, - expiresAt: Date.now() + Al, + expiresAt: Date.now() + Ml, hasError: !1 }), a(), m; } catch (e) { @@ -12104,30 +12105,30 @@ function Nl() { dispose: h }; } -function Pl() { +function Il() { try { - if (window[Ol]) return window[Ol]; + if (window[Al]) return window[Al]; } catch (e) { console.debug?.(e); } try { - window[Ol]?.dispose?.(); + window[Al]?.dispose?.(); } catch (e) { console.debug?.(e); } - let e = Nl(); + let e = Fl(); try { - window[Ol] = e; + window[Al] = e; } catch (e) { console.debug?.(e); } return e; } -var Fl = Pl(), Il = (e, t) => { +var Ll = Il(), Rl = (e, t) => { let n = e.__vccOpts || e; for (let [e, r] of t) n[e] = r; return n; -}, Ll = ["title"], Rl = /* @__PURE__ */ Il({ +}, zl = ["title"], Bl = /* @__PURE__ */ Rl({ __name: "RatingBadge", props: { rating: { type: [Number, String], @@ -12138,27 +12139,27 @@ var Fl = Pl(), Il = (e, t) => { } } }, setup(e) { - let t = e, n = X(() => Math.max(0, Math.min(5, Number(t.rating) || 0))), i = X(() => n.value > 0), a = X(() => r("rating.title", "Rating: {n} star{n, plural, one {} other {s}}", { n: n.value })); - return (e, t) => i.value ? (H(), G("div", { + let t = e, n = Z(() => Math.max(0, Math.min(5, Number(t.rating) || 0))), r = Z(() => n.value > 0), i = Z(() => R("rating.title", "Rating: {n} star{n, plural, one {} other {s}}", { n: n.value })); + return (e, t) => r.value ? (W(), q("div", { key: 0, class: "mjr-rating-badge", - title: a.value - }, [(H(!0), G(In, null, vn(n.value, (e) => (H(), G("span", { + title: i.value + }, [(W(!0), q(Ln, null, vn(n.value, (e) => (W(), q("span", { key: e, style: An({ color: "var(--mjr-rating-color, var(--mjr-star-active, #FFD45A))", marginRight: e < n.value ? "2px" : "0" }) - }, " ★ ", 4))), 128))], 8, Ll)) : Y("", !0); + }, " ★ ", 4))), 128))], 8, zl)) : In("", !0); } -}, [["__scopeId", "data-v-730159ba"]]), zl = ["title"], Bl = /* @__PURE__ */ Il({ +}, [["__scopeId", "data-v-730159ba"]]), Vl = ["title"], Hl = /* @__PURE__ */ Rl({ __name: "TagsBadge", props: { tags: { type: [Array, String], default: () => [] } }, setup(e) { - let t = e, n = X(() => { + let t = e, n = Z(() => { if (Array.isArray(t.tags)) return t.tags.map((e) => String(e ?? "").trim()).filter(Boolean).slice(0, 10); if (typeof t.tags == "string") { let e = t.tags.trim(); @@ -12171,40 +12172,40 @@ var Fl = Pl(), Il = (e, t) => { } } return []; - }), i = X(() => n.value.length > 0), a = X(() => r("tags.title", "Tags: {tags}", { tags: n.value.join(", ") })), o = X(() => { + }), r = Z(() => n.value.length > 0), i = Z(() => R("tags.title", "Tags: {tags}", { tags: n.value.join(", ") })), a = Z(() => { let e = n.value; return e.length <= 5 ? e.join(", ") : e.slice(0, 5).join(", ") + ` +${e.length - 5}`; }); - return (e, t) => i.value ? (H(), G("div", { + return (e, t) => r.value ? (W(), q("div", { key: 0, class: "mjr-tags-badge", - title: a.value, + title: i.value, style: { color: "var(--mjr-tag-color, #90CAF9)" } - }, q(o.value), 9, zl)) : Y("", !0); + }, Y(a.value), 9, Vl)) : In("", !0); } -}, [["__scopeId", "data-v-2b45d539"]]), Vl = ["title"], Hl = /* @__PURE__ */ Il({ +}, [["__scopeId", "data-v-2b45d539"]]), Ul = ["title"], Wl = /* @__PURE__ */ Rl({ __name: "GenTimeBadge", props: { genTimeMs: { type: [Number, String], default: 0 } }, setup(e) { - let t = e, n = X(() => ot(t.genTimeMs)), r = X(() => n.value > 0), i = X(() => bt(n.value)), a = X(() => Nt(n.value)); - return (e, t) => r.value ? (H(), G("div", { + let t = e, n = Z(() => Ft(t.genTimeMs)), r = Z(() => n.value > 0), i = Z(() => It(n.value)), a = Z(() => ct(n.value)); + return (e, t) => r.value ? (W(), q("div", { key: 0, class: "mjr-gentime-badge", title: i.value.title, style: An({ color: a.value }) - }, q(i.value.text), 13, Vl)) : Y("", !0); + }, Y(i.value.text), 13, Ul)) : In("", !0); } -}, [["__scopeId", "data-v-e8aef14a"]]), Ul = { +}, [["__scopeId", "data-v-e8aef14a"]]), Gl = { key: 0, class: "mjr-live-placeholder-wash", "aria-hidden": "true" -}, Wl = ["alt", "src"], Gl = { +}, Kl = ["alt", "src"], ql = { key: 1, class: "mjr-media-error-placeholder" -}, Kl = ["data-src", "poster"], ql = ["src"], Jl = { +}, Jl = ["data-src", "poster"], Yl = ["src"], Xl = { class: "mjr-audio-waveform-overlay", style: { position: "absolute", @@ -12215,7 +12216,7 @@ var Fl = Pl(), Il = (e, t) => { "pointer-events": "none", color: "white" } -}, Yl = { +}, Zl = { viewBox: "0 0 64 32", preserveAspectRatio: "xMidYMid meet", fill: "currentColor", @@ -12226,12 +12227,12 @@ var Fl = Pl(), Il = (e, t) => { height: "auto", filter: "drop-shadow(0 2px 6px rgba(0,0,0,0.5))" } -}, Xl = [ +}, Ql = [ "x", "y", "width", "height" -], Zl = ["src", "alt"], Ql = { +], $l = ["src", "alt"], eu = { key: 1, class: "mjr-model3d-thumb-icon", style: { @@ -12242,27 +12243,27 @@ var Fl = Pl(), Il = (e, t) => { "justify-content": "center", color: "rgba(255,255,255,0.7)" } -}, $l = [ +}, tu = [ "data-mjr-ext", "data-mjr-badge-bg", "title" -], eu = ["title"], tu = { +], nu = ["title"], ru = { key: 6, class: "mjr-card-hover-info" -}, nu = { +}, iu = { key: 0, class: "mjr-hover-prompt" -}, ru = { +}, au = { key: 1, class: "mjr-hover-gentime" -}, iu = { +}, ou = { class: "mjr-card-info mjr-card-meta", style: { position: "relative", padding: "6px 8px", "min-width": "0" } -}, au = ["title"], ou = { +}, su = ["title"], cu = { class: "mjr-card-meta-row", style: { "font-size": "0.85em", @@ -12273,7 +12274,7 @@ var Fl = Pl(), Il = (e, t) => { "text-overflow": "ellipsis", "padding-right": "16px" } -}, su = { +}, lu = { key: 0, class: "mjr-meta-separator", "aria-hidden": "true", @@ -12281,7 +12282,7 @@ var Fl = Pl(), Il = (e, t) => { opacity: "0.55", margin: "0 3px" } -}, cu = ["title"], lu = { class: "mjr-stack-group-button-count" }, uu = { class: "mjr-dup-stack-count" }, du = { +}, uu = ["title"], du = { class: "mjr-stack-group-button-count" }, fu = { class: "mjr-dup-stack-count" }, pu = { __name: "AssetCardInner", props: { asset: { type: Object, @@ -12353,7 +12354,7 @@ var Fl = Pl(), Il = (e, t) => { async function n(e, t = {}) { if (!e) return null; try { - return Fl.hasError(e) ? null : await Fl.acquireUrl(e, t) || null; + return Ll.hasError(e) ? null : await Ll.acquireUrl(e, t) || null; } catch { return null; } @@ -12366,13 +12367,13 @@ var Fl = Pl(), Il = (e, t) => { 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, Fl.hasError(t)) { + if (e._mjrVideoLoadRequestId = n, Ll.hasError(t)) { e.src = t, e._mjrSourceKey = t; return; } - let r = await Fl.acquireUrl(t); + let r = await Ll.acquireUrl(t); if (e._mjrVideoLoadRequestId !== n || !e.isConnected) { - r && Fl.releaseUrl(t); + r && Ll.releaseUrl(t); return; } r ? (e.src = r, e._mjrCachedSrc = t, e._mjrSourceKey = t) : (e.src = t, e._mjrSourceKey = t), e.load?.(); @@ -12393,7 +12394,7 @@ var Fl = Pl(), Il = (e, t) => { } try { let t = String(e._mjrCachedSrc || "").trim(); - t && Fl.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; + t && Ll.releaseUrl(t), e._mjrCachedSrc = "", e._mjrSourceKey = ""; } catch (e) { console.debug?.(e); } @@ -12464,42 +12465,42 @@ var Fl = Pl(), Il = (e, t) => { function u(e) { e && (c(e), a(e)); } - let d = e, f = X(() => String(d.asset.kind || "image").toLowerCase()), p = X(() => f.value === "image"), m = X(() => f.value === "video"), h = X(() => f.value === "audio"), g = X(() => f.value === "model3d"), _ = X(() => De(d.asset) || ""), v = X(() => String(d.asset.thumbnail_url || d.asset.thumb_url || d.asset.poster || "").trim()), y = X(() => String(d.asset.preview_url || d.asset.previewUrl || d.asset.url || "").trim()), b = X(() => v.value || y.value || _.value), x = X(() => y.value || _.value), S = X(() => v.value), C = X(() => String(d.asset.filename || "")), w = X(() => String(d.asset.display_name || d.asset.displayName || d.asset.name || C.value || "").trim()), T = X(() => { + let d = e, f = Z(() => String(d.asset.kind || "image").toLowerCase()), p = Z(() => f.value === "image"), m = Z(() => f.value === "video"), h = Z(() => f.value === "audio"), g = Z(() => f.value === "model3d"), _ = Z(() => Fe(d.asset) || ""), v = Z(() => String(d.asset.thumbnail_url || d.asset.thumb_url || d.asset.poster || "").trim()), y = Z(() => String(d.asset.preview_url || d.asset.previewUrl || d.asset.url || "").trim()), b = Z(() => v.value || y.value || _.value), x = Z(() => y.value || _.value), S = Z(() => v.value), C = Z(() => String(d.asset.filename || "")), w = Z(() => String(d.asset.display_name || d.asset.displayName || d.asset.name || C.value || "").trim()), T = Z(() => { let e = C.value; return e.includes(".") ? e.split(".").pop().toUpperCase() : ""; - }), E = X(() => { + }), E = Z(() => { let e = w.value || C.value; return e.includes(".") ? e.slice(0, e.lastIndexOf(".")) : e; - }), D = X(() => { + }), D = Z(() => { let e = [C.value || w.value], t = String(d.asset.subfolder || d.asset.file_info?.subfolder || "").trim(), n = String(d.asset.type || d.asset.source || d.asset.file_info?.type || "").trim(); return t && e.push(`Subfolder: ${t}`), n && e.push(`Type: ${n}`), e.filter(Boolean).join("\n"); - }), O = X(() => Number(d.asset.rating) || 0), k = X(() => d.asset.tags || []), A = X(() => ot(d.asset.generation_time_ms ?? d.asset.metadata?.generation_time_ms ?? 0)), j = X(() => A.value > 0), M = X(() => bt(A.value)), N = X(() => Nt(A.value)), P = X(() => String(d.asset.positive_prompt || "").trim()), F = X(() => d.asset?._mjrLivePlaceholder === !0 || d.asset?.is_live_placeholder === !0 || String(d.asset?.id || "").trim().toLowerCase().startsWith("live:")), ee = X(() => String(d.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), te = X(() => `${ee.value}: waiting for indexed asset data`), ne = X(() => { + }), O = Z(() => Number(d.asset.rating) || 0), k = Z(() => d.asset.tags || []), A = Z(() => Ft(d.asset.generation_time_ms ?? d.asset.metadata?.generation_time_ms ?? 0)), j = Z(() => A.value > 0), M = Z(() => It(A.value)), N = Z(() => ct(A.value)), P = Z(() => String(d.asset.positive_prompt || "").trim()), F = Z(() => d.asset?._mjrLivePlaceholder === !0 || d.asset?.is_live_placeholder === !0 || String(d.asset?.id || "").trim().toLowerCase().startsWith("live:")), I = Z(() => String(d.asset?._mjrLiveLabel || "In progress").trim() || "In progress"), ee = Z(() => `${I.value}: waiting for indexed asset data`), te = Z(() => { let { width: e, height: t } = d.asset; return e && t ? `${e}x${t}` : ""; - }), re = X(() => d.asset.duration ? kt(d.asset.duration) : ""), ie = X(() => d.asset.generation_time || d.asset.file_creation_time || d.asset.mtime || d.asset.created_at), ae = X(() => ie.value ? Bt(ie.value) : ""), oe = X(() => ie.value ? At(ie.value) : ""), se = X(() => [ - ne.value ? { + }), ne = Z(() => d.asset.duration ? Mt(d.asset.duration) : ""), re = Z(() => d.asset.generation_time || d.asset.file_creation_time || d.asset.mtime || d.asset.created_at), ie = Z(() => re.value ? jt(re.value) : ""), ae = Z(() => re.value ? zt(re.value) : ""), oe = Z(() => [ + te.value ? { key: "resolution", className: "mjr-meta-res", - title: `Resolution: ${ne.value}`, - text: ne.value + title: `Resolution: ${te.value}`, + text: te.value } : null, - re.value ? { + ne.value ? { key: "duration", className: "mjr-meta-duration", - title: `Duration: ${re.value}`, - text: re.value + title: `Duration: ${ne.value}`, + text: ne.value } : null, - ae.value ? { + ie.value ? { key: "date", className: "mjr-meta-date", - title: `Date: ${ae.value}`, - text: ae.value + title: `Date: ${ie.value}`, + text: ie.value } : null, - oe.value ? { + ae.value ? { key: "time", className: "mjr-meta-date mjr-meta-time-val", - title: `Time: ${oe.value}`, - text: oe.value + title: `Time: ${ae.value}`, + text: ae.value } : null, j.value ? { key: "gentime", @@ -12511,94 +12512,94 @@ var Fl = Pl(), Il = (e, t) => { fontWeight: "500" } } : null - ].filter(Boolean)), ce = X(() => !!d.asset._mjrNameCollision && !d.asset._mjrDupStack), le = X(() => ce.value ? "var(--mjr-badge-duplicate-alert, #ff1744)" : { + ].filter(Boolean)), se = Z(() => !!d.asset._mjrNameCollision && !d.asset._mjrDupStack), ce = Z(() => se.value ? "var(--mjr-badge-duplicate-alert, #ff1744)" : { image: "var(--mjr-badge-image, #2196F3)", video: "var(--mjr-badge-video, #F44336)", audio: "var(--mjr-badge-audio, #4CAF50)", model3d: "var(--mjr-badge-model3d, #9C27B0)" - }[f.value] || "var(--mjr-badge-image, #888)"), ue = pn("mjrStackService", null), de = X(() => !ue || !String(d.asset.stack_id || "").trim() ? !1 : Number(d.asset.stack_asset_count || d.asset._mjrFeedGroupCount || 0) > 1), fe = X(() => Number(d.asset.stack_asset_count || d.asset._mjrFeedGroupCount || 0) || 0), pe = X(() => !!d.asset._mjrDupStack && Number(d.asset._mjrDupCount || 0) >= 2), me = X(() => Number(d.asset._mjrDupCount || 0) || 0); - async function he(e) { + }[f.value] || "var(--mjr-badge-image, #888)"), le = pn("mjrStackService", null), ue = Z(() => !le || !String(d.asset.stack_id || "").trim() ? !1 : Number(d.asset.stack_asset_count || d.asset._mjrFeedGroupCount || 0) > 1), de = Z(() => Number(d.asset.stack_asset_count || d.asset._mjrFeedGroupCount || 0) || 0), fe = Z(() => !!d.asset._mjrDupStack && Number(d.asset._mjrDupCount || 0) >= 2), pe = Z(() => Number(d.asset._mjrDupCount || 0) || 0); + async function L(e) { e.preventDefault(), e.stopPropagation(); try { - await ue?.openStackGroup?.(d.asset); + await le?.openStackGroup?.(d.asset); } catch (e) { console.debug?.(e); } } - function ge(e) { + function me(e) { e.preventDefault(), e.stopPropagation(); try { - ue?.openDupGroup?.(d.asset); + le?.openDupGroup?.(d.asset); } catch (e) { console.debug?.(e); } } - let _e = K(null), ve = K(null), ye = K(null), be = K(null), xe = K(!1), Se = K(!1), Ce = K(""), we = 0, Te = ""; - function Ee() { + let he = J(null), ge = J(null), _e = J(null), ve = J(null), ye = J(!1), be = J(!1), xe = J(""), Se = 0, Ce = ""; + function we() { try { - Te && Fl.releaseUrl(Te); + Ce && Ll.releaseUrl(Ce); } catch (e) { console.debug?.(e); } - Te = ""; + Ce = ""; } - mn(() => [ye.value, b.value], async ([e, t], i, a) => { - if (!e || !t || xe.value) return; - let o = we += 1, s = new AbortController(), c = !1; + mn(() => [_e.value, b.value], async ([e, t], i, a) => { + if (!e || !t || ye.value) return; + let o = Se += 1, s = new AbortController(), c = !1; a(() => { c = !0, s.abort(); - }), Ee(), Ce.value = ""; + }), we(), xe.value = ""; try { - if (await r(), c || o !== we || !e.isConnected) return; + if (await r(), c || o !== Se || !e.isConnected) return; let i = await n(t, { signal: s.signal }); - if (c || o !== we || !e.isConnected) { - i && i !== t && Fl.releaseUrl(t); + if (c || o !== Se || !e.isConnected) { + i && i !== t && Ll.releaseUrl(t); return; } - i && i !== Ce.value && (Ce.value = i, Te = i === t ? "" : t); + i && i !== xe.value && (xe.value = i, Ce = i === t ? "" : t); } catch {} }, { immediate: !0 }); - let Oe = K(I.GRID_VIDEO_AUTOPLAY_MODE || "hover"); - function ke() { - Oe.value = I.GRID_VIDEO_AUTOPLAY_MODE || "hover"; + let Te = J(z.GRID_VIDEO_AUTOPLAY_MODE || "hover"); + function Ee() { + Te.value = z.GRID_VIDEO_AUTOPLAY_MODE || "hover"; } bn(() => { - window.addEventListener("mjr-settings-changed", ke); - }), mn(ve, (e, t) => { + window.addEventListener("mjr-settings-changed", Ee); + }), mn(ge, (e, t) => { if (t) try { u(t); } catch {} - if (e && _e.value) try { - l(_e.value, e, Oe.value); + if (e && he.value) try { + l(he.value, e, Te.value); } catch {} - }), mn(Oe, (e) => { - let t = ve.value, n = _e.value; + }), mn(Te, (e) => { + let t = ge.value, n = he.value; t && n && l(n, t, e); }), Sn(() => { - window.removeEventListener("mjr-settings-changed", ke), we += 1, Ee(); - let e = ve.value; + window.removeEventListener("mjr-settings-changed", Ee), Se += 1, we(); + let e = ge.value; if (e) try { u(e); } catch {} }), En(() => { - let e = be.value; + let e = ve.value; if (!e) return; let t = d.asset; t?.has_workflow ?? t?.hasWorkflow, t?.has_generation_data ?? t?.hasGenerationData, t?.has_ai_info ?? t?.hasAiInfo ?? t?.ai_indexed, t?.has_ai_auto_tags ?? t?.hasAiAutoTags ?? t?.auto_tags ?? t?.autoTags, t?.has_ai_enhanced_caption ?? t?.hasAiEnhancedCaption ?? t?.enhanced_caption ?? t?.enhancedCaption, t?.has_ai_vector ?? t?.hasAiVector ?? t?.vector_indexed ?? t?.vectorIndexed; try { e.textContent = ""; - let n = lt(t); + let n = xt(t); n && e.appendChild(n); } catch {} }); - function Ae(e) { - xe.value = !0; + function De(e) { + ye.value = !0; try { - Fl.markError(b.value); + Ll.markError(b.value); } catch {} } - function je(e) { - if (!ce.value) return; + function Oe(e) { + if (!se.value) return; e.preventDefault(), e.stopPropagation(); let t = e.target?.closest?.(".mjr-asset-card"); t && t.dispatchEvent(new CustomEvent("mjr:badge-duplicates-focus", { @@ -12612,27 +12613,27 @@ var Fl = Pl(), Il = (e, t) => { })); } return (n, r) => { - let i = Ln("MButton"); - return H(), G(In, null, [ - W("div", { + let i = Rn("MButton"); + return W(), q(Ln, null, [ + K("div", { class: "mjr-thumb", ref_key: "thumbRef", - ref: _e + ref: he }, [ - F.value ? (H(), G("div", Ul)) : Y("", !0), - p.value ? (H(), G(In, { key: 1 }, [xe.value ? Y("", !0) : (H(), G("img", { + F.value ? (W(), q("div", Gl)) : In("", !0), + p.value ? (W(), q(Ln, { key: 1 }, [ye.value ? In("", !0) : (W(), q("img", { key: 0, ref_key: "imgRef", - ref: ye, + ref: _e, class: "mjr-thumb-media", alt: C.value, decoding: "async", loading: "lazy", - src: Ce.value || b.value || void 0, - onError: Ae - }, null, 40, Wl)), xe.value ? (H(), G("div", Gl, [...r[13] ||= [W("i", { class: "pi pi-image" }, null, -1)]])) : Y("", !0)], 64)) : m.value ? (H(), G(In, { key: 2 }, [W("video", { + src: xe.value || b.value || void 0, + onError: De + }, null, 40, Kl)), ye.value ? (W(), q("div", ql, [...r[13] ||= [K("i", { class: "pi pi-image" }, null, -1)]])) : In("", !0)], 64)) : m.value ? (W(), q(Ln, { key: 2 }, [K("video", { ref_key: "videoRef", - ref: ve, + ref: ge, class: "mjr-thumb-media", "data-src": x.value, poster: S.value || void 0, @@ -12644,72 +12645,72 @@ var Fl = Pl(), Il = (e, t) => { draggable: !1, tabindex: -1, style: { "pointer-events": "none" } - }, null, 8, Kl), r[14] ||= W("div", { class: "mjr-thumb-play" }, [W("i", { class: "pi pi-play" })], -1)], 64)) : h.value ? (H(), G(In, { key: 3 }, [S.value ? (H(), G("img", { + }, null, 8, Jl), r[14] ||= K("div", { class: "mjr-thumb-play" }, [K("i", { class: "pi pi-play" })], -1)], 64)) : h.value ? (W(), q(Ln, { key: 3 }, [S.value ? (W(), q("img", { key: 0, class: "mjr-thumb-media", src: S.value, draggable: !1, alt: "" - }, null, 8, ql)) : Y("", !0), W("div", Jl, [(H(), G("svg", Yl, [(H(), G(In, null, vn(t, ([e, t, n, r], i) => W("rect", { + }, null, 8, Yl)) : In("", !0), K("div", Xl, [(W(), q("svg", Zl, [(W(), q(Ln, null, vn(t, ([e, t, n, r], i) => K("rect", { key: i, x: e, y: t, width: n, height: r, rx: "1.5" - }, null, 8, Xl)), 64))]))])], 64)) : g.value ? (H(), G(In, { key: 4 }, [S.value && !Se.value ? (H(), G("img", { + }, null, 8, Ql)), 64))]))])], 64)) : g.value ? (W(), q(Ln, { key: 4 }, [S.value && !be.value ? (W(), q("img", { key: 0, class: "mjr-thumb-media", src: S.value, draggable: !1, alt: C.value, - onError: r[0] ||= (e) => Se.value = !0 - }, null, 40, Zl)) : (H(), G("div", Ql, [...r[15] ||= [W("i", { + onError: r[0] ||= (e) => be.value = !0 + }, null, 40, $l)) : (W(), q("div", eu, [...r[15] ||= [K("i", { class: "pi pi-box", style: { "font-size": "2.5rem" } - }, null, -1)]]))], 64)) : Y("", !0), - W("div", { + }, null, -1)]]))], 64)) : In("", !0), + K("div", { class: "mjr-file-badge mjr-badge-ext", "data-mjr-ext": T.value, - "data-mjr-badge-bg": le.value, + "data-mjr-badge-bg": ce.value, style: An({ position: "absolute", top: "6px", left: "6px", zIndex: 10, - background: le.value, + background: ce.value, color: "#fff", padding: "2px 5px", borderRadius: "4px", fontSize: "10px", fontWeight: "700", - pointerEvents: ce.value ? "auto" : "none", - cursor: ce.value ? "pointer" : "default" + pointerEvents: se.value ? "auto" : "none", + cursor: se.value ? "pointer" : "default" }), - title: ce.value ? `${T.value} — duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${T.value} file`, - onClick: je - }, q(T.value) + q(ce.value ? "+" : ""), 13, $l), - V(Rl, { + title: se.value ? `${T.value} — duplicate filename (${e.asset._mjrNameCollisionCount || 2} files)` : `${T.value} file`, + onClick: Oe + }, Y(T.value) + Y(se.value ? "+" : ""), 13, tu), + U(Bl, { rating: O.value, class: "mjr-badge-rating" }, null, 8, ["rating"]), - V(Bl, { + U(Hl, { tags: k.value, class: "mjr-badge-tags" }, null, 8, ["tags"]), - V(Hl, { "gen-time-ms": A.value }, null, 8, ["gen-time-ms"]), - F.value ? (H(), G("div", { + U(Wl, { "gen-time-ms": A.value }, null, 8, ["gen-time-ms"]), + F.value ? (W(), q("div", { key: 5, class: "mjr-live-pill", - title: te.value - }, [r[16] ||= W("span", { + title: ee.value + }, [r[16] ||= K("span", { class: "mjr-live-pill-dot", "aria-hidden": "true" - }, null, -1), W("span", null, q(ee.value), 1)], 8, eu)) : Y("", !0), - P.value || j.value ? (H(), G("div", tu, [P.value ? (H(), G("div", nu, q(P.value), 1)) : Y("", !0), j.value ? (H(), G("div", ru, "⏱ " + q(M.value.text), 1)) : Y("", !0)])) : Y("", !0) + }, null, -1), K("span", null, Y(I.value), 1)], 8, nu)) : In("", !0), + P.value || j.value ? (W(), q("div", ru, [P.value ? (W(), q("div", iu, Y(P.value), 1)) : In("", !0), j.value ? (W(), q("div", au, "⏱ " + Y(M.value.text), 1)) : In("", !0)])) : In("", !0) ], 512), - W("div", iu, [ - W("div", { + K("div", ou, [ + K("div", { class: "mjr-card-filename", title: D.value, style: { @@ -12719,15 +12720,15 @@ var Fl = Pl(), Il = (e, t) => { "margin-bottom": "4px", "padding-right": "12px" } - }, q(E.value), 9, au), - W("div", ou, [(H(!0), G(In, null, vn(se.value, (e, t) => (H(), G(In, { key: e.key }, [t > 0 ? (H(), G("span", su, "/")) : Y("", !0), W("span", { + }, Y(E.value), 9, su), + K("div", cu, [(W(!0), q(Ln, null, vn(oe.value, (e, t) => (W(), q(Ln, { key: e.key }, [t > 0 ? (W(), q("span", lu, "/")) : In("", !0), K("span", { class: Mn(e.className), style: An(e.style || null), title: e.title - }, q(e.text), 15, cu)], 64))), 128))]), - W("div", { + }, Y(e.text), 15, uu)], 64))), 128))]), + K("div", { ref_key: "dotWrapperRef", - ref: be, + ref: ve, class: "mjr-card-dot-wrapper", style: { position: "absolute", @@ -12737,16 +12738,16 @@ var Fl = Pl(), Il = (e, t) => { } }, null, 512) ]), - de.value ? (H(), hn(i, { + ue.value ? (W(), hn(i, { key: 0, type: "button", class: "mjr-stack-group-button", severity: "secondary", text: "", rounded: "", - "aria-label": `Open generation group in grid (${fe.value} assets)`, - title: `Open generation group in grid (${fe.value} assets)`, - onClick: he, + "aria-label": `Open generation group in grid (${de.value} assets)`, + title: `Open generation group in grid (${de.value} assets)`, + onClick: L, onPointerdown: r[1] ||= Fn(() => {}, ["stop"]), onMousedown: r[2] ||= Fn(() => {}, ["stop", "prevent"]), onTouchstartPassive: r[3] ||= Fn(() => {}, ["stop"]), @@ -12754,19 +12755,19 @@ var Fl = Pl(), Il = (e, t) => { onKeydown: r[5] ||= Fn(() => {}, ["stop"]), onDragstart: r[6] ||= Fn(() => {}, ["stop", "prevent"]) }, { - default: U(() => [r[17] ||= W("span", { class: "pi pi-clone" }, null, -1), W("span", lu, q(fe.value), 1)]), + default: G(() => [r[17] ||= K("span", { class: "pi pi-clone" }, null, -1), K("span", du, Y(de.value), 1)]), _: 1 - }, 8, ["aria-label", "title"])) : Y("", !0), - pe.value ? (H(), hn(i, { + }, 8, ["aria-label", "title"])) : In("", !0), + fe.value ? (W(), hn(i, { key: 1, type: "button", class: "mjr-dup-stack-button", severity: "secondary", text: "", rounded: "", - "aria-label": `${me.value} duplicate${me.value > 1 ? "s" : ""} - click to compare all copies`, - title: `${me.value} duplicate${me.value > 1 ? "s" : ""} - click to compare all copies`, - onClick: ge, + "aria-label": `${pe.value} duplicate${pe.value > 1 ? "s" : ""} - click to compare all copies`, + title: `${pe.value} duplicate${pe.value > 1 ? "s" : ""} - click to compare all copies`, + onClick: me, onPointerdown: r[7] ||= Fn(() => {}, ["stop"]), onMousedown: r[8] ||= Fn(() => {}, ["stop", "prevent"]), onTouchstartPassive: r[9] ||= Fn(() => {}, ["stop"]), @@ -12774,25 +12775,25 @@ var Fl = Pl(), Il = (e, t) => { onKeydown: r[11] ||= Fn(() => {}, ["stop"]), onDragstart: r[12] ||= Fn(() => {}, ["stop", "prevent"]) }, { - default: U(() => [r[18] ||= W("span", { class: "pi pi-copy" }, null, -1), W("span", uu, q(me.value), 1)]), + default: G(() => [r[18] ||= K("span", { class: "pi pi-copy" }, null, -1), K("span", fu, Y(pe.value), 1)]), _: 1 - }, 8, ["aria-label", "title"])) : Y("", !0) + }, 8, ["aria-label", "title"])) : In("", !0) ], 64); }; } -}, fu = [ +}, mu = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-stem", "aria-label", "aria-selected" -], pu = { +], hu = { class: "mjr-card-info mjr-card-meta", style: { padding: "6px 8px", "min-width": "0" } -}, mu = ["title"], hu = { +}, gu = ["title"], _u = { __name: "FolderCard", props: { asset: { @@ -12805,7 +12806,7 @@ var Fl = Pl(), Il = (e, t) => { } }, setup(e) { - return (t, n) => (H(), G("div", { + return (t, n) => (W(), q("div", { class: Mn(["mjr-asset-card mjr-card mjr-folder-card", { "is-selected": e.selected }]), role: "button", tabindex: 0, @@ -12817,25 +12818,25 @@ var Fl = Pl(), Il = (e, t) => { "data-mjr-kind": "folder", "aria-label": `Folder ${e.asset.filename}`, "aria-selected": e.selected ? "true" : "false" - }, [n[1] ||= W("div", { + }, [n[1] ||= K("div", { class: "mjr-thumb", style: { display: "flex", "align-items": "center", "justify-content": "center" } - }, [W("svg", { + }, [K("svg", { width: "64", height: "64", viewBox: "0 0 24 24", "aria-hidden": "true" - }, [W("path", { + }, [K("path", { fill: "#F4C74A", d: "M10 4H4c-1.1 0-2 .9-2 2v1h20V8c0-1.1-.9-2-2-2h-8l-2-2z" - }), W("path", { + }), K("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), W("div", pu, [W("div", { + })])], -1), K("div", hu, [K("div", { class: "mjr-card-filename", title: e.asset.filename, style: { @@ -12844,15 +12845,15 @@ var Fl = Pl(), Il = (e, t) => { "white-space": "nowrap", "margin-bottom": "4px" } - }, q(e.asset.filename), 9, mu), n[0] ||= W("div", { class: "mjr-card-meta-row" }, null, -1)])], 10, fu)); + }, Y(e.asset.filename), 9, gu), n[0] ||= K("div", { class: "mjr-card-meta-row" }, null, -1)])], 10, mu)); } }; //#endregion //#region ui/vue/composables/useGridState.ts -function gu(e) { +function vu(e) { return Array.from(e || []).map((e) => String(e || "").trim()).filter(Boolean); } -function _u() { +function yu() { let e = Cn({ query: "*", offset: 0, @@ -12882,7 +12883,7 @@ function _u() { e.virtualGrid = { setItems(t) { e.assets = Array.isArray(t) ? t.slice() : []; } }; - let t = X(() => new Set(gu(e.selectedIds))); + let t = Z(() => new Set(vu(e.selectedIds))); function n(t = "", { error: n = !1 } = {}) { e.statusMessage = String(t || ""), e.statusError = !!n; } @@ -12902,14 +12903,14 @@ function _u() { 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(gu(t))), a = String(n || i[0] || "").trim(); + let i = Array.from(new Set(vu(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(gu(t)), i = gu(e.selectedIds).filter((e) => r.has(e)), a = String(n || e.activeId || i[0] || "").trim(); + let r = new Set(vu(t)), i = vu(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() { @@ -12941,14 +12942,14 @@ function _u() { } //#endregion //#region ui/vue/composables/gridVisibility.ts -function vu(e) { +function bu(e) { try { return typeof e?.getClientRects == "function" ? e.getClientRects().length > 0 : !0; } catch (e) { return console.debug?.(e), !1; } } -function yu(e, { requireClientRect: t = !0 } = {}) { +function xu(e, { requireClientRect: t = !0 } = {}) { if (!e || typeof e != "object") return !1; try { if (typeof document < "u" && document.hidden) return !1; @@ -12973,14 +12974,14 @@ function yu(e, { requireClientRect: t = !0 } = {}) { } catch (e) { console.debug?.(e); } - return t ? vu(e) : !0; + return t ? bu(e) : !0; } -function bu(e) { - return yu(e, { requireClientRect: !0 }); +function Su(e) { + return xu(e, { requireClientRect: !0 }); } -function xu(e, t = null) { +function Cu(e, t = null) { let n = t || e; - if (!bu(n) || e && e !== n && !yu(e, { requireClientRect: !1 })) return !1; + if (!Su(n) || e && e !== n && !xu(e, { requireClientRect: !1 })) return !1; try { let e = Number(n?.clientWidth || 0) || 0, t = Number(n?.clientHeight || 0) || 0; return e > 0 && t > 0; @@ -12990,46 +12991,47 @@ function xu(e, t = null) { } //#endregion //#region ui/vue/grid/useGridQuery.ts -function Su(e, t = "") { +function wu(e, t = "") { return String(e ?? t).trim() || String(t); } -function Cu(e, t = 0) { +function Tu(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function wu(e) { +function Eu(e) { return e === !0 || e === 1 || String(e || "") === "1"; } -function Tu(e = {}) { - let t = Su(e.q ?? e.query, "*") || "*", n = Object.prototype.hasOwnProperty.call(e, "resolutionCompare") ? String(e.resolutionCompare ?? "").trim().toLowerCase() : "gte", r = n === "lte" ? "lte" : n ? "gte" : ""; +function Du(e = {}) { + let t = wu(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: Su(e.scope, "output").toLowerCase(), + scope: wu(e.scope, "output").toLowerCase(), q: t, query: t, - customRootId: Su(e.customRootId), - subfolder: Su(e.subfolder), - collectionId: Su(e.collectionId), - viewScope: Su(e.viewScope), - kind: Su(e.kind).toLowerCase(), - workflowOnly: wu(e.workflowOnly), - minRating: Cu(e.minRating, 0), - minSizeMB: Cu(e.minSizeMB, 0), - maxSizeMB: Cu(e.maxSizeMB, 0), + customRootId: wu(e.customRootId), + subfolder: wu(e.subfolder), + collectionId: wu(e.collectionId), + viewScope: wu(e.viewScope), + kind: wu(e.kind).toLowerCase(), + workflowOnly: Eu(e.workflowOnly), + minRating: Tu(e.minRating, 0), + minSizeMB: Tu(e.minSizeMB, 0), + maxSizeMB: Tu(e.maxSizeMB, 0), resolutionCompare: r, - minWidth: Cu(e.minWidth, 0), - minHeight: Cu(e.minHeight, 0), - maxWidth: Cu(e.maxWidth, 0), - maxHeight: Cu(e.maxHeight, 0), - workflowType: Su(e.workflowType).toUpperCase(), - dateRange: Su(e.dateRange).toLowerCase(), - dateExact: Su(e.dateExact), - sort: Su(e.sort, "mtime_desc").toLowerCase(), - semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : wu(e.semanticMode), - groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : wu(e.groupStacks) + minWidth: Tu(e.minWidth, 0), + minHeight: Tu(e.minHeight, 0), + maxWidth: Tu(e.maxWidth, 0), + maxHeight: Tu(e.maxHeight, 0), + workflowType: wu(e.workflowType).toUpperCase(), + workflowId: wu(e.workflowId), + dateRange: wu(e.dateRange).toLowerCase(), + dateExact: wu(e.dateExact), + sort: wu(e.sort, "mtime_desc").toLowerCase(), + semanticMode: e.semanticMode === void 0 || e.semanticMode === null ? void 0 : Eu(e.semanticMode), + groupStacks: e.groupStacks === void 0 || e.groupStacks === null ? void 0 : Eu(e.groupStacks) }); } -function Eu(e = {}, t = {}) { - return Tu({ +function Ou(e = {}, t = {}) { + return Du({ scope: e.mjrScope, q: e.mjrQuery, customRootId: e.mjrCustomRootId, @@ -13047,6 +13049,7 @@ function Eu(e = {}, t = {}) { maxWidth: e.mjrFilterMaxWidth, maxHeight: e.mjrFilterMaxHeight, workflowType: e.mjrFilterWorkflowType, + workflowId: e.mjrFilterWorkflowId, dateRange: e.mjrFilterDateRange, dateExact: e.mjrFilterDateExact, sort: e.mjrSort, @@ -13055,16 +13058,16 @@ function Eu(e = {}, t = {}) { ...t }); } -function Du(e = null, t = "*") { +function ku(e = null, t = "*") { let n = e?.dataset || {}; - return Eu(n, { q: n.mjrQuery ?? t }).q; + return Ou(n, { q: n.mjrQuery ?? t }).q; } -function Ou(e = null, t = "mtime_desc") { +function Au(e = null, t = "mtime_desc") { let n = e?.dataset || {}; - return Eu(n, { sort: n.mjrSort ?? t }).sort; + return Ou(n, { sort: n.mjrSort ?? t }).sort; } -function ku(e = {}) { - let t = Tu(e); +function ju(e = {}) { + let t = Du(e); return [ t.scope, t.q, @@ -13083,192 +13086,194 @@ function ku(e = {}) { t.maxWidth || "", t.maxHeight || "", t.workflowType, + t.workflowId, t.dateRange, t.dateExact ].join("|"); } -function Au(e = {}) { - let t = Tu(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.dateRange || t.dateExact); +function Mu(e = {}) { + let t = Du(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.dateRange || t.dateExact); } -function ju(e = {}) { - let t = Tu(e); - return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Au(t); +function Nu(e = {}) { + let t = Du(e); + return t.scope === "output" && t.q === "*" && t.sort === "mtime_desc" && !Mu(t); } //#endregion //#region ui/vue/grid/useGridSnapshotCache.ts -var Mu = /* @__PURE__ */ new Map(), Nu = !1, Pu = 8, Fu = 200, Iu = "mjr_grid_snapshot_cache_v2", Lu = 1800 * 1e3, Ru = 1500, zu = !1, Bu = null, Vu = !1; -function Hu() { - return Nu; +var Pu = /* @__PURE__ */ new Map(), Fu = !1, Iu = 8, Lu = 200, Ru = "mjr_grid_snapshot_cache_v2", zu = 1800 * 1e3, Bu = 1500, Vu = !1, Hu = null, Uu = !1; +function Wu() { + return Fu; } -function Uu() { +function Gu() { try { - Mu.clear(), Yu()?.removeItem?.(Iu), globalThis?.sessionStorage?.removeItem?.(Iu); + Pu.clear(), Zu()?.removeItem?.(Ru), globalThis?.sessionStorage?.removeItem?.(Ru); } catch (e) { console.debug?.(e); } } -var Wu = /* @__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.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 Gu(e, t = "") { +var Ku = /* @__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 qu(e, t = "") { try { return String(e ?? t).trim(); } catch { return String(t); } } -function Ku(e = {}) { +function Ju(e = {}) { return JSON.stringify({ - scope: Gu(e.scope || "output", "output"), - query: Gu(e.query || e.q || "*", "*"), - customRootId: Gu(e.customRootId || ""), - subfolder: Gu(e.subfolder || ""), - collectionId: Gu(e.collectionId || ""), - viewScope: Gu(e.viewScope || ""), - kind: Gu(e.kind || ""), - workflowOnly: Gu(e.workflowOnly ? "1" : ""), - minRating: Gu(e.minRating || ""), - minSizeMB: Gu(e.minSizeMB || ""), - maxSizeMB: Gu(e.maxSizeMB || ""), - resolutionCompare: Gu(e.resolutionCompare || ""), - minWidth: Gu(e.minWidth || ""), - minHeight: Gu(e.minHeight || ""), - maxWidth: Gu(e.maxWidth || ""), - maxHeight: Gu(e.maxHeight || ""), - workflowType: Gu(e.workflowType || "").toUpperCase(), - dateRange: Gu(e.dateRange || ""), - dateExact: Gu(e.dateExact || ""), - sort: Gu(e.sort || "mtime_desc", "mtime_desc"), - semanticMode: Gu(e.semanticMode ? "1" : "") + scope: qu(e.scope || "output", "output"), + query: qu(e.query || e.q || "*", "*"), + customRootId: qu(e.customRootId || ""), + subfolder: qu(e.subfolder || ""), + collectionId: qu(e.collectionId || ""), + viewScope: qu(e.viewScope || ""), + kind: qu(e.kind || ""), + workflowOnly: qu(e.workflowOnly ? "1" : ""), + minRating: qu(e.minRating || ""), + minSizeMB: qu(e.minSizeMB || ""), + maxSizeMB: qu(e.maxSizeMB || ""), + resolutionCompare: qu(e.resolutionCompare || ""), + minWidth: qu(e.minWidth || ""), + minHeight: qu(e.minHeight || ""), + maxWidth: qu(e.maxWidth || ""), + maxHeight: qu(e.maxHeight || ""), + workflowType: qu(e.workflowType || "").toUpperCase(), + workflowId: qu(e.workflowId || ""), + dateRange: qu(e.dateRange || ""), + dateExact: qu(e.dateExact || ""), + sort: qu(e.sort || "mtime_desc", "mtime_desc"), + semanticMode: qu(e.semanticMode ? "1" : "") }); } -function qu(e) { +function Yu(e) { if (!e || typeof e != "object") return null; let t = {}; - for (let n of Wu) e[n] !== void 0 && (t[n] = e[n]); + for (let n of Ku) 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 Ju(e) { +function Xu(e) { if (!e || typeof e != "object") return null; let t = Number(e.at || 0) || 0; - if (!t || Date.now() - t > Lu) return null; - let n = Array.isArray(e.assets) ? e.assets.map(qu).filter(Boolean) : []; + if (!t || Date.now() - t > zu) return null; + let n = Array.isArray(e.assets) ? e.assets.map(Yu).filter(Boolean) : []; if (!n.length) return null; let r = Number(e.total ?? n.length), i = Number(e.offset ?? n.length); return { assets: n, - title: Gu(e.title || "Cached", "Cached"), + title: qu(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: Gu(e.query || "*", "*") + query: qu(e.query || "*", "*") }; } -function Yu() { +function Zu() { try { return globalThis?.localStorage || null; } catch { return null; } } -Hu() || Uu(); -function Xu(e) { +Wu() || Gu(); +function Qu(e) { try { let t = globalThis?.sessionStorage; if (!t || !e) return; - let n = t.getItem?.(Iu); + let n = t.getItem?.(Ru); if (!n) return; - e.getItem?.(Iu) || e.setItem(Iu, n), t.removeItem(Iu); + e.getItem?.(Ru) || e.setItem(Ru, n), t.removeItem(Ru); } catch (e) { console.debug?.(e); } } -function Zu() { +function $u() { let e = Date.now(); - for (let [t, n] of Mu.entries()) { + for (let [t, n] of Pu.entries()) { let r = Number(n?.at || 0) || 0; - (!r || e - r > Lu) && Mu.delete(t); + (!r || e - r > zu) && Pu.delete(t); } - for (; Mu.size > Pu;) { - let e = Mu.keys().next().value; + for (; Pu.size > Iu;) { + let e = Pu.keys().next().value; if (!e) break; - Mu.delete(e); + Pu.delete(e); } } -function Qu() { - if (!Hu()) { - zu = !0, Uu(); +function ed() { + if (!Wu()) { + Vu = !0, Gu(); return; } - if (!zu) { - zu = !0; + if (!Vu) { + Vu = !0; try { - let e = Yu(); - Xu(e); - let t = e?.getItem?.(Iu); + let e = Zu(); + Qu(e); + let t = e?.getItem?.(Ru); 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 = Ju(e[1]); - t && n && Mu.set(t, n); + let t = String(e[0] || ""), n = Xu(e[1]); + t && n && Pu.set(t, n); } - Zu(); + $u(); } catch (e) { console.debug?.(e); } } } -function $u() { - if (!Hu()) { - Uu(); +function td() { + if (!Wu()) { + Gu(); return; } try { - Zu(); - let e = Yu(); + $u(); + let e = Zu(); if (!e) return; - let t = Array.from(Mu.entries()).map(([e, t]) => [e, { + let t = Array.from(Pu.entries()).map(([e, t]) => [e, { ...t, - assets: Array.isArray(t?.assets) ? t.assets.slice(0, Fu) : [] + assets: Array.isArray(t?.assets) ? t.assets.slice(0, Lu) : [] }]); - e.setItem(Iu, JSON.stringify({ entries: t })); + e.setItem(Ru, JSON.stringify({ entries: t })); } catch (e) { console.debug?.(e); } } -function ed() { - if (!Hu()) { - Uu(), Vu = !1; +function nd() { + if (!Wu()) { + Gu(), Uu = !1; return; } - Vu = !0, !Bu && (Bu = setTimeout(() => { - Bu = null, Vu && (Vu = !1, $u()); - }, Ru)); + Uu = !0, !Hu && (Hu = setTimeout(() => { + Hu = null, Uu && (Uu = !1, td()); + }, Bu)); } -function td() { - Bu &&= (clearTimeout(Bu), null), Vu && (Vu = !1, $u()); +function rd() { + Hu &&= (clearTimeout(Hu), null), Uu && (Uu = !1, td()); } -function nd(e) { - if (!Hu()) return null; - Qu(); - let t = Ju(Mu.get(e)); - return t ? (Mu.delete(e), Mu.set(e, t), ed(), t) : (Mu.delete(e), ed(), null); +function id(e) { + if (!Wu()) return null; + ed(); + let t = Xu(Pu.get(e)); + return t ? (Pu.delete(e), Pu.set(e, t), nd(), t) : (Pu.delete(e), nd(), null); } -function rd(e) { - return Hu() ? (Qu(), !!Ju(Mu.get(e))) : !1; +function ad(e) { + return Wu() ? (ed(), !!Xu(Pu.get(e))) : !1; } -function id(e, t) { - if (!Hu() || !e || !t || typeof t != "object") return !1; - let n = Ju({ +function od(e, t) { + if (!Wu() || !e || !t || typeof t != "object") return !1; + let n = Xu({ ...t, at: t.at || Date.now() }); - return n ? (Mu.delete(e), Mu.set(e, n), ed(), !0) : !1; + return n ? (Pu.delete(e), Pu.set(e, n), nd(), !0) : !1; } //#endregion //#region ui/vue/grid/useAssetCollection.ts -function ad(e) { +function sd(e) { return !e || typeof e != "object" ? "" : [ e.source || e.type || "output", e.root_id || e.custom_root_id || "", @@ -13276,7 +13281,7 @@ function ad(e) { e.filename || e.filepath || e.path || e.fullpath || e.full_path || "" ].join("|").trim().toLowerCase(); } -function od(e = [], { assetKey: t = ad } = {}) { +function cd(e = [], { assetKey: t = sd } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(); for (let i of Array.isArray(e) ? e : []) { if (!i || typeof i != "object") continue; @@ -13288,12 +13293,12 @@ function od(e = [], { assetKey: t = ad } = {}) { byKey: r }; } -function sd(e, { assetKey: t = ad } = {}) { +function ld(e, { assetKey: t = sd } = {}) { if (!e || typeof e != "object") return e; - let n = od(Array.isArray(e.assets) ? e.assets : [], { assetKey: t }); + let n = cd(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 cd(e, t = [], { assetKey: n = ad } = {}) { +function ud(e, t = [], { assetKey: n = sd } = {}) { 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; @@ -13301,11 +13306,11 @@ function cd(e, t = [], { assetKey: n = ad } = {}) { return e.assets = (Array.isArray(e.assets) ? e.assets : []).filter((e) => { let t = e?.id == null ? "" : String(e.id); return !t || !r.has(t) ? !0 : (i += 1, !1); - }), i > 0 && sd(e, { assetKey: n }), i; + }), i > 0 && ld(e, { assetKey: n }), i; } //#endregion //#region ui/vue/grid/usePagedAssets.ts -function ld({ assets: e = [], count: t = null, limit: n = 0, offset: r = 0, total: i = null } = {}) { +function dd({ 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); @@ -13314,7 +13319,7 @@ function ld({ 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 ud({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = null, beforeApplyPage: i = null, onEmptyPage: a = null, maxEmptyPages: o = 6 } = {}) { +async function fd({ 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") @@ -13370,7 +13375,7 @@ async function ud({ fetchPage: e, applyPage: t, getLimit: n, canContinue: r = nu lastResult: l }; } -function dd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { +function pd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSize: i = null } = {}) { let a = Dn({ offset: 0, cursor: null, @@ -13379,7 +13384,7 @@ function dd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi error: null, done: !1, requestId: 0 - }), o = X(() => t?.items?.value || []), s = X(() => !a.loading && !a.done); + }), o = Z(() => t?.items?.value || []), s = Z(() => !a.loading && !a.done); function c() { return e && typeof e == "object" && "value" in e ? e.value : e; } @@ -13401,7 +13406,7 @@ function dd({ 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 = ld({ + let r = Array.isArray(e?.assets) ? e.assets : [], i = e?.total == null ? null : Number(e.total) || 0, o = dd({ assets: r, count: e?.count, limit: Number(e?.limit || n) || n, @@ -13466,7 +13471,7 @@ function dd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi let u = a.requestId; a.loading = !0, a.error = null; try { - let n = await ud({ + let n = await fd({ maxEmptyPages: o, canContinue: t, getLimit: e, @@ -13527,12 +13532,12 @@ function dd({ query: e, collection: t, fetchPage: n, pageSize: r = 80, getPageSi } //#endregion //#region ui/vue/composables/useVirtualGrid.ts -function fd(e, t) { +function md(e, t) { if (!t || typeof t != "object") return !1; - let n = Eu(e?.dataset || {}), r = n.scope, i = n.subfolder.toLowerCase(), a = n.kind, o = n.workflowOnly, s = n.minRating, c = n.workflowType.toLowerCase(), l = n.dateExact, u = String(t?.subfolder || "").trim().toLowerCase(), d = String(t?.type || t?.source || "output").trim().toLowerCase(), f = String(t?.kind || "").trim().toLowerCase(), p = String(t?.workflow_type || t?.workflowType || "").trim().toLowerCase(), m = String(t?.date_exact || t?.date || "").trim(), h = t?.has_workflow ?? t?.hasWorkflow ?? null; - return !(r && r !== "all" && d && d !== r || i && u !== i || a && f && f !== a || o && h !== null && !h || s > 0 && (Number(t?.rating || 0) || 0) < s || c && p !== c || l && m && m !== l); + let n = Ou(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 pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s = null } = {}) { +async function hd(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") { @@ -13540,13 +13545,13 @@ async function pd(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 = Eu(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, dateRange: w, dateExact: T } = l, E = l.sort || "mtime_desc", D = c(t).trim() || "*", O = /^\[object\s+HTML.*Element\]$/i.test(D) ? "*" : D, k = i.sanitizeQuery(O) || O; + }, l = Ou(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, dateRange: T, dateExact: E } = l, D = l.sort || "mtime_desc", O = c(t).trim() || "*", k = /^\[object\s+HTML.*Element\]$/i.test(O) ? "*" : O, A = i.sanitizeQuery(k) || k; try { - let t = String(u || "").toLowerCase() === "output", c = Au({ + let t = String(u || "").toLowerCase() === "output", c = Mu({ ...l, - q: k - }), D = t && Number(r ?? 0) === 0 && k === "*" && !c && String(E || "mtime_desc").toLowerCase() === "mtime_desc", O = !(t && (Number(r ?? 0) > 0 || D)), A = !!l.groupStacks, j = Number(r ?? 0) > 0 ? null : s || null, M = i.buildListURL({ - q: k, + q: A + }), O = t && Number(r ?? 0) === 0 && A === "*" && !c && String(D || "mtime_desc").toLowerCase() === "mtime_desc", k = !(t && (Number(r ?? 0) > 0 || O)), j = !!l.groupStacks, M = Number(r ?? 0) > 0 ? null : s || null, N = i.buildListURL({ + q: A, limit: n, offset: r, scope: u, @@ -13563,13 +13568,14 @@ async function pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s maxWidth: x > 0 ? x : null, maxHeight: S > 0 ? S : null, workflowType: C || null, - dateRange: w || null, - dateExact: T || null, - sort: E, - cursor: j, - includeTotal: O, - groupStacks: A - }), N = await i.get(M, { + workflowId: w || null, + dateRange: T || null, + dateExact: E || null, + sort: D, + cursor: M, + includeTotal: k, + groupStacks: j + }), P = await i.get(N, { timeoutMs: 12e4, ...o ? { signal: o } : {} }); @@ -13583,23 +13589,23 @@ async function pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s } catch (e) { console.debug?.(e); } - if (N.ok) { - let e = N.data?.assets || [], t = Array.isArray(e) ? e.length : 0, n = N.data?.total; + if (P.ok) { + let e = P.data?.assets || [], t = Array.isArray(e) ? e.length : 0, n = P.data?.total; return { ok: !0, assets: e, total: n == null ? null : Number(n ?? 0) || 0, count: t, - limit: Math.max(0, Number(N.data?.limit) || 0), - offset: Math.max(0, Number(N.data?.offset) || 0), - nextCursor: N.data?.next_cursor || N.data?.nextCursor || null, - hasMore: typeof N.data?.has_more == "boolean" ? N.data.has_more : null, - sortKey: E, - safeQuery: k + limit: Math.max(0, Number(P.data?.limit) || 0), + offset: Math.max(0, Number(P.data?.offset) || 0), + nextCursor: P.data?.next_cursor || P.data?.nextCursor || null, + hasMore: typeof P.data?.has_more == "boolean" ? P.data.has_more : null, + sortKey: D, + safeQuery: A }; } try { - if (String(N?.code || "") === "ABORTED") return { + if (String(P?.code || "") === "ABORTED") return { ok: !1, aborted: !0, error: "Aborted" @@ -13609,7 +13615,7 @@ async function pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s } return { ok: !1, - error: N.error + error: P.error }; } catch (e) { try { @@ -13627,7 +13633,7 @@ async function pd(e, t, n, r, i, { requestId: a = 0, signal: o = null, cursor: s }; } } -function md(e, t) { +function gd(e, t) { switch (t) { case "mtime_desc": return -(Number(e?.mtime) || 0); case "mtime_asc": return Number(e?.mtime) || 0; @@ -13636,23 +13642,23 @@ function md(e, t) { default: return -(Number(e?.mtime) || 0); } } -function hd(e, t, n) { +function _d(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 = md(e, n), i = md(t, n); + let r = gd(e, n), i = gd(t, n); return r < i ? -1 : +(r > i); } -function gd(e, t, n) { +function vd(e, t, n) { return n === "name_asc" ? String(e) < String(t) : n === "name_desc" ? String(e) > String(t) : Number(e) < Number(t); } -function _d(e, t, n) { - let r = md(t, n); - for (let t = 0; t < e.length; t++) if (gd(r, md(e[t], n), n)) return t; +function yd(e, t, n) { + let r = gd(t, n); + for (let t = 0; t < e.length; t++) if (vd(r, gd(e[t], n), n)) return t; return e.length; } -function vd(e, t) { +function bd(e, t) { let n = t.get(e); return n || (n = { pending: /* @__PURE__ */ new Map(), @@ -13660,13 +13666,13 @@ function vd(e, t) { flushing: !1 }, t.set(e, n)), n; } -function yd(e) { +function xd(e) { return String(e ?? "").trim().toLowerCase(); } -function bd(e) { +function Sd(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function xd(e) { +function Cd(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -13675,24 +13681,24 @@ function xd(e) { } return e; } -function Sd(e) { +function wd(e) { if (!e || typeof e != "object") return ""; - let t = yd(e?.type || e?.source || "output"), n = yd(e?.root_id || e?.custom_root_id || ""), r = yd(e?.subfolder || ""), i = yd(e?.filename || ""); + let t = xd(e?.type || e?.source || "output"), n = xd(e?.root_id || e?.custom_root_id || ""), r = xd(e?.subfolder || ""), i = xd(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = yd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = xd(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function Cd(e, t, n) { +function Td(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 = Sd(n); - return i ? r.findIndex((e) => Sd(e) === i) : -1; + let i = wd(n); + return i ? r.findIndex((e) => wd(e) === i) : -1; } -function wd(e, t) { - return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : bd(t) ? !0 : ![ +function Ed(e, t) { + return !t || typeof t != "object" || !e || typeof e != "object" ? !1 : Sd(t) ? !0 : ![ "filename", "filepath", "path", @@ -13711,10 +13717,10 @@ function wd(e, t) { "date" ].some((t) => Object.prototype.hasOwnProperty.call(e, t)); } -function Td(e, t) { +function Dd(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 = yt(o?.filename); + let e = o?.id == null ? "" : String(o.id), s = t.assetKey(o), c = St(o?.filename); if (!(e && n.has(e)) && !(s && r.has(s))) { if (c) { let e = i.get(c); @@ -13727,9 +13733,9 @@ function Td(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, sd(e, { assetKey: t.assetKey }); + e.assets = a, ld(e, { assetKey: t.assetKey }); } -function Ed(e, t) { +function Od(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); @@ -13739,14 +13745,14 @@ function Ed(e, t) { try { let n = !1; for (let [a, o] of r.entries()) { - let r = bd(o); + let r = Sd(o); i.assetKeyFn = t.assetKey; - let s = mt(o, i, t.loadMajoorSettings); + let s = vt(o, i, t.loadMajoorSettings); if (Array.isArray(s?.removed) && s.removed.length) { let e = new Set(s.removed); i.assets = i.assets.filter((t) => { let n = !e.has(t); - return n || _t(i, t, i), n; + return n || Ct(i, t, i), n; }); try { i.hiddenPngSiblings = (Number(i.hiddenPngSiblings || 0) || 0) + s.removed.length; @@ -13766,33 +13772,33 @@ function Ed(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 : Cd(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { + } : o, d = c > -1 ? c : Td(i, a, u), f = d > -1 ? i.assets[d] : null, p = f ? { ...f, ...o } : u, m = t.assetKey(u); - if (!fd(e, p)) { + if (!md(e, p)) { if (d > -1) { - if (wd(o, f)) { - Object.assign(f, o), r || xd(f), i.assets[d] = { ...f }, n = !0; + if (Ed(o, f)) { + Object.assign(f, o), r || Cd(f), i.assets[d] = { ...f }, n = !0; continue; } let [e] = i.assets.splice(d, 1); - _t(i, e, i), n = !0; + Ct(i, e, i), n = !0; } continue; } if (d > -1) { let e = t.assetKey(f); - Object.assign(f, o), r || xd(f); + Object.assign(f, o), r || Cd(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 = Eu(e?.dataset || {}).sort || "mtime_desc", s = r ? u : xd({ ...u }), c = _d(i.assets, s, t); + let t = Ou(e?.dataset || {}).sort || "mtime_desc", s = r ? u : Cd({ ...u }), c = yd(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) { - Td(i, t); + Dd(i, t); try { e.dataset.mjrHiddenPngSiblings = String(Number(i.hiddenPngSiblings || 0) || 0); } catch (e) { @@ -13804,23 +13810,23 @@ function Ed(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, Ed(e, t); + n.timer = null, Od(e, t); }, r); } } } -function Dd(e, t, n) { +function kd(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 = vd(e, n.upsertState); - return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Ed(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { - a.timer = null, Ed(e, n); + let a = bd(e, n.upsertState); + return a.pending.set(i, t), a.pending.size >= n.maxBatchSize ? Od(e, n) : !a.timer && !a.flushing && (a.timer = setTimeout(() => { + a.timer = null, Od(e, n); }, n.debounceMs)), !0; } //#endregion //#region ui/vue/components/grid/gridDomBridge.ts -function Od(e) { +function Ad(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -13829,7 +13835,7 @@ function Od(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function kd(e) { +function jd(e) { if (!e) return []; try { return Array.from(e.querySelectorAll?.(".mjr-asset-card") || []); @@ -13837,7 +13843,7 @@ function kd(e) { return console.debug?.(e), []; } } -function Ad(e) { +function Md(e) { if (!e) return null; try { return e.querySelector?.(".mjr-asset-card.is-selected") || null; @@ -13845,34 +13851,34 @@ function Ad(e) { return console.debug?.(e), null; } } -function jd(e, t) { +function Nd(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="${Od(n)}"]`) || null; + return e.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${Ad(n)}"]`) || null; } catch (e) { return console.debug?.(e), null; } } -function Md(e, t = 0) { +function Pd(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); } //#endregion //#region ui/vue/composables/useGridLoader.ts -var Nd = 200, Pd = 50, Fd = /* @__PURE__ */ new WeakMap(), Id = new Set([ +var Fd = 200, Id = 50, Ld = /* @__PURE__ */ new WeakMap(), Rd = new Set([ "collection", "filter", "initial", "scope", "search", "sort" -]), Ld = 0; -function Rd(e) { +]), zd = 0; +function Bd(e) { return new Promise((t) => setTimeout(t, Math.max(0, Number(e) || 0))); } -function zd(e) { +function Vd(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(Oe(e) || "").trim().toLowerCase(), r = String(e?.subfolder || "").trim().toLowerCase(), i = String(e?.filename || "").trim().toLowerCase(); @@ -13880,12 +13886,12 @@ function zd(e) { let a = String(e?.filepath || e?.path || e?.fullpath || e?.full_path || "").trim().toLowerCase(); return a ? `${t}|${n}|path|${a}` : ""; } -function Bd(e) { +function Hd(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 Vd(e) { +function Ud(e) { if (typeof e == "string") return e; if (e && typeof e == "object") { if (typeof e.value == "string") return e.value; @@ -13901,13 +13907,13 @@ function Vd(e) { } return String(e || ""); } -function Hd(e) { +function Wd(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } -async function Ud() { +async function Gd() { await Nn(); } -function Wd(e, t) { +function Kd(e, t) { let n = String(e || "Failed to load"); try { let e = String(t?.message || t || "").trim(), r = e.toLowerCase(); @@ -13916,16 +13922,16 @@ function Wd(e, t) { return n; } } -function Gd(e, t) { - let n = Math.max(1, Math.min(I.MAX_PAGE_SIZE, Number(e) || 1)), r = Math.max(0, Number(t) || 0); +function qd(e, t) { + let n = Math.max(1, Math.min(z.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(I.MAX_PAGE_SIZE, n * i)); + return Math.max(1, Math.min(z.MAX_PAGE_SIZE, n * i)); } -function Kd(e) { +function Jd(e) { e.seenKeys = /* @__PURE__ */ new Set(), e.assetIdSet = /* @__PURE__ */ new Set(), e.filenameCounts = /* @__PURE__ */ new Map(), e.nonImageSiblingKeys = /* @__PURE__ */ new Set(), e.stemMap = /* @__PURE__ */ new Map(), e.renderedFilenameMap = /* @__PURE__ */ new Map(), e.hiddenPngSiblings = 0; } -function qd({ 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 Yd({ 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, @@ -13952,7 +13958,7 @@ function qd({ 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 Hd(e); + return Wd(e); } function b() { return C(); @@ -13988,7 +13994,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM ...e, counts: { loaded: e.assets.length, - visible: Md(y(), e.assets.length), + visible: Pd(y(), e.assets.length), total: e.pagination.total }, metrics: { ...g } @@ -13996,8 +14002,8 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } function C() { let e = y(); - return Eu(e?.dataset || {}, { - q: Du(e, t.query || "*"), + return Ou(e?.dataset || {}, { + q: ku(e, t.query || "*"), resolutionCompare: e?.dataset?.mjrFilterResolutionCompare || "" }); } @@ -14021,6 +14027,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM "maxWidth", "maxHeight", "workflowType", + "workflowId", "dateRange", "dateExact", "semanticMode" @@ -14034,7 +14041,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; } function D(e) { - return Id.has(String(e || "").toLowerCase()); + return Rd.has(String(e || "").toLowerCase()); } function O(e = null) { try { @@ -14052,10 +14059,10 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return xu(y(), l()); + return Cu(y(), l()); } function j() { - if (!I.DEFER_GRID_FETCH_DURING_EXECUTION) return !1; + if (!z.DEFER_GRID_FETCH_DURING_EXECUTION) return !1; try { if (!Array.isArray(t.assets) || t.assets.length === 0) return !1; } catch (e) { @@ -14074,7 +14081,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(e); } try { - m?.listener && window.removeEventListener(B.RUNTIME_STATUS, m.listener); + m?.listener && window.removeEventListener(H.RUNTIME_STATUS, m.listener); } catch (e) { console.debug?.(e); } @@ -14088,21 +14095,21 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } h = null; } - function F(e, n = I.PREFETCH_NEXT_PAGE_DELAY_MS) { - if (!I.PREFETCH_NEXT_PAGE) return; + function P(e, n = z.PREFETCH_NEXT_PAGE_DELAY_MS) { + if (!z.PREFETCH_NEXT_PAGE) return; N(); let r = Math.max(0, Number(n) || 0); h = setTimeout(() => { - h = null, !(t.requestId !== e || t.done || t.loading) && he().catch((e) => { + h = null, !(t.requestId !== e || t.done || t.loading) && me().catch((e) => { console.debug?.("[AssetsManager][GridLoader] Delayed prefetch failed", e); }); }, r); } - function ee(e, t = {}) { + function F(e, t = {}) { M(); let n = (() => { try { - return Ku(C()); + return Ju(C()); } catch (e) { return console.debug?.(e), null; } @@ -14123,17 +14130,17 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (n) { let e = null; try { - e = Ku(C()); + e = Ju(C()); } catch (e) { console.debug?.(e); } if (e && e !== n) { - it("[Grid] Deferred execution reload skipped - scope/filter changed during execution"); + ot("[Grid] Deferred execution reload skipped - scope/filter changed during execution"); return; } } - let a = Du(i, e); - Promise.resolve().then(() => ve(a, { + let a = ku(i, e); + Promise.resolve().then(() => _e(a, { ...t || {}, reset: !0, preserveVisibleUntilReady: !0 @@ -14146,32 +14153,32 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM timer: setTimeout(r, 1250) }; try { - window.addEventListener(B.RUNTIME_STATUS, i); + window.addEventListener(H.RUNTIME_STATUS, i); } catch (e) { console.debug?.(e); } } - function te(e, t = null) { + function I(e, t = null) { if (!e || typeof e != "object") return ""; let n = e.id == null ? `${e.type || ""}|${Oe(e)}|${e.filepath || ""}|${e.subfolder || ""}|${e.filename || ""}` : `id:${e.id}`; try { - return _c(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); + return yc(t || y() || globalThis?.__MJR_LAST_ASSETKEY_GRID__, e, n); } catch (e) { return console.debug?.(e), n; } } - function ne(e = "") { + function ee(e = "") { try { let n = y(), r = Array.isArray(t.assets) ? t.assets : []; if (!n || !r.length) return; - let i = r.map(qu).filter(Boolean); + let i = r.map(Yu).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 = Eu(n.dataset || {}, { - q: Du(n, t.query || "*"), + let a = i.length < r.length, o = Number(t.offset || i.length) || i.length, s = Number(t.total ?? i.length), c = Ou(n.dataset || {}, { + q: ku(n, t.query || "*"), resolutionCompare: n.dataset?.mjrFilterResolutionCompare || "" - }), l = Ku(c); + }), l = Ju(c); if (!l) return; - id(l, { + od(l, { assets: i, title: String(e || "").trim(), query: String(t.query || c.query || "*").trim() || "*", @@ -14183,56 +14190,56 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(e); } } - function re() { + function te() { let e = y(); if (e) try { - let t = Fd.get(e); + let t = Ld.get(e); if (!t) return; t.timer &&= (clearTimeout(t.timer), null), t.pending.clear(), t.flushing = !1; } catch (e) { console.debug?.(e); } } - function ie(e, n) { - let r = _(), i = Array.isArray(n) ? n.length : 0, o = vt(e, n, t, { - loadMajoorSettings: Et, + function re(e, n) { + let r = _(), i = Array.isArray(n) ? n.length : 0, o = bt(e, n, t, { + loadMajoorSettings: pt, clearGridMessage: () => { a(); }, ensureVirtualGrid: () => t.virtualGrid, - setFileBadgeCollision: Mt, - assetKey: (t) => te(t, e), - ensureDupStackCard: (e, t, n) => yc(e, t, n) + setFileBadgeCollision: yt, + assetKey: (t) => I(t, e), + ensureDupStackCard: (e, t, n) => xc(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) { + function ie(e, t) { let n = String(t || "*").trim() || "*"; - return ku(Eu(e?.dataset || {}, { q: n })); + return ju(Ou(e?.dataset || {}, { q: n })); } - function oe(e) { - let t = C(), n = Bd(Vd(e).trim() || "*") || "*"; - return ju({ + function ae(e) { + let t = C(), n = Hd(Ud(e).trim() || "*") || "*"; + return Nu({ ...t, q: n }); } - function se(e, { query: t = "*", limit: n = 0, offset: r = 0 } = {}) { - if (!e?.ok || e.total == null || !oe(t)) return e; + function oe(e, { query: t = "*", limit: n = 0, offset: r = 0 } = {}) { + if (!e?.ok || e.total == null || !ae(t)) return e; let i = Number(e.total), a = Number(e.count ?? e.assets?.length ?? 0) || 0, o = Math.max(1, Number(n) || 1), s = Math.max(0, Number(r) || 0) + a; return Number.isFinite(i) && i > 0 && i <= s && a > 0 && a < o ? { ...e, total: null } : e; } - async function ce(e, n, r, { requestId: i = 0, signal: a = null } = {}) { + async function se(e, n, r, { requestId: i = 0, signal: a = null } = {}) { let o = y(); if (!o) return { ok: !1, error: "Grid unavailable" }; if (r === 0) { - let s = ae(o, e), c = Xn(); + let s = ie(o, e), c = Xn(); if (c && c === s) { let o = Yn(s); if (o) try { @@ -14249,9 +14256,9 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }; let c = s?.data?.assets; if (s?.ok && Array.isArray(c)) { - it("[Grid] Using early-fetched data:", c.length, "assets"); + ot("[Grid] Using early-fetched data:", c.length, "assets"); let t = s.data?.total ?? s.meta?.total ?? null; - return se({ + return oe({ ok: !0, assets: c, total: t == null ? null : Number(t) || 0, @@ -14266,14 +14273,14 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }); } } catch (e) { - it("[Grid] Early fetch failed, falling back to normal fetch", e); + ot("[Grid] Early fetch failed, falling back to normal fetch", e); } } } - return se(await pd(o, e, n, r, { - sanitizeQuery: Bd, - buildListURL: Ae, - get: P, + return oe(await hd(o, e, n, r, { + sanitizeQuery: Hd, + buildListURL: de, + get: ne, getGridState: () => t }, { requestId: i, @@ -14285,7 +14292,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM offset: r }); } - let le = dd({ + let ce = pd({ query: { get value() { return t.query || "*"; @@ -14297,23 +14304,23 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM collection: { append(e = []) { let t = y(); - return t && e.length && Number(ie(t, e) || 0) || 0; + return t && e.length && Number(re(t, e) || 0) || 0; }, reset() {} }, fetchPage: async ({ query: e, limit: n, offset: r, requestId: i }) => { let a = _(); g.pagesRequested += 1; - let o = await ce(e, n, r, { + let o = await se(e, n, r, { requestId: i, signal: t.abortController?.signal || null }); return g.apiTimeMs += Math.max(0, _() - a), o; }, - pageSize: I.DEFAULT_PAGE_SIZE + pageSize: z.DEFAULT_PAGE_SIZE }); - function ue() { - le.setPageState({ + function le() { + ce.setPageState({ offset: t.offset, cursor: t.cursor, total: t.total, @@ -14323,22 +14330,22 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM error: null }); } - function de(e = {}, { syncPaged: n = !0 } = {}) { - !e || typeof e != "object" || (Object.prototype.hasOwnProperty.call(e, "offset") && (t.offset = Math.max(0, Number(e.offset || 0) || 0)), Object.prototype.hasOwnProperty.call(e, "cursor") && (t.cursor = e.cursor || null), Object.prototype.hasOwnProperty.call(e, "total") && (t.total = e.total == null ? null : Math.max(0, Number(e.total) || 0)), Object.prototype.hasOwnProperty.call(e, "done") && (t.done = !!e.done), n && ue()); + function ue(e = {}, { syncPaged: n = !0 } = {}) { + !e || typeof e != "object" || (Object.prototype.hasOwnProperty.call(e, "offset") && (t.offset = Math.max(0, Number(e.offset || 0) || 0)), Object.prototype.hasOwnProperty.call(e, "cursor") && (t.cursor = e.cursor || null), Object.prototype.hasOwnProperty.call(e, "total") && (t.total = e.total == null ? null : Math.max(0, Number(e.total) || 0)), Object.prototype.hasOwnProperty.call(e, "done") && (t.done = !!e.done), n && le()); } function fe() { - de(le.getPageState(), { syncPaged: !1 }); + ue(ce.getPageState(), { syncPaged: !1 }); } function pe() { let e = Array.isArray(t.assets) ? t.assets.length : 0; - e <= 0 || t.done || Number(t.offset || 0) >= e || de({ offset: e }, { syncPaged: !0 }); + e <= 0 || t.done || Number(t.offset || 0) >= e || ue({ offset: e }, { syncPaged: !0 }); } - function me({ title: e = "", showEmptyMessage: n = !0 } = {}) { - r(), Array.isArray(t.assets) && t.assets.length ? (a(), ne(e || t.query)) : n && (!t.statusMessage || !t.statusError) && i("No assets found"); + function L({ title: e = "", showEmptyMessage: n = !0 } = {}) { + r(), Array.isArray(t.assets) && t.assets.length ? (a(), ee(e || t.query)) : n && (!t.statusMessage || !t.statusError) && i("No assets found"); let o = (Array.isArray(t.assets) ? t.assets : []).map((e) => String(e?.id || "")).filter(Boolean); (t.done || Number.isFinite(Number(t.total)) && Number(t.total || 0) <= o.length) && c(o, { activeId: t.activeId }); } - async function he() { + async function me() { let e = y(); if (!e || t.loading || t.done) return { ok: !0, @@ -14356,7 +14363,7 @@ function qd({ 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 && I.PREFETCH_NEXT_PAGE && F(t.requestId, 400), { + if (v("appendNextPage", { appendReason: "pagination" }), !A()) return !t.assets.length && !t.loading && z.PREFETCH_NEXT_PAGE && P(t.requestId, 400), { ok: !0, skipped: !0, hidden: !0 @@ -14366,7 +14373,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM skipped: !0, busy: !0 }; - let h = Math.max(1, Math.min(I.MAX_PAGE_SIZE, I.DEFAULT_PAGE_SIZE)), _ = Date.now(); + let h = Math.max(1, Math.min(z.MAX_PAGE_SIZE, z.DEFAULT_PAGE_SIZE)), _ = Date.now(); t.loading = !0, a(); try { if (!t.done) { @@ -14375,11 +14382,11 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM skipped: !0, hidden: !0 }; - p || pe(), ue(); - let n = t.requestId, r = await le.loadUntilVisible({ + p || pe(), le(); + let n = t.requestId, r = await ce.loadUntilVisible({ maxEmptyPages: 6, canContinue: () => A(), - getLimit: (e) => Gd(h, e), + getLimit: (e) => qd(h, e), beforeApplyPage: (e) => { if (t.requestId !== n) return { ok: !1, @@ -14392,12 +14399,12 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM query: t.query || "*", total: null, done: !1 - }), de({ + }), ue({ offset: 0, cursor: null, total: null, done: !1 - }), Kd(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (it("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { + }), Jd(t), g.resetCount += 1, p = !1, null) : Array.isArray(t.assets) && t.assets.length ? (ot("[Grid LoadPage] empty response with cached visible assets - preserving cached view", { offset: t.offset, query: t.query }), { @@ -14408,18 +14415,18 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }) : null; }, onEmptyPage: (e) => { - e.emptyPageIndex <= 0 || it(`[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}`); + e.emptyPageIndex <= 0 || ot(`[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 (fe(), pe(), !r.ok) return r.aborted || r.stale ? r : (de({ done: !0 }), i(Wd("Failed to load assets", r?.error || "Unknown error"), { error: !0 }), r); + if (fe(), pe(), !r.ok) return r.aborted || r.stale ? r : (ue({ done: !0 }), i(Kd("Failed to load assets", r?.error || "Unknown error"), { error: !0 }), r); if (r.preservedCached) return r; - if (t.done || r.added > 0) return ne(t.query || Du(e, "*")), { + if (t.done || r.added > 0) return ee(t.query || ku(e, "*")), { ok: !0, count: r.count, total: t.total }; let a = r.lastResult || r.firstResult || r; - return it(`[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 && I.PREFETCH_NEXT_PAGE && F(Number(t.requestId ?? 0) || 0, Math.min(I.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { + return ot(`[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 && z.PREFETCH_NEXT_PAGE && P(Number(t.requestId ?? 0) || 0, Math.min(z.PREFETCH_NEXT_PAGE_DELAY_MS ?? 700, 250)), { ok: !0, count: r.count, total: t.total, @@ -14441,7 +14448,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - return i(Wd("Failed to load assets", e), { error: !0 }), { + return i(Kd("Failed to load assets", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; @@ -14463,44 +14470,44 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } try { let e = Date.now() - _; - e < Ld && await Rd(Ld - e); + e < zd && await Bd(zd - e); } catch (e) { console.debug?.(e); } t.loading = !1, r(); } } - let ge = null; - function _e(e = 250) { + let he = null; + function ge(e = 250) { v("refreshHead", { appendReason: "snapshotHeadRefresh" }); try { - ge && clearTimeout(ge); + he && clearTimeout(he); } catch (e) { console.debug?.(e); } let n = t.requestId, r = null; try { - r = Ku(C()); + r = Ju(C()); } catch (e) { console.debug?.(e); } - ge = setTimeout(async () => { - if (ge = null, Number(t.requestId) !== Number(n) || j() || !y()) return; + he = setTimeout(async () => { + if (he = null, Number(t.requestId) !== Number(n) || j() || !y()) return; if (r) { let e = null; try { - e = Ku(C()); + e = Ju(C()); } catch (e) { console.debug?.(e); } if (e && e !== r) { - it("[Grid] Snapshot head refresh skipped - context changed"); + ot("[Grid] Snapshot head refresh skipped - context changed"); return; } } - let e = Math.max(1, Math.min(I.MAX_PAGE_SIZE, I.DEFAULT_PAGE_SIZE)); + let e = Math.max(1, Math.min(z.MAX_PAGE_SIZE, z.DEFAULT_PAGE_SIZE)); try { - let i = await ce(t.query || "*", e, 0, { + let i = await se(t.query || "*", e, 0, { requestId: n, signal: t.abortController?.signal || null }); @@ -14508,27 +14515,27 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM if (r) { let e = null; try { - e = Ku(C()); + e = Ju(C()); } catch (e) { console.debug?.(e); } if (e && e !== r) { - it("[Grid] Snapshot head refresh discarded - context changed mid-fetch"); + ot("[Grid] Snapshot head refresh discarded - context changed mid-fetch"); return; } } if (!i?.ok) return; let a = Array.isArray(i.assets) ? i.assets : []; - if (i.total != null && de({ total: i.total }), !a.length) return; + if (i.total != null && ue({ total: i.total }), !a.length) return; let o = 0; - for (let e of a) e && e.id != null && De(e) && (o += 1); - o > 0 && (ne(t.query || "*"), it("[Grid] Snapshot head refresh: inserted", o, "new asset(s)")); + for (let e of a) e && e.id != null && Ee(e) && (o += 1); + o > 0 && (ee(t.query || "*"), ot("[Grid] Snapshot head refresh: inserted", o, "new asset(s)")); } catch (e) { console.debug?.("[Grid] Snapshot head refresh failed", e); } }, Math.max(0, Number(e) || 0)); } - async function ve(e = "*", i = {}) { + async function _e(e = "*", i = {}) { let s = t.requestId, { reset: c = !0, preserveVisibleUntilReady: l = !0 } = i || {}, u = y(); if (!u) return { ok: !1, @@ -14543,7 +14550,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - let d = Vd(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = Bd(f) || f; + let d = Ud(e).trim() || "*", f = /^\[object\s+HTML.*Element\]$/i.test(d) ? "*" : d, m = Hd(f) || f; t.query = m; let h = c ? E(m, i) : { reason: "append", @@ -14553,14 +14560,14 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM let e = !1; try { let n = C(); - if (n.query = m, rd(Ku(n)) && (e = await Te(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { + if (n.query = m, ad(Ju(n)) && (e = await we(n, { allowReplaceExisting: !0 }), t.requestId > s + +!!e)) return console.debug?.("[Grid] loadAssets aborted during deferral due to scope switch"), { ok: !1, aborted: !0 }; } catch (e) { console.debug?.(e); } - return e ? (r(), t.loading = !1) : n("Grid refresh deferred while ComfyUI is generating..."), ee(m, i || {}), { + return e ? (r(), t.loading = !1) : n("Grid refresh deferred while ComfyUI is generating..."), F(m, i || {}), { ok: !0, deferred: !0, cached: e, @@ -14587,24 +14594,24 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { t.abortController = null; } - t.requestId = (Number(t.requestId) || 0) + 1, N(), re(), a(), p ? (t.query = m, de({ + t.requestId = (Number(t.requestId) || 0) + 1, N(), te(), a(), p ? (t.query = m, ue({ offset: 0, cursor: null, total: null, done: !1 - }), Kd(t)) : (o({ + }), Jd(t)) : (o({ query: m, total: null, done: !1 - }), de({ + }), ue({ offset: 0, cursor: null, total: null, done: !1 - }), Kd(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); + }), Jd(t), g.resetCount += 1), n(m === "*" ? "Loading assets..." : `Searching for "${m}"...`); } - let _ = await he(); - return pe(), I.PREFETCH_NEXT_PAGE && _?.ok && !_?.skipped && !t.done && !_?.aborted && F(t.requestId), c && (me({ + let _ = await me(); + return pe(), z.PREFETCH_NEXT_PAGE && _?.ok && !_?.skipped && !t.done && !_?.aborted && P(t.requestId), c && (L({ title: m, showEmptyMessage: !(_?.skipped || _?.hidden || _?.aborted || _?.stale || _?.preservedCached || _?.busy) }), O(h.nextContext)), { @@ -14615,7 +14622,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM aborted: !!_?.aborted }; } - async function ye(e, s = {}) { + async function ve(e, s = {}) { let { title: c = "Collection", reset: l = !0, showLoading: u = !0, preserveVisibleUntilReady: d = !0 } = s || {}; v("reload", { reloadReason: s?.resetReason || s?.reason || "collection" }); let f = y(); @@ -14639,7 +14646,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { t.abortController = null; } - t.requestId = (Number(t.requestId) || 0) + 1, re(), a(), h ? (t.query = String(c || "Collection"), de({ + t.requestId = (Number(t.requestId) || 0) + 1, te(), a(), h ? (t.query = String(c || "Collection"), ue({ offset: 0, cursor: null, total: p.length, @@ -14648,48 +14655,48 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM query: String(c || "Collection"), total: p.length, done: !0 - }), de({ + }), ue({ offset: 0, cursor: null, total: p.length, done: !0 - }), Kd(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); + }), Jd(t), g.resetCount += 1), u ? (n(p.length ? `Loading ${c}...` : `${c} is empty`), t.loading = !0) : (r(), t.loading = !1); } try { - let e = Ou(f, "mtime_desc"), n = p.sort((t, n) => hd(t, n, e)); + let e = Au(f, "mtime_desc"), n = p.sort((t, n) => _d(t, n, e)); return l && h && (o({ query: String(c || "Collection"), total: p.length, done: !0 - }), Kd(t), g.resetCount += 1), ie(f, n), de({ + }), Jd(t), g.resetCount += 1), re(f, n), ue({ offset: n.length, cursor: null, total: n.length, done: !0 - }), me({ title: c }), O(w(String(c || "Collection"))), { + }), L({ title: c }), O(w(String(c || "Collection"))), { ok: !0, count: n.length, total: n.length }; } catch (e) { - return i(Wd("Failed to load collection", e), { error: !0 }), { + return i(Kd("Failed to load collection", e), { error: !0 }), { ok: !1, error: e?.message || String(e) }; } finally { if (u) try { let e = Date.now() - m; - e < Ld && await Rd(Ld - e); + e < zd && await Bd(zd - e); } catch (e) { console.debug?.(e); } t.loading = !1, u && r(); } } - function be() { + function ye() { v("reload", { reloadReason: "scopeSwitch" }); try { - vc(y()); + bc(y()); } catch (e) { console.debug?.(e); } @@ -14698,19 +14705,19 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch (e) { console.debug?.(e); } - t.abortController = null, t.requestId = (Number(t.requestId) || 0) + 1, t.loading = !0, de({ + t.abortController = null, t.requestId = (Number(t.requestId) || 0) + 1, t.loading = !0, ue({ offset: 0, cursor: null, total: null, done: !1 - }), N(), re(), r(), a(), p = !0, s([], ""); + }), N(), te(), r(), a(), p = !0, s([], ""); } - function xe() { + function be() { t.virtualGrid?.setItems?.(t.assets || []); } - function Se(e, { updateSelection: n = !0 } = {}) { - let r = cd(t, e, { assetKey: (e) => te(e, y()) }); - return r ? (Number.isFinite(Number(t.total)) && de({ 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"), { + function xe(e, { updateSelection: n = !0 } = {}) { + let r = ud(t, e, { assetKey: (e) => I(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, selectedIds: t.selectedIds.slice() @@ -14720,7 +14727,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM selectedIds: t.selectedIds.slice() }; } - function Ce() { + function Se() { let e = y(), t = l(); if (!e || !t) return null; let n = (e) => { @@ -14731,7 +14738,7 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { return !1; } - }, r = Ad(e), i = u(), a = i.find((e) => n(e)) || i[0] || null, o = n(r) ? r : a; + }, r = Md(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(); @@ -14744,17 +14751,17 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM return console.debug?.(e), null; } } - async function we(e) { + async function Ce(e) { let t = y(), n = l(); if (!t || !n || !e) return; - await Ud(); + await Gd(); let r = String(e.id || "").trim(); if (!r) { n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; return; } - d(r, { align: "start" }), await Ud(); - let i = jd(t, r); + d(r, { align: "start" }), await Gd(); + let i = Nd(t, r); if (!i) { n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; return; @@ -14766,10 +14773,10 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM console.debug?.(t), n.scrollTop = Number(e.scrollTop || 0) || 0, g.scrollRestoreCount += 1; } } - async function Te(e = {}, n = {}) { + async function we(e = {}, n = {}) { let i = y(); if (!i) return !1; - let s = Ku(e), c = nd(s); + let s = Ju(e), c = id(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 { @@ -14782,11 +14789,11 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } catch { t.abortController = null; } - return t.requestId = (Number(t.requestId) || 0) + 1, N(), re(), o({ + return t.requestId = (Number(t.requestId) || 0) + 1, N(), te(), o({ query: c.query || n.title || "Cached", total: Number(c.total ?? c.assets.length) || c.assets.length, done: !!c.done - }), Kd(t), g.resetCount += 1, a(), r(), t.loading = !1, ie(i, c.assets), de({ + }), Jd(t), g.resetCount += 1, a(), r(), t.loading = !1, re(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, @@ -14794,40 +14801,40 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM }), t._mjrLastHydrateKey = s, t._mjrLastHydrateAt = Date.now(), O({ ...e, query: c.query || e.query || "*" - }), p = !1, me({ title: c.title || n.title || "Cached" }), !0; + }), p = !1, L({ title: c.title || n.title || "Cached" }), !0; } - function Ee(e) { + function Te(e) { return { getOrCreateState: () => t, ensureVirtualGrid: () => t.virtualGrid, - upsertState: Fd, - maxBatchSize: Pd, - debounceMs: Nd, - assetKey: (t) => zd(t) || te(t, e), - loadMajoorSettings: Et + upsertState: Ld, + maxBatchSize: Id, + debounceMs: Fd, + assetKey: (t) => Vd(t) || I(t, e), + loadMajoorSettings: pt }; } - function De(e) { + function Ee(e) { v("upsertRealtime", { appendReason: "realtime" }); let t = y(); - return !t || !e || !e.id ? !1 : Dd(t, e, Ee(t)); + return !t || !e || !e.id ? !1 : kd(t, e, Te(t)); } - let ke = !1; - function je(e) { + let De = !1; + function ke(e) { v("upsertRealtime", { appendReason: "realtimeImmediate" }); let t = y(); if (!t || !e || !e.id) return !1; - let n = Dd(t, e, Ee(t)); - return n && !ke && (ke = !0, queueMicrotask(() => { - ke = !1; + let n = kd(t, e, Te(t)); + return n && !De && (De = !0, queueMicrotask(() => { + De = !1; let e = y(); - e && Ed(e, Ee(e)); + e && Od(e, Te(e)); })), n; } - function Me() { - ne(t.query || "Cached"); + function Ae() { + ee(t.query || "Cached"); try { - td(); + rd(); } catch (e) { console.debug?.(e); } @@ -14839,41 +14846,41 @@ function qd({ gridContainerRef: e, state: t, setLoadingMessage: n, clearLoadingM } let e = y(); if (e) try { - let t = vd(e, Fd); + let t = bd(e, Ld); t?.timer && (clearTimeout(t.timer), t.timer = null), t?.pending?.clear?.(); } catch (e) { console.debug?.(e); } } try { - window.addEventListener("pagehide", Me, { once: !0 }); + window.addEventListener("pagehide", Ae, { once: !0 }); } catch (e) { console.debug?.(e); } return { - reload: ve, - appendNextPage: he, - refreshHead: _e, - upsertRealtime: je, - loadAssets: ve, - loadAssetsFromList: ye, - loadNextPage: he, - prepareGridForScopeSwitch: be, - refreshGrid: xe, - removeAssets: Se, - captureAnchor: Ce, - restoreAnchor: we, - hydrateFromSnapshot: Te, - upsertAsset: De, - upsertAssetNow: je, + reload: _e, + appendNextPage: me, + refreshHead: ge, + upsertRealtime: ke, + loadAssets: _e, + loadAssetsFromList: ve, + loadNextPage: me, + prepareGridForScopeSwitch: ye, + refreshGrid: be, + removeAssets: xe, + captureAnchor: Se, + restoreAnchor: Ce, + hydrateFromSnapshot: we, + upsertAsset: Ee, + upsertAssetNow: ke, getCanonicalState: x, getDebugSnapshot: S, - dispose: Me + dispose: Ae }; } //#endregion //#region node_modules/@tanstack/virtual-core/dist/esm/utils.js -function Jd(e, t, n) { +function Xd(e, t, n) { let r = n.initialDeps ?? [], i, a = !0; function o() { let o; @@ -14898,26 +14905,26 @@ function Jd(e, t, n) { r = e; }, o; } -function Yd(e, t) { +function Zd(e, t) { if (e === void 0) throw Error(`Unexpected undefined${t ? `: ${t}` : ""}`); return e; } -var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { +var Qd = (e, t) => Math.abs(e - t) < 1.01, $d = (e, t, n) => { let r; return function(...i) { e.clearTimeout(r), r = e.setTimeout(() => t.apply(this, i), n); }; -}, Qd = (e) => { +}, ef = (e) => { let { offsetWidth: t, offsetHeight: n } = e; return { width: t, height: n }; -}, $d = (e) => e, ef = (e) => { +}, tf = (e) => e, nf = (e) => { let t = Math.max(e.startIndex - e.overscan, 0), n = Math.min(e.endIndex + e.overscan, e.count - 1), r = []; for (let e = t; e <= n; e++) r.push(e); return r; -}, tf = (e, t) => { +}, rf = (e, t) => { let n = e.scrollElement; if (!n) return; let r = e.targetWindow; @@ -14929,7 +14936,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { height: Math.round(r) }); }; - if (i(Qd(n)), !r.ResizeObserver) return () => {}; + if (i(ef(n)), !r.ResizeObserver) return () => {}; let a = new r.ResizeObserver((t) => { let r = () => { let e = t[0]; @@ -14943,43 +14950,43 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { return; } } - i(Qd(n)); + i(ef(n)); }; e.options.useAnimationFrameWithResizeObserver ? requestAnimationFrame(r) : r(); }); return a.observe(n, { box: "border-box" }), () => { a.unobserve(n); }; -}, nf = { passive: !0 }, rf = typeof window > "u" ? !0 : "onscrollend" in window, af = (e, t) => { +}, af = { passive: !0 }, of = typeof window > "u" ? !0 : "onscrollend" in window, sf = (e, t) => { let n = e.scrollElement; if (!n) return; let r = e.targetWindow; if (!r) return; - let i = 0, a = e.options.useScrollendEvent && rf ? () => void 0 : Zd(r, () => { + let i = 0, a = e.options.useScrollendEvent && of ? () => void 0 : $d(r, () => { t(i, !1); }, e.options.isScrollingResetDelay), o = (r) => () => { let { horizontal: o, isRtl: s } = e.options; i = o ? n.scrollLeft * (s && -1 || 1) : n.scrollTop, a(), t(i, r); }, s = o(!0), c = o(!1); - n.addEventListener("scroll", s, nf); - let l = e.options.useScrollendEvent && rf; - return l && n.addEventListener("scrollend", c, nf), () => { + n.addEventListener("scroll", s, af); + let l = e.options.useScrollendEvent && of; + return l && n.addEventListener("scrollend", c, af), () => { n.removeEventListener("scroll", s), l && n.removeEventListener("scrollend", c); }; -}, of = (e, t, n) => { +}, cf = (e, t, n) => { if (t?.borderBoxSize) { let e = t.borderBoxSize[0]; if (e) return Math.round(e[n.options.horizontal ? "inlineSize" : "blockSize"]); } return e[n.options.horizontal ? "offsetWidth" : "offsetHeight"]; -}, sf = (e, { adjustments: t = 0, behavior: n }, r) => { +}, lf = (e, { adjustments: t = 0, behavior: n }, r) => { var i, a; let o = e + t; (a = (i = r.scrollElement)?.scrollTo) == null || a.call(i, { [r.options.horizontal ? "left" : "top"]: o, behavior: n }); -}, cf = class { +}, uf = class { constructor(e) { this.unsubs = [], this.scrollElement = null, this.targetWindow = null, this.isScrolling = !1, this.scrollState = null, this.measurementsCache = [], this.itemSizeCache = /* @__PURE__ */ new Map(), this.laneAssignments = /* @__PURE__ */ new Map(), this.pendingMeasuredCacheIndexes = [], this.prevLanes = void 0, this.lanesChangedFlag = !1, this.lanesSettling = !1, this.scrollRect = null, this.scrollOffset = null, this.scrollDirection = null, this.scrollAdjustments = 0, this.elementsCache = /* @__PURE__ */ new Map(), this.now = () => { var e; @@ -15018,10 +15025,10 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { scrollPaddingStart: 0, scrollPaddingEnd: 0, horizontal: !1, - getItemKey: $d, - rangeExtractor: ef, + getItemKey: tf, + rangeExtractor: nf, onChange: () => {}, - measureElement: of, + measureElement: cf, initialRect: { width: 0, height: 0 @@ -15042,7 +15049,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { }, this.notify = (e) => { var t, n; (n = (t = this.options).onChange) == null || n.call(t, this, e); - }, this.maybeNotify = Jd(() => (this.calculateRange(), [ + }, this.maybeNotify = Xd(() => (this.calculateRange(), [ this.isScrolling, this.range ? this.range.startIndex : null, this.range ? this.range.endIndex : null @@ -15087,7 +15094,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { if (a == null || t.end > a.end ? r.set(t.lane, t) : t.end < a.end && n.set(t.lane, !0), n.size === this.options.lanes) break; } return r.size === this.options.lanes ? Array.from(r.values()).sort((e, t) => e.end === t.end ? e.index - t.index : e.end - t.end)[0] : void 0; - }, this.getMeasurementOptions = Jd(() => [ + }, this.getMeasurementOptions = Xd(() => [ this.options.count, this.options.paddingStart, this.options.scrollMargin, @@ -15103,7 +15110,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { enabled: i, lanes: a, laneAssignmentMode: o - }), { key: !1 }), this.getMeasurements = Jd(() => [this.getMeasurementOptions(), this.itemSizeCache], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o }, s) => { + }), { key: !1 }), this.getMeasurements = Xd(() => [this.getMeasurementOptions(), this.itemSizeCache], ({ count: e, paddingStart: t, scrollMargin: n, getItemKey: r, enabled: i, lanes: a, laneAssignmentMode: o }, s) => { if (!i) return this.measurementsCache = [], this.itemSizeCache.clear(), this.laneAssignments.clear(), []; if (this.laneAssignments.size > e) for (let t of this.laneAssignments.keys()) t >= e && this.laneAssignments.delete(t); this.lanesChangedFlag && (this.lanesChangedFlag = !1, this.lanesSettling = !0, this.measurementsCache = [], this.itemSizeCache.clear(), this.laneAssignments.clear(), this.pendingMeasuredCacheIndexes = []), this.measurementsCache.length === 0 && !this.lanesSettling && (this.measurementsCache = this.options.initialMeasurementsCache, this.measurementsCache.forEach((e) => { @@ -15140,12 +15147,12 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { }, { key: !1, debug: () => this.options.debug - }), this.calculateRange = Jd(() => [ + }), this.calculateRange = Xd(() => [ this.getMeasurements(), this.getSize(), this.getScrollOffset(), this.options.lanes - ], (e, t, n, r) => this.range = e.length > 0 && t > 0 ? uf({ + ], (e, t, n, r) => this.range = e.length > 0 && t > 0 ? ff({ measurements: e, outerSize: t, scrollOffset: n, @@ -15153,7 +15160,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { }) : null, { key: !1, debug: () => this.options.debug - }), this.getVirtualIndexes = Jd(() => { + }), this.getVirtualIndexes = Xd(() => { let e = null, t = null, n = this.calculateRange(); return n && (e = n.startIndex, t = n.endIndex), this.maybeNotify.updateDeps([ this.isScrolling, @@ -15202,7 +15209,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { adjustments: this.scrollAdjustments += r, behavior: void 0 }), this.pendingMeasuredCacheIndexes.push(n.index), this.itemSizeCache = new Map(this.itemSizeCache.set(n.key, t)), this.notify(!1)); - }, this.getVirtualItems = Jd(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { + }, this.getVirtualItems = Xd(() => [this.getVirtualIndexes(), this.getMeasurements()], (e, t) => { let n = []; for (let r = 0, i = e.length; r < i; r++) { let i = t[e[r]]; @@ -15214,7 +15221,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { debug: () => this.options.debug }), this.getVirtualItemForOffset = (e) => { let t = this.getMeasurements(); - if (t.length !== 0) return Yd(t[lf(0, t.length - 1, (e) => Yd(t[e]).start, e)]); + if (t.length !== 0) return Zd(t[df(0, t.length - 1, (e) => Zd(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; @@ -15318,7 +15325,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { 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 && Xd(t, this.getScrollOffset())) { + if (!n && Qd(t, this.getScrollOffset())) { if (this.scrollState.stableFrames++, this.scrollState.stableFrames >= 1) { this.scrollState = null; return; @@ -15329,7 +15336,7 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { })); this.scheduleScrollReconcile(); } -}, lf = (e, t, n, r) => { +}, df = (e, t, n, r) => { for (; e <= t;) { let i = (e + t) / 2 | 0, a = n(i); if (a < r) e = i + 1; @@ -15338,13 +15345,13 @@ var Xd = (e, t) => Math.abs(e - t) < 1.01, Zd = (e, t, n) => { } return e > 0 ? e - 1 : 0; }; -function uf({ measurements: e, outerSize: t, scrollOffset: n, lanes: r }) { +function ff({ measurements: e, outerSize: t, scrollOffset: n, lanes: r }) { let i = e.length - 1, a = (t) => e[t].start; if (e.length <= r) return { startIndex: 0, endIndex: i }; - let o = lf(0, i, a, n), s = o; + let o = df(0, i, a, n), s = o; if (r === 1) for (; s < i && e[s].end < n + t;) s++; else if (r > 1) { let a = Array(r).fill(0); @@ -15366,11 +15373,11 @@ function uf({ measurements: e, outerSize: t, scrollOffset: n, lanes: r }) { } //#endregion //#region node_modules/@tanstack/vue-virtual/dist/esm/index.js -function df(e) { - let t = new cf(J(e)), n = fn(t), r = t._didMount(); - return mn(() => J(e).getScrollElement(), (e) => { +function pf(e) { + let t = new uf(X(e)), n = fn(t), r = t._didMount(); + return mn(() => X(e).getScrollElement(), (e) => { e && t._willUpdate(); - }, { immediate: !0 }), mn(() => J(e), (e) => { + }, { immediate: !0 }), mn(() => X(e), (e) => { t.setOptions({ ...e, onChange: (t, r) => { @@ -15380,21 +15387,21 @@ function df(e) { }), t._willUpdate(), Pn(n); }, { immediate: !0 }), On(r), n; } -function ff(e) { - return df(X(() => ({ - observeElementRect: tf, - observeElementOffset: af, - scrollToFn: sf, - ...J(e) +function mf(e) { + return pf(Z(() => ({ + observeElementRect: rf, + observeElementOffset: sf, + scrollToFn: lf, + ...X(e) }))); } //#endregion //#region ui/vue/grid/useGridVirtualRows.ts -function pf(e, t = 0) { - let n = Number(J(e)); +function hf(e, t = 0) { + let n = Number(X(e)); return Number.isFinite(n) ? n : t; } -function mf(e = [], t = 1) { +function gf(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), @@ -15402,46 +15409,46 @@ function mf(e = [], t = 1) { }); return i; } -function hf(e = [], t = 0, n = 1) { +function _f(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 gf({ scrollRef: e, items: t, columnCount: n, estimateRowHeight: r, overscan: i = 8, enabled: a = !0, measure: o = of } = {}) { - let s = X(() => { - if (!J(a)) return 0; - let e = J(t) || [], r = Math.max(1, pf(n, 1)); +function vf({ scrollRef: e, items: t, columnCount: n, estimateRowHeight: r, overscan: i = 8, enabled: a = !0, measure: o = cf } = {}) { + let s = Z(() => { + if (!X(a)) return 0; + let e = X(t) || [], r = Math.max(1, hf(n, 1)); return Math.ceil((Array.isArray(e) ? e.length : 0) / r); - }), c = ff(X(() => ({ + }), c = mf(Z(() => ({ count: s.value, - getScrollElement: () => J(e) || null, - estimateSize: () => Math.max(1, pf(r, 120)), - overscan: Math.max(0, pf(i, 8)), + getScrollElement: () => X(e) || null, + estimateSize: () => Math.max(1, hf(r, 120)), + overscan: Math.max(0, hf(i, 8)), measureElement: o }))); return { rowCount: s, virtualizer: c, - virtualRows: X(() => { - let e = J(t) || [], r = Math.max(1, pf(n, 1)); + virtualRows: Z(() => { + let e = X(t) || [], r = Math.max(1, hf(n, 1)); return c.value.getVirtualItems().map((t) => ({ key: t.key, index: t.index, virtual: t, - items: hf(e, t.index, r) + items: _f(e, t.index, r) })); }), - totalSize: X(() => c.value.getTotalSize()), - getRowItems: (e) => hf(J(t) || [], e, pf(n, 1)) + totalSize: Z(() => c.value.getTotalSize()), + getRowItems: (e) => _f(X(t) || [], e, hf(n, 1)) }; } //#endregion //#region ui/vue/grid/useInfiniteTrigger.ts -function _f(e, t = !0) { - let n = J(e); +function yf(e, t = !0) { + let n = X(e); return n == null ? t : !!n; } -function vf({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { - let o = K(null), s = null, c = !1; +function bf({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMargin: i = "900px", threshold: a = .01 } = {}) { + let o = J(null), s = null, c = !1; function l() { try { s?.disconnect?.(); @@ -15451,7 +15458,7 @@ function vf({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar s = null; } async function u() { - if (!c && !(!_f(t, !0) || !_f(n, !0)) && typeof r == "function") { + if (!c && !(!yf(t, !0) || !yf(n, !0)) && typeof r == "function") { c = !0; try { await r(); @@ -15466,12 +15473,12 @@ function vf({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar !t || typeof IntersectionObserver != "function" || (s = new IntersectionObserver((e = []) => { e.some((e) => e?.isIntersecting) && u(); }, { - root: J(e) || null, + root: X(e) || null, rootMargin: i, threshold: a }), s.observe(t)); } - return xn() && (bn(d), yn(l), mn(() => [J(e), o.value], () => d(), { flush: "post" })), { + return xn() && (bn(d), yn(l), mn(() => [X(e), o.value], () => d(), { flush: "post" })), { sentinelRef: o, connect: d, disconnect: l, @@ -15480,18 +15487,18 @@ function vf({ rootRef: e, enabled: t = !0, canLoad: n = !0, loadMore: r, rootMar } //#endregion //#region ui/vue/grid/useGridDisplayAssets.ts -function yf(e) { - let t = yt(e?.filename); +function xf(e) { + let t = St(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 bf(e) { +function Sf(e) { return !!e; } -function xf(e) { +function Cf(e) { let t = Array.isArray(e) ? e : [], n = /* @__PURE__ */ new Map(), r = []; for (let e of t) { if (!e) continue; - let t = yf(e); + let t = xf(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; @@ -15510,7 +15517,7 @@ function xf(e) { } //#endregion //#region ui/vue/components/grid/VirtualAssetGridHost.vue -var Sf = { +var wf = { key: 0, class: "mjr-grid-loading-overlay", style: { @@ -15525,12 +15532,12 @@ var Sf = { background: "rgba(20,22,28,0.55)", "backdrop-filter": "blur(2px)" } -}, Cf = { style: { width: "100%" } }, wf = { class: "mjr-grid-skeleton-layout" }, Tf = { style: { +}, Tf = { style: { width: "100%" } }, Ef = { class: "mjr-grid-skeleton-layout" }, Df = { style: { "margin-top": "10px", "font-size": "12px", opacity: "0.68", "text-align": "center" -} }, Ef = ["data-index"], Df = [ +} }, Of = ["data-index"], kf = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -15546,14 +15553,14 @@ var Sf = { "onMousedown", "onClick", "onDblclick" -], Of = { +], Af = { key: 3, style: { display: "flex", "flex-direction": "column", width: "100%" } -}, kf = [ +}, jf = [ "data-mjr-asset-id", "data-mjr-filename-key", "data-mjr-ext", @@ -15569,7 +15576,7 @@ var Sf = { "onMousedown", "onClick", "onDblclick" -], Af = /* @__PURE__ */ Il({ +], Mf = /* @__PURE__ */ Rl({ __name: "VirtualAssetGridHost", props: { scrollElement: { @@ -15598,9 +15605,9 @@ var Sf = { } }, setup(e, { expose: t }) { - let n = e, r = K(null), i = K(1024); - K(!0); - let a = K(0), o = K(0), s = /* @__PURE__ */ new WeakMap(), c = 0, l = 0, u = 0; + let n = e, r = J(null), i = J(1024); + J(!0); + let a = J(0), o = J(0), s = /* @__PURE__ */ new WeakMap(), c = 0, l = 0, u = 0; function d(e) { return (Array.isArray(e) ? e : []).slice().sort((e, t) => { let n = Number(e?.mtime || e?.created_at || 0) || 0; @@ -15617,12 +15624,12 @@ var Sf = { t._mjrStackMembersCache ||= /* @__PURE__ */ new Map(); let a = t._mjrStackMembersCache.get(i); if (!Array.isArray(a)) { - let e = await P(Ie(n), { timeoutMs: 3e4 }); + let e = await ne(Le(n), { timeoutMs: 3e4 }); if (e?.ok && Array.isArray(e?.data)) a = e.data, t._mjrStackMembersCache.set(i, a); else return; } let o = d(a); - t.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, { + t.dispatchEvent(new CustomEvent(H.OPEN_STACK_GROUP, { bubbles: !0, detail: { asset: e, @@ -15636,7 +15643,7 @@ var Sf = { let t = r.value; if (!t || !e) return; let n = Array.isArray(e._mjrDupMembers) ? e._mjrDupMembers : [e]; - t.dispatchEvent(new CustomEvent(B.OPEN_STACK_GROUP, { + t.dispatchEvent(new CustomEvent(H.OPEN_STACK_GROUP, { bubbles: !0, detail: { asset: e, @@ -15647,23 +15654,23 @@ var Sf = { })); } }); - let { state: f, selectedIdSet: p, setLoadingMessage: m, clearLoadingMessage: h, setStatusMessage: g, clearStatusMessage: _, resetAssets: v, setSelection: y, reconcileSelection: b, getSelectedAssets: x, getActiveAsset: S } = _u(); + let { state: f, selectedIdSet: p, setLoadingMessage: m, clearLoadingMessage: h, setStatusMessage: g, clearStatusMessage: _, resetAssets: v, setSelection: y, reconcileSelection: b, getSelectedAssets: x, getActiveAsset: S } = yu(); function C(e) { return e ? typeof e == "object" && "value" in e ? e.value || null : e : null; } - let w = X(() => C(n.scrollElement)); + let w = Z(() => C(n.scrollElement)); function T() { - return kd(r.value); + return jd(r.value); } function E(e, { align: t = "auto" } = {}) { let r = String(e || "").trim(); if (!r) return; - let i = (Array.isArray(ie.value) ? ie.value : []).findIndex((e) => String(e?.id || "") === r); + let i = (Array.isArray(re.value) ? re.value : []).findIndex((e) => String(e?.id || "") === r); if (!(i < 0)) { if (n.virtualize) { - let e = Math.floor(i / Math.max(1, ue.value)); + let e = Math.floor(i / Math.max(1, le.value)); try { - ye.value.scrollToIndex(e, { align: t }); + _e.value.scrollToIndex(e, { align: t }); } catch (e) { console.debug?.(e); } @@ -15680,9 +15687,9 @@ var Sf = { } } function D() { - return xu(r.value, w.value); + return Cu(r.value, w.value); } - let O = qd({ + let O = Yd({ gridContainerRef: r, state: f, setLoadingMessage: m, @@ -15696,10 +15703,10 @@ var Sf = { readRenderedCards: T, scrollToAssetId: E, canLoadMore: D - }), { sentinelRef: k } = vf({ + }), { sentinelRef: k } = bf({ rootRef: w, enabled: !0, - canLoad: X(() => !f.loading && !f.done && D()), + canLoad: Z(() => !f.loading && !f.done && D()), loadMore: () => O.loadNextPage(), rootMargin: "900px" }); @@ -15717,30 +15724,30 @@ var Sf = { function N(e) { return String(e?.kind || "").toLowerCase() === "folder"; } - function F(e) { + function P(e) { let t = r.value; return !t || String(t.dataset?.mjrGroupStacks || "") !== "1" ? !1 : !!String(e?.stack_id || "").trim() && Number(e?.stack_asset_count || 0) > 1; } - function ee(e) { + function F(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } - function te() { + function I() { let e = r.value; if (!e) return; let t = new Set((Array.isArray(f.selectedIds) ? f.selectedIds : []).map((e) => String(e || "").trim()).filter(Boolean)); - $e(e, t, f.activeId || ""); + tt(e, t, f.activeId || ""); try { t.size ? e.dataset.mjrSelectedAssetId = String(f.activeId || Array.from(t)[0] || "") : delete e.dataset.mjrSelectedAssetId; } catch (e) { console.debug?.(e); } } - function ne() { + function ee() { let e = r.value; if (!e) return; let t = Array.isArray(f.selectedIds) ? f.selectedIds.slice() : [], i = String(f.activeId || ""), a = `${t.join("|")}::${i}`; - if (a === ne._lastSelectionKey) return; - ne._lastSelectionKey = a; + if (a === ee._lastSelectionKey) return; + ee._lastSelectionKey = a; let o = { selectedIds: t, activeId: i, @@ -15757,13 +15764,13 @@ var Sf = { console.debug?.(e); } } - ne._lastSelectionKey = ""; - let re = X(() => xf(f.assets)), ie = X(() => (Array.isArray(re.value) ? re.value : []).filter((e) => bf(e))); - function ae() { + ee._lastSelectionKey = ""; + let te = Z(() => Cf(f.assets)), re = Z(() => (Array.isArray(te.value) ? te.value : []).filter((e) => Sf(e))); + function ie() { let e = r.value; if (!e) return; let t = { - count: Array.isArray(ie.value) ? ie.value.length : 0, + count: Array.isArray(re.value) ? re.value.length : 0, total: Number(f.total || 0) || 0 }; try { @@ -15777,7 +15784,7 @@ var Sf = { console.debug?.(e); } } - function oe(e) { + function ae(e) { if (!e?.id) return; let t = (Array.isArray(f.assets) ? f.assets : []).find((t) => String(t?.id || "") === String(e.id)); if (t) try { @@ -15786,14 +15793,14 @@ var Sf = { console.debug?.(e); } } - function se() { + function oe() { try { window.dispatchEvent(new CustomEvent("mjr:open-sidebar", { detail: { tab: "details" } })); } catch (e) { console.debug?.(e); } } - function ce(e) { + function se(e) { if (!e) return; e._mjrSelectionManagedByVue = !0; try { @@ -15802,28 +15809,28 @@ var Sf = { console.debug?.(e); } try { - Le?.(); + Ne?.(); } catch (e) { console.debug?.(e); } - Lr(e, { applySettingsClasses: n.applyDefaultSettingsClasses }); + Rr(e, { applySettingsClasses: n.applyDefaultSettingsClasses }); try { - Le = xl(e); + Ne = Cl(e); } catch (e) { - console.debug?.(e), Le = null; + console.debug?.(e), Ne = null; } - e._mjrPrimaryPointerSelectionUnbind = () => {}, e._mjrGetAssets = () => Array.isArray(ie.value) ? ie.value : [], e._mjrSetSelection = (e, t = "") => { + e._mjrPrimaryPointerSelectionUnbind = () => {}, e._mjrGetAssets = () => Array.isArray(re.value) ? re.value : [], e._mjrSetSelection = (e, t = "") => { let n = y(e, t); - return te(), ne(), n.selectedIds; + return I(), ee(), n.selectedIds; }; let t = (e, t = {}) => { let n = O.removeAssets(e, t); - return ae(), n; + return ie(), n; }; e._mjrRemoveAssets = t, e._mjrGetRenderedCards = () => T(), e._mjrScrollToAssetId = (e, t = {}) => { E(e, t); - }, e._mjrHasAssetId = (e) => (Array.isArray(f.assets) ? f.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => f, e._mjrGetSelectedAssets = () => x(), e._mjrGetActiveAsset = () => S(), e._mjrOnKeyboardAssetChanged = (e) => oe(e), e._mjrOpenKeyboardDetails = () => se(); - let r = () => (n.applyDefaultSettingsClasses && (Ir(e), a.value += 1), O.refreshGrid()), i = () => { + }, e._mjrHasAssetId = (e) => (Array.isArray(f.assets) ? f.assets : []).some((t) => String(t?.id || "") === String(e || "")), e._mjrGetGridState = () => f, e._mjrGetSelectedAssets = () => x(), e._mjrGetActiveAsset = () => S(), e._mjrOnKeyboardAssetChanged = (e) => ae(e), e._mjrOpenKeyboardDetails = () => oe(); + let r = () => (n.applyDefaultSettingsClasses && (Lr(e), a.value += 1), O.refreshGrid()), i = () => { O.prepareGridForScopeSwitch(), O.dispose(), f.cardElements.clear(), e._mjrGridApi = null; }; e._mjrGridApi = { @@ -15845,75 +15852,75 @@ var Sf = { }, e._mjrLoadAssets = (...e) => O.loadAssets(...e), e._mjrLoadAssetsFromList = (...e) => O.loadAssetsFromList(...e), e._mjrPrepareForScopeSwitch = () => O.prepareGridForScopeSwitch(), e._mjrRefreshGrid = r, e._mjrCaptureAnchor = () => O.captureAnchor(), e._mjrRestoreAnchor = (e) => O.restoreAnchor(e), e._mjrHydrateFromSnapshot = (...e) => O.hydrateFromSnapshot(...e), e._mjrUpsertAsset = (e) => O.upsertAsset(e), e._mjrUpsertAssetNow = (e) => O.upsertAssetNow(e), e._mjrGetCanonicalState = () => O.getCanonicalState(), e._mjrGetDebugSnapshot = () => O.getDebugSnapshot(), e._mjrDispose = i; } mn(r, (e) => { - e && (ce(e), te(), ae()); + e && (se(e), I(), ie()); }, { immediate: !0 }), mn(() => `${(f.selectedIds || []).join("|")}::${String(f.activeId || "")}`, () => { - r.value && (te(), ne()); - }, { flush: "post" }), mn(() => `${Array.isArray(ie.value) ? ie.value.length : 0}::${Number(f.total || 0)}::${Number(f.hiddenPngSiblings || 0)}`, () => { - r.value && ae(); + r.value && (I(), ee()); + }, { flush: "post" }), mn(() => `${Array.isArray(re.value) ? re.value.length : 0}::${Number(f.total || 0)}::${Number(f.hiddenPngSiblings || 0)}`, () => { + r.value && ie(); }, { flush: "post", immediate: !0 }); - function le() { - let e = r.value, t = String(e?.dataset?.mjrBottomFeed || "").toLowerCase() === "true", n = Number(I.GRID_MIN_SIZE || 120) || 120; - return t ? Math.max(80, Number(I.FEED_GRID_MIN_SIZE || n) || n) : Math.max(80, n); + function ce() { + let e = r.value, t = String(e?.dataset?.mjrBottomFeed || "").toLowerCase() === "true", n = Number(z.GRID_MIN_SIZE || 120) || 120; + return t ? Math.max(80, Number(z.FEED_GRID_MIN_SIZE || n) || n) : Math.max(80, n); } - let ue = X(() => { + let le = Z(() => { a.value; - let e = Math.max(0, Number(I.GRID_GAP || 10) || 10), t = le(), n = Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0; + let e = Math.max(0, Number(z.GRID_GAP || 10) || 10), t = ce(), n = Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0; return n <= 0 ? 1 : Math.max(1, Math.floor((n + e) / (t + e))); - }), de = X(() => (Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0) > 0), fe = X(() => (a.value, Math.max(0, Number(I.GRID_GAP || 10) || 10))), pe = X(() => { - let e = Math.max(1, ue.value), t = Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0; - return t <= 0 ? le() : Math.max(80, Math.floor((t - fe.value * Math.max(0, e - 1)) / e)); - }), me = X(() => { + }), ue = Z(() => (Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0) > 0), de = Z(() => (a.value, Math.max(0, Number(z.GRID_GAP || 10) || 10))), fe = Z(() => { + let e = Math.max(1, le.value), t = Number(i.value || 0) || Number(w.value?.clientWidth || 0) || 0; + return t <= 0 ? ce() : Math.max(80, Math.floor((t - de.value * Math.max(0, e - 1)) / e)); + }), pe = Z(() => { a.value; - let e = !!I.GRID_SHOW_DETAILS; - return pe.value + (e ? 82 : 0) + fe.value; - }), he = X(() => { - let e = Array.isArray(ie.value) ? ie.value : []; - return n.virtualize ? [] : mf(e, ue.value); + let e = !!z.GRID_SHOW_DETAILS; + return fe.value + (e ? 82 : 0) + de.value; + }), L = Z(() => { + let e = Array.isArray(re.value) ? re.value : []; + return n.virtualize ? [] : gf(e, le.value); }); - function ge(e) { + function me(e) { try { - let t = typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(), n = Number(e?.scrollTop || 0) || 0, r = Math.max(16, t - Number(u || t)), i = Math.abs(n - Number(l || n)) / Math.max(1, me.value) * (16 / r); + let t = typeof performance < "u" && typeof performance.now == "function" ? performance.now() : Date.now(), n = Number(e?.scrollTop || 0) || 0, r = Math.max(16, t - Number(u || t)), i = Math.abs(n - Number(l || n)) / Math.max(1, pe.value) * (16 / r); o.value = Math.max(0, Math.min(20, i)), l = n, u = t; } catch (e) { console.debug?.(e); } } - let _e = gf({ + let he = vf({ scrollRef: w, - items: ie, - columnCount: ue, - estimateRowHeight: me, - overscan: X(() => { - let e = Math.max(1, me.value), t = w.value?.clientHeight || 0; + items: re, + columnCount: le, + estimateRowHeight: pe, + overscan: Z(() => { + let e = Math.max(1, pe.value), t = w.value?.clientHeight || 0; if (t <= 0) return 6; let n = Math.ceil(t / e), r = Math.ceil(o.value * 3); return Math.max(3, Math.min(30, n + r)); }), - enabled: X(() => n.virtualize) - }), ve = _e.rowCount, ye = _e.virtualizer, be = _e.virtualRows, xe = _e.totalSize, Se = X(() => { + enabled: Z(() => n.virtualize) + }), ge = he.rowCount, _e = he.virtualizer, ve = he.virtualRows, ye = he.totalSize, be = Z(() => { let e = /* @__PURE__ */ new Map(); - for (let t of be.value) e.set(t.index, t.virtual || t); + for (let t of ve.value) e.set(t.index, t.virtual || t); return e; - }), Ce = X(() => (a.value, !!I.GRID_SHOW_DETAILS)), we = X(() => { - let e = Math.max(1, Number(ue.value || 1)); + }), xe = Z(() => (a.value, !!z.GRID_SHOW_DETAILS)), Se = Z(() => { + let e = Math.max(1, Number(le.value || 1)); return Math.max(12, Math.min(36, e * 4)); - }), Te = X(() => Array.from({ length: Number(we.value || 12) }, (e, t) => t)), Ee = X(() => { - let e = Math.max(1, Number(ue.value || 1)), t = Te.value, n = []; + }), Ce = Z(() => Array.from({ length: Number(Se.value || 12) }, (e, t) => t)), we = Z(() => { + let e = Math.max(1, Number(le.value || 1)), t = Ce.value, n = []; for (let r = 0; r < t.length; r += e) n.push(t.slice(r, r + e)); return n; - }), De = X(() => { - let e = Math.max(80, Number(me.value || 0) - Number(fe.value || 0)), t = Math.max(80, Number(pe.value || 0)); + }), Te = Z(() => { + let e = Math.max(80, Number(pe.value || 0) - Number(de.value || 0)), t = Math.max(80, Number(fe.value || 0)); return Math.max(0, e - t); - }), Oe = X(() => ({ + }), Ee = Z(() => ({ display: "flex", - gap: `${fe.value}px`, - paddingBottom: `${fe.value}px`, + gap: `${de.value}px`, + paddingBottom: `${de.value}px`, boxSizing: "border-box" - })), ke = X(() => { - let e = Math.max(80, Number(pe.value || 0)), t = Math.max(80, Number(me.value || 0) - Number(fe.value || 0)); + })), De = Z(() => { + let e = Math.max(80, Number(fe.value || 0)), t = Math.max(80, Number(pe.value || 0) - Number(de.value || 0)); return { width: `${e}px`, flex: `0 0 ${e}px`, @@ -15926,13 +15933,13 @@ var Sf = { boxShadow: "0 6px 18px rgba(0,0,0,0.24)", boxSizing: "border-box" }; - }), Ae = X(() => ({ + }), Oe = Z(() => ({ width: "100%", - height: `${Math.max(80, Number(pe.value || 0))}px`, + height: `${Math.max(80, Number(fe.value || 0))}px`, background: "linear-gradient(90deg, rgba(168,174,182,0.40) 0%, rgba(220,225,232,0.54) 50%, rgba(168,174,182,0.40) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" - })), je = X(() => ({ + })), ke = Z(() => ({ height: "10px", margin: "10px 10px 6px", borderRadius: "8px", @@ -15940,7 +15947,7 @@ var Sf = { background: "linear-gradient(90deg, rgba(162,168,176,0.38) 0%, rgba(214,219,226,0.52) 50%, rgba(162,168,176,0.38) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" - })), Me = X(() => ({ + })), Ae = Z(() => ({ height: "10px", margin: "0 10px 10px", borderRadius: "8px", @@ -15948,19 +15955,19 @@ var Sf = { background: "linear-gradient(90deg, rgba(160,166,173,0.34) 0%, rgba(208,214,221,0.48) 50%, rgba(160,166,173,0.34) 100%)", backgroundSize: "220% 100%", animation: "mjr-skeleton-shimmer 2.2s ease-in-out infinite" - })), Ne = X(() => ({ - display: Ce.value ? "block" : "none", - minHeight: `${Math.max(0, Number(De.value || 0))}px` + })), je = Z(() => ({ + display: xe.value ? "block" : "none", + minHeight: `${Math.max(0, Number(Te.value || 0))}px` })); - function Pe() { + function Me() { let e = Number(w.value?.clientWidth || 0) || Number(r.value?.clientWidth || 0) || 0; e > 0 && (i.value = e); } - let Fe = null, Le = null, Re = !1; - function ze() { - nt(); + let R = null, Ne = null, Pe = !1; + function Fe() { + Qe(); let e = () => { - nt(), st(); + Qe(), it(); }; try { requestAnimationFrame(() => { @@ -15976,33 +15983,33 @@ var Sf = { ]) setTimeout(e, t); } bn(() => { - ze(); + Fe(); }), mn(w, (e, t) => { try { - Fe?.disconnect?.(); + R?.disconnect?.(); } catch (e) { console.debug?.(e); } if (e) { - Pe(); + Me(); try { - Fe = new ResizeObserver(() => { - Pe(); - }), Fe.observe(e); + R = new ResizeObserver(() => { + Me(); + }), R.observe(e); } catch (e) { - console.debug?.(e), Fe = null; + console.debug?.(e), R = null; } } - }, { immediate: !0 }), mn(() => ve.value, async () => { - de.value && (await Nn(), Ue(), rt()); + }, { immediate: !0 }), mn(() => ge.value, async () => { + ue.value && (await Nn(), Be(), $e()); }), mn(() => f.assets, async (e) => { if (!Array.isArray(e) || e.length === 0) { let e = r.value; e?._mjrStackMembersCache && e._mjrStackMembersCache.clear(); } - await Nn(), Ue(); + await Nn(), Be(); }); - function Be(e, t) { + function Ie(e, t) { let n = String(t?.filename || "").trim().toLowerCase(), r = s.get(e); if (r && r !== n) { let t = f.renderedFilenameMap.get(r); @@ -16015,23 +16022,23 @@ var Sf = { let i = f.renderedFilenameMap.get(n); i || (i = /* @__PURE__ */ new Set(), f.renderedFilenameMap.set(n, i)), i.add(e), s.set(e, n); } - function Ve(e) { + function Re(e) { if (!e) return; let t = s.get(e); if (!t) return; let n = f.renderedFilenameMap.get(t); n && (n.delete(e), n.size || f.renderedFilenameMap.delete(t)), s.delete(e); } - function He(e) { + function ze(e) { let t = String(e || "").trim().toLowerCase(); if (!t) return; let n = f.renderedFilenameMap.get(t), r = Array.from(n || []); if (!r.length) return; - let i = (Array.isArray(f.assets) ? f.assets : []).filter((e) => String(e?.filename || "").trim().toLowerCase() === t), a = Math.max(Number(f.filenameCounts?.get?.(t) || 0) || 0, i.length), o = dt(i), s = r.find((e) => { + let i = (Array.isArray(f.assets) ? f.assets : []).filter((e) => String(e?.filename || "").trim().toLowerCase() === t), a = Math.max(Number(f.filenameCounts?.get?.(t) || 0) || 0, i.length), o = ht(i), s = r.find((e) => { let t = String(e._mjrAsset?.id || ""), n = String(o?.id || ""); return t && n && t === n; }) || r[0] || r[0] || null, c = s?._mjrAsset || o || i[0] || null; - xt(c, i); + ft(c, i); for (let e of r) { delete e.dataset.mjrDupHidden; let t = e._mjrAsset; @@ -16043,20 +16050,20 @@ var Sf = { } c._mjrDupStack = !0, c._mjrDupMembers = i.length ? i : [c], c._mjrDupCount = c._mjrDupMembers.length, c._mjrNameCollision = !1; } - function Ue() { - for (let e of f.renderedFilenameMap.keys()) He(e); + function Be() { + for (let e of f.renderedFilenameMap.keys()) ze(e); } - function We(e, t) { + function Ve(e, t) { let i = String(e?.id || "").trim(); if (!i) return; if (!t) { let e = f.cardElements.get(i), t = e ? s.get(e) : ""; - Ve(e), f.cardElements.delete(i), He(t); + Re(e), f.cardElements.delete(i), ze(t); return; } let a = t?.$el ?? t; if (a instanceof HTMLElement) { - f.cardElements.set(i, a), a._mjrIsVue = !0, a._mjrAsset = e, a._mjrReactiveAsset = e, a.dataset.mjrKind = String(e?.kind || ""), Be(a, e), He(String(e?.filename || "").trim().toLowerCase()); + f.cardElements.set(i, a), a._mjrIsVue = !0, a._mjrAsset = e, a._mjrReactiveAsset = e, a.dataset.mjrKind = String(e?.kind || ""), Ie(a, e), ze(String(e?.filename || "").trim().toLowerCase()); try { n.onCardRendered?.(a, e, r.value); } catch (e) { @@ -16064,10 +16071,10 @@ var Sf = { } } } - function Ge(e) { - return (t) => We(e, t); + function He(e) { + return (t) => Ve(e, t); } - function Ke(e, t) { + function Ue(e, t) { try { let n = e?.closest?.("a, button, input, textarea, select, label"); return !!(n && t?.contains?.(n)); @@ -16075,21 +16082,21 @@ var Sf = { return !1; } } - let qe = { + let We = { assetId: "", at: 0 }; - function Je(e, t) { + function Ge(e, t) { let n = String(t?.id || "").trim(); if (!n) return; if (e?.type === "click" && Number(e?.detail || 0) > 0) { - let e = Date.now() - Number(qe.at || 0); - if (qe.assetId === n && e >= 0 && e < 500) { - qe.assetId = "", qe.at = 0; + let e = Date.now() - Number(We.at || 0); + if (We.assetId === n && e >= 0 && e < 500) { + We.assetId = "", We.at = 0; return; } } - if (Ke(e?.target, e?.currentTarget)) return; + if (Ue(e?.target, e?.currentTarget)) return; let r = Array.isArray(f.assets) ? f.assets : [], i = r.findIndex((e) => String(e?.id || "") === n), a = Array.isArray(f.selectedIds) ? f.selectedIds.slice() : []; if (e?.shiftKey && i >= 0) { let e = String(f.selectionAnchorId || f.activeId || n).trim(), t = r.findIndex((t) => String(t?.id || "") === e), a = t >= 0 ? t : i, o = Math.min(a, i), s = Math.max(a, i); @@ -16110,25 +16117,25 @@ var Sf = { console.debug?.(e); } } - function Ye(e, t) { + function Ke(e, t) { if (Number(e?.button ?? 0) !== 0) return; let n = String(t?.id || "").trim(); if (!n) return; let r = Array.isArray(f.selectedIds) ? f.selectedIds.map(String).filter(Boolean) : []; if (r.includes(n) && r.length > 1 && !e?.ctrlKey && !e?.metaKey && !e?.shiftKey) { - qe.assetId = n, qe.at = Date.now(); + We.assetId = n, We.at = Date.now(); return; } - qe.assetId = n, qe.at = Date.now(), Je(e, t); + We.assetId = n, We.at = Date.now(), Ge(e, t); } - function L(e) { + function B(e) { let t = (Array.isArray(f.assets) ? f.assets : []).filter((e) => !N(e)), n = t.findIndex((t) => String(t?.id || "") === String(e?.id || "")); - !t.length || n < 0 || to({ + !t.length || n < 0 || ro({ assets: t, index: n }); } - function Xe(e) { + function qe(e) { try { if (typeof n.onCardDblclick == "function") { n.onCardDblclick({ @@ -16152,23 +16159,23 @@ var Sf = { } return; } - L(e); + B(e); } - let Ze = null, Qe = null, et = 0, tt = ""; - function nt() { - Pe(); + let Je = null, Ye = null, Xe = 0, Ze = ""; + function Qe() { + Me(); try { - ye.value?.measure?.(); + _e.value?.measure?.(); } catch (e) { console.debug?.(e); } } - function rt() { + function $e() { if (!c) try { c = requestAnimationFrame(() => { c = 0; try { - ye.value?.measure?.(); + _e.value?.measure?.(); } catch (e) { console.debug?.(e); } @@ -16176,34 +16183,34 @@ var Sf = { } catch (e) { console.debug?.(e), c = 0; try { - ye.value?.measure?.(); + _e.value?.measure?.(); } catch (e) { console.debug?.(e); } } } - function it() { - nt(), requestAnimationFrame(() => { + function et() { + Qe(), requestAnimationFrame(() => { requestAnimationFrame(() => { - nt(), st(); + Qe(), it(); }); }), setTimeout(() => { - nt(), st(); + Qe(), it(); }, 150); } - function at(e) { + function nt(e) { if (!e || !n.virtualize) return () => {}; let t = () => { - ge(e); + me(e); }; e.addEventListener("scroll", t, { passive: !0 }); try { requestAnimationFrame(() => { - t(), st(); + t(), it(); }); } catch { setTimeout(() => { - t(), st(); + t(), it(); }, 0); } return () => { @@ -16216,13 +16223,13 @@ var Sf = { } mn(w, (e) => { try { - Ze?.(); + Je?.(); } catch (e) { console.debug?.(e); } - Ze = at(e); + Je = nt(e); }, { immediate: !0 }); - function ot(e) { + function rt(e) { let t = Number(e?.clientHeight || 0) || 0; if (t > 0) return t; let n = Number(r.value?.clientHeight || 0) || 0; @@ -16233,43 +16240,43 @@ var Sf = { return 0; } } - async function st() { - if (!n.virtualize || !de.value || f.loading || f.done) return; + async function it() { + if (!n.virtualize || !ue.value || f.loading || f.done) return; let e = w.value; if (!e) return; - let t = Array.isArray(f.assets) ? f.assets.length : 0, r = `${t}::${ue.value}`; - if (!Qe && !(r === tt && Date.now() - et < 500) && (await Nn(), (Number(e.scrollHeight || 0) || 0) <= ot(e) + 40)) { + let t = Array.isArray(f.assets) ? f.assets.length : 0, r = `${t}::${le.value}`; + if (!Ye && !(r === Ze && Date.now() - Xe < 500) && (await Nn(), (Number(e.scrollHeight || 0) || 0) <= rt(e) + 40)) { let e = t; - Qe = Promise.resolve(O.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { + Ye = Promise.resolve(O.loadNextPage()).catch((e) => console.debug?.(e)).finally(() => { let t = Array.isArray(f.assets) ? f.assets.length : 0; - et = Date.now(), tt = t === e ? r : "", Qe = null, setTimeout(() => { - st(); + Xe = Date.now(), Ze = t === e ? r : "", Ye = null, setTimeout(() => { + it(); }, 0); }); } } - mn(() => `${Array.isArray(f.assets) ? f.assets.length : 0}::${ue.value}::${f.loading}::${f.done}`, () => { - st(); + mn(() => `${Array.isArray(f.assets) ? f.assets.length : 0}::${le.value}::${f.loading}::${f.done}`, () => { + it(); }, { flush: "post" }); - function ct(e) { + function at(e) { if (!(!e || !n.virtualize)) try { - ye.value.measureElement(e); + _e.value.measureElement(e); } catch (e) { console.debug?.(e); } } - function lt() { + function ot() { return { - width: `${pe.value}px`, - flex: `0 0 ${pe.value}px`, - minWidth: `${pe.value}px` + width: `${fe.value}px`, + flex: `0 0 ${fe.value}px`, + minWidth: `${fe.value}px` }; } - function ut(e) { - return Se.value.get(e) || null; + function st(e) { + return be.value.get(e) || null; } - function ft(e) { - let t = ut(e); + function ct(e) { + let t = st(e); return { position: "absolute", left: "0", @@ -16277,24 +16284,24 @@ var Sf = { transform: `translateY(${Number(t?.start || 0)}px)`, width: "100%", display: "flex", - gap: `${fe.value}px`, - paddingBottom: `${fe.value}px`, + gap: `${de.value}px`, + paddingBottom: `${de.value}px`, boxSizing: "border-box" }; } - function pt() { + function lt() { return { display: "flex", - gap: `${fe.value}px`, - paddingBottom: `${fe.value}px`, + gap: `${de.value}px`, + paddingBottom: `${de.value}px`, boxSizing: "border-box" }; } - function mt() { - a.value += 1, n.applyDefaultSettingsClasses && r.value && Ir(r.value); + function V() { + a.value += 1, n.applyDefaultSettingsClasses && r.value && Lr(r.value); } return mn(() => n.applyDefaultSettingsClasses, () => { - r.value && n.applyDefaultSettingsClasses && Ir(r.value); + r.value && n.applyDefaultSettingsClasses && Lr(r.value); }, { immediate: !0 }), yn(() => { try { r.value?._mjrPrimaryPointerSelectionUnbind?.(); @@ -16307,12 +16314,12 @@ var Sf = { console.debug?.(e); } try { - Fe?.disconnect?.(); + R?.disconnect?.(); } catch (e) { console.debug?.(e); } try { - Ze?.(); + Je?.(); } catch (e) { console.debug?.(e); } @@ -16328,23 +16335,23 @@ var Sf = { console.debug?.(e); } try { - Le?.(); + Ne?.(); } catch (e) { console.debug?.(e); } - Le = null; + Ne = null; try { - window.removeEventListener("mjr-settings-changed", mt), Re = !1; + window.removeEventListener("mjr-settings-changed", V), Pe = !1; } catch (e) { console.debug?.(e); } try { - window.removeEventListener("mjr:keepalive-attached", it); + window.removeEventListener("mjr:keepalive-attached", et); } catch (e) { console.debug?.(e); } }), mn(r, (e) => { - e && (Re ||= (window.addEventListener("mjr-settings-changed", mt), window.addEventListener("mjr:keepalive-attached", it), !0)); + e && (Pe ||= (window.addEventListener("mjr-settings-changed", V), window.addEventListener("mjr:keepalive-attached", et), !0)); }, { immediate: !0 }), t({ get gridContainer() { return r.value; @@ -16400,7 +16407,7 @@ var Sf = { dispose() { return O.dispose(); } - }), (t, n) => (H(), G("div", { + }), (t, n) => (W(), q("div", { ref_key: "gridContainerRef", ref: r, class: "mjr-grid", @@ -16411,24 +16418,24 @@ var Sf = { "min-height": "100%" } }, [ - J(f).loading && !J(f).assets.length ? (H(), G("div", Sf, [W("div", Cf, [W("div", wf, [(H(!0), G(In, null, vn(Ee.value, (e, t) => (H(), G("div", { + X(f).loading && !X(f).assets.length ? (W(), q("div", wf, [K("div", Tf, [K("div", Ef, [(W(!0), q(Ln, null, vn(we.value, (e, t) => (W(), q("div", { key: `skr-${t}`, - style: An(Oe.value) - }, [(H(!0), G(In, null, vn(e, (e) => (H(), G("div", { + style: An(Ee.value) + }, [(W(!0), q(Ln, null, vn(e, (e) => (W(), q("div", { key: `sk-${e}`, class: "mjr-grid-skeleton-card", - style: An(ke.value) - }, [W("div", { + style: An(De.value) + }, [K("div", { class: "mjr-grid-skeleton-thumb mjr-grid-skeleton-shimmer", - style: An(Ae.value) - }, null, 4), W("div", { style: An(Ne.value) }, [W("div", { + style: An(Oe.value) + }, null, 4), K("div", { style: An(je.value) }, [K("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--title mjr-grid-skeleton-shimmer", - style: An(je.value) - }, null, 4), W("div", { + style: An(ke.value) + }, null, 4), K("div", { class: "mjr-grid-skeleton-line mjr-grid-skeleton-line--meta mjr-grid-skeleton-shimmer", - style: An(Me.value) - }, null, 4)], 4)], 4))), 128))], 4))), 128))]), W("div", Tf, q(J(f).loadingMessage || "Loading assets..."), 1)])])) : Y("", !0), - J(f).statusMessage && !J(f).assets.length && !J(f).loading ? (H(), G("div", { + style: An(Ae.value) + }, null, 4)], 4)], 4))), 128))], 4))), 128))]), K("div", Df, Y(X(f).loadingMessage || "Loading assets..."), 1)])])) : In("", !0), + X(f).statusMessage && !X(f).assets.length && !X(f).loading ? (W(), q("div", { key: 1, class: "mjr-grid-message", style: An({ @@ -16443,34 +16450,34 @@ var Sf = { pointerEvents: "none", fontSize: "14px", lineHeight: "1.4", - color: J(f).statusError ? "var(--error-text, #f44336)" : "var(--muted-text, #bdbdbd)", + color: X(f).statusError ? "var(--error-text, #f44336)" : "var(--muted-text, #bdbdbd)", background: "rgba(0, 0, 0, 0.35)" }) - }, q(J(f).statusMessage), 5)) : Y("", !0), - e.virtualize ? (H(), G("div", { + }, Y(X(f).statusMessage), 5)) : In("", !0), + e.virtualize ? (W(), q("div", { key: 2, style: An({ - height: `${J(xe)}px`, + height: `${X(ye)}px`, position: "relative", width: "100%", gridColumn: "1 / -1" }) - }, [(H(!0), G(In, null, vn(J(be), (e) => (H(), G("div", { + }, [(W(!0), q(Ln, null, vn(X(ve), (e) => (W(), q("div", { key: e.key, ref_for: !0, - ref: ct, + ref: at, "data-index": e.index, - style: An(ft(e.index)) - }, [e.items.length ? (H(!0), G(In, { key: 0 }, vn(e.items, (e) => (H(), G(In, { key: String(e.id) }, [N(e) ? (H(), hn(hu, { + style: An(ct(e.index)) + }, [e.items.length ? (W(!0), q(Ln, { key: 0 }, vn(e.items, (e) => (W(), q(Ln, { key: String(e.id) }, [N(e) ? (W(), hn(_u, { key: 0, ref_for: !0, - ref: Ge(e), + ref: He(e), asset: e, selected: M(e), - style: An(lt()), - onMousedown: Fn((t) => Ye(t, e), ["left"]), - onClick: (t) => Je(t, e), - onDblclick: Fn((t) => Xe(e), ["stop"]) + style: An(ot()), + onMousedown: Fn((t) => Ke(t, e), ["left"]), + onClick: (t) => Ge(t, e), + onDblclick: Fn((t) => qe(e), ["stop"]) }, null, 8, [ "asset", "selected", @@ -16478,46 +16485,46 @@ var Sf = { "onMousedown", "onClick", "onDblclick" - ])) : (H(), G("div", { + ])) : (W(), q("div", { key: 1, ref_for: !0, - ref: Ge(e), + ref: He(e), class: Mn(["mjr-asset-card mjr-card", { "is-selected": M(e), - "mjr-live-placeholder": ee(e) + "mjr-live-placeholder": F(e) }]), role: "button", tabindex: "0", draggable: "true", - style: An(lt()), + style: An(ot()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": A(e), "data-mjr-stem": j(e), "data-mjr-kind": String(e.kind || ""), - "data-mjr-live-placeholder": ee(e) ? "true" : void 0, - "data-mjr-stacked": F(e) ? "true" : void 0, - "data-mjr-stack-count": F(e) ? String(e.stack_asset_count || 0) : void 0, + "data-mjr-live-placeholder": F(e) ? "true" : void 0, + "data-mjr-stacked": P(e) ? "true" : void 0, + "data-mjr-stack-count": P(e) ? String(e.stack_asset_count || 0) : void 0, "data-mjr-dup-stacked": e._mjrDupStack ? "true" : void 0, "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": M(e) ? "true" : "false", - onMousedown: Fn((t) => Ye(t, e), ["left"]), - onClick: (t) => Je(t, e), - onDblclick: Fn((t) => Xe(e), ["stop"]) - }, [V(du, { asset: e }, null, 8, ["asset"])], 46, Df))], 64))), 128)) : Y("", !0)], 12, Ef))), 128))], 4)) : (H(), G("div", Of, [(H(!0), G(In, null, vn(he.value, (e) => (H(), G("div", { + onMousedown: Fn((t) => Ke(t, e), ["left"]), + onClick: (t) => Ge(t, e), + onDblclick: Fn((t) => qe(e), ["stop"]) + }, [U(pu, { asset: e }, null, 8, ["asset"])], 46, kf))], 64))), 128)) : In("", !0)], 12, Of))), 128))], 4)) : (W(), q("div", Af, [(W(!0), q(Ln, null, vn(L.value, (e) => (W(), q("div", { key: e.index, - style: An(pt()) - }, [(H(!0), G(In, null, vn(e.items, (e) => (H(), G(In, { key: String(e.id) }, [N(e) ? (H(), hn(hu, { + style: An(lt()) + }, [(W(!0), q(Ln, null, vn(e.items, (e) => (W(), q(Ln, { key: String(e.id) }, [N(e) ? (W(), hn(_u, { key: 0, ref_for: !0, - ref: Ge(e), + ref: He(e), asset: e, selected: M(e), - style: An(lt()), - onMousedown: Fn((t) => Ye(t, e), ["left"]), - onClick: (t) => Je(t, e), - onDblclick: Fn((t) => Xe(e), ["stop"]) + style: An(ot()), + onMousedown: Fn((t) => Ke(t, e), ["left"]), + onClick: (t) => Ge(t, e), + onDblclick: Fn((t) => qe(e), ["stop"]) }, null, 8, [ "asset", "selected", @@ -16525,35 +16532,35 @@ var Sf = { "onMousedown", "onClick", "onDblclick" - ])) : (H(), G("div", { + ])) : (W(), q("div", { key: 1, ref_for: !0, - ref: Ge(e), + ref: He(e), class: Mn(["mjr-asset-card mjr-card", { "is-selected": M(e), - "mjr-live-placeholder": ee(e) + "mjr-live-placeholder": F(e) }]), role: "button", tabindex: "0", draggable: "true", - style: An(lt()), + style: An(ot()), "data-mjr-asset-id": String(e.id ?? ""), "data-mjr-filename-key": String(e.filename || "").toLowerCase(), "data-mjr-ext": A(e), "data-mjr-stem": j(e), "data-mjr-kind": String(e.kind || ""), - "data-mjr-live-placeholder": ee(e) ? "true" : void 0, - "data-mjr-stacked": F(e) ? "true" : void 0, - "data-mjr-stack-count": F(e) ? String(e.stack_asset_count || 0) : void 0, + "data-mjr-live-placeholder": F(e) ? "true" : void 0, + "data-mjr-stacked": P(e) ? "true" : void 0, + "data-mjr-stack-count": P(e) ? String(e.stack_asset_count || 0) : void 0, "data-mjr-dup-stacked": e._mjrDupStack ? "true" : void 0, "data-mjr-dup-count": e._mjrDupStack ? String(e._mjrDupCount || 0) : void 0, "aria-label": `Asset ${e.filename || ""}`, "aria-selected": M(e) ? "true" : "false", - onMousedown: Fn((t) => Ye(t, e), ["left"]), - onClick: (t) => Je(t, e), - onDblclick: Fn((t) => Xe(e), ["stop"]) - }, [V(du, { asset: e }, null, 8, ["asset"])], 46, kf))], 64))), 128))], 4))), 128))])), - W("div", { + onMousedown: Fn((t) => Ke(t, e), ["left"]), + onClick: (t) => Ge(t, e), + onDblclick: Fn((t) => qe(e), ["stop"]) + }, [U(pu, { asset: e }, null, 8, ["asset"])], 46, jf))], 64))), 128))], 4))), 128))])), + K("div", { ref_key: "infiniteSentinelRef", ref: k, "aria-hidden": "true", @@ -16566,8 +16573,8 @@ var Sf = { }, null, 512) ], 512)); } -}, [["__scopeId", "data-v-ddf2bbab"]]), jf = 240, Mf = 120, Nf = 80; -function Pf(e) { +}, [["__scopeId", "data-v-ddf2bbab"]]), Nf = 240, Pf = 120, Ff = 80; +function If(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 { @@ -16578,7 +16585,7 @@ function Pf(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 Ff(e) { +function Lf(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -16593,11 +16600,11 @@ function Ff(e) { return console.debug?.(e), []; } } -function If(e, t, n = "") { +function Rf(e, t, n = "") { let r = Array.isArray(t) ? t.map(String).filter(Boolean) : []; - return Xe(e, r, { activeId: n || r[0] || "" }, Ff); + return Qe(e, r, { activeId: n || r[0] || "" }, Lf); } -function Lf(e) { +function zf(e) { let t = e?.grid; if (!t) return; let n = (e) => { @@ -16613,19 +16620,19 @@ function Lf(e) { } catch (e) { console.debug?.(e); } - let a = Ff(t), o = a.indexOf(n), s = Ke(t); + let a = Lf(t), o = a.indexOf(n), s = qe(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); - If(t, a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean), i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); + Rf(t, a.slice(r, s + 1).map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean), i), t._mjrLastSelectedIndex = o, e.preventDefault(), e.stopPropagation(); return; } if (e.ctrlKey || e.metaKey) { s.has(i) ? s.delete(i) : s.add(i); let n = Array.from(s); - If(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); + Rf(t, n, s.has(i) ? i : n[0] || ""), o >= 0 && (t._mjrLastSelectedIndex = o), e.preventDefault(), e.stopPropagation(); return; } - If(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); + Rf(t, [i], i), o >= 0 && (t._mjrLastSelectedIndex = o); try { n.focus?.({ preventScroll: !0 }); } catch (e) { @@ -16641,23 +16648,23 @@ function Lf(e) { } }; } -var Rf = { +var Bf = { hosts: /* @__PURE__ */ new Set(), pendingAssets: /* @__PURE__ */ new Map() }; -function zf(e) { - if (!I.EXECUTION_GROUPING_ENABLED) return ep(e); +function Vf(e) { + if (!z.EXECUTION_GROUPING_ENABLED) return np(e); let t = String(e?.stack_id || "").trim(); if (t) return `stack:${t}`; let n = String(e?.job_id || "").trim(); - return n ? `job:${n}` : ep(e); + return n ? `job:${n}` : np(e); } -function Bf(e) { +function Hf(e) { let t = /* @__PURE__ */ new Map(); for (let n of Array.isArray(e) ? e : []) { - let e = np(n); + let e = ip(n); if (!e) continue; - let r = zf(e), i = t.get(r); + let r = Vf(e), i = t.get(r); i || (i = { key: r, members: [] @@ -16682,16 +16689,16 @@ function Bf(e) { return (Number(t?.mtime || t?.created_at || 0) || 0) - n; }), n; } -function Vf(e) { +function Uf(e) { return Array.from(e?.assetsByKey?.values?.() || []); } -function Hf(e) { +function Wf(e) { return String(e ?? "").trim().toLowerCase(); } -function Uf(e) { +function Gf(e) { return e?._mjrLivePlaceholder === !0 || e?.is_live_placeholder === !0 || String(e?.id || "").trim().toLowerCase().startsWith("live:"); } -function Wf(e) { +function Kf(e) { if (!e || typeof e != "object") return e; try { delete e._mjrLivePlaceholder, delete e._mjrLiveStatus, delete e._mjrLiveLabel, delete e.is_live_placeholder; @@ -16700,19 +16707,19 @@ function Wf(e) { } return e; } -function Gf(e) { +function qf(e) { if (!e || typeof e != "object") return ""; - let t = Hf(e?.type || e?.source || "output"), n = Hf(e?.root_id || e?.custom_root_id || ""), r = Hf(e?.subfolder || ""), i = Hf(e?.filename || ""); + let t = Wf(e?.type || e?.source || "output"), n = Wf(e?.root_id || e?.custom_root_id || ""), r = Wf(e?.subfolder || ""), i = Wf(e?.filename || ""); if (i) return `${t}|${n}|${r}|${i}`; - let a = Hf(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); + let a = Wf(e?.filepath || e?.path || e?.fullpath || e?.full_path || ""); return a ? `${t}|${n}|path|${a}` : ""; } -function Kf(e, t) { - let n = np(t); +function Jf(e, t) { + let n = ip(t); if (!e || typeof e.set != "function" || !n) return null; - let r = ep(n), i = Gf(n), a = ""; + let r = np(n), i = qf(n), a = ""; if (i) { - for (let [t, n] of e.entries()) if (Gf(n) === i) { + for (let [t, n] of e.entries()) if (qf(n) === i) { a = t; break; } @@ -16721,17 +16728,17 @@ function Kf(e, t) { ...o, ...n } : n; - return Uf(n) || Wf(s), a && a !== r && e.delete(a), e.set(r, s), s; + return Gf(n) || Kf(s), a && a !== r && e.delete(a), e.set(r, s), s; } -function qf(e, t) { - return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), Kf(e.assetsByKey, t)) : null; +function Yf(e, t) { + return e ? (e.assetsByKey ||= /* @__PURE__ */ new Map(), Jf(e.assetsByKey, t)) : null; } -function Jf(e) { +function Xf(e) { !e?.grid || !e.loaded || (e._renderTimer ||= setTimeout(() => { - e._renderTimer = null, $f(e); - }, Nf)); + e._renderTimer = null, tp(e); + }, Ff)); } -function Yf(e, t, n = 0) { +function Zf(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(); @@ -16741,52 +16748,52 @@ function Yf(e, t, n = 0) { } catch (e) { console.debug?.(e); } - If(e.grid, [o], o); + Rf(e.grid, [o], o); } - to({ + ro({ assets: r, index: i }); } -function Xf(e, t) { +function Qf(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"); + r.className = "mjr-feed-group-popover-title", r.textContent = R("bottomFeed.groupTitle", "Generation group"), r.style.cssText = "font-size:12px; font-weight:700; opacity:0.92; margin-bottom:8px;", n.appendChild(r); let i = document.createElement("div"); - i.className = "mjr-feed-group-popover-title", i.textContent = r("bottomFeed.groupTitle", "Generation group"), i.style.cssText = "font-size:12px; font-weight:700; opacity:0.92; margin-bottom:8px;", n.appendChild(i); - let a = document.createElement("div"); - a.className = "mjr-feed-group-popover-grid", a.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 o = Array.isArray(t?._mjrFeedGroupAssets) ? t._mjrFeedGroupAssets : []; - for (let r = 0; r < o.length; r += 1) { - let i = o[r], s = Pf(i); + 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 = If(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), Yf(e, t, r); - }), a.appendChild(s); + i.preventDefault(), i.stopPropagation(), e.popoverManager?.close?.(n), Zf(e, t, r); + }), i.appendChild(s); } - return n.appendChild(a), e.root.appendChild(n), n; + return n.appendChild(i), e.root.appendChild(n), n; } -function Zf(e, t, n) { +function $f(e, t, n) { if (!t || !n) return; - let i = Number(n?._mjrFeedGroupCount || 0) || 0; - if (i <= 1 || (t.dataset.mjrFeedGrouped = "true", t.dataset.mjrFeedGroupCount = String(i), t.dataset.mjrStacked = "true", t.dataset.mjrStackCount = String(i), t.querySelector(".mjr-feed-group-button"))) return; - let a = document.createElement("button"); - a.type = "button", a.className = "mjr-feed-group-button", a.title = r("bottomFeed.groupOpen", "Show other assets from this generation"), a.setAttribute("aria-label", `${i} assets`); + 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; + let i = document.createElement("button"); + i.type = "button", i.className = "mjr-feed-group-button", i.title = R("bottomFeed.groupOpen", "Show other assets from this generation"), i.setAttribute("aria-label", `${r} assets`); + 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-icon pi pi-clone", a.appendChild(o); - let s = document.createElement("span"); - s.className = "mjr-feed-group-button-count", s.textContent = String(i), a.appendChild(s), a.style.cssText = "position:absolute; top:34px; right:6px; z-index:11;", pc(a); - let c = Xf(e, n); - a.addEventListener("click", (t) => { - t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(c, a); - }), t.appendChild(a); + 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;", hc(i); + let s = Qf(e, n); + i.addEventListener("click", (t) => { + t.preventDefault(), t.stopPropagation(), e.popoverManager?.toggle?.(s, i); + }), t.appendChild(i); } -function Qf(e, t) { +function ep(e, t) { let n = new Map((Array.isArray(t) ? t : []).map((e) => [String(e?.id || "").trim(), e]).filter(([e]) => !!e)); - for (let t of Ff(e?.grid)) { + for (let t of Lf(e?.grid)) { let r = String(t?.dataset?.mjrAssetId || "").trim(), i = n.get(r); - i && Zf(e, t, i); + i && $f(e, t, i); } } -async function $f(e) { +async function tp(e) { if (!e?.grid) return; try { e.popoverManager?.closeAll?.(); @@ -16799,19 +16806,19 @@ async function $f(e) { } catch (e) { console.debug?.(e); } - let t = Bf(Vf(e)), n = await Vr(e.grid, t, { - title: r("bottomFeed.title", "Generated Feed"), + let t = Hf(Uf(e)), n = await Hr(e.grid, t, { + title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Qf(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"; + ep(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 ep(e) { +function np(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 tp(e) { +function rp(e) { let t = String(e || "").split(".").pop()?.toUpperCase() ?? "", n = new Set([ "MP4", "WEBM", @@ -16838,41 +16845,41 @@ function tp(e) { ]); return n.has(t) ? "video" : r.has(t) ? "audio" : i.has(t) ? "model3d" : "image"; } -function np(e) { +function ip(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 ||= tp(t.ext || t.filename || ""), t; + return !t.type && t.source && (t.type = t.source), !t.source && t.type && (t.source = t.type), t.kind ||= rp(t.ext || t.filename || ""), t; } -function rp(e) { - let t = np(e); +function ap(e) { + let t = ip(e); if (!t) return null; - let n = ep(t); + let n = np(t); if (!n) return null; - let r = Gf(t), i = null; - if (r) for (let [e, t] of Rf.pendingAssets.entries()) e !== n && Gf(t) === r && (i = t, Rf.pendingAssets.delete(e)); - let a = Rf.pendingAssets.get(n) || i || null, o = a ? { + let r = qf(t), i = null; + if (r) for (let [e, t] of Bf.pendingAssets.entries()) e !== n && qf(t) === r && (i = t, Bf.pendingAssets.delete(e)); + let a = Bf.pendingAssets.get(n) || i || null, o = a ? { ...a, ...t } : t; - if (Uf(t) || Wf(o), Rf.pendingAssets.set(n, o), Rf.pendingAssets.size > 64) { - let e = Rf.pendingAssets.keys().next().value; - e && Rf.pendingAssets.delete(e); + if (Gf(t) || Kf(o), Bf.pendingAssets.set(n, o), Bf.pendingAssets.size > 64) { + let e = Bf.pendingAssets.keys().next().value; + e && Bf.pendingAssets.delete(e); } return o; } -function ip() { - return Array.from(Rf.pendingAssets.values()); +function op() { + return Array.from(Bf.pendingAssets.values()); } -async function ap(e) { +async function sp(e) { if (e?.grid) { - e.empty.style.display = "none", e.empty.textContent = r("bottomFeed.loading", "Loading recent assets..."); + 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 < jf;) { - let r = await P(Ae({ + for (; n < Nf;) { + let r = await ne(de({ q: "*", - limit: Math.min(Mf, jf - n), + limit: Math.min(Pf, Nf - n), offset: n, scope: "output", sort: "mtime_desc", @@ -16882,41 +16889,41 @@ async function ap(e) { let i = Array.isArray(r?.data?.assets) ? r.data.assets : []; if (!i.length) break; for (let n of i) { - let r = qf(e, n); + let r = Yf(e, n); r && t.push(r); } - if (i.length < Mf) break; + if (i.length < Pf) break; n += i.length; } - for (let t of ip()) qf(e, t); - Rf.pendingAssets.clear(); - let i = Bf(Vf(e)), a = await Vr(e.grid, i, { - title: r("bottomFeed.title", "Generated Feed"), + for (let t of op()) Yf(e, t); + Bf.pendingAssets.clear(); + let r = Hf(Uf(e)), i = await Hr(e.grid, r, { + title: R("bottomFeed.title", "Generated Feed"), reset: !0 }); - Qf(e, i), Number(a?.count || 0) <= 0 ? (e.empty.textContent = r("bottomFeed.empty", "No generated assets yet."), e.empty.style.display = "") : e.empty.style.display = "none"; + ep(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 = ""; + console.debug?.(t), e.empty.textContent = R("bottomFeed.loadFailed", "Failed to load generated assets."), e.empty.style.display = ""; } finally { e.loaded = !0; } } } -async function op() { - for (let e of Array.from(Rf.hosts)) try { - await ap(e); +async function cp() { + for (let e of Array.from(Bf.hosts)) try { + await sp(e); } catch (e) { console.debug?.(e); } } -function sp() { - op(); +function lp() { + cp(); } -function cp(e) { +function up(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; + 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 lp(e) { +function dp(e) { if (!e) return; let t = [ e, @@ -16934,14 +16941,14 @@ function lp(e) { console.debug?.(e); } } -function up(e) { +function fp(e) { if (!e) return; let t = (t, n) => { n ? e.classList.add(t) : e.classList.remove(t); }; - t("mjr-feed-show-info", I.FEED_SHOW_INFO), t("mjr-feed-show-filename", I.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", I.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", I.FEED_SHOW_DATE), t("mjr-feed-show-gentime", I.FEED_SHOW_GENTIME), t("mjr-show-hover-info", I.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", I.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", I.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", I.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", I.FEED_SHOW_BADGES_TAGS); + t("mjr-feed-show-info", z.FEED_SHOW_INFO), t("mjr-feed-show-filename", z.FEED_SHOW_FILENAME), t("mjr-feed-show-dimensions", z.FEED_SHOW_DIMENSIONS), t("mjr-feed-show-date", z.FEED_SHOW_DATE), t("mjr-feed-show-gentime", z.FEED_SHOW_GENTIME), t("mjr-show-hover-info", z.GRID_SHOW_HOVER_INFO), t("mjr-feed-show-dot", z.FEED_SHOW_WORKFLOW_DOT), t("mjr-feed-show-badges-ext", z.FEED_SHOW_BADGES_EXTENSION), t("mjr-feed-show-badges-rating", z.FEED_SHOW_BADGES_RATING), t("mjr-feed-show-badges-tags", z.FEED_SHOW_BADGES_TAGS); } -function dp(e, t = null) { +function pp(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 = () => { @@ -16953,20 +16960,20 @@ function dp(e, t = null) { }, i = () => { r(); try { - window.dispatchEvent(new Event(B.MFV_OPEN)); + window.dispatchEvent(new Event(H.MFV_OPEN)); } catch (e) { console.debug?.(e); } }, a = document.createElement("div"); n.appendChild(a), e.root.appendChild(n); - let { app: o } = It(Af, { + let { app: o } = Rt(Mf, { scrollElement: n, virtualize: !1, applyDefaultSettingsClasses: !1, emitWindowSelectionEvents: !0, onCardRendered: (t, n) => { try { - Zf(e, t, n); + $f(e, t, n); } catch (e) { console.debug?.(e); } @@ -16977,7 +16984,7 @@ function dp(e, t = null) { }), s = o.mount(a), c = s?.gridContainer || a.querySelector?.(".mjr-grid") || null; if (e.gridApp = o, e.gridVm = s, e.grid = c, !c) return; c.style.minHeight = "100%", c.style.height = "auto", c.dataset.mjrScope = "output", c.dataset.mjrQuery = "*", c.dataset.mjrSort = "mtime_desc", c.dataset.mjrBottomFeed = "true"; - let l = Number(I.FEED_GRID_MIN_SIZE || I.GRID_MIN_SIZE || 120); + let l = Number(z.FEED_GRID_MIN_SIZE || z.GRID_MIN_SIZE || 120); c.dataset.mjrFeedMinItemWidth = String(l), c.style.setProperty("--mjr-grid-min-size", `${l}px`), c.addEventListener("keydown", (e) => { let t = e?.key?.toLowerCase?.() || ""; if (!(e?.ctrlKey || e?.metaKey || e?.altKey)) { @@ -16988,7 +16995,7 @@ function dp(e, t = null) { if (t === "c") { e.preventDefault?.(), e.stopPropagation?.(), r(); try { - nt.open().then(() => nt.toggleCompareAB()); + it.open().then(() => it.toggleCompareAB()); } catch (e) { console.debug?.(e); } @@ -17007,19 +17014,19 @@ function dp(e, t = null) { } }; } -function fp(e) { +function mp(e) { let t = e?.grid; if (!t) return []; - let n = Ke(t); - return n.size ? Vf(e).filter((e) => n.has(String(e?.id || ""))) : []; + let n = qe(t); + return n.size ? Uf(e).filter((e) => n.has(String(e?.id || ""))) : []; } -function pp(e) { +function hp(e) { let t = e?.grid; if (!t) return null; let n = String(t.dataset?.mjrSelectedAssetId || "").trim(); - return n ? Vf(e).find((e) => String(e?.id || "") === n) || null : fp(e)[0] || null; + return n ? Uf(e).find((e) => String(e?.id || "") === n) || null : mp(e)[0] || null; } -function mp(e) { +function gp(e) { let t = String(e ?? ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -17028,48 +17035,48 @@ function mp(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function hp(e) { +function _p(e) { let t = e?.grid; if (!t) return; let n = () => { try { - Jf(e); + Xf(e); } catch (e) { console.debug?.(e); } }; - e.keyboard = lo({ + e.keyboard = fo({ gridContainer: t, - getState: () => ({ assets: Bf(Vf(e)) }), - getSelectedAssets: () => fp(e), - getActiveAsset: () => pp(e), + getState: () => ({ assets: Hf(Uf(e)) }), + getSelectedAssets: () => mp(e), + getActiveAsset: () => hp(e), onOpenTagsEditor: (e) => { - let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${mp(e?.id || "")}"]`) || null, i = null; + let r = t.querySelector?.(`.mjr-asset-card[data-mjr-asset-id="${gp(e?.id || "")}"]`) || null, i = null; try { i = r?.getBoundingClientRect?.() || t.getBoundingClientRect(); } catch (e) { console.debug?.(e); } - ac(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); + sc(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 = fc({ + }), e.keyboard.bind(), e.ratingHotkeys = mc({ gridContainer: t, - createRatingBadge: Ct + createRatingBadge: dt }), e.ratingHotkeys.bind(); } -var gp = 60, _p = 600, vp = 10; -function yp(e, t) { - let n = Math.max(gp, Math.min(_p, Math.round(Number(t) / vp) * vp)); +var vp = 60, yp = 600, bp = 10; +function xp(e, t) { + let n = Math.max(vp, Math.min(yp, Math.round(Number(t) / bp) * bp)); if (e?.grid) try { e.grid.style.setProperty("--mjr-grid-min-size", `${n}px`); } catch (e) { console.debug?.(e); } - I.FEED_GRID_MIN_SIZE = n; + z.FEED_GRID_MIN_SIZE = n; try { - let e = Et(); - e.feed.minSize = n, ft(e), wt(e); + let e = pt(); + e.feed.minSize = n, _t(e), Ot(e); } catch (e) { console.debug?.(e); } @@ -17086,27 +17093,27 @@ function yp(e, t) { } return n; } -function bp(e) { - let t = Math.max(gp, Number(I.FEED_GRID_MIN_SIZE || 120) || 120), n = document.createElement("div"); +function Sp(e) { + let t = Math.max(vp, Number(z.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 i = document.createElement("span"); - i.textContent = r("bottomFeed.cardSize", "Cards:"), i.style.cssText = "font-size:11px; opacity:0.65; white-space:nowrap; flex-shrink:0;", n.appendChild(i); - let a = document.createElement("button"); - a.type = "button", a.className = "mjr-feed-size-btn", a.textContent = "-", a.title = r("bottomFeed.cardSizeDecrease", "Decrease card size"), a.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(a); - let o = document.createElement("input"); - o.type = "range", o.className = "mjr-feed-size-slider", o.min = String(gp), o.max = String(_p), o.step = String(vp), o.value = String(t), o.title = r("bottomFeed.cardSizeSlider", "Card size"), o.style.cssText = "flex:1 1 auto; min-width:40px; max-width:180px; height:4px; cursor:pointer; accent-color:var(--mjr-accent,#64b5f6);", n.appendChild(o); - let s = document.createElement("button"); - s.type = "button", s.className = "mjr-feed-size-btn", s.textContent = "+", s.title = r("bottomFeed.cardSizeIncrease", "Increase card size"), s.style.cssText = a.style.cssText, n.appendChild(s); - let c = document.createElement("span"); - c.className = "mjr-feed-size-display", c.textContent = `${t}px`, c.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(c), a.addEventListener("click", () => { - yp(e, Number(o.value) - vp); - }), s.addEventListener("click", () => { - yp(e, Number(o.value) + vp); - }), o.addEventListener("input", () => { - yp(e, Number(o.value)); + 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(vp), a.max = String(yp), a.step = String(bp), 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", () => { + xp(e, Number(a.value) - bp); + }), o.addEventListener("click", () => { + xp(e, Number(a.value) + bp); + }), a.addEventListener("input", () => { + xp(e, Number(a.value)); }), e.root.appendChild(n), e._sizeToolbar = n; } -function xp(e, t = {}) { +function Cp(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 = { @@ -17118,13 +17125,13 @@ function xp(e, t = {}) { assetsByKey: /* @__PURE__ */ new Map(), popoverManager: null }; - bp(r), cp(r), dp(r, t.gridWrapper ?? null), Lf(r), r.popoverManager = ro(n), r._disposeContextMenu = oc({ + Sp(r), up(r), pp(r, t.gridWrapper ?? null), zf(r), r.popoverManager = ao(n), r._disposeContextMenu = cc({ gridContainer: r.grid, getState: () => ({ scope: "output" }) - }), hp(r), up(r.grid); + }), _p(r), fp(r.grid); let i = () => { try { - up(r.grid); + fp(r.grid); } catch (e) { console.debug?.(e); } @@ -17137,26 +17144,26 @@ function xp(e, t = {}) { } }, r; } -function Sp(e) { - let t = rp(e); - if (t) for (let e of Array.from(Rf.hosts)) try { - if (!e?.grid || (qf(e, t), !e.loaded)) continue; - e.empty.style.display = "none", Jf(e); +function wp(e) { + let t = ap(e); + if (t) for (let e of Array.from(Bf.hosts)) try { + if (!e?.grid || (Yf(e, t), !e.loaded)) continue; + e.empty.style.display = "none", Xf(e); } catch (e) { console.debug?.(e); } } -function Cp(e, t = {}) { - lp(e); - let n = xp(e, t); +function Tp(e, t = {}) { + dp(e); + let n = Cp(e, t); try { e._mjrGeneratedFeedHost = n; } catch (e) { console.debug?.(e); } - return Rf.hosts.add(n), ap(n), n; + return Bf.hosts.add(n), sp(n), n; } -function wp(e) { +function Ep(e) { let t = e?._mjrGeneratedFeedHost || e || null; if (!t) return; let n = t.container || null; @@ -17170,7 +17177,7 @@ function wp(e) { } console.debug?.(e); } - Rf.hosts.delete(t); + Bf.hosts.delete(t); try { t._disposeSelection?.(); } catch (e) { @@ -17217,7 +17224,7 @@ function wp(e) { console.debug?.(e); } try { - Ur(t.grid); + Wr(t.grid); } catch (e) { console.debug?.(e); } @@ -17229,24 +17236,24 @@ function wp(e) { } //#endregion //#region ui/features/stacks/executionAssetBuffer.ts -function Tp(e) { +function Dp(e) { return String(e || "").trim(); } -function Ep(e) { +function Op(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 Dp() { +function kp() { let e = /* @__PURE__ */ new Map(); function t(t, n) { - let r = Tp(t); + let r = Dp(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 = Ep(e); + let t = Op(e); t && a.set(t, { ...a.get(t) || {}, ...e || {} @@ -17255,13 +17262,13 @@ function Dp() { return Array.from(a.values()); } function n(t) { - let n = Tp(t); + let n = Dp(t); if (!n) return []; let r = e.get(n); return e.delete(n), Array.from(r?.values?.() || []); } function r(t) { - let n = Tp(t); + let n = Dp(t); n && e.delete(n); } return { @@ -17273,7 +17280,7 @@ function Dp() { } //#endregion //#region ui/features/stacks/finalizeQueue.ts -function Op({ defaultDelayMs: e = 900, postJob: t } = {}) { +function Ap({ defaultDelayMs: e = 900, postJob: t } = {}) { let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), i = !1; async function a() { if (!i) { @@ -17311,27 +17318,27 @@ function Op({ defaultDelayMs: e = 900, postJob: t } = {}) { } //#endregion //#region ui/features/stacks/liveAssetGate.ts -function kp(e) { +function jp(e) { return String(e || "").trim(); } -function Ap(e) { +function Mp(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 jp(e, t) { +function Np(e, t) { return !t || String(e?.job_id || "").trim() === t ? e : { ...e || {}, job_id: t }; } -function Mp() { +function Pp() { let e = /* @__PURE__ */ new Map(); function t(t, { files: n = [], expectedCount: r = null } = {}) { - let i = kp(t); + let i = jp(t); if (!i) return; let a = /* @__PURE__ */ new Set(); for (let e of Array.isArray(n) ? n : []) { - let t = Ap(e); + let t = Mp(e); t && a.add(t); } e.set(i, { @@ -17341,13 +17348,13 @@ function Mp() { }); } function n(t) { - let n = kp(t); + let n = jp(t); n && e.delete(n); } function r(t) { - let n = kp(t?.job_id); + let n = jp(t?.job_id); if (n) return n; - let r = Ap(t); + let r = Mp(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); @@ -17360,7 +17367,7 @@ function Mp() { jobId: "", defer: !1 }; - let i = jp(t, n), a = e.get(n); + let i = Np(t, n), a = e.get(n); if (!a) return { detail: i, jobId: n, @@ -17383,20 +17390,20 @@ function Mp() { } //#endregion //#region ui/features/stacks/executionRuntimeController.ts -var Np = 2e3, Pp = 2e3, Fp = new Set([ +var Fp = 2e3, Ip = 2e3, Lp = new Set([ "DB_MAINTENANCE", "TIMEOUT", "NETWORK_ERROR", "SERVICE_UNAVAILABLE" -]), Ip = 8, Lp = 1200, Rp = 15e3, zp = 600 * 1e3, Bp = 500, Vp = 6, Hp = 3e4, Up = 500; -function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { - let c = y({ - ttlMs: Np, - maxSize: Pp - }), l = y({ - ttlMs: zp, - maxSize: Bp - }), u = Math.max(0, Number(I.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = Dp(), p = Mp(), m = "", h = 0, g = null; +]), Rp = 8, zp = 1200, Bp = 15e3, Vp = 600 * 1e3, Hp = 500, Up = 6, Wp = 3e4, Gp = 500; +function Kp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensureExecutionRuntime: i, emitRuntimeStatus: a, refreshGeneratedFeedHosts: o, getActiveGridContainer: s }) { + let c = oe({ + ttlMs: Fp, + maxSize: Ip + }), l = oe({ + ttlMs: Vp, + maxSize: Hp + }), u = Math.max(0, Number(z.EXECUTION_IDLE_GRACE_MS) || 6e3), d = /* @__PURE__ */ new Map(), f = kp(), p = Pp(), m = "", h = 0, g = null; function _() { try { return typeof window > "u" ? !1 : window.__MJR_DEBUG_JOB_TRACKING__ === !0 ? !0 : String(window.localStorage?.getItem("mjr.debug.jobTracking") || "").trim() === "1"; @@ -17411,11 +17418,11 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu console.debug?.(e); } } - function b() { - return !!I.EXECUTION_GROUPING_ENABLED; + function y() { + return !!z.EXECUTION_GROUPING_ENABLED; } - function x() { - let e = b(); + function b() { + let e = y(); return { groupingEnabled: e, useExecutionBuffer: e, @@ -17423,7 +17430,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu allowLiveStackFinalize: e }; } - function S(e = {}) { + function x(e = {}) { v("stacks-updated", { targeted_job_id: String(e?.targeted_job_id || ""), stacks: Array.isArray(e?.stacks) ? e.stacks.map((e) => ({ @@ -17468,7 +17475,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu console.debug?.(e); } } - let C = Op({ + let S = Ap({ defaultDelayMs: 900, async postJob(r) { v("auto-stack:start", { job_id: r }); @@ -17484,18 +17491,18 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu v("auto-stack:done", { job_id: r, stacks: Array.isArray(i?.data?.stacks) ? i.data.stacks.length : 0 - }), S(i?.data || { targeted_job_id: r }); + }), x(i?.data || { targeted_job_id: r }); } catch (e) { n(e, "executionRuntime.execution_end.auto_stack"); } } }); - function w(e, t) { + function C(e, t) { if (!e) return; let n = Number(t) || Date.now(); l.set(String(e), n, { at: n }), l.prune(); } - function T(e) { + function w(e) { c.prune(); let t = []; for (let n of e) { @@ -17504,16 +17511,16 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } return t; } - function E(e) { + function T(e) { let t = Math.max(1, Number(e) || 1), n = Math.min(6, t - 1); - return Math.min(Rp, Lp * 2 ** n); + return Math.min(Bp, zp * 2 ** n); } - function D() { + function E() { g &&= (clearTimeout(g), null); } - function O(e, t = u) { + function D(e, t = u) { let r = Math.max(0, Number(t) || 0); - D(), g = setTimeout(() => { + E(), g = setTimeout(() => { g = null; try { e?.(); @@ -17522,11 +17529,11 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } }, r); } - function k(e) { + function O(e) { let t = String(e?.code || "").trim().toUpperCase(); - return Fp.has(t); + return Lp.has(t); } - function A(r, i = 1, a = {}) { + function k(r, i = 1, a = {}) { let o = Array.isArray(r) ? r : []; if (!o.length) return; let s = { @@ -17539,9 +17546,9 @@ function Wp({ 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 (k(e) && i < Ip) { - let e = E(i); - setTimeout(() => A(o, i + 1, a), e); + if (O(e) && i < Rp) { + let e = T(i); + setTimeout(() => k(o, i + 1, a), e); return; } try { @@ -17553,7 +17560,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu } }).catch((e) => n(e, "executionRuntime.executed.index")); } - function j(e = {}) { + function A(e = {}) { let t = String(e?.prompt_id || e?.promptId || "").trim(); if (t) return t; try { @@ -17562,26 +17569,26 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu return console.debug?.(e), ""; } } - function M(e) { + function j(e) { return !Array.isArray(e) || !e.length ? "" : e.map((e) => String(e?.filepath || e?.filename || "")).filter(Boolean).sort().join("|"); } - function N(e, t = {}, n = 1) { + function M(e, t = {}, n = 1) { let r = Array.isArray(e) ? e : []; if (!r.length) return; - let i = M(r); + let i = j(r); if (!i) { - A(r, 1, t); + k(r, 1, t); return; } let a = d.get(i); a?.timer && clearTimeout(a.timer); let o = a?.firstAttemptAt ?? Date.now(); - if (Date.now() - o >= Hp) { - A(r, 1, t); + if (Date.now() - o >= Wp) { + k(r, 1, t); return; } let s = Math.max(1, Number(n) || 1), c = Math.min(2e3, 250 * s), l = setTimeout(() => { - d.delete(i), ee(r, t, s + 1); + d.delete(i), F(r, t, s + 1); }, c); d.set(i, { files: r, @@ -17591,7 +17598,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu firstAttemptAt: o }); } - function P(e) { + function N(e) { let t = String(e || "").trim(); if (!(!t || d.size <= 0)) for (let [e, n] of Array.from(d.entries())) { try { @@ -17602,7 +17609,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu d.delete(e), f.add(t, n?.files || []); } } - function F() { + function P() { for (let [e, t] of Array.from(d.entries())) { try { t?.timer && clearTimeout(t.timer); @@ -17612,8 +17619,8 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu d.delete(e); } } - function ee(e, t = {}, n = 1) { - let r = j(t); + function F(e, t = {}, n = 1) { + let r = A(t); if (v("buffer:add", { prompt_id: r, explicit_prompt_id: String(t?.prompt_id || t?.promptId || ""), @@ -17621,23 +17628,23 @@ function Wp({ 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 < Vp) { - N(e, t, n); + if (n < Up) { + M(e, t, n); return; } - A(e, 1, t); + k(e, 1, t); return; } f.add(r, e); } - function te(e, t = 900) { - b() && (v("finalize:schedule", { + function I(e, t = 900) { + y() && (v("finalize:schedule", { job_id: String(e || ""), delay_ms: t - }), C.schedule(e, t)); + }), S.schedule(e, t)); } - function ne(r) { - let i = x(), a = String(r || "").trim(); + function ee(r) { + let i = b(), a = String(r || "").trim(); if (!a) return; let o = f.take(a); if (v("buffer:flush", { @@ -17648,7 +17655,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu files: o, expectedCount: o.length }), !o.length) { - i.allowLiveStackFinalize && te(a); + i.allowLiveStackFinalize && I(a); return; } e(t.INDEX_FILES, { @@ -17663,12 +17670,12 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu v("index:flush:done", { prompt_id: a, file_count: o.length - }), i.allowLiveStackFinalize && te(a, 1800); + }), i.allowLiveStackFinalize && I(a, 1800); }).catch((e) => { i.allowLiveStackFinalize && p.clearPendingJob(a), n(e, "executionRuntime.executed.index"); }); } - function re(e) { + function te(e) { let t = String(e || "").trim(); if (!t) return !1; try { @@ -17678,8 +17685,8 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu return console.debug?.(e), !1; } } - function ie(e) { - if (!b()) return { + function ne(e) { + if (!y()) return { detail: e, jobId: "", defer: !1 @@ -17694,18 +17701,18 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu }; } } - function ae(e) { + function re(e) { let t = String(e?.kind || "").trim(), n = String(e?.filename || "").trim(), r = String(e?.filepath || "").trim(); return !!t && (!!n || !!r); } - function oe(e, { appRef: t }) { - if (!x().useExecutionBuffer) return; - let n = T(r(e?.detail?.output)); + function ie(e, { appRef: t }) { + if (!b().useExecutionBuffer) return; + let n = w(r(e?.detail?.output)); if (!n.length) return; let i = e?.detail?.prompt_id || e?.detail?.promptId, a = String(e?.detail?.node || e?.detail?.display_node || "").trim(), o = i ? l.get(String(i)) : null, s = o ? Math.max(0, Date.now() - o) : 0, c = ""; try { if (a && t !== void 0) { - let e = Xt(Jt(t), a); + let e = He(Be(t), a); e && (c = String(e.type || e.comfyClass || "").trim()); } } catch (e) { @@ -17725,7 +17732,7 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu files: u.map((e) => String(e?.filename || e?.filepath || "")) }); try { - window.dispatchEvent(new CustomEvent(B.NEW_GENERATION_OUTPUT, { detail: { + window.dispatchEvent(new CustomEvent(H.NEW_GENERATION_OUTPUT, { detail: { files: u, prompt_id: String(i || ""), promptId: String(i || "") @@ -17734,23 +17741,23 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu console.debug?.(e); } let d = u.length > 0 ? [u[0]] : [], f = u.length > 1 ? u.slice(1) : []; - d.length > 0 && A(d, 1, { prompt_id: i }), f.length > 0 && ee(f, { prompt_id: i }); + d.length > 0 && k(d, 1, { prompt_id: i }), f.length > 0 && F(f, { prompt_id: i }); } - function se(e, { setCurrentJobId: t }) { + function ae(e, { setCurrentJobId: t }) { let n = e?.detail?.prompt_id || e?.detail?.promptId, r = e?.detail?.timestamp; v("execution:start", { prompt_id: String(n || ""), timestamp: Number(r) || null - }), w(n, r), D(), t?.(n || null), a({ + }), C(n, r), E(), t?.(n || null), a({ active_prompt_id: n || null, cached_nodes: [], progress_node: null, progress_value: null, progress_max: null - }), n && P(n); + }), n && N(n); } - function ce(e, { setCurrentJobId: t }) { - let n = x(), r = e?.detail?.prompt_id || e?.detail?.promptId; + function se(e, { setCurrentJobId: t }) { + let n = b(), r = e?.detail?.prompt_id || e?.detail?.promptId; v("execution:end", { type: String(e?.type || ""), prompt_id: String(r || "") @@ -17763,35 +17770,35 @@ function Wp({ post: e, ENDPOINTS: t, reportError: n, extractOutputFiles: r, ensu }), r && String(e?.type || "") !== "execution_success" && (v("buffer:clear", { prompt_id: String(r || ""), reason: String(e?.type || "") - }), D(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), F()), String(e?.type || "") === "execution_success" && O(() => { - r && P(r), ne(r); - }, re(r) ? Math.min(u, Up) : u); + }), E(), f.clear(r), n.allowLiveStackFinalize && p.clearPendingJob(r), P()), String(e?.type || "") === "execution_success" && D(() => { + r && N(r), ee(r); + }, te(r) ? Math.min(u, Gp) : u); } - function le(e) { - if (!b()) return; + function ce(e) { + if (!y()) return; let t = []; for (let [, n] of e instanceof Map ? e.entries() : []) { let e = r(n); if (e?.length) for (let n of e) t.push(n); } - !t.length || !b() || (v("node-outputs:updated", { - prompt_id: j(), + !t.length || !y() || (v("node-outputs:updated", { + prompt_id: A(), file_count: t.length - }), ee(t, { prompt_id: j() })); + }), F(t, { prompt_id: A() })); } return { - notifyStacksUpdated: S, - prepareLiveAssetEvent: ie, - isRenderableLiveAsset: ae, - handleExecutedEvent: oe, - handleExecutionStart: se, - handleExecutionEnd: ce, - handleNodeOutputsUpdated: le + notifyStacksUpdated: x, + prepareLiveAssetEvent: ne, + isRenderableLiveAsset: re, + handleExecutedEvent: ie, + handleExecutionStart: ae, + handleExecutionEnd: se, + handleNodeOutputsUpdated: ce }; } //#endregion //#region ui/utils/extractOutputFiles.ts -function Gp(e) { +function qp(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; @@ -17877,15 +17884,15 @@ function Gp(e) { } //#endregion //#region ui/features/runtime/sidebarAssetBadge.ts -var Kp = "mjr-sidebar-asset-badge", qp = "mjr-sidebar-tab-has-badge", Jp = "mjr-sidebar-asset-badge-style", Yp = 99, Xp = 0, Zp = "majoor-assets", Qp = /* @__PURE__ */ new Set(); -function $p() { - if (typeof document > "u" || document.getElementById(Jp)) return; +var Jp = "mjr-sidebar-asset-badge", Yp = "mjr-sidebar-tab-has-badge", Xp = "mjr-sidebar-asset-badge-style", Zp = 99, Qp = 0, $p = "majoor-assets", em = /* @__PURE__ */ new Set(); +function tm() { + if (typeof document > "u" || document.getElementById(Xp)) return; let e = document.createElement("style"); - e.id = Jp, e.textContent = ` - .${qp} { + e.id = Xp, e.textContent = ` + .${Yp} { position: relative !important; } - .${Kp} { + .${Jp} { position: absolute; top: 3px; right: 3px; @@ -17909,7 +17916,7 @@ function $p() { } `, document.head?.appendChild(e); } -function em(e) { +function nm(e) { let t = String(e || "").trim(); if (!t) return []; let n = (() => { @@ -17928,69 +17935,69 @@ function em(e) { `[href="#${n}"]` ]; } -function tm(e) { +function rm(e) { let t = `${e?.textContent || ""} ${e?.title || ""} ${e?.getAttribute?.("aria-label") || ""}`; return /assets\s*manager|majoor/i.test(t); } -function nm(e) { +function im(e) { return !e || typeof e != "object" ? !1 : typeof HTMLElement < "u" ? e instanceof HTMLElement : typeof e.querySelector == "function" && typeof e.appendChild == "function"; } -function rm() { +function am() { if (typeof document > "u") return null; - for (let e of em(Zp)) { + for (let e of nm($p)) { let t = document.querySelector(e); - if (nm(t)) return t; + if (im(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 (nm(e) && tm(e)) return e; + if (im(e) && rm(e)) return e; } - return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => nm(e) && tm(e)) || null; + return Array.from(document.querySelectorAll("button,[role='tab'],a,.p-button,.comfyui-button,.sidebar-tab")).find((e) => im(e) && rm(e)) || null; } -function im() { - $p(); - let e = rm(); +function om() { + tm(); + let e = am(); if (!e) return !1; - let t = e.querySelector(`:scope > .${Kp}`); - return Xp <= 0 ? (t?.remove(), e.classList.remove(qp), !0) : (t || (t = document.createElement("span"), t.className = Kp, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(qp), t.textContent = Xp > Yp ? `${Yp}+` : String(Xp), !0); + let t = e.querySelector(`:scope > .${Jp}`); + return Qp <= 0 ? (t?.remove(), e.classList.remove(Yp), !0) : (t || (t = document.createElement("span"), t.className = Jp, t.setAttribute("aria-hidden", "true"), e.appendChild(t)), e.classList.add(Yp), t.textContent = Qp > Zp ? `${Zp}+` : String(Qp), !0); } -function am() { - im(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => im()), setTimeout(() => im(), 250), setTimeout(() => im(), 1e3); +function sm() { + om(), typeof requestAnimationFrame == "function" && requestAnimationFrame(() => om()), setTimeout(() => om(), 250), setTimeout(() => om(), 1e3); } -function om({ sidebarTabId: e } = {}) { +function cm({ sidebarTabId: e } = {}) { let t = String(e || "").trim(); - t && (Zp = t), am(); + t && ($p = t), sm(); } -function sm(e = null) { +function lm(e = null) { let t = String(e?.id || e?.asset_id || "").trim(); if (t) { - if (Qp.has(t)) return; - if (Qp.add(t), Qp.size > 1e3) { - let e = Array.from(Qp).slice(-500); - Qp.clear(); - for (let t of e) Qp.add(t); + if (em.has(t)) return; + if (em.add(t), em.size > 1e3) { + let e = Array.from(em).slice(-500); + em.clear(); + for (let t of e) em.add(t); } } - Xp += 1, am(); + Qp += 1, sm(); } -function cm() { - Xp = 0, Qp.clear(), am(); +function um() { + Qp = 0, em.clear(), sm(); } //#endregion //#region ui/features/runtime/pendingGeneratedAssets.ts -var lm = 0; -function um(e = 1) { +var dm = 0; +function fm(e = 1) { let t = Math.max(1, Number(e) || 1); - lm += t; + dm += t; try { - window.__mjrPendingGeneratedAssetCount = lm; + window.__mjrPendingGeneratedAssetCount = dm; } catch {} - return lm; + return dm; } -function dm() { - let e = lm; - lm = 0; +function pm() { + let e = dm; + dm = 0; try { window.__mjrPendingGeneratedAssetCount = 0; } catch {} @@ -17998,11 +18005,11 @@ function dm() { } //#endregion //#region ui/features/runtime/registerRealtimeListeners.ts -var fm = 3e4, pm = /* @__PURE__ */ new Map(), mm = "live"; -function hm(e) { +var mm = 3e4, hm = /* @__PURE__ */ new Map(), gm = "live"; +function _m(e) { return e === !0 || e === 1 || e === "1" ? !0 : e === !1 || e === 0 || e === "0" ? !1 : null; } -function gm(e) { +function vm(e) { let t = [ e?.has_ai_vector, e?.hasAiVector, @@ -18012,25 +18019,25 @@ function gm(e) { e?.vectorIndexed ]; for (let e of t) { - let t = hm(e); + let t = _m(e); if (t !== null) return t; } return !1; } -function _m(e) { - let t = Date.now(), n = Number(pm.get(e) || 0); - if (n > 0 && t - n < fm) return !0; - if (pm.set(e, t), pm.size > 500) { - let e = t - 5 * fm; - for (let [t, n] of pm.entries()) Number(n) < e && pm.delete(t); +function ym(e) { + let t = Date.now(), n = Number(hm.get(e) || 0); + if (n > 0 && t - n < mm) return !0; + if (hm.set(e, t), hm.size > 500) { + let e = t - 5 * mm; + for (let [t, n] of hm.entries()) Number(n) < e && hm.delete(t); } return !1; } -function vm(e) { +function bm(e) { let t = String(e?.id || "").trim(); - t && (gm(e) || _m(t) || b(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); + t && (vm(e) || ym(t) || S(t).catch((e) => console.debug?.("[Majoor] auto vector index failed", e))); } -function ym(e) { +function xm(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?.() || ""; @@ -18070,8 +18077,8 @@ function ym(e) { "spz" ].includes(r) ? "model3d" : "unknown" : ""; } -function bm(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 = ym(e); +function Sm(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 = xm(e); if (!s || !n && !r) return null; let c = n || r.split(/[/\\]/).filter(Boolean).pop() || ""; if (!c) return null; @@ -18082,7 +18089,7 @@ function bm(e, { jobId: t = "" } = {}) { c ].map((e) => String(e || "").trim().toLowerCase()).join("|"), d = Date.now() / 1e3, f = String(e?.job_id || t || "").trim(); return { - id: `${mm}:${u || l.toLowerCase()}`, + id: `${gm}:${u || l.toLowerCase()}`, filename: c, filepath: l, path: l, @@ -18105,7 +18112,7 @@ function bm(e, { jobId: t = "" } = {}) { _mjrLiveLabel: "In progress" }; } -function xm(e) { +function Cm(e) { let t = String(e || ""); try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(t); @@ -18114,11 +18121,11 @@ function xm(e) { } return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); } -function Sm(e, t) { +function wm(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 Cm(e, t) { +function Tm(e, t) { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(), i = { delete_db: [ "started", @@ -18152,16 +18159,16 @@ function Cm(e, t) { label: r.replace(/[_-]+/g, " ") }; } -async function wm({ 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: v, syncExecutionBackendState: y }) { +async function Em({ 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 }); } catch (e) { g(e, "entry.executed"); } - }, v(t, e, "executed", e._mjrExecutedHandler), e._mjrExecutionStartHandler = (e) => { + }, _(t, e, "executed", e._mjrExecutedHandler), e._mjrExecutionStartHandler = (e) => { try { - n.handleExecutionStart(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), y?.({ + n.handleExecutionStart(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), v?.({ active: !0, promptId: e?.detail?.prompt_id || e?.detail?.promptId || "" }); @@ -18170,7 +18177,7 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre } }, e._mjrExecutionEndHandler = (e) => { try { - n.handleExecutionEnd(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), y?.({ + n.handleExecutionEnd(e, { setCurrentJobId: (e) => i?.setCurrentJobId(e) }), v?.({ active: !1, promptId: e?.detail?.prompt_id || e?.detail?.promptId || "" }); @@ -18205,18 +18212,18 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre } catch (e) { g(e, "entry.execution_cached"); } - }, v(t, e, "execution_start", e._mjrExecutionStartHandler), v(t, e, "execution_success", e._mjrExecutionEndHandler), v(t, e, "execution_error", e._mjrExecutionEndHandler), v(t, e, "execution_interrupted", e._mjrExecutionEndHandler), v(t, e, "mjr.stacks.updated", e._mjrStacksUpdatedHandler), v(t, e, "progress", e._mjrRuntimeStatusHandler), v(t, e, "status", e._mjrRuntimeStatusHandler), v(t, e, B.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), v(t, e, "execution_cached", e._mjrExecutionCachedHandler); - function b() { + }, _(t, e, "execution_start", e._mjrExecutionStartHandler), _(t, e, "execution_success", e._mjrExecutionEndHandler), _(t, e, "execution_error", e._mjrExecutionEndHandler), _(t, e, "execution_interrupted", e._mjrExecutionEndHandler), _(t, e, "mjr.stacks.updated", e._mjrStacksUpdatedHandler), _(t, e, "progress", e._mjrRuntimeStatusHandler), _(t, e, "status", e._mjrRuntimeStatusHandler), _(t, e, H.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), _(t, e, "execution_cached", e._mjrExecutionCachedHandler); + function y() { try { window.__mjrLastAssetUpsert = Date.now(), window.__mjrLastAssetUpsertCount = (Number(window.__mjrLastAssetUpsertCount || 0) || 0) + 1; } catch (e) { console.debug?.(e); } } - function x(e, t, { immediate: n = !1, force: r = !1 } = {}) { + 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="${xm(i)}"]`); + d = typeof e?._mjrHasAssetId == "function" ? !!e._mjrHasAssetId(i) : !!e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${Cm(i)}"]`); } catch (e) { console.debug?.(e); } @@ -18235,7 +18242,7 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre }); } let m = f ? !!(n && typeof u == "function" ? u : l)(e, p) : !1; - return m && b(), m; + return m && y(), m; } e._mjrNewGenerationOutputHandler = (e) => { try { @@ -18245,8 +18252,8 @@ async function wm({ 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 = bm(e, { jobId: i }); - n && x(t, n, { + let n = Sm(e, { jobId: i }); + n && b(t, n, { immediate: !0, force: !0 }); @@ -18254,29 +18261,29 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre } catch (e) { g(e, "entry.new_generation_output"); } - }, v(t, window, B.NEW_GENERATION_OUTPUT, e._mjrNewGenerationOutputHandler), e._mjrAssetAddedHandler = (e) => { + }, _(t, window, H.NEW_GENERATION_OUTPUT, e._mjrNewGenerationOutputHandler), e._mjrAssetAddedHandler = (e) => { try { if (!e?.detail) return; let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; if (t?.defer) return; let i = n.isRenderableLiveAsset(r); - i && (c(r), sm(r)), vm(r); + i && (c(r), lm(r)), bm(r); let a = s(); if (!a) { - i && um(); + i && fm(); return; } let o = a.dataset?.mjrScope || "output"; if (o !== "output" && o !== "all") { - i && um(); + i && fm(); return; } let l = a.dataset?.mjrQuery || "*"; - String(l).trim() === "*" && i ? x(a, r, { immediate: !0 }) || um() : i && um(); + String(l).trim() === "*" && i ? b(a, r, { immediate: !0 }) || fm() : i && fm(); } catch (e) { g(e, "entry.asset_added"); } - }, v(t, e, "mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler = (e) => { + }, _(t, e, "mjr-asset-added", e._mjrAssetAddedHandler), e._mjrAssetUpdatedHandler = (e) => { try { if (!e?.detail) return; let t = n.prepareLiveAssetEvent(e.detail), r = t?.detail || e.detail; @@ -18284,30 +18291,30 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre n.isRenderableLiveAsset(r) && c(r); let i = s(); if (!i) return; - x(i, r, { immediate: !0 }); + b(i, r, { immediate: !0 }); } catch (e) { g(e, "entry.asset_updated"); } - }, v(t, e, "mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler = (e) => { + }, _(t, e, "mjr-asset-updated", e._mjrAssetUpdatedHandler), e._mjrStructuredEventHandler = (e) => { try { let t = e?.detail || {}; - window.dispatchEvent(new CustomEvent(B.STRUCTURED_EVENT, { detail: t })); + window.dispatchEvent(new CustomEvent(H.STRUCTURED_EVENT, { detail: t })); } catch (e) { console.debug?.(e); } - }, v(t, e, B.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler = (e) => { + }, _(t, e, H.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler = (e) => { try { let t = e?.detail || {}; - window.dispatchEvent(new CustomEvent(B.SCAN_COMPLETE, { detail: t })); + window.dispatchEvent(new CustomEvent(H.SCAN_COMPLETE, { detail: t })); } catch (e) { console.debug?.(e); } - }, v(t, e, B.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrCoreExecutionAssetsReadyHandler = (e) => { + }, _(t, e, H.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrCoreExecutionAssetsReadyHandler = (e) => { try { let t = e?.detail || {}; - window.dispatchEvent(new CustomEvent(B.CORE_EXECUTION_ASSETS_READY, { detail: t })); + window.dispatchEvent(new CustomEvent(H.CORE_EXECUTION_ASSETS_READY, { detail: t })); let n = Number(t?.indexed || 0); - Number.isFinite(n) && n > 0 && window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { + Number.isFinite(n) && n > 0 && window.dispatchEvent(new CustomEvent(H.RELOAD_GRID, { detail: { reason: "core-execution-assets-ready", prompt_id: t?.prompt_id || t?.promptId || "", indexed: n @@ -18315,47 +18322,47 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre } catch (e) { console.debug?.(e); } - }, v(t, e, B.CORE_EXECUTION_ASSETS_READY, e._mjrCoreExecutionAssetsReadyHandler), e._mjrScanProgressHandler = (e) => { + }, _(t, e, H.CORE_EXECUTION_ASSETS_READY, e._mjrCoreExecutionAssetsReadyHandler), e._mjrScanProgressHandler = (e) => { try { let t = e?.detail || {}; - window.dispatchEvent(new CustomEvent(B.SCAN_PROGRESS, { detail: t })); + window.dispatchEvent(new CustomEvent(H.SCAN_PROGRESS, { detail: t })); } catch (e) { console.debug?.(e); } - }, v(t, e, B.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler = (e) => { + }, _(t, e, H.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler = (e) => { try { let t = e?.detail || {}; - window.dispatchEvent(new CustomEvent(B.ASSET_INDEXING, { detail: t })); + window.dispatchEvent(new CustomEvent(H.ASSET_INDEXING, { detail: t })); } catch (e) { console.debug?.(e); } - }, v(t, e, B.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler = (e) => { + }, _(t, e, H.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler = (e) => { try { let t = e?.detail || {}; - if (window.dispatchEvent(new CustomEvent(B.ASSET_INDEXED, { detail: t })), !t) return; + if (window.dispatchEvent(new CustomEvent(H.ASSET_INDEXED, { detail: t })), !t) return; let r = n.prepareLiveAssetEvent(t), i = r?.detail || t; if (r?.defer) return; - n.isRenderableLiveAsset(i) && c(i), vm(i); + n.isRenderableLiveAsset(i) && c(i), bm(i); let a = s(); if (!a) return; - x(a, i, { + b(a, i, { immediate: !0, force: !0 }); } catch (e) { console.debug?.(e); } - }, v(t, e, B.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrEnrichmentStatusHandler = (e) => { + }, _(t, e, H.ASSET_INDEXED, e._mjrAssetIndexedHandler), e._mjrEnrichmentStatusHandler = (e) => { try { let t = e?.detail || {}, n = Number(t?.queued), r = Number(t?.queue_left), i = Number.isFinite(n) ? Math.max(0, Math.floor(n)) : Number.isFinite(r) ? Math.max(0, Math.floor(r)) : 0, a = !!t?.active || i > 0, o = f().active; - p(a, i), window.dispatchEvent(new CustomEvent(B.ENRICHMENT_STATUS, { detail: t })), o && !a && m(h("toast.enrichmentComplete", "Metadata enrichment complete"), "success", 2600); + p(a, i), window.dispatchEvent(new CustomEvent(H.ENRICHMENT_STATUS, { detail: t })), o && !a && m(h("toast.enrichmentComplete", "Metadata enrichment complete"), "success", 2600); } catch (e) { console.debug?.(e); } - }, v(t, e, B.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler = (e) => { + }, _(t, e, H.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler = (e) => { try { let t = e?.detail || {}, n = String(t?.step || ""), r = String(t?.level || "info"), i = String(t?.operation || ""); - window.dispatchEvent(new CustomEvent(B.DB_RESTORE_STATUS, { detail: t })); + window.dispatchEvent(new CustomEvent(H.DB_RESTORE_STATUS, { detail: t })); let a = i === "delete_db", o = i === "reset_index", s = { started: a ? h("toast.dbDeleteTriggered", "Deleting database and rebuilding...") : o ? h("toast.resetTriggered", "Reset triggered: Reindexing all files...") : h("toast.dbRestoreStarted", "DB restore started"), stopping_workers: h("toast.dbRestoreStopping", "Stopping running workers"), @@ -18370,11 +18377,11 @@ async function wm({ 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: Sm(i, h), + title: wm(i, h), detail: s, status: n, operation: String(i || "db_restore").trim().toLowerCase(), - progress: Cm(i, n), + progress: Tm(i, n), source: String(t?.name || "").trim() || "maintenance", forceStore: !0 } }; @@ -18383,15 +18390,15 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre "done", "failed" ].includes(n)) { - _(s, c, 0, l); + ae(s, c, 0, l); return; } m(s, c, n === "done" || n === "failed" ? 2800 : 1800, l); } catch (e) { console.debug?.(e); } - }, v(t, e, B.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler); - let S = (e) => { + }, _(t, e, H.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler); + let x = (e) => { try { let t = Array.isArray(e?.detail?.ids) ? e.detail.ids.map((e) => String(e || "")).filter(Boolean) : []; if (!t.length) return; @@ -18401,11 +18408,11 @@ async function wm({ api: e, runtime: t, executionRuntime: n, appRef: r, liveStre console.debug?.(e); } }; - v(t, window, B.ASSETS_DELETED, S), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = S), console.debug("[Majoor] Real-time listener registered"); + _(t, window, H.ASSETS_DELETED, x), t && typeof t == "object" && (t.api = e, t.assetsDeletedHandler = x), console.debug("[Majoor] Real-time listener registered"); } //#endregion //#region ui/features/runtime/entryDebugApi.ts -function Tm({ resolveNodeStreamModule: e }) { +function Dm({ resolveNodeStreamModule: e }) { typeof window > "u" || (window.MajoorDebug = { exportMetrics: () => window.MajoorMetrics?.exportMetrics?.(), getMetrics: () => window.MajoorMetrics?.getMetricsReport?.(), @@ -18421,16 +18428,16 @@ function Tm({ resolveNodeStreamModule: e }) { } //#endregion //#region ui/features/runtime/benignConsoleNoise.ts -var Em = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; -function Dm(e) { +var Om = ["ResizeObserver loop completed with undelivered notifications.", "ResizeObserver loop limit exceeded"]; +function km(e) { try { let t = String(e?.message || e || ""); - return Em.some((e) => t.includes(e)); + return Om.some((e) => t.includes(e)); } catch { return !1; } } -function Om() { +function Am() { if (typeof window > "u") return null; try { window.__MJR_BENIGN_CONSOLE_NOISE_FILTER__?.abort?.(); @@ -18445,7 +18452,7 @@ function Om() { } let t = (e) => { try { - if (!Dm(e?.message || e?.error)) return; + if (!km(e?.message || e?.error)) return; e.preventDefault?.(), e.stopImmediatePropagation?.(); } catch (e) { console.debug?.(e); @@ -18471,7 +18478,7 @@ function Om() { } //#endregion //#region ui/features/geninfo/genInfoOverridePicker.ts -var km = "Majoor.GenInfoOverridePicker", Am = "MajoorGenInfoOverride", jm = "Auto fill from workflow", Mm = "Pick", Nm = { +var jm = "Majoor.GenInfoOverridePicker", Mm = "MajoorGenInfoOverride", Nm = R("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"), Pm = R("genInfoOverride.pick", "Pick"), Fm = { positive_prompt: [ "positive_prompt", "prompt", @@ -18494,7 +18501,7 @@ var km = "Majoor.GenInfoOverridePicker", Am = "MajoorGenInfoOverride", jm = "Aut ], vae: ["vae", "vae_name"], clip: ["clip", "clip_name"] -}, Pm = [ +}, Im = [ { field: "positive_prompt", label: "prompt" @@ -18539,14 +18546,14 @@ var km = "Majoor.GenInfoOverridePicker", Am = "MajoorGenInfoOverride", jm = "Aut field: "denoise", label: "denoise" } -], Fm = 0x10000000000000000, Im = !1, Lm = !1; -function Rm(e, t) { +], Lm = 0x10000000000000000, Rm = !1, zm = !1; +function Bm(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 zm(e, t, n, r, i) { +function Vm(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({ @@ -18556,42 +18563,42 @@ function zm(e, t, n, r, i) { source: i })); } -function Bm(e, t, n) { +function Hm(e, t, n) { let r = t.toLowerCase(); - return !!((Nm[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 !!((Fm[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 Vm(e, t = null) { +function Um(e, t = null) { let n = [], r = /* @__PURE__ */ new Set(); - for (let { graph: i, label: a } of Zt(e)) for (let e of Yt(i)) { - if (String(e?.comfyClass || e?.type || "") === Am) continue; + for (let { graph: i, label: a } of Ue(e)) for (let e of Ve(i)) { + if (String(e?.comfyClass || e?.type || "") === Mm) 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(Nm)) for (let a of i) zm(n, r, t, Rm(e, a), o); + for (let [t, i] of Object.entries(Fm)) for (let a of i) Vm(n, r, t, Bm(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") ? zm(n, r, "positive_prompt", l, o) : s.includes("negative") && zm(n, r, "negative_prompt", l, o), t && Bm(t, s, i) && zm(n, r, t, l, `${o} / ${e?.name || `widget ${a + 1}`}`); + s.includes("positive") || s === "text" && String(i).toLowerCase().includes("positive") ? Vm(n, r, "positive_prompt", l, o) : s.includes("negative") && Vm(n, r, "negative_prompt", l, o), t && Hm(t, s, i) && Vm(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 Hm(e, t) { +function Wm(e, t) { return (e.widgets ?? []).find((e) => e?.name === t); } -function Um(e) { - let t = Hm(e, "seed"); +function Gm(e) { + let t = Wm(e, "seed"); t && (t.options = { ...t.options ?? {}, min: -1, - max: Fm, + max: Lm, control_after_generate: !1 }); } -function Wm(e, t) { +function Km(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 Gm(e, t) { +function qm(e, t) { if (!e || !t || typeof t != "object") return 0; - Um(e); + Gm(e); let n = 0; for (let r of [ "positive_prompt", @@ -18609,14 +18616,14 @@ function Gm(e, t) { "workflow_notes", "custom_info_json" ]) { - let i = Wm(t, r); + let i = Km(t, r); if (i == null) continue; - let a = Hm(e, r); - a && (Km(a, i, e, r), qm(a, i), n += 1); + let a = Wm(e, r); + a && (Jm(a, i, e, r), Ym(a, i), n += 1); } return n; } -function Km(e, t, n, r) { +function Jm(e, t, n, r) { if (r !== "seed") { sn(e, t, n); return; @@ -18626,15 +18633,15 @@ function Km(e, t, n, r) { e.options = { ...e.options ?? {}, min: -1, - max: Fm, + max: Lm, control_after_generate: !1 }, e.value = Math.trunc(i); try { - e.callback?.(e.value, fe()?.canvas ?? null, n, null, e); + e.callback?.(e.value, be()?.canvas ?? null, n, null, e); } catch {} } } -function qm(e, t) { +function Ym(e, t) { let n = String(t ?? ""), r = [ e?.inputEl, e?.element, @@ -18647,26 +18654,26 @@ function qm(e, t) { e.value = n; } catch {} } -function Jm(e, t, n) { - let r = $m({ detail: { output: t } }); - if (r && Gm(e, r)) try { +function Xm(e, t, n) { + let r = th({ detail: { output: t } }); + if (r && qm(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 Ym(e, t, n = null) { - let r = n || t.field, i = Hm(e, r); - i && (Km(i, t.value, e, r), qm(i, t.value)); +function Zm(e, t, n = null) { + let r = n || t.field, i = Wm(e, r); + i && (Jm(i, t.value, e, r), Ym(i, t.value)); } -function Xm(e) { +function Qm(e) { return !e || e.value === void 0 || e.value === null || String(e.value).trim() === ""; } -function Zm(e, t) { - let n = Vm(t), r = 0; - for (let t of Object.keys(Nm)) { - let i = Hm(e, t); - if (!i || !Xm(i)) continue; +function $m(e, t) { + let n = Um(t), r = 0; + for (let t of Object.keys(Fm)) { + let i = Wm(e, t); + if (!i || !Qm(i)) continue; let a = n.find((e) => e.field === t); - a && (Km(i, a.value, e, t), qm(i, a.value), r += 1); + a && (Jm(i, a.value, e, t), Ym(i, a.value), r += 1); } return t?.graph?.setDirtyCanvas?.(!0, !0), t?.graph?.change?.(), t?.extensionManager?.toast?.add?.({ severity: r ? "success" : "warn", @@ -18675,34 +18682,34 @@ function Zm(e, t) { life: 3e3 }), r; } -function Qm(e, t) { - if (!(!e || String(e?.comfyClass || e?.type || "") !== Am) && (Um(e), !(e.widgets ?? []).some((e) => e?.name === jm) && typeof e.addWidget == "function")) { - e.addWidget("button", jm, null, () => Zm(e, t)); - for (let n of Pm) { - let r = `${Mm} ${n.label}`; - (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => th(e, t, n.field)); +function eh(e, t) { + if (!(!e || String(e?.comfyClass || e?.type || "") !== Mm) && (Gm(e), !(e.widgets ?? []).some((e) => e?.name === Nm) && typeof e.addWidget == "function")) { + e.addWidget("button", Nm, null, () => $m(e, t)); + for (let n of Im) { + let r = `${Pm} ${n.label}`; + (e.widgets ?? []).some((e) => e?.name === r) || e.addWidget("button", r, null, () => rh(e, t, n.field)); } try { e.setSize?.(e.computeSize?.()), t?.graph?.setDirtyCanvas?.(!0, !0); } catch {} } } -function $m(e) { +function th(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 eh(e) { - if (Lm) return; +function nh(e) { + if (zm) return; let t = e?.api; - !t || typeof t.addEventListener != "function" || (Lm = !0, t.addEventListener("executed", (t) => { - let n = t?.detail?.node ?? t?.detail?.display_node, r = $m(t); - if (!n || !r) return; - let i = Xt(e, n); - !i || String(i?.comfyClass || i?.type || "") !== Am || Gm(i, r) && (e?.graph?.setDirtyCanvas?.(!0, !0), e?.graph?.change?.()); + !t || typeof t.addEventListener != "function" || (zm = !0, t.addEventListener("executed", (t) => { + let n = t?.detail?.node ?? t?.detail?.display_node; + if (!n) return; + let r = He(e, n); + !r || String(r?.comfyClass || r?.type || "") !== Mm || Xm(r, t?.detail?.output, e); })); } -function th(e, t, n = null) { - let r = Vm(t, n); +function rh(e, t, n = null) { + let r = Um(t, n); if (!r.length) { t?.extensionManager?.toast?.add?.({ severity: "warn", @@ -18716,75 +18723,67 @@ function th(e, t, n = null) { i.style.cssText = "position:fixed;inset:0;z-index:1000000;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center"; let a = document.createElement("div"); a.style.cssText = "width:min(720px,92vw);max-height:80vh;overflow:auto;background:#202020;color:#eee;border:1px solid #555;border-radius:8px;padding:12px;box-shadow:0 16px 48px rgba(0,0,0,.55);font:12px sans-serif"; - let o = n ? `Pick ${n.replace(/_/g, " ")}` : "Pick Gen Info from workflow"; - a.innerHTML = "
"; + let o = n ? R("genInfoOverride.pickField", "Pick {field}", { field: n.replace(/_/g, " ") }) : R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"); + a.innerHTML = "
"; let s = a.querySelector("strong"); s && (s.textContent = o); + let c = a.querySelector("[data-close]"); + c && (c.textContent = R("dialog.close", "Close")); 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 = () => { - Ym(e, t, n), i.remove(); + Zm(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 nh(e = null) { - if (Im) return; - let t = e || fe(); +function ih(e, t) { + if (String(e?.comfyClass || e?.type || "") !== Mm) return []; + let n = [{ + content: R("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"), + callback: () => rh(e, t) + }]; + for (let r of Im) n.push({ + content: `Pick ${r.label}`, + callback: () => rh(e, t, r.field) + }); + return n.push({ + content: Nm, + callback: () => $m(e, t) + }), n; +} +function ah(e = null) { + if (Rm) return; + let t = e || be(); if (!t || typeof t.registerExtension != "function") { - setTimeout(() => nh(e), 100); + setTimeout(() => ah(e), 100); return; } - Im = !0, eh(t), t.registerExtension({ - name: km, + Rm = !0, nh(t), t.registerExtension({ + name: jm, async nodeCreated(e) { - Qm(e, t); + eh(e, t); }, - async beforeRegisterNodeDef(e, n) { - if (String(n?.name || "") !== Am) return; - let r = e.prototype.onNodeCreated; - e.prototype.onNodeCreated = function() { - let e = r?.apply?.(this, arguments); - return Qm(this, t), e; - }; - let i = e.prototype.onExecuted; - e.prototype.onExecuted = function(e) { - let n = i?.apply?.(this, arguments); - return Jm(this, e, t), n; - }; - let a = e.prototype.getExtraMenuOptions; - e.prototype.getExtraMenuOptions = function(e, n) { - a?.apply?.(this, arguments), n.push({ - content: "Pick Gen Info from workflow", - callback: () => th(this, t) - }); - for (let e of Pm) n.push({ - content: `Pick ${e.label}`, - callback: () => th(this, t, e.field) - }); - n.push({ - content: jm, - callback: () => Zm(this, t) - }); - }; + getNodeMenuItems(e) { + return ih(e, t); } }), setTimeout(() => { - for (let { graph: e } of Zt(t)) for (let n of Yt(e)) Qm(n, t); + for (let { graph: e } of Ue(t)) for (let n of Ve(e)) eh(n, t); }, 0); } //#endregion //#region ui/vue/components/viewer/FloatingViewerHost.vue -var rh = { +var oh = { __name: "FloatingViewerHost", setup(e) { - let t = K(null), n = null; + let t = J(null), n = null; return bn(() => { - n = Qe(t.value); + n = et(t.value); }), Sn(() => { n?.(), n = null; - }), (e, n) => (H(), G("div", { + }), (e, n) => (W(), q("div", { ref_key: "hostRef", ref: t, class: "mjr-viewer-runtime-host mjr-viewer-runtime-host--floating", @@ -18796,15 +18795,15 @@ var rh = { } }, null, 512)); } -}, ih = { +}, sh = { __name: "ViewerOverlayHost", setup(e) { - let t = K(null), n = null; + let t = J(null), n = null; return bn(() => { - n = tt(t.value); + n = rt(t.value); }), Sn(() => { n?.(), n = null; - }), (e, n) => (H(), G("div", { + }), (e, n) => (W(), q("div", { ref_key: "hostRef", ref: t, class: "mjr-viewer-runtime-host mjr-viewer-runtime-host--main", @@ -18816,10 +18815,10 @@ var rh = { } }, null, 512)); } -}, ah = ["aria-busy"], oh = ["aria-label"], sh = { +}, ch = ["aria-busy"], lh = ["aria-label"], uh = { key: 0, class: "mjr-tags-empty" -}, ch = { class: "mjr-tags-input-wrap" }, lh = ["aria-selected", "onMouseenter"], uh = 100, dh = 200, fh = { +}, dh = { class: "mjr-tags-input-wrap" }, fh = ["aria-selected", "onMouseenter"], ph = 100, mh = 200, hh = { __name: "TagsEditor", props: { asset: { @@ -18840,7 +18839,7 @@ var rh = { function n(e) { try { let t = String(e ?? "").trim(); - if (!t || t.length > uh) return null; + if (!t || t.length > ph) return null; for (let e = 0; e < t.length; e += 1) { let n = t.charCodeAt(e); if (n <= 31 || n === 127) return null; @@ -18850,246 +18849,246 @@ var rh = { return null; } } - function i(e) { + function r(e) { try { return String(e ?? "").replace(/[\x00-\x1f\x7f]/g, "").trim() || null; } catch { return null; } } - function a(e) { - let t = i(e); + function i(e) { + let t = r(e); return t ? t.toLowerCase() : ""; } - function o(e) { + function a(e) { let t = [], n = /* @__PURE__ */ new Set(); - for (let r of Array.isArray(e) ? e : []) { - let e = i(r); + for (let i of Array.isArray(e) ? e : []) { + let e = r(i); if (!e) continue; let a = e.toLowerCase(); - if (!n.has(a) && (n.add(a), t.push(e), t.length >= dh)) break; + if (!n.has(a) && (n.add(a), t.push(e), t.length >= mh)) break; } return t; } - function c(e) { - if (Array.isArray(e)) return o(e); + function o(e) { + if (Array.isArray(e)) return a(e); if (typeof e == "string") { let t = e.trim(); if (!t) return []; try { let e = JSON.parse(t); - if (Array.isArray(e)) return o(e); + if (Array.isArray(e)) return a(e); } catch { - return o(t.split(",")); + return a(t.split(",")); } } return []; } - function l(e, t) { + function s(e, t) { if (!Array.isArray(e) || !Array.isArray(t) || e.length !== t.length) return !1; for (let n = 0; n < e.length; n += 1) if (e[n] !== t[n]) return !1; return !0; } - let u = e, d = t, f = c(u.asset?.tags ?? u.modelValue ?? []), p = K([...f]), m = K(null), h = K(""), g = K(!1), _ = K(-1), v = K(null), y = K([]), b = K(!1), x = (e) => e?.$el || e || null, S = !1, C = !1, w = null, T = [...f], E = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), D = (e) => new Promise((t) => setTimeout(t, e)), O = () => setTimeout(() => g.value = !1, 200), k = X(() => { - let e = h.value.toLowerCase().trim(); + let c = e, l = t, u = o(c.asset?.tags ?? c.modelValue ?? []), d = J([...u]), f = J(null), p = J(""), h = J(!1), g = J(-1), _ = J(null), v = J([]), y = J(!1), b = (e) => e?.$el || e || null, x = !1, S = !1, C = null, w = [...u], T = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), D = (e) => new Promise((t) => setTimeout(t, e)), O = () => setTimeout(() => h.value = !1, 200), k = Z(() => { + let e = p.value.toLowerCase().trim(); if (!e) return []; - let t = new Set(p.value.map((e) => a(e)).filter(Boolean)); - return y.value.filter((n) => { - let r = a(n); + let t = new Set(d.value.map((e) => i(e)).filter(Boolean)); + return v.value.filter((n) => { + let r = i(n); return n.toLowerCase().includes(e) && (!r || !t.has(r)); }).slice(0, 10); - }), A = X(() => k.value.length > 0); + }), A = Z(() => k.value.length > 0); function j(e) { - if (S) return; - let t = c(e); - T = [...t], l(t, p.value) || (p.value = [...t]); + if (x) return; + let t = o(e); + w = [...t], s(t, d.value) || (d.value = [...t]); } - function N(e) { - let t = [...e], n = u.asset?.id == null ? "" : String(u.asset.id); - d("update:modelValue", t), d("tags-change", { - assetId: u.asset?.id, + function M(e) { + let t = [...e], n = c.asset?.id == null ? "" : String(c.asset.id); + l("update:modelValue", t), l("tags-change", { + assetId: c.asset?.id, tags: t - }), ht(Kt, { + }), kt(Xt, { assetId: n, tags: t }); } - async function P() { - if (u.disabled) return; - if (S) { - C = !0; + async function N() { + if (c.disabled) return; + if (x) { + S = !0; try { - w?.abort?.(); + C?.abort?.(); } catch (e) { console.debug?.(e); } return; } - S = !0, b.value = !0; + x = !0, y.value = !0; let e = 0; for (; e < 10;) { - e > 0 && await D(E(e)), e += 1; - let t = c(p.value), n = typeof AbortController < "u" ? new AbortController() : null; - w = n; - let i = null; + e > 0 && await D(T(e)), e += 1; + let t = o(d.value), n = typeof AbortController < "u" ? new AbortController() : null; + C = n; + let r = null; try { - i = await M(u.asset, t, n ? { signal: n.signal } : {}); + r = await re(c.asset, t, n ? { signal: n.signal } : {}); } catch (e) { console.error("Failed to update tags:", e); } - if (!i?.ok) { - if (i?.code === "ABORTED") { - if (C) { - C = !1; + if (!r?.ok) { + if (r?.code === "ABORTED") { + if (S) { + S = !1; continue; } break; } - let e = [...T]; - p.value = e, d("update:modelValue", e), s(i?.error || r("toast.tagsUpdateFailed", "Failed to update tags"), "error"), S = !1, w = null, b.value = !1; + let e = [...w]; + d.value = e, l("update:modelValue", e), m(r?.error || R("toast.tagsUpdateFailed", "Failed to update tags"), "error"), x = !1, C = null, y.value = !1; return; } try { - let e = i?.data?.asset_id ?? null; - e != null && !Ve(u.asset.id) && (u.asset.id = e); + let e = r?.data?.asset_id ?? null; + e != null && !Ie(c.asset.id) && (c.asset.id = e); } catch (e) { console.debug?.(e); } - let a = c(Array.isArray(i?.data?.tags) ? i.data.tags : t); - T = [...a]; + let i = o(Array.isArray(r?.data?.tags) ? r.data.tags : t); + w = [...i]; try { - u.asset.tags = [...a]; + c.asset.tags = [...i]; } catch (e) { console.debug?.(e); } - if (C || (p.value = [...a]), N(a), s(r("toast.tagsUpdated", "Tags updated"), "success", 1e3), !C) break; - C = !1; + if (S || (d.value = [...i]), M(i), m(R("toast.tagsUpdated", "Tags updated"), "success", 1e3), !S) break; + S = !1; } if (e >= 10) { - let e = [...T]; - p.value = e; + let e = [...w]; + d.value = e; try { - u.asset.tags = [...e]; + c.asset.tags = [...e]; } catch (e) { console.debug?.(e); } - d("update:modelValue", e), s(r("toast.tagsUpdateFailed", "Failed to update tags"), "error"); + l("update:modelValue", e), m(R("toast.tagsUpdateFailed", "Failed to update tags"), "error"); } - S = !1, w = null, b.value = !1; + x = !1, C = null, y.value = !1; } bn(async () => { try { - let e = await le(); - e?.ok && Array.isArray(e?.data) && (y.value = o(e.data)); + let e = await E(); + e?.ok && Array.isArray(e?.data) && (v.value = a(e.data)); } catch (e) { console.warn("Failed to load available tags:", e); } }), yn(() => { try { - w?.abort?.(); + C?.abort?.(); } catch (e) { console.debug?.(e); } }); - function F(e) { - if (u.disabled) return; + function P(e) { + if (c.disabled) return; let t = n(e); if (!t) return; - let i = a(t); - if (i && !p.value.some((e) => a(e) === i)) { - if (p.value.length >= dh) { - s(r("toast.maxTagsReached", "Maximum number of tags reached"), "warning"); + let r = i(t); + if (r && !d.value.some((e) => i(e) === r)) { + if (d.value.length >= mh) { + m(R("toast.maxTagsReached", "Maximum number of tags reached"), "warning"); return; } - p.value = [...p.value, t], P(); + d.value = [...d.value, t], N(); } } - function ee(e) { - if (u.disabled || e < 0 || e >= p.value.length) return; - let t = [...p.value]; - t.splice(e, 1), p.value = t, P(); + function F(e) { + if (c.disabled || e < 0 || e >= d.value.length) return; + let t = [...d.value]; + t.splice(e, 1), d.value = t, N(); } - function te(e) { + function I(e) { if (e.key === "Enter" || e.key === ",") { e.preventDefault(); - let t = h.value.trim(); - t && (F(t), h.value = "", g.value = !1, _.value = -1, v.value = null); + let t = p.value.trim(); + t && (P(t), p.value = "", h.value = !1, g.value = -1, _.value = null); return; } if (e.key === "Escape") { - g.value = !1, _.value = -1, v.value = null; + h.value = !1, g.value = -1, _.value = null; return; } if (e.key === "ArrowDown") { - e.preventDefault(), A.value && (_.value = Math.min(_.value + 1, k.value.length - 1)); + e.preventDefault(), A.value && (g.value = Math.min(g.value + 1, k.value.length - 1)); return; } if (e.key === "ArrowUp") { - e.preventDefault(), _.value = Math.max(_.value - 1, 0); + e.preventDefault(), g.value = Math.max(g.value - 1, 0); return; } if (e.key === "Tab" && A.value) { e.preventDefault(); - let t = k.value[_.value] || k.value[0]; - t && (h.value = t); + let t = k.value[g.value] || k.value[0]; + t && (p.value = t); } } - function ne(e) { - F(e), h.value = "", g.value = !1, _.value = -1, v.value = null, x(m.value)?.focus(); + function ee(e) { + P(e), p.value = "", h.value = !1, g.value = -1, _.value = null, b(f.value)?.focus(); } - function re(e) { - let t = e?.value ?? v.value; - t && ne(t); + function te(e) { + let t = e?.value ?? _.value; + t && ee(t); } - return mn(() => u.modelValue, (e) => { + return mn(() => c.modelValue, (e) => { j(e); - }), mn(() => u.asset?.tags, (e) => { + }), mn(() => c.asset?.tags, (e) => { j(e); }), (t, n) => { - let i = Ln("MButton"), a = Ln("MInputText"), o = Ln("MListbox"); - return H(), G("div", { + let r = Rn("MButton"), i = Rn("MInputText"), a = Rn("MListbox"); + return W(), q("div", { class: Mn(["mjr-tags-editor", { "is-disabled": e.disabled }]), - "aria-busy": b.value - }, [W("div", { + "aria-busy": y.value + }, [K("div", { class: "mjr-tags-display", role: "list", - "aria-label": J(r)("tags.label", "Tags") - }, [p.value.length === 0 ? (H(), G("span", sh, q(J(r)("msg.noTagsYet", "No tags yet...")), 1)) : (H(!0), G(In, { key: 1 }, vn(p.value, (t, a) => (H(), G("div", { + "aria-label": X(R)("tags.label", "Tags") + }, [d.value.length === 0 ? (W(), q("span", uh, Y(X(R)("msg.noTagsYet", "No tags yet...")), 1)) : (W(!0), q(Ln, { key: 1 }, vn(d.value, (t, i) => (W(), q("div", { key: t, class: "mjr-tag-chip", role: "listitem" - }, [gn(q(t) + " ", 1), V(i, { + }, [gn(Y(t) + " ", 1), U(r, { type: "button", class: "mjr-tag-chip-remove", severity: "secondary", text: "", rounded: "", - "aria-label": J(r)("tags.remove", "Remove tag"), + "aria-label": X(R)("tags.remove", "Remove tag"), disabled: e.disabled, - onClick: (e) => ee(a) + onClick: (e) => F(i) }, { - default: U(() => [...n[4] ||= [gn(" × ", -1)]]), + default: G(() => [...n[4] ||= [gn(" × ", -1)]]), _: 1 }, 8, [ "aria-label", "disabled", "onClick" - ])]))), 128))], 8, oh), W("div", ch, [V(a, { + ])]))), 128))], 8, lh), K("div", dh, [U(i, { ref_key: "inputRef", - ref: m, - modelValue: h.value, - "onUpdate:modelValue": n[0] ||= (e) => h.value = e, + ref: f, + modelValue: p.value, + "onUpdate:modelValue": n[0] ||= (e) => p.value = e, type: "text", class: "mjr-tag-input", - placeholder: J(r)("sidebar.addTag", "Add tag..."), + placeholder: X(R)("sidebar.addTag", "Add tag..."), disabled: e.disabled, - "aria-label": J(r)("tags.addLabel", "Add tag"), + "aria-label": X(R)("tags.addLabel", "Add tag"), "aria-autocomplete": A.value ? "list" : "none", - "aria-expanded": g.value, + "aria-expanded": h.value, "aria-haspopup": A.value ? "listbox" : void 0, - onFocus: n[1] ||= (e) => g.value = h.value.length > 0, - onInput: n[2] ||= (e) => g.value = h.value.length > 0, - onKeydown: te, + onFocus: n[1] ||= (e) => h.value = p.value.length > 0, + onInput: n[2] ||= (e) => h.value = p.value.length > 0, + onKeydown: I, onBlur: O }, null, 8, [ "modelValue", @@ -19099,47 +19098,47 @@ var rh = { "aria-autocomplete", "aria-expanded", "aria-haspopup" - ]), Tn(V(o, { - modelValue: v.value, - "onUpdate:modelValue": n[3] ||= (e) => v.value = e, + ]), Tn(U(a, { + modelValue: _.value, + "onUpdate:modelValue": n[3] ||= (e) => _.value = e, options: k.value, class: "mjr-tags-dropdown", "scroll-height": "150px", - "aria-label": J(r)("tags.suggestions", "Tag suggestions"), - onChange: re + "aria-label": X(R)("tags.suggestions", "Tag suggestions"), + onChange: te }, { - option: U(({ option: e, index: t }) => [W("div", { - class: Mn(["mjr-tag-suggestion", { "is-active": t === _.value }]), - "aria-selected": t === _.value, - onMouseenter: (e) => _.value = t - }, q(e), 43, lh)]), + option: G(({ option: e, index: t }) => [K("div", { + class: Mn(["mjr-tag-suggestion", { "is-active": t === g.value }]), + "aria-selected": t === g.value, + onMouseenter: (e) => g.value = t + }, Y(e), 43, fh)]), _: 1 }, 8, [ "modelValue", "options", "aria-label" - ]), [[kn, g.value && A.value]])])], 10, ah); + ]), [[kn, h.value && A.value]])])], 10, ch); }; } -}, ph = { +}, gh = { key: 0, class: "mjr-context-menu-separator" -}, mh = { class: "mjr-context-menu-item-left" }, hh = { class: "mjr-context-menu-item-right" }, gh = { +}, _h = { class: "mjr-context-menu-item-left" }, vh = { class: "mjr-context-menu-item-right" }, yh = { key: 0, class: "mjr-context-menu-hint" -}, _h = { +}, bh = { key: 1, class: "mjr-context-menu-submenu-arrow" -}, vh = { +}, xh = { key: 0, class: "mjr-context-menu-separator" -}, yh = { class: "mjr-context-menu-item-left" }, bh = { +}, Sh = { class: "mjr-context-menu-item-left" }, Ch = { key: 0, class: "mjr-context-menu-hint" -}, xh = { +}, wh = { __name: "ViewerContextMenu", setup(e) { - let t = K(null), n = K(null), r = K(null), i = null, a = null, o = X(() => l(Z.main, 10041)), s = X(() => l(Z.submenu, 10042)), c = X(() => l(Z.tags, 10043)); + let t = J(null), n = J(null), r = J(null), i = null, a = null, o = Z(() => l(_i.main, 10041)), s = Z(() => l(_i.submenu, 10042)), c = Z(() => l(_i.tags, 10043)); function l(e, t) { return { position: "fixed", @@ -19154,7 +19153,7 @@ var rh = { } function d() { u(), i = setTimeout(() => { - Ti(); + Di(); }, 180); } function f(e, t) { @@ -19174,14 +19173,14 @@ var rh = { } function h(e, t) { if (!Array.isArray(e?.submenu) || !e.submenu.length) { - Ti(); + Di(); return; } u(); let n = (t?.currentTarget)?.getBoundingClientRect?.(); - wi({ - x: Math.round((n?.right || Z.main.x || 0) + 6), - y: Math.round((n?.top || Z.main.y || 0) - 4), + Ei({ + x: Math.round((n?.right || _i.main.x || 0) + 6), + y: Math.round((n?.top || _i.main.y || 0) - 4), items: e.submenu, title: e.label || "" }); @@ -19197,7 +19196,7 @@ var rh = { } catch (e) { console.error("[ViewerContextMenu.vue] Action failed:", e); } finally { - e.closeOnSelect === !1 ? n === "submenu" && Ti() : Oi(); + e.closeOnSelect === !1 ? n === "submenu" && Di() : Ai(); } } } @@ -19206,7 +19205,7 @@ var rh = { h(e, t); return; } - Ti(); + Di(); } function v(e) { Array.isArray(e?.submenu) && e.submenu.length && d(); @@ -19219,35 +19218,35 @@ var rh = { } function x(e) { let i = e?.target; - t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || Oi(); + t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || Ai(); } function S(e) { - e?.key === "Escape" && Oi(); + e?.key === "Escape" && Ai(); } function C() { - Oi(); + Ai(); } function w(e) { - String(e?.detail?.source || "") !== "viewer" && Oi(); + String(e?.detail?.source || "") !== "viewer" && Ai(); } function T(e) { - let t = Z.tags.asset; + let t = _i.tags.asset; t && (t.tags = Array.isArray(e) ? [...e] : []); } function E(e) { let t = Array.isArray(e?.tags) ? e.tags : []; try { - Z.tags.onChanged?.(t); + _i.tags.onChanged?.(t); } catch (e) { console.debug?.(e); } } - return mn(() => Z.main.open, async (e) => { - e && (await p(Z.main, t), m(t)); - }), mn(() => Z.submenu.open, async (e) => { - e && (await p(Z.submenu, n), m(n)); - }), mn(() => Z.tags.open, async (e) => { - e && await p(Z.tags, r); + return mn(() => _i.main.open, async (e) => { + e && (await p(_i.main, t), m(t)); + }), mn(() => _i.submenu.open, async (e) => { + e && (await p(_i.submenu, n), m(n)); + }), mn(() => _i.tags.open, async (e) => { + e && await p(_i.tags, r); }), bn(() => { a = new AbortController(); let e = { @@ -19269,11 +19268,11 @@ var rh = { } catch (e) { console.debug?.(e); } - a = null, Oi(); + a = null, Ai(); }), (e, i) => { - let a = Ln("MButton"); - return H(), hn(jn, { to: "body" }, [ - J(Z).main.open ? (H(), G("div", { + let a = Rn("MButton"); + return W(), hn(jn, { to: "body" }, [ + X(_i).main.open ? (W(), q("div", { key: 0, ref_key: "mainMenuRef", ref: t, @@ -19281,7 +19280,7 @@ var rh = { style: An(o.value), role: "menu", "aria-label": "Viewer context menu" - }, [(H(!0), G(In, null, vn(J(Z).main.items, (e) => (H(), G(In, { key: e.id }, [e.type === "separator" ? (H(), G("div", ph)) : (H(), hn(a, { + }, [(W(!0), q(Ln, null, vn(X(_i).main.items, (e) => (W(), q(Ln, { key: e.id }, [e.type === "separator" ? (W(), q("div", gh)) : (W(), hn(a, { key: 1, type: "button", class: Mn(["mjr-context-menu-item", { @@ -19297,10 +19296,10 @@ var rh = { onMouseenter: (t) => _(e, t), onMouseleave: (t) => v(e) }, { - default: U(() => [W("span", mh, [e.iconClass ? (H(), G("i", { + default: G(() => [K("span", _h, [e.iconClass ? (W(), q("i", { key: 0, class: Mn(e.iconClass) - }, null, 2)) : Y("", !0), W("span", null, q(e.label), 1)]), W("span", hh, [e.rightHint ? (H(), G("span", gh, q(e.rightHint), 1)) : Y("", !0), Array.isArray(e.submenu) && e.submenu.length ? (H(), G("span", _h, " > ")) : Y("", !0)])]), + }, null, 2)) : In("", !0), K("span", null, Y(e.label), 1)]), K("span", vh, [e.rightHint ? (W(), q("span", yh, Y(e.rightHint), 1)) : In("", !0), Array.isArray(e.submenu) && e.submenu.length ? (W(), q("span", bh, " > ")) : In("", !0)])]), _: 2 }, 1032, [ "class", @@ -19309,8 +19308,8 @@ var rh = { "onClick", "onMouseenter", "onMouseleave" - ]))], 64))), 128))], 4)) : Y("", !0), - J(Z).submenu.open ? (H(), G("div", { + ]))], 64))), 128))], 4)) : In("", !0), + X(_i).submenu.open ? (W(), q("div", { key: 1, ref_key: "submenuRef", ref: n, @@ -19320,7 +19319,7 @@ var rh = { "aria-label": "Viewer context submenu", onMouseenter: y, onMouseleave: b - }, [(H(!0), G(In, null, vn(J(Z).submenu.items, (e) => (H(), G(In, { key: e.id }, [e.type === "separator" ? (H(), G("div", vh)) : (H(), hn(a, { + }, [(W(!0), q(Ln, null, vn(X(_i).submenu.items, (e) => (W(), q(Ln, { key: e.id }, [e.type === "separator" ? (W(), q("div", xh)) : (W(), hn(a, { key: 1, type: "button", class: Mn(["mjr-context-menu-item", { "is-disabled": e.disabled }]), @@ -19331,43 +19330,43 @@ var rh = { tabindex: e.disabled ? -1 : 0, onClick: (t) => g(e, t, "submenu") }, { - default: U(() => [W("span", yh, [e.iconClass ? (H(), G("i", { + default: G(() => [K("span", Sh, [e.iconClass ? (W(), q("i", { key: 0, class: Mn(e.iconClass) - }, null, 2)) : Y("", !0), W("span", null, q(e.label), 1)]), e.rightHint ? (H(), G("span", bh, q(e.rightHint), 1)) : Y("", !0)]), + }, null, 2)) : In("", !0), K("span", null, Y(e.label), 1)]), e.rightHint ? (W(), q("span", Ch, Y(e.rightHint), 1)) : In("", !0)]), _: 2 }, 1032, [ "class", "aria-disabled", "tabindex", "onClick" - ]))], 64))), 128))], 36)) : Y("", !0), - J(Z).tags.open && J(Z).tags.asset ? (H(), G("div", { + ]))], 64))), 128))], 36)) : In("", !0), + X(_i).tags.open && X(_i).tags.asset ? (W(), q("div", { key: 2, ref_key: "tagsPopoverRef", ref: r, class: "mjr-viewer-popover", style: An(c.value) - }, [V(fh, { - asset: J(Z).tags.asset, - "model-value": J(Z).tags.asset?.tags || [], + }, [U(hh, { + asset: X(_i).tags.asset, + "model-value": X(_i).tags.asset?.tags || [], "onUpdate:modelValue": T, onTagsChange: E - }, null, 8, ["asset", "model-value"])], 4)) : Y("", !0) + }, null, 8, ["asset", "model-value"])], 4)) : In("", !0) ]); }; } -}, Sh = { +}, Th = { __name: "ViewerContextMenuPortal", setup(e) { - let t = K(""), n = X(() => xi(t.value)); + let t = J(""), n = Z(() => Ci(t.value)); return bn(() => { - t.value = yi(); + t.value = xi(); }), Sn(() => { - bi(t.value), t.value = ""; - }), (e, t) => n.value ? (H(), hn(xh, { key: 0 })) : Y("", !0); + Si(t.value), t.value = ""; + }), (e, t) => n.value ? (W(), hn(wh, { key: 0 })) : In("", !0); } -}, Ch = { +}, Eh = { __name: "ViewerPortal", setup(e) { let t = null; @@ -19376,35 +19375,35 @@ var rh = { if (!r.length) return; let i = Math.max(0, Math.min(Number(n?.index) || 0, r.length - 1)), a = String(n?.mode || "").trim().toLowerCase(); try { - t ||= Qa(), t.open?.(r, i), (a === "ab" || a === "sidebyside") && t.setMode?.(a), n.handled = !0; + t ||= eo(), t.open?.(r, i), (a === "ab" || a === "sidebyside") && t.setMode?.(a), n.handled = !0; } catch (e) { console.debug?.(e); } } return bn(() => { try { - Ze(); + $e(); } catch (e) { console.debug?.(e); } try { - t = Qa(); + t = eo(); } catch (e) { console.debug?.(e); } try { - window.addEventListener(B.OPEN_VIEWER, n); + window.addEventListener(H.OPEN_VIEWER, n); } catch (e) { console.debug?.(e); } }), Sn(() => { try { - window.removeEventListener(B.OPEN_VIEWER, n); + window.removeEventListener(H.OPEN_VIEWER, n); } catch (e) { console.debug?.(e); } try { - et(); + nt(); } catch (e) { console.debug?.(e); } @@ -19414,20 +19413,20 @@ var rh = { console.debug?.(e); } t = null; - }), (e, t) => (H(), G(In, null, [ - V(ih), - V(rh), - V(Sh) + }), (e, t) => (W(), q(Ln, null, [ + U(sh), + U(oh), + U(Th) ], 64)); } }; //#endregion //#region ui/vue/composables/useDragDrop.ts -function wh() { +function Dh() { let e = null; bn(() => { try { - e = El() ?? null; + e = Ol() ?? null; } catch (e) { console.warn("[Majoor] useDragDrop: init failed", e); } @@ -19438,7 +19437,7 @@ function wh() { console.debug?.(e); } try { - Dl({ force: !0 }); + kl({ force: !0 }); } catch (e) { console.debug?.(e); } @@ -19447,12 +19446,12 @@ function wh() { } //#endregion //#region ui/vue/GlobalRuntime.vue -var Th = { +var Oh = { __name: "GlobalRuntime", setup(e) { - return wh(), (e, t) => (H(), hn(Ch)); + return Dh(), (e, t) => (W(), hn(Eh)); } -}, Eh = { +}, kh = { gridRenderCount: 0, gridRenderTotalMs: 0, searchQueryCount: 0, @@ -19463,20 +19462,20 @@ var Th = { thumbnailLoadCount: 0, thumbnailLoadFailures: 0, errorCounts: {} -}, Dh = /* @__PURE__ */ new Map(); -function Oh(e) { +}, Ah = /* @__PURE__ */ new Map(); +function jh(e) { let t = performance.now(); - Dh.set(e, t); + Ah.set(e, t); try { performance.mark(`${e}-start`); } catch {} } -function kh(e, t) { - let n = Dh.get(e); +function Mh(e, t) { + let n = Ah.get(e); if (!n) return console.warn(`[Majoor Metrics] Timer not found: ${e}`), 0; let r = performance.now() - n; - if (Dh.delete(e), t) { - let e = `${t}Count`, n = `${t}TotalMs`, i = Eh; + if (Ah.delete(e), t) { + let e = `${t}Count`, n = `${t}TotalMs`, i = kh; typeof i[e] == "number" && (i[e]++, i[n] += r); } r > 100 && console.log(`[Majoor Metrics] ${e}: ${r.toFixed(2)}ms`); @@ -19485,15 +19484,15 @@ function kh(e, t) { } catch {} return r; } -function Ah(e) { - return Dh.has(e); +function Nh(e) { + return Ah.has(e); } -function jh(e) { +function Ph(e) { try { performance.mark(`${e}-start`); } catch {} } -function Mh(e) { +function Fh(e) { try { performance.mark(`${e}-end`), performance.measure(e, `${e}-start`, `${e}-end`); let t = performance.getEntriesByName(e)[0]?.duration || 0; @@ -19502,47 +19501,47 @@ function Mh(e) { return null; } } -function Nh(e, t = !1) { - Eh.apiCallCount++, Eh.apiCallTotalMs += e, t && Eh.apiErrorCount++; +function Ih(e, t = !1) { + kh.apiCallCount++, kh.apiCallTotalMs += e, t && kh.apiErrorCount++; } -function Ph(e) { - Eh.gridRenderCount++, Eh.gridRenderTotalMs += e; +function Lh(e) { + kh.gridRenderCount++, kh.gridRenderTotalMs += e; } -function Fh(e) { - Eh.searchQueryCount++, Eh.searchQueryTotalMs += e; +function Rh(e) { + kh.searchQueryCount++, kh.searchQueryTotalMs += e; } -function Ih(e) { - Eh.thumbnailLoadCount++, e || Eh.thumbnailLoadFailures++; +function zh(e) { + kh.thumbnailLoadCount++, e || kh.thumbnailLoadFailures++; } -function Lh(e, t) { - Eh.errorCounts[e] = (Eh.errorCounts[e] || 0) + 1; +function Bh(e, t) { + kh.errorCounts[e] = (kh.errorCounts[e] || 0) + 1; } -function Rh() { +function Vh() { return { - ...Eh, + ...kh, averages: { - gridRenderMs: Eh.gridRenderCount > 0 ? Eh.gridRenderTotalMs / Eh.gridRenderCount : 0, - searchQueryMs: Eh.searchQueryCount > 0 ? Eh.searchQueryTotalMs / Eh.searchQueryCount : 0, - apiCallMs: Eh.apiCallCount > 0 ? Eh.apiCallTotalMs / Eh.apiCallCount : 0 + gridRenderMs: kh.gridRenderCount > 0 ? kh.gridRenderTotalMs / kh.gridRenderCount : 0, + searchQueryMs: kh.searchQueryCount > 0 ? kh.searchQueryTotalMs / kh.searchQueryCount : 0, + apiCallMs: kh.apiCallCount > 0 ? kh.apiCallTotalMs / kh.apiCallCount : 0 }, rates: { - apiErrorRate: Eh.apiCallCount > 0 ? (Eh.apiErrorCount / Eh.apiCallCount * 100).toFixed(2) + "%" : "0%", - thumbnailFailureRate: Eh.thumbnailLoadCount > 0 ? (Eh.thumbnailLoadFailures / Eh.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" + apiErrorRate: kh.apiCallCount > 0 ? (kh.apiErrorCount / kh.apiCallCount * 100).toFixed(2) + "%" : "0%", + thumbnailFailureRate: kh.thumbnailLoadCount > 0 ? (kh.thumbnailLoadFailures / kh.thumbnailLoadCount * 100).toFixed(2) + "%" : "0%" } }; } -function zh(e) { - let t = `${e}Count`, n = `${e}TotalMs`, r = Eh, i = r[t], a = r[n]; +function Hh(e) { + let t = `${e}Count`, n = `${e}TotalMs`, r = kh, i = r[t], a = r[n]; return i > 0 ? a / i : 0; } -function Bh() { - let e = Eh; +function Uh() { + let e = kh; Object.keys(e).forEach((t) => { typeof e[t] == "number" ? e[t] = 0 : typeof e[t] == "object" && (e[t] = {}); - }), Dh.clear(), console.log("[Majoor Metrics] Metrics reset"); + }), Ah.clear(), console.log("[Majoor Metrics] Metrics reset"); } -function Vh() { - let e = Rh(); +function Wh() { + let e = Vh(); console.group("[Majoor Assets Manager] Performance Metrics"), console.table({ "Grid Renders": e.gridRenderCount, "Avg Grid Render": `${e.averages.gridRenderMs.toFixed(2)}ms`, @@ -19555,27 +19554,27 @@ function Vh() { "Thumbnail Loads": e.thumbnailLoadCount, "Thumbnail Failures": e.thumbnailLoadFailures, "Failure Rate": e.rates.thumbnailFailureRate - }), Object.keys(Eh.errorCounts).length > 0 && console.log("Error Counts:", Eh.errorCounts), console.groupEnd(); + }), Object.keys(kh.errorCounts).length > 0 && console.log("Error Counts:", kh.errorCounts), console.groupEnd(); } typeof window < "u" && (window.MajoorMetrics = { - startTimer: Oh, - endTimer: kh, - hasTimer: Ah, - mark: jh, - measure: Mh, - trackApiCall: Nh, - trackGridRender: Ph, - trackSearchQuery: Fh, - trackThumbnailLoad: Ih, - trackError: Lh, - getMetricsReport: Rh, - getAverageDuration: zh, - resetMetrics: Bh, - exportMetrics: Vh + startTimer: jh, + endTimer: Mh, + hasTimer: Nh, + mark: Ph, + measure: Fh, + trackApiCall: Ih, + trackGridRender: Lh, + trackSearchQuery: Rh, + trackThumbnailLoad: zh, + trackError: Bh, + getMetricsReport: Vh, + getAverageDuration: Hh, + resetMetrics: Uh, + exportMetrics: Wh }); //#endregion //#region ui/features/status/StatusDot.ts -var Hh = [{ +var Gh = [{ key: "exiftool", labelKey: "tool.exiftool", hintKey: "tool.exiftool.hint" @@ -19583,24 +19582,24 @@ var Hh = [{ key: "ffprobe", labelKey: "tool.ffprobe", hintKey: "tool.ffprobe.hint" -}], Uh = !1, Wh = null, Gh = null, Kh = "__MJR_STATUS_DOT_CACHE__", qh = { +}], Kh = !1, qh = null, Jh = null, Yh = "__MJR_STATUS_DOT_CACHE__", Xh = { ACTIVE: "active", COOLDOWN: "cooldown", IDLE: "idle" -}, Jh = { - [qh.ACTIVE]: 2e3, - [qh.COOLDOWN]: 1e4, - [qh.IDLE]: 6e4 +}, Zh = { + [Xh.ACTIVE]: 2e3, + [Xh.COOLDOWN]: 1e4, + [Xh.IDLE]: 6e4 }; -function Yh(e) { - Uh = !!e; +function Qh(e) { + Kh = !!e; try { - globalThis._mjrMaintenanceActive = Uh; + globalThis._mjrMaintenanceActive = Kh; } catch (e) { console.debug?.(e); } } -function Xh(e) { +function $h(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return "0 B"; let n = [ @@ -19614,7 +19613,7 @@ function Xh(e) { let a = r >= 100 ? 0 : r >= 10 ? 1 : 2; return `${r.toFixed(a)} ${n[i]}`; } -function Zh(e, t, n = null) { +function eg(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() !== "")) { @@ -19623,7 +19622,7 @@ function Zh(e, t, n = null) { t.style.fontSize = "11px", t.style.opacity = "0.6", t.textContent = String(n), e.appendChild(t); } } -function Qh(e, t = []) { +function tg(e, t = []) { if (!e) return; let n = Array.isArray(t) ? t.filter((e) => e && String(e.label || "").trim()) : []; if (!n.length) return; @@ -19643,7 +19642,7 @@ function Qh(e, t = []) { } e.appendChild(r); } -function $h(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r = 0 } = {}) { +function ng(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) => { @@ -19689,15 +19688,15 @@ function $h(e, { totalAssets: t = 0, withWorkflows: n = 0, withGenerationData: r } : null ].filter(Boolean); } -function eg(e, t, n) { +function rg(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 tg(e, t = "neutral", n = {}) { +function ig(e, t = "neutral", n = {}) { if (!e) return; - let i = n?.toast !== !1, a = { + let r = n?.toast !== !1, i = { neutral: { bg: "var(--bg-color, #1a1a1a)", border: "var(--border-color, #333)", @@ -19728,43 +19727,43 @@ function tg(e, t = "neutral", n = {}) { border: "rgba(0,150,136,0.58)", glow: "rgba(0,150,136,0.18)" } - }, o = a[t] || a.neutral, c = String(e.dataset?.mjrStatusTone || "neutral"); - if (e.style.background = o.bg, e.style.borderColor = o.border, e.style.boxShadow = `0 0 0 1px ${o.glow} inset`, e.dataset.mjrStatusTone = t, i && t !== c) { + }, a = i[t] || i.neutral, o = String(e.dataset?.mjrStatusTone || "neutral"); + if (e.style.background = a.bg, e.style.borderColor = a.border, e.style.boxShadow = `0 0 0 1px ${a.glow} inset`, e.dataset.mjrStatusTone = t, r && t !== o) { let n = Date.now(); if (n - (Number(e._mjrStatusToastAt || 0) || 0) >= 4e3) { e._mjrStatusToastAt = n; - let i = { - info: r("status.toast.info", "Index status: checking"), - success: r("status.toast.success", "Index status: ready"), - warning: r("status.toast.warning", "Index status: attention needed"), - error: r("status.toast.error", "Index status: error"), - browser: r("status.toast.browser", "Index status: browser scope") - }, a = t === "error" ? "error" : t === "warning" ? "warning" : t === "success" ? "success" : "info"; + let r = { + info: R("status.toast.info", "Index status: checking"), + success: R("status.toast.success", "Index status: ready"), + warning: R("status.toast.warning", "Index status: attention needed"), + error: R("status.toast.error", "Index status: error"), + browser: R("status.toast.browser", "Index status: browser scope") + }, i = t === "error" ? "error" : t === "warning" ? "warning" : t === "success" ? "success" : "info"; try { - s(i[t] || i.info, a, 1800, { noHistory: !0 }); + m(r[t] || r.info, i, 1800, { noHistory: !0 }); } catch (e) { console.debug?.(e); } } } } -function ng(e) { +function ag(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") : r("scope.output", "Outputs"); + return t === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : t === "input" || t === "inputs" ? R("scope.input", "Inputs") : t === "custom" ? R("scope.custom", "Browser") : R("scope.output", "Outputs"); } -function rg(e, t = "") { - if (!e || typeof e != "object") return t ? r("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: ng(t) }) : r("status.watcher.disabled", "Watcher: disabled"); - let n = !!e.enabled, i = e.scope ? String(e.scope) : ""; - return n ? i ? r("status.watcher.enabledScoped", `Watcher: enabled (${i})`, { scope: ng(i) }) : r("status.watcher.enabled", "Watcher: enabled") : i || t ? r("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: ng(t && i && i !== t ? t : i || t) }) : r("status.watcher.disabled", "Watcher: disabled"); +function og(e, t = "") { + if (!e || typeof e != "object") return t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: ag(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: ag(r) }) : R("status.watcher.enabled", "Watcher: enabled") : r || t ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: ag(t && r && r !== t ? t : r || t) }) : R("status.watcher.disabled", "Watcher: disabled"); } -function ig(e = "status-action") { +function sg(e = "status-action") { try { window?.dispatchEvent?.(new CustomEvent("mjr:reload-grid", { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } -function ag(e = "status-action", t = {}) { +function cg(e = "status-action", t = {}) { try { window?.dispatchEvent?.(new CustomEvent("mjr-grid-dirty", { detail: { reason: String(e || "status-action"), @@ -19774,136 +19773,136 @@ function ag(e = "status-action", t = {}) { console.debug?.(e); } } -function og(e = "") { +function lg(e = "") { try { - window?.dispatchEvent?.(new CustomEvent(B.OPEN_MESSAGE_HISTORY, { detail: { reason: String(e || "status-action") } })); + window?.dispatchEvent?.(new CustomEvent(H.OPEN_MESSAGE_HISTORY, { detail: { reason: String(e || "status-action") } })); } catch (e) { console.debug?.(e); } } -async function sg(e = "") { - return await gt(r("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || r("dialog.vectorsReset.title", "AI vectors")); +async function ug(e = "") { + return await Bt(R("dialog.vectorsReset.keepQuestion", "Keep existing AI vectors?\n\nConfirm = keep vectors\nCancel = continue without vectors"), e || R("dialog.vectorsReset.title", "AI vectors")); } -function cg(t = {}) { - let n = typeof t?.getScanContext == "function" ? t.getScanContext : null; - Yh(!1); +function dg(e = {}) { + let t = typeof e?.getScanContext == "function" ? e.getScanContext : null; + Qh(!1); + let n = document.createElement("div"); + n.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;", ig(n, "info", { toast: !1 }); let i = document.createElement("div"); - i.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;", tg(i, "info", { toast: !1 }); - let a = document.createElement("div"); - a.style.cssText = "display: flex; align-items: center; gap: 10px; margin-bottom: 8px;"; + i.style.cssText = "display: flex; align-items: center; gap: 10px; margin-bottom: 8px;"; + let a = document.createElement("span"); + a.id = "mjr-status-dot", a.style.cssText = "width: 12px; height: 12px; border-radius: 50%; background: var(--mjr-status-info, #64B5F6); display: inline-block; cursor: pointer;"; let o = document.createElement("span"); - o.id = "mjr-status-dot", o.style.cssText = "width: 12px; height: 12px; border-radius: 50%; background: var(--mjr-status-info, #64B5F6); display: inline-block; cursor: pointer;"; - let c = document.createElement("span"); - c.id = "mjr-status-title", c.style.cssText = "font-weight: 500; font-size: 13px; cursor: pointer;"; - let l = document.createElement("span"); - l.id = "mjr-status-title-indicator", l.style.marginRight = "6px", l.textContent = "v", c.appendChild(l), c.appendChild(document.createTextNode(r("status.indexStatus", "Index Status"))), a.appendChild(o), a.appendChild(c); - let u = document.createElement("div"); - u.id = "mjr-status-body", u.style.marginLeft = "22px"; - let f = document.createElement("div"); - f.id = "mjr-status-text", f.style.cssText = "font-size: 12px; opacity: 0.8;", f.textContent = r("status.checking"); + o.id = "mjr-status-title", o.style.cssText = "font-weight: 500; font-size: 13px; cursor: pointer;"; + let s = document.createElement("span"); + s.id = "mjr-status-title-indicator", s.style.marginRight = "6px", s.textContent = "v", o.appendChild(s), o.appendChild(document.createTextNode(R("status.indexStatus", "Index Status"))), i.appendChild(a), i.appendChild(o); + let l = document.createElement("div"); + l.id = "mjr-status-body", l.style.marginLeft = "22px"; + let d = document.createElement("div"); + d.id = "mjr-status-text", d.style.cssText = "font-size: 12px; opacity: 0.8;", d.textContent = R("status.checking"); let p = document.createElement("div"); - p.id = "mjr-status-capabilities", p.style.cssText = "font-size: 11px; opacity: 0.75; margin-top: 10px; display: flex; gap: 6px; flex-wrap: wrap;", p.textContent = r("status.discoveringTools"), u.appendChild(f), u.appendChild(p); - let m = document.createElement("div"); - m.id = "mjr-tools-status", m.style.cssText = "font-size: 11px; opacity: 0.7; margin-top: 10px;", m.textContent = r("status.toolStatusChecking", "Tool status: checking..."), u.appendChild(m); + p.id = "mjr-status-capabilities", p.style.cssText = "font-size: 11px; opacity: 0.75; margin-top: 10px; display: flex; gap: 6px; flex-wrap: wrap;", p.textContent = R("status.discoveringTools"), l.appendChild(d), l.appendChild(p); let h = document.createElement("div"); - h.style.cssText = "margin-top: 10px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap;"; - let v = document.createElement("select"); - v.style.cssText = "\n min-width: 240px;\n padding: 4px 8px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.2);\n background: rgba(255,255,255,0.04);\n color: inherit;\n ", v.title = r("status.dbBackupSelectHint", "Select a DB backup to restore"); - let y = !1, b = null, x = (e) => { - v.replaceChildren(); + h.id = "mjr-tools-status", h.style.cssText = "font-size: 11px; opacity: 0.7; margin-top: 10px;", h.textContent = R("status.toolStatusChecking", "Tool status: checking..."), l.appendChild(h); + let g = document.createElement("div"); + g.style.cssText = "margin-top: 10px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap;"; + let _ = document.createElement("select"); + _.style.cssText = "\n min-width: 240px;\n padding: 4px 8px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.2);\n background: rgba(255,255,255,0.04);\n color: inherit;\n ", _.title = R("status.dbBackupSelectHint", "Select a DB backup to restore"); + let v = !1, y = null, x = (e) => { + _.replaceChildren(); let t = document.createElement("option"); - t.value = "", t.textContent = String(e || ""), t.disabled = !0, t.selected = !0, v.appendChild(t), y = !1, v.disabled = !0, b && (b.disabled = !0); + t.value = "", t.textContent = String(e || ""), t.disabled = !0, t.selected = !0, _.appendChild(t), v = !1, _.disabled = !0, y && (y.disabled = !0); }; - x(r("status.dbBackupLoading", "Loading DB backups...")); + x(R("status.dbBackupLoading", "Loading DB backups...")); let S = async (e = "") => { try { - let t = await d(); + let t = await c(); if (!t?.ok) { - x(r("status.dbBackupNone", "No DB backup found")); + x(R("status.dbBackupNone", "No DB backup found")); return; } let n = Array.isArray(t?.data?.items) ? t.data.items : []; if (!n.length) { - x(r("status.dbBackupNone", "No DB backup found")); + x(R("status.dbBackupNone", "No DB backup found")); return; } - v.replaceChildren(); - let i = !1; + _.replaceChildren(); + let r = !1; for (let t of n) { let n = String(t?.name || ""); if (!n) continue; - let r = Number(t?.mtime || 0), a = Number(t?.size_bytes || 0), o = r > 0 ? (/* @__PURE__ */ new Date(r * 1e3)).toLocaleString() : "", s = `${n}${o ? ` (${o}` : ""}${a > 0 ? `, ${Xh(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); - c.value = n, c.textContent = s, e && e === n && (c.selected = !0, i = !0), v.appendChild(c); + 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 ? `, ${$h(a)}` : ""}${o ? ")" : ""}`, c = document.createElement("option"); + c.value = n, c.textContent = s, e && e === n && (c.selected = !0, r = !0), _.appendChild(c); } - y = v.childNodes.length > 0, v.disabled = !y, y && !i && v.childNodes[0] && (v.value = String(v.childNodes[0]?.value || "")), b && (b.disabled = !y); + v = _.childNodes.length > 0, _.disabled = !v, v && !r && _.childNodes[0] && (_.value = String(_.childNodes[0]?.value || "")), y && (y.disabled = !v); } catch { - x(r("status.dbBackupNone", "No DB backup found")); + x(R("status.dbBackupNone", "No DB backup found")); } }; - S(), h.appendChild(v); + S(), g.appendChild(_); let C = document.createElement("button"); - C.type = "button", C.textContent = r("btn.dbSave", "Save DB"), C.title = r("status.dbSaveHint", "Save a DB snapshot into archive folder"), C.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 ", C.onclick = async (e) => { - e.stopPropagation(), Yh(!0); - let t = C.textContent, a = !!b?.disabled; - C.disabled = !0, b && (b.disabled = !0), C.textContent = r("btn.saving", "Saving..."), o.style.background = "var(--mjr-status-info, #64B5F6)", tg(i, "info"); + C.type = "button", C.textContent = R("btn.dbSave", "Save DB"), C.title = R("status.dbSaveHint", "Save a DB snapshot into archive folder"), C.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 ", C.onclick = async (e) => { + e.stopPropagation(), Qh(!0); + let i = C.textContent, o = !!y?.disabled; + C.disabled = !0, y && (y.disabled = !0), C.textContent = R("btn.saving", "Saving..."), a.style.background = "var(--mjr-status-info, #64B5F6)", ig(n, "info"); try { - let e = await ve(); + let e = await r(); if (e?.ok) { let t = String(e?.data?.name || "").trim(), n = Number(e?.data?.size_bytes || 0); - s(r("toast.dbSaveSuccess", "Database backup saved"), "success", 2200, { history: { - title: r("btn.dbSave", "Save DB"), - detail: t ? `${t}${n > 0 ? ` | ${Xh(n)}` : ""}` : r("toast.dbSaveSuccess", "Database backup saved"), + m(R("toast.dbSaveSuccess", "Database backup saved"), "success", 2200, { history: { + title: R("btn.dbSave", "Save DB"), + detail: t ? `${t}${n > 0 ? ` | ${$h(n)}` : ""}` : R("toast.dbSaveSuccess", "Database backup saved"), operation: "save_db", source: t || "archive", forceStore: !0 } }), await S(t); - } else s(e?.error || r("toast.dbSaveFailed", "Failed to save DB backup"), "error"); + } else m(e?.error || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } catch (e) { - s(e?.message || r("toast.dbSaveFailed", "Failed to save DB backup"), "error"); + m(e?.message || R("toast.dbSaveFailed", "Failed to save DB backup"), "error"); } finally { - Yh(!1), C.disabled = !1, b && (b.disabled = a || !y), C.textContent = t; + Qh(!1), C.disabled = !1, y && (y.disabled = o || !v), C.textContent = i; try { - await _g(o, f, p, n ? n() : null, null, { force: !0 }); + await bg(a, d, p, t ? t() : null, null, { force: !0 }); } catch (e) { console.debug?.(e); } } - }, h.appendChild(C), b = document.createElement("button"), b.type = "button", b.textContent = r("btn.dbRestore", "Restore"), b.title = r("status.dbRestoreHint", "Restore selected DB backup"), b.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,180,80,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", b.onclick = async (e) => { + }, g.appendChild(C), y = document.createElement("button"), y.type = "button", y.textContent = R("btn.dbRestore", "Restore"), y.title = R("status.dbRestoreHint", "Restore selected DB backup"), y.style.cssText = "\n padding: 5px 10px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,180,80,0.35);\n background: transparent;\n color: inherit;\n cursor: pointer;\n ", y.onclick = async (e) => { e.stopPropagation(); - let t = String(v.value || ""); - if (!t) { - s(r("toast.dbRestoreSelect", "Select a DB backup first"), "warning", 2e3); + let r = String(_.value || ""); + if (!r) { + m(R("toast.dbRestoreSelect", "Select a DB backup first"), "warning", 2e3); return; } - if (!await gt(`${r("dialog.dbRestore.confirm", "Restore selected DB backup? Current DB will be replaced.")}\n\n${t}`, r("btn.dbRestore", "Restore DB"))) return; - s(r("toast.dbRestoreStarted", "DB restore started"), "info", 1800, { history: { + if (!await Bt(`${R("dialog.dbRestore.confirm", "Restore selected DB backup? Current DB will be replaced.")}\n\n${r}`, R("btn.dbRestore", "Restore DB"))) return; + m(R("toast.dbRestoreStarted", "DB restore started"), "info", 1800, { history: { trackId: "maintenance:restore_db", - title: r("btn.dbRestore", "Restore DB"), - detail: t, + title: R("btn.dbRestore", "Restore DB"), + detail: r, operation: "restore_db", - source: t, + source: r, status: "started", forceStore: !0 - } }), Yh(!0); - let a = b.textContent, c = !!C.disabled; - b.disabled = !0, C.disabled = !0, v.disabled = !0, b.textContent = r("btn.restoring", "Restoring..."), o.style.background = "var(--mjr-status-warning, #FFA726)", tg(i, "warning"); + } }), Qh(!0); + let i = y.textContent, o = !!C.disabled; + y.disabled = !0, C.disabled = !0, _.disabled = !0, y.textContent = R("btn.restoring", "Restoring..."), a.style.background = "var(--mjr-status-warning, #FFA726)", ig(n, "warning"); try { - let e = await F({ - name: t, + let e = await f({ + name: r, useLatest: !1 }); - e?.ok ? await S(String(e?.data?.name || t || "")) : s(e?.error || r("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); + e?.ok ? await S(String(e?.data?.name || r || "")) : m(e?.error || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } catch (e) { - s(e?.message || r("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); + m(e?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"), "error"); } finally { - Yh(!1), b.disabled = !y, C.disabled = c, v.disabled = !y, b.textContent = a, ig("db-restore"); + Qh(!1), y.disabled = !v, C.disabled = o, _.disabled = !v, y.textContent = i, sg("db-restore"); try { - await _g(o, f, p, n ? n() : null, null, { force: !0 }); + await bg(a, d, p, t ? t() : null, null, { force: !0 }); } catch (e) { console.debug?.(e); } } - }, h.appendChild(b), u.appendChild(h); + }, g.appendChild(y), l.appendChild(g); let w = document.createElement("div"); w.style.cssText = "margin-top: 10px; display: flex; justify-content: flex-end; gap: 8px;"; let T = document.createElement("div"); @@ -19928,38 +19927,38 @@ function cg(t = {}) { } T.style.color = "inherit", T.style.opacity = "0.9"; }, D = document.createElement("button"); - D.type = "button", D.textContent = r("btn.resetIndex"), D.title = r("status.resetIndexHint", "Reset index cache (requires allowResetIndex in settings)."), D.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.25);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", D.onmouseenter = () => { + D.type = "button", D.textContent = R("btn.resetIndex"), D.title = R("status.resetIndexHint", "Reset index cache (requires allowResetIndex in settings)."), D.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,255,255,0.25);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", D.onmouseenter = () => { D.style.borderColor = "rgba(255,255,255,0.6)", D.style.background = "rgba(255,255,255,0.08)"; }, D.onmouseleave = () => { D.style.borderColor = "rgba(255,255,255,0.25)", D.style.background = "transparent"; - }, D.onclick = async (t) => { - t.stopPropagation(); - let a = await sg(r("btn.resetIndex", "Reset index")); - if (!await gt(a ? 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; - og("reset-index"), Yh(!0); - let s = D.textContent; - D.disabled = !0, D.textContent = r("btn.resetting"), o.style.background = "var(--mjr-status-info, #64B5F6)", tg(i, "info"); + }, D.onclick = async (e) => { + e.stopPropagation(); + let r = await ug(R("btn.resetIndex", "Reset index")); + if (!await Bt(r ? 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; + lg("reset-index"), Qh(!0); + let i = D.textContent; + D.disabled = !0, D.textContent = R("btn.resetting"), a.style.background = "var(--mjr-status-info, #64B5F6)", ig(n, "info"); try { - let t = n ? n() : {}, r = String(t?.scope || "output").toLowerCase(), s = t?.customRootId || t?.custom_root_id || t?.root_id || null, c = r === "custom" && !s; - (await e({ - scope: c ? "all" : r, - customRootId: c ? null : s, + let e = t ? t() : {}, i = String(e?.scope || "output").toLowerCase(), o = e?.customRootId || e?.custom_root_id || e?.root_id || null, s = i === "custom" && !o; + (await u({ + scope: s ? "all" : i, + customRootId: s ? null : o, reindex: !0, maintenance_force: !0, - hard_reset_db: r === "all" && !a, + hard_reset_db: i === "all" && !r, clear_scan_journal: !0, clear_metadata_cache: !0, clear_asset_metadata: !0, - clear_assets: !a, - preserve_vectors: a, + clear_assets: !r, + preserve_vectors: r, rebuild_fts: !0 - }))?.ok ? (o.style.background = "var(--mjr-status-success, #4CAF50)", tg(i, "success")) : (o.style.background = "var(--mjr-status-error, #f44336)", tg(i, "error")); + }))?.ok ? (a.style.background = "var(--mjr-status-success, #4CAF50)", ig(n, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", ig(n, "error")); } catch { - o.style.background = "var(--mjr-status-error, #f44336)", tg(i, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", ig(n, "error"); } finally { - Yh(!1), D.disabled = !1, D.textContent = s, ig("index-reset"); + Qh(!1), D.disabled = !1, D.textContent = i, sg("index-reset"); try { - await _g(o, f, p, n ? n() : null, null, { force: !0 }); + await bg(a, d, p, t ? t() : null, null, { force: !0 }); } catch (e) { console.debug?.(e); } @@ -19972,43 +19971,43 @@ function cg(t = {}) { O.style.borderColor = "rgba(0, 188, 212, 0.45)", O.style.background = "transparent"; }, O.onclick = async (e) => { e.stopPropagation(); - let t = n ? n() : {}, a = String(t?.scope || "output").toLowerCase(), c = String(t?.customRootId || t?.custom_root_id || t?.root_id || "").trim(); - if (a === "custom" && !c) { - s(r("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans"), "warning", 2600), E("Backfill skipped - Browser scope has no selected custom root.", "warning"); + let r = t ? t() : {}, i = String(r?.scope || "output").toLowerCase(), o = String(r?.customRootId || r?.custom_root_id || r?.root_id || "").trim(); + if (i === "custom" && !o) { + m(R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans"), "warning", 2600), E("Backfill skipped - Browser scope has no selected custom root.", "warning"); return; } - let l = a || "output", u = ng(l); - og("vector-backfill"); - let d = { history: { - trackId: `vector-backfill:status:${l}:${c || "default"}`, + let s = i || "output", c = ag(s); + lg("vector-backfill"); + let l = { history: { + trackId: `vector-backfill:status:${s}:${o || "default"}`, title: "Vector Backfill", - source: u, + source: c, operation: "vector_backfill", forceStore: !0 } }; - Yh(!0); - let m = O.textContent, h = D.textContent; - O.disabled = !0, D.disabled = !0, O.textContent = "Backfilling...", E(`Backfill started (${u})...`, "info"), _({ + Qh(!0); + let u = O.textContent, f = D.textContent; + O.disabled = !0, D.disabled = !0, O.textContent = "Backfilling...", E(`Backfill started (${c})...`, "info"), ae({ summary: "Vector Backfill", - detail: `Started (${u})` + detail: `Started (${c})` }, "info", 0, { history: { - ...d.history, + ...l.history, status: "started", - detail: `Started (${u})` - } }), o.style.background = "var(--mjr-status-info, #64B5F6)", tg(i, "info"); + detail: `Started (${c})` + } }), a.style.background = "var(--mjr-status-info, #64B5F6)", ig(n, "info"); try { let e = { - scope: l, + scope: s, onProgress: (e) => { - let t = String(e?.status || "").toLowerCase(), n = e?.progress || e?.result || {}, r = Number(n?.candidates || n?.processed || 0), i = Number(n?.candidate_total || r || 0), a = Number(n?.eligible_total || n?.total_assets || 0), o = Number(n?.indexed || 0), s = Number(n?.skipped || 0), c = Number(n?.errors || 0); + let t = String(e?.status || "").toLowerCase(), n = e?.progress || e?.result || {}, r = Number(n?.candidates || n?.processed || 0), i = Number(n?.candidate_total || r || 0), a = Number(n?.eligible_total || n?.total_assets || 0), o = Number(n?.indexed || 0), s = Number(n?.skipped || 0), u = Number(n?.errors || 0); if (t === "queued") { - E("Backfill queued...", "info"), _({ + E("Backfill queued...", "info"), ae({ summary: "Vector Backfill", - detail: `Queued (${u})` + detail: `Queued (${c})` }, "info", 0, { history: { - ...d.history, + ...l.history, status: "queued", - detail: `Queued (${u})`, + detail: `Queued (${c})`, progress: { current: 0, total: 1, @@ -20018,122 +20017,122 @@ function cg(t = {}) { } }); return; } - if (t === "running" || r > 0 || i > 0 || a > 0 || o > 0 || s > 0 || c > 0) { - let e = a > 0 ? `Indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${c}` : `Candidates ${r}, indexed ${o}, skipped ${s}, errors ${c}`; - E(a > 0 ? `Backfill running - indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${c}` : `Backfill running - candidates ${r}, indexed ${o}, skipped ${s}, errors ${c}`, "info"), _({ + if (t === "running" || r > 0 || i > 0 || a > 0 || o > 0 || s > 0 || u > 0) { + let e = a > 0 ? `Indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${u}` : `Candidates ${r}, indexed ${o}, skipped ${s}, errors ${u}`; + E(a > 0 ? `Backfill running - indexed ${o}/${a} assets, candidates ${i}, skipped ${s}, errors ${u}` : `Backfill running - candidates ${r}, indexed ${o}, skipped ${s}, errors ${u}`, "info"), ae({ summary: "Vector Backfill", detail: e }, "info", 0, { history: { - ...d.history, + ...l.history, status: "running", detail: e, progress: { - current: a > 0 ? o : o + s + c, - total: a > 0 ? a : Math.max(r, o + s + c), - percent: a > 0 ? Math.round(o / a * 100) : Math.max(r, o + s + c) > 0 ? Math.round((o + s + c) / Math.max(r, o + s + c) * 100) : null, + current: a > 0 ? o : o + s + u, + total: a > 0 ? a : Math.max(r, o + s + u), + percent: a > 0 ? Math.round(o / a * 100) : Math.max(r, o + s + u) > 0 ? Math.round((o + s + u) / Math.max(r, o + s + u) * 100) : null, eligible_total: a > 0 ? a : void 0, candidate_total: i > 0 ? i : void 0, indexed: o, skipped: s, - errors: c, + errors: u, label: "running" } } }); } } }; - l === "custom" && c && (e.customRootId = c); - let t = await be(64, e); + s === "custom" && o && (e.customRootId = o); + let t = await b(64, e); if (t?.ok) { - let e = String(t?.data?.status || "").toLowerCase(), n = !!t?.data?.pending || [ + let e = String(t?.data?.status || "").toLowerCase(), r = !!t?.data?.pending || [ "queued", "running", "pending" - ].includes(e), a = t?.data?.progress || {}, c = Number(t?.data?.processed ?? a?.candidates ?? 0), l = Number(t?.data?.indexed ?? a?.indexed ?? 0), u = Number(t?.data?.skipped ?? a?.skipped ?? 0), f = Number(t?.data?.errors ?? a?.errors ?? 0); - if (n) { + ].includes(e), i = t?.data?.progress || {}, o = Number(t?.data?.processed ?? i?.candidates ?? 0), s = Number(t?.data?.indexed ?? i?.indexed ?? 0), c = Number(t?.data?.skipped ?? i?.skipped ?? 0), u = Number(t?.data?.errors ?? i?.errors ?? 0); + if (r) { let e = String(t?.data?.backfill_id || "").trim(); - s(r("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (${e.slice(0, 8)})` : "" }), "info", 4200, { history: { - ...d.history, + m(R("toast.vectorBackfillRunning", "Vector backfill still running in background{job}.", { job: e ? ` (${e.slice(0, 8)})` : "" }), "info", 4200, { history: { + ...l.history, status: "running", detail: `Running in background${e ? ` (${e.slice(0, 8)})` : ""}.`, progress: { - current: l + u + f, - total: Math.max(c, l + u + f), - percent: Math.max(c, l + u + f) > 0 ? Math.round((l + u + f) / Math.max(c, l + u + f) * 100) : null, - indexed: l, - skipped: u, - errors: f, + current: s + c + u, + total: Math.max(o, s + c + u), + percent: Math.max(o, s + c + u) > 0 ? Math.round((s + c + u) / Math.max(o, s + c + u) * 100) : null, + indexed: s, + skipped: c, + errors: u, label: "running" } - } }), E(`Backfill running in background - candidates ${c}, indexed ${l}, skipped ${u}, errors ${f}`, "info"), o.style.background = "var(--mjr-status-info, #64B5F6)", tg(i, "info"); - } else s(r("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { - processed: c, - indexed: l, - skipped: u + } }), E(`Backfill running in background - candidates ${o}, indexed ${s}, skipped ${c}, errors ${u}`, "info"), a.style.background = "var(--mjr-status-info, #64B5F6)", ig(n, "info"); + } else m(R("toast.vectorBackfillComplete", "Vector backfill complete! Processed: {processed}, Indexed: {indexed}, Skipped: {skipped}", { + processed: o, + indexed: s, + skipped: c }), "success", 3e3, { history: { - ...d.history, + ...l.history, status: "succeeded", - detail: `Processed ${c}, indexed ${l}, skipped ${u}`, + detail: `Processed ${o}, indexed ${s}, skipped ${c}`, progress: { - current: c, - total: c, - percent: c > 0 ? 100 : null, - indexed: l, - skipped: u, - errors: f, + current: o, + total: o, + percent: o > 0 ? 100 : null, + indexed: s, + skipped: c, + errors: u, label: "done" } - } }), E(`Backfill OK - processed ${c}, indexed ${l}, skipped ${u}`, "success"), o.style.background = "var(--mjr-status-success, #4CAF50)", tg(i, "success"); + } }), E(`Backfill OK - processed ${o}, indexed ${s}, skipped ${c}`, "success"), a.style.background = "var(--mjr-status-success, #4CAF50)", ig(n, "success"); } else { - let e = String(t?.error || r("toast.vectorBackfillFailedGeneric", "Backfill failed")), n = String(t?.code || "").trim(), a = Number(t?.status || 0) || 0, c = [ - n ? `code=${n}` : "", - a ? `status=${a}` : "", + let e = String(t?.error || R("toast.vectorBackfillFailedGeneric", "Backfill failed")), r = String(t?.code || "").trim(), i = Number(t?.status || 0) || 0, o = [ + r ? `code=${r}` : "", + i ? `status=${i}` : "", e ].filter(Boolean).join(" | "); - s(c, "error", 4500, { history: { - ...d.history, + m(o, "error", 4500, { history: { + ...l.history, status: "failed", - detail: c, + detail: o, progress: { label: "failed", errors: 1 } - } }), E(`Backfill ? - ${c}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", t), o.style.background = "var(--mjr-status-error, #f44336)", tg(i, "error"); + } }), E(`Backfill ? - ${o}\nSee console for full payload.`, "error"), console.error("[Majoor] Vector backfill failed response", t), a.style.background = "var(--mjr-status-error, #f44336)", ig(n, "error"); } } catch (e) { let t = String(e?.message || e || "Backfill failed"); - s(t, "error", 4500, { history: { - ...d.history, + m(t, "error", 4500, { history: { + ...l.history, status: "failed", detail: t, progress: { label: "failed", errors: 1 } - } }), E(`Backfill EXCEPTION - ${t}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", e), o.style.background = "var(--mjr-status-error, #f44336)", tg(i, "error"); + } }), E(`Backfill EXCEPTION - ${t}\nSee console for stack trace.`, "error"), console.error("[Majoor] Vector backfill exception", e), a.style.background = "var(--mjr-status-error, #f44336)", ig(n, "error"); } finally { - Yh(!1), O.disabled = !1, D.disabled = !1, O.textContent = m, D.textContent = h, ig("vector-backfill"); + Qh(!1), O.disabled = !1, D.disabled = !1, O.textContent = u, D.textContent = f, sg("vector-backfill"); try { - await _g(o, f, p, n ? n() : null, null, { force: !0 }); + await bg(a, d, p, t ? t() : null, null, { force: !0 }); } catch (e) { console.debug?.(e); } } - }, w.appendChild(O), w.appendChild(D), u.appendChild(T); + }, w.appendChild(O), w.appendChild(D), l.appendChild(T); let k = document.createElement("button"); - k.type = "button", k.textContent = r("btn.deleteDb"), k.title = r("tooltip.deleteDb", "Force-delete database and rebuild from scratch"), k.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,80,80,0.4);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", k.onmouseenter = () => { + k.type = "button", k.textContent = R("btn.deleteDb"), k.title = R("tooltip.deleteDb", "Force-delete database and rebuild from scratch"), k.style.cssText = "\n padding: 5px 12px;\n font-size: 11px;\n border-radius: 6px;\n border: 1px solid rgba(255,80,80,0.4);\n background: transparent;\n color: inherit;\n cursor: pointer;\n transition: border 0.2s, background 0.2s;\n ", k.onmouseenter = () => { k.style.borderColor = "rgba(255,80,80,0.8)", k.style.background = "rgba(255,80,80,0.12)"; }, k.onmouseleave = () => { k.style.borderColor = "rgba(255,80,80,0.4)", k.style.background = "transparent"; - }, k.onclick = async (t) => { - t.stopPropagation(); - let a = await sg(r("btn.deleteDb", "Delete DB")); - if (!await gt(a ? 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; - Yh(!0); - let s = k.textContent; - k.disabled = !0, k.textContent = a ? r("btn.resetting", "Resetting...") : r("btn.deletingDb"), D.disabled = !0, o.style.background = "var(--mjr-status-info, #64B5F6)", tg(i, "info"); + }, k.onclick = async (e) => { + e.stopPropagation(); + let r = await ug(R("btn.deleteDb", "Delete DB")); + if (!await Bt(r ? 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; + Qh(!0); + let i = k.textContent; + k.disabled = !0, k.textContent = r ? R("btn.resetting", "Resetting...") : R("btn.deletingDb"), D.disabled = !0, a.style.background = "var(--mjr-status-info, #64B5F6)", ig(n, "info"); try { - (a ? await e({ + (r ? await u({ scope: "all", reindex: !0, maintenance_force: !0, @@ -20144,50 +20143,50 @@ function cg(t = {}) { clear_assets: !1, preserve_vectors: !0, rebuild_fts: !0 - }) : await g())?.ok ? (globalThis._mjrCorruptToastShown = !1, o.style.background = "var(--mjr-status-success, #4CAF50)", tg(i, "success")) : (o.style.background = "var(--mjr-status-error, #f44336)", tg(i, "error")); + }) : await ie())?.ok ? (globalThis._mjrCorruptToastShown = !1, a.style.background = "var(--mjr-status-success, #4CAF50)", ig(n, "success")) : (a.style.background = "var(--mjr-status-error, #f44336)", ig(n, "error")); } catch { - o.style.background = "var(--mjr-status-error, #f44336)", tg(i, "error"); + a.style.background = "var(--mjr-status-error, #f44336)", ig(n, "error"); } finally { - Yh(!1), k.disabled = !1, k.textContent = s, D.disabled = !1, ig(a ? "index-reset-preserve-vectors" : "db-force-delete"); + Qh(!1), k.disabled = !1, k.textContent = i, D.disabled = !1, sg(r ? "index-reset-preserve-vectors" : "db-force-delete"); try { - await _g(o, f, p, n ? n() : null, null, { force: !0 }); + await bg(a, d, p, t ? t() : null, null, { force: !0 }); } catch (e) { console.debug?.(e); } } - }, w.appendChild(k), u.appendChild(w), i.appendChild(a), i.appendChild(u); - let A = i.querySelector("#mjr-status-title"); + }, w.appendChild(k), l.appendChild(w), n.appendChild(i), n.appendChild(l); + let A = n.querySelector("#mjr-status-title"); A && A.addEventListener("click", (e) => { e.stopPropagation(); - let t = i.querySelector("#mjr-status-body"); - t && mg(i, t.style.display !== "none"); - }), mg(i, !0), i.onmouseenter = () => { - i.style.transform = "translateY(-1px)"; - }, i.onmouseleave = () => { - i.style.transform = "", tg(i, i.dataset?.mjrStatusTone || "neutral", { toast: !1 }); + let t = n.querySelector("#mjr-status-body"); + t && _g(n, t.style.display !== "none"); + }), _g(n, !0), n.onmouseenter = () => { + n.style.transform = "translateY(-1px)"; + }, n.onmouseleave = () => { + n.style.transform = "", ig(n, n.dataset?.mjrStatusTone || "neutral", { toast: !1 }); }; let j = async (e) => { try { - let t = e?.detail || {}, a = String(t?.step || ""); - if (!a) return; - let s = a === "started" || a === "stopping_workers" || a === "resetting_db" || a === "delete_db" || a === "recreate_db" || a === "replacing_files" || a === "restarting_scan"; - if (s ? Yh(!0) : (a === "failed" || a === "done") && Yh(!1), !i?.isConnected || !o?.isConnected || !f?.isConnected) return; - if (s) { - o.style.background = "var(--mjr-status-info, #64B5F6)", tg(i, "info", { toast: !1 }), eg(f, r("status.pending", "Pending..."), r("status.dbRestoreInProgress", "Database restore in progress")); + let r = e?.detail || {}, i = String(r?.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 ? Qh(!0) : (i === "failed" || i === "done") && Qh(!1), !n?.isConnected || !a?.isConnected || !d?.isConnected) return; + if (o) { + a.style.background = "var(--mjr-status-info, #64B5F6)", ig(n, "info", { toast: !1 }), rg(d, R("status.pending", "Pending..."), R("status.dbRestoreInProgress", "Database restore in progress")); return; } - if (a === "failed") { - o.style.background = "var(--mjr-status-error, #f44336)", tg(i, "error", { toast: !1 }), Zh(f, [r("status.error", "Error"), String(t?.message || r("toast.dbRestoreFailed", "Failed to restore DB backup"))]); + if (i === "failed") { + a.style.background = "var(--mjr-status-error, #f44336)", ig(n, "error", { toast: !1 }), eg(d, [R("status.error", "Error"), String(r?.message || R("toast.dbRestoreFailed", "Failed to restore DB backup"))]); return; } - if (a === "done") { - o.style.background = "var(--mjr-status-success, #4CAF50)", tg(i, "success", { toast: !1 }); - let e = String(t?.operation || ""), a = 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"); - eg(f, r("status.ready", "Ready"), a); + if (i === "done") { + a.style.background = "var(--mjr-status-success, #4CAF50)", ig(n, "success", { toast: !1 }); + let e = String(r?.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"); + rg(d, R("status.ready", "Ready"), i); try { - let e = n ? n() : null; + let e = t ? t() : null; setTimeout(() => { - _g(o, f, p, e, null, { force: !0 }); + bg(a, d, p, e, null, { force: !0 }); }, 600); } catch (e) { console.debug?.(e); @@ -20198,218 +20197,218 @@ function cg(t = {}) { } }; try { - let e = Wh; - typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), Wh = j, i._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); + let e = qh; + typeof e == "function" && window.removeEventListener("mjr-db-restore-status", e), qh = j, n._mjrDbRestoreStatusHandler = j, window.addEventListener("mjr-db-restore-status", j); } catch (e) { console.debug?.(e); } let M = (e) => { try { - let t = e?.detail || {}, n = Number(t?.queue_remaining), i = Number(t?.progress_value), a = Number(t?.progress_max), o = Array.isArray(t?.cached_nodes) ? t.cached_nodes.length : 0, s = String(t?.active_prompt_id || "").trim(), c = [ - Number.isFinite(i) && Number.isFinite(a) && a > 0 ? r("status.runtimeProgress", "Runtime progress: {value}/{max}", { - value: i, - max: a + let t = e?.detail || {}, n = Number(t?.queue_remaining), r = Number(t?.progress_value), i = Number(t?.progress_max), a = Array.isArray(t?.cached_nodes) ? t.cached_nodes.length : 0, o = String(t?.active_prompt_id || "").trim(), s = [ + Number.isFinite(r) && Number.isFinite(i) && i > 0 ? R("status.runtimeProgress", "Runtime progress: {value}/{max}", { + value: r, + max: i }) : "", - Number.isFinite(n) ? r("status.queueRemaining", "Queue remaining: {count}", { count: Math.max(0, n) }) : "", - o > 0 ? r("status.executionCached", "Cached nodes reused: {count}", { count: o }) : "", - s ? r("status.activePrompt", "Active prompt: {id}", { id: s }) : "" + Number.isFinite(n) ? R("status.queueRemaining", "Queue remaining: {count}", { count: Math.max(0, n) }) : "", + a > 0 ? R("status.executionCached", "Cached nodes reused: {count}", { count: a }) : "", + o ? R("status.activePrompt", "Active prompt: {id}", { id: o }) : "" ].filter(Boolean); - if (!c.length) return; - let l = f?.querySelector?.("span"); - l ? l.textContent = c.join(" | ") : eg(f, r("status.ready", "Ready"), c.join(" | ")); + if (!s.length) return; + let c = d?.querySelector?.("span"); + c ? c.textContent = s.join(" | ") : rg(d, R("status.ready", "Ready"), s.join(" | ")); } catch (e) { console.debug?.(e); } }; try { - let e = Gh; - typeof e == "function" && window.removeEventListener(B.RUNTIME_STATUS, e), Gh = M, window.addEventListener(B.RUNTIME_STATUS, M); + let e = Jh; + typeof e == "function" && window.removeEventListener(H.RUNTIME_STATUS, e), Jh = M, window.addEventListener(H.RUNTIME_STATUS, M); } catch (e) { console.debug?.(e); } - return i; + return n; } -async function lg(e, t, n = null, i = null) { - if (Uh) { - s(r("status.maintenanceBusy", "Database maintenance in progress. Please wait."), "warning", 2200); +async function fg(e, t, n = null, r = null) { + if (Kh) { + m(R("status.maintenanceBusy", "Database maintenance in progress. Please wait."), "warning", 2200); return; } - let a = t?.closest?.("#mjr-status-body")?.parentElement || t?.closest?.("div"), o = String(i?.scope || "output").toLowerCase(), c = i?.customRootId || i?.custom_root_id || i?.root_id || null; - if (o === "custom" && !c) { - e.style.background = "var(--mjr-status-info, #64B5F6)", tg(a, "info"), eg(t, r("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), r("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); + let i = t?.closest?.("#mjr-status-body")?.parentElement || t?.closest?.("div"), a = String(r?.scope || "output").toLowerCase(), o = r?.customRootId || r?.custom_root_id || r?.root_id || null; + if (a === "custom" && !o) { + e.style.background = "var(--mjr-status-info, #64B5F6)", ig(i, "info"), rg(t, R("status.customBrowserScanDisabled", "Custom browser mode: scan is disabled"), R("status.customBrowserScanDisabledHint", "Use Outputs, Inputs, or All to run indexing scans")); return; } try { let e = Date.now(), n = globalThis?._mjrScanInFlight; if (n && typeof n == "object") { - let i = e - Number(n.at || 0); - if (i >= 0 && i < 10 * 6e4) { - eg(t, r("status.scanInProgress", "Scan already running..."), r("status.scanInProgressHint", "Please wait for the current scan to finish")); + let r = e - Number(n.at || 0); + if (r >= 0 && r < 10 * 6e4) { + rg(t, R("status.scanInProgress", "Scan already running..."), R("status.scanInProgressHint", "Please wait for the current scan to finish")); return; } } globalThis._mjrScanInFlight = { at: e, - scope: o, - root_id: c || null + scope: a, + root_id: o || null }; } catch (e) { console.debug?.(e); } - let l = () => { + let s = () => { try { globalThis?._mjrScanInFlight && (globalThis._mjrScanInFlight = null); } catch (e) { console.debug?.(e); } - }, u = null; + }, c = null; try { - let e = await P(Le.ROOTS); - e.ok && (u = e.data); + let e = await ne(L.ROOTS); + e.ok && (c = e.data); } catch (e) { console.debug?.(e); } - if (!u) { - let n = await P(Le.CONFIG); + if (!c) { + let n = await ne(L.CONFIG); if (!n.ok) { - e.style.background = "var(--mjr-status-error, #f44336)", tg(a, "error"), t.textContent = r("status.errorGetConfig"), l(); + e.style.background = "var(--mjr-status-error, #f44336)", ig(i, "error"), t.textContent = R("status.errorGetConfig"), s(); return; } - u = { output_directory: n.data.output_directory }; + c = { output_directory: n.data.output_directory }; } - let d = o === "all" ? r("scope.all", "Inputs + Outputs") : o === "input" ? r("scope.input", "Inputs") : o === "custom" ? r("scope.custom", "Custom") : r("scope.output", "Outputs"), f = ""; - if (o === "input") f = u?.input_directory ? ` (${u.input_directory})` : ""; - else if (o === "custom") { - let e = Array.isArray(u?.custom_roots) ? u.custom_roots : [], t = c ? e.find((e) => e?.id === c) : null; - f = t?.path ? ` (${t.path})` : ""; - } else o === "output" && (f = u?.output_directory ? ` (${u.output_directory})` : ""); - e.style.background = "var(--mjr-status-info, #64B5F6)", tg(a, "info"), eg(t, r("status.scanningScope", `Scanning ${d}${f}...`, { - scope: d, - detail: f - }), r("status.scanningHint", "This may take a while")); - let p = { - scope: o, + let l = a === "all" ? R("scope.all", "Inputs + Outputs") : a === "input" ? R("scope.input", "Inputs") : a === "custom" ? R("scope.custom", "Custom") : R("scope.output", "Outputs"), u = ""; + if (a === "input") u = c?.input_directory ? ` (${c.input_directory})` : ""; + else if (a === "custom") { + let e = Array.isArray(c?.custom_roots) ? c.custom_roots : [], t = o ? e.find((e) => e?.id === o) : null; + u = t?.path ? ` (${t.path})` : ""; + } else a === "output" && (u = c?.output_directory ? ` (${c.output_directory})` : ""); + e.style.background = "var(--mjr-status-info, #64B5F6)", ig(i, "info"), rg(t, R("status.scanningScope", `Scanning ${l}${u}...`, { + scope: l, + detail: u + }), R("status.scanningHint", "This may take a while")); + let d = { + scope: a, recursive: !0, incremental: !0, - fast: !!(Et()?.scan?.fastMode ?? !0), + fast: !!(pt()?.scan?.fastMode ?? !0), background_metadata: !0 }; - if (o === "custom") { - if (!c) { - e.style.background = "var(--mjr-status-error, #f44336)", tg(a, "error"), t.textContent = r("status.selectCustomFolder"), l(); + if (a === "custom") { + if (!o) { + e.style.background = "var(--mjr-status-error, #f44336)", ig(i, "error"), t.textContent = R("status.selectCustomFolder"), s(); return; } - p.custom_root_id = c; + d.custom_root_id = o; } - let m; + let f; try { - m = await ye(Le.SCAN, p); + f = await y(L.SCAN, d); } finally { - l(); + s(); } - if (m?.ok) { - let i = m.data; - e.style.background = "var(--mjr-status-success, #4CAF50)", tg(a, "success"), eg(t, r("toast.scanComplete"), r("status.scanStats", `Added: ${i.added || 0} - Updated: ${i.updated || 0} - Skipped: ${i.skipped || 0}`, { - added: i.added || 0, - updated: i.updated || 0, - skipped: i.skipped || 0 - })), ag("scan-complete", { stats: { - added: i.added || 0, - updated: i.updated || 0, - skipped: i.skipped || 0 + if (f?.ok) { + let r = f.data; + e.style.background = "var(--mjr-status-success, #4CAF50)", ig(i, "success"), rg(t, R("toast.scanComplete"), R("status.scanStats", `Added: ${r.added || 0} - Updated: ${r.updated || 0} - Skipped: ${r.skipped || 0}`, { + added: r.added || 0, + updated: r.updated || 0, + skipped: r.skipped || 0 + })), cg("scan-complete", { stats: { + added: r.added || 0, + updated: r.updated || 0, + skipped: r.skipped || 0 } }), setTimeout(() => { - _g(e, t, n); + bg(e, t, n); }, 2e3); - } else e.style.background = "var(--mjr-status-error, #f44336)", tg(a, "error"), Zh(t, [r("toast.scanFailed") + `: ${m?.error || "Unknown error"}`]), setTimeout(() => { - _g(e, t, n); + } else e.style.background = "var(--mjr-status-error, #f44336)", ig(i, "error"), eg(t, [R("toast.scanFailed") + `: ${f?.error || "Unknown error"}`]), setTimeout(() => { + bg(e, t, n); }, 3e3); } -function ug(e, t, n) { - let i = document.createElement("span"); - return i.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 ", i.textContent = `${t ? "OK" : "ERR"} ${e}`, i.title = t ? r("status.toolAvailable", `${e} available`, { tool: e }) : n || r("status.toolUnavailable", `${e} unavailable`, { tool: e }), i.style.opacity = t ? "1" : "0.75", i; +function pg(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 dg(e, t = {}, n = {}) { +function mg(e, t = {}, n = {}) { if (!e) return; if (e.replaceChildren(), !t || Object.keys(t).length === 0) { - e.textContent = r("status.discoveringTools"); + e.textContent = R("status.discoveringTools"); return; } - let i = document.createElement("div"); - i.style.display = "flex", i.style.flexWrap = "wrap", i.style.gap = "10px", i.style.alignItems = "flex-start", Hh.forEach(({ key: e, labelKey: a, hintKey: o }) => { - let s = !!t[e], c = n[e], l = r(a, e), u = r(o, ""); - i.appendChild(pg({ - label: l, - hint: u - }, s, c)); - }), e.appendChild(i); + let r = document.createElement("div"); + r.style.display = "flex", r.style.flexWrap = "wrap", r.style.gap = "10px", r.style.alignItems = "flex-start", Gh.forEach(({ key: e, labelKey: i, hintKey: a }) => { + let o = !!t[e], s = n[e], c = R(i, e), l = R(a, ""); + r.appendChild(gg({ + label: c, + hint: l + }, o, s)); + }), e.appendChild(r); } -function fg(e, t = null, n = {}) { +function hg(e, t = null, n = {}) { if (!e) return; - let i = e.parentElement; + let r = e.parentElement; + if (!r) return; + let i = r.querySelector("#mjr-tools-status"); if (!i) return; - let a = i.querySelector("#mjr-tools-status"); - if (!a) return; - let o = n && Object.keys(n).length > 0; - if (!t && !o) { - a.textContent = r("status.toolStatusChecking", "Tool status: checking..."); + let a = n && Object.keys(n).length > 0; + if (!t && !a) { + i.textContent = R("status.toolStatusChecking", "Tool status: checking..."); return; } - a.textContent = Hh.map(({ key: e, labelKey: i }) => { - let a = r(i, e), o = t && e in t ? t[e] : void 0, s = e in n ? n[e] : void 0, c = o === void 0 ? s : o, l = c == null ? r("status.unknown", "unknown") : c ? r("status.available", "available") : r("status.missing", "missing"), u = t?.versions?.[e]; - return u ? `${a}: ${l} - ${u}` : `${a}: ${l}`; + i.textContent = Gh.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 pg({ label: e, hint: t }, n, i) { - let a = document.createElement("div"); - a.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 o = ug(e, n, t); - o.style.fontWeight = "500", a.appendChild(o); - let s = document.createElement("span"); - return s.style.fontSize = "10px", s.style.opacity = "0.7", s.style.wordBreak = "break-all", s.textContent = r("status.path", "Path") + `: ${i || r("status.pathAuto", "auto / not configured")}`, a.appendChild(s), a; +function gg({ 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 = pg(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 mg(e, t) { +function _g(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 hg(e, t) { - let n = !!e?.database?.available, i = t?.diagnostics || {}, a = !!i?.malformed, o = !!i?.locked; - return !n || a ? r("status.dbHealthError", "DB health: error") : o ? r("status.dbHealthLocked", "DB health: locked") : r("status.dbHealthOk", "DB health: ok"); +function vg(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 gg(e, t) { - let n = Number(e?.total_assets || 0), i = e?.last_index_end, a = e?.last_scan_end, o = t === "all" ? r("scope.all", "Inputs + Outputs") : t === "input" ? r("scope.input", "Inputs") : t === "custom" ? r("scope.custom", "Custom") : r("scope.output", "Outputs"); - return !Number.isFinite(n) || n <= 0 ? `${r("status.indexHealthEmpty", "Index health: empty")} (${o})` : !i && !a ? `${r("status.indexHealthPartial", "Index health: partial")} (${o})` : `${r("status.indexHealthOk", "Index health: ok")} (${o})`; +function yg(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") : 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 _g(e, t, n = null, i = null, a = null, o = {}) { - let c = t?.closest?.("#mjr-status-body")?.parentElement || t?.closest?.("div"), d = o?.signal || null, f = !!o?.force; +async function bg(e, t, r = null, i = null, a = null, o = {}) { + let c = t?.closest?.("#mjr-status-body")?.parentElement || t?.closest?.("div"), l = o?.signal || null, u = !!o?.force; try { if (!e?.isConnected || !t?.isConnected) return null; } catch (e) { console.debug?.(e); } try { - if (!f && Uh) return null; + if (!u && Kh) return null; } catch (e) { console.debug?.(e); } a && typeof a == "object" && (a.lastCode = null, a.lastStatus = null); - let p = String(i?.scope || "output").toLowerCase(), m = i?.customRootId || i?.custom_root_id || i?.root_id || null, h = p === "custom" && !m, g = h ? `${Le.HEALTH_COUNTERS}?scope=all` : p === "custom" ? `${Le.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(m || ""))}` : `${Le.HEALTH_COUNTERS}?scope=${encodeURIComponent(p || "output")}`, _ = !!o?.lightweight, v = !(!f && a && typeof a == "object" && Number(a._scanAuxBackoffUntil || 0) > Date.now()) && (f || !_ || !(a && typeof a == "object" && a._auxCached)), y, b, x, S = null; - if (v) { + let d = String(i?.scope || "output").toLowerCase(), f = i?.customRootId || i?.custom_root_id || i?.root_id || null, p = d === "custom" && !f, h = p ? `${L.HEALTH_COUNTERS}?scope=all` : d === "custom" ? `${L.HEALTH_COUNTERS}?scope=custom&custom_root_id=${encodeURIComponent(String(f || ""))}` : `${L.HEALTH_COUNTERS}?scope=${encodeURIComponent(d || "output")}`, g = !!o?.lightweight, _ = !(!u && a && typeof a == "object" && Number(a._scanAuxBackoffUntil || 0) > Date.now()) && (u || !g || !(a && typeof a == "object" && a._auxCached)), v, y, b, x = null; + if (_) { let [e, t, n] = await Promise.all([ - P(g, d ? { signal: d } : void 0), - P(Le.HEALTH, d ? { signal: d } : void 0), - P(Le.HEALTH_DB, d ? { signal: d } : void 0) + ne(h, l ? { signal: l } : void 0), + ne(L.HEALTH, l ? { signal: l } : void 0), + ne(L.HEALTH_DB, l ? { signal: l } : void 0) ]); - y = e, b = t, x = n; + v = e, y = t, b = n; try { - let e = await u(d ? { signal: d } : void 0); - e?.ok && (S = e.data); + let e = await s(l ? { signal: l } : void 0); + e?.ok && (x = e.data); } catch (e) { console.debug?.(e); } - a && typeof a == "object" && (a._auxCached = !0, a._healthCache = b, a._dbDiagCache = x, a._toolsCache = S); - } else y = await P(g, d ? { signal: d } : void 0), b = a?._healthCache || null, x = a?._dbDiagCache || null, S = a?._toolsCache || null; + a && typeof a == "object" && (a._auxCached = !0, a._healthCache = y, a._dbDiagCache = b, a._toolsCache = x); + } else v = await ne(h, l ? { signal: l } : void 0), y = a?._healthCache || null, b = a?._dbDiagCache || null, x = a?._toolsCache || null; try { - if (d?.aborted) return null; + if (l?.aborted) return null; } catch (e) { console.debug?.(e); } @@ -20418,88 +20417,88 @@ async function _g(e, t, n = null, i = null, a = null, o = {}) { } catch (e) { console.debug?.(e); } - if (a && typeof a == "object" && (a.lastCode = y?.code || null, a.lastStatus = typeof y?.status == "number" ? y.status : null), y.ok) { - let i = y.data; + if (a && typeof a == "object" && (a.lastCode = v?.code || null, a.lastStatus = typeof v?.status == "number" ? v.status : null), v.ok) { + let i = v.data; a && typeof a == "object" && (a._scanAuxBackoffUntil = i?.scan_active ? Date.now() + 3e4 : 0); - let o = i.total_assets || 0, s = i.with_workflows - 0, u = i.with_generation_data - 0, f = i.last_scan_end, g = f ? new Date(f).toLocaleString() : "N/A", _ = i.tool_availability || {}, v = i.tool_paths || {}, C = r("status.dbSize", "Database size: {size}", { size: Xh(i.db_size_bytes || 0) }), w = b?.ok && b?.data && b.data.vector || {}, T = w?.enabled !== !1, E = !!w?.loaded, D = !!w?.degraded, O = String(w?.last_error || "").trim(), k = T ? D ? `AI vector: degraded${O ? ` (${O})` : ""}` : E ? "AI vector: loaded" : "AI vector: initializing" : "AI vector: disabled", A = hg(b?.data || null, x?.data || null), j = gg(i, h ? "all" : p), M = !!(b?.ok && b?.data?.database?.available), N = x?.ok && x?.data?.diagnostics || {}, P = !!N?.malformed, F = !!N?.locked, ee = !!N?.maintenance_active; - Yh(ee); - let te = Math.max(0, Number(i?.enrichment_queue_length || 0) || 0), ne = St().active || te > 0; - Wt(ne, te); - let re = Number(o) > 0, ie = !!(i?.last_index_end || i?.last_scan_end), ae = re && ie, oe = "success"; - ee || ne ? oe = "info" : !M || P ? oe = "error" : (F || !ae || D) && (oe = "warning"); - let se = h && oe !== "error" ? "browser" : oe, ce = i.watcher; + let o = i.total_assets || 0, s = i.with_workflows - 0, u = i.with_generation_data - 0, m = i.last_scan_end, h = m ? new Date(m).toLocaleString() : "N/A", g = i.tool_availability || {}, _ = i.tool_paths || {}, S = R("status.dbSize", "Database size: {size}", { size: $h(i.db_size_bytes || 0) }), C = y?.ok && y?.data && y.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 = vg(y?.data || null, b?.data || null), A = yg(i, p ? "all" : d), j = !!(y?.ok && y?.data?.database?.available), M = b?.ok && b?.data?.diagnostics || {}, N = !!M?.malformed, P = !!M?.locked, F = !!M?.maintenance_active; + Qh(F); + let I = Math.max(0, Number(i?.enrichment_queue_length || 0) || 0), ee = Jt().active || I > 0; + lt(ee, I); + let te = Number(o) > 0, ne = !!(i?.last_index_end || i?.last_scan_end), re = te && ne, ie = "success"; + F || ee ? ie = "info" : !j || N ? ie = "error" : (P || !re || E) && (ie = "warning"); + let ae = p && ie !== "error" ? "browser" : ie, oe = i.watcher; try { - if (!ce || typeof ce.enabled != "boolean") { - let e = await l(d ? { signal: d } : void 0); - e?.ok && e.data && (ce = { + if (!oe || typeof oe.enabled != "boolean") { + let e = await n(l ? { signal: l } : void 0); + e?.ok && e.data && (oe = { enabled: !!e.data.enabled, - scope: i?.watcher?.scope || p, - custom_root_id: m || null + scope: i?.watcher?.scope || d, + custom_root_id: f || null }); } } catch (e) { console.debug?.(e); } - let le = h ? r("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: r("scope.customBrowser", "Browser") }) : rg(ce, p), ue = ne ? r("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: te }) : r("status.enrichmentIdle", "Metadata enrichment: idle"); - dg(n, _, v), fg(n, S, _); - let de = p === "all" ? r("scope.allFull", "All (Inputs + Outputs)") : p === "input" ? r("scope.input", "Inputs") : p === "custom" ? r("scope.customBrowser", "Browser") : r("scope.output", "Outputs"); - return oe === "error" ? (e.style.background = "var(--mjr-status-error, #f44336)", tg(c, "error"), eg(t, r("status.dbCorrupted", "Database appears corrupted or unavailable."), [ - A, - j, - C, - le - ].filter(Boolean).join(" | ")), i) : h ? (e.style.background = "var(--mjr-status-browser, #26A69A)", tg(c, "browser"), eg(t, r("status.ready", "Ready"), [r("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), le].filter(Boolean).join(" | ")), i) : (o === 0 ? (e.style.background = se === "browser" ? "var(--mjr-status-browser, #26A69A)" : oe === "info" ? "var(--mjr-status-info, #64B5F6)" : oe === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", tg(c, se), eg(t, r("status.noAssets", `No assets indexed yet (${de})`, { scope: de }), [ - r("status.clickToScan", "Click the dot to start a scan"), + let se = p ? R("status.watcher.disabledScoped", "Watcher: disabled ({scope})", { scope: R("scope.customBrowser", "Browser") }) : og(oe, d), ce = ee ? R("status.enrichmentQueue", "Metadata enrichment queue: {count}", { count: I }) : R("status.enrichmentIdle", "Metadata enrichment: idle"); + mg(r, g, _), hg(r, x, g); + let le = d === "all" ? R("scope.allFull", "All (Inputs + Outputs)") : d === "input" ? R("scope.input", "Inputs") : d === "custom" ? R("scope.customBrowser", "Browser") : R("scope.output", "Outputs"); + return ie === "error" ? (e.style.background = "var(--mjr-status-error, #f44336)", ig(c, "error"), rg(t, R("status.dbCorrupted", "Database appears corrupted or unavailable."), [ k, A, - j, - C, - le - ].filter(Boolean).join(" | "))) : (e.style.background = se === "browser" ? "var(--mjr-status-browser, #26A69A)" : oe === "info" ? "var(--mjr-status-info, #64B5F6)" : oe === "warning" ? "var(--mjr-status-warning, #FFA726)" : "var(--mjr-status-success, #4CAF50)", tg(c, se), Zh(t, [ - r("status.assetsIndexed", `${o.toLocaleString()} assets indexed (${de})`, { + S, + se + ].filter(Boolean).join(" | ")), i) : p ? (e.style.background = "var(--mjr-status-browser, #26A69A)", ig(c, "browser"), rg(t, R("status.ready", "Ready"), [R("status.browserMetricsHidden", "Browser mode: global DB/index metrics hidden"), se].filter(Boolean).join(" | ")), i) : (o === 0 ? (e.style.background = ae === "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)", ig(c, ae), rg(t, R("status.noAssets", `No assets indexed yet (${le})`, { scope: le }), [ + R("status.clickToScan", "Click the dot to start a scan"), + O, + k, + A, + S, + se + ].filter(Boolean).join(" | "))) : (e.style.background = ae === "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)", ig(c, ae), eg(t, [ + R("status.assetsIndexed", `${o.toLocaleString()} assets indexed (${le})`, { count: o.toLocaleString(), - scope: de + scope: le }), - Cg(i), - r("status.withWorkflows", `With workflows: ${s} - Generation data: ${u}`, { + Eg(i), + R("status.withWorkflows", `With workflows: ${s} - Generation data: ${u}`, { workflows: s, gendata: u }), - ue, + ce, + O, k, A, - j, - C, - le - ], r("status.lastScan", `Last scan: ${g}`, { date: g })), Qh(t, $h(i, { + S, + se + ], R("status.lastScan", `Last scan: ${h}`, { date: h })), tg(t, ng(i, { totalAssets: o, withWorkflows: s, withGenerationData: u }))), i); } else { - if (dg(n, {}, {}), fg(n, S), e.style.background = "var(--mjr-status-error, #f44336)", tg(c, "error"), y?.code === "INVALID_RESPONSE" && y?.status === 404) eg(t, 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 (mg(r, {}, {}), hg(r, x), e.style.background = "var(--mjr-status-error, #f44336)", ig(c, "error"), v?.code === "INVALID_RESPONSE" && v?.status === 404) rg(t, 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 e = String(y?.error || "").toLowerCase(); - e.includes("malform") || e.includes("corrupt") || e.includes("disk image") ? (eg(t, r("status.dbCorrupted"), r("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, s(r("toast.resetFailedCorrupt"), "error", 8e3))) : Zh(t, [y.error || r("status.errorChecking", "Error checking status")]); + let e = String(v?.error || "").toLowerCase(); + e.includes("malform") || e.includes("corrupt") || e.includes("disk image") ? (rg(t, R("status.dbCorrupted"), R("status.dbCorruptedHint")), globalThis._mjrCorruptToastShown || (globalThis._mjrCorruptToastShown = !0, m(R("toast.resetFailedCorrupt"), "error", 8e3))) : eg(t, [v.error || R("status.errorChecking", "Error checking status")]); } - if (y.code === "SERVICE_UNAVAILABLE") { - let r = vg(e, t, n, i); - t.appendChild(document.createElement("br")), t.appendChild(r); + if (v.code === "SERVICE_UNAVAILABLE") { + let n = xg(e, t, r, i); + t.appendChild(document.createElement("br")), t.appendChild(n); } } return null; } -function vg(e, t, n = null, i = null) { - let a = document.createElement("button"); - return a.textContent = r("btn.retryServices"), a.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 ", a.onclick = async () => { - a.disabled = !0, a.textContent = r("btn.retrying"); - let o = await ye(Le.RETRY_SERVICES, {}); - a.disabled = !1, a.textContent = r("btn.retryServices"), o.ok ? _g(e, t, n, i) : (Zh(t, [o.error || r("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(a)); - }, a; +function xg(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 y(L.RETRY_SERVICES, {}); + i.disabled = !1, i.textContent = R("btn.retryServices"), a.ok ? bg(e, t, n, r) : (eg(t, [a.error || R("status.retryFailed", "Retry failed")]), t.appendChild(document.createElement("br")), t.appendChild(i)); + }, i; } -function yg() { +function Sg() { try { - let e = localStorage?.getItem?.(Kh); + let e = localStorage?.getItem?.(Yh); if (!e) return null; let t = JSON.parse(e); return t && typeof t == "object" ? t : null; @@ -20507,15 +20506,15 @@ function yg() { return console.debug?.(e), null; } } -function bg(e) { +function Cg(e) { try { if (!e || typeof e != "object") return; - localStorage?.setItem?.(Kh, JSON.stringify(e)); + localStorage?.setItem?.(Yh, JSON.stringify(e)); } catch (e) { console.debug?.(e); } } -function xg(e) { +function wg(e) { let t = [], n = (e, r = 0) => { if (!(!e || r > 2)) { if (typeof e == "number" && Number.isFinite(e)) { @@ -20534,23 +20533,23 @@ function xg(e) { }; return n(e, 0), t; } -function Sg(e) { +function Tg(e) { if (!e || typeof e != "object") return !1; - if (Uh) return !0; + if (Kh) return !0; try { - if (St()?.active) return !0; + if (Jt()?.active) return !0; } catch (e) { console.debug?.(e); } - return xg(e).some((e) => Number(e) > 0); + return wg(e).some((e) => Number(e) > 0); } -function Cg(e) { +function Eg(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 wg(e) { +function Dg(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({ @@ -20568,23 +20567,23 @@ function wg(e) { } }); } -function Tg(e, t, n) { - let i = yg(); - if (!i) return !1; +function Og(e, t, n) { + let r = Sg(); + if (!r) return !1; try { - dg(n, i.tool_availability || {}, i.tool_paths || {}); + mg(n, r.tool_availability || {}, r.tool_paths || {}); } catch (e) { console.debug?.(e); } try { - return e.style.background = "var(--mjr-status-info, #64B5F6)", eg(t, r("status.cached", "Last known status"), r("status.checking", "Checking status...")), !0; + return e.style.background = "var(--mjr-status-info, #64B5F6)", rg(t, R("status.cached", "Last known status"), R("status.checking", "Checking status...")), !0; } catch (e) { return console.debug?.(e), !1; } } -function Eg(e, t, n) { - let r = wg(t), i = r && r !== String(n?.lastSignature || ""), a = Sg(t), o = e || qh.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; - return a || i ? (o = qh.ACTIVE, s = 0) : o === qh.ACTIVE ? (o = qh.COOLDOWN, s = 0) : o === qh.COOLDOWN ? (s += 1, s >= 3 && (o = qh.IDLE, s = 0)) : (o = i ? qh.ACTIVE : qh.IDLE, s = 0), { +function kg(e, t, n) { + let r = Dg(t), i = r && r !== String(n?.lastSignature || ""), a = Tg(t), o = e || Xh.ACTIVE, s = Number(n?.cooldownStablePolls || 0) || 0; + return a || i ? (o = Xh.ACTIVE, s = 0) : o === Xh.ACTIVE ? (o = Xh.COOLDOWN, s = 0) : o === Xh.COOLDOWN ? (s += 1, s >= 3 && (o = Xh.IDLE, s = 0)) : (o = i ? Xh.ACTIVE : Xh.IDLE, s = 0), { nextState: o, signature: r, hasChange: i, @@ -20592,53 +20591,53 @@ function Eg(e, t, n) { cooldownStablePolls: s }; } -function Dg(e, t, n, i = null, a = null, o = null) { - let s = "__MJR_STATUS_POLL_DISPOSE__", c = { +function Ag(e, t, n, r = null, i = null, a = null) { + let o = "__MJR_STATUS_POLL_DISPOSE__", s = { lastCode: null, lastStatus: null, _pollTick: 0, _auxCached: !1 - }, l = { - mode: qh.ACTIVE, + }, c = { + mode: Xh.ACTIVE, cooldownStablePolls: 0, lastSignature: "" - }, u = typeof AbortController < "u" ? new AbortController() : null, d = async () => { + }, l = typeof AbortController < "u" ? new AbortController() : null, u = async () => { try { - if (u?.signal?.aborted) return null; + if (l?.signal?.aborted) return null; } catch (e) { console.debug?.(e); } - c._pollTick = Number(c._pollTick || 0) + 1; - let n = c._pollTick > 1 && c._pollTick % 4 != 0, r = await _g(e, t, i, typeof o == "function" ? o() : null, c, { - signal: u?.signal || null, + s._pollTick = Number(s._pollTick || 0) + 1; + let n = s._pollTick > 1 && s._pollTick % 4 != 0, o = await bg(e, t, r, typeof a == "function" ? a() : null, s, { + signal: l?.signal || null, lightweight: n, - force: !!Uh || c._pollTick <= 1 + force: !!Kh || s._pollTick <= 1 }); - if (r && typeof r == "object") { - bg(r); - let e = Eg(l.mode, r, l); - l.mode = e.nextState, l.lastSignature = e.signature, l.cooldownStablePolls = e.cooldownStablePolls; + if (o && typeof o == "object") { + Cg(o); + let e = kg(c.mode, o, c); + c.mode = e.nextState, c.lastSignature = e.signature, c.cooldownStablePolls = e.cooldownStablePolls; } - if (r && typeof a == "function") try { - await a(r); + if (o && typeof i == "function") try { + await i(o); } catch (e) { console.debug?.(e); } - return r; + return o; }; - Tg(e, t, i), d(); + Og(e, t, r), u(); try { n._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); } try { - let e = window?.[s]; + let e = window?.[o]; typeof e == "function" && e(); } catch (e) { console.debug?.(e); } - let f = null, p = 0, m = !1, h = () => { + let d = null, f = 0, p = !1, m = () => { try { let e = typeof document < "u" && !!document.hidden, t = typeof document < "u" && typeof document.hasFocus == "function" && !document.hasFocus(); if (e || t) return 4; @@ -20646,16 +20645,16 @@ function Dg(e, t, n, i = null, a = null, o = null) { console.debug?.(e); } return 1; - }, g = () => { - let e = Jh[l.mode] || Math.max(250, Number(I.STATUS_POLL_INTERVAL) || 2e3), t = m ? Math.max(3e4, e) : p > 0 ? Math.min(6e4, Math.round(e * Math.min(8, 1 + p))) : e, r = Math.min(12e4, Math.round(t * h())); - f = setTimeout(async () => { + }, h = () => { + let e = Zh[c.mode] || Math.max(250, Number(z.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 (u?.signal?.aborted) return; + if (l?.signal?.aborted) return; } catch (e) { console.debug?.(e); } - let e = await d(); - if (m = c.lastCode === "INVALID_RESPONSE" && c.lastStatus === 404, e ? p = 0 : m ? p = Math.min(999, p + 1) : (p = Math.min(999, p + 1), l.mode = qh.ACTIVE, l.cooldownStablePolls = 0), m && p >= 3) { + 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 = Xh.ACTIVE, c.cooldownStablePolls = 0), p && f >= 3) { try { n._mjrStatusPollDispose?.(); } catch (e) { @@ -20663,75 +20662,75 @@ function Dg(e, t, n, i = null, a = null, o = null) { } return; } - g(); + h(); }, r); }; n._mjrStatusPollDispose = () => { try { - u?.abort?.(); + l?.abort?.(); } catch (e) { console.debug?.(e); } - f && clearTimeout(f), f = null; + d && clearTimeout(d), d = null; }; try { - window[s] = n._mjrStatusPollDispose; + window[o] = n._mjrStatusPollDispose; } catch (e) { console.debug?.(e); } - g(); - let _ = n.querySelector("#mjr-status-dot"); - _ && (_.onclick = (n) => { - n.stopPropagation(), lg(e, t, i, typeof o == "function" ? o() : null); - }, _.title = r("status.clickToScan", "Click to scan")); + h(); + let g = n.querySelector("#mjr-status-dot"); + g && (g.onclick = (n) => { + n.stopPropagation(), fg(e, t, r, typeof a == "function" ? a() : null); + }, g.title = R("status.clickToScan", "Click to scan")); } //#endregion //#region ui/vue/composables/useActiveAsset.ts -var Og = fn(null), kg = fn(null); -function Ag() { +var jg = fn(null), Mg = fn(null); +function Ng() { return { - activeAsset: Og, - onUpdateCallback: kg + activeAsset: jg, + onUpdateCallback: Mg }; } -function jg(e, t) { - kg.value = typeof t == "function" ? t : null, Og.value = e ?? null; +function Pg(e, t) { + Mg.value = typeof t == "function" ? t : null, jg.value = e ?? null; } -function Mg() { - Og.value = null, kg.value = null; +function Fg() { + jg.value = null, Mg.value = null; } -function Ng(e, t) { - if (!(!Og.value || !e)) { - Og.value = { - ...Og.value, +function Ig(e, t) { + if (!(!jg.value || !e)) { + jg.value = { + ...jg.value, ...e }; try { - let e = t ?? kg.value; - typeof e == "function" && e(Og.value); + let e = t ?? Mg.value; + typeof e == "function" && e(jg.value); } catch {} } } //#endregion //#region ui/components/sidebar/SidebarView.ts -var Pg = 360, Fg = 240, Ig = 640; -function Lg() { +var Lg = 360, Rg = 240, zg = 640; +function Bg() { try { - let e = Et(), t = Number(e?.sidebar?.widthPx); - return Number.isFinite(t) ? Math.max(Fg, Math.min(Ig, Math.round(t))) : Pg; + let e = pt(), t = Number(e?.sidebar?.widthPx); + return Number.isFinite(t) ? Math.max(Rg, Math.min(zg, Math.round(t))) : Lg; } catch { - return Pg; + return Lg; } } -function Rg(e, t) { +function Vg(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 = `${Lg()}px`; + let t = `${Bg()}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 zg(e) { +function Hg(e) { if (e == null) return !1; let t = e; if (typeof e == "string") { @@ -20750,10 +20749,10 @@ function zg(e) { } return !1; } -function Bg(e) { - return e ? !!(e.geninfo || e.prompt || zg(e.metadata_raw)) : !1; +function Ug(e) { + return e ? !!(e.geninfo || e.prompt || Hg(e.metadata_raw)) : !1; } -async function Vg(e, t, n) { +async function Wg(e, t, n) { if (!e || !t) return; let r = String(t?.kind || "").toLowerCase() === "folder"; try { @@ -20762,7 +20761,7 @@ async function Vg(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"), Rg(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, jg(t, n); + e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, e.classList.add("is-open"), Vg(e, !0), e._currentAsset = t, e._currentFullAsset = t, e._ratingTagsSection = null, Pg(t, n); let a = () => { e._currentFetchAbortController?.abort?.(); let t = typeof AbortController < "u" ? new AbortController() : null; @@ -20771,14 +20770,14 @@ async function Vg(e, t, n) { e._requestSeq !== i || e._currentAsset !== t || (e._currentFullAsset = { ...e._currentFullAsset ?? t, ...r - }, Ng(r, n)); + }, Ig(r, n)); }; (async () => { if (e._requestSeq !== i || e._currentAsset !== t) return; let n = a(), s = n.signal; if (r) { try { - let e = String(t?.filepath || t?.subfolder || "").trim(), r = String(t?.root_id || t?.rootId || "").trim(), i = await te({ + let e = String(t?.filepath || t?.subfolder || "").trim(), r = String(t?.root_id || t?.rootId || "").trim(), i = await N({ filepath: e, root_id: r, subfolder: r ? String(t?.subfolder || "").trim() : "" @@ -20793,8 +20792,8 @@ async function Vg(e, t, n) { } let c = () => e._currentFullAsset ?? t; try { - if (t.id && !Bg(c()) && !c().exif) { - let e = await ee(t.id, n); + if (t.id && !Ug(c()) && !c().exif) { + let e = await M(t.id, n); if (s?.aborted) return; e?.ok && e.data && o(e.data); } @@ -20802,10 +20801,10 @@ async function Vg(e, t, n) { s?.aborted || console.warn("Failed to load full asset metadata:", e); } if (!s?.aborted) { - if (!Bg(c())) { + if (!Ug(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 re({ + let a = await h({ type: t, filename: e, subfolder: r, @@ -20831,9 +20830,9 @@ async function Vg(e, t, n) { } })(); } -function Hg(e) { +function Gg(e) { if (e) { - e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), Rg(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, Mg(); + e._requestSeq = (e._requestSeq || 0) + 1, e.classList.remove("is-open"), Vg(e, !1), e._currentAsset = null, e._currentFullAsset = null, e._currentFetchAbortController?.abort?.(), e._currentFetchAbortController = null, Fg(); try { e.dispatchEvent?.(new CustomEvent("mjr:sidebar-closed", { bubbles: !0 })); } catch (e) { @@ -20842,239 +20841,18 @@ function Hg(e) { } } //#endregion -//#region ui/stores/usePanelStore.ts -var Ug = "mjr_panel_state", Wg = new Set([ - "output", - "input", - "all", - "custom" -]); -function Gg(e, t = !1) { - if (typeof e == "boolean") return e; - if (typeof e == "string") { - let t = e.trim().toLowerCase(); - if ([ - "1", - "true", - "yes", - "on" - ].includes(t)) return !0; - if ([ - "0", - "false", - "no", - "off" - ].includes(t)) return !1; - } - return !!t; -} -function Kg(e, t = 0) { - let n = Number(e); - return Number.isFinite(n) ? n : t; -} -function qg(e, t = "") { - return e == null ? t : String(e); -} -function Jg(e, t = 0, n = Infinity) { - return Math.max(t, Math.min(n, Math.floor(Kg(e, t)))); -} -function Yg(e) { - let t = qg(e || "output").toLowerCase(), n = t === "outputs" ? "output" : t === "inputs" ? "input" : t; - return Wg.has(n) ? n : "output"; -} -function Xg(e) { - if (!e || typeof e != "object") return {}; - let t = e; - return { - scope: Yg(t.scope), - customRootId: qg(t.customRootId), - customRootLabel: qg(t.customRootLabel), - currentFolderRelativePath: qg(t.currentFolderRelativePath || t.subfolder), - collectionId: qg(t.collectionId), - collectionName: qg(t.collectionName), - kindFilter: qg(t.kindFilter), - dateRangeFilter: qg(t.dateRangeFilter), - dateExactFilter: qg(t.dateExactFilter), - workflowOnly: Gg(t.workflowOnly, !1), - minRating: Jg(t.minRating, 0, 5), - minSizeMB: Math.max(0, Kg(t.minSizeMB, 0)), - maxSizeMB: Math.max(0, Kg(t.maxSizeMB, 0)), - resolutionCompare: t.resolutionCompare === "lte" ? "lte" : "gte", - minWidth: Jg(t.minWidth), - minHeight: Jg(t.minHeight), - maxWidth: Jg(t.maxWidth), - maxHeight: Jg(t.maxHeight), - workflowType: qg(t.workflowType), - sort: qg(t.sort || "mtime_desc"), - searchQuery: qg(t.searchQuery), - scrollTop: Jg(t.scrollTop), - activeAssetId: qg(t.activeAssetId), - selectedAssetIds: Array.isArray(t.selectedAssetIds) ? t.selectedAssetIds.map((e) => qg(e).trim()).filter(Boolean).slice(0, 5e3) : [], - sidebarOpen: Gg(t.sidebarOpen, !1) - }; -} -function Zg() { - try { - let e = localStorage.getItem(Ug); - if (e) return Xg(JSON.parse(e)); - } catch {} - return {}; -} -function Qg(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(Ug, JSON.stringify(t)); - } catch {} -} -var $g = Rn("mjr-panel", () => { - let e = Zg(), t = K(e.scope || "output"), n = K(e.customRootId || ""), r = K(e.customRootLabel || ""), i = K(e.currentFolderRelativePath || ""), a = K(e.collectionId || ""), o = K(e.collectionName || ""), s = K(e.kindFilter || ""), c = K(e.dateRangeFilter || ""), l = K(e.dateExactFilter || ""), u = K(e.workflowOnly || !1), d = K(e.minRating || 0), f = K(e.minSizeMB || 0), p = K(e.maxSizeMB || 0), m = K(e.resolutionCompare || "gte"), h = K(e.minWidth || 0), g = K(e.minHeight || 0), _ = K(e.maxWidth || 0), v = K(e.maxHeight || 0), y = K(e.workflowType || ""), b = K(e.sort || "mtime_desc"), x = K(e.searchQuery || ""), S = K(e.scrollTop || 0), C = K(e.activeAssetId || ""), w = K(e.selectedAssetIds || []), T = K(e.sidebarOpen || !1), E = K(0), D = K(0), O = K(""), k = K([]), A = K(""), j = K(""), M = null; - mn([ - t, - n, - r, - i, - a, - o, - s, - c, - l, - u, - d, - f, - p, - m, - h, - g, - _, - v, - y, - b, - x, - S, - C, - w, - T - ], () => { - M && clearTimeout(M), M = setTimeout(() => { - M = null, Qg({ - scope: t.value, - customRootId: n.value, - customRootLabel: r.value, - currentFolderRelativePath: i.value, - collectionId: a.value, - collectionName: o.value, - kindFilter: s.value, - dateRangeFilter: c.value, - dateExactFilter: l.value, - workflowOnly: u.value, - minRating: d.value, - minSizeMB: f.value, - maxSizeMB: p.value, - resolutionCompare: m.value, - minWidth: h.value, - minHeight: g.value, - maxWidth: _.value, - maxHeight: v.value, - workflowType: y.value, - sort: b.value, - searchQuery: x.value, - scrollTop: S.value, - activeAssetId: C.value, - selectedAssetIds: w.value, - sidebarOpen: T.value - }); - }, 750); - }, { deep: !0 }); - let N = (e) => { - if (!(e.key !== Ug || !e.newValue)) try { - let n = Xg(JSON.parse(e.newValue)); - n.scope !== void 0 && (t.value = n.scope), n.customRootLabel !== void 0 && (r.value = n.customRootLabel), n.searchQuery !== void 0 && (x.value = n.searchQuery), n.sort !== void 0 && (b.value = n.sort), n.sidebarOpen !== void 0 && (T.value = n.sidebarOpen); - } catch {} - }; - try { - window.addEventListener("storage", N); - } catch {} - On(() => { - try { - window.removeEventListener("storage", N); - } catch {} - }); - function F() { - s.value = "", c.value = "", l.value = "", u.value = !1, d.value = 0, f.value = 0, p.value = 0, m.value = "gte", h.value = 0, g.value = 0, _.value = 0, v.value = 0, y.value = "", x.value = ""; - } - function ee() { - w.value = [], C.value = ""; - } - function te(e, t = "") { - w.value = Array.isArray(e) ? e.map(String).filter(Boolean) : [], C.value = t || w.value[0] || ""; - } - function ne(e, s = {}) { - t.value = e, i.value = s.folder || "", a.value = s.collectionId || "", o.value = s.collectionName || "", n.value = s.customRootId || "", r.value = s.customRootLabel || "", O.value = "", k.value = [], A.value = "", j.value = "", ee(); - } - async function re() { - let e = String(n.value || "").trim(); - if (e) try { - let a = await P("/mjr/am/custom-roots"), o = (Array.isArray(a?.data) ? a.data : []).find((t) => String(t?.id || "") === e); - if (!o) { - n.value = "", r.value = "", t.value === "custom" && (t.value = "output", i.value = ""); - return; - } - let s = String(o.label || "").trim(); - s && s !== r.value && (r.value = s); - } catch {} - } - return { - scope: t, - customRootId: n, - customRootLabel: r, - currentFolderRelativePath: i, - collectionId: a, - collectionName: o, - kindFilter: s, - dateRangeFilter: c, - dateExactFilter: l, - workflowOnly: u, - minRating: d, - minSizeMB: f, - maxSizeMB: p, - resolutionCompare: m, - minWidth: h, - minHeight: g, - maxWidth: _, - maxHeight: v, - workflowType: y, - sort: b, - searchQuery: x, - scrollTop: S, - activeAssetId: C, - selectedAssetIds: w, - sidebarOpen: T, - lastGridCount: E, - lastGridTotal: D, - viewScope: O, - similarResults: k, - similarTitle: A, - similarSourceAssetId: j, - resetFilters: F, - clearSelection: ee, - setSelection: te, - navigateToScope: ne, - validatePersistedCustomRoot: re - }; -}); -//#endregion //#region ui/stores/getOptionalPanelStore.ts -function e_() { +function Kg() { try { - return zn() ? $g() : null; + return zn() ? Ut() : null; } catch { return null; } } //#endregion //#region ui/stores/panelStateBridge.ts -function t_(e, t = []) { - let n = e_(); +function qg(e, t = []) { + let n = Kg(); return { panelStore: n, hydrateStoreFromLegacy: () => {}, @@ -21102,12 +20880,12 @@ function t_(e, t = []) { } //#endregion //#region ui/features/panel/messages/messageCenter.ts -var n_ = "mjr_panel_messages_v1", r_ = "mjr_panel_messages_last_read_v1", i_ = "mjr_panel_messages_dismissed_builtin_ids_v1", a_ = 120, o_ = "/mjr/am/user-guide", s_ = new Set([ +var Jg = "mjr_panel_messages_v1", Yg = "mjr_panel_messages_last_read_v1", Xg = "mjr_panel_messages_dismissed_builtin_ids_v1", Zg = 120, Qg = "/mjr/am/user-guide", $g = new Set([ "info", "success", "warning", "error" -]), c_ = "mjr:panel-messages-changed", l_ = !1, u_ = [], d_ = Object.freeze([ +]), e_ = "mjr:panel-messages-changed", t_ = !1, n_ = [], r_ = Object.freeze([ { id: "whats-new-2026-05-17-dnd-graph-map-settings", title: "New Version 2.4.8 - DnD, Graph Map & Settings", @@ -21190,7 +20968,7 @@ var n_ = "mjr_panel_messages_v1", r_ = "mjr_panel_messages_last_read_v1", i_ = " bodyKey: "msg.whatsNew.body.localUserGuide", actionLabel: "User Guide", actionLabelKey: "label.userGuide", - actionUrl: o_ + actionUrl: Qg }, { id: "tip-2026-04-07-output-folder-override", @@ -21372,27 +21150,27 @@ var n_ = "mjr_panel_messages_v1", r_ = "mjr_panel_messages_last_read_v1", i_ = " actionLabelKey: "label.settingsGuide", actionUrl: "docs/SETTINGS_CONFIGURATION.md" } -]), f_ = new Set(d_.map((e) => String(e?.id || "").trim()).filter(Boolean)); -function p_(e, t = 0) { +]), i_ = new Set(r_.map((e) => String(e?.id || "").trim()).filter(Boolean)); +function a_(e, t = 0) { let n = Number(e); return Number.isFinite(n) ? n : t; } -function m_() { +function o_() { return Date.now(); } -function h_() { - return Be(`msg-${m_()}-`, 6); +function s_() { + return Pe(`msg-${o_()}-`, 6); } -function g_(e) { +function c_(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : s_.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : $g.has(t) ? t : "info"; } -function __(e) { - return f_.has(String(e || "").trim()); +function l_(e) { + return i_.has(String(e || "").trim()); } -function v_(e = {}) { +function u_(e = {}) { return { - id: String(e?.id || "").trim() || h_(), + id: String(e?.id || "").trim() || s_(), title: String(e?.title || "").trim() || "Info", titleKey: String(e?.titleKey || "").trim(), emoji: String(e?.emoji || "").trim(), @@ -21400,14 +21178,14 @@ function v_(e = {}) { bodyKey: String(e?.bodyKey || "").trim(), category: String(e?.category || "").trim() || "Info", categoryKey: String(e?.categoryKey || "").trim(), - createdAt: p_(e?.createdAt, m_()), - level: g_(e?.level), + createdAt: a_(e?.createdAt, o_()), + level: c_(e?.level), actionLabel: String(e?.actionLabel || "").trim(), actionLabelKey: String(e?.actionLabelKey || "").trim(), actionUrl: String(e?.actionUrl || "").trim() }; } -function y_(e, t) { +function d_(e, t) { try { let n = localStorage.getItem(e); return n ? JSON.parse(n) : t; @@ -21415,88 +21193,88 @@ function y_(e, t) { return t; } } -function b_(e, t) { +function f_(e, t) { try { localStorage.setItem(e, JSON.stringify(t)); } catch {} } -function x_() { +function p_() { try { - return p_(localStorage.getItem(r_), 0); + return a_(localStorage.getItem(Yg), 0); } catch { return 0; } } -function S_(e) { +function m_(e) { try { - localStorage.setItem(r_, String(p_(e, m_()))); + localStorage.setItem(Yg, String(a_(e, o_()))); } catch {} } -function C_() { - let e = y_(i_, []); - return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => __(e))); +function h_() { + let e = d_(Xg, []); + return new Set((Array.isArray(e) ? e : []).map((e) => String(e || "").trim()).filter((e) => l_(e))); } -function w_() { - u_.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), u_.length > a_ && (u_ = u_.slice(0, a_)); +function g_() { + n_.sort((e, t) => Number(t.createdAt || 0) - Number(e.createdAt || 0)), n_.length > Zg && (n_ = n_.slice(0, Zg)); } -function T_() { - b_(n_, u_); +function __() { + f_(Jg, n_); } -function E_() { - let e = C_(), t = !1; - for (let n of d_) { - let r = v_(n); +function v_() { + let e = h_(), t = !1; + for (let n of r_) { + let r = u_(n); if (e.has(r.id)) continue; - let i = u_.findIndex((e) => e.id === r.id); + let i = n_.findIndex((e) => e.id === r.id); if (i < 0) { - u_.push(r), t = !0; + n_.push(r), t = !0; continue; } - let a = u_[i], o = { + let a = n_[i], o = { ...a, ...r, - createdAt: p_(a?.createdAt, r.createdAt) + createdAt: a_(a?.createdAt, r.createdAt) }; - JSON.stringify(a) !== JSON.stringify(o) && (u_[i] = o, t = !0); + JSON.stringify(a) !== JSON.stringify(o) && (n_[i] = o, t = !0); } - return t ? (w_(), T_(), !0) : !1; + return t ? (g_(), __(), !0) : !1; } -function D_() { +function y_() { try { - window.dispatchEvent(new CustomEvent(c_, { detail: { - total: u_.length, - unread: j_() + window.dispatchEvent(new CustomEvent(e_, { detail: { + total: n_.length, + unread: C_() } })); } catch (e) { console.debug?.(e); } } -function O_() { - if (l_) return; - l_ = !0; - let e = y_(n_, []); - u_ = (Array.isArray(e) ? e : []).map(v_), w_(); +function b_() { + if (t_) return; + t_ = !0; + let e = d_(Jg, []); + n_ = (Array.isArray(e) ? e : []).map(u_), g_(); } -function k_() { - O_(), E_() && D_(); +function x_() { + b_(), v_() && y_(); } -function A_() { - return O_(), u_.map((e) => ({ ...e })); +function S_() { + return b_(), n_.map((e) => ({ ...e })); } -function j_() { - O_(); - let e = x_(); - return u_.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); +function C_() { + b_(); + let e = p_(); + return n_.reduce((t, n) => t + +(Number(n.createdAt || 0) > e), 0); } -function M_() { - return O_(), x_(); +function w_() { + return b_(), p_(); } -function N_({ upTo: e = m_() } = {}) { - O_(), S_(p_(e, m_())), D_(); +function T_({ upTo: e = o_() } = {}) { + b_(), m_(a_(e, o_())), y_(); } //#endregion //#region ui/features/panel/messages/shortcutGuide.ts -var P_ = Object.freeze([ +var E_ = Object.freeze([ { id: "panel", titleKey: "msg.shortcuts.section.panel", @@ -21685,45 +21463,45 @@ var P_ = Object.freeze([ ]) } ]); -function F_() { - return P_.map((e) => ({ +function D_() { + return E_.map((e) => ({ ...e, items: Array.isArray(e.items) ? e.items.map((e) => ({ ...e })) : [] })); } -function I_() { +function O_() { 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 F_()) { + 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 D_()) { let n = document.createElement("section"); n.className = "mjr-shortcut-section"; + let r = document.createElement("div"); + r.className = "mjr-shortcut-section-title", r.textContent = R(t.titleKey, t.title), n.appendChild(r); let i = document.createElement("div"); - i.className = "mjr-shortcut-section-title", i.textContent = r(t.titleKey, t.title), n.appendChild(i); - let a = document.createElement("div"); - a.className = "mjr-shortcut-list"; + i.className = "mjr-shortcut-list"; for (let e of t.items) { let t = document.createElement("div"); t.className = "mjr-shortcut-row"; let n = document.createElement("kbd"); n.className = "mjr-shortcut-key", n.textContent = String(e.keys || "").trim(); let r = document.createElement("div"); - r.className = "mjr-shortcut-desc", r.textContent = String(e.description || "").trim(), t.appendChild(n), t.appendChild(r), a.appendChild(t); + r.className = "mjr-shortcut-desc", r.textContent = String(e.description || "").trim(), t.appendChild(n), t.appendChild(r), i.appendChild(t); } - n.appendChild(a), e.appendChild(n); + n.appendChild(i), e.appendChild(n); } return e; } //#endregion //#region ui/features/panel/messages/messagePopoverController.ts -var L_ = new Set([ +var k_ = new Set([ "info", "success", "warning", "error" ]); -function R_(e) { +function A_(e) { let t = Number(e); if (!Number.isFinite(t) || t <= 0) return ""; try { @@ -21738,15 +21516,15 @@ function R_(e) { return ""; } } -function z_(e, t, n, i) { - let a = String(e?.[t] || "").trim(), o = String(e?.[n] || i || "").trim() || String(i || ""); - return a ? r(a, o) : o; +function j_(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 B_(e) { +function M_(e) { let t = String(e || "").trim().toLowerCase(); - return t === "warn" ? "warning" : t === "danger" ? "error" : L_.has(t) ? t : "info"; + return t === "warn" ? "warning" : t === "danger" ? "error" : k_.has(t) ? t : "info"; } -function V_(e) { +function N_(e) { let t = String(e || "").trim(); if (!t) return ""; try { @@ -21756,13 +21534,13 @@ function V_(e) { return ""; } } -function H_(e) { +function P_(e) { let t = String(e?.emoji || "").trim(); if (t) return t; - let n = B_(e?.level); + let n = M_(e?.level); return n === "success" ? "✅" : n === "warning" ? "⚠️" : n === "error" ? "❌" : "💡"; } -function U_(e) { +function F_(e) { switch (String(e || "").toLowerCase()) { case "success": return "OK"; case "warning": return "WARN"; @@ -21770,22 +21548,22 @@ function U_(e) { default: return "Tip"; } } -function W_(e) { +function I_(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 G_(e) { +function L_(e) { let t = String(e || "").trim().toLowerCase(); return t ? t.replace(/[_-]+/g, " ") : ""; } -function K_(e) { +function R_(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 q_(e) { +function z_(e) { let t = e?.progress; if (!t || typeof t != "object") return null; let n = Number(t.percent); @@ -21793,92 +21571,92 @@ function q_(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 J_({ activeTab: e = "messages", title: t = null, messagePopover: n = null, messageTabBtn: i = null, historyTabBtn: a = null, shortcutsTabBtn: o = null, messageList: s = null, historyPanel: c = null, shortcutsPanel: l = null, markReadBtn: u = null } = {}) { - let d = e === "messages", f = e === "history", p = e === "shortcuts", m = d ? r("label.messages", "Messages") : f ? r("label.toastHistory", "History") : r("msg.shortcuts.title", "Shortcut Guide"); +function B_({ 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 { - 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"), o?.classList.toggle("is-active", p), o?.setAttribute("aria-selected", p ? "true" : "false"), o?.setAttribute("tabindex", p ? "0" : "-1"); + 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"); } catch (e) { console.debug?.(e); } try { - t && (t.textContent = m), n?.setAttribute?.("aria-label", m), s && (s.hidden = !d, s.style.display = d ? "" : "none", s.setAttribute("aria-hidden", d ? "false" : "true")), c && (c.hidden = !f, c.style.display = f ? "" : "none", c.setAttribute("aria-hidden", f ? "false" : "true")), l && (l.hidden = !p, l.style.display = p ? "" : "none", l.setAttribute("aria-hidden", p ? "false" : "true")), u && (u.hidden = !d); + t && (t.textContent = p), n?.setAttribute?.("aria-label", p), o && (o.hidden = !u, o.style.display = u ? "" : "none", o.setAttribute("aria-hidden", u ? "false" : "true")), s && (s.hidden = !d, s.style.display = d ? "" : "none", s.setAttribute("aria-hidden", d ? "false" : "true")), c && (c.hidden = !f, c.style.display = f ? "" : "none", c.setAttribute("aria-hidden", f ? "false" : "true")), l && (l.hidden = !u); } catch (e) { console.debug?.(e); } } -function Y_({ messageBtn: e = null, messagePopover: t = null, title: i = null, messageList: a = null, historyTabBtn: o = null, historyTabBadge: s = null, historyTabCount: c = null, historyPanel: l = null, shortcutsPanel: u = null, messageTabBtn: d = null, messageTabBadge: f = null, shortcutsTabBtn: p = null, markReadBtn: g = null, popovers: _ = null, onBeforeToggle: v = null, signal: y = null } = {}) { - k_(); - let b = "messages", x = () => { - let n = t?.style?.display === "block"; +function V_({ messageBtn: e = null, messagePopover: n = null, title: r = null, messageList: i = null, historyTabBtn: a = null, historyTabBadge: o = null, historyTabCount: s = null, historyPanel: c = null, shortcutsPanel: u = null, messageTabBtn: d = null, messageTabBadge: f = null, shortcutsTabBtn: p = null, markReadBtn: m = null, popovers: h = null, onBeforeToggle: g = null, signal: _ = null } = {}) { + x_(); + let y = "messages", b = () => { + let t = n?.style?.display === "block"; try { - e?.setAttribute("aria-expanded", n ? "true" : "false"); + e?.setAttribute("aria-expanded", t ? "true" : "false"); } catch (e) { console.debug?.(e); } try { - t?.setAttribute("aria-hidden", n ? "false" : "true"); + n?.setAttribute("aria-hidden", t ? "false" : "true"); } catch (e) { console.debug?.(e); } - }, S = () => { - if (!a) return; - let e = A_(), t = M_(); - if (a.replaceChildren(), !e.length) { + }, x = () => { + if (!i) return; + let e = S_(), t = w_(); + if (i.replaceChildren(), !e.length) { let e = document.createElement("div"); - e.className = "mjr-messages-empty", e.textContent = r("msg.noMessages", "No messages for now."), a.appendChild(e); + e.className = "mjr-messages-empty", e.textContent = R("msg.noMessages", "No messages for now."), i.appendChild(e); return; } for (let n of e) { let e = document.createElement("article"); e.className = "mjr-message-item"; - let i = B_(n?.level); - e.classList.add(`mjr-message-item--${i}`); - let o = Number(n?.createdAt || 0); - o > Number(t || 0) && e.classList.add("mjr-message-item--unread"); + let r = M_(n?.level); + e.classList.add(`mjr-message-item--${r}`); + let a = Number(n?.createdAt || 0); + a > Number(t || 0) && e.classList.add("mjr-message-item--unread"); + let o = document.createElement("div"); + o.className = "mjr-message-item-head"; let s = document.createElement("div"); - s.className = "mjr-message-item-head"; - let c = document.createElement("div"); - c.className = "mjr-message-item-title-wrap"; - let l = document.createElement("span"); - l.className = "mjr-message-item-emoji", l.textContent = H_(n), l.setAttribute("aria-hidden", "true"); - let u = document.createElement("div"); - u.className = "mjr-message-item-title", u.textContent = z_(n, "titleKey", "title", r("label.info", "Info")); - let d = document.createElement("span"); - d.className = "mjr-message-item-category", d.textContent = z_(n, "categoryKey", "category", r("label.info", "Info")), c.appendChild(l), c.appendChild(u), s.appendChild(c), s.appendChild(d); + s.className = "mjr-message-item-title-wrap"; + let c = document.createElement("span"); + c.className = "mjr-message-item-emoji", c.textContent = P_(n), c.setAttribute("aria-hidden", "true"); + let l = document.createElement("div"); + l.className = "mjr-message-item-title", l.textContent = j_(n, "titleKey", "title", R("label.info", "Info")); + let u = document.createElement("span"); + u.className = "mjr-message-item-category", u.textContent = j_(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 = A_(a); let f = document.createElement("div"); - f.className = "mjr-message-item-meta", f.textContent = R_(o); - let p = document.createElement("div"); - p.className = "mjr-message-item-body", p.textContent = z_(n, "bodyKey", "body", ""), e.appendChild(s), f.textContent && e.appendChild(f), p.textContent && e.appendChild(p); - let m = V_(n?.actionUrl), h = z_(n, "actionLabelKey", "actionLabel", r("label.readMe", "Read Me")); - if (m && h) { + f.className = "mjr-message-item-body", f.textContent = j_(n, "bodyKey", "body", ""), e.appendChild(o), d.textContent && e.appendChild(d), f.textContent && e.appendChild(f); + let p = N_(n?.actionUrl), m = j_(n, "actionLabelKey", "actionLabel", R("label.readMe", "Read Me")); + if (p && m) { let t = document.createElement("a"); - t.className = "mjr-message-item-action", t.href = m, t.target = "_blank", t.rel = "noopener noreferrer", t.textContent = h, e.appendChild(t); + t.className = "mjr-message-item-action", t.href = p, t.target = "_blank", t.rel = "noopener noreferrer", t.textContent = m, e.appendChild(t); } - a.appendChild(e); + i.appendChild(e); } - }, C = () => { - if (!l) return; - let e = m(), t = l.querySelector(".mjr-history-list"); + }, S = () => { + if (!c) return; + let e = l(), t = c.querySelector(".mjr-history-list"); if (!t) { let e = document.createElement("div"); e.className = "mjr-history-head"; - let i = document.createElement("span"); - i.className = "mjr-history-head-label", i.textContent = r("label.recentActivity", "Recent activity"); - let a = document.createElement("button"); - a.type = "button", a.className = "mjr-btn mjr-history-clear-btn", a.textContent = r("btn.clearHistory", "Clear"), a.title = r("tooltip.clearToastHistory", "Clear toast history"), a.addEventListener("click", (e) => { - e.stopPropagation(), n(), C(); - }, y ? { signal: y } : void 0), e.appendChild(i), e.appendChild(a), t = document.createElement("div"), t.className = "mjr-history-list", l.replaceChildren(e, t); + let n = document.createElement("span"); + n.className = "mjr-history-head-label", n.textContent = R("label.recentActivity", "Recent activity"); + let r = document.createElement("button"); + r.type = "button", r.className = "mjr-btn mjr-history-clear-btn", r.textContent = R("btn.clearHistory", "Clear"), r.title = R("tooltip.clearToastHistory", "Clear toast history"), r.addEventListener("click", (e) => { + e.stopPropagation(), v(), S(); + }, _ ? { signal: _ } : void 0), e.appendChild(n), e.appendChild(r), t = document.createElement("div"), t.className = "mjr-history-list", c.replaceChildren(e, t); } if (t.replaceChildren(), !e.length) { let e = document.createElement("div"); - e.className = "mjr-messages-empty", e.textContent = r("msg.noHistory", "No recent activity."), t.appendChild(e); + e.className = "mjr-messages-empty", e.textContent = R("msg.noHistory", "No recent activity."), t.appendChild(e); return; } for (let n of e) { 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 = U_(n.type), r.setAttribute("aria-hidden", "true"); + r.className = "mjr-history-item-icon", r.textContent = F_(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"); @@ -21888,14 +21666,14 @@ function Y_({ messageBtn: e = null, messagePopover: t = null, title: i = 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 = R_(n.createdAt); + p.className = "mjr-history-item-time", p.textContent = A_(n.createdAt); let m = document.createElement("span"); - m.className = "mjr-history-item-chip", m.textContent = W_(n); + m.className = "mjr-history-item-chip", m.textContent = I_(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 = G_(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 _ = K_(n), v = q_(n); + g.className = "mjr-history-item-chip", g.textContent = L_(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 _ = R_(n), v = z_(n); if (_ || v !== null) { let e = document.createElement("div"); if (e.className = "mjr-history-item-progress", _) { @@ -21910,14 +21688,14 @@ function Y_({ messageBtn: e = null, messagePopover: t = null, title: i = null, m } i.appendChild(e); } - let y = V_(n?.actionUrl), b = String(n?.actionLabel || "").trim(); + let y = N_(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); } e.appendChild(r), e.appendChild(i), t.appendChild(e); } - }, w = (e, t) => { + }, C = (e, t) => { if (!e) return; let n = Math.max(0, Number(t || 0) || 0); if (n <= 0) { @@ -21925,49 +21703,49 @@ function Y_({ messageBtn: e = null, messagePopover: t = null, title: i = null, m return; } e.style.display = "inline-flex", e.textContent = n > 99 ? "99+" : String(n); + }, w = () => { + let e = ce(); + o && (o.style.display = e > 0 ? "inline-block" : "none"), C(s, e); }, T = () => { - let e = oe(); - s && (s.style.display = e > 0 ? "inline-block" : "none"), w(c, e); + u && (u.childNodes.length > 0 || u.replaceChildren(O_())); }, E = () => { - u && (u.childNodes.length > 0 || u.replaceChildren(I_())); - }, D = () => { - if (!g) return; - let e = Math.max(0, Number(j_() || 0) || 0); - if (g.disabled = e <= 0, e > 0) { - g.title = r("tooltip.markMessagesRead", "Mark all messages as read"); + if (!m) return; + let e = Math.max(0, Number(C_() || 0) || 0); + if (m.disabled = e <= 0, e > 0) { + m.title = R("tooltip.markMessagesRead", "Mark all messages as read"); return; } - g.title = r("tooltip.noUnreadMessages", "No unread messages"); - }, O = () => { - let t = Math.max(0, Number(j_() || 0) || 0); + m.title = R("tooltip.noUnreadMessages", "No unread messages"); + }, D = () => { + let t = Math.max(0, Number(C_() || 0) || 0); if (e) { - let n = e.querySelector(".mjr-message-badge"), i = 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 = i, e.setAttribute("aria-label", i), n && (t <= 0 ? (n.style.display = "none", n.textContent = "") : (n.style.display = "inline-flex", n.textContent = t > 9 ? "9+" : String(t))); + 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))); } - w(f, t), D(); - }, k = () => { - O(), T(), t?.style?.display === "block" && (b === "messages" && S(), b === "history" && C()); - }, A = y ? { signal: y } : void 0; + C(f, t), E(); + }, O = () => { + D(), w(), n?.style?.display === "block" && (y === "messages" && x(), y === "history" && S()); + }, k = _ ? { signal: _ } : void 0; try { - window.addEventListener(c_, k, A); + window.addEventListener(e_, O, k); } catch (e) { console.debug?.(e); } try { - window.addEventListener(se, () => { - T(), t?.style?.display === "block" && b === "history" && C(); - }, A); + window.addEventListener(le, () => { + w(), n?.style?.display === "block" && y === "history" && S(); + }, k); } catch (e) { console.debug?.(e); } try { - e && t && (t.id ||= "mjr-messages-popover", e.setAttribute("aria-haspopup", "dialog"), e.setAttribute("aria-controls", t.id)); + e && n && (n.id ||= "mjr-messages-popover", e.setAttribute("aria-haspopup", "dialog"), e.setAttribute("aria-controls", n.id)); } catch (e) { console.debug?.(e); } - let j = null; + let A = null; try { - typeof MutationObserver < "u" && t && (j = new MutationObserver(x), j.observe(t, { + typeof MutationObserver < "u" && n && (A = new MutationObserver(b), A.observe(n, { attributes: !0, attributeFilter: ["style"] })); @@ -21975,166 +21753,166 @@ function Y_({ messageBtn: e = null, messagePopover: t = null, title: i = null, m console.debug?.(e); } try { - y?.addEventListener?.("abort", () => j?.disconnect?.(), { once: !0 }); + _?.addEventListener?.("abort", () => A?.disconnect?.(), { once: !0 }); } catch (e) { console.debug?.(e); } - O(), T(), x(), J_({ - activeTab: b, - title: i, - messagePopover: t, + D(), w(), b(), B_({ + activeTab: y, + title: r, + messagePopover: n, messageTabBtn: d, - historyTabBtn: o, + historyTabBtn: a, shortcutsTabBtn: p, - messageList: a, - historyPanel: l, + messageList: i, + historyPanel: c, shortcutsPanel: u, - markReadBtn: g + markReadBtn: m }); - let M = () => { - b = "messages", J_({ - activeTab: b, - title: i, - messagePopover: t, + let j = () => { + y = "messages", B_({ + activeTab: y, + title: r, + messagePopover: n, messageTabBtn: d, - historyTabBtn: o, + historyTabBtn: a, shortcutsTabBtn: p, - messageList: a, - historyPanel: l, + messageList: i, + historyPanel: c, shortcutsPanel: u, - markReadBtn: g - }), S(), N_(), O(); + markReadBtn: m + }), x(), T_(), D(); + }, M = () => { + y = "history", B_({ + activeTab: y, + title: r, + messagePopover: n, + messageTabBtn: d, + historyTabBtn: a, + shortcutsTabBtn: p, + messageList: i, + historyPanel: c, + shortcutsPanel: u, + markReadBtn: m + }), S(), t(), w(); }, N = () => { - b = "history", J_({ - activeTab: b, - title: i, - messagePopover: t, + y = "shortcuts", B_({ + activeTab: y, + title: r, + messagePopover: n, messageTabBtn: d, - historyTabBtn: o, + historyTabBtn: a, shortcutsTabBtn: p, - messageList: a, - historyPanel: l, + messageList: i, + historyPanel: c, shortcutsPanel: u, - markReadBtn: g - }), C(), h(), T(); - }, P = () => { - b = "shortcuts", J_({ - activeTab: b, - title: i, - messagePopover: t, - messageTabBtn: d, - historyTabBtn: o, - shortcutsTabBtn: p, - messageList: a, - historyPanel: l, - shortcutsPanel: u, - markReadBtn: g - }), E(); - }, F = (e) => { + markReadBtn: m + }), T(); + }, P = (e) => { if (e === "messages") { - M(); + j(); return; } if (e === "history") { - N(); + M(); return; } - P(); - }, ee = () => { - if (!(!t || !_ || !e)) { - if (t?.style?.display !== "block") { + N(); + }, F = () => { + if (!(!n || !h || !e)) { + if (n?.style?.display !== "block") { try { - typeof v == "function" && v(); + typeof g == "function" && g(); } catch (e) { console.debug?.(e); } - _.toggle(t, e); + h.toggle(n, e); } - N(), x(), O(); + M(), b(), D(); } }; try { - window.addEventListener(B.OPEN_MESSAGE_HISTORY, () => { - ee(); - }, A); + window.addEventListener(H.OPEN_MESSAGE_HISTORY, () => { + F(); + }, k); } catch (e) { console.debug?.(e); } - let te = [ + let I = [ "messages", "history", "shortcuts" - ], ne = (e, t) => { - let n = String(e?.key || "").toLowerCase(), r = te.indexOf(String(t || "").toLowerCase()); + ], ee = (e, t) => { + let n = String(e?.key || "").toLowerCase(), r = I.indexOf(String(t || "").toLowerCase()); if (!(r < 0)) { if (n === "arrowright") { e.preventDefault(); - let t = te[(r + 1) % te.length]; - F(t), t === "messages" && d?.focus?.(), t === "history" && o?.focus?.(), t === "shortcuts" && p?.focus?.(); + let t = I[(r + 1) % I.length]; + P(t), t === "messages" && d?.focus?.(), t === "history" && a?.focus?.(), t === "shortcuts" && p?.focus?.(); return; } if (n === "arrowleft") { e.preventDefault(); - let t = te[(r + te.length - 1) % te.length]; - F(t), t === "messages" && d?.focus?.(), t === "history" && o?.focus?.(), t === "shortcuts" && p?.focus?.(); + let t = I[(r + I.length - 1) % I.length]; + P(t), t === "messages" && d?.focus?.(), t === "history" && a?.focus?.(), t === "shortcuts" && p?.focus?.(); return; } if (n === "home") { - e.preventDefault(), M(), d?.focus?.(); + e.preventDefault(), j(), d?.focus?.(); return; } if (n === "end") { - e.preventDefault(), P(), p?.focus?.(); + e.preventDefault(), N(), p?.focus?.(); return; } - (n === " " || n === "enter") && (e.preventDefault(), F(t)); + (n === " " || n === "enter") && (e.preventDefault(), P(t)); } }; - return e?.addEventListener("click", (n) => { - if (!(!t || !_ || !e)) { - n.stopPropagation(), b = "messages", S(), E(), J_({ - activeTab: b, - title: i, - messagePopover: t, + return e?.addEventListener("click", (t) => { + if (!(!n || !h || !e)) { + t.stopPropagation(), y = "messages", x(), T(), B_({ + activeTab: y, + title: r, + messagePopover: n, messageTabBtn: d, - historyTabBtn: o, + historyTabBtn: a, shortcutsTabBtn: p, - messageList: a, - historyPanel: l, + messageList: i, + historyPanel: c, shortcutsPanel: u, - markReadBtn: g + markReadBtn: m }); try { - typeof v == "function" && v(); + typeof g == "function" && g(); } catch (e) { console.debug?.(e); } - _.toggle(t, e), t?.style?.display === "block" && N_(), x(), O(); + h.toggle(n, e), n?.style?.display === "block" && T_(), b(), D(); } - }, A), d?.addEventListener("click", (e) => { + }, k), d?.addEventListener("click", (e) => { + e.preventDefault(), e.stopPropagation(), j(); + }, k), d?.addEventListener("keydown", (e) => ee(e, "messages"), k), a?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), M(); - }, A), d?.addEventListener("keydown", (e) => ne(e, "messages"), A), o?.addEventListener("click", (e) => { + }, k), a?.addEventListener("keydown", (e) => ee(e, "history"), k), p?.addEventListener("click", (e) => { e.preventDefault(), e.stopPropagation(), N(); - }, A), o?.addEventListener("keydown", (e) => ne(e, "history"), A), p?.addEventListener("click", (e) => { - e.preventDefault(), e.stopPropagation(), P(); - }, A), p?.addEventListener("keydown", (e) => ne(e, "shortcuts"), A), g?.addEventListener("click", (e) => { - e.preventDefault(), e.stopPropagation(), N_(), S(), O(); - }, A), { - refresh: k, - render: S, - updateButtonState: O, - showMessagesTab: M, - showHistoryTab: N, - showShortcutsTab: P, - openHistoryPopover: ee, + }, k), p?.addEventListener("keydown", (e) => ee(e, "shortcuts"), k), m?.addEventListener("click", (e) => { + e.preventDefault(), e.stopPropagation(), T_(), x(), D(); + }, k), { + refresh: O, + render: x, + updateButtonState: D, + showMessagesTab: j, + showHistoryTab: M, + showShortcutsTab: N, + openHistoryPopover: F, close: () => { - !t || !_ || (_.close(t), x()); + !n || !h || (h.close(n), b()); } }; } //#endregion //#region ui/features/panel/controllers/query.ts -function X_(e) { +function H_(e) { let t = e; for (let e = 0; e < 3 && !(!t || typeof t != "object" || !("value" in t)); e += 1) { let e = t.value; @@ -22143,8 +21921,8 @@ function X_(e) { } return t; } -function Z_(e) { - let t = X_(e); +function U_(e) { + let t = H_(e); if (!t) return null; let n = String(t?.tagName || "").toUpperCase(); if (n === "INPUT" || n === "TEXTAREA") return t; @@ -22158,14 +21936,14 @@ function Z_(e) { } return null; } -function Q_(e) { - let t = Z_(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; +function W_(e) { + let t = U_(e), n = t ? t.value : typeof e?.value == "string" ? e.value : ""; return String(n || "").trim() || "*"; } //#endregion //#region ui/features/panel/controllers/gridController.ts -function $_({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollectionAssets: i, disposeGrid: o, getQuery: c, searchInputEl: l, state: u }) { - let { read: d, write: f } = t_(u, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), m = !1, h = !1, g = {}, _ = 0, v = 0, y = 3e4, b = async (e, t = y) => { +function G_({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollectionAssets: r, disposeGrid: i, getQuery: o, searchInputEl: s, state: c }) { + let { read: l, write: u } = qg(c, /* @__PURE__ */ "scope.customRootId.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.resolutionCompare.minWidth.minHeight.maxWidth.maxHeight.workflowType.workflowId.dateRangeFilter.dateExactFilter.sort.activeAssetId.selectedAssetIds.collectionId.collectionName.viewScope.similarResults.similarTitle.similarSourceAssetId.lastGridCount.lastGridTotal".split(".")), d = !1, f = !1, p = {}, h = 0, g = 0, _ = 3e4, v = async (e, t = _) => { let n = null; try { let r = new Promise((e, r) => { @@ -22178,19 +21956,19 @@ function $_({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect } finally { n && clearTimeout(n); } - }, x = () => { + }, y = () => { try { - return l?.dataset?.mjrSemanticMode === "1"; + return s?.dataset?.mjrSemanticMode === "1"; } catch { return !1; } - }, S = () => { + }, b = () => { try { - return !!(Et()?.ai?.vectorSearchEnabled ?? !0); + return !!(pt()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } - }, C = (e, t = "") => { + }, x = (e, t = "") => { try { if (e && typeof e == "object") return String(e.error || e.message || t || "").trim(); } catch {} @@ -22199,81 +21977,82 @@ function $_({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect } catch { return String(t || "").trim(); } - }, w = (e = []) => !Array.isArray(e) || e.length === 0 ? !1 : e.some((e) => { + }, S = (e = []) => !Array.isArray(e) || e.length === 0 ? !1 : e.some((e) => { if (String(e?._matchType || e?.matchType || "").trim().toLowerCase().includes("semantic")) return !0; let t = Number(e?._vectorScore ?? e?.vectorScore ?? NaN); return Number.isFinite(t) && t > 0; - }), T = () => { - let e = String(d("currentFolderRelativePath", "") || "").trim(); + }), C = () => { + let e = String(l("currentFolderRelativePath", "") || "").trim(); return { - subfolder: !(d("scope", "output") === "custom" && !d("customRootId", "")) && e ? e : null, - kind: d("kindFilter", "") || null, - hasWorkflow: d("workflowOnly", !1) ? !0 : null, - minRating: Number(d("minRating", 0) || 0) > 0 ? Number(d("minRating", 0) || 0) : null, - minSizeMB: Number(d("minSizeMB", 0) || 0) > 0 ? Number(d("minSizeMB", 0) || 0) : null, - maxSizeMB: Number(d("maxSizeMB", 0) || 0) > 0 ? Number(d("maxSizeMB", 0) || 0) : null, - minWidth: Number(d("minWidth", 0) || 0) > 0 ? Number(d("minWidth", 0) || 0) : null, - minHeight: Number(d("minHeight", 0) || 0) > 0 ? Number(d("minHeight", 0) || 0) : null, - maxWidth: Number(d("maxWidth", 0) || 0) > 0 ? Number(d("maxWidth", 0) || 0) : null, - maxHeight: Number(d("maxHeight", 0) || 0) > 0 ? Number(d("maxHeight", 0) || 0) : null, - workflowType: String(d("workflowType", "") || "").trim().toUpperCase() || null, - dateRange: String(d("dateRangeFilter", "") || "").trim().toLowerCase() || null, - dateExact: String(d("dateExactFilter", "") || "").trim() || null + subfolder: !(l("scope", "output") === "custom" && !l("customRootId", "")) && e ? e : null, + kind: l("kindFilter", "") || null, + hasWorkflow: l("workflowOnly", !1) ? !0 : null, + minRating: Number(l("minRating", 0) || 0) > 0 ? Number(l("minRating", 0) || 0) : null, + minSizeMB: Number(l("minSizeMB", 0) || 0) > 0 ? Number(l("minSizeMB", 0) || 0) : null, + maxSizeMB: Number(l("maxSizeMB", 0) || 0) > 0 ? Number(l("maxSizeMB", 0) || 0) : null, + minWidth: Number(l("minWidth", 0) || 0) > 0 ? Number(l("minWidth", 0) || 0) : null, + minHeight: Number(l("minHeight", 0) || 0) > 0 ? Number(l("minHeight", 0) || 0) : null, + maxWidth: Number(l("maxWidth", 0) || 0) > 0 ? Number(l("maxWidth", 0) || 0) : null, + maxHeight: Number(l("maxHeight", 0) || 0) > 0 ? Number(l("maxHeight", 0) || 0) : null, + workflowType: String(l("workflowType", "") || "").trim().toUpperCase() || null, + workflowId: String(l("workflowId", "") || "").trim() || null, + dateRange: String(l("dateRangeFilter", "") || "").trim().toLowerCase() || null, + dateExact: String(l("dateExactFilter", "") || "").trim() || null }; - }, E = async (e = "") => { + }, w = async (e = "") => { let t = Date.now(); - if (!(t - Number(v || 0) < 15e3)) { - v = t; + if (!(t - Number(g || 0) < 15e3)) { + g = t; try { - let e = await Se(); + let e = await j(); if (e?.ok && e?.data) { - let t = Number(e.data?.total || 0) || 0, n = Number(e.data?.eligible_total || 0) || 0, i = Number(e.data?.coverage_ratio ?? NaN); + let t = Number(e.data?.total || 0) || 0, n = Number(e.data?.eligible_total || 0) || 0, r = Number(e.data?.coverage_ratio ?? NaN); if (t <= 10) { - s(r("toast.aiSearchNeedsBackfill", "AI search index is almost empty ({count} vectors). Run Enrich, then Vector Backfill for existing assets.", { count: t }), "warn", 6500); + m(R("toast.aiSearchNeedsBackfill", "AI search index is almost empty ({count} vectors). Run Enrich, then Vector Backfill for existing assets.", { count: t }), "warn", 6500); return; } - if (n > 0 && Number.isFinite(i) && i > 0 && i < .75) { - s(r("toast.aiSearchPartiallyIndexed", "AI search index is only partially built ({indexed}/{eligible}, {percent}%). Run Vector Backfill for existing assets.", { + if (n > 0 && Number.isFinite(r) && r > 0 && r < .75) { + m(R("toast.aiSearchPartiallyIndexed", "AI search index is only partially built ({indexed}/{eligible}, {percent}%). Run Vector Backfill for existing assets.", { indexed: t, eligible: n, - percent: Math.round(i * 100) + percent: Math.round(r * 100) }), "warn", 7e3); return; } } } catch {} - s(C(e, r("toast.aiSearchUnavailable", "AI search is currently unavailable. Falling back to normal search.")), "warn", 5200); + m(x(e, R("toast.aiSearchUnavailable", "AI search is currently unavailable. Falling back to normal search.")), "warn", 5200); } - }, D = async (r, i = {}) => { + }, T = async (r, i = {}) => { let o = String(r || "").trim(), s = /^ai:\s*/i.test(o); s && (o = o.replace(/^ai:\s*/i, "").trim()); - let c = S(), l = c && x(); + let c = b(), u = c && y(); if (!c) return await t(e, o || "*", i); - let u = l || s, f = !1, m = ""; - if (u && o && o !== "*") { + let d = u || s, f = !1, p = ""; + if (d && o && o !== "*") { f = !0; - let t = T(); + let t = C(); try { - let r = await p(o, { + let r = await a(o, { topK: 100, - scope: d("scope", "output") || "output", - customRootId: d("customRootId", "") || "", + scope: l("scope", "output") || "output", + customRootId: l("customRootId", "") || "", ...t }); - if (r?.ok && Array.isArray(r.data) && r.data.length > 0 && w(r.data)) return await n(e, r.data, { + if (r?.ok && Array.isArray(r.data) && r.data.length > 0 && S(r.data)) return await n(e, r.data, { title: `AI Search: "${o}" (${r.data.length} results)`, reset: !0, ...i }); - r?.ok === !1 && (m = C(r?.error || r?.message, m)); + r?.ok === !1 && (p = x(r?.error || r?.message, p)); } catch (e) { - m = C(e, m), console.debug?.("[Majoor] Hybrid search failed, trying pure semantic", e); + p = x(e, p), console.debug?.("[Majoor] Hybrid search failed, trying pure semantic", e); } try { - let r = await a(o, { + let r = await I(o, { topK: 100, - scope: d("scope", "output") || "output", - customRootId: d("customRootId", "") || "", + scope: l("scope", "output") || "output", + customRootId: l("customRootId", "") || "", ...t }); if (r?.ok && Array.isArray(r.data) && r.data.length > 0) return await n(e, r.data, { @@ -22281,66 +22060,66 @@ function $_({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect reset: !0, ...i }); - r?.ok === !1 && (m = C(r?.error || r?.message, m)); + r?.ok === !1 && (p = x(r?.error || r?.message, p)); } catch (e) { - m = C(e, m), console.debug?.("[Majoor] Semantic search failed, falling back to FTS", e); + p = x(e, p), console.debug?.("[Majoor] Semantic search failed, falling back to FTS", e); } } - let h = await t(e, o || "*", i); - return f && m && (Number(h?.count || 0) || 0) === 0 && E(m), h; - }, O = async (t = {}) => { - let a = String(e.dataset.mjrViewScope || "").trim().toLowerCase(), o = String(d("viewScope", u?.viewScope || "") || "").trim().toLowerCase(); - e.dataset.mjrScope = d("scope", "output"), e.dataset.mjrViewScope = o, e.dataset.mjrCustomRootId = d("customRootId", "") || ""; - let s = d("currentFolderRelativePath", "") || ""; - e.dataset.mjrSubfolder = s, e.dataset.mjrFilterKind = d("kindFilter", "") || "", e.dataset.mjrFilterWorkflowOnly = d("workflowOnly", !1) ? "1" : "0", e.dataset.mjrFilterMinRating = String(d("minRating", 0) || 0), e.dataset.mjrFilterMinSizeMB = String(d("minSizeMB", 0) || 0), e.dataset.mjrFilterMaxSizeMB = String(d("maxSizeMB", 0) || 0), e.dataset.mjrFilterResolutionCompare = String(d("resolutionCompare", "gte") || "gte"), e.dataset.mjrFilterMinWidth = String(d("minWidth", 0) || 0), e.dataset.mjrFilterMinHeight = String(d("minHeight", 0) || 0), e.dataset.mjrFilterMaxWidth = String(d("maxWidth", 0) || 0), e.dataset.mjrFilterMaxHeight = String(d("maxHeight", 0) || 0), e.dataset.mjrFilterWorkflowType = String(d("workflowType", "") || ""), e.dataset.mjrFilterDateRange = d("dateRangeFilter", "") || "", e.dataset.mjrFilterDateExact = d("dateExactFilter", "") || "", e.dataset.mjrSort = d("sort", "mtime_desc") || "mtime_desc", e.dataset.mjrCollectionId = d("collectionId", "") || "", e.dataset.mjrSemanticMode = x() ? "1" : "0"; + let m = await t(e, o || "*", i); + return f && p && (Number(m?.count || 0) || 0) === 0 && w(p), m; + }, E = async (t = {}) => { + let i = String(e.dataset.mjrViewScope || "").trim().toLowerCase(), a = String(l("viewScope", c?.viewScope || "") || "").trim().toLowerCase(); + e.dataset.mjrScope = l("scope", "output"), e.dataset.mjrViewScope = a, e.dataset.mjrCustomRootId = l("customRootId", "") || ""; + let s = l("currentFolderRelativePath", "") || ""; + e.dataset.mjrSubfolder = s, e.dataset.mjrFilterKind = l("kindFilter", "") || "", e.dataset.mjrFilterWorkflowOnly = l("workflowOnly", !1) ? "1" : "0", e.dataset.mjrFilterMinRating = String(l("minRating", 0) || 0), e.dataset.mjrFilterMinSizeMB = String(l("minSizeMB", 0) || 0), e.dataset.mjrFilterMaxSizeMB = String(l("maxSizeMB", 0) || 0), e.dataset.mjrFilterResolutionCompare = String(l("resolutionCompare", "gte") || "gte"), e.dataset.mjrFilterMinWidth = String(l("minWidth", 0) || 0), e.dataset.mjrFilterMinHeight = String(l("minHeight", 0) || 0), e.dataset.mjrFilterMaxWidth = String(l("maxWidth", 0) || 0), e.dataset.mjrFilterMaxHeight = String(l("maxHeight", 0) || 0), e.dataset.mjrFilterWorkflowType = String(l("workflowType", "") || ""), e.dataset.mjrFilterWorkflowId = String(l("workflowId", "") || ""), e.dataset.mjrFilterDateRange = l("dateRangeFilter", "") || "", e.dataset.mjrFilterDateExact = l("dateExactFilter", "") || "", e.dataset.mjrSort = l("sort", "mtime_desc") || "mtime_desc", e.dataset.mjrCollectionId = l("collectionId", "") || "", e.dataset.mjrSemanticMode = y() ? "1" : "0"; try { - e.dataset.mjrQuery = String(c?.() ?? "*") || "*"; + e.dataset.mjrQuery = String(o?.() ?? "*") || "*"; } catch (e) { console.debug?.(e); } - e.dataset.mjrGroupStacks = I.EXECUTION_GROUPING_ENABLED && (d("scope", "output") === "output" || d("scope", "output") === "all") ? "1" : "0"; + e.dataset.mjrGroupStacks = z.EXECUTION_GROUPING_ENABLED && (l("scope", "output") === "output" || l("scope", "output") === "all") ? "1" : "0"; try { - let t = Array.isArray(d("selectedAssetIds", [])) ? d("selectedAssetIds", []).filter(Boolean).map(String) : []; - t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), e.dataset.mjrSelectedAssetId = String(d("activeAssetId", "") || t[0] || "")) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); + let t = Array.isArray(l("selectedAssetIds", [])) ? l("selectedAssetIds", []).filter(Boolean).map(String) : []; + t.length ? (e.dataset.mjrSelectedAssetIds = JSON.stringify(t), e.dataset.mjrSelectedAssetId = String(l("activeAssetId", "") || t[0] || "")) : (delete e.dataset.mjrSelectedAssetIds, delete e.dataset.mjrSelectedAssetId); } catch (e) { console.debug?.(e); } - if (d("scope", "output") === "custom" && !d("customRootId", "") && !d("currentFolderRelativePath", "") && f("currentFolderRelativePath", ""), d("collectionId", "")) { - let t = await i?.(d("collectionId", "")); + if (l("scope", "output") === "custom" && !l("customRootId", "") && !l("currentFolderRelativePath", "") && u("currentFolderRelativePath", ""), l("collectionId", "")) { + let t = await r?.(l("collectionId", "")); if (t?.ok && t.data && Array.isArray(t.data.assets)) { - let r = d("collectionName", "") ? `Collection: ${d("collectionName", "")}` : "Collection", i = await n(e, t.data.assets, { + let r = l("collectionName", "") ? `Collection: ${l("collectionName", "")}` : "Collection", i = await n(e, t.data.assets, { title: r, reset: !0 }); try { - f("lastGridCount", Number(i?.count || 0) || 0), f("lastGridTotal", Number(i?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: i || {} })); + u("lastGridCount", Number(i?.count || 0) || 0), u("lastGridTotal", Number(i?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: i || {} })); } catch (e) { console.debug?.(e); } return; } - f("collectionId", ""), f("collectionName", ""); + u("collectionId", ""), u("collectionName", ""); } - let l = o; - if (l === "similar") { - let i = Array.isArray(d("similarResults", [])) ? d("similarResults", []) : [], a = Array.isArray(u?.similarResults) ? u.similarResults : [], o = i.length > 0 ? i : a, s = String(d("similarSourceAssetId", u?.similarSourceAssetId || "") || "").trim(), c = await n(e, o, { - title: String(d("similarTitle", u?.similarTitle || "") || r("search.similarResults", "Similar to asset #{id} ({n} results)", { - id: s || "?", - n: o.length + let d = a; + if (d === "similar") { + let r = Array.isArray(l("similarResults", [])) ? l("similarResults", []) : [], i = Array.isArray(c?.similarResults) ? c.similarResults : [], a = r.length > 0 ? r : i, o = String(l("similarSourceAssetId", c?.similarSourceAssetId || "") || "").trim(), s = await n(e, a, { + title: String(l("similarTitle", c?.similarTitle || "") || R("search.similarResults", "Similar to asset #{id} ({n} results)", { + id: o || "?", + n: a.length })).trim() || "Similar", reset: !0, ...t }); try { - f("lastGridCount", Number(c?.count || 0) || 0), f("lastGridTotal", Number(c?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: c || {} })); + u("lastGridCount", Number(s?.count || 0) || 0), u("lastGridTotal", Number(s?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: s || {} })); } catch (e) { console.debug?.(e); } return; } - let p = a === "similar" && l !== "similar", m = await D(c(), { + let f = i === "similar" && d !== "similar", p = await T(o(), { ...t, - preserveVisibleUntilReady: t.preserveVisibleUntilReady ?? !p + preserveVisibleUntilReady: t.preserveVisibleUntilReady ?? !f }); try { let e = window.MajoorMetrics?.hasTimer?.("searchQuery") ? window.MajoorMetrics?.endTimer?.("searchQuery", "searchQuery") : 0; @@ -22349,94 +22128,94 @@ function $_({ gridContainer: e, loadAssets: t, loadAssetsFromList: n, getCollect console.debug?.(e); } try { - f("lastGridCount", Number(m?.count || 0) || 0), f("lastGridTotal", Number(m?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: m || {} })); + u("lastGridCount", Number(p?.count || 0) || 0), u("lastGridTotal", Number(p?.total || 0) || 0), e.dispatchEvent?.(new CustomEvent("mjr:grid-stats", { detail: p || {} })); } catch (e) { console.debug?.(e); } - }, k = null, A = async () => { - if (h = !0, !m) { - m = !0; + }, D = null, O = async () => { + if (f = !0, !d) { + d = !0; try { - for (; h;) { - let e = { ...g || {} }; - g = {}, h = !1; + for (; f;) { + let e = { ...p || {} }; + p = {}, f = !1; try { - await b(() => O(e), S() && (x() || String(c?.() || "").length >= 12) ? 15e4 : y); + await v(() => E(e), b() && (y() || String(o?.() || "").length >= 12) ? 15e4 : _); } catch (e) { try { let t = Date.now(); - t - Number(_ || 0) > 2e3 && (_ = t, console.warn("[Majoor] Grid reload failed", e)); + t - Number(h || 0) > 2e3 && (h = t, console.warn("[Majoor] Grid reload failed", e)); } catch (e) { console.debug?.(e); } } } } finally { - m = !1; + d = !1; } } }; return { reloadGrid: (e = {}) => new Promise((t, n) => { - g = { - ...g || {}, + p = { + ...p || {}, ...e || {} - }, k && clearTimeout(k), k = setTimeout(() => { - k = null, A().then(t).catch(n); + }, D && clearTimeout(D), D = setTimeout(() => { + D = null, O().then(t).catch(n); }, 30); }) }; } //#endregion //#region ui/features/panel/controllers/browserNavigationController.ts -function ev({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbController: i = null, customSelect: a, reloadGrid: o, clearSelection: s = null, onContextChanged: c = null, lifecycleSignal: l = null } = {}) { - let { read: u, write: d } = t_(e, [ +function K_({ 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 } = qg(e, [ "scope", "customRootId", "currentFolderRelativePath" - ]), f = [], p = (e) => String(e || "").trim().replaceAll("\\", "/"), m = (e) => /^[a-zA-Z]:$/.test(String(e || "").trim()), h = () => p(u("currentFolderRelativePath", "") || ""), g = (e, t) => { - let n = p(t); - Array.isArray(e) && (!n && n !== "" || (e.length ? p(e[e.length - 1]) : null) !== n && e.push(n)); - }, _ = (e, t) => { - let n = p(t); + ]), d = [], f = (e) => String(e || "").trim().replaceAll("\\", "/"), p = (e) => /^[a-zA-Z]:$/.test(String(e || "").trim()), m = () => f(l("currentFolderRelativePath", "") || ""), h = (e, t) => { + let n = f(t); + Array.isArray(e) && (!n && n !== "" || (e.length ? f(e[e.length - 1]) : null) !== n && e.push(n)); + }, g = (e, t) => { + let n = f(t); if (!Array.isArray(e)) return null; for (; e.length;) { - let t = p(e.pop()); + let t = f(e.pop()); if (t !== n) return t; } return null; - }, v = (e) => { - let n = p(e); - d("currentFolderRelativePath", n); + }, _ = (e) => { + let n = f(e); + u("currentFolderRelativePath", n); try { t?.dataset && (t.dataset.mjrSubfolder = n); } catch (e) { console.debug?.(e); } - }, y = (e) => { - let t = p(e?.subfolder || ""); + }, v = (e) => { + let t = f(e?.subfolder || ""); if (t) return t; - let n = p(e?.filepath || e?.path || ""); - if (n) return String(e?.kind || "").toLowerCase() === "folder" ? n : b(n) || n; - let r = p(e?.filename || ""); - if (!r) return h(); - let i = h(); + let n = f(e?.filepath || e?.path || ""); + if (n) return String(e?.kind || "").toLowerCase() === "folder" ? n : y(n) || n; + let r = f(e?.filename || ""); + if (!r) return m(); + let i = m(); return i ? `${i}/${r}`.replace(/\/{2,}/g, "/") : r; - }, b = (e) => { - let t = p(e); + }, y = (e) => { + let t = f(e); if (!t) return ""; let n = t.split("/").filter(Boolean); - return n.length ? n.length === 1 ? m(n[0]) ? `${n[0]}/` : "" : (n.pop(), n.length === 1 && m(n[0]) ? `${n[0]}/` : n.join("/")) : ""; + return n.length ? n.length === 1 ? p(n[0]) ? `${n[0]}/` : "" : (n.pop(), n.length === 1 && p(n[0]) ? `${n[0]}/` : n.join("/")) : ""; + }, b = () => { + try { + s?.(); + } catch (e) { + console.debug?.(e); + } + try { + T(); + } catch (e) { + console.debug?.(e); + } }, x = () => { - try { - c?.(); - } catch (e) { - console.debug?.(e); - } - try { - E(); - } catch (e) { - console.debug?.(e); - } - }, S = () => { try { t && typeof t.scrollTop == "number" && (t.scrollTop = 0); } catch (e) { @@ -22448,165 +22227,165 @@ function ev({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbC } catch (e) { console.debug?.(e); } - }, C = async (e, { pushHistory: t = !0 } = {}) => { - let n = h(), r = p(e); + }, S = async (e, { pushHistory: t = !0 } = {}) => { + let n = m(), r = f(e); if (n !== r) { - t && g(f, n), v(r), S(), x(); + t && h(d, n), _(r), x(), b(); try { - s?.(); + o?.(); } catch (e) { console.debug?.(e); } - await o?.(); + await a?.(); } - }, w = async () => { - d("customRootId", ""), v(""), S(), x(); + }, C = async () => { + u("customRootId", ""), _(""), x(), b(); try { - s?.(); + o?.(); } catch (e) { console.debug?.(e); } - await o?.(); - }, T = (e) => { - if (typeof i?.setFolderBreadcrumb != "function") return !1; + await a?.(); + }, w = (e) => { + if (typeof r?.setFolderBreadcrumb != "function") return !1; try { - return i.setFolderBreadcrumb(e), !0; + return r.setFolderBreadcrumb(e), !0; } catch (e) { return console.debug?.(e), !1; } - }, E = () => { - let e = String(u("scope", "") || "") === "custom", t = String(u("currentFolderRelativePath", "") || "").trim().replaceAll("\\", "/"), i = e || !!t, o = String(u("customRootId", "") || "").trim(), s = (() => { - if (!o) return ""; + }, T = () => { + let e = String(l("scope", "") || "") === "custom", t = String(l("currentFolderRelativePath", "") || "").trim().replaceAll("\\", "/"), r = e || !!t, a = String(l("customRootId", "") || "").trim(), o = (() => { + if (!a) return ""; try { - let e = a?.selectedOptions?.[0] || null; + let e = i?.selectedOptions?.[0] || null; return String(e?.textContent || "").trim(); } catch { return ""; } })(); - if (!i) { - if (f.length = 0, T({ visible: !1 })) return; + if (!r) { + if (d.length = 0, w({ visible: !1 })) return; n.style.display = "none", n.replaceChildren(); return; } - let c = !!String(u("customRootId", "") || "").trim(), d = c && !t, p = !!t, g = f.length === 0 && !d && !p, v = !t || b(h()) === h(), y = async () => { - let e = _(f, h()); + let s = !!String(l("customRootId", "") || "").trim(), u = s && !t, f = !!t, h = d.length === 0 && !u && !f, _ = !t || y(m()) === m(), v = async () => { + let e = g(d, m()); if (e != null) { - await C(e, { pushHistory: !1 }); + await S(e, { pushHistory: !1 }); return; } - let t = h(); + let t = m(); if (t) { - let e = b(t); + let e = y(t); if (e === t) { - c && await w(); + s && await C(); return; } - await C(e, { pushHistory: !1 }); + await S(e, { pushHistory: !1 }); return; } - d && await w(); - }, x = async () => { - let e = b(h()); - if (e === h()) { - c && await w(); + u && await C(); + }, b = async () => { + let e = y(m()); + if (e === m()) { + s && await C(); return; } - await C(e); - }, S = (e, t, n = !1) => ({ + await S(e); + }, x = (e, t, n = !1) => ({ label: String(e || ""), target: String(t || ""), current: !!n, onClick: async () => { - if (e === "Computer" && String(u("customRootId", "") || "").trim()) { - await w(); + if (e === "Computer" && String(l("customRootId", "") || "").trim()) { + await C(); return; } - await C(t); + await S(t); } - }), E = [S(r("label.computer", "Computer"), "", !t)]; - if (o && E.push(S(s || o, "", !t)), t) { + }), T = [x(R("label.computer", "Computer"), "", !t)]; + if (a && T.push(x(o || a, "", !t)), t) { let e = t.split("/").filter(Boolean), n = ""; - for (let t = 0; t < e.length; t++) n = n ? `${n}/${e[t]}`.replace(/\/{2,}/g, "/") : m(e[t]) ? `${e[t]}/` : e[t], E.push(S(e[t], n, t === e.length - 1)); + for (let t = 0; t < e.length; t++) n = n ? `${n}/${e[t]}`.replace(/\/{2,}/g, "/") : p(e[t]) ? `${e[t]}/` : e[t], T.push(x(e[t], n, t === e.length - 1)); } - if (T({ + if (w({ visible: !0, back: { - label: r("btn.back", "Back"), - disabled: g, - onClick: y + label: R("btn.back", "Back"), + disabled: h, + onClick: v }, up: { - label: r("btn.up", "Up"), - disabled: v, - onClick: x + label: R("btn.up", "Up"), + disabled: _, + onClick: b }, - items: E + items: T })) return; n.style.display = "flex", n.replaceChildren(); + let E = document.createElement("button"); + E.type = "button", E.textContent = R("btn.back", "Back"), E.className = "mjr-btn-link", E.disabled = h, E.style.cssText = "background:rgba(122,162,255,0.12);border:1px solid rgba(122,162,255,0.35);border-radius:6px;padding:2px 8px;font:inherit;color:var(--mjr-accent, #7aa2ff);cursor:pointer;", E.addEventListener("click", v, { signal: c || void 0 }), n.appendChild(E); let D = document.createElement("button"); - D.type = "button", D.textContent = r("btn.back", "Back"), D.className = "mjr-btn-link", D.disabled = g, D.style.cssText = "background:rgba(122,162,255,0.12);border:1px solid rgba(122,162,255,0.35);border-radius:6px;padding:2px 8px;font:inherit;color:var(--mjr-accent, #7aa2ff);cursor:pointer;", D.addEventListener("click", y, { signal: l || void 0 }), n.appendChild(D); - let O = document.createElement("button"); - O.type = "button", O.textContent = r("btn.up", "Up"), O.className = "mjr-btn-link", O.disabled = v, O.style.cssText = "background:rgba(122,162,255,0.10);border:1px solid rgba(122,162,255,0.30);border-radius:6px;padding:2px 8px;font:inherit;color:var(--mjr-accent, #7aa2ff);cursor:pointer;", O.addEventListener("click", x, { signal: l || void 0 }), n.appendChild(O); - let k = document.createElement("span"); - k.textContent = "|", k.style.opacity = "0.5", n.appendChild(k); - let A = (e, t, n = !1) => { + D.type = "button", D.textContent = R("btn.up", "Up"), D.className = "mjr-btn-link", D.disabled = _, D.style.cssText = "background:rgba(122,162,255,0.10);border:1px solid rgba(122,162,255,0.30);border-radius:6px;padding:2px 8px;font:inherit;color:var(--mjr-accent, #7aa2ff);cursor:pointer;", D.addEventListener("click", b, { signal: c || void 0 }), n.appendChild(D); + let O = document.createElement("span"); + O.textContent = "|", O.style.opacity = "0.5", n.appendChild(O); + let k = (e, t, n = !1) => { let r = document.createElement("button"); return r.type = "button", r.textContent = e, r.className = "mjr-btn-link", r.style.cssText = `background:none;border:none;padding:0;color:${n ? "var(--mjr-text, inherit)" : "var(--mjr-accent, #7aa2ff)"};cursor:${n ? "default" : "pointer"};font:inherit;`, n ? r.disabled = !0 : r.addEventListener("click", async () => { - if (e === "Computer" && String(u("customRootId", "") || "").trim()) { - await w(); + if (e === "Computer" && String(l("customRootId", "") || "").trim()) { + await C(); return; } - await C(t); - }, { signal: l || void 0 }), r; + await S(t); + }, { signal: c || void 0 }), r; }; - for (let e = 0; e < E.length; e++) { + for (let e = 0; e < T.length; e++) { if (e > 0) { let e = document.createElement("span"); e.textContent = "/", e.style.opacity = "0.6", n.appendChild(e); } - let t = E[e]; - n.appendChild(A(t.label, t.target, t.current)); + let t = T[e]; + n.appendChild(k(t.label, t.target, t.current)); } }; return { - renderBreadcrumb: E, + renderBreadcrumb: T, resetHistory: () => { - f.length = 0; + d.length = 0; }, bindGridFolderNavigation: () => { let e = async (e) => { - let t = y(e?.detail?.asset || {}), n = h(); + let t = v(e?.detail?.asset || {}), n = m(); if (t !== n) { - g(f, n), v(t), S(), x(); + h(d, n), _(t), x(), b(); try { - s?.(); + o?.(); } catch (e) { console.debug?.(e); } try { - await o?.(); + await a?.(); } catch (e) { console.debug?.(e); } } }, n = async (e) => { - let t = String(e?.detail?.subfolder || "").trim().replaceAll("\\", "/"), n = h(); + let t = String(e?.detail?.subfolder || "").trim().replaceAll("\\", "/"), n = m(); if (t !== n) { - g(f, n), v(t), S(), x(); + h(d, n), _(t), x(), b(); try { - s?.(); + o?.(); } catch (e) { console.debug?.(e); } try { - await o?.(); + await a?.(); } catch (e) { console.debug?.(e); } } }; - t?.addEventListener?.("mjr:custom-subfolder-changed", n, { signal: l || void 0 }), t?.addEventListener?.("mjr:open-folder-asset", e, { signal: l || void 0 }); + t?.addEventListener?.("mjr:custom-subfolder-changed", n, { signal: c || void 0 }), t?.addEventListener?.("mjr:open-folder-asset", e, { signal: c || void 0 }); try { t._mjrHasCustomSubfolderHandler = !0; } catch (e) { @@ -22630,13 +22409,13 @@ function ev({ state: e, gridContainer: t, folderBreadcrumb: n, folderBreadcrumbC } }; }, - notifyContext: x + notifyContext: b }; } //#endregion //#region ui/features/panel/controllers/scopeController.ts -function tv({ 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 } = t_(e, [ +function q_({ 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 } = qg(e, [ "scope", "customRootId", "currentFolderRelativePath", @@ -22748,95 +22527,69 @@ function tv({ state: e, tabButtons: t, customMenuBtn: n, customPopover: r, popov } //#endregion //#region ui/features/panel/controllers/contextController.ts -var nv = (e, t) => { +var J_ = (e, t) => { if (e) try { e.value = t; } catch (e) { console.debug?.(e); } -}, rv = (e, t) => { +}, Y_ = (e, t) => { if (e) try { e.checked = !!t; } catch (e) { console.debug?.(e); } }; -function iv({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, ratingSelect: l, minSizeInput: u, maxSizeInput: d, minWidthInput: f, minHeightInput: p, maxWidthInput: m, maxHeightInput: h, resolutionPresetSelect: g, dateRangeSelect: _, dateExactInput: v, scopeController: y, sortController: b, updateSummaryBar: x, reloadGrid: S, extraActions: C = null, getExtraContext: w = null } = {}) { - let T = e && typeof e == "object" ? e : {}, { read: E, write: D, controllerState: O } = t_(e, [ - "searchQuery", - "scope", - "collectionId", - "collectionName", - "customRootId", - "customRootLabel", - "currentFolderRelativePath", - "kindFilter", - "workflowOnly", - "minRating", - "minSizeMB", - "maxSizeMB", - "minWidth", - "minHeight", - "maxWidth", - "maxHeight", - "resolutionCompare", - "workflowType", - "dateRangeFilter", - "dateExactFilter", - "sort", - "viewScope", - "similarResults", - "similarTitle", - "similarSourceAssetId" - ]), k = (e, t) => { - D(e, t); - }, A = (e, t = "") => E(e, t), j = () => ({ - ...T || {}, - ...O?.() || {}, - customRootLabel: A("customRootLabel", "") - }), M = () => { +function X_({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsBtn: i, searchInputEl: a, kindSelect: o, wfCheckbox: s, workflowTypeSelect: c, workflowIdInput: l, ratingSelect: u, minSizeInput: d, maxSizeInput: f, minWidthInput: p, minHeightInput: m, maxWidthInput: h, maxHeightInput: g, resolutionPresetSelect: _, dateRangeSelect: v, dateExactInput: y, scopeController: b, sortController: x, updateSummaryBar: S, reloadGrid: C, extraActions: w = null, getExtraContext: T = null } = {}) { + let E = e && typeof e == "object" ? e : {}, { read: D, write: O, controllerState: k } = qg(e, /* @__PURE__ */ "searchQuery.scope.collectionId.collectionName.customRootId.customRootLabel.currentFolderRelativePath.kindFilter.workflowOnly.minRating.minSizeMB.maxSizeMB.minWidth.minHeight.maxWidth.maxHeight.resolutionCompare.workflowType.workflowId.dateRangeFilter.dateExactFilter.sort.viewScope.similarResults.similarTitle.similarSourceAssetId".split(".")), A = (e, t) => { + O(e, t); + }, j = (e, t = "") => D(e, t), M = () => ({ + ...E || {}, + ...k?.() || {}, + customRootLabel: j("customRootLabel", "") + }), N = () => { try { - C?.resetBrowserHistory?.(); + w?.resetBrowserHistory?.(); } catch (e) { console.debug?.(e); } - }, N = () => { + }, P = () => { try { let e = t?.closest?.(".mjr-assets-manager") || document.querySelector?.(".mjr-assets-manager") || document.documentElement; if (!e?.style?.setProperty) return; - e.style.setProperty("--mjr-star-active", String(I.BADGE_STAR_COLOR || "#FFD45A")), e.style.setProperty("--mjr-badge-image", String(I.BADGE_IMAGE_COLOR || "#2196F3")), e.style.setProperty("--mjr-badge-video", String(I.BADGE_VIDEO_COLOR || "#9C27B0")), e.style.setProperty("--mjr-badge-audio", String(I.BADGE_AUDIO_COLOR || "#FF9800")), e.style.setProperty("--mjr-badge-model3d", String(I.BADGE_MODEL3D_COLOR || "#4CAF50")), e.style.setProperty("--mjr-badge-duplicate-alert", String(I.BADGE_DUPLICATE_ALERT_COLOR || "#FF1744")); + e.style.setProperty("--mjr-star-active", String(z.BADGE_STAR_COLOR || "#FFD45A")), e.style.setProperty("--mjr-badge-image", String(z.BADGE_IMAGE_COLOR || "#2196F3")), e.style.setProperty("--mjr-badge-video", String(z.BADGE_VIDEO_COLOR || "#9C27B0")), e.style.setProperty("--mjr-badge-audio", String(z.BADGE_AUDIO_COLOR || "#FF9800")), e.style.setProperty("--mjr-badge-model3d", String(z.BADGE_MODEL3D_COLOR || "#4CAF50")), e.style.setProperty("--mjr-badge-duplicate-alert", String(z.BADGE_DUPLICATE_ALERT_COLOR || "#FF1744")); } catch (e) { console.debug?.(e); } - }, P = { + }, F = { clearQuery: async () => { try { - nv(a, ""), k("searchQuery", ""); + J_(a, ""), A("searchQuery", ""); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearCollection: async () => { try { - k("collectionId", ""), k("collectionName", ""); + A("collectionId", ""), A("collectionName", ""); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearScope: async () => { try { - if (String(e?.viewScope || "").trim().toLowerCase() === "similar" && typeof C?.clearSimilarScope == "function") { - await C.clearSimilarScope(); + if (String(e?.viewScope || "").trim().toLowerCase() === "similar" && typeof w?.clearSimilarScope == "function") { + await w.clearSimilarScope(); return; } } catch (e) { @@ -22844,144 +22597,156 @@ function iv({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB } let n = !1; try { - k("customRootId", ""), k("customRootLabel", ""), k("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, M(), typeof y?.setScope == "function" ? (await y.setScope("output"), n = !0) : (k("scope", "output"), y?.setActiveTabStyles?.()); + A("customRootId", ""), A("customRootLabel", ""), A("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, N(), typeof b?.setScope == "function" ? (await b.setScope("output"), n = !0) : (A("scope", "output"), b?.setActiveTabStyles?.()); } catch (e) { console.debug?.(e); } try { - n || await S?.(); + n || await C?.(); } catch (e) { console.debug?.(e); } }, clearCustomRoot: async () => { try { - k("customRootId", ""), k("customRootLabel", ""), k("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, M(); + A("customRootId", ""), A("customRootLabel", ""), A("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, N(); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearFolder: async () => { try { - k("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, M(); + A("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, N(); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearKind: async () => { try { - k("kindFilter", ""), nv(o, ""); + A("kindFilter", ""), J_(o, ""); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearMinRating: async () => { try { - k("minRating", 0), nv(l, "0"); + A("minRating", 0), J_(u, "0"); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearWorkflowOnly: async () => { try { - k("workflowOnly", !1), rv(s, !1); + A("workflowOnly", !1), Y_(s, !1); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearWorkflowType: async () => { try { - k("workflowType", ""), nv(c, ""); + A("workflowType", ""), J_(c, ""); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); + } catch (e) { + console.debug?.(e); + } + }, + clearWorkflowId: async () => { + try { + A("workflowId", ""), J_(l, ""); + } catch (e) { + console.debug?.(e); + } + try { + await C?.(); } catch (e) { console.debug?.(e); } }, clearSize: async () => { try { - k("minSizeMB", 0), k("maxSizeMB", 0), nv(u, ""), nv(d, ""); + A("minSizeMB", 0), A("maxSizeMB", 0), J_(d, ""), J_(f, ""); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearResolution: async () => { try { - k("minWidth", 0), k("minHeight", 0), k("maxWidth", 0), k("maxHeight", 0), nv(f, ""), nv(p, ""), nv(m, ""), nv(h, ""), nv(g, ""); + A("minWidth", 0), A("minHeight", 0), A("maxWidth", 0), A("maxHeight", 0), J_(p, ""), J_(m, ""), J_(h, ""), J_(g, ""), J_(_, ""); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearDateRange: async () => { try { - k("dateRangeFilter", ""), nv(_, ""); + A("dateRangeFilter", ""), J_(v, ""); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearDateExact: async () => { try { - k("dateExactFilter", ""), nv(v, ""); + A("dateExactFilter", ""), J_(y, ""); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } }, clearSort: async () => { try { - k("sort", "mtime_desc"), b?.setSortIcon?.(A("sort", "mtime_desc")), b?.renderSortMenu?.(); + A("sort", "mtime_desc"), x?.setSortIcon?.(j("sort", "mtime_desc")), x?.renderSortMenu?.(); } catch (e) { console.debug?.(e); } try { - await S?.(); + await C?.(); } catch (e) { console.debug?.(e); } @@ -22989,125 +22754,125 @@ function iv({ state: e, gridContainer: t, filterBtn: n, sortBtn: r, collectionsB clearAll: async () => { let e = !1; try { - nv(a, ""); + J_(a, ""); } catch (e) { console.debug?.(e); } try { - k("collectionId", ""), k("collectionName", ""), k("kindFilter", ""), k("workflowOnly", !1), k("minRating", 0), k("minSizeMB", 0), k("maxSizeMB", 0), k("minWidth", 0), k("minHeight", 0), k("maxWidth", 0), k("maxHeight", 0), k("resolutionCompare", "gte"), k("workflowType", ""), k("dateRangeFilter", ""), k("dateExactFilter", ""), k("sort", "mtime_desc"), k("customRootId", ""), k("customRootLabel", ""), k("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, M(); + A("collectionId", ""), A("collectionName", ""), A("kindFilter", ""), A("workflowOnly", !1), A("minRating", 0), A("minSizeMB", 0), A("maxSizeMB", 0), A("minWidth", 0), A("minHeight", 0), A("maxWidth", 0), A("maxHeight", 0), A("resolutionCompare", "gte"), A("workflowType", ""), A("workflowId", ""), A("dateRangeFilter", ""), A("dateExactFilter", ""), A("sort", "mtime_desc"), A("customRootId", ""), A("customRootLabel", ""), A("currentFolderRelativePath", ""), delete t?.dataset?.mjrSubfolder, N(); try { - await C?.clearTransientContext?.(); + await w?.clearTransientContext?.(); } catch (e) { console.debug?.(e); } - typeof y?.setScope == "function" ? (await y.setScope("output"), e = !0) : (k("scope", "output"), y?.setActiveTabStyles?.()); + typeof b?.setScope == "function" ? (await b.setScope("output"), e = !0) : (A("scope", "output"), b?.setActiveTabStyles?.()); } catch (e) { console.debug?.(e); } try { - nv(o, ""), rv(s, !1), nv(c, ""), nv(l, "0"), nv(u, ""), nv(d, ""), nv(f, ""), nv(p, ""), nv(m, ""), nv(h, ""), nv(g, ""), nv(_, ""), nv(v, ""); + J_(o, ""), Y_(s, !1), J_(c, ""), J_(l, ""), J_(u, "0"), J_(d, ""), J_(f, ""), J_(p, ""), J_(m, ""), J_(h, ""), J_(g, ""), J_(_, ""), J_(v, ""), J_(y, ""); } catch (e) { console.debug?.(e); } try { - b?.setSortIcon?.(A("sort", "mtime_desc")), b?.renderSortMenu?.(); + x?.setSortIcon?.(j("sort", "mtime_desc")), x?.renderSortMenu?.(); } catch (e) { console.debug?.(e); } try { - e || await S?.(); + e || await C?.(); } catch (e) { console.debug?.(e); } } }; - if (C && typeof C == "object") { + if (w && typeof w == "object") { let e = new Set([ "__proto__", "constructor", "prototype" ]); - for (let [t, n] of Object.entries(C)) e.has(String(t)) || (P[t] = n); + for (let [t, n] of Object.entries(w)) e.has(String(t)) || (F[t] = n); } return { update: () => { - let e = String(a?.value || "").trim(), o = Q_(a), s = j(), c = !!(A("kindFilter", "") || A("workflowOnly", !1) || (Number(A("minRating", 0) || 0) || 0) > 0 || (Number(A("minSizeMB", 0) || 0) || 0) > 0 || (Number(A("maxSizeMB", 0) || 0) || 0) > 0 || (Number(A("minWidth", 0) || 0) || 0) > 0 || (Number(A("minHeight", 0) || 0) || 0) > 0 || (Number(A("maxWidth", 0) || 0) || 0) > 0 || (Number(A("maxHeight", 0) || 0) || 0) > 0 || String(A("workflowType", "") || "").trim().length > 0 || A("dateRangeFilter", "") || A("dateExactFilter", "")), l = String(A("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!A("collectionId", ""); + let e = String(a?.value || "").trim(), o = W_(a), s = M(), c = !!(j("kindFilter", "") || j("workflowOnly", !1) || (Number(j("minRating", 0) || 0) || 0) > 0 || (Number(j("minSizeMB", 0) || 0) || 0) > 0 || (Number(j("maxSizeMB", 0) || 0) || 0) > 0 || (Number(j("minWidth", 0) || 0) || 0) > 0 || (Number(j("minHeight", 0) || 0) || 0) > 0 || (Number(j("maxWidth", 0) || 0) || 0) > 0 || (Number(j("maxHeight", 0) || 0) || 0) > 0 || String(j("workflowType", "") || "").trim().length > 0 || String(j("workflowId", "") || "").trim().length > 0 || j("dateRangeFilter", "") || j("dateExactFilter", "")), l = String(j("sort", "mtime_desc") || "mtime_desc") !== "mtime_desc", u = !!j("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) { console.debug?.(e); } try { - let n = typeof w == "function" && w() || {}; - x?.({ + let n = typeof T == "function" && T() || {}; + S?.({ state: s, gridContainer: t, context: { rawQuery: e || o, ...n }, - actions: P + actions: F }); } catch (e) { console.debug?.(e); } - N(); + P(); }, - actions: P + actions: F }; } //#endregion //#region ui/features/panel/controllers/customRootsController.ts -function av({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: i, comfyPrompt: a, comfyToast: o, get: s, post: c, ENDPOINTS: l, reloadGrid: u, onRootChanged: d = null }) { - let f = e && typeof e == "object" ? e : {}, { read: p, write: m } = t_(e, [ +function Z_({ 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 } = qg(e, [ "customRootId", "customRootLabel", "currentFolderRelativePath" - ]), h = (e) => { - m("customRootLabel", String(e || "")); - }, g = async (e = null) => { - let i = t.querySelector("option[value=\"\"]")?.textContent || r("label.selectFolder", "Select folder..."); + ]), m = (e) => { + p("customRootLabel", String(e || "")); + }, h = async (e = null) => { + let r = t.querySelector("option[value=\"\"]")?.textContent || R("label.selectFolder", "Select folder..."); t.innerHTML = ""; - let a = document.createElement("option"); - a.value = "", a.textContent = r("msg.loading"), a.disabled = !0, t.appendChild(a), t.disabled = !0; + let i = document.createElement("option"); + i.value = "", i.textContent = R("msg.loading"), i.disabled = !0, t.appendChild(i), t.disabled = !0; try { - let r = await s(l.CUSTOM_ROOTS), a = r && r.ok && Array.isArray(r.data) ? r.data : []; + let i = await o(c.CUSTOM_ROOTS), a = i && i.ok && Array.isArray(i.data) ? i.data : []; t.innerHTML = ""; - let o = document.createElement("option"); - o.value = "", o.textContent = i, t.appendChild(o), a.forEach((e) => { + let s = document.createElement("option"); + s.value = "", s.textContent = r, t.appendChild(s), a.forEach((e) => { let n = document.createElement("option"); n.value = e.id, n.textContent = e.name || e.path || e.id, t.appendChild(n); }); - let c = e || p("customRootId", ""); - if (c && a.some((e) => e.id === c)) { - t.value = c, m("customRootId", c); + let l = e || f("customRootId", ""); + if (l && a.some((e) => e.id === l)) { + t.value = l, p("customRootId", l); try { let e = t.options[t.selectedIndex]; - h(String(e?.text || "").trim()); + m(String(e?.text || "").trim()); } catch { - h(""); + m(""); } - } else t.value = "", m("customRootId", ""), h(""); - n.disabled = !p("customRootId", ""); + } else t.value = "", p("customRootId", ""), m(""); + n.disabled = !f("customRootId", ""); } catch (e) { console.warn("Majoor: failed to load custom roots", e), t.innerHTML = ""; let n = document.createElement("option"); - n.value = "", n.textContent = r("msg.errorLoadingFolders"), n.disabled = !0, t.appendChild(n); + n.value = "", n.textContent = R("msg.errorLoadingFolders"), n.disabled = !0, t.appendChild(n); } finally { t.disabled = !1; } }; return { - refreshCustomRoots: g, - bind: ({ customAddBtn: n, customRemoveBtn: s }) => { - let _ = [], v = (e, t, n) => { + refreshCustomRoots: h, + bind: ({ customAddBtn: n, customRemoveBtn: o }) => { + let g = [], _ = (e, t, n) => { if (!(!e?.addEventListener || typeof n != "function")) { try { e.addEventListener(t, n); } catch { return; } - _.push(() => { + g.push(() => { try { e.removeEventListener(t, n); } catch (e) { @@ -23116,71 +22881,71 @@ function av({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: i, co }); } }; - return v(t, "change", async () => { + return _(t, "change", async () => { if (!t.disabled) { - m("customRootId", t.value || ""); + p("customRootId", t.value || ""); try { let e = t.options[t.selectedIndex]; - h(String(e?.text || "").trim()); + m(String(e?.text || "").trim()); } catch { - h(""); + m(""); } - m("currentFolderRelativePath", ""), s.disabled = !p("customRootId", ""); + p("currentFolderRelativePath", ""), o.disabled = !f("customRootId", ""); try { - await d?.(f); + await u?.(d); } catch (e) { console.debug?.(e); } - await u(); + await l(); } - }), n && (n.disabled = !1, n.title = r("btn.add", "Add")), v(n, "click", async () => { + }), n && (n.disabled = !1, n.title = R("btn.add", "Add")), _(n, "click", async () => { let t = ""; try { - let e = await c(l.BROWSE_FOLDER, {}); + let e = await s(c.BROWSE_FOLDER, {}); e?.ok && (t = String(e?.data?.path || "").trim()); } catch (e) { console.debug?.(e); } if (!t) { - let e = await a(r("dialog.enterFolderPath", "Enter folder path"), ""); + let e = await i(R("dialog.enterFolderPath", "Enter folder path"), ""); t = String(e || "").trim(); } if (!t) return; - let n = await a(r("dialog.folderLabelOptional", "Folder label (optional)"), ""), i = await c(l.CUSTOM_ROOTS, { + let n = await i(R("dialog.folderLabelOptional", "Folder label (optional)"), ""), r = await s(c.CUSTOM_ROOTS, { path: t, label: String(n || "").trim() || void 0 }); - if (!i?.ok) { - o(i?.error || r("toast.failedAddFolder", "Failed to add browser folder"), "error"); + if (!r?.ok) { + a(r?.error || R("toast.failedAddFolder", "Failed to add browser folder"), "error"); return; } - await g(String(i?.data?.id || "").trim() || null); + await h(String(r?.data?.id || "").trim() || null); try { - await d?.(e); + await u?.(e); } catch (e) { console.debug?.(e); } - await u(), o(r("toast.folderAdded", "Folder added"), "success"); - }), v(s, "click", async () => { - if (!p("customRootId", "")) return; - let e = t.options[t.selectedIndex], n = e ? e.text : r("label.thisFolder", "this folder"); - if (await i(r("dialog.removeFolder", `Remove the browser folder "${n}"?`, { name: n }), r("dialog.customFoldersTitle", "Majoor: Browser Folders"))) { - s.disabled = !0, s.textContent = r("btn.removing"); + await l(), a(R("toast.folderAdded", "Folder added"), "success"); + }), _(o, "click", async () => { + if (!f("customRootId", "")) return; + let e = t.options[t.selectedIndex], n = e ? e.text : R("label.thisFolder", "this folder"); + if (await r(R("dialog.removeFolder", `Remove the browser folder "${n}"?`, { name: n }), R("dialog.customFoldersTitle", "Majoor: Browser Folders"))) { + o.disabled = !0, o.textContent = R("btn.removing"); try { - let e = await c(l.CUSTOM_ROOTS_REMOVE, { id: p("customRootId", "") }); + let e = await s(c.CUSTOM_ROOTS_REMOVE, { id: f("customRootId", "") }); if (!e?.ok) { - o(e?.error || r("toast.failedRemoveFolder", "Failed to remove browser folder"), "error"); + a(e?.error || R("toast.failedRemoveFolder", "Failed to remove browser folder"), "error"); return; } - o(r("toast.folderRemoved", "Folder removed"), "success"), m("customRootId", ""), h(""), m("currentFolderRelativePath", ""), await g(), await u(); + a(R("toast.folderRemoved", "Folder removed"), "success"), p("customRootId", ""), m(""), p("currentFolderRelativePath", ""), await h(), await l(); } catch (e) { - console.warn("Majoor: remove custom root failed", e), o(r("toast.errorRemovingFolder", "An error occurred while removing the browser folder"), "error"); + console.warn("Majoor: remove custom root failed", e), a(R("toast.errorRemovingFolder", "An error occurred while removing the browser folder"), "error"); } finally { - s.disabled = !p("customRootId", ""), s.textContent = r("btn.remove"); + o.disabled = !f("customRootId", ""), o.textContent = R("btn.remove"); } } }), () => { - for (let e of _.splice(0)) try { + for (let e of g.splice(0)) try { e(); } catch (e) { console.debug?.(e); @@ -23191,45 +22956,45 @@ function av({ state: e, customSelect: t, customRemoveBtn: n, comfyConfirm: i, co } //#endregion //#region ui/features/panel/controllers/sortController.ts -function ov({ state: e, sortBtn: t, sortMenu: n, sortPopover: i, popovers: a, reloadGrid: o, onChanged: s = null }) { - let { read: c, write: l } = t_(e, ["sort"]), u = () => [ +function Q_({ state: e, sortBtn: t, sortMenu: n, sortPopover: r, popovers: i, reloadGrid: a, onChanged: o = null }) { + let { read: s, write: c } = qg(e, ["sort"]), l = () => [ { key: "mtime_desc", - label: r("sort.newest") + label: R("sort.newest") }, { key: "mtime_asc", - label: r("sort.oldest") + label: R("sort.oldest") }, { key: "name_asc", - label: r("sort.nameAZ") + label: R("sort.nameAZ") }, { key: "name_desc", - label: r("sort.nameZA") + label: R("sort.nameZA") }, { key: "rating_desc", - label: r("sort.ratingHigh") + label: R("sort.ratingHigh") }, { key: "size_desc", - label: r("sort.sizeDesc") + label: R("sort.sizeDesc") }, { key: "size_asc", - label: r("sort.sizeAsc") + label: R("sort.sizeAsc") } - ], d = (e) => { + ], u = (e) => { let n = t.querySelector("i"); n && (e === "name_asc" ? n.className = "pi pi-sort-alpha-down" : e === "name_desc" ? n.className = "pi pi-sort-alpha-up" : e === "mtime_asc" ? n.className = "pi pi-sort-amount-up-alt" : e === "rating_desc" ? n.className = "pi pi-star-fill" : e === "size_desc" ? n.className = "pi pi-sort-numeric-down-alt" : e === "size_asc" ? n.className = "pi pi-sort-numeric-up-alt" : n.className = "pi pi-sort-amount-down"); - }, f = () => { + }, d = () => { n.replaceChildren(); - let e = u(); + let e = l(); for (let t of e) { - let e = t.key === c("sort", "mtime_desc"), r = document.createElement("button"); - r.type = "button", r.className = "mjr-menu-item", r.style.cssText = ` + let e = t.key === s("sort", "mtime_desc"), l = document.createElement("button"); + l.type = "button", l.className = "mjr-menu-item", l.style.cssText = ` display:flex; align-items:center; justify-content:space-between; @@ -23242,102 +23007,102 @@ function ov({ state: e, sortBtn: t, sortMenu: n, sortPopover: i, popovers: a, re box-shadow:${e ? "0 0 0 1px rgba(160,210,255,0.22) inset, 0 8px 18px rgba(35,95,185,0.26)" : "none"}; transition: border-color 120ms ease, background 120ms ease, box-shadow 120ms ease; `; - let u = document.createElement("span"); - u.className = "mjr-menu-item-label", u.textContent = t.label, u.style.cssText = `font-weight:${e ? "700" : "600"}; color:${e ? "rgba(208,234,255,0.98)" : "var(--fg-color, #e6edf7)"};`; + let f = document.createElement("span"); + f.className = "mjr-menu-item-label", f.textContent = t.label, f.style.cssText = `font-weight:${e ? "700" : "600"}; color:${e ? "rgba(208,234,255,0.98)" : "var(--fg-color, #e6edf7)"};`; let p = document.createElement("i"); - p.className = "pi pi-check mjr-menu-item-check", p.style.cssText = `opacity:${e ? "1" : "0"}; color: rgba(133,203,255,0.98);`, r.appendChild(u), r.appendChild(p), r.addEventListener("mouseenter", () => { - e || (r.style.borderColor = "rgba(145,205,255,0.4)", r.style.background = "linear-gradient(135deg, rgba(80,140,255,0.18), rgba(32,100,200,0.14))"); - }), r.addEventListener("mouseleave", () => { - e || (r.style.borderColor = "rgba(120,190,255,0.18)", r.style.background = "linear-gradient(135deg, rgba(255,255,255,0.03), rgba(255,255,255,0.01))"); - }), r.addEventListener("click", async () => { - l("sort", t.key), d(c("sort", "mtime_desc")), f(); + p.className = "pi pi-check mjr-menu-item-check", p.style.cssText = `opacity:${e ? "1" : "0"}; color: rgba(133,203,255,0.98);`, l.appendChild(f), l.appendChild(p), l.addEventListener("mouseenter", () => { + e || (l.style.borderColor = "rgba(145,205,255,0.4)", l.style.background = "linear-gradient(135deg, rgba(80,140,255,0.18), rgba(32,100,200,0.14))"); + }), l.addEventListener("mouseleave", () => { + e || (l.style.borderColor = "rgba(120,190,255,0.18)", l.style.background = "linear-gradient(135deg, rgba(255,255,255,0.03), rgba(255,255,255,0.01))"); + }), l.addEventListener("click", async () => { + c("sort", t.key), u(s("sort", "mtime_desc")), d(); try { - s?.(); + o?.(); } catch (e) { console.debug?.(e); } - i.style.display = "none", a.close(i), await o(); - }), n.appendChild(r); + r.style.display = "none", i.close(r), await a(); + }), n.appendChild(l); } }; return { bind: ({ onBeforeToggle: e } = {}) => { - d(c("sort", "mtime_desc")), f(), t.addEventListener("click", (n) => { + u(s("sort", "mtime_desc")), d(), t.addEventListener("click", (n) => { n.stopPropagation(); try { e?.(); } catch (e) { console.debug?.(e); } - f(), a.toggle(i, t); + d(), i.toggle(r, t); }); }, - renderSortMenu: f, - setSortIcon: d + renderSortMenu: d, + setSortIcon: u }; } //#endregion //#region ui/features/panel/controllers/sidebarController.ts -var sv = "_mjrRescanning", cv = 1500, lv = (e) => /^\d+$/.test(String(e ?? "").trim()); -async function uv({ card: e, asset: t, sidebar: n, onAssetUpdated: i }) { +var $_ = "_mjrRescanning", ev = 1500, tv = (e) => /^\d+$/.test(String(e ?? "").trim()); +async function nv({ card: e, asset: t, sidebar: n, onAssetUpdated: r }) { if (!e || !t || globalThis._mjrMaintenanceActive) return; try { let t = Date.now(); - if (t - (Number(e[sv] || 0) || 0) < cv) return; - e[sv] = t; + if (t - (Number(e[$_] || 0) || 0) < ev) return; + e[$_] = t; } catch (e) { console.debug?.(e); } - let a = e.querySelector(".mjr-workflow-dot"); + let i = e.querySelector(".mjr-workflow-dot"); try { - a && (ct(a, "pending", "Pending: metadata refresh in progress", { asset: t }), a.classList.add("mjr-pulse-animation"), a.style.cursor = "progress", a.title = r("tooltip.pendingRefresh", "Pending: metadata refresh in progress")); + i && (Gt(i, "pending", "Pending: metadata refresh in progress", { asset: t }), i.classList.add("mjr-pulse-animation"), i.style.cursor = "progress", i.title = R("tooltip.pendingRefresh", "Pending: metadata refresh in progress")); } catch (e) { console.debug?.(e); } try { - s(r("toast.rescanUpdatingAiIndex", "Rescanning file + updating AI index..."), "info", 2200); + m(R("toast.rescanUpdatingAiIndex", "Rescanning file + updating AI index..."), "info", 2200); } catch (e) { console.debug?.(e); } - let o = { + let a = { filename: t.filename, subfolder: t.subfolder || "", type: String(t.type || "output").toLowerCase(), root_id: Oe(t) || void 0 - }, c = null, l = !1, u = !1, d = !1; + }, o = null, s = !1, c = !1, l = !1; try { - if (l = !!(await ye(Le.INDEX_FILES, { - files: [o], + if (s = !!(await y(L.INDEX_FILES, { + files: [a], incremental: !1 - }))?.ok, !l && a && (ct(a, "error", "Error: metadata refresh failed", { asset: t }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""), lv(t?.id)) { - u = !0; + }))?.ok, !s && i && (Gt(i, "error", "Error: metadata refresh failed", { asset: t }), i.classList.remove("mjr-pulse-animation"), i.style.cursor = ""), tv(t?.id)) { + c = !0; try { - d = !!(await b(t.id))?.ok; + l = !!(await S(t.id))?.ok; } catch (e) { console.debug?.(e); } } - if (l && t.id != null) { - let e = await ee(t.id); - e?.ok && e.data && (c = { + if (s && t.id != null) { + let e = await M(t.id); + e?.ok && e.data && (o = { ...t, ...e.data }); } } catch { try { - a && (ct(a, "error", "Error: metadata refresh failed", { asset: t }), a.classList.remove("mjr-pulse-animation"), a.style.cursor = ""); + i && (Gt(i, "error", "Error: metadata refresh failed", { asset: t }), i.classList.remove("mjr-pulse-animation"), i.style.cursor = ""); } catch (e) { console.debug?.(e); } } try { - if (c) { - e._mjrAsset = c, typeof i == "function" && i(c); + if (o) { + e._mjrAsset = o, typeof r == "function" && r(o); try { if (n?.classList?.contains?.("is-open")) { let e = n?._currentAsset?.id ?? n?._currentFullAsset?.id ?? null; - e != null && String(e) === String(c.id) && (n._mjrNeedsRefresh = !0); + e != null && String(e) === String(o.id) && (n._mjrNeedsRefresh = !0); } } catch (e) { console.debug?.(e); @@ -23345,26 +23110,26 @@ async function uv({ card: e, asset: t, sidebar: n, onAssetUpdated: i }) { } } finally { try { - if (a && a.isConnected) { - let e = lt(c || t); - e && a.replaceWith(e); + if (i && i.isConnected) { + let e = xt(o || t); + e && i.replaceWith(e); } } catch { try { - a && (a.style.cursor = ""); + i && (i.style.cursor = ""); } catch (e) { console.debug?.(e); } } } try { - l && d ? s(r("toast.metadataVectorUpdated", "Metadata + AI vector index updated for this asset."), "success", 2200) : l && u && !d && s(r("toast.metadataUpdatedVectorFailed", "Metadata updated. AI vector index could not be updated."), "warning", 2600); + s && l ? m(R("toast.metadataVectorUpdated", "Metadata + AI vector index updated for this asset."), "success", 2200) : s && c && !l && m(R("toast.metadataUpdatedVectorFailed", "Metadata updated. AI vector index could not be updated."), "warning", 2600); } catch (e) { console.debug?.(e); } - return c; + return o; } -function dv(e, t) { +function rv(e, t) { if (e) { try { let n = e.querySelector(".mjr-asset-card.is-selected"); @@ -23400,7 +23165,7 @@ function dv(e, t) { } } } -var fv = (e) => { +var iv = (e) => { if (e == null) return ""; try { if (typeof CSS < "u" && typeof CSS.escape == "function") return CSS.escape(String(e)); @@ -23409,32 +23174,32 @@ var fv = (e) => { } return String(e).replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g, "\\$1"); }; -function pv(e, t) { +function av(e, t) { if (!e || !t) return null; try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${fv(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${iv(t)}"]`); } catch (e) { console.debug?.(e); } try { - return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${fv(t)}"]`); + return e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${iv(t)}"]`); } catch (e) { console.debug?.(e); } return null; } -function mv(e) { +function ov(e) { if (!e) return null; let t = e.dataset?.mjrSelectedAssetId; if (t) { - let n = pv(e, t); + let n = av(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 = pv(e, t[0]); + let n = av(e, t[0]); if (n) return n; } } catch (e) { @@ -23442,7 +23207,7 @@ function mv(e) { } return e.querySelector(".mjr-asset-card.is-selected"); } -function hv(e, { preventScroll: t = !0 } = {}) { +function sv(e, { preventScroll: t = !0 } = {}) { if (e) try { e.focus?.({ preventScroll: t }); } catch { @@ -23453,14 +23218,14 @@ function hv(e, { preventScroll: t = !0 } = {}) { } } } -function gv(e, { force: t = !1 } = {}) { +function cv(e, { force: t = !1 } = {}) { if (!e || !t && !e._mjrFocusWithin) return; - let n = mv(e); - n && (hv(n), e._mjrFocusWithin = !0); + let n = ov(e); + n && (sv(n), e._mjrFocusWithin = !0); } -function _v(e) { +function lv(e) { if (e) try { - let t = mv(e); + let t = ov(e); if (!t) return; let n = e.parentElement; if (n && typeof n.getBoundingClientRect == "function" && typeof t.getBoundingClientRect == "function") { @@ -23475,7 +23240,7 @@ function _v(e) { console.debug?.(e); } } -function vv(e) { +function uv(e) { if (e) try { e._mjrAutoRevealSelectionUntil = Date.now() + 900; } catch (e) { @@ -23483,12 +23248,12 @@ function vv(e) { } let t = () => { try { - _v(e); + lv(e); } catch (e) { console.debug?.(e); } try { - gv(e); + cv(e); } catch (e) { console.debug?.(e); } @@ -23503,10 +23268,10 @@ function vv(e) { t(); } } -function yv(e, t) { +function dv(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 bv(e) { +function fv(e) { try { if (typeof e?._mjrGetRenderedCards == "function") { let t = e._mjrGetRenderedCards(); @@ -23521,15 +23286,15 @@ function bv(e) { return []; } } -function xv(e) { +function pv(e) { if (e) try { - let t = bv(e).filter((e) => e?.classList?.contains?.("is-selected")).map((e) => e?.dataset?.mjrAssetId).filter(Boolean); + let t = fv(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 Sv(e, t, n = "") { +function mv(e, t, n = "") { if (!e) return []; let r = Array.from(t || []).map(String).filter(Boolean); try { @@ -23543,9 +23308,9 @@ function Sv(e, t, n = "") { console.debug?.(e); } try { - for (let t of bv(e)) { + for (let t of fv(e)) { let e = t?.dataset?.mjrAssetId; - yv(t, !!(e && r.includes(String(e)))); + dv(t, !!(e && r.includes(String(e)))); } } catch (e) { console.debug?.(e); @@ -23560,7 +23325,7 @@ function Sv(e, t, n = "") { } return r; } -function Cv({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { +function hv({ gridContainer: e, state: t, activeId: n, readState: r = null, writeState: i = null } = {}) { if (!(!t && !i || !e)) try { let a = []; if (e.dataset?.mjrSelectedAssetIds) try { @@ -23569,7 +23334,7 @@ function Cv({ 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) : bv(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) : fv(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); @@ -23577,8 +23342,8 @@ function Cv({ gridContainer: e, state: t, activeId: n, readState: r = null, writ console.debug?.(e); } } -function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { - let { read: s, write: c } = t_(o, [ +function gv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadge: r, showAssetInSidebar: i, closeSidebar: a, state: o }) { + let { read: s, write: c } = qg(o, [ "activeAssetId", "selectedAssetIds", "sidebarOpen" @@ -23613,9 +23378,9 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } }, a = () => { n && cancelAnimationFrame(n), r && clearTimeout(r), n = requestAnimationFrame(() => { - n = null, i() && _v(e); + n = null, i() && lv(e); }), r = setTimeout(() => { - r = null, i() && _v(e); + r = null, i() && lv(e); }, 160); }, o = new ResizeObserver(() => a()); t && o.observe(t), o.observe(e), e._mjrSelectionResizeObserver = o; @@ -23627,7 +23392,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg try { let n = i?.has_workflow ?? i?.hasWorkflow ?? t.has_workflow, r = i?.has_generation_data ?? i?.hasGenerationData ?? t.has_generation_data; n !== void 0 && (t.has_workflow = n), r !== void 0 && (t.has_generation_data = r); - let a = e.querySelector(".mjr-workflow-dot"), o = lt(t); + let a = e.querySelector(".mjr-workflow-dot"), o = xt(t); a && o && a.replaceWith(o); } catch (e) { console.debug?.(e); @@ -23655,14 +23420,14 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg if (!a) return; n.preventDefault(), n.stopPropagation(); let l = r?.dataset?.mjrAssetId || ""; - Sv(e, l ? [l] : [], l), Cv({ + mv(e, l ? [l] : [], l), hv({ gridContainer: e, state: o, activeId: l, readState: s, writeState: c }); - let u = await uv({ + let u = await nv({ card: r, asset: a, sidebar: t, @@ -23681,7 +23446,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg let u = r._mjrAsset; if (u) { if (e?._mjrSelectionManagedByVue) { - Cv({ + hv({ gridContainer: e, state: o, activeId: String(r?.dataset?.mjrAssetId || "").trim(), @@ -23703,7 +23468,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg return; } if (n.preventDefault(), n.stopPropagation(), n.ctrlKey || n.metaKey || n.shiftKey) { - let t = bv(e), i = t.indexOf(r); + let t = fv(e), i = t.indexOf(r); if (n.shiftKey) { let t = []; try { @@ -23715,7 +23480,7 @@ function wv({ 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); - Sv(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, Cv({ + mv(e, u, n || u[0] || ""), e._mjrLastSelectedIndex = i, hv({ gridContainer: e, state: o, activeId: n || "", @@ -23750,7 +23515,7 @@ function wv({ 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] || ""; - Sv(e, u, d), Cv({ + mv(e, u, d), hv({ gridContainer: e, state: o, activeId: d, @@ -23760,7 +23525,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg return; } else { if (r.classList.contains("is-selected")) { - Sv(e, [], ""), Cv({ + mv(e, [], ""), hv({ gridContainer: e, state: o, activeId: "", @@ -23770,7 +23535,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg return; } let n = r?.dataset?.mjrAssetId; - Sv(e, n ? [n] : [], n || ""), Cv({ + mv(e, n ? [n] : [], n || ""), hv({ gridContainer: e, state: o, activeId: n || "", @@ -23784,7 +23549,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } } try { - _v(e), r?.focus?.({ preventScroll: !0 }); + lv(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -23794,10 +23559,10 @@ function wv({ 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="${fv(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${iv(n)}"]`); } catch { try { - r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${fv(n)}"]`); + r = e.querySelector(`.mjr-asset-card[data-mjr-asset-id="${iv(n)}"]`); } catch (e) { console.debug?.(e); } @@ -23805,7 +23570,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg r ||= e.querySelector(".mjr-asset-card.is-selected"); let l = r?._mjrAsset; if (l) { - dv(e, r), xv(e), Cv({ + rv(e, r), pv(e), hv({ gridContainer: e, state: o, activeId: r?.dataset?.mjrAssetId, @@ -23821,7 +23586,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - gv(e, { force: !0 }), vv(e); + cv(e, { force: !0 }), uv(e); return; } } catch (e) { @@ -23834,7 +23599,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } catch (e) { console.debug?.(e); } - vv(e), r?.focus?.({ preventScroll: !0 }); + uv(e), r?.focus?.({ preventScroll: !0 }); } catch (e) { console.debug?.(e); } @@ -23849,7 +23614,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg if (!n) return !1; let r = null; try { - r = pv(e, n); + r = av(e, n); } catch (e) { console.debug?.(e); } @@ -23886,7 +23651,7 @@ function wv({ 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 = Qt(t.target, ".mjr-asset-card"); - n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), dv(e, n), xv(e), Cv({ + n && n._mjrAsset && (t.preventDefault(), t.stopPropagation(), rv(e, n), pv(e), hv({ gridContainer: e, state: o, activeId: n?.dataset?.mjrAssetId, @@ -23973,7 +23738,7 @@ function wv({ gridContainer: e, sidebar: t, createRatingBadge: n, createTagsBadg } //#endregion //#region ui/features/panel/controllers/panelHotkeysController.ts -function Tv({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleFloatingViewer: r, onFocusSearch: i, onClearSearch: a, allowListKeys: o } = {}) { +function _v({ 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 : new Set([ " ", "ArrowUp", @@ -24008,7 +23773,7 @@ function Tv({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF console.debug?.(e); } try { - let e = qe(); + let e = Je(); return e ? document.activeElement === document.body ? !0 : e.contains?.(document.activeElement) || !1 : !1; } catch (e) { return console.debug?.(e), !1; @@ -24027,7 +23792,7 @@ function Tv({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF c = !1; }, keydown: (o) => { - if (L() || We().scope === "viewer") return; + if (Ze() || Ke().scope === "viewer") return; if (o.key?.toLowerCase?.() === "v" && !o.ctrlKey && !o.metaKey && !o.altKey && !o.shiftKey && !(o.target?.isContentEditable || o.target?.closest?.("input, textarea, select, [contenteditable='true']")) && l?.isConnected && f(o)) { let e = !1; try { @@ -24114,7 +23879,7 @@ function Tv({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF } catch (e) { console.debug?.(e); } - rt("panel"); + at("panel"); } }, g = () => { if (l) { @@ -24128,7 +23893,7 @@ function Tv({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF } catch (e) { console.debug?.(e); } - We().scope === "panel" && rt(null), l = null; + Ke().scope === "panel" && at(null), l = null; } }; return { @@ -24138,17 +23903,17 @@ function Tv({ onTriggerScan: e, getScanContext: t, onToggleDetails: n, onToggleF } //#endregion //#region ui/vue/composables/useGridSelection.ts -function Ev(e) { +function vv(e) { return Array.isArray(e) ? e.map((e) => String(e || "").trim()).filter(Boolean) : []; } -function Dv({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAssetId: n = () => "", writeSelectedAssetIds: r = (e) => {}, writeActiveAssetId: i = (e) => {}, onSelectionChanged: a = () => {}, lifecycleSignal: o = null } = {}) { +function yv({ 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 = Ev(t.selectedIds); + let t = e?.detail || {}, n = vv(t.selectedIds); r(n), i(String(t.activeId || n[0] || "").trim()); } catch (e) { console.debug?.(e); @@ -24166,7 +23931,7 @@ function Dv({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs } return { restoreSelectionState: ({ scrollTop: r = 0 } = {}) => { - let i = Ev(t()), a = String(n() || i[0] || "").trim(); + let i = vv(t()), a = String(n() || i[0] || "").trim(); if (!(!i.length && !a)) { try { typeof e?._mjrSetSelection == "function" && e._mjrSetSelection(i, a); @@ -24183,7 +23948,7 @@ function Dv({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs console.debug?.(e); } try { - jd(e, a)?.scrollIntoView?.({ + Nd(e, a)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -24204,7 +23969,7 @@ function Dv({ gridContainer: e, readSelectedAssetIds: t = () => [], readActiveAs } //#endregion //#region ui/vue/composables/useAssetsQuery.ts -function Ov(e) { +function bv(e) { try { if (typeof requestAnimationFrame == "function") { requestAnimationFrame(e); @@ -24215,13 +23980,13 @@ function Ov(e) { } setTimeout(e, 0); } -function kv(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() && !e.dateRangeFilter && !e.dateExactFilter; +function xv(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 Av({ 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 Sv({ 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 xu(e, (typeof n == "function" ? n() : t) || t || null); + return Cu(e, (typeof n == "function" ? n() : t) || t || null); } catch (e) { return console.debug?.(e), !1; } @@ -24233,7 +23998,7 @@ function Av({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } if (b && !v) { let e = b, t = x || 50; - b = null, x = 0, ee(e, Math.min(t, 50)); + b = null, x = 0, F(e, Math.min(t, 50)); } return t && g > 0 && !_ && k().catch((e) => console.debug?.(e)), S; }, D = () => { @@ -24310,7 +24075,7 @@ function Av({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } catch (e) { console.debug?.(e); } - Ov(() => { + bv(() => { let e = Number(s() || 0) || 0; if (e > 0) try { t.scrollTop = e; @@ -24328,7 +24093,7 @@ function Av({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul console.debug?.(e); } }); - }, F = async (t) => { + }, P = async (t) => { try { await t; } catch (e) { @@ -24340,19 +24105,19 @@ function Av({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul return; } if (!D() && !O() && String(p() || "output") === "output" && String(f() || "*") === "*") try { - let t = await P(`${Le.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); + let t = await ne(`${L.HEALTH_COUNTERS}?scope=output`, { signal: h || void 0 }); t?.ok && (t.data?.total_assets || 0) > 0 && await m(e); } catch (e) { console.debug?.(e); } } - }, ee = (e, t = 2e3) => (v && clearTimeout(v), E() ? (b = null, x = 0, v = setTimeout(() => { - v = null, F(e).catch(() => {}); + }, F = (e, t = 2e3) => (v && clearTimeout(v), E() ? (b = null, x = 0, v = setTimeout(() => { + v = null, P(e).catch(() => {}); }, t), v) : (b = e, x = t, null)); return { queuedReload: k, restoreUiState: N, - scheduleAutoLoad: ee, + scheduleAutoLoad: F, createCountersUpdateHandler: ({ state: t = {}, getStableQuery: n = () => String(e?.dataset?.mjrQuery || "*").trim() || "*", getRecentUserInteractionAt: r = () => 0 } = {}) => { let i = globalThis?.window ?? globalThis, a = null, o = null, s = null, c = !1; return async (e = {}) => { @@ -24360,7 +24125,7 @@ function Av({ 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 = kv(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 = xv(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) { a = e.last_scan_end, o = e.last_index_end; return; @@ -24474,7 +24239,7 @@ function Av({ gridContainer: e, gridWrapper: t, readScrollElement: n = () => nul } //#endregion //#region ui/features/panel/panelBootstrap.ts -function jv(e, { useComfyThemeUI: t }) { +function Cv(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, @@ -24486,7 +24251,7 @@ function jv(e, { useComfyThemeUI: t }) { } catch (e) { console.debug?.(e); } - Je(); + Ye(); for (let t of [ () => e._eventCleanup?.(), () => e._mjrPopoverManager?.dispose?.(), @@ -24500,7 +24265,7 @@ function jv(e, { useComfyThemeUI: t }) { console.debug?.(e); } e.replaceChildren(), e.classList.add("mjr-am-container"); - let i = ro(e); + let i = ao(e); try { e._mjrPopoverManager = i; } catch (e) { @@ -24514,10 +24279,10 @@ function jv(e, { useComfyThemeUI: t }) { } //#endregion //#region ui/features/panel/panelSettingsSync.ts -function Mv({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: i, similarBtn: a, setSemanticEnabled: o, similarEnabledTitle: s, similarDisabledTitle: c, refreshGridFn: l, isSidebarOpen: u, readActiveAssetId: d, getSidebarController: f, panelLifecycleAC: p }) { +function wv({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: i, similarBtn: a, setSemanticEnabled: o, similarEnabledTitle: s, similarDisabledTitle: c, refreshGridFn: l, isSidebarOpen: u, readActiveAssetId: d, getSidebarController: f, panelLifecycleAC: p }) { let m = "", h = () => { try { - return !!(Et()?.ai?.vectorSearchEnabled ?? !0); + return !!(pt()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } @@ -24576,22 +24341,22 @@ function Mv({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: } } }, v = async (e) => { - let n = String(e || t.scope || "output").toLowerCase(), r = !!Et()?.watcher?.enabled; + let n = String(e || t.scope || "output").toLowerCase(), r = !!pt()?.watcher?.enabled; if (n === "custom") { try { - await ne(!1); + await P(!1); } catch (e) { console.debug?.(e); } return; } try { - await ne(r); + await P(r); } catch (e) { console.debug?.(e); } if (r) try { - await ue({ + await D({ scope: n, customRootId: "" }); @@ -24601,9 +24366,9 @@ function Mv({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: }, y = (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 = Et(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), p = String(e?.ui?.tagColor || "").trim(); + let e = pt(), t = !!(e?.ai?.vectorSearchEnabled ?? !0), o = String(e?.ui?.cardHoverColor || "").trim(), s = String(e?.ui?.cardSelectionColor || "").trim(), c = String(e?.ui?.ratingColor || "").trim(), p = 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(p) && document.documentElement.style.setProperty("--mjr-tag-color", p), _(e.sidebar?.position || "right"), g(t), i) { - let e = qe() || null; + let e = Je() || null; if (!r && n.startsWith("siblings.")) try { e?.dispatchEvent(new CustomEvent("mjr:reload-grid")); } catch { @@ -24641,16 +24406,16 @@ function Mv({ container: e, state: t, sidebar: n, browseSection: r, gridWrapper: } //#endregion //#region ui/features/panel/panelGridEventBindings.ts -function Nv({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, notifyContextChanged: i, markUserInteraction: a, writePanelValue: o, popovers: c, collectionsPopover: l, gridController: u, registerSummaryDispose: d }) { - let f = null; +function Tv({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, notifyContextChanged: r, markUserInteraction: i, writePanelValue: a, popovers: o, collectionsPopover: s, gridController: c, registerSummaryDispose: l }) { + let u = null; try { - f = () => n(), e.addEventListener("mjr:reload-grid", f, { signal: t?.signal }), d(() => { + u = () => n(), e.addEventListener("mjr:reload-grid", u, { signal: t?.signal }), l(() => { try { - f && e.removeEventListener("mjr:reload-grid", f); + u && e.removeEventListener("mjr:reload-grid", u); } catch (e) { console.debug?.(e); } - f = null; + u = null; }); } catch (e) { console.debug?.(e); @@ -24658,18 +24423,18 @@ function Nv({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, not try { let n = (t) => { try { - let n = t?.detail || {}, o = String(n?.filenameKey || "").trim().toLowerCase(); - if (!o || !e) return; - let c = Array.from(e.querySelectorAll(".mjr-asset-card")).filter((e) => String(e?.dataset?.mjrFilenameKey || "").trim().toLowerCase() === o); - if (!c.length) return; - let l = c.map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean), u = String(c[0]?.dataset?.mjrAssetId || l[0] || "").trim(); - l.length && typeof e?._mjrSetSelection == "function" && e._mjrSetSelection(l, u), c[0]?.scrollIntoView?.({ + let n = t?.detail || {}, a = String(n?.filenameKey || "").trim().toLowerCase(); + if (!a || !e) return; + let o = Array.from(e.querySelectorAll(".mjr-asset-card")).filter((e) => String(e?.dataset?.mjrFilenameKey || "").trim().toLowerCase() === a); + if (!o.length) return; + let s = o.map((e) => String(e?.dataset?.mjrAssetId || "").trim()).filter(Boolean), c = String(o[0]?.dataset?.mjrAssetId || s[0] || "").trim(); + s.length && typeof e?._mjrSetSelection == "function" && e._mjrSetSelection(s, c), o[0]?.scrollIntoView?.({ block: "nearest", behavior: "smooth" - }), a(), i(); - let d = Number(n?.count || l.length || c.length || 0); + }), i(), r(); + let l = Number(n?.count || s.length || o.length || 0); try { - s(r("toast.nameCollisionInView", "Name collision in view: {n} item(s) selected", { n: d }), "info", 1800); + m(R("toast.nameCollisionInView", "Name collision in view: {n} item(s) selected", { n: l }), "info", 1800); } catch (e) { console.debug?.(e); } @@ -24677,7 +24442,7 @@ function Nv({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, not console.debug?.(e); } }; - e.addEventListener("mjr:badge-duplicates-focus", n, { signal: t?.signal }), d(() => { + e.addEventListener("mjr:badge-duplicates-focus", n, { signal: t?.signal }), l(() => { try { e.removeEventListener("mjr:badge-duplicates-focus", n); } catch (e) { @@ -24712,11 +24477,11 @@ function Nv({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, not console.debug?.(e); } try { - i(); + r(); } catch (e) { console.debug?.(e); } - u.reloadGrid().catch(() => {}); + c.reloadGrid().catch(() => {}); }, { signal: t?.signal }); } catch (e) { console.debug?.(e); @@ -24728,23 +24493,23 @@ function Nv({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, not } catch (e) { console.debug?.(e); } - let n = e?.detail && typeof e.detail == "object" ? e.detail : {}, r = String(n.collectionId || "").trim(), a = String(n.collectionName || "").trim(); + let n = e?.detail && typeof e.detail == "object" ? e.detail : {}, i = String(n.collectionId || "").trim(), l = String(n.collectionName || "").trim(); try { - o("collectionId", r), o("collectionName", a); + a("collectionId", i), a("collectionName", l); } catch (e) { console.debug?.(e); } try { - i(); + r(); } catch (e) { console.debug?.(e); } try { - n.close !== !1 && c.close(l); + n.close !== !1 && o.close(s); } catch (e) { console.debug?.(e); } - n.reload !== !1 && u.reloadGrid().catch(() => {}); + n.reload !== !1 && c.reloadGrid().catch(() => {}); }, { signal: t?.signal }); } catch (e) { console.debug?.(e); @@ -24752,99 +24517,99 @@ function Nv({ gridContainer: e, panelLifecycleAC: t, requestQueuedReload: n, not } //#endregion //#region ui/features/panel/panelSimilarSearch.ts -function Pv(e) { +function Ev(e) { return Number(e?.status || 0) === 404 && String(e?.error || "").toLowerCase().includes("non-json"); } -function Fv({ similarBtn: e, gridContainer: t, state: n, panelLifecycleAC: i, isAiEnabled: a, similarDisabledTitle: o, readActiveAssetId: c, readSelectedAssetIds: l, readPanelValue: u, writePanelValue: d, scopeController: f, closePopovers: p }) { - let m = async (e = {}) => { +function Dv({ similarBtn: e, gridContainer: t, state: n, panelLifecycleAC: r, isAiEnabled: i, similarDisabledTitle: a, readActiveAssetId: o, readSelectedAssetIds: s, readPanelValue: c, writePanelValue: l, scopeController: u, closePopovers: d }) { + let f = async (e = {}) => { let t = String(e?.sourceNodeId || e?.source_node_id || "").trim(); if (t) { try { - p?.(); + d?.(); } catch (e) { console.debug?.(e); } try { - let n = await P(je(t, { + let n = await ne(Ae(t, { jobId: e?.jobId || e?.job_id || "", latest: e?.latest !== !1, limit: 500 }), { timeoutMs: 3e4 }); if (!n?.ok) { - if (Pv(n)) { + if (Ev(n)) { let e = window.MajoorAssetsManager ||= {}; - e.nodeContextRouteMissingToastShown || (e.nodeContextRouteMissingToastShown = !0, s(r("nodeContext.routeMissing", "Node context backend route is not loaded yet. Restart ComfyUI after updating Majoor Assets Manager."), "warn", 7e3)); + e.nodeContextRouteMissingToastShown || (e.nodeContextRouteMissingToastShown = !0, m(R("nodeContext.routeMissing", "Node context backend route is not loaded yet. Restart ComfyUI after updating Majoor Assets Manager."), "warn", 7e3)); return; } - s(String(n?.error || r("nodeContext.loadFailed", "Failed to load node assets")), "error", 3e3); + m(String(n?.error || R("nodeContext.loadFailed", "Failed to load node assets")), "error", 3e3); return; } - let i = Array.isArray(n?.data) ? n.data : []; - if (!i.length) { - s(r("nodeContext.noAssets", "No indexed assets found for this node yet."), "info", 2600); + let r = Array.isArray(n?.data) ? n.data : []; + if (!r.length) { + m(R("nodeContext.noAssets", "No indexed assets found for this node yet."), "info", 2600); return; } - let a = String(e?.title || e?.sourceNodeType || e?.source_node_type || t).trim(); - d("similarResults", i), d("similarSourceAssetId", `node:${t}`), d("similarTitle", r("nodeContext.resultsTitle", "Node {node} outputs ({n} assets)", { - node: a || t, - n: i.length - })), await f?.setScope?.("similar"); + let i = String(e?.title || e?.sourceNodeType || e?.source_node_type || t).trim(); + l("similarResults", r), l("similarSourceAssetId", `node:${t}`), l("similarTitle", R("nodeContext.resultsTitle", "Node {node} outputs ({n} assets)", { + node: i || t, + n: r.length + })), await u?.setScope?.("similar"); } catch (e) { - console.debug?.(e), s(r("nodeContext.loadFailed", "Failed to load node assets"), "error", 3e3); + console.debug?.(e), m(R("nodeContext.loadFailed", "Failed to load node assets"), "error", 3e3); } } }; e?.addEventListener("click", async (t) => { - if (t.stopPropagation(), !a()) { - s(o, "info", 2200); + if (t.stopPropagation(), !i()) { + m(a, "info", 2200); return; } try { - p(); + d(); } catch (e) { console.debug?.(e); } - let i = String(c() || l()[0] || "").trim(), u = Number(i); - if (!Number.isFinite(u) || u <= 0) { - s(r("search.selectAssetForSimilar", "Select an asset first to find similar images/videos."), "info", 2500); + let r = String(o() || s()[0] || "").trim(), c = Number(r); + if (!Number.isFinite(c) || c <= 0) { + m(R("search.selectAssetForSimilar", "Select an asset first to find similar images/videos."), "info", 2500); return; } - let m = e.title; - e.disabled = !0, e.title = r("search.findingSimilar", "Finding similar assets..."); + let f = e.title; + e.disabled = !0, e.title = R("search.findingSimilar", "Finding similar assets..."); try { - let e = await Te(u, { + let e = await k(c, { topK: 100, scope: n.scope || "output", customRootId: n.customRootId || "" }); if (!e?.ok) { - s(String(e?.error || r("search.findSimilarFailed", "Failed to find similar assets")), "error", 3e3); + m(String(e?.error || R("search.findSimilarFailed", "Failed to find similar assets")), "error", 3e3); return; } let t = Array.isArray(e?.data) ? e.data : []; - d("similarResults", t), d("similarSourceAssetId", String(u)), d("similarTitle", r("search.similarResults", "Similar to asset #{id} ({n} results)", { - id: u, + l("similarResults", t), l("similarSourceAssetId", String(c)), l("similarTitle", R("search.similarResults", "Similar to asset #{id} ({n} results)", { + id: c, n: t.length - })), await f?.setScope?.("similar"); + })), await u?.setScope?.("similar"); } catch (e) { - console.debug?.(e), s(r("search.findSimilarFailed", "Failed to find similar assets"), "error", 3e3); + console.debug?.(e), m(R("search.findSimilarFailed", "Failed to find similar assets"), "error", 3e3); } finally { - e.disabled = !1, e.title = m; + e.disabled = !1, e.title = f; } - }, { signal: i?.signal }), t?.addEventListener(B.OPEN_STACK_GROUP, async (e) => { + }, { signal: r?.signal }), t?.addEventListener(H.OPEN_STACK_GROUP, async (e) => { try { let t = e?.detail || {}, n = Array.isArray(t?.members) ? t.members : []; - d("similarResults", n), d("similarSourceAssetId", String(t?.asset?.id || "")), d("similarTitle", String(t?.title || "").trim() || `Generation group (${n.length} assets)`), await f?.setScope?.("similar"); + l("similarResults", n), l("similarSourceAssetId", String(t?.asset?.id || "")), l("similarTitle", String(t?.title || "").trim() || `Generation group (${n.length} assets)`), await u?.setScope?.("similar"); } catch (e) { console.debug?.(e); } - }, { signal: i?.signal }), window.addEventListener(B.OPEN_NODE_CONTEXT, (e) => { - m(e?.detail || {}); - }, { signal: i?.signal }); + }, { signal: r?.signal }), window.addEventListener(H.OPEN_NODE_CONTEXT, (e) => { + f(e?.detail || {}); + }, { signal: r?.signal }); try { let e = window.MajoorAssetsManager?.pendingNodeContext || null; e && (window.MajoorAssetsManager.pendingNodeContext = null, setTimeout(() => { - m(e); + f(e); }, 0)); } catch (e) { console.debug?.(e); @@ -24852,8 +24617,8 @@ function Fv({ similarBtn: e, gridContainer: t, state: n, panelLifecycleAC: i, is } //#endregion //#region ui/features/panel/panelPinnedFolders.ts -function Iv({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFoldersMenu: n = null, pinnedFoldersPopover: i, popovers: a, closeOtherPopovers: o, state: c, gridContainer: l, customSelect: u, scopeController: d, customRootsController: f, gridController: p, applyWatcherForScope: m, refreshDuplicateAlerts: h, notifyContextChanged: g, panelLifecycleAC: _ }) { - let v = (e) => { +function Ov({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFoldersMenu: n = null, pinnedFoldersPopover: r, popovers: i, closeOtherPopovers: a, state: o, gridContainer: s, customSelect: c, scopeController: l, customRootsController: u, gridController: d, applyWatcherForScope: f, refreshDuplicateAlerts: p, notifyContextChanged: h, panelLifecycleAC: g }) { + let _ = (e) => { let t = String(e?.id || "").trim(); if (!t) return null; let n = String(e?.path || "").trim(); @@ -24862,10 +24627,10 @@ function Iv({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFold label: String(e?.name || n || t).trim() || t, path: n }; - }, y = async () => { + }, v = async () => { try { - let e = await P(Le.CUSTOM_ROOTS, _?.signal ? { signal: _.signal } : void 0); - return e?.ok && Array.isArray(e.data) ? e.data.map(v).filter(Boolean) : []; + let e = await ne(L.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), []; } @@ -24873,60 +24638,60 @@ function Iv({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFold let t = String(e?.id || "").trim(); if (!t) return; let n = String(e?.label || e?.path || t).trim(); - c.scope = "custom"; + o.scope = "custom"; try { - l && (l.dataset.mjrScope = "custom"); + s && (s.dataset.mjrScope = "custom"); } catch (e) { console.debug?.(e); } - c.customRootId = t, c.customRootLabel = n, c.currentFolderRelativePath = ""; + o.customRootId = t, o.customRootLabel = n, o.currentFolderRelativePath = ""; try { - u && (u.value = t); + c && (c.value = t); } catch (e) { console.debug?.(e); } try { - d?.setActiveTabStyles?.(); + l?.setActiveTabStyles?.(); } catch (e) { console.debug?.(e); } try { - await m(c.scope); + await f(o.scope); } catch (e) { console.debug?.(e); } try { - await h(); + await p(); } catch (e) { console.debug?.(e); } try { - g(); + h(); } catch (e) { console.debug?.(e); } - a.close(i), await p.reloadGrid(); + i.close(r), await d.reloadGrid(); }, x = async (e, t = null) => { t?.preventDefault?.(), t?.stopPropagation?.(); let n = String(e?.id || "").trim(); - if (!n || !await gt(r("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: String(e?.label || e?.path || n).trim() }))) return; - let i = await ye(Le.CUSTOM_ROOTS_REMOVE, { id: n }); - if (!i?.ok) { - s(i?.error || r("toast.unpinFolderFailed", "Failed to unpin folder"), "error"); + if (!n || !await Bt(R("dialog.unpinFolder", "Unpin folder \"{name}\"?", { name: String(e?.label || e?.path || n).trim() }))) return; + let r = await y(L.CUSTOM_ROOTS_REMOVE, { id: n }); + if (!r?.ok) { + m(r?.error || R("toast.unpinFolderFailed", "Failed to unpin folder"), "error"); return; } - String(c.customRootId || "") === n && (c.customRootId = "", c.customRootLabel = "", c.currentFolderRelativePath = ""); + String(o.customRootId || "") === n && (o.customRootId = "", o.customRootLabel = "", o.currentFolderRelativePath = ""); try { - await f.refreshCustomRoots(); + await u.refreshCustomRoots(); } catch (e) { console.debug?.(e); } - await w(), await p.reloadGrid(); + await w(), await d.reloadGrid(); }, S = (e) => typeof t?.setPinnedFolders == "function" ? (t.setPinnedFolders({ roots: e, - emptyLabel: r("msg.noPinnedFolders", "No pinned folders"), - loadingLabel: r("status.loading", "Loading..."), - unpinLabel: r("ctx.unpinFolder", "Unpin folder"), + emptyLabel: R("msg.noPinnedFolders", "No pinned folders"), + loadingLabel: R("status.loading", "Loading..."), + unpinLabel: R("ctx.unpinFolder", "Unpin folder"), onOpen: b, onUnpin: x, loading: !1 @@ -24939,26 +24704,26 @@ function Iv({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFold } if (!e.length) { let e = document.createElement("div"); - e.className = "mjr-muted", e.style.cssText = "padding:10px 12px; opacity:0.75;", e.textContent = r("msg.noPinnedFolders", "No pinned folders"), n.appendChild(e); + e.className = "mjr-muted", e.style.cssText = "padding:10px 12px; opacity:0.75;", e.textContent = R("msg.noPinnedFolders", "No pinned folders"), n.appendChild(e); return; } for (let t of e) { let e = document.createElement("div"); e.className = "mjr-pinned-folder-row"; + let r = document.createElement("button"); + r.type = "button", r.className = "mjr-menu-item mjr-pinned-folder-open", r.textContent = t.label, r.addEventListener("click", () => b(t), { signal: g?.signal }); let i = document.createElement("button"); - i.type = "button", i.className = "mjr-menu-item mjr-pinned-folder-open", i.textContent = t.label, i.addEventListener("click", () => b(t), { signal: _?.signal }); - let a = document.createElement("button"); - a.type = "button", a.className = "mjr-menu-item mjr-pinned-folder-unpin", a.title = r("ctx.unpinFolder", "Unpin folder"), a.textContent = "x", a.addEventListener("click", (e) => x(t, e), { signal: _?.signal }), e.appendChild(i), e.appendChild(a), n.appendChild(e); + i.type = "button", i.className = "mjr-menu-item mjr-pinned-folder-unpin", i.title = R("ctx.unpinFolder", "Unpin folder"), i.textContent = "x", i.addEventListener("click", (e) => x(t, e), { signal: g?.signal }), e.appendChild(r), e.appendChild(i), n.appendChild(e); } } }; async function w() { try { - t?.setPinnedFoldersLoading?.(!0, r("status.loading", "Loading...")); + t?.setPinnedFoldersLoading?.(!0, R("status.loading", "Loading...")); } catch (e) { console.debug?.(e); } - let e = await y(); + let e = await v(); S(e) || C(e); } e?.addEventListener("click", async (t) => { @@ -24968,13 +24733,13 @@ function Iv({ pinnedFoldersBtn: e, pinnedFoldersController: t = null, pinnedFold } catch (e) { console.debug?.(e); } - o(), a.toggle(i, e); - }, { signal: _?.signal }); + a(), i.toggle(r, e); + }, { signal: g?.signal }); } //#endregion //#region ui/features/filters/calendar/AgendaCalendar.ts -var Lv = (e) => String(e).padStart(2, "0"); -function Rv(e) { +var kv = (e) => String(e).padStart(2, "0"); +function Av(e) { try { let t = String(e || "").trim(); if (!/^\d{4}-\d{2}-\d{2}$/.test(t)) return null; @@ -24986,50 +24751,50 @@ function Rv(e) { return null; } } -function zv(e) { +function jv(e) { try { let t = e.getFullYear(), n = e.getMonth() + 1, r = e.getDate(); - return `${t}-${Lv(n)}-${Lv(r)}`; + return `${t}-${kv(n)}-${kv(r)}`; } catch { return ""; } } -function Bv(e) { +function Mv(e) { try { - return `${e.getFullYear()}-${Lv(e.getMonth() + 1)}`; + return `${e.getFullYear()}-${kv(e.getMonth() + 1)}`; } catch { return ""; } } -function Vv(e) { +function Nv(e) { try { return new Date(e.getFullYear(), e.getMonth(), 1); } catch { return /* @__PURE__ */ new Date(); } } -function Hv(e, t) { +function Pv(e, t) { try { return new Date(e.getFullYear(), e.getMonth() + t, 1); } catch { return /* @__PURE__ */ new Date(); } } -function Uv(e) { +function Fv(e) { try { return new Date(e.getFullYear(), e.getMonth() + 1, 0).getDate(); } catch { return 31; } } -function Wv(e) { +function Iv(e) { try { return (e.getDay() + 6) % 7; } catch { return 0; } } -function Gv(e, t) { +function Lv(e, t) { if (e) try { let n = String(e.value || ""); e.value = t || "", n !== e.value && e.dispatchEvent?.(new Event("change", { bubbles: !0 })); @@ -25037,14 +24802,14 @@ function Gv(e, t) { console.debug?.(e); } } -async function Kv({ state: e, monthKey: t }) { +async function Rv({ 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 = await P(Ne({ + let r = String(e?.currentFolderRelativePath || "").trim(), i = n === "custom" && !e?.customRootId ? null : r || null, a = await ne(Ee({ scope: n, customRootId: e?.customRootId || null, subfolder: i, @@ -25076,101 +24841,104 @@ async function Kv({ state: e, monthKey: t }) { }; } } -function qv({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: i = null } = {}) { +function zv({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: r = null } = {}) { if (!e || !(e instanceof HTMLElement) || !t) return { dispose() {}, refresh() {} }; + let i = document.createElement("div"); + i.className = "mjr-agenda-calendar"; let a = document.createElement("div"); - a.className = "mjr-agenda-calendar"; - let o = document.createElement("div"); - o.className = "mjr-agenda-header"; - let s = document.createElement("button"); - s.type = "button", s.className = "mjr-btn mjr-agenda-nav", s.textContent = "<"; - let c = document.createElement("div"); - c.className = "mjr-agenda-month", c.textContent = ""; - let l = document.createElement("button"); - l.type = "button", l.className = "mjr-btn mjr-agenda-nav", l.textContent = ">", o.appendChild(s), o.appendChild(c), o.appendChild(l); + a.className = "mjr-agenda-header"; + let o = document.createElement("button"); + o.type = "button", o.className = "mjr-btn mjr-agenda-nav", o.textContent = "<"; + let s = document.createElement("div"); + s.className = "mjr-agenda-month", s.textContent = ""; + let c = document.createElement("button"); + c.type = "button", c.className = "mjr-btn mjr-agenda-nav", c.textContent = ">", a.appendChild(o), a.appendChild(s), a.appendChild(c); + let l = document.createElement("div"); + l.className = "mjr-agenda-grid"; let u = document.createElement("div"); - u.className = "mjr-agenda-grid"; - let d = document.createElement("div"); - d.className = "mjr-agenda-footer"; + u.className = "mjr-agenda-footer"; + let d = document.createElement("button"); + 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-clear", f.textContent = "Clear"; - let p = document.createElement("button"); - p.type = "button", p.className = "mjr-btn mjr-agenda-refresh", p.textContent = "Refresh", d.appendChild(f), d.appendChild(p), a.appendChild(o), a.appendChild(u), a.appendChild(d), e.appendChild(a); - let m = Vv(Rv(t.value) || /* @__PURE__ */ new Date()), h = {}, g = 0, _ = !1, v = () => { - if (_) return; - let e = m.getFullYear(), n = m.getMonth(); - c.textContent = m.toLocaleString(void 0, { + 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 = Nv(Av(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, { month: "long", year: "numeric" - }), u.innerHTML = ""; - for (let e of [ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" - ]) { + }), l.innerHTML = ""; + let r = [ + R("weekday.monShort", "Mon"), + R("weekday.tueShort", "Tue"), + R("weekday.wedShort", "Wed"), + R("weekday.thuShort", "Thu"), + R("weekday.friShort", "Fri"), + R("weekday.satShort", "Sat"), + R("weekday.sunShort", "Sun") + ]; + for (let e of r) { let t = document.createElement("div"); - t.className = "mjr-agenda-weekday", t.textContent = e, u.appendChild(t); + t.className = "mjr-agenda-weekday", t.textContent = e, l.appendChild(t); } - let i = Wv(new Date(e, n, 1)), a = Uv(m), o = Rv(t.value), s = o ? zv(o) : ""; + let i = Iv(new Date(e, n, 1)), a = Fv(p), o = Av(t.value), c = o ? jv(o) : ""; for (let e = 0; e < i; e++) { let e = document.createElement("div"); - e.className = "mjr-agenda-day mjr-agenda-day--blank", u.appendChild(e); + e.className = "mjr-agenda-day mjr-agenda-day--blank", l.appendChild(e); } - for (let i = 1; i <= a; i++) { - let a = zv(new Date(e, n, i)), o = Number(h?.[a] || 0) || 0, c = document.createElement("button"); - if (c.type = "button", c.className = "mjr-agenda-day", c.textContent = String(i), c.dataset.date = a, o > 0) { - c.classList.add("mjr-agenda-day--has-assets"), c.title = `${o} asset${o === 1 ? "" : "s"}`; - let e = document.createElement("span"); - e.className = "mjr-agenda-day-badge", e.textContent = o > 99 ? "99+" : String(o), e.setAttribute("aria-label", `${o} asset${o === 1 ? "" : "s"}`), c.appendChild(e); - } else c.title = r("tooltip.noAssetsDay", "No assets on this day"); - a === s && c.classList.add("mjr-agenda-day--selected"), c.addEventListener("click", () => { - Gv(t, String(t.value || "").trim() === a ? "" : a); - }), u.appendChild(c); + for (let r = 1; r <= a; r++) { + let i = jv(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 }); + o.title = e; + let t = document.createElement("span"); + 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", () => { + Lv(t, String(t.value || "").trim() === i ? "" : i); + }), l.appendChild(o); } - }, y = async () => { - if (_) return; - let e = Bv(m); + }, v = async () => { + if (g) return; + let e = Mv(p); if (!e) return; - g += 1; - let t = g, r = await Kv({ + h += 1; + let t = h, r = await Rv({ state: n, monthKey: e }); - _ || t === g && (h = r.ok && r.days || {}, v()); + g || t === h && (m = r.ok && r.days || {}, _()); }; - return s.addEventListener("click", async () => { - m = Hv(m, -1), await y(); - }), l.addEventListener("click", async () => { - m = Hv(m, 1), await y(); - }), f.addEventListener("click", () => { - Gv(t, ""); + return o.addEventListener("click", async () => { + p = Pv(p, -1), await v(); + }), c.addEventListener("click", async () => { + p = Pv(p, 1), await v(); + }), d.addEventListener("click", () => { + Lv(t, ""); try { - i?.(); + r?.(); } catch (e) { console.debug?.(e); } - }), p.addEventListener("click", async () => { - await y(); + }), f.addEventListener("click", async () => { + await v(); }), t.addEventListener("change", () => { - let e = Rv(t.value); + let e = Av(t.value); if (e) { - let t = Vv(e); - (t.getFullYear() !== m.getFullYear() || t.getMonth() !== m.getMonth()) && (m = t); + let t = Nv(e); + (t.getFullYear() !== p.getFullYear() || t.getMonth() !== p.getMonth()) && (p = t); } - v(); - }), v(), y(), { - refresh: y, + _(); + }), _(), v(), { + refresh: v, dispose() { - _ = !0; + g = !0; try { - a.remove(); + i.remove(); } catch (e) { console.debug?.(e); } @@ -25179,18 +24947,19 @@ function qv({ container: e, hiddenInput: t, state: n, onRequestReloadGrid: i = n } //#endregion //#region ui/features/panel/controllers/filtersController.ts -var Jv = (e) => { +var Bv = (e) => { let t = String(e ?? "").trim(); if (!t) return 0; let n = t.replace(",", "."), r = Number(n); return Number.isFinite(r) ? r : 0; }; -function Yv({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, ratingSelect: i, minSizeInput: a, maxSizeInput: o, resolutionPresetSelect: s, minWidthInput: c, minHeightInput: l, maxWidthInput: u, maxHeightInput: d, dateRangeSelect: f, dateExactInput: p, reloadGrid: m, reconcileSelection: h = null, onFiltersChanged: g = null, lifecycleSignal: _ = null }) { - let { write: v } = t_(e, [ +function Vv({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, workflowIdInput: i, ratingSelect: a, minSizeInput: o, maxSizeInput: s, resolutionPresetSelect: c, minWidthInput: l, minHeightInput: u, maxWidthInput: d, maxHeightInput: f, dateRangeSelect: p, dateExactInput: m, reloadGrid: h, reconcileSelection: g = null, onFiltersChanged: _ = null, lifecycleSignal: v = null }) { + let { write: y } = qg(e, [ "kindFilter", "workflowOnly", "minRating", "workflowType", + "workflowId", "minSizeMB", "maxSizeMB", "minWidth", @@ -25199,21 +24968,21 @@ function Yv({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, rat "maxHeight", "dateRangeFilter", "dateExactFilter" - ]), y = null, b = () => { - y && clearTimeout(y), y = setTimeout(() => { - y = null; + ]), b = null, x = () => { + b && clearTimeout(b), b = setTimeout(() => { + b = null; try { - h?.(); + g?.(); } catch (e) { console.debug?.(e); } - m().catch(() => {}); + h().catch(() => {}); }, 250); - }, x = []; - x.push(() => { - y &&= (clearTimeout(y), null); + }, S = []; + S.push(() => { + b &&= (clearTimeout(b), null); }); - let S = (e, t, n, r) => { + let C = (e, t, n, r) => { if (!(!e?.addEventListener || typeof n != "function")) { try { e.addEventListener(t, n, r); @@ -25224,7 +24993,7 @@ function Yv({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, rat return; } } - x.push(() => { + S.push(() => { try { e.removeEventListener(t, n, r); } catch { @@ -25237,55 +25006,63 @@ function Yv({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, rat }); } }; - S(t, "change", () => { - v("kindFilter", t.value || ""); + C(t, "change", () => { + y("kindFilter", t.value || ""); try { - g?.(); + _?.(); } catch (e) { console.debug?.(e); } - b(); - }, _ ? { signal: _ } : void 0), S(n, "change", () => { - v("workflowOnly", !!n.checked); + x(); + }, v ? { signal: v } : void 0), C(n, "change", () => { + y("workflowOnly", !!n.checked); try { - g?.(); + _?.(); } catch (e) { console.debug?.(e); } - b(); - }, _ ? { signal: _ } : void 0), S(i, "change", () => { - v("minRating", Number(i.value || 0) || 0); + x(); + }, v ? { signal: v } : void 0), C(a, "change", () => { + y("minRating", Number(a.value || 0) || 0); try { - g?.(); + _?.(); } catch (e) { console.debug?.(e); } - b(); - }, _ ? { signal: _ } : void 0), r && S(r, "change", () => { - v("workflowType", String(r.value || "").trim().toUpperCase()); + x(); + }, v ? { signal: v } : void 0), r && C(r, "change", () => { + y("workflowType", String(r.value || "").trim().toUpperCase()); try { - g?.(); + _?.(); } catch (e) { console.debug?.(e); } - b(); - }, _ ? { signal: _ } : void 0); - let C = () => { - let e = Jv(a?.value || 0), t = Jv(o?.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, o && (o.value = String(r))), v("minSizeMB", n), v("maxSizeMB", r); + x(); + }, v ? { signal: v } : void 0), i && C(i, "change", () => { + y("workflowId", String(i.value || "").trim()); try { - g?.(); + _?.(); } catch (e) { console.debug?.(e); } - b(); - }; - S(a, "change", C, _ ? { signal: _ } : void 0), S(o, "change", C, _ ? { signal: _ } : void 0); + x(); + }, v ? { signal: v } : void 0); let w = () => { - let e = Jv(c?.value || 0), t = Jv(l?.value || 0), n = Jv(u?.value || 0), r = Jv(d?.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, f = Number.isFinite(r) && r > 0 ? Math.round(r) : 0; - o > 0 && i > 0 && o < i && (o = i, u && (u.value = String(o))), f > 0 && a > 0 && f < a && (f = a, d && (d.value = String(f))), v("minWidth", i), v("minHeight", a), v("maxWidth", o), v("maxHeight", f); + let e = Bv(o?.value || 0), t = Bv(s?.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, s && (s.value = String(r))), y("minSizeMB", n), y("maxSizeMB", r); try { - s && (s.value = { + _?.(); + } catch (e) { + console.debug?.(e); + } + x(); + }; + C(o, "change", w, v ? { signal: v } : void 0), C(s, "change", w, v ? { signal: v } : void 0); + let T = () => { + let e = Bv(l?.value || 0), t = Bv(u?.value || 0), n = Bv(d?.value || 0), r = Bv(f?.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, d && (d.value = String(o))), s > 0 && a > 0 && s < a && (s = a, f && (f.value = String(s))), y("minWidth", i), y("minHeight", a), y("maxWidth", o), y("maxHeight", s); + try { + c && (c.value = { "1280x720": "hd", "1920x1080": "fhd", "2560x1440": "qhd", @@ -25295,62 +25072,62 @@ function Yv({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, rat console.debug?.(e); } try { - g?.(); + _?.(); } catch (e) { console.debug?.(e); } - b(); + x(); }; - if (S(c, "change", w, _ ? { signal: _ } : void 0), S(l, "change", w, _ ? { signal: _ } : void 0), S(u, "change", w, _ ? { signal: _ } : void 0), S(d, "change", w, _ ? { signal: _ } : void 0), s && S(s, "change", () => { + if (C(l, "change", T, v ? { signal: v } : void 0), C(u, "change", T, v ? { signal: v } : void 0), C(d, "change", T, v ? { signal: v } : void 0), C(f, "change", T, v ? { signal: v } : void 0), c && C(c, "change", () => { let e = { hd: [1280, 720], fhd: [1920, 1080], qhd: [2560, 1440], uhd: [3840, 2160] - }[String(s.value || "")] || [0, 0], t = Number(e[0] || 0), n = Number(e[1] || 0); - v("minWidth", t), v("minHeight", n), v("maxWidth", 0), v("maxHeight", 0), c && (c.value = t > 0 ? String(t) : ""), l && (l.value = n > 0 ? String(n) : ""), u && (u.value = ""), d && (d.value = ""); + }[String(c.value || "")] || [0, 0], t = Number(e[0] || 0), n = Number(e[1] || 0); + y("minWidth", t), y("minHeight", n), y("maxWidth", 0), y("maxHeight", 0), l && (l.value = t > 0 ? String(t) : ""), u && (u.value = n > 0 ? String(n) : ""), d && (d.value = ""), f && (f.value = ""); try { - g?.(); + _?.(); } catch (e) { console.debug?.(e); } - b(); - }, _ ? { signal: _ } : void 0), f && S(f, "change", () => { - v("dateRangeFilter", f.value || ""), e.dateRangeFilter && e.dateExactFilter && (v("dateExactFilter", ""), p && (p.value = "")); + x(); + }, v ? { signal: v } : void 0), p && C(p, "change", () => { + y("dateRangeFilter", p.value || ""), e.dateRangeFilter && e.dateExactFilter && (y("dateExactFilter", ""), m && (m.value = "")); try { - g?.(); + _?.(); } catch (e) { console.debug?.(e); } - b(); - }, _ ? { signal: _ } : void 0), p) { + x(); + }, v ? { signal: v } : void 0), m) { let t = (e) => { - p.classList.toggle("mjr-agenda-filled", e === "filled"), p.classList.toggle("mjr-agenda-empty", e === "empty"); + m.classList.toggle("mjr-agenda-filled", e === "filled"), m.classList.toggle("mjr-agenda-empty", e === "empty"); }; - S(p, "change", () => { - v("dateExactFilter", p.value ? String(p.value) : ""), e.dateExactFilter && e.dateRangeFilter && (v("dateRangeFilter", ""), f && (f.value = "")), e.dateExactFilter || t(""); + C(m, "change", () => { + y("dateExactFilter", m.value ? String(m.value) : ""), e.dateExactFilter && e.dateRangeFilter && (y("dateRangeFilter", ""), p && (p.value = "")), e.dateExactFilter || t(""); try { - g?.(); + _?.(); } catch (e) { console.debug?.(e); } - b(); - }, _ ? { signal: _ } : void 0); + x(); + }, v ? { signal: v } : void 0); let n = (e) => { if (!e?.detail) return; let { date: n, hasResults: r } = e.detail; - if (!p.value) { + if (!m.value) { t(""); return; } - n === p.value && t(r ? "filled" : "empty"); + n === m.value && t(r ? "filled" : "empty"); }; try { - let e = _ ? { + let e = v ? { passive: !0, - signal: _ + signal: v } : { passive: !0 }, t = typeof window < "u" ? window : null; - t?.addEventListener?.("MJR:AgendaStatus", n, e), x.push(() => { + t?.addEventListener?.("MJR:AgendaStatus", n, e), S.push(() => { try { t?.removeEventListener?.("MJR:AgendaStatus", n, e); } catch (e) { @@ -25362,7 +25139,7 @@ function Yv({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, rat } } return () => { - for (let e of x.splice(0)) try { + for (let e of S.splice(0)) try { e(); } catch (e) { console.debug?.(e); @@ -25371,98 +25148,94 @@ function Yv({ state: e, kindSelect: t, wfCheckbox: n, workflowTypeSelect: r, rat } //#endregion //#region ui/features/panel/panelFiltersInit.ts -function Xv({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, ratingSelect: a, minSizeInput: o, maxSizeInput: s, resolutionPresetSelect: c, minWidthInput: l, minHeightInput: u, maxWidthInput: d, maxHeightInput: f, dateRangeSelect: p, dateExactInput: m, agendaContainer: h, gridController: g, reconcileVisibleSelection: _, exitSimilarViewIfActive: v, notifyContextChanged: y, panelLifecycleAC: b, popovers: x = null, filterPopover: S = null }) { - let C = null; +function Hv({ state: e, hasVueHeaderSection: t, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, workflowIdInput: a, ratingSelect: o, minSizeInput: s, maxSizeInput: c, resolutionPresetSelect: l, minWidthInput: u, minHeightInput: d, maxWidthInput: f, maxHeightInput: p, dateRangeSelect: m, dateExactInput: h, agendaContainer: g, gridController: _, reconcileVisibleSelection: v, exitSimilarViewIfActive: y, notifyContextChanged: b, panelLifecycleAC: x, popovers: S = null, filterPopover: C = null }) { + let w = null; try { try { - n.value = e.kindFilter || "", r.checked = !!e.workflowOnly, i.value = String(e.workflowType || "").trim().toUpperCase(), a.value = String(Number(e.minRating || 0) || 0), o.value = Number(e.minSizeMB || 0) > 0 ? String(e.minSizeMB) : "", s.value = Number(e.maxSizeMB || 0) > 0 ? String(e.maxSizeMB) : "", l.value = Number(e.minWidth || 0) > 0 ? String(e.minWidth) : "", u.value = Number(e.minHeight || 0) > 0 ? String(e.minHeight) : "", d.value = Number(e.maxWidth || 0) > 0 ? String(e.maxWidth) : "", f.value = Number(e.maxHeight || 0) > 0 ? String(e.maxHeight) : ""; - let t = Number(e.minWidth || 0) || 0, h = Number(e.minHeight || 0) || 0; - t >= 3840 && h >= 2160 ? c.value = "uhd" : t >= 2560 && h >= 1440 ? c.value = "qhd" : t >= 1920 && h >= 1080 ? c.value = "fhd" : t >= 1280 && h >= 720 ? c.value = "hd" : c.value = "", p.value = e.dateRangeFilter || "", m.value = e.dateExactFilter || ""; + n.value = e.kindFilter || "", r.checked = !!e.workflowOnly, i.value = String(e.workflowType || "").trim().toUpperCase(), a && (a.value = String(e.workflowId || "").trim()), o.value = String(Number(e.minRating || 0) || 0), s.value = Number(e.minSizeMB || 0) > 0 ? String(e.minSizeMB) : "", c.value = Number(e.maxSizeMB || 0) > 0 ? String(e.maxSizeMB) : "", u.value = Number(e.minWidth || 0) > 0 ? String(e.minWidth) : "", d.value = Number(e.minHeight || 0) > 0 ? String(e.minHeight) : "", f.value = Number(e.maxWidth || 0) > 0 ? String(e.maxWidth) : "", p.value = Number(e.maxHeight || 0) > 0 ? String(e.maxHeight) : ""; + let t = Number(e.minWidth || 0) || 0, g = Number(e.minHeight || 0) || 0; + t >= 3840 && g >= 2160 ? l.value = "uhd" : t >= 2560 && g >= 1440 ? l.value = "qhd" : t >= 1920 && g >= 1080 ? l.value = "fhd" : t >= 1280 && g >= 720 ? l.value = "hd" : l.value = "", m.value = e.dateRangeFilter || "", h.value = e.dateExactFilter || ""; } catch (e) { console.debug?.(e); } - C = qv({ - container: h, - hiddenInput: m, + w = zv({ + container: g, + hiddenInput: h, state: e, - onRequestReloadGrid: () => g.reloadGrid() + onRequestReloadGrid: () => _.reloadGrid() }); } catch (e) { console.debug?.(e); } - let w = () => {}; + let T = () => {}; if (t) { let e = null, t = () => { try { - if (b?.signal?.aborted) return; + if (x?.signal?.aborted) return; } catch (e) { console.debug?.(e); } + y({ reload: !1 }); try { - x?.close?.(S); + w?.refresh?.(); } catch (e) { console.debug?.(e); } - v({ reload: !1 }); - try { - C?.refresh?.(); - } catch (e) { - console.debug?.(e); - } - y(), e && clearTimeout(e), e = setTimeout(() => { + b(), e && clearTimeout(e), e = setTimeout(() => { e = null; try { - _(); + v(); } catch (e) { console.debug?.(e); } - g.reloadGrid().catch(() => {}); + _.reloadGrid().catch(() => {}); }, 250); }; try { - window.addEventListener("mjr:filters-changed", t, { signal: b?.signal }); + window.addEventListener("mjr:filters-changed", t, { signal: x?.signal }); } catch (e) { console.debug?.(e); } - w = () => { + T = () => { e &&= (clearTimeout(e), null); }; - } else w = Yv({ + } else T = Vv({ state: e, kindSelect: n, wfCheckbox: r, workflowTypeSelect: i, - ratingSelect: a, - minSizeInput: o, - maxSizeInput: s, - resolutionPresetSelect: c, - minWidthInput: l, - minHeightInput: u, - maxWidthInput: d, - maxHeightInput: f, - dateRangeSelect: p, - dateExactInput: m, - reloadGrid: g.reloadGrid, - reconcileSelection: _, - lifecycleSignal: b?.signal || null, + workflowIdInput: a, + ratingSelect: o, + minSizeInput: s, + maxSizeInput: c, + resolutionPresetSelect: l, + minWidthInput: u, + minHeightInput: d, + maxWidthInput: f, + maxHeightInput: p, + dateRangeSelect: m, + dateExactInput: h, + reloadGrid: _.reloadGrid, + reconcileSelection: v, + lifecycleSignal: x?.signal || null, onFiltersChanged: () => { - v({ reload: !1 }); + y({ reload: !1 }); try { - C?.refresh?.(); + w?.refresh?.(); } catch (e) { console.debug?.(e); } - y(); + b(); } }); return { - agendaCalendar: C, - disposeFilters: w + agendaCalendar: w, + disposeFilters: T }; } //#endregion //#region ui/features/panel/panelContextMenuExtraActions.ts -function Zv({ state: e, scopeController: t, browserNav: n, gridController: i, getDuplicatesAlert: a, refreshDuplicateAlerts: o }) { +function Uv({ state: e, scopeController: t, browserNav: n, gridController: r, getDuplicatesAlert: i, refreshDuplicateAlerts: a }) { return { clearSimilarScope: async () => { try { @@ -25486,43 +25259,43 @@ function Zv({ state: e, scopeController: t, browserNav: n, gridController: i, ge } }, onDuplicateAlertClick: async (e) => { - let t = (e || a() || {}).firstGroup; + let t = (e || i() || {}).firstGroup; if (t && Array.isArray(t.assets) && t.assets.length >= 2) { let e = t.assets[0] || {}, n = t.assets.slice(1).map((e) => Number(e?.id || 0)).filter((e) => e > 0); if (n.length) { - if (await gt(r("dialog.mergeDuplicateTags", "Exact duplicates detected ({count}). Merge tags into \"{target}\"?", { + if (await Bt(R("dialog.mergeDuplicateTags", "Exact duplicates detected ({count}). Merge tags into \"{target}\"?", { count: t.assets.length, target: e?.filename || e?.id }))) { - let t = await O(Number(e?.id || 0), n); - t?.ok ? s(r("toast.tagsMerged", "Tags merged"), "success", 2200) : s(r("toast.tagMergeFailed", "Tag merge failed: {error}", { error: t?.error || "error" }), "warning", 3500); + let t = await ue(Number(e?.id || 0), n); + t?.ok ? m(R("toast.tagsMerged", "Tags merged"), "success", 2200) : m(R("toast.tagMergeFailed", "Tag merge failed: {error}", { error: t?.error || "error" }), "warning", 3500); } - if (await gt(r("dialog.deleteExactDuplicates", "Delete {count} exact duplicate(s)?", { count: n.length }))) { - let e = await c(n); - e?.ok ? (s(r("toast.duplicatesDeleted", "Duplicates deleted"), "success", 2200), await i.reloadGrid()) : s(r("toast.deleteFailed", "Delete failed: {error}", { error: e?.error || "error" }), "warning", 3500); + if (await Bt(R("dialog.deleteExactDuplicates", "Delete {count} exact duplicate(s)?", { count: n.length }))) { + let e = await C(n); + e?.ok ? (m(R("toast.duplicatesDeleted", "Duplicates deleted"), "success", 2200), await r.reloadGrid()) : m(R("toast.deleteFailed", "Delete failed: {error}", { error: e?.error || "error" }), "warning", 3500); } - await o(); + await a(); return; } } - if (!await gt(r("dialog.startDuplicateAnalysis", "Start duplicate analysis in background?"))) return; - let n = await ie(500); - n?.ok ? s(r("toast.dupAnalysisStarted", "Duplicate analysis started"), "info", 2200) : s(r("toast.analysisNotStarted", "Analysis not started: {error}", { error: n?.error || "error" }), "warning", 3500), await o(); + if (!await Bt(R("dialog.startDuplicateAnalysis", "Start duplicate analysis in background?"))) return; + let n = await g(500); + n?.ok ? m(R("toast.dupAnalysisStarted", "Duplicate analysis started"), "info", 2200) : m(R("toast.analysisNotStarted", "Analysis not started: {error}", { error: n?.error || "error" }), "warning", 3500), await a(); } }; } //#endregion //#region ui/features/panel/panelRuntime.ts -async function Qv(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { - return $v(e, { +async function Wv(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { + return Gv(e, { useComfyThemeUI: t, external: n }); } -async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { - Oh("panelRender"), jh("panelRender"); - let a = typeof AbortController < "u" ? new AbortController() : null, { popovers: o, hostWrapper: c, hostWrapperPrevStyle: l } = jv(e, { useComfyThemeUI: n }), u = e_(); - if (!u) throw Error("[Majoor] mountAssetsManagerPanelRuntime requires an active Pinia panel store"); +async function Gv(e, { useComfyThemeUI: t = !0, external: n = {} } = {}) { + jh("panelRender"), Ph("panelRender"); + let r = typeof AbortController < "u" ? new AbortController() : null, { popovers: i, hostWrapper: a, hostWrapperPrevStyle: o } = Cv(e, { useComfyThemeUI: t }), s = Kg(); + if (!s) throw Error("[Majoor] mountAssetsManagerPanelRuntime requires an active Pinia panel store"); for (let e of [ "statusSection", "statusDot", @@ -25536,8 +25309,8 @@ async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { "gridWrapper", "gridContainer", "sidebar" - ]) if (!i?.[e]) throw Error(`[Majoor] mountAssetsManagerPanelRuntime now requires external.${e}`); - let d = t_(null, [ + ]) if (!n?.[e]) throw Error(`[Majoor] mountAssetsManagerPanelRuntime now requires external.${e}`); + let c = qg(null, [ "searchQuery", "scrollTop", "scope", @@ -25557,49 +25330,49 @@ async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { "similarTitle", "similarSourceAssetId" ]); - u.viewScope = String(u.viewScope || "").trim().toLowerCase() === "similar" ? "similar" : "", u.similarResults = Array.isArray(u.similarResults) ? u.similarResults : [], u.similarTitle = String(u.similarTitle || ""), u.similarSourceAssetId = String(u.similarSourceAssetId || ""); - let f = (e, t = "") => d.read(e, u?.[e] ?? t), p = (e, t) => d.write(e, t), m = () => { - let e = f("selectedAssetIds", []); + s.viewScope = String(s.viewScope || "").trim().toLowerCase() === "similar" ? "similar" : "", s.similarResults = Array.isArray(s.similarResults) ? s.similarResults : [], s.similarTitle = String(s.similarTitle || ""), s.similarSourceAssetId = String(s.similarSourceAssetId || ""); + let l = (e, t = "") => c.read(e, s?.[e] ?? t), u = (e, t) => c.write(e, t), d = () => { + let e = l("selectedAssetIds", []); return Array.isArray(e) ? e.map(String).filter(Boolean) : []; - }, h = () => String(f("activeAssetId", "") || "").trim(), g = () => !!f("sidebarOpen", !1), { header: _, tabButtons: v, customMenuBtn: y, filterBtn: b, sortBtn: x, collectionsBtn: S, pinnedFoldersBtn: C, messageBtn: w, customPopover: T, customSelect: E, customAddBtn: D, customRemoveBtn: O, filterPopover: k, kindSelect: A, wfCheckbox: j, workflowTypeSelect: M, ratingSelect: N, minSizeInput: F, maxSizeInput: ee, resolutionPresetSelect: te, minWidthInput: ne, minHeightInput: re, maxWidthInput: ie, maxHeightInput: oe, dateRangeSelect: se, dateExactInput: ce, agendaContainer: le, sortPopover: ue, sortMenu: de, collectionsPopover: fe, pinnedFoldersPopover: pe, pinnedFoldersController: me, pinnedFoldersMenu: he, messagePopoverTitle: ge, messagePopover: _e, messageTabBtn: ve, messageTabBadge: be, historyTabBtn: xe, historyTabBadge: Se, historyTabCount: Ce, historyPanel: we, shortcutsTabBtn: Te, messageList: Ee, shortcutsPanel: De, markReadBtn: Oe, searchSection: ke, searchInputEl: Ae, similarBtn: je, setSemanticEnabled: Me, _headerDispose: Ne } = i.headerSection, Pe = !!i?.headerSection?.isVueHeader; - d.read("searchQuery", "") && (Ae.value = d.read("searchQuery", "")), Ae.addEventListener("input", (e) => { - d.write("searchQuery", e.target.value); - }, { signal: a?.signal }); - let Fe = i.summaryBar, Ie = i.updateSummaryBar, Re = i.folderBreadcrumb, I = i.folderBreadcrumbController || null, ze = i.statusSection, Be = i.statusDot, Ve = i.statusText, Ue = i.capabilitiesSection, Ge = i.browseSection, Ke = i.gridWrapper, qe = i.sidebar; - Et(); - let Ye = document.createElement("div"); - Ye.classList.add("mjr-am-content"); - let L = null, Xe = null; + }, f = () => String(l("activeAssetId", "") || "").trim(), p = () => !!l("sidebarOpen", !1), { header: h, tabButtons: g, customMenuBtn: v, filterBtn: b, sortBtn: x, collectionsBtn: S, pinnedFoldersBtn: C, messageBtn: w, customPopover: T, customSelect: E, customAddBtn: D, customRemoveBtn: O, filterPopover: k, kindSelect: A, wfCheckbox: j, workflowTypeSelect: M, workflowIdInput: N, ratingSelect: P, minSizeInput: F, maxSizeInput: I, resolutionPresetSelect: ee, minWidthInput: te, minHeightInput: re, maxWidthInput: ie, maxHeightInput: ae, dateRangeSelect: oe, dateExactInput: ce, agendaContainer: le, sortPopover: ue, sortMenu: de, collectionsPopover: fe, pinnedFoldersPopover: pe, pinnedFoldersController: me, pinnedFoldersMenu: he, messagePopoverTitle: ge, messagePopover: _e, messageTabBtn: ve, messageTabBadge: ye, historyTabBtn: be, historyTabBadge: xe, historyTabCount: Se, historyPanel: Ce, shortcutsTabBtn: we, messageList: Te, shortcutsPanel: Ee, markReadBtn: De, searchSection: Oe, searchInputEl: ke, similarBtn: Ae, setSemanticEnabled: je, _headerDispose: Me } = n.headerSection, Ne = !!n?.headerSection?.isVueHeader; + c.read("searchQuery", "") && (ke.value = c.read("searchQuery", "")), ke.addEventListener("input", (e) => { + c.write("searchQuery", e.target.value); + }, { signal: r?.signal }); + let Pe = n.summaryBar, Fe = n.updateSummaryBar, Ie = n.folderBreadcrumb, z = n.folderBreadcrumbController || null, Le = n.statusSection, Re = n.statusDot, ze = n.statusText, Be = n.capabilitiesSection, Ve = n.browseSection, He = n.gridWrapper, Ue = n.sidebar; + pt(); + let Ge = document.createElement("div"); + Ge.classList.add("mjr-am-content"); + let B = null, qe = null; e.tabIndex = -1; - let Ze = null, Qe = 0, $e = () => { + let Je = null, Xe = 0, Ze = () => { try { - Qe = Date.now(); + Xe = Date.now(); } catch { - Qe = 0; + Xe = 0; } - }, et = typeof i?.bindGridHostState == "function" && typeof i?.restoreGridUiState == "function", tt = !et; - Ke.addEventListener("scroll", () => { - $e(), tt && (Ze && clearTimeout(Ze), Ze = setTimeout(() => { + }, Qe = typeof n?.bindGridHostState == "function" && typeof n?.restoreGridUiState == "function", $e = !Qe; + He.addEventListener("scroll", () => { + Ze(), $e && (Je && clearTimeout(Je), Je = setTimeout(() => { try { - d.write("scrollTop", Ke.scrollTop); + c.write("scrollTop", He.scrollTop); } catch (e) { console.debug?.(e); } }, 100)); }, { passive: !0, - signal: a?.signal - }), L = i.gridContainer, L.parentElement !== Ke && Ke.appendChild(L), He(L); + signal: r?.signal + }), B = n.gridContainer, B.parentElement !== He && He.appendChild(B), We(B); try { - L.dataset.mjrScope = String(f("scope", u.scope || "output") || "output"); + B.dataset.mjrScope = String(l("scope", s.scope || "output") || "output"); } catch (e) { console.debug?.(e); } - let nt = [], it = (e) => { - typeof e == "function" && nt.push(e); + let et = [], tt = (e) => { + typeof e == "function" && et.push(e); }; - L._mjrSummaryBarDispose = () => { - for (let e of nt.splice(0)) try { + B._mjrSummaryBarDispose = () => { + for (let e of et.splice(0)) try { e(); } catch (e) { console.debug?.(e); @@ -25608,17 +25381,17 @@ async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { try { let e = () => { try { - Ie?.({ - state: u, - gridContainer: L + Fe?.({ + state: s, + gridContainer: B }); } catch (e) { console.debug?.(e); } }; - L.addEventListener("mjr:grid-stats", e, { signal: a?.signal }), it(() => { + B.addEventListener("mjr:grid-stats", e, { signal: r?.signal }), tt(() => { try { - L.removeEventListener("mjr:grid-stats", e); + B.removeEventListener("mjr:grid-stats", e); } catch (e) { console.debug?.(e); } @@ -25626,134 +25399,134 @@ async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { } catch (e) { console.debug?.(e); } - let at = i.loadAssets ?? Br, ot = i.loadAssetsFromList ?? Vr, st = i.prepareGridForScopeSwitch ?? Hr, ct = i.disposeGrid ?? Ur, lt = i.refreshGrid ?? Wr, dt = i.captureAnchor ?? Gr, ft = i.restoreAnchor ?? Kr, pt = i.hydrateGridFromSnapshot ?? zr; - if (typeof i?.onGridContainerReady == "function") try { - i.onGridContainerReady(L, { getState: () => u }); + let nt = n.loadAssets ?? Vr, rt = n.loadAssetsFromList ?? Hr, it = n.prepareGridForScopeSwitch ?? Ur, ot = n.disposeGrid ?? Wr, st = n.refreshGrid ?? Gr, ct = n.captureAnchor ?? Kr, lt = n.restoreAnchor ?? qr, V = n.hydrateGridFromSnapshot ?? Br; + if (typeof n?.onGridContainerReady == "function") try { + n.onGridContainerReady(B, { getState: () => s }); } catch (e) { console.debug?.(e); } - else e._mjrGridContextMenuUnbind = oc({ - gridContainer: L, - getState: () => u + else e._mjrGridContextMenuUnbind = cc({ + gridContainer: B, + getState: () => s }); - let mt = r("search.findSimilar", "Find Similar"), ht = r("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: _t, isAiEnabled: vt } = Mv({ + let ft = R("search.findSimilar", "Find Similar"), mt = R("search.similarDisabled", "AI features are disabled in settings"), { applyWatcherForScope: ht, isAiEnabled: _t } = wv({ container: e, - state: u, - sidebar: qe, - browseSection: Ge, - gridWrapper: Ke, - similarBtn: je, - setSemanticEnabled: Me, - similarEnabledTitle: mt, - similarDisabledTitle: ht, - refreshGridFn: lt, - isSidebarOpen: g, - readActiveAssetId: h, - getSidebarController: () => Xe, - panelLifecycleAC: a + state: s, + sidebar: Ue, + browseSection: Ve, + gridWrapper: He, + similarBtn: Ae, + setSemanticEnabled: je, + similarEnabledTitle: ft, + similarDisabledTitle: mt, + refreshGridFn: st, + isSidebarOpen: p, + readActiveAssetId: f, + getSidebarController: () => qe, + panelLifecycleAC: r }); - Ye.appendChild(ze), Ye.appendChild(ke), Ye.appendChild(Re), Ye.appendChild(Fe), Ye.appendChild(Ge), e.appendChild(_); + Ge.appendChild(Le), Ge.appendChild(Oe), Ge.appendChild(Ie), Ge.appendChild(Pe), Ge.appendChild(Ve), e.appendChild(h); try { e._mjrVersionUpdateCleanup?.(); } catch (e) { console.debug?.(e); } - e._mjrVersionUpdateCleanup = Ne || _._mjrVersionUpdateCleanup, e.appendChild(Ye); - let yt = () => Q_(Ae), bt = $_({ - gridContainer: L, - loadAssets: at, - loadAssetsFromList: ot, - getCollectionAssets: t, - disposeGrid: ct, - getQuery: yt, - searchInputEl: Ae, - state: u - }), xt = null, St = null, R = null, wt = null, Tt = null, Dt = null, Ot = null, kt = null, At = null, jt = () => { + e._mjrVersionUpdateCleanup = Me || h._mjrVersionUpdateCleanup, e.appendChild(Ge); + let vt = () => W_(ke), yt = G_({ + gridContainer: B, + loadAssets: nt, + loadAssetsFromList: rt, + getCollectionAssets: _, + disposeGrid: ot, + getQuery: vt, + searchInputEl: ke, + state: s + }), bt = null, xt = null, St = null, Ct = null, wt = null, Tt = null, Et = null, Dt = null, Ot = null, kt = () => { try { - St?.update?.(); + xt?.update?.(); } catch (e) { console.debug?.(e); } try { - Dt?.renderBreadcrumb?.(); + Tt?.renderBreadcrumb?.(); } catch (e) { console.debug?.(e); } }; - et || (kt = Dv({ - gridContainer: L, - readSelectedAssetIds: m, - readActiveAssetId: () => h(), - writeSelectedAssetIds: (e) => p("selectedAssetIds", e), - writeActiveAssetId: (e) => p("activeAssetId", e), + Qe || (Dt = yv({ + gridContainer: B, + readSelectedAssetIds: d, + readActiveAssetId: () => f(), + writeSelectedAssetIds: (e) => u("selectedAssetIds", e), + writeActiveAssetId: (e) => u("activeAssetId", e), onSelectionChanged: () => { - $e(), jt(); + Ze(), kt(); }, - lifecycleSignal: a?.signal || null - })), Dt = ev({ - state: u, - gridContainer: L, - folderBreadcrumb: Re, - folderBreadcrumbController: I, + lifecycleSignal: r?.signal || null + })), Tt = K_({ + state: s, + gridContainer: B, + folderBreadcrumb: Ie, + folderBreadcrumbController: z, customSelect: E, - reloadGrid: () => bt.reloadGrid(), + reloadGrid: () => yt.reloadGrid(), clearSelection: () => { try { - L?._mjrSetSelection?.([], ""); + B?._mjrSetSelection?.([], ""); } catch (e) { console.debug?.(e); } }, onContextChanged: () => { try { - St?.update?.(); + xt?.update?.(); } catch (e) { console.debug?.(e); } }, - lifecycleSignal: a?.signal || null + lifecycleSignal: r?.signal || null }); try { - Ot = Dt.bindGridFolderNavigation(); + Et = Tt.bindGridFolderNavigation(); } catch (e) { console.debug?.(e); } - let Mt = async () => { - let e = String(f("scope", u.scope || "output") || "output").toLowerCase(), t = String(f("customRootId", u.customRootId || "") || "").trim(); + let At = async () => { + let e = String(l("scope", s.scope || "output") || "output").toLowerCase(), t = String(l("customRootId", s.customRootId || "") || "").trim(); if (e === "custom" && !t) { - R = null, jt(); + St = null, kt(); return; } try { - let n = await ae({ + let n = await se({ scope: e, customRootId: t, maxGroups: 4, maxPairs: 4 - }, { signal: a?.signal }); + }, { signal: r?.signal }); if (!n?.ok) return; - let r = n.data || {}; - R = { - exactCount: Array.isArray(r.exact_groups) ? r.exact_groups.length : 0, - similarCount: Array.isArray(r.similar_pairs) ? r.similar_pairs.length : 0, - firstGroup: Array.isArray(r.exact_groups) ? r.exact_groups[0] : null, - firstPair: Array.isArray(r.similar_pairs) ? r.similar_pairs[0] : null - }, jt(); + let i = n.data || {}; + St = { + exactCount: Array.isArray(i.exact_groups) ? i.exact_groups.length : 0, + similarCount: Array.isArray(i.similar_pairs) ? i.similar_pairs.length : 0, + firstGroup: Array.isArray(i.exact_groups) ? i.exact_groups[0] : null, + firstPair: Array.isArray(i.similar_pairs) ? i.similar_pairs[0] : null + }, kt(); } catch (e) { console.debug?.(e); } - }, Nt = null; - Nv({ - gridContainer: L, - panelLifecycleAC: a, + }, jt = null; + Tv({ + gridContainer: B, + panelLifecycleAC: r, requestQueuedReload: () => { try { - Nt && clearTimeout(Nt); + jt && clearTimeout(jt); } catch (e) { console.debug?.(e); } - Nt = setTimeout(() => { - Nt = null, Kt().catch((e) => { + jt = setTimeout(() => { + jt = null, Gt().catch((e) => { try { console.warn("[Majoor] queuedReload failed", e); } catch (e) { @@ -25762,294 +25535,296 @@ async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { }); }, 120); }, - notifyContextChanged: jt, - markUserInteraction: $e, - writePanelValue: p, - popovers: o, + notifyContextChanged: kt, + markUserInteraction: Ze, + writePanelValue: u, + popovers: i, collectionsPopover: fe, - gridController: bt, - registerSummaryDispose: it + gridController: yt, + registerSummaryDispose: tt }); - let Pt = av({ - state: u, + let Mt = Z_({ + state: s, customSelect: E, customRemoveBtn: O, - comfyConfirm: gt, - comfyPrompt: Lt, - comfyToast: s, - get: P, - post: ye, - ENDPOINTS: Le, - reloadGrid: bt.reloadGrid, + comfyConfirm: Bt, + comfyPrompt: gt, + comfyToast: m, + get: ne, + post: y, + ENDPOINTS: L, + reloadGrid: yt.reloadGrid, onRootChanged: async () => { try { - Dt?.resetHistory?.(); + Tt?.resetHistory?.(); } catch (e) { console.debug?.(e); } try { - await _t(u.scope); + await ht(s.scope); } catch (e) { console.debug?.(e); } try { - await Mt(); + await At(); } catch (e) { console.debug?.(e); } } - }), Ft = Pt.bind({ + }), Nt = Mt.bind({ customAddBtn: D, customRemoveBtn: O }); try { window.addEventListener("mjr:custom-roots-changed", async (e) => { let t = String(e?.detail?.preferredId || "").trim() || null; - await Pt.refreshCustomRoots(t); - }, { signal: a?.signal }); + await Mt.refreshCustomRoots(t); + }, { signal: r?.signal }); } catch (e) { console.debug?.(e); } - let It = () => { + let Pt = () => { try { - let e = L?._mjrGetAssets, t = L?._mjrSetSelection; + let e = B?._mjrGetAssets, t = B?._mjrSetSelection; if (typeof e != "function" || typeof t != "function") return; - let n = (Array.isArray(e()) ? e() : []).map((e) => String(e?.id ?? "").trim()).filter(Boolean), i = m(), a = i.filter((e) => n.includes(e)), o = i.length - a.length; - if (o <= 0) return; - let c = h(); - t(a, a.includes(c) ? c : a[0] || ""), s(r("toast.selectionPruned", "{count} items deselected - not visible in current view", { count: o }), "info", 2600, { noHistory: !0 }); + let n = (Array.isArray(e()) ? e() : []).map((e) => String(e?.id ?? "").trim()).filter(Boolean), r = d(), i = r.filter((e) => n.includes(e)), a = r.length - i.length; + if (a <= 0) return; + let o = f(); + t(i, i.includes(o) ? o : i[0] || ""), m(R("toast.selectionPruned", "{count} items deselected - not visible in current view", { count: a }), "info", 2600, { noHistory: !0 }); } catch (e) { console.debug?.(e); } }; - xt = tv({ - state: u, - tabButtons: v, - customMenuBtn: y, + bt = q_({ + state: s, + tabButtons: g, + customMenuBtn: v, customPopover: T, - popovers: o, - refreshCustomRoots: Pt.refreshCustomRoots, - reloadGrid: bt.reloadGrid, - reconcileSelection: It, + popovers: i, + refreshCustomRoots: Mt.refreshCustomRoots, + reloadGrid: yt.reloadGrid, + reconcileSelection: Pt, onChanged: () => { try { - L && (L.dataset.mjrScope = String(f("scope", u.scope || "output") || "output")); + B && (B.dataset.mjrScope = String(l("scope", s.scope || "output") || "output")); } catch (e) { console.debug?.(e); } - jt(); + kt(); }, onScopeChanged: async () => { try { - await _t(String(f("scope", u.scope || "output") || "output")); + await ht(String(l("scope", s.scope || "output") || "output")); } catch (e) { console.debug?.(e); } try { - await Mt(); + await At(); } catch (e) { console.debug?.(e); } }, onBeforeReload: async () => { try { - L.dataset.mjrScope = f("scope", "output"), L.dataset.mjrCustomRootId = f("customRootId", "") || "", L.dataset.mjrSubfolder = f("currentFolderRelativePath", "") || "", L.dataset.mjrCollectionId = f("collectionId", "") || "", L.dataset.mjrViewScope = f("viewScope", "") || ""; + B.dataset.mjrScope = l("scope", "output"), B.dataset.mjrCustomRootId = l("customRootId", "") || "", B.dataset.mjrSubfolder = l("currentFolderRelativePath", "") || "", B.dataset.mjrCollectionId = l("collectionId", "") || "", B.dataset.mjrViewScope = l("viewScope", "") || ""; } catch (e) { console.debug?.(e); } try { - st(L); + it(B); } catch (e) { console.debug?.(e); } try { - await _g(Be, Ve, Ue, { - scope: f("scope", u.scope || "output"), - customRootId: f("customRootId", u.customRootId || "") - }, null, { signal: a?.signal || null }); + await bg(Re, ze, Be, { + scope: l("scope", s.scope || "output"), + customRootId: l("customRootId", s.customRootId || "") + }, null, { signal: r?.signal || null }); } catch (e) { console.debug?.(e); } } }); - let Rt = async ({ reload: e = !1 } = {}) => { + let Ft = async ({ reload: e = !1 } = {}) => { try { - if (String(f("viewScope", u.viewScope || "") || "").trim().toLowerCase() !== "similar") return; - await xt?.clearSimilarScope?.({ reload: e }); + if (String(l("viewScope", s.viewScope || "") || "").trim().toLowerCase() !== "similar") return; + await bt?.clearSimilarScope?.({ reload: e }); } catch (e) { console.debug?.(e); } }; - Object.values(v).forEach((e) => { - e.addEventListener("click", () => xt.setScope(e.dataset.scope), { signal: a?.signal }); - }), Y_({ + Object.values(g).forEach((e) => { + e.addEventListener("click", () => bt.setScope(e.dataset.scope), { signal: r?.signal }); + }), V_({ messageBtn: w, messagePopover: _e, title: ge, - messageList: Ee, - historyTabBtn: xe, - historyTabBadge: Se, - historyTabCount: Ce, - historyPanel: we, - shortcutsPanel: De, + messageList: Te, + historyTabBtn: be, + historyTabBadge: xe, + historyTabCount: Se, + historyPanel: Ce, + shortcutsPanel: Ee, messageTabBtn: ve, - messageTabBadge: be, - shortcutsTabBtn: Te, - markReadBtn: Oe, - popovers: o, - signal: a?.signal, + messageTabBadge: ye, + shortcutsTabBtn: we, + markReadBtn: De, + popovers: i, + signal: r?.signal, onBeforeToggle: () => { - o.close(T), o.close(k), o.close(ue), o.close(fe), o.close(pe); + i.close(T), i.close(k), i.close(ue), i.close(fe), i.close(pe); } - }), o.setDismissWhitelist([ + }), i.setDismissWhitelist([ T, k, ue, fe, pe, _e, - y, + v, b, x, S, C, w - ]), y.addEventListener("click", (e) => { - e.stopPropagation(), o.close(k), o.close(ue), o.close(fe), o.close(_e), o.toggle(T, y); - }, { signal: a?.signal }), b.addEventListener("click", (e) => { - e.stopPropagation(), o.close(T), o.close(ue), o.close(fe), o.close(_e), o.toggle(k, b); - }, { signal: a?.signal }), S.addEventListener("click", (e) => { - e.stopPropagation(), o.close(T), o.close(k), o.close(ue), o.close(_e), o.toggle(fe, S); - }, { signal: a?.signal }); - let zt = Pe ? null : ov({ - state: u, + ]), v.addEventListener("click", (e) => { + e.stopPropagation(), i.close(k), i.close(ue), i.close(fe), i.close(_e), i.toggle(T, v); + }, { signal: r?.signal }), b.addEventListener("click", (e) => { + e.stopPropagation(), i.close(T), i.close(ue), i.close(fe), i.close(_e), i.toggle(k, b); + }, { signal: r?.signal }), S.addEventListener("click", (e) => { + e.stopPropagation(), i.close(T), i.close(k), i.close(ue), i.close(_e), i.toggle(fe, S); + }, { signal: r?.signal }); + let It = Ne ? null : Q_({ + state: s, sortBtn: x, sortMenu: de, sortPopover: ue, - popovers: o, - reloadGrid: bt.reloadGrid, - onChanged: () => jt() + popovers: i, + reloadGrid: yt.reloadGrid, + onChanged: () => kt() }); - zt ? zt.bind({ onBeforeToggle: () => { - o.close(T), o.close(k), o.close(fe), o.close(_e); + It ? It.bind({ onBeforeToggle: () => { + i.close(T), i.close(k), i.close(fe), i.close(_e); } }) : x.addEventListener("click", (e) => { - e.stopPropagation(), o.close(T), o.close(k), o.close(fe), o.close(_e), o.toggle(ue, x); - }, { signal: a?.signal }), Fv({ - similarBtn: je, - gridContainer: L, - state: u, - panelLifecycleAC: a, - isAiEnabled: vt, - similarDisabledTitle: ht, - readActiveAssetId: h, - readSelectedAssetIds: m, - readPanelValue: f, - writePanelValue: p, - scopeController: xt, + e.stopPropagation(), i.close(T), i.close(k), i.close(fe), i.close(_e), i.toggle(ue, x); + }, { signal: r?.signal }), Dv({ + similarBtn: Ae, + gridContainer: B, + state: s, + panelLifecycleAC: r, + isAiEnabled: _t, + similarDisabledTitle: mt, + readActiveAssetId: f, + readSelectedAssetIds: d, + readPanelValue: l, + writePanelValue: u, + scopeController: bt, closePopovers: () => { - o.close(T), o.close(k), o.close(ue), o.close(fe), o.close(_e); + i.close(T), i.close(k), i.close(ue), i.close(fe), i.close(_e); } - }), Iv({ + }), Ov({ pinnedFoldersBtn: C, pinnedFoldersController: me, pinnedFoldersMenu: he, pinnedFoldersPopover: pe, - popovers: o, + popovers: i, closeOtherPopovers: () => { - o.close(T), o.close(k), o.close(ue), o.close(fe), o.close(_e); + i.close(T), i.close(k), i.close(ue), i.close(fe), i.close(_e); }, - state: u, - gridContainer: L, + state: s, + gridContainer: B, customSelect: E, - scopeController: xt, - customRootsController: Pt, - gridController: bt, - applyWatcherForScope: _t, - refreshDuplicateAlerts: Mt, - notifyContextChanged: jt, - panelLifecycleAC: a + scopeController: bt, + customRootsController: Mt, + gridController: yt, + applyWatcherForScope: ht, + refreshDuplicateAlerts: At, + notifyContextChanged: kt, + panelLifecycleAC: r }); - let { agendaCalendar: Bt, disposeFilters: Vt } = Xv({ - state: u, - hasVueHeaderSection: Pe, + let { agendaCalendar: Lt, disposeFilters: Rt } = Hv({ + state: s, + hasVueHeaderSection: Ne, kindSelect: A, wfCheckbox: j, workflowTypeSelect: M, - ratingSelect: N, + workflowIdInput: N, + ratingSelect: P, minSizeInput: F, - maxSizeInput: ee, - resolutionPresetSelect: te, - minWidthInput: ne, + maxSizeInput: I, + resolutionPresetSelect: ee, + minWidthInput: te, minHeightInput: re, maxWidthInput: ie, - maxHeightInput: oe, - dateRangeSelect: se, + maxHeightInput: ae, + dateRangeSelect: oe, dateExactInput: ce, agendaContainer: le, - gridController: bt, - reconcileVisibleSelection: It, - exitSimilarViewIfActive: Rt, - notifyContextChanged: jt, - panelLifecycleAC: a, - popovers: o, + gridController: yt, + reconcileVisibleSelection: Pt, + exitSimilarViewIfActive: Ft, + notifyContextChanged: kt, + panelLifecycleAC: r, + popovers: i, filterPopover: k - }), Ht = Zv({ - state: u, - scopeController: xt, - browserNav: Dt, - gridController: bt, - getDuplicatesAlert: () => R, - refreshDuplicateAlerts: Mt + }), zt = Uv({ + state: s, + scopeController: bt, + browserNav: Tt, + gridController: yt, + getDuplicatesAlert: () => St, + refreshDuplicateAlerts: At }); try { - St = iv({ - state: u, - gridContainer: L, + xt = X_({ + state: s, + gridContainer: B, filterBtn: b, sortBtn: x, collectionsBtn: S, - searchInputEl: Ae, + searchInputEl: ke, kindSelect: A, wfCheckbox: j, workflowTypeSelect: M, - ratingSelect: N, + workflowIdInput: N, + ratingSelect: P, minSizeInput: F, - maxSizeInput: ee, - minWidthInput: ne, + maxSizeInput: I, + minWidthInput: te, minHeightInput: re, maxWidthInput: ie, - maxHeightInput: oe, - resolutionPresetSelect: te, - dateRangeSelect: se, + maxHeightInput: ae, + resolutionPresetSelect: ee, + dateRangeSelect: oe, dateExactInput: ce, - scopeController: xt, - sortController: zt, - updateSummaryBar: Ie, - reloadGrid: () => bt.reloadGrid(), - getExtraContext: () => ({ duplicatesAlert: R }), - extraActions: Ht + scopeController: bt, + sortController: It, + updateSummaryBar: Fe, + reloadGrid: () => yt.reloadGrid(), + getExtraContext: () => ({ duplicatesAlert: St }), + extraActions: zt }); } catch (e) { console.debug?.(e); } try { - if (jt(), et) it(i.bindGridHostState({ - onContextChanged: jt, - markUserInteraction: $e + if (kt(), Qe) tt(n.bindGridHostState({ + onContextChanged: kt, + markUserInteraction: Ze })); else { - let e = () => jt(); - L.addEventListener("mjr:grid-stats", e, { signal: a?.signal }), window.addEventListener?.("mjr-settings-changed", e, { signal: a?.signal }); - let t = null, n = null, r = () => { + let e = () => kt(); + B.addEventListener("mjr:grid-stats", e, { signal: r?.signal }), window.addEventListener?.("mjr-settings-changed", e, { signal: r?.signal }); + let t = null, n = null, i = () => { n && clearTimeout(n), n = setTimeout(() => { n = null, t && cancelAnimationFrame(t), t = requestAnimationFrame(() => { - t = null, jt(); + t = null, kt(); }); }, 250); - }, i = new MutationObserver(() => r()); - i.observe(L, { childList: !0 }), L._mjrSummaryBarObserver = i, it(() => { + }, a = new MutationObserver(() => i()); + a.observe(B, { childList: !0 }), B._mjrSummaryBarObserver = a, tt(() => { try { - L.removeEventListener("mjr:grid-stats", e); + B.removeEventListener("mjr:grid-stats", e); } catch (e) { console.debug?.(e); } @@ -26064,7 +25839,7 @@ async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { console.debug?.(e); } try { - i.disconnect(); + a.disconnect(); } catch (e) { console.debug?.(e); } @@ -26073,103 +25848,103 @@ async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { } catch (e) { console.debug?.(e); } - Xe = wv({ - gridContainer: L, - sidebar: qe, - createRatingBadge: Ct, + qe = gv({ + gridContainer: B, + sidebar: Ue, + createRatingBadge: dt, createTagsBadge: ut, - showAssetInSidebar: Vg, - closeSidebar: Hg, - state: u + showAssetInSidebar: Wg, + closeSidebar: Gg, + state: s }); - let z = { - gridController: bt, - captureAnchor: dt, - restoreAnchor: ft, - restoreGridUiState: et ? (e) => i.restoreGridUiState(e, { onRestoreSidebar: () => { + let Vt = { + gridController: yt, + captureAnchor: ct, + restoreAnchor: lt, + restoreGridUiState: Qe ? (e) => n.restoreGridUiState(e, { onRestoreSidebar: () => { try { - Xe?.toggleDetails?.(); + qe?.toggleDetails?.(); } catch (e) { console.debug?.(e); } } }) : null, - readScrollTop: () => d.read("scrollTop", u.scrollTop || 0), + readScrollTop: () => c.read("scrollTop", s.scrollTop || 0), restoreSelectionState: ({ scrollTop: e } = {}) => { - kt?.restoreSelectionState?.({ scrollTop: e }); + Dt?.restoreSelectionState?.({ scrollTop: e }); }, - readActiveAssetId: h, - isSidebarOpen: g, + readActiveAssetId: f, + isSidebarOpen: p, toggleSidebarDetails: () => { - Xe?.toggleDetails?.(); + qe?.toggleDetails?.(); }, - getQuery: yt, - getScope: () => d.read("scope", u.scope), - loadAssets: at, - lifecycleSignal: a?.signal || null + getQuery: vt, + getScope: () => c.read("scope", s.scope), + loadAssets: nt, + lifecycleSignal: r?.signal || null }; - At = typeof i?.initAssetsQueryController == "function" ? i.initAssetsQueryController(z) : Av({ - gridContainer: L, - gridWrapper: Ke, - ...z + Ot = typeof n?.initAssetsQueryController == "function" ? n.initAssetsQueryController(Vt) : Sv({ + gridContainer: B, + gridWrapper: He, + ...Vt }); - let Ut = Tv({ + let Ht = _v({ onTriggerScan: (e) => { - lg(Be, Ve, Ue, e || {}); + fg(Re, ze, Be, e || {}); }, onToggleDetails: () => { - Xe?.toggleDetails?.(); + qe?.toggleDetails?.(); }, onToggleFloatingViewer: () => { try { - window.dispatchEvent(new Event(B.MFV_TOGGLE)); + window.dispatchEvent(new Event(H.MFV_TOGGLE)); } catch (e) { console.debug?.(e); } }, onFocusSearch: () => { try { - Ae?.focus?.(); - let e = Ae?.value?.length || 0; - Ae?.setSelectionRange?.(e, e); + ke?.focus?.(); + let e = ke?.value?.length || 0; + ke?.setSelectionRange?.(e, e); } catch (e) { console.debug?.(e); } }, onClearSearch: () => { try { - if (!Ae) return; - p("searchQuery", ""), Ae.value = "", Ae.dispatchEvent?.(new Event("input", { bubbles: !0 })); + if (!ke) return; + u("searchQuery", ""), ke.value = "", ke.dispatchEvent?.(new Event("input", { bubbles: !0 })); } catch (e) { console.debug?.(e); } }, getScanContext: () => ({ - scope: d.read("scope", u.scope), - customRootId: d.read("customRootId", u.customRootId) + scope: c.read("scope", s.scope), + customRootId: c.read("customRootId", s.customRootId) }) - }), Wt = fc({ - gridContainer: L, - createRatingBadge: Ct - }), Gt = null; + }), Ut = mc({ + gridContainer: B, + createRatingBadge: dt + }), Wt = null; if (e._eventCleanup) try { e._eventCleanup(); } catch (e) { console.debug?.(e); } - Ut.bind(Ye), Wt.bind(), rt("grid"); + Ht.bind(Ge), Ut.bind(), at("grid"); try { - e._mjrHotkeys = Ut, e._mjrRatingHotkeys = Wt, e._mjrSidebarController = Xe; + e._mjrHotkeys = Ht, e._mjrRatingHotkeys = Ut, e._mjrSidebarController = qe; } catch (e) { console.debug?.(e); } e._eventCleanup = () => { try { - a?.abort?.(); + r?.abort?.(); } catch (e) { console.debug?.(e); } try { - ze?._mjrStatusPollDispose?.(); + Le?._mjrStatusPollDispose?.(); } catch (e) { console.debug?.(e); } @@ -26180,7 +25955,12 @@ async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { } e._mjrVersionUpdateCleanup = null; try { - Ze && clearTimeout(Ze), Ze = null; + Je && clearTimeout(Je), Je = null; + } catch (e) { + console.debug?.(e); + } + try { + Ht.dispose(); } catch (e) { console.debug?.(e); } @@ -26189,216 +25969,211 @@ async function $v(e, { useComfyThemeUI: n = !0, external: i = {} } = {}) { } catch (e) { console.debug?.(e); } + Ke().scope === "grid" && at(null); try { - Wt.dispose(); - } catch (e) { - console.debug?.(e); - } - We().scope === "grid" && rt(null); - try { - Bt?.dispose?.(); + Lt?.dispose?.(); } catch (e) { console.debug?.(e); } try { - Vt?.(); + Rt?.(); } catch (e) { console.debug?.(e); } try { - Gt?.(); + Wt?.(); + } catch (e) { + console.debug?.(e); + } + Wt = null; + try { + Ue?.dispose?.(); } catch (e) { console.debug?.(e); } - Gt = null; try { qe?.dispose?.(); } catch (e) { console.debug?.(e); } try { - Xe?.dispose?.(); + Ct && clearInterval(Ct), Ct = null; } catch (e) { console.debug?.(e); } try { - wt && clearInterval(wt), wt = null; + wt && clearTimeout(wt), wt = null; } catch (e) { console.debug?.(e); } try { - Tt && clearTimeout(Tt), Tt = null; + Ot?.dispose?.(); + } catch (e) { + console.debug?.(e); + } + Ot = null; + try { + Dt?.dispose?.(); + } catch (e) { + console.debug?.(e); + } + Dt = null; + try { + B?._mjrSummaryBarDispose?.(); } catch (e) { console.debug?.(e); } try { - At?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - At = null; - try { - kt?.dispose?.(); - } catch (e) { - console.debug?.(e); - } - kt = null; - try { - L?._mjrSummaryBarDispose?.(); + B?._mjrSummaryBarObserver?.disconnect?.(); } catch (e) { console.debug?.(e); } try { - L?._mjrSummaryBarObserver?.disconnect?.(); + B?._mjrGridContextMenuUnbind?.(); } catch (e) { console.debug?.(e); } try { - L?._mjrGridContextMenuUnbind?.(); + Nt?.(); } catch (e) { console.debug?.(e); } try { - Ft?.(); + Et?.(); } catch (e) { console.debug?.(e); } try { - Ot?.(); + B && ot(B); + } catch (e) { + console.debug?.(e); + } + Ye(B), B = null; + try { + i.dispose(); } catch (e) { console.debug?.(e); } try { - L && ct(L); - } catch (e) { - console.debug?.(e); - } - Je(L), L = null; - try { - o.dispose(); + e._mjrPopoverManager === i && (e._mjrPopoverManager = null); } catch (e) { console.debug?.(e); } try { - e._mjrPopoverManager === o && (e._mjrPopoverManager = null); - } catch (e) { - console.debug?.(e); - } - try { - c && l && (c.style.height = l.height, c.style.minHeight = l.minHeight, c.style.width = l.width); + a && o && (a.style.height = o.height, a.style.minHeight = o.minHeight, a.style.width = o.width); } catch (e) { console.debug?.(e); } }; - let Kt = async () => { - await At?.queuedReload?.(); + let Gt = async () => { + await Ot?.queuedReload?.(); }; - Dg(Be, Ve, ze, Ue, At?.createCountersUpdateHandler?.({ - state: u, - getStableQuery: () => String(L?.dataset?.mjrQuery || "*").trim() || "*", - getRecentUserInteractionAt: () => Number(Qe || 0) + Ag(Re, ze, Le, Be, Ot?.createCountersUpdateHandler?.({ + state: s, + getStableQuery: () => String(B?.dataset?.mjrQuery || "*").trim() || "*", + getRecentUserInteractionAt: () => Number(Xe || 0) }) ?? (async () => { - await Kt(); + await Gt(); }), () => ({ - scope: d.read("scope", u.scope), - customRootId: d.read("customRootId", u.customRootId) - })), xt.setActiveTabStyles(), Dt?.renderBreadcrumb?.(), Pt.refreshCustomRoots().catch(() => {}), Gt = At?.bindSearchInput?.({ - searchInputEl: Ae, - lifecycleSignal: a?.signal || null, + scope: c.read("scope", s.scope), + customRootId: c.read("customRootId", s.customRootId) + })), bt.setActiveTabStyles(), Tt?.renderBreadcrumb?.(), Mt.refreshCustomRoots().catch(() => {}), Wt = Ot?.bindSearchInput?.({ + searchInputEl: ke, + lifecycleSignal: r?.signal || null, debounceMs: 120, onQueryChanged: () => { - Rt({ reload: !1 }), jt(); + Ft({ reload: !1 }), kt(); }, onBeforeReload: () => { - Rt({ reload: !1 }), jt(); + Ft({ reload: !1 }), kt(); }, startSearchTimer: () => { - Oh("searchQuery"); + jh("searchQuery"); }, reloadGrid: () => { - bt.reloadGrid(); + yt.reloadGrid(); } }); + let Kt = !1; + try { + Kt = await V(B, { + scope: l("scope", s.scope || "output") || "output", + query: String(W_(c.read("searchQuery", s.searchQuery || "*") || "*") || "*"), + customRootId: l("customRootId", s.customRootId || "") || "", + subfolder: l("currentFolderRelativePath", s.currentFolderRelativePath || "") || "", + collectionId: l("collectionId", s.collectionId || "") || "", + viewScope: l("viewScope", s.viewScope || "") || "", + kind: l("kindFilter", s.kindFilter || "") || "", + workflowOnly: !!l("workflowOnly", s.workflowOnly), + minRating: l("minRating", s.minRating || "") || "", + minSizeMB: l("minSizeMB", s.minSizeMB || "") || "", + maxSizeMB: l("maxSizeMB", s.maxSizeMB || "") || "", + resolutionCompare: l("resolutionCompare", s.resolutionCompare || "") || "", + minWidth: l("minWidth", s.minWidth || "") || "", + minHeight: l("minHeight", s.minHeight || "") || "", + maxWidth: l("maxWidth", s.maxWidth || "") || "", + maxHeight: l("maxHeight", s.maxHeight || "") || "", + workflowType: l("workflowType", s.workflowType || "") || "", + dateRange: l("dateRangeFilter", s.dateRangeFilter || "") || "", + dateExact: l("dateExactFilter", s.dateExactFilter || "") || "", + sort: l("sort", s.sort || "mtime_desc") || "mtime_desc" + }, { title: l("collectionName", s.collectionName || "") || c.read("searchQuery", s.searchQuery || "") || "Cached" }); + } catch (e) { + console.debug?.(e); + } let qt = !1; try { - qt = await pt(L, { - scope: f("scope", u.scope || "output") || "output", - query: String(Q_(d.read("searchQuery", u.searchQuery || "*") || "*") || "*"), - customRootId: f("customRootId", u.customRootId || "") || "", - subfolder: f("currentFolderRelativePath", u.currentFolderRelativePath || "") || "", - collectionId: f("collectionId", u.collectionId || "") || "", - viewScope: f("viewScope", u.viewScope || "") || "", - kind: f("kindFilter", u.kindFilter || "") || "", - workflowOnly: !!f("workflowOnly", u.workflowOnly), - minRating: f("minRating", u.minRating || "") || "", - minSizeMB: f("minSizeMB", u.minSizeMB || "") || "", - maxSizeMB: f("maxSizeMB", u.maxSizeMB || "") || "", - resolutionCompare: f("resolutionCompare", u.resolutionCompare || "") || "", - minWidth: f("minWidth", u.minWidth || "") || "", - minHeight: f("minHeight", u.minHeight || "") || "", - maxWidth: f("maxWidth", u.maxWidth || "") || "", - maxHeight: f("maxHeight", u.maxHeight || "") || "", - workflowType: f("workflowType", u.workflowType || "") || "", - dateRange: f("dateRangeFilter", u.dateRangeFilter || "") || "", - dateExact: f("dateExactFilter", u.dateExactFilter || "") || "", - sort: f("sort", u.sort || "mtime_desc") || "mtime_desc" - }, { title: f("collectionName", u.collectionName || "") || d.read("searchQuery", u.searchQuery || "") || "Cached" }); + qt = !!B?.querySelector?.(".mjr-asset-card"); } catch (e) { console.debug?.(e); } - let Jt = !1; - try { - Jt = !!L?.querySelector?.(".mjr-asset-card"); - } catch (e) { - console.debug?.(e); - } - let Yt = dm(), Xt = !Yt && (qt || Jt) ? Promise.resolve({ + let Jt = pm(), Yt = !Jt && (Kt || qt) ? Promise.resolve({ ok: !0, - hydrated: !!qt, - cached: !!Jt - }) : bt.reloadGrid({ - reason: Yt ? "pending-generated-assets" : "initial-load", - preserveVisibleUntilReady: !Yt + hydrated: !!Kt, + cached: !!qt + }) : yt.reloadGrid({ + reason: Jt ? "pending-generated-assets" : "initial-load", + preserveVisibleUntilReady: !Jt }); - if (qt) try { + if (Kt) try { setTimeout(() => { try { - if (a?.signal?.aborted) return; + if (r?.signal?.aborted) return; } catch (e) { console.debug?.(e); } - bt.reloadGrid().catch(() => {}); + yt.reloadGrid().catch(() => {}); }, 200); } catch (e) { console.debug?.(e); } - Mt().catch(() => {}); + At().catch(() => {}); try { - wt = setInterval(() => { + Ct = setInterval(() => { try { - if (a?.signal?.aborted) return; + if (r?.signal?.aborted) return; } catch (e) { console.debug?.(e); } - Mt().catch(() => {}); + At().catch(() => {}); }, 15e3); } catch (e) { console.debug?.(e); } - At?.restoreUiState?.(Xt); + Ot?.restoreUiState?.(Yt); try { window.__mjrLastAssetUpsert = 0, window.__mjrLastAssetUpsertCount = 0; } catch (e) { console.debug?.(e); } - return Ph(kh("panelRender", "gridRender") ?? 0), { gridContainer: L }; + return Lh(Mh("panelRender", "gridRender") ?? 0), { gridContainer: B }; } //#endregion //#region ui/vue/components/status/StatusSection.vue -var ey = { +var Kv = { __name: "StatusSection", setup(e, { expose: t }) { - let n = cg({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); + let n = dg({ getScanContext: null }), r = n.querySelector("#mjr-status-dot"), i = n.querySelector("#mjr-status-text"), a = n.querySelector("#mjr-status-capabilities"); return Sn(() => { try { n?._mjrStatusPollDispose?.(); @@ -26410,7 +26185,7 @@ var ey = { capabilitiesSection: a }), (e, t) => null; } -}, ty = { class: "mjr-am-search-pill" }, ny = ["id"], ry = { class: "mjr-am-search-tools" }, iy = { class: "mjr-popover-anchor" }, ay = { class: "mjr-popover-anchor" }, oy = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", sy = { +}, qv = { class: "mjr-am-search-pill" }, Jv = ["id"], Yv = { class: "mjr-am-search-tools" }, Xv = { class: "mjr-popover-anchor" }, Zv = { class: "mjr-popover-anchor" }, Qv = "Ctrl/Cmd+F, Ctrl/Cmd+K, Ctrl/Cmd+H", $v = { __name: "SearchBar", props: { onSimilarSearch: { type: Function, @@ -26418,7 +26193,7 @@ var ey = { } }, emits: ["similar", "search-change"], setup(e, { expose: t, emit: n }) { - let i = e, a = n, o = $g(), s = K(null), c = K(null), l = K(null), u = K(null), d = K(null), f = Be("mjr-search-autocomplete-", 8), p = (e) => e?.$el || e || null, m = () => p(c.value), h = K(!1), g = K(!0), _ = X(() => h.value ? r("search.semanticPlaceholder", "Describe what you're looking for...") : r("search.placeholder", "Search assets...")), v = X(() => h.value ? $t(r("search.semanticTitle", "AI semantic search — describe your image in natural language"), oy) : $t(r("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), oy)), y = X(() => h.value ? { + let r = e, i = n, a = Ut(), o = J(null), s = J(null), c = J(null), l = J(null), u = J(null), d = Pe("mjr-search-autocomplete-", 8), f = (e) => e?.$el || e || null, p = () => f(s.value), m = J(!1), h = J(!0), g = Z(() => m.value ? R("search.semanticPlaceholder", "Describe what you're looking for...") : R("search.placeholder", "Search assets...")), _ = Z(() => m.value ? $t(R("search.semanticTitle", "AI semantic search — describe your image in natural language"), Qv) : $t(R("search.title", "Search by filename, tags, or attributes (e.g. rating:5, ext:png)"), Qv)), v = Z(() => m.value ? { background: "rgba(0, 188, 212, 0.2)", borderColor: "rgba(0, 188, 212, 0.6)", color: "#00BCD4", @@ -26428,123 +26203,123 @@ var ey = { borderColor: "rgba(0, 188, 212, 0.25)", color: "rgba(0, 188, 212, 0.5)", boxShadow: "none" - }), b = () => { + }), y = () => { try { - let e = m(); + let e = p(); if (!e) return; - e.dataset.mjrSemanticMode = h.value ? "1" : "0"; + e.dataset.mjrSemanticMode = m.value ? "1" : "0"; } catch (e) { console.debug?.(e); } - }, x = (e = {}) => { - a("search-change", { - query: m()?.value || "", - semantic: h.value, + }, b = (e = {}) => { + i("search-change", { + query: p()?.value || "", + semantic: m.value, ...e }); - }, S = () => { - if (g.value) { - h.value = !h.value, b(); + }, x = () => { + if (h.value) { + m.value = !m.value, y(); try { - m()?.dispatchEvent?.(new Event("input", { bubbles: !0 })); + p()?.dispatchEvent?.(new Event("input", { bubbles: !0 })); } catch (e) { console.debug?.(e); } - x({ semantic: h.value }); + b({ semantic: m.value }); } - }, C = async (e) => { + }, S = async (e) => { let t = e.target.value || ""; - o.searchQuery = t, b(), x({ query: t }), await w(); - }, w = pt(async () => { - let e = (m()?.value || "").trim(); - if (!(h.value || e.length < 2 || e.includes(":"))) try { - let t = await P("/mjr/am/autocomplete", { + a.searchQuery = t, y(), b({ query: t }), await C(); + }, C = Et(async () => { + let e = (p()?.value || "").trim(); + if (!(m.value || e.length < 2 || e.includes(":"))) try { + let t = await ne("/mjr/am/autocomplete", { q: e, limit: 10 }); - t && t.ok && Array.isArray(t.data) && (l.value.innerHTML = "", t.data.forEach((e) => { + t && t.ok && Array.isArray(t.data) && (c.value.innerHTML = "", t.data.forEach((e) => { let t = document.createElement("option"); - t.value = e, l.value.appendChild(t); + t.value = e, c.value.appendChild(t); })); } catch {} - }, 300), T = () => { - a("similar"), i.onSimilarSearch?.(); + }, 300), w = () => { + i("similar"), r.onSimilarSearch?.(); }; - return mn(() => o.searchQuery, (e) => { - let t = m(); + return mn(() => a.searchQuery, (e) => { + let t = p(); t && t.value !== e && (t.value = e); - }), mn(g, (e) => { - !e && h.value && (h.value = !1), b(); - }), mn(h, () => { - b(); + }), mn(h, (e) => { + !e && m.value && (m.value = !1), y(); + }), mn(m, () => { + y(); }), bn(() => { try { - let e = m(); - e && (e.value = o.searchQuery || ""); + let e = p(); + e && (e.value = a.searchQuery || ""); } catch (e) { console.debug?.(e); } - b(); + y(); }), t({ get searchSection() { - return s.value; + return o.value; }, get searchInputEl() { - return m(); + return p(); }, get similarBtn() { - return p(u.value); + return f(l.value); }, get semanticBtn() { - return p(d.value); + return f(u.value); }, setSemanticEnabled: (e) => { - g.value = !!e, b(); + h.value = !!e, y(); } }), (e, t) => { - let n = Ln("MInputText"), i = Ln("MButton"); - return H(), G("div", { + let n = Rn("MInputText"), r = Rn("MButton"); + return W(), q("div", { ref_key: "searchSectionRef", - ref: s, + ref: o, class: "mjr-am-search" - }, [W("div", ty, [ - t[0] ||= W("span", { class: "mjr-am-search-icon" }, [W("i", { class: "pi pi-search" })], -1), - V(n, { + }, [K("div", qv, [ + t[0] ||= K("span", { class: "mjr-am-search-icon" }, [K("i", { class: "pi pi-search" })], -1), + U(n, { ref_key: "searchInputRef", - ref: c, + ref: s, id: "mjr-search-input", class: "mjr-input", type: "text", - placeholder: _.value, - title: v.value, - list: J(f), - onInput: C + placeholder: g.value, + title: _.value, + list: X(d), + onInput: S }, null, 8, [ "placeholder", "title", "list" ]), - W("datalist", { + K("datalist", { ref_key: "dataListRef", - ref: l, - id: J(f) - }, null, 8, ny) - ]), W("div", ry, [ - W("div", iy, [V(i, { + ref: c, + id: X(d) + }, null, 8, Jv) + ]), K("div", Yv, [ + K("div", Xv, [U(r, { ref_key: "semanticBtnRef", - ref: d, + ref: u, type: "button", class: "mjr-icon-btn mjr-ai-control", severity: "secondary", text: "", rounded: "", - disabled: !g.value, - "aria-disabled": !g.value, - title: g.value ? J(r)("search.semanticToggle", "Toggle AI semantic search (CLIP-based)") : J(r)("search.semanticDisabled", "AI semantic search is disabled in settings"), - style: An(y.value), - onClick: S + disabled: !h.value, + "aria-disabled": !h.value, + title: h.value ? X(R)("search.semanticToggle", "Toggle AI semantic search (CLIP-based)") : X(R)("search.semanticDisabled", "AI semantic search is disabled in settings"), + style: An(v.value), + onClick: x }, { - default: U(() => [...t[1] ||= [W("i", { class: "pi pi-sparkles" }, null, -1)]]), + default: G(() => [...t[1] ||= [K("i", { class: "pi pi-sparkles" }, null, -1)]]), _: 1 }, 8, [ "disabled", @@ -26552,18 +26327,18 @@ var ey = { "title", "style" ])]), - W("div", ay, [V(i, { + K("div", Zv, [U(r, { ref_key: "similarBtnRef", - ref: u, + ref: l, type: "button", class: "mjr-icon-btn mjr-ai-control", severity: "secondary", text: "", rounded: "", - title: J(r)("search.findSimilar", "Find Similar"), - onClick: T + title: X(R)("search.findSimilar", "Find Similar"), + onClick: w }, { - default: U(() => [...t[2] ||= [W("i", { class: "pi pi-clone" }, null, -1)]]), + default: G(() => [...t[2] ||= [K("i", { class: "pi pi-clone" }, null, -1)]]), _: 1 }, 8, ["title"])]), wn(e.$slots, "filter-anchor"), @@ -26573,68 +26348,68 @@ var ey = { ])], 512); }; } -}, cy = { +}, ey = { class: "mjr-popover mjr-sort-popover", style: { display: "none" } -}, ly = { class: "mjr-menu-item-label" }, uy = { +}, ty = { class: "mjr-menu-item-label" }, ny = { __name: "SortPopover", setup(e) { - let t = $g(), n = X(() => t.sort || "mtime_desc"), i = (e) => { + let t = Ut(), n = Z(() => t.sort || "mtime_desc"), r = (e) => { t.sort = e; try { window.dispatchEvent(new CustomEvent("mjr:sort-changed", { detail: { sort: e } })); } catch (e) { console.debug?.(e); } - }, a = X(() => [ + }, i = Z(() => [ { key: "mtime_desc", - label: r("sort.newest"), + label: R("sort.newest"), icon: "pi pi-sort-amount-down" }, { key: "mtime_asc", - label: r("sort.oldest"), + label: R("sort.oldest"), icon: "pi pi-sort-amount-up-alt" }, { key: "name_asc", - label: r("sort.nameAZ"), + label: R("sort.nameAZ"), icon: "pi pi-sort-alpha-down" }, { key: "name_desc", - label: r("sort.nameZA"), + label: R("sort.nameZA"), icon: "pi pi-sort-alpha-up" }, { key: "rating_desc", - label: r("sort.ratingHigh"), + label: R("sort.ratingHigh"), icon: "pi pi-star-fill" }, { key: "size_desc", - label: r("sort.sizeDesc"), + label: R("sort.sizeDesc"), icon: "pi pi-sort-numeric-down-alt" }, { key: "size_asc", - label: r("sort.sizeAsc"), + label: R("sort.sizeAsc"), icon: "pi pi-sort-numeric-up-alt" } ].map((e) => ({ ...e, class: { "is-active": n.value === e.key }, - command: () => i(e.key) + command: () => r(e.key) }))); return (e, t) => { - let r = Ln("MMenu"); - return H(), G("div", cy, [V(r, { - model: a.value, + let r = Rn("MMenu"); + return W(), q("div", ey, [U(r, { + model: i.value, class: "mjr-menu mjr-prime-menu mjr-sort-menu", pt: { list: { class: "mjr-menu mjr-prime-menu-list" } } }, { - item: U(({ item: e }) => [W("div", { class: Mn(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [W("span", ly, q(e.label), 1), W("i", { + item: G(({ item: e }) => [K("div", { class: Mn(["mjr-menu-item", { "is-active": n.value === e.key }]) }, [K("span", ty, Y(e.label), 1), K("i", { class: Mn([e.icon, "mjr-menu-item-check"]), style: An({ opacity: +(n.value === e.key) }) }, null, 6)], 2)]), @@ -26642,52 +26417,52 @@ var ey = { }, 8, ["model"])]); }; } -}, dy = { +}, ry = { class: "mjr-popover mjr-filter-popover", style: { display: "none" } -}, fy = { class: "mjr-filter-group-title" }, py = { +}, iy = { class: "mjr-filter-head" }, ay = { class: "mjr-filter-head-left" }, oy = { class: "mjr-filter-kicker" }, sy = { class: "mjr-filter-subtitle" }, cy = { class: "mjr-filter-head-actions" }, ly = { class: "mjr-filter-active-count" }, uy = { class: "mjr-filter-group-title" }, dy = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, my = { class: "mjr-filter-group-body" }, hy = { class: "mjr-popover-row" }, gy = { class: "mjr-popover-label" }, _y = { class: "mjr-popover-row" }, vy = { class: "mjr-popover-label" }, yy = ["title"], by = { class: "mjr-popover-row" }, xy = { class: "mjr-popover-label" }, Sy = { class: "mjr-popover-row" }, Cy = { class: "mjr-popover-label" }, wy = { class: "mjr-filter-group-title" }, Ty = { +}, fy = { class: "mjr-filter-group-body" }, py = { class: "mjr-filter-card" }, my = { class: "mjr-popover-row" }, hy = { class: "mjr-popover-label" }, gy = { class: "mjr-popover-row" }, _y = { class: "mjr-popover-label" }, vy = ["title"], yy = { class: "mjr-filter-card" }, by = { class: "mjr-popover-row" }, xy = { class: "mjr-popover-label" }, Sy = { class: "mjr-popover-row" }, Cy = { class: "mjr-popover-label" }, wy = { class: "mjr-popover-row" }, Ty = { class: "mjr-popover-label" }, Ey = { class: "mjr-filter-group-title" }, Dy = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Ey = { class: "mjr-filter-group-body" }, Dy = { class: "mjr-popover-row mjr-popover-row--3col" }, Oy = { class: "mjr-popover-label" }, ky = { class: "mjr-popover-row" }, Ay = { class: "mjr-popover-label" }, jy = { class: "mjr-popover-row mjr-popover-row--3col" }, My = { class: "mjr-popover-label" }, Ny = { class: "mjr-popover-row mjr-popover-row--3col" }, Py = { class: "mjr-popover-label" }, Fy = { class: "mjr-filter-group-title" }, Iy = { +}, Oy = { class: "mjr-filter-group-body" }, ky = { class: "mjr-filter-card" }, Ay = { class: "mjr-popover-row mjr-popover-row--3col" }, jy = { class: "mjr-popover-label" }, My = { class: "mjr-popover-row" }, Ny = { class: "mjr-popover-label" }, Py = { class: "mjr-popover-row mjr-popover-row--3col" }, Fy = { class: "mjr-popover-label" }, Iy = { class: "mjr-popover-row mjr-popover-row--3col" }, Ly = { class: "mjr-popover-label" }, Ry = { class: "mjr-filter-group-title" }, zy = { class: "mjr-filter-group-chevron", "aria-hidden": "true" -}, Ly = { class: "mjr-filter-group-body" }, Ry = { class: "mjr-popover-row" }, zy = { class: "mjr-popover-label" }, By = { class: "mjr-popover-row" }, Vy = { class: "mjr-popover-label" }, Hy = /* @__PURE__ */ Il({ +}, By = { class: "mjr-filter-group-body" }, Vy = { class: "mjr-filter-card mjr-filter-card--agenda" }, Hy = { class: "mjr-popover-row" }, Uy = { class: "mjr-popover-label" }, Wy = { class: "mjr-popover-row" }, Gy = { class: "mjr-popover-label" }, Ky = /* @__PURE__ */ Rl({ __name: "FilterPopover", setup(e, { expose: t }) { - let n = $g(), i = K(null), a = K(null), o = K(null), s = K(null), c = K(null), l = K(null), u = K(null), d = K(null), f = (e) => e?.$el || e || null, p = (e) => f(e.value)?.value || "", m = (e, t) => { + let n = Ut(), r = J(null), i = J(null), a = J(null), o = J(null), s = J(null), c = J(null), l = J(null), u = J(null), d = J(null), f = (e) => e?.$el || e || null, p = (e) => f(e.value)?.value || "", m = (e, t) => { let n = f(e.value); n && (n.value = String(t ?? "")); - }, h = K({ + }, h = J({ core: !0, media: !1, time: !0 - }), g = X(() => [ + }), g = Z(() => [ { - label: r("filter.all"), + label: R("filter.all"), value: "" }, { - label: r("filter.images", "Images"), + label: R("filter.images", "Images"), value: "image" }, { - label: r("filter.videos", "Videos"), + label: R("filter.videos", "Videos"), value: "video" }, { - label: r("filter.audio", "Audio"), + label: R("filter.audio", "Audio"), value: "audio" }, { label: "3D", value: "model3d" } - ]), _ = X(() => [ + ]), _ = Z(() => [ { - label: r("filter.any", "Any"), + label: R("filter.any", "Any"), value: "" }, { @@ -26730,9 +26505,9 @@ var ey = { label: "A2A (Audio to Audio)", value: "A2A" } - ]), v = X(() => [ + ]), v = Z(() => [ { - label: r("filter.anyRating"), + label: R("filter.anyRating"), value: "0" }, { @@ -26755,9 +26530,9 @@ var ey = { label: "★ 5", value: "5" } - ]), y = X(() => [ + ]), y = Z(() => [ { - label: r("filter.any", "Any"), + label: R("filter.any", "Any"), value: "" }, { @@ -26776,27 +26551,27 @@ var ey = { label: "4K (3840×2160)", value: "uhd" } - ]), b = X(() => [ + ]), b = Z(() => [ { - label: r("filter.anytime"), + label: R("filter.anytime"), value: "" }, { - label: r("filter.today"), + label: R("filter.today"), value: "today" }, { - label: r("filter.thisWeek"), + label: R("filter.thisWeek"), value: "this_week" }, { - label: r("filter.thisMonth"), + label: R("filter.thisMonth"), value: "this_month" } - ]), x = X(() => { + ]), x = Z(() => { let e = Number(n.minWidth || 0) || 0, t = Number(n.minHeight || 0) || 0; return e >= 3840 && t >= 2160 ? "uhd" : e >= 2560 && t >= 1440 ? "qhd" : e >= 1920 && t >= 1080 ? "fhd" : e >= 1280 && t >= 720 ? "hd" : ""; - }), S = X(() => { + }), S = Z(() => { let e = String(n.dateExactFilter || "").trim().length > 0; return { "mjr-agenda-filled": e, @@ -26820,32 +26595,34 @@ var ey = { }, D = (e, { emit: t = !0 } = {}) => { n.workflowType = String(e || "").trim().toUpperCase(), t && w(); }, O = (e, { emit: t = !0 } = {}) => { + n.workflowId = String(e || "").trim(), t && w(); + }, k = (e, { emit: t = !0 } = {}) => { n.minRating = Number(e || 0) || 0, t && w(); - }, k = () => { - let e = C(p(i) || 0), t = C(p(a) || 0); - t > 0 && e > 0 && t < e && (t = e, m(a, t)), n.minSizeMB = e > 0 ? e : 0, n.maxSizeMB = t > 0 ? t : 0, w(); }, A = () => { - let e = Math.max(0, Math.round(C(p(o) || 0))), t = Math.max(0, Math.round(C(p(s) || 0))), r = Math.max(0, Math.round(C(p(c) || 0))), i = Math.max(0, Math.round(C(p(l) || 0))); - r > 0 && e > 0 && r < e && (r = e, m(c, r)), i > 0 && t > 0 && i < t && (i = t, m(l, i)), n.minWidth = e, n.minHeight = t, n.maxWidth = r, n.maxHeight = i, w(); - }, j = (e, { emit: t = !0 } = {}) => { + let e = C(p(r) || 0), t = C(p(i) || 0); + t > 0 && e > 0 && t < e && (t = e, m(i, t)), n.minSizeMB = e > 0 ? e : 0, n.maxSizeMB = t > 0 ? t : 0, w(); + }, j = () => { + let e = Math.max(0, Math.round(C(p(a) || 0))), t = Math.max(0, Math.round(C(p(o) || 0))), r = Math.max(0, Math.round(C(p(s) || 0))), i = Math.max(0, Math.round(C(p(c) || 0))); + r > 0 && e > 0 && r < e && (r = e, m(s, r)), i > 0 && t > 0 && i < t && (i = t, m(c, i)), n.minWidth = e, n.minHeight = t, n.maxWidth = r, n.maxHeight = i, w(); + }, M = (e, { emit: t = !0 } = {}) => { let [r, i] = { hd: [1280, 720], fhd: [1920, 1080], qhd: [2560, 1440], uhd: [3840, 2160] }[String(e || "").trim()] || [0, 0]; - n.minWidth = Number(r || 0), n.minHeight = Number(i || 0), n.maxWidth = 0, n.maxHeight = 0, m(o, n.minWidth || ""), m(s, n.minHeight || ""), m(c, ""), m(l, ""), t && w(); - }, M = (e, { emit: t = !0 } = {}) => { - n.dateRangeFilter = String(e || ""), n.dateRangeFilter && n.dateExactFilter && (n.dateExactFilter = "", m(d, "")), t && w(); - }, N = (e) => { - n.dateExactFilter = String(e?.target?.value || "").trim(), w(); + n.minWidth = Number(r || 0), n.minHeight = Number(i || 0), n.maxWidth = 0, n.maxHeight = 0, m(a, n.minWidth || ""), m(o, n.minHeight || ""), m(s, ""), m(c, ""), t && w(); + }, N = (e, { emit: t = !0 } = {}) => { + n.dateRangeFilter = String(e || ""), n.dateRangeFilter && n.dateExactFilter && (n.dateExactFilter = "", m(u, "")), t && w(); }, P = (e) => { + n.dateExactFilter = String(e?.target?.value || "").trim(), n.dateExactFilter && n.dateRangeFilter && (n.dateRangeFilter = ""), w(); + }, F = (e) => { let t = String(e || "").trim().toLowerCase(); !t || !(t in h.value) || (h.value = { ...h.value, [t]: !h.value[t] }); - }, F = (e) => !!h.value[String(e || "").trim().toLowerCase()], ee = ({ getValue: e, setValue: t }) => ({ + }, I = (e) => !!h.value[String(e || "").trim().toLowerCase()], ee = ({ getValue: e, setValue: t }) => ({ get value() { return e(); }, @@ -26879,15 +26656,23 @@ var ey = { getValue: () => String(n.workflowType || "").trim().toUpperCase(), setValue: D }), ae = ee({ - getValue: () => String(Number(n.minRating || 0) || 0), + getValue: () => String(n.workflowId || "").trim(), setValue: O }), oe = ee({ - getValue: () => x.value, - setValue: j + getValue: () => String(Number(n.minRating || 0) || 0), + setValue: k }), se = ee({ - getValue: () => String(n.dateRangeFilter || ""), + getValue: () => x.value, setValue: M - }); + }), ce = ee({ + getValue: () => String(n.dateRangeFilter || ""), + setValue: N + }), le = Z(() => { + let e = 0; + return String(n.kindFilter || "").trim() && (e += 1), n.workflowOnly && (e += 1), String(n.workflowType || "").trim() && (e += 1), String(n.workflowId || "").trim() && (e += 1), (Number(n.minRating || 0) || 0) > 0 && (e += 1), ((Number(n.minSizeMB || 0) || 0) > 0 || (Number(n.maxSizeMB || 0) || 0) > 0) && (e += 1), ((Number(n.minWidth || 0) || 0) > 0 || (Number(n.minHeight || 0) || 0) > 0 || (Number(n.maxWidth || 0) || 0) > 0 || (Number(n.maxHeight || 0) || 0) > 0) && (e += 1), String(n.dateRangeFilter || "").trim() && (e += 1), String(n.dateExactFilter || "").trim() && (e += 1), e; + }), ue = () => { + n.kindFilter = "", n.workflowOnly = !1, n.workflowType = "", n.workflowId = "", n.minRating = 0, n.minSizeMB = 0, n.maxSizeMB = 0, n.minWidth = 0, n.minHeight = 0, n.maxWidth = 0, n.maxHeight = 0, n.dateRangeFilter = "", n.dateExactFilter = "", m(r, ""), m(i, ""), m(a, ""), m(o, ""), m(s, ""), m(c, ""), m(u, ""), m(d, ""), w(); + }; return t({ get kindSelect() { return ne; @@ -26898,256 +26683,282 @@ var ey = { get workflowTypeSelect() { return ie; }, - get ratingSelect() { + get workflowIdInput() { return ae; }, - get minSizeInput() { - return f(i.value); - }, - get maxSizeInput() { - return f(a.value); - }, - get resolutionPresetSelect() { + get ratingSelect() { return oe; }, - get minWidthInput() { - return f(o.value); + get minSizeInput() { + return f(r.value); }, - get minHeightInput() { - return f(s.value); + get maxSizeInput() { + return f(i.value); }, - get maxWidthInput() { - return f(c.value); - }, - get maxHeightInput() { - return f(l.value); - }, - get dateRangeSelect() { + get resolutionPresetSelect() { return se; }, + get minWidthInput() { + return f(a.value); + }, + get minHeightInput() { + return f(o.value); + }, + get maxWidthInput() { + return f(s.value); + }, + get maxHeightInput() { + return f(c.value); + }, + get dateRangeSelect() { + return ce; + }, get dateExactInput() { - return f(d.value); + return f(u.value); }, get agendaContainer() { - return u.value; + return l.value; } }), (e, t) => { - let f = Ln("MButton"), p = Ln("MSelect"), m = Ln("MCheckbox"), h = Ln("MInputText"); - return H(), G("div", dy, [ - W("div", { class: Mn(["mjr-filter-group mjr-filter-group--core", { "is-open": F("core") }]) }, [V(f, { + let f = Rn("MButton"), p = Rn("MSelect"), m = Rn("MCheckbox"), h = Rn("MInputText"); + return W(), q("div", ry, [ + K("div", iy, [K("div", ay, [K("div", oy, Y(X(R)("label.filters", "Filters")), 1), K("div", sy, Y(X(R)("label.refineResults", "Refine your results")), 1)]), K("div", cy, [K("span", ly, Y(le.value), 1), U(f, { + type: "button", + class: "mjr-filter-clear-all", + severity: "secondary", + text: "", + disabled: le.value === 0, + onClick: ue + }, { + default: G(() => [gn(Y(X(R)("action.clearAll", "Clear all")), 1)]), + _: 1 + }, 8, ["disabled"])])]), + K("div", { class: Mn(["mjr-filter-group mjr-filter-group--core", { "is-open": I("core") }]) }, [U(f, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", text: "", - "aria-expanded": String(F("core")), - onClick: t[0] ||= (e) => P("core") + "aria-expanded": String(I("core")), + onClick: t[0] ||= (e) => F("core") }, { - default: U(() => [W("span", fy, q(J(r)("group.core", "Core")), 1), W("span", py, q(F("core") ? "▾" : "▸"), 1)]), + default: G(() => [K("span", uy, Y(X(R)("group.core", "Core")), 1), K("span", dy, Y(I("core") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), Tn(W("div", my, [ - W("div", hy, [W("div", gy, q(J(r)("label.type")), 1), V(p, { + }, 8, ["aria-expanded"]), Tn(K("div", fy, [K("div", py, [K("div", my, [K("div", hy, Y(X(R)("label.type")), 1), U(p, { + class: "mjr-select mjr-filter-select", + "panel-class": "mjr-filter-select-panel", + title: X(R)("tooltip.filterByFileType", "Filter by file type"), + "model-value": String(X(n).kindFilter || ""), + options: g.value, + "option-label": "label", + "option-value": "value", + "onUpdate:modelValue": T + }, null, 8, [ + "title", + "model-value", + "options" + ])]), K("div", gy, [K("div", _y, Y(X(R)("label.workflow")), 1), K("label", { + class: "mjr-popover-toggle", + title: X(R)("tooltip.filterWorkflowOnly", "Show only assets with embedded workflow data") + }, [U(m, { + class: "mjr-checkbox", + "model-value": !!X(n).workflowOnly, + binary: "", + "onUpdate:modelValue": E + }, null, 8, ["model-value"]), K("span", null, Y(X(R)("filter.onlyWithWorkflow")), 1)], 8, vy)])]), K("div", yy, [ + K("div", by, [K("div", xy, Y(X(R)("label.workflowType", "Workflow type")), 1), U(p, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", - title: J(r)("tooltip.filterByFileType", "Filter by file type"), - "model-value": String(J(n).kindFilter || ""), - options: g.value, - "option-label": "label", - "option-value": "value", - "onUpdate:modelValue": T - }, null, 8, [ - "title", - "model-value", - "options" - ])]), - W("div", _y, [W("div", vy, q(J(r)("label.workflow")), 1), W("label", { - class: "mjr-popover-toggle", - title: J(r)("tooltip.filterWorkflowOnly", "Show only assets with embedded workflow data") - }, [V(m, { - class: "mjr-checkbox", - "model-value": !!J(n).workflowOnly, - binary: "", - "onUpdate:modelValue": E - }, null, 8, ["model-value"]), W("span", null, q(J(r)("filter.onlyWithWorkflow")), 1)], 8, yy)]), - W("div", by, [W("div", xy, q(J(r)("label.workflowType", "Workflow type")), 1), V(p, { - class: "mjr-select mjr-filter-select", - "panel-class": "mjr-filter-select-panel", - "model-value": String(J(n).workflowType || "").trim().toUpperCase(), + "model-value": String(X(n).workflowType || "").trim().toUpperCase(), options: _.value, "option-label": "label", "option-value": "value", "onUpdate:modelValue": D }, null, 8, ["model-value", "options"])]), - W("div", Sy, [W("div", Cy, q(J(r)("label.rating")), 1), V(p, { + K("div", Sy, [K("div", Cy, Y(X(R)("label.sameWorkflow", "Generated with Same Workflow")), 1), U(h, { + ref_key: "workflowIdInputRef", + ref: d, + class: "mjr-input", + title: X(R)("tooltip.filterWorkflowId", "Filter assets generated from the same embedded workflow id"), + placeholder: X(R)("placeholder.workflowId", "Workflow ID"), + "model-value": String(X(n).workflowId || ""), + "onUpdate:modelValue": O, + onChange: t[1] ||= (e) => O(e?.target?.value) + }, null, 8, [ + "title", + "placeholder", + "model-value" + ])]), + K("div", wy, [K("div", Ty, Y(X(R)("label.rating")), 1), U(p, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", - title: J(r)("tooltip.filterMinRating", "Filter by minimum rating"), - "model-value": String(Number(J(n).minRating || 0) || 0), + title: X(R)("tooltip.filterMinRating", "Filter by minimum rating"), + "model-value": String(Number(X(n).minRating || 0) || 0), options: v.value, "option-label": "label", "option-value": "value", - "onUpdate:modelValue": O + "onUpdate:modelValue": k }, null, 8, [ "title", "model-value", "options" ])]) - ], 512), [[kn, F("core")]])], 2), - W("div", { class: Mn(["mjr-filter-group mjr-filter-group--media", { "is-open": F("media") }]) }, [V(f, { + ])], 512), [[kn, I("core")]])], 2), + K("div", { class: Mn(["mjr-filter-group mjr-filter-group--media", { "is-open": I("media") }]) }, [U(f, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", text: "", - "aria-expanded": String(F("media")), - onClick: t[1] ||= (e) => P("media") + "aria-expanded": String(I("media")), + onClick: t[2] ||= (e) => F("media") }, { - default: U(() => [W("span", wy, q(J(r)("group.media", "Media")), 1), W("span", Ty, q(F("media") ? "▾" : "▸"), 1)]), + default: G(() => [K("span", Ey, Y(X(R)("group.media", "Media")), 1), K("span", Dy, Y(I("media") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), Tn(W("div", Ey, [ - W("div", Dy, [ - W("div", Oy, q(J(r)("label.fileSizeMB", "File size (MB)")), 1), - V(h, { + }, 8, ["aria-expanded"]), Tn(K("div", Oy, [K("div", ky, [ + K("div", Ay, [ + K("div", jy, Y(X(R)("label.fileSizeMB", "File size (MB)")), 1), + U(h, { ref_key: "minSizeInputRef", + ref: r, + type: "number", + min: "0", + step: "0.1", + class: "mjr-input", + placeholder: X(R)("label.min", "Min"), + value: X(n).minSizeMB || "", + onChange: A + }, null, 8, ["placeholder", "value"]), + U(h, { + ref_key: "maxSizeInputRef", ref: i, type: "number", min: "0", step: "0.1", class: "mjr-input", - placeholder: J(r)("label.min", "Min"), - value: J(n).minSizeMB || "", - onChange: k - }, null, 8, ["placeholder", "value"]), - V(h, { - ref_key: "maxSizeInputRef", - ref: a, - type: "number", - min: "0", - step: "0.1", - class: "mjr-input", - placeholder: J(r)("label.max", "Max"), - value: J(n).maxSizeMB || "", - onChange: k + placeholder: X(R)("label.max", "Max"), + value: X(n).maxSizeMB || "", + onChange: A }, null, 8, ["placeholder", "value"]) ]), - W("div", ky, [W("div", Ay, q(J(r)("label.resolutionPx", "Resolution (px)")), 1), V(p, { + K("div", My, [K("div", Ny, Y(X(R)("label.resolutionPx", "Resolution (px)")), 1), U(p, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", "model-value": x.value, options: y.value, "option-label": "label", "option-value": "value", - "onUpdate:modelValue": j + "onUpdate:modelValue": M }, null, 8, ["model-value", "options"])]), - W("div", jy, [ - W("div", My, q(J(r)("label.resolutionMinWxH", "Min WxH (px)")), 1), - V(h, { + K("div", Py, [ + K("div", Fy, Y(X(R)("label.resolutionMinWxH", "Min WxH (px)")), 1), + U(h, { ref_key: "minWidthInputRef", - ref: o, + ref: a, type: "number", min: "0", step: "1", class: "mjr-input", - placeholder: J(r)("label.widthPx", "W (px)"), - title: J(r)("tooltip.widthPx", "Minimum width in pixels"), - value: J(n).minWidth || "", - onChange: A + placeholder: X(R)("label.widthPx", "W (px)"), + title: X(R)("tooltip.widthPx", "Minimum width in pixels"), + value: X(n).minWidth || "", + onChange: j }, null, 8, [ "placeholder", "title", "value" ]), - V(h, { + U(h, { ref_key: "minHeightInputRef", - ref: s, + ref: o, type: "number", min: "0", step: "1", class: "mjr-input", - placeholder: J(r)("label.heightPx", "H (px)"), - title: J(r)("tooltip.heightPx", "Minimum height in pixels"), - value: J(n).minHeight || "", - onChange: A + placeholder: X(R)("label.heightPx", "H (px)"), + title: X(R)("tooltip.heightPx", "Minimum height in pixels"), + value: X(n).minHeight || "", + onChange: j }, null, 8, [ "placeholder", "title", "value" ]) ]), - W("div", Ny, [ - W("div", Py, q(J(r)("label.resolutionMaxWxH", "Max WxH (px)")), 1), - V(h, { + K("div", Iy, [ + K("div", Ly, Y(X(R)("label.resolutionMaxWxH", "Max WxH (px)")), 1), + U(h, { ref_key: "maxWidthInputRef", - ref: c, + ref: s, type: "number", min: "0", step: "1", class: "mjr-input", - placeholder: J(r)("label.widthPx", "W (px)"), - title: J(r)("tooltip.widthPx", "Maximum width in pixels"), - value: J(n).maxWidth || "", - onChange: A + placeholder: X(R)("label.widthPx", "W (px)"), + title: X(R)("tooltip.widthPx", "Maximum width in pixels"), + value: X(n).maxWidth || "", + onChange: j }, null, 8, [ "placeholder", "title", "value" ]), - V(h, { + U(h, { ref_key: "maxHeightInputRef", - ref: l, + ref: c, type: "number", min: "0", step: "1", class: "mjr-input", - placeholder: J(r)("label.heightPx", "H (px)"), - title: J(r)("tooltip.heightPx", "Maximum height in pixels"), - value: J(n).maxHeight || "", - onChange: A + placeholder: X(R)("label.heightPx", "H (px)"), + title: X(R)("tooltip.heightPx", "Maximum height in pixels"), + value: X(n).maxHeight || "", + onChange: j }, null, 8, [ "placeholder", "title", "value" ]) ]) - ], 512), [[kn, F("media")]])], 2), - W("div", { class: Mn(["mjr-filter-group mjr-filter-group--time", { "is-open": F("time") }]) }, [V(f, { + ])], 512), [[kn, I("media")]])], 2), + K("div", { class: Mn(["mjr-filter-group mjr-filter-group--time", { "is-open": I("time") }]) }, [U(f, { type: "button", class: "mjr-filter-group-toggle", severity: "secondary", text: "", - "aria-expanded": String(F("time")), - onClick: t[2] ||= (e) => P("time") + "aria-expanded": String(I("time")), + onClick: t[3] ||= (e) => F("time") }, { - default: U(() => [W("span", Fy, q(J(r)("group.time", "Time")), 1), W("span", Iy, q(F("time") ? "▾" : "▸"), 1)]), + default: G(() => [K("span", Ry, Y(X(R)("group.time", "Time")), 1), K("span", zy, Y(I("time") ? "▾" : "▸"), 1)]), _: 1 - }, 8, ["aria-expanded"]), Tn(W("div", Ly, [W("div", Ry, [W("div", zy, q(J(r)("label.dateRange")), 1), V(p, { + }, 8, ["aria-expanded"]), Tn(K("div", By, [K("div", Vy, [K("div", Hy, [K("div", Uy, Y(X(R)("label.dateRange")), 1), U(p, { class: "mjr-select mjr-filter-select", "panel-class": "mjr-filter-select-panel", - title: J(r)("tooltip.filterByDateRange", "Filter by date range"), - "model-value": String(J(n).dateRangeFilter || ""), + title: X(R)("tooltip.filterByDateRange", "Filter by date range"), + "model-value": String(X(n).dateRangeFilter || ""), options: b.value, "option-label": "label", "option-value": "value", - "onUpdate:modelValue": M + "onUpdate:modelValue": N }, null, 8, [ "title", "model-value", "options" - ])]), W("div", By, [W("div", Vy, q(J(r)("label.agenda")), 1), W("div", { + ])]), K("div", Wy, [K("div", Gy, Y(X(R)("label.agenda")), 1), K("div", { ref_key: "agendaContainerRef", - ref: u, + ref: l, class: "mjr-agenda-container" - }, [V(h, { + }, [U(h, { ref_key: "dateExactInputRef", - ref: d, + ref: u, type: "date", class: Mn(["mjr-input mjr-agenda-input", S.value]), style: { display: "none" }, - value: J(n).dateExactFilter, - onChange: N - }, null, 8, ["class", "value"])], 512)])], 512), [[kn, F("time")]])], 2) + value: X(n).dateExactFilter, + onChange: P + }, null, 8, ["class", "value"])], 512)])])], 512), [[kn, I("time")]])], 2) ]); }; } -}, [["__scopeId", "data-v-fee77a92"]]), Uy = 128, Wy = Object.freeze([ +}, [["__scopeId", "data-v-5ab0b6db"]]), qy = 128, Jy = Object.freeze([ { key: "portraits", label: "Portraits", @@ -27185,10 +26996,10 @@ var ey = { iconClass: "pi pi-circle" } ]); -function Gy(e) { +function Yy(e) { try { let t = String(e ?? "").trim(); - if (!t || t.length > Uy || t.includes("\0")) return ""; + if (!t || t.length > qy || t.includes("\0")) return ""; for (let e = 0; e < t.length; e += 1) { let n = t.charCodeAt(e); if (n <= 31 || n === 127) return ""; @@ -27198,7 +27009,7 @@ function Gy(e) { return ""; } } -function Ky(e) { +function Xy(e) { if (!e || typeof e != "object") return null; let t = String(e.filepath || "").trim(); return t ? { @@ -27210,10 +27021,10 @@ function Ky(e) { root_id: String(e.root_id || e.rootId || e.custom_root_id || "").trim() || void 0 } : null; } -function qy(e) { +function Zy(e) { let t = [], n = [], r = /* @__PURE__ */ new Set(); for (let i of Array.isArray(e) ? e : []) { - let e = Ky(i); + let e = Xy(i); if (e?.filepath) { let n = e.filepath.toLowerCase(); if (r.has(n)) continue; @@ -27228,24 +27039,24 @@ function qy(e) { missingIds: n }; } -async function Jy(e) { +async function Qy(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, data: [] }; - let n = await pe(t); + let n = await ee(t); if (!n?.ok) return { ok: !1, error: String(n?.error || "Failed to fetch assets") }; - let { assets: r } = qy(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); + let { assets: r } = Zy(Array.isArray(n?.data) ? n.data : Array.isArray(n?.data?.assets) ? n.data.assets : []); return { ok: !0, data: r }; } -function Yy(e) { +function $y(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); @@ -27263,44 +27074,44 @@ function Yy(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 Xy() { +function eb() { try { - return !!(Et()?.ai?.vectorSearchEnabled ?? !0); + return !!(pt()?.ai?.vectorSearchEnabled ?? !0); } catch { return !0; } } //#endregion //#region ui/vue/components/panel/CollectionsPopover.vue -var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-item-label" }, $y = { class: "mjr-menu-item-label" }, eb = { class: "mjr-menu-item-right" }, tb = { +var tb = { class: "mjr-menu mjr-collections-menu" }, nb = { class: "mjr-menu-item-label" }, rb = { class: "mjr-menu-item-label" }, ib = { class: "mjr-menu-item-right" }, ab = { key: 0, class: "mjr-menu-item-hint" -}, nb = { +}, ob = { key: 1, class: "mjr-muted" -}, rb = { +}, sb = { key: 2, class: "mjr-state-block is-error" -}, ib = { +}, cb = { key: 3, class: "mjr-muted" -}, ab = { class: "mjr-collection-row" }, ob = { class: "mjr-menu-item-label" }, sb = { class: "mjr-menu-item-right" }, cb = { +}, lb = { class: "mjr-collection-row" }, ub = { class: "mjr-menu-item-label" }, db = { class: "mjr-menu-item-right" }, fb = { key: 0, class: "mjr-menu-item-hint" -}, lb = { class: "mjr-state-block" }, ub = { class: "mjr-section-title mjr-section-title--cyan" }, db = { class: "mjr-section-hint" }, fb = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, pb = { class: "mjr-section-title mjr-section-title--violet" }, mb = { class: "mjr-section-hint" }, hb = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, gb = { +}, pb = { class: "mjr-state-block" }, mb = { class: "mjr-section-title mjr-section-title--cyan" }, hb = { class: "mjr-section-hint" }, gb = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, _b = { class: "mjr-section-title mjr-section-title--violet" }, vb = { class: "mjr-section-hint" }, yb = { class: "mjr-menu-item-label mjr-menu-item-label--icon" }, bb = { key: 0, class: "mjr-state-block is-error" -}, _b = { class: "mjr-cluster-thumbs" }, vb = ["src", "alt"], yb = { class: "mjr-cluster-info" }, bb = ["title"], xb = { class: "mjr-cluster-count" }, Sb = "mjr:collections-changed", Cb = { +}, xb = { class: "mjr-cluster-thumbs" }, Sb = ["src", "alt"], Cb = { class: "mjr-cluster-info" }, wb = ["title"], Tb = { class: "mjr-cluster-count" }, Eb = "mjr:collections-changed", Db = { __name: "CollectionsPopover", setup(e, { expose: t }) { - let n = $g(), i = K(null), c = K([]), l = K(!1), u = K(""), d = K(!1), f = K(!0), p = K(!1), m = K(!1), h = K(!1), g = K([]), _ = K(""), v = K(""), y = 0, b = null, x = !1, C = X(() => String(n.collectionId || "").trim()), w = X(() => String(n.collectionName || "").trim()), T = X(() => !!C.value), E = X(() => !f.value || m.value), D = X(() => f.value && p.value), O = X(() => `${Math.max(1, Math.min(c.value.length, 6)) * 48}px`); + let n = Ut(), r = J(null), i = J([]), a = J(!1), s = J(""), c = J(!1), l = J(!0), u = J(!1), d = J(!1), f = J(!1), h = J([]), g = J(""), _ = J(""), v = 0, y = null, b = !1, S = Z(() => String(n.collectionId || "").trim()), C = Z(() => String(n.collectionName || "").trim()), w = Z(() => !!S.value), E = Z(() => !l.value || d.value), D = Z(() => l.value && u.value), O = Z(() => `${Math.max(1, Math.min(i.value.length, 6)) * 48}px`); function k() { - let e = i.value; + let e = r.value; return !!e && String(e.style.display || "").toLowerCase() !== "none"; } - function A({ collectionId: e = C.value, collectionName: t = w.value, close: n = !0, reload: r = !0 } = {}) { + function M({ collectionId: e = S.value, collectionName: t = C.value, close: n = !0, reload: r = !0 } = {}) { try { - window.dispatchEvent(new CustomEvent(Sb, { detail: { + window.dispatchEvent(new CustomEvent(Eb, { detail: { collectionId: String(e || ""), collectionName: String(t || ""), close: n !== !1, @@ -27310,21 +27121,21 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite console.debug?.(e); } } - function j(e) { + function N(e) { try { - return De(e) || ""; + return Fe(e) || ""; } catch (e) { return console.debug?.(e), ""; } } - async function M() { - if (!Xy()) return { + async function P() { + if (!eb()) return { enabled: !1, vectorAvailable: !1, vectorDisabled: !1 }; try { - let e = await Se(), t = !e?.ok && (String(e?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(e?.error || ""))); + let e = await j(), t = !e?.ok && (String(e?.code || "").toUpperCase() === "SERVICE_UNAVAILABLE" || /vector search is not enabled/i.test(String(e?.error || ""))); return { enabled: !0, vectorAvailable: !!(e?.ok && e?.data?.total > 0), @@ -27338,7 +27149,7 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite }; } } - function N(...e) { + function F(...e) { let t = [], n = /* @__PURE__ */ new Set(); for (let r of e) for (let e of Array.isArray(r) ? r : []) { let r = String(e?.filepath || "").trim().toLowerCase(); @@ -27346,275 +27157,275 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite } return t; } - async function P() { - let e = ++y; - l.value = !0, d.value = !0, u.value = "", _.value = ""; + async function ee() { + let e = ++v; + a.value = !0, c.value = !0, s.value = "", g.value = ""; try { - let [t, n] = await Promise.all([me(), M()]); - if (e !== y) return; - t?.ok ? c.value = Array.isArray(t?.data) ? t.data : [] : (u.value = String(t?.error || r("msg.failedLoadCollections", "Failed to load collections")), c.value = []), f.value = !!n.enabled, p.value = !!n.vectorAvailable, m.value = !!n.vectorDisabled, p.value || (g.value = [], h.value = !1); + let [t, n] = await Promise.all([o(), P()]); + if (e !== v) return; + t?.ok ? i.value = Array.isArray(t?.data) ? t.data : [] : (s.value = String(t?.error || R("msg.failedLoadCollections", "Failed to load collections")), i.value = []), l.value = !!n.enabled, u.value = !!n.vectorAvailable, d.value = !!n.vectorDisabled, u.value || (h.value = [], f.value = !1); } catch (t) { - if (e !== y) return; - console.debug?.(t), u.value = r("msg.failedLoadCollections", "Failed to load collections"), c.value = []; + if (e !== v) return; + console.debug?.(t), s.value = R("msg.failedLoadCollections", "Failed to load collections"), i.value = []; } finally { - e === y && (l.value = !1, d.value = !1); + e === v && (a.value = !1, c.value = !1); } } - function F(e, t) { + function te(e, t) { return async (...n) => { - if (!v.value) { - v.value = e; + if (!_.value) { + _.value = e; try { await t(...n); } finally { - v.value === e && (v.value = ""); + _.value === e && (_.value = ""); } } }; } - let ee = F("create", async () => { - let e = await Lt(r("dialog.createCollection", "Create collection"), r("dialog.collectionPlaceholder", "Collection name")); + let ne = te("create", async () => { + let e = await gt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "Collection name")); if (!e) return; - let t = Gy(e); + let t = Yy(e); if (!t) { - s(r("toast.invalidCollectionName", "Invalid collection name"), "error"); + m(R("toast.invalidCollectionName", "Invalid collection name"), "error"); return; } - let n = await xe(t); + let n = await A(t); if (!n?.ok) { - s(n?.error || r("toast.failedCreateCollection", "Failed to create collection"), "error"); + m(n?.error || R("toast.failedCreateCollection", "Failed to create collection"), "error"); return; } - A({ + M({ collectionId: String(n?.data?.id || ""), collectionName: String(n?.data?.name || t) }); - }), te = F("exit", async () => { - A({ + }), re = te("exit", async () => { + M({ collectionId: "", collectionName: "" }); - }), ne = F("open", async (e) => { + }), ie = te("open", async (e) => { let t = String(e?.id || ""), n = String(e?.name || t); if (t) { - if (t === C.value) { - A({ + if (t === S.value) { + M({ collectionId: t, collectionName: n, reload: !1 }); return; } - A({ + M({ collectionId: t, collectionName: n }); } - }), re = F("delete", async (e) => { + }), ae = te("delete", async (e) => { let t = String(e?.id || ""), n = String(e?.name || t); - if (!t || !await gt(r("dialog.deleteCollection", "Delete collection \"{name}\"?", { name: n }))) return; - let i = await o(t); - if (!i?.ok) { - s(i?.error || r("toast.failedDeleteCollection", "Failed to delete collection"), "error"); + if (!t || !await Bt(R("dialog.deleteCollection", "Delete collection \"{name}\"?", { name: n }))) return; + let r = await p(t); + if (!r?.ok) { + m(r?.error || R("toast.failedDeleteCollection", "Failed to delete collection"), "error"); return; } - if (t === C.value) { - A({ + if (t === S.value) { + M({ collectionId: "", collectionName: "" }); return; } - await P(); + await ee(); }); - async function ie(e) { + async function oe(e) { let t = String(e?.label || "").trim(); if (!t) return; - let n = await xe(t); + let n = await A(t); if (!n?.ok) { - s(n?.error || r("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); + m(n?.error || R("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); return; } - let i = String(n?.data?.id || ""); - if (!i) return; - let o = await a(String(e?.query || ""), 50); - if (o?.ok && Array.isArray(o?.data) && o.data.length > 0) { - let e = qy(o.data), n = e.assets; + let r = String(n?.data?.id || ""); + if (!r) return; + let i = await I(String(e?.query || ""), 50); + if (i?.ok && Array.isArray(i?.data) && i.data.length > 0) { + let e = Zy(i.data), n = e.assets; if (e.missingIds.length) { - let t = await Jy(e.missingIds); - t.ok && Array.isArray(t.data) && (n = N(n, t.data)); + let t = await Qy(e.missingIds); + t.ok && Array.isArray(t.data) && (n = F(n, t.data)); } if (n.length) { - let e = await Ce(i, n); + let e = await x(r, n); if (!e?.ok) { - s(e?.error || r("toast.failedAddAssetsToSmartCollection", "Failed to add assets to smart collection"), "error"); + m(e?.error || R("toast.failedAddAssetsToSmartCollection", "Failed to add assets to smart collection"), "error"); return; } - s(r("toast.smartCollectionCreated", "Smart collection \"{name}\" created with {count} assets!", { + m(R("toast.smartCollectionCreated", "Smart collection \"{name}\" created with {count} assets!", { name: t, count: Number(e?.data?.added || n.length || 0) }), "success", 3e3); - } else s(r("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); - } else s(r("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); - A({ - collectionId: i, + } else m(R("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); + } else m(R("toast.smartCollectionEmpty", "Collection \"{name}\" created but no matching assets found. Index more assets first.", { name: t }), "info", 3e3); + M({ + collectionId: r, collectionName: t }); } - async function ae(e) { + async function se(e) { if (!e?.key) return; let t = `smart:${e.key}`; - if (!v.value) { - v.value = t; + if (!_.value) { + _.value = t; try { - await ie(e); + await oe(e); } catch (e) { - console.error("[Majoor] Smart collection creation failed:", e), s(r("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); + console.error("[Majoor] Smart collection creation failed:", e), m(R("toast.failedCreateSmartCollection", "Failed to create smart collection"), "error"); } finally { - v.value === t && (v.value = ""); + _.value === t && (_.value = ""); } } } - async function oe() { - if (!(h.value || v.value)) { - h.value = !0, _.value = "", g.value = []; + async function ce() { + if (!(f.value || _.value)) { + f.value = !0, g.value = "", h.value = []; try { - let e = await S(8); + let e = await T(8); if (!e?.ok || !Array.isArray(e?.data) || !e.data.length) { - s(r("toast.noGroupsFoundIndexFirst", "No groups found. Index more assets first."), "info", 3e3); + m(R("toast.noGroupsFoundIndexFirst", "No groups found. Index more assets first."), "info", 3e3); return; } - g.value = e.data.map((e) => ({ + h.value = e.data.map((e) => ({ ...e, - _label: Yy(e) + _label: $y(e) })); } catch (e) { - console.error("[Majoor] Discover groups failed:", e), _.value = r("toast.clusterAnalysisFailed", "Cluster analysis failed"), s(r("toast.clusterAnalysisFailed", "Cluster analysis failed"), "error"); + console.error("[Majoor] Discover groups failed:", e), g.value = R("toast.clusterAnalysisFailed", "Cluster analysis failed"), m(R("toast.clusterAnalysisFailed", "Cluster analysis failed"), "error"); } finally { - h.value = !1; + f.value = !1; } } } - async function se(e) { + async function le(e) { let t = `cluster:${String(e?.cluster_id ?? "")}`; - if (!v.value) { - v.value = t; + if (!_.value) { + _.value = t; try { - let t = String(e?._label || Yy(e) || "").trim(); + let t = String(e?._label || $y(e) || "").trim(); if (!t) return; - let n = await xe(t); + let n = await A(t); if (!n?.ok) { - s(n?.error || r("toast.failedCreateCollection", "Failed to create collection"), "error"); + m(n?.error || R("toast.failedCreateCollection", "Failed to create collection"), "error"); return; } - let i = String(n?.data?.id || ""), a = Array.isArray(e?.all_asset_ids) ? e.all_asset_ids : []; - if (i && a.length) { - let e = await Jy(a); + let r = String(n?.data?.id || ""), i = Array.isArray(e?.all_asset_ids) ? e.all_asset_ids : []; + if (r && i.length) { + let e = await Qy(i); if (!e.ok) { - s(e.error || r("toast.failedLoadClusterAssets", "Failed to load cluster assets"), "error"); + m(e.error || R("toast.failedLoadClusterAssets", "Failed to load cluster assets"), "error"); return; } - let n = await Ce(i, e.data || []); + let n = await x(r, e.data || []); if (!n?.ok) { - s(n?.error || r("toast.failedAddAssetsToCollection", "Failed to add assets to collection"), "error"); + m(n?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection"), "error"); return; } - s(r("toast.collectionCreatedWithAssets", "Collection \"{name}\" created with {count} assets!", { + m(R("toast.collectionCreatedWithAssets", "Collection \"{name}\" created with {count} assets!", { name: t, count: Number(n?.data?.added || e.data?.length || 0) }), "success", 3e3); - } else s(r("toast.collectionCreatedNamed", "Collection \"{name}\" created.", { name: t }), "success", 2200); - A({ - collectionId: i, + } else m(R("toast.collectionCreatedNamed", "Collection \"{name}\" created.", { name: t }), "success", 2200); + M({ + collectionId: r, collectionName: t }); } catch (e) { - console.error("[Majoor] Cluster collection creation failed:", e), s(r("toast.failedCreateCollection", "Failed to create collection"), "error"); + console.error("[Majoor] Cluster collection creation failed:", e), m(R("toast.failedCreateCollection", "Failed to create collection"), "error"); } finally { - v.value === t && (v.value = ""); + _.value === t && (_.value = ""); } } } - function ce() { + function ue() { let e = k(); - e && !x && P().catch(() => {}), x = e; + e && !b && ee().catch(() => {}), b = e; } return bn(() => { - ce(), !(typeof MutationObserver > "u" || !i.value) && (b = new MutationObserver(() => ce()), b.observe(i.value, { + ue(), !(typeof MutationObserver > "u" || !r.value) && (y = new MutationObserver(() => ue()), y.observe(r.value, { attributes: !0, attributeFilter: ["style"] })); }), Sn(() => { try { - b?.disconnect?.(); + y?.disconnect?.(); } catch (e) { console.debug?.(e); } - b = null; - }), t({ refresh: P }), (e, t) => { - let n = Ln("MButton"), a = Ln("MVirtualScroller"); - return H(), G("div", { + y = null; + }), t({ refresh: ee }), (e, t) => { + let n = Rn("MButton"), o = Rn("MVirtualScroller"); + return W(), q("div", { ref_key: "rootRef", - ref: i, + ref: r, class: "mjr-popover mjr-collections-popover", style: { display: "none" } - }, [W("div", Zy, [ - V(n, { + }, [K("div", tb, [ + U(n, { type: "button", class: "mjr-menu-item", severity: "secondary", text: "", - disabled: v.value !== "", - onClick: J(ee) + disabled: _.value !== "", + onClick: X(ne) }, { - default: U(() => [W("span", Qy, q(J(r)("ctx.createCollection", "Create collection")), 1), t[0] ||= W("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: G(() => [K("span", nb, Y(X(R)("ctx.createCollection", "Create collection")), 1), t[0] ||= K("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 1 }, 8, ["disabled", "onClick"]), - T.value ? (H(), hn(n, { + w.value ? (W(), hn(n, { key: 0, type: "button", class: "mjr-menu-item", severity: "secondary", text: "", - disabled: v.value !== "", - onClick: J(te) + disabled: _.value !== "", + onClick: X(re) }, { - default: U(() => [W("span", $y, q(J(r)("ctx.exitCollection", "Exit collection")), 1), W("span", eb, [w.value ? (H(), G("span", tb, q(w.value), 1)) : Y("", !0), t[1] ||= W("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), + default: G(() => [K("span", rb, Y(X(R)("ctx.exitCollection", "Exit collection")), 1), K("span", ib, [C.value ? (W(), q("span", ab, Y(C.value), 1)) : In("", !0), t[1] ||= K("i", { class: "pi pi-times mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)])]), _: 1 - }, 8, ["disabled", "onClick"])) : Y("", !0), - t[9] ||= W("div", { class: "mjr-menu-divider" }, null, -1), - l.value ? (H(), G("div", nb, q(J(r)("label.loading", "Loading...")), 1)) : u.value ? (H(), G("div", rb, q(u.value), 1)) : c.value.length ? (H(), hn(a, { + }, 8, ["disabled", "onClick"])) : In("", !0), + t[9] ||= K("div", { class: "mjr-menu-divider" }, null, -1), + a.value ? (W(), q("div", ob, Y(X(R)("label.loading", "Loading...")), 1)) : s.value ? (W(), q("div", sb, Y(s.value), 1)) : i.value.length ? (W(), hn(o, { key: 4, - items: c.value, + items: i.value, "item-size": 48, "scroll-height": O.value, "num-tolerated-items": 4, class: "mjr-collections-virtual-list" }, { - item: U(({ item: e }) => [W("div", ab, [V(n, { + item: G(({ item: e }) => [K("div", lb, [U(n, { type: "button", - class: Mn(["mjr-menu-item", { "is-active": C.value === String(e.id || "") }]), + class: Mn(["mjr-menu-item", { "is-active": S.value === String(e.id || "") }]), severity: "secondary", text: "", - disabled: v.value !== "", - onClick: (t) => J(ne)(e) + disabled: _.value !== "", + onClick: (t) => X(ie)(e) }, { - default: U(() => [W("span", ob, q(e.name || e.id), 1), W("span", sb, [Number(e.count || 0) ? (H(), G("span", cb, q(Number(e.count || 0)), 1)) : Y("", !0), t[2] ||= W("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), + default: G(() => [K("span", ub, Y(e.name || e.id), 1), K("span", db, [Number(e.count || 0) ? (W(), q("span", fb, Y(Number(e.count || 0)), 1)) : In("", !0), t[2] ||= K("i", { class: "pi pi-check mjr-menu-item-check" }, null, -1)])]), _: 2 }, 1032, [ "class", "disabled", "onClick" - ]), V(n, { + ]), U(n, { type: "button", class: "mjr-menu-item mjr-delete-btn", severity: "secondary", text: "", - disabled: v.value !== "", - title: J(r)("tooltip.deleteCollection", "Delete collection"), - onClick: Fn((t) => J(re)(e), ["stop", "prevent"]) + disabled: _.value !== "", + title: X(R)("tooltip.deleteCollection", "Delete collection"), + onClick: Fn((t) => X(ae)(e), ["stop", "prevent"]) }, { - default: U(() => [...t[3] ||= [W("i", { class: "pi pi-trash" }, null, -1)]]), + default: G(() => [...t[3] ||= [K("i", { class: "pi pi-trash" }, null, -1)]]), _: 1 }, 8, [ "disabled", @@ -27622,63 +27433,63 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite "onClick" ])])]), _: 1 - }, 8, ["items", "scroll-height"])) : (H(), G("div", ib, q(J(r)("msg.noCollections", "No collections yet")), 1)), - !d.value && E.value ? (H(), G(In, { key: 5 }, [t[4] ||= W("div", { class: "mjr-menu-divider" }, null, -1), W("div", lb, q(f.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : Y("", !0), - !d.value && D.value ? (H(), G(In, { key: 6 }, [ - t[7] ||= W("div", { class: "mjr-menu-divider" }, null, -1), - W("div", ub, q(J(r)("label.smartSuggestions", "Smart Suggestions")), 1), - W("div", db, q(J(r)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), - (H(!0), G(In, null, vn(J(Wy), (e) => (H(), hn(n, { + }, 8, ["items", "scroll-height"])) : (W(), q("div", cb, Y(X(R)("msg.noCollections", "No collections yet")), 1)), + !c.value && E.value ? (W(), q(Ln, { key: 5 }, [t[4] ||= K("div", { class: "mjr-menu-divider" }, null, -1), K("div", pb, Y(l.value ? "AI Smart Collections are disabled (enable vector search env var)." : "AI Smart Collections are disabled in settings."), 1)], 64)) : In("", !0), + !c.value && D.value ? (W(), q(Ln, { key: 6 }, [ + t[7] ||= K("div", { class: "mjr-menu-divider" }, null, -1), + K("div", mb, Y(X(R)("label.smartSuggestions", "Smart Suggestions")), 1), + K("div", hb, Y(X(R)("label.smartCollectionsHint", "Create collections from AI-detected themes")), 1), + (W(!0), q(Ln, null, vn(X(Jy), (e) => (W(), hn(n, { key: e.key, type: "button", class: "mjr-menu-item mjr-menu-item--smart", severity: "secondary", text: "", - disabled: v.value !== "", - onClick: (t) => ae(e) + disabled: _.value !== "", + onClick: (t) => se(e) }, { - default: U(() => [W("span", fb, [W("i", { class: Mn(e.iconClass) }, null, 2), W("span", null, q(e.label), 1)]), t[5] ||= W("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), + default: G(() => [K("span", gb, [K("i", { class: Mn(e.iconClass) }, null, 2), K("span", null, Y(e.label), 1)]), t[5] ||= K("i", { class: "pi pi-plus mjr-menu-item-check mjr-menu-item-check--visible" }, null, -1)]), _: 2 }, 1032, ["disabled", "onClick"]))), 128)), - t[8] ||= W("div", { class: "mjr-menu-divider" }, null, -1), - W("div", pb, q(J(r)("label.discoverGroups", "Discover Groups")), 1), - W("div", mb, q(J(r)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), - V(n, { + t[8] ||= K("div", { class: "mjr-menu-divider" }, null, -1), + K("div", _b, Y(X(R)("label.discoverGroups", "Discover Groups")), 1), + K("div", vb, Y(X(R)("label.discoverGroupsHint", "AI clusters assets by visual similarity")), 1), + U(n, { type: "button", class: "mjr-menu-item mjr-menu-item--cluster", severity: "secondary", text: "", - disabled: h.value || v.value !== "", - onClick: oe + disabled: f.value || _.value !== "", + onClick: ce }, { - default: U(() => [W("span", hb, [t[6] ||= W("i", { class: "pi pi-search" }, null, -1), W("span", null, q(h.value ? J(r)("label.analyzing", "Analyzing...") : J(r)("label.analyzeLibrary", "Analyze library")), 1)])]), + default: G(() => [K("span", yb, [t[6] ||= K("i", { class: "pi pi-search" }, null, -1), K("span", null, Y(f.value ? X(R)("label.analyzing", "Analyzing...") : X(R)("label.analyzeLibrary", "Analyze library")), 1)])]), _: 1 }, 8, ["disabled"]), - _.value ? (H(), G("div", gb, q(_.value), 1)) : Y("", !0), - (H(!0), G(In, null, vn(g.value, (e) => (H(), G("div", { + g.value ? (W(), q("div", bb, Y(g.value), 1)) : In("", !0), + (W(!0), q(Ln, null, vn(h.value, (e) => (W(), q("div", { key: e.cluster_id, class: "mjr-cluster-row" }, [ - W("div", _b, [(H(!0), G(In, null, vn(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (H(), G("img", { + K("div", xb, [(W(!0), q(Ln, null, vn(Array.isArray(e.sample_assets) ? e.sample_assets.slice(0, 3) : [], (t, n) => (W(), q("img", { key: `${e.cluster_id}-${n}`, class: "mjr-cluster-thumb", - src: j(t), + src: N(t), alt: String(t?.filename || e._label || ""), loading: "lazy" - }, null, 8, vb))), 128))]), - W("div", yb, [W("div", { + }, null, 8, Sb))), 128))]), + K("div", Cb, [K("div", { class: "mjr-cluster-name", title: e._label - }, q(e._label), 9, bb), W("div", xb, q(Number(e.size || 0)) + " " + q(J(r)("label.assets", "assets")), 1)]), - V(n, { + }, Y(e._label), 9, wb), K("div", Tb, Y(Number(e.size || 0)) + " " + Y(X(R)("label.assets", "assets")), 1)]), + U(n, { type: "button", class: "mjr-cluster-create-btn", severity: "secondary", - disabled: v.value !== "", - title: J(r)("ctx.createCollection", "Create collection"), - onClick: (t) => se(e) + disabled: _.value !== "", + title: X(R)("ctx.createCollection", "Create collection"), + onClick: (t) => le(e) }, { - default: U(() => [gn(q(v.value === `cluster:${String(e.cluster_id ?? "")}` ? J(r)("label.loading", "Loading...") : J(r)("label.create", "Create")), 1)]), + default: G(() => [gn(Y(_.value === `cluster:${String(e.cluster_id ?? "")}` ? X(R)("label.loading", "Loading...") : X(R)("label.create", "Create")), 1)]), _: 2 }, 1032, [ "disabled", @@ -27686,26 +27497,26 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite "onClick" ]) ]))), 128)) - ], 64)) : Y("", !0) + ], 64)) : In("", !0) ])], 512); }; } -}, wb = { +}, Ob = { class: "mjr-popover mjr-pinned-folders-popover", style: { display: "none" } -}, Tb = { +}, kb = { key: 0, class: "mjr-muted mjr-pinned-folders-empty" -}, Eb = { +}, Ab = { key: 1, class: "mjr-muted mjr-pinned-folders-empty" -}, Db = { class: "mjr-pinned-folder-label" }, Ob = { +}, jb = { class: "mjr-pinned-folder-label" }, Mb = { key: 0, class: "mjr-menu-item-hint mjr-pinned-folder-path" -}, kb = /* @__PURE__ */ Il({ +}, Nb = /* @__PURE__ */ Rl({ __name: "PinnedFoldersPopover", setup(e, { expose: t }) { - let n = K(null), r = K([]), i = K(!1), a = K("No pinned folders"), o = K("Loading..."), s = K("Unpin folder"), c = K(null), l = K(null); + let n = J(null), r = J([]), i = J(!1), a = J("No pinned folders"), o = J("Loading..."), s = J("Unpin folder"), c = J(null), l = J(null); function u(e) { let t = String(e?.id || "").trim(); return t ? { @@ -27733,25 +27544,25 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite setPinnedFolders: d, setPinnedFoldersLoading: f }), (e, t) => { - let c = Ln("MButton"); - return H(), G("div", wb, [W("div", { + let c = Rn("MButton"); + return W(), q("div", Ob, [K("div", { ref_key: "menuRef", ref: n, class: "mjr-menu mjr-pinned-folders-menu", role: "menu" - }, [i.value ? (H(), G("div", Tb, q(o.value), 1)) : r.value.length ? (H(!0), G(In, { key: 2 }, vn(r.value, (e) => (H(), G("div", { + }, [i.value ? (W(), q("div", kb, Y(o.value), 1)) : r.value.length ? (W(!0), q(Ln, { key: 2 }, vn(r.value, (e) => (W(), q("div", { key: e.id, class: "mjr-pinned-folder-row" - }, [V(c, { + }, [U(c, { type: "button", class: "mjr-menu-item mjr-pinned-folder-open", role: "menuitem", severity: "secondary", onClick: (t) => p(e) }, { - default: U(() => [W("span", Db, q(e.label), 1), e.path ? (H(), G("span", Ob, q(e.path), 1)) : Y("", !0)]), + default: G(() => [K("span", jb, Y(e.label), 1), e.path ? (W(), q("span", Mb, Y(e.path), 1)) : In("", !0)]), _: 2 - }, 1032, ["onClick"]), V(c, { + }, 1032, ["onClick"]), U(c, { type: "button", class: "mjr-menu-item mjr-pinned-folder-unpin", role: "menuitem", @@ -27760,7 +27571,7 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite "aria-label": `${s.value}: ${e.label}`, onClick: (t) => m(e, t) }, { - default: U(() => [...t[0] ||= [W("i", { + default: G(() => [...t[0] ||= [K("i", { class: "pi pi-times", "aria-hidden": "true" }, null, -1)]]), @@ -27769,48 +27580,48 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite "title", "aria-label", "onClick" - ])]))), 128)) : (H(), G("div", Eb, q(a.value), 1))], 512)]); + ])]))), 128)) : (W(), q("div", Ab, Y(a.value), 1))], 512)]); }; } -}, [["__scopeId", "data-v-7d86b0ee"]]), Ab = { +}, [["__scopeId", "data-v-7d86b0ee"]]), Pb = { class: "mjr-popover mjr-custom-popover", style: { display: "none" } -}, jb = { class: "mjr-popover-row" }, Mb = { class: "mjr-popover-label" }, Nb = { class: "mjr-popover-row mjr-popover-row--actions" }, Pb = { +}, Fb = { class: "mjr-popover-row" }, Ib = { class: "mjr-popover-label" }, Lb = { class: "mjr-popover-row mjr-popover-row--actions" }, Rb = { __name: "CustomRootsPopover", setup(e, { expose: t }) { - let n = K([{ - label: r("label.selectFolder", "Select folder…"), + let n = J([{ + label: R("label.selectFolder", "Select folder…"), value: "", disabled: !1 - }]), i = K(""), a = K(!1), o = K(null), s = K(null), c = (e) => e?.$el || e || null, l = new EventTarget(), u = (e) => ({ + }]), r = J(""), i = J(!1), a = J(null), o = J(null), s = (e) => e?.$el || e || null, c = new EventTarget(), l = (e) => ({ value: String(e?.value || ""), label: String(e?.textContent || e?.text || e?.label || ""), text: String(e?.text || e?.textContent || e?.label || ""), textContent: String(e?.textContent || e?.text || e?.label || ""), disabled: !!e?.disabled - }), d = (e) => n.value.find((t) => String(t.value || "") === String(e || "")) || null, f = { + }), u = (e) => n.value.find((t) => String(t.value || "") === String(e || "")) || null, d = { get value() { - return i.value; + return r.value; }, set value(e) { let t = String(e || ""); - i.value = d(t) ? t : ""; + r.value = u(t) ? t : ""; }, get disabled() { - return a.value; + return i.value; }, set disabled(e) { - a.value = !!e; + i.value = !!e; }, get options() { return n.value; }, get selectedIndex() { - return Math.max(0, n.value.findIndex((e) => String(e.value || "") === String(i.value || ""))); + return Math.max(0, n.value.findIndex((e) => String(e.value || "") === String(r.value || ""))); }, set selectedIndex(e) { let t = n.value[Number(e) || 0] || n.value[0]; - i.value = String(t?.value || ""); + r.value = String(t?.value || ""); }, get selectedOptions() { let e = n.value[this.selectedIndex] || null; @@ -27820,131 +27631,131 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite return ""; }, set innerHTML(e) { - n.value = [], i.value = ""; + n.value = [], r.value = ""; }, appendChild(e) { - let t = u(e); + let t = l(e); return n.value = [...n.value, t], e; }, querySelector(e) { - return e === "option[value=\"\"]" ? d("") : null; + return e === "option[value=\"\"]" ? u("") : null; }, addEventListener(e, t, n) { - l.addEventListener(e, t, n); + c.addEventListener(e, t, n); }, removeEventListener(e, t, n) { - l.removeEventListener(e, t, n); + c.removeEventListener(e, t, n); }, dispatchEvent(e) { - return l.dispatchEvent(e); + return c.dispatchEvent(e); } }; - function p(e) { - f.value = e; + function f(e) { + d.value = e; try { - f.dispatchEvent(new Event("change")); + d.dispatchEvent(new Event("change")); } catch (e) { console.debug?.(e); } } return t({ get customSelect() { - return f; + return d; }, get customAddBtn() { - return c(o.value); + return s(a.value); }, get customRemoveBtn() { - return c(s.value); + return s(o.value); } }), (e, t) => { - let c = Ln("MSelect"), l = Ln("MButton"); - return H(), G("div", Ab, [W("div", jb, [W("div", Mb, q(J(r)("label.folder")), 1), V(c, { + let s = Rn("MSelect"), c = Rn("MButton"); + return W(), q("div", Pb, [K("div", Fb, [K("div", Ib, Y(X(R)("label.folder")), 1), U(s, { class: "mjr-select", - "model-value": i.value, + "model-value": r.value, options: n.value, "option-label": "label", "option-value": "value", - disabled: a.value, - "onUpdate:modelValue": p + disabled: i.value, + "onUpdate:modelValue": f }, null, 8, [ "model-value", "options", "disabled" - ])]), W("div", Nb, [V(l, { + ])]), K("div", Lb, [U(c, { ref_key: "customAddBtnRef", - ref: o, + ref: a, type: "button", class: "mjr-btn", severity: "secondary" }, { - default: U(() => [gn(q(J(r)("btn.add")), 1)]), + default: G(() => [gn(Y(X(R)("btn.add")), 1)]), _: 1 - }, 512), V(l, { + }, 512), U(c, { ref_key: "customRemoveBtnRef", - ref: s, + ref: o, type: "button", class: "mjr-btn", severity: "secondary", disabled: "" }, { - default: U(() => [gn(q(J(r)("btn.remove")), 1)]), + default: G(() => [gn(Y(X(R)("btn.remove")), 1)]), _: 1 }, 512)])]); }; } -}, Fb = ["aria-label"], Ib = { class: "mjr-messages-head" }, Lb = { class: "mjr-messages-actions" }, Rb = ["title"], zb = { class: "mjr-messages-star-label" }, Bb = { +}, zb = ["aria-label"], Bb = { class: "mjr-messages-head" }, Vb = { class: "mjr-messages-actions" }, Hb = ["title"], Ub = { class: "mjr-messages-star-label" }, Wb = { class: "mjr-messages-tabs", role: "tablist" -}, Vb = { class: "mjr-messages-panels" }, Hb = { class: "mjr-messages-empty" }, Ub = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Wb = { +}, Gb = { class: "mjr-messages-panels" }, Kb = { class: "mjr-messages-empty" }, qb = "https://github.com/MajoorWaldi/ComfyUI-Majoor-AssetsManager", Jb = { __name: "MessagePopover", setup(e, { expose: t }) { - let n = K(null), i = K(null), a = K(null), o = K(null), s = K(null), c = K(null), l = K(null), u = K(null), d = K(null), f = K(null), p = K(null), m = (e) => e?.$el || e || null; + let n = J(null), r = J(null), i = J(null), a = J(null), o = J(null), s = J(null), c = J(null), l = J(null), u = J(null), d = J(null), f = J(null), p = (e) => e?.$el || e || null; return t({ get title() { return n.value; }, get markReadBtn() { - return m(i.value); + return p(r.value); }, get messageTabBtn() { - return m(a.value); + return p(i.value); }, get messageTabBadge() { - return o.value; + return a.value; }, get historyTabBtn() { - return m(s.value); + return p(o.value); }, get historyTabBadge() { - return c.value; + return s.value; }, get historyTabCount() { - return l.value; + return c.value; }, get shortcutsTabBtn() { - return m(u.value); + return p(l.value); }, get messageList() { - return d.value; + return u.value; }, get historyPanel() { - return f.value; + return d.value; }, get shortcutsPanel() { - return p.value; + return f.value; } }), (e, t) => { - let m = Ln("MButton"), h = Ln("MDialog"); - return H(), G("div", { + let p = Rn("MButton"), m = Rn("MDialog"); + return W(), q("div", { class: "mjr-popover mjr-messages-popover", id: "mjr-messages-popover", role: "dialog", - "aria-label": J(r)("label.messages", "Messages"), + "aria-label": X(R)("label.messages", "Messages"), "aria-hidden": "true", tabindex: "-1", style: { display: "none" } - }, [V(h, { + }, [U(m, { visible: !0, modal: !1, "show-header": !1, @@ -27960,35 +27771,35 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite root: { class: "mjr-inline-dialog-root" } } }, { - default: U(() => [ - W("div", Ib, [W("div", { + default: G(() => [ + K("div", Bb, [K("div", { ref_key: "titleRef", ref: n, class: "mjr-messages-title" - }, q(J(r)("label.messages", "Messages")), 513), W("div", Lb, [W("a", { - href: Ub, + }, Y(X(R)("label.messages", "Messages")), 513), K("div", Vb, [K("a", { + href: qb, target: "_blank", rel: "noopener noreferrer", class: "mjr-btn mjr-messages-star-link", - title: J(r)("tooltip.starGithub", "Open GitHub and give a star") - }, [t[0] ||= W("span", { + title: X(R)("tooltip.starGithub", "Open GitHub and give a star") + }, [t[0] ||= K("span", { class: "mjr-messages-star-icon", "aria-hidden": "true" - }, "★", -1), W("span", zb, q(J(r)("btn.giveStar", "Give a star")), 1)], 8, Rb), V(m, { + }, "★", -1), K("span", Ub, Y(X(R)("btn.giveStar", "Give a star")), 1)], 8, Hb), U(p, { ref_key: "markReadBtnRef", - ref: i, + ref: r, type: "button", class: "mjr-btn mjr-messages-mark-read-btn", severity: "secondary", - title: J(r)("tooltip.markMessagesRead", "Mark all messages as read") + title: X(R)("tooltip.markMessagesRead", "Mark all messages as read") }, { - default: U(() => [gn(q(J(r)("btn.markAllRead", "Mark all read")), 1)]), + default: G(() => [gn(Y(X(R)("btn.markAllRead", "Mark all read")), 1)]), _: 1 }, 8, ["title"])])]), - W("div", Bb, [ - V(m, { + K("div", Wb, [ + U(p, { ref_key: "messageTabBtnRef", - ref: a, + ref: i, type: "button", class: "mjr-messages-tab is-active", severity: "secondary", @@ -27998,18 +27809,18 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite "aria-controls": "mjr-messages-panel", id: "mjr-messages-tab" }, { - default: U(() => [W("span", null, q(J(r)("label.messages", "Messages")), 1), W("span", { + default: G(() => [K("span", null, Y(X(R)("label.messages", "Messages")), 1), K("span", { ref_key: "messageTabBadgeRef", - ref: o, + ref: a, class: "mjr-tab-count-badge", "aria-hidden": "true", style: { display: "none" } }, null, 512)]), _: 1 }, 512), - V(m, { + U(p, { ref_key: "historyTabBtnRef", - ref: s, + ref: o, type: "button", class: "mjr-messages-tab", severity: "secondary", @@ -28019,18 +27830,18 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite "aria-controls": "mjr-history-panel", id: "mjr-history-tab" }, { - default: U(() => [ - W("span", null, q(J(r)("label.toastHistory", "History")), 1), - W("span", { + default: G(() => [ + K("span", null, Y(X(R)("label.toastHistory", "History")), 1), + K("span", { ref_key: "historyTabCountRef", - ref: l, + ref: c, class: "mjr-tab-count-badge", "aria-hidden": "true", style: { display: "none" } }, null, 512), - W("span", { + K("span", { ref_key: "historyTabBadgeRef", - ref: c, + ref: s, class: "mjr-tab-unread-dot", "aria-hidden": "true", style: { display: "none" } @@ -28038,9 +27849,9 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite ]), _: 1 }, 512), - V(m, { + U(p, { ref_key: "shortcutsTabBtnRef", - ref: u, + ref: l, type: "button", class: "mjr-messages-tab", severity: "secondary", @@ -28050,31 +27861,31 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite "aria-controls": "mjr-shortcuts-panel", id: "mjr-shortcuts-tab" }, { - default: U(() => [gn(q(J(r)("msg.shortcuts.title", "Shortcut Guide")), 1)]), + default: G(() => [gn(Y(X(R)("msg.shortcuts.title", "Shortcut Guide")), 1)]), _: 1 }, 512) ]), - W("div", Vb, [ - W("div", { + K("div", Gb, [ + K("div", { ref_key: "messageListRef", - ref: d, + ref: u, class: "mjr-messages-list", id: "mjr-messages-panel", role: "tabpanel", "aria-labelledby": "mjr-messages-tab" - }, [W("div", Hb, q(J(r)("msg.noMessages", "No messages for now.")), 1)], 512), - W("div", { + }, [K("div", Kb, Y(X(R)("msg.noMessages", "No messages for now.")), 1)], 512), + K("div", { ref_key: "historyPanelRef", - ref: f, + ref: d, class: "mjr-messages-history-panel", id: "mjr-history-panel", role: "tabpanel", "aria-labelledby": "mjr-history-tab", hidden: "" }, null, 512), - W("div", { + K("div", { ref_key: "shortcutsPanelRef", - ref: p, + ref: f, class: "mjr-messages-shortcuts-panel", id: "mjr-shortcuts-panel", role: "tabpanel", @@ -28084,22 +27895,22 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite ]) ]), _: 1 - })], 8, Fb); + })], 8, zb); }; } -}, Gb = { class: "mjr-am-header-row" }, Kb = { class: "mjr-am-header-left" }, qb = { class: "mjr-am-header-title" }, Jb = ["data-mjr-version-channel", "title"], Yb = { class: "mjr-tabs" }, Xb = { class: "mjr-am-header-tools" }, Zb = { +}, Yb = { class: "mjr-am-header-row" }, Xb = { class: "mjr-am-header-left" }, Zb = { class: "mjr-am-header-title" }, Qb = ["data-mjr-version-channel", "title"], $b = { class: "mjr-tabs" }, ex = { class: "mjr-am-header-tools" }, tx = { class: "mjr-popover-anchor", style: { display: "none" } -}, Qb = { class: "mjr-popover-anchor" }, $b = { class: "mjr-popover-anchor" }, ex = { class: "mjr-popover-anchor" }, tx = { class: "mjr-popover-anchor" }, nx = { class: "mjr-popover-anchor" }, rx = "mjr-am-version-badge-label", ix = "V", ax = { +}, nx = { class: "mjr-popover-anchor" }, rx = { class: "mjr-popover-anchor" }, ix = { class: "mjr-popover-anchor" }, ax = { class: "mjr-popover-anchor" }, ox = { class: "mjr-popover-anchor" }, sx = "mjr-am-version-badge-label", cx = "V", lx = { __name: "HeaderSection", setup(e, { expose: t }) { let n = null; - function i() { + function r() { return n ||= Promise.resolve({}).catch((e) => { throw n = null, e; }), n; } - function a(e, t = "") { + function i(e, t = "") { let n = String(e || "").trim().toLowerCase(), r = String(t || "").trim().toLowerCase(); return [ "nightly", @@ -28108,7 +27919,7 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite "experimental" ].some((e) => n.includes(e) || r.includes(e)) || n.includes("+") || n.length > 10 && /^[a-f0-9]+$/i.test(n); } - function o() { + function a() { try { if (typeof window < "u" && window?.MajoorAssetsManagerBranch) return String(window.MajoorAssetsManagerBranch); } catch (e) { @@ -28121,310 +27932,313 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite } return ""; } - let s = { + let o = { name_asc: "pi pi-sort-alpha-down", name_desc: "pi pi-sort-alpha-up", mtime_asc: "pi pi-sort-amount-up-alt", rating_desc: "pi pi-star-fill", size_desc: "pi pi-sort-numeric-down-alt", size_asc: "pi pi-sort-numeric-up-alt" - }, c = $g(), l = o() === "nightly", u = K(null), d = K(null), f = K(null), p = K(null), m = K(null), h = K(null), g = K(null), _ = K(null), v = K(null), y = K(null), b = K(null), x = K(null), S = K(null), C = K(null), w = K(null), T = K(null), E = K(null), D = K(null), O = K(null), k = K(null), A = K(null), j = (e) => e?.$el || e || null, M = K(l ? "nightly" : "v?"), N = K(l ? "nightly" : "stable"), F = K(!1), ee = K(!1), te = K(!1), ne = X(() => s[c.sort] ?? "pi pi-sort-amount-down"), re = X(() => String(c.viewScope || c.scope || "output").toLowerCase()), ie = X(() => re.value === "similar" || Array.isArray(c.similarResults) && c.similarResults.length > 0 || !!c.similarTitle), ae = { + }, s = Ut(), c = a() === "nightly", l = J(null), u = J(null), d = J(null), f = J(null), p = J(null), m = J(null), h = J(null), g = J(null), _ = J(null), v = J(null), y = J(null), b = J(null), x = J(null), S = J(null), C = J(null), w = J(null), T = J(null), E = J(null), D = J(null), O = J(null), k = J(null), A = (e) => e?.$el || e || null, j = J(c ? "nightly" : "v?"), M = J(c ? "nightly" : "stable"), N = J(!1), P = J(!1), F = J(!1), I = Z(() => o[s.sort] ?? "pi pi-sort-amount-down"), ee = Z(() => String(s.viewScope || s.scope || "output").toLowerCase()), te = Z(() => ee.value === "similar" || Array.isArray(s.similarResults) && s.similarResults.length > 0 || !!s.similarTitle), re = { get tabAll() { - return j(E.value); + return A(T.value); }, get tabInputs() { - return j(D.value); + return A(E.value); }, get tabOutputs() { - return j(O.value); + return A(D.value); }, get tabCustom() { - return j(k.value); + return A(O.value); }, get tabSimilar() { - return j(A.value); + return A(k.value); } - }, oe = X(() => ({ + }, ie = Z(() => ({ position: "relative", fontSize: "10px", - opacity: ee.value ? "1" : "0.6", + opacity: P.value ? "1" : "0.6", marginLeft: "6px", padding: "2px 5px", borderRadius: "4px", - background: ee.value ? "rgba(255,255,255,0.15)" : "rgba(255,255,255,0.08)", + background: P.value ? "rgba(255,255,255,0.15)" : "rgba(255,255,255,0.08)", color: "inherit", textDecoration: "none", cursor: "pointer", transition: "opacity 0.2s, background 0.2s", verticalAlign: "middle" - })), se = X(() => te.value ? r("tooltip.closeMFV", "Close Majoor Floating Viewer") : r("tooltip.openMFV", "Open Majoor Floating Viewer")), ce = X(() => "pi pi-eye"), le = X(() => r("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings")); - function ue(e, { channel: t = "" } = {}) { - M.value = String(e || ""), t && (N.value = t); + })), ae = Z(() => F.value ? R("tooltip.closeMFV", "Close Majoor Floating Viewer") : R("tooltip.openMFV", "Open Majoor Floating Viewer")), oe = Z(() => "pi pi-eye"), se = Z(() => R("tooltip.openMajoorSettings", "Open Majoor Assets Manager settings")); + function ce(e, { channel: t = "" } = {}) { + j.value = String(e || ""), t && (M.value = t); } - function de(e) { - i().then((t) => { - let n = N.value.toLowerCase() === "nightly" || M.value.toLowerCase() === "nightly"; + function le(e) { + r().then((t) => { + let n = M.value.toLowerCase() === "nightly" || j.value.toLowerCase() === "nightly"; if (!e && !n) { let e = (typeof t?.version == "string" ? t.version.trim() : "") || ""; - e && ue(`v${e}`, { channel: "stable" }); + e && ce(`v${e}`, { channel: "stable" }); } }).catch(() => { n = null; }); } - async function fe(e) { + async function ue(e) { try { - let t = await P(Le.VERSION, { cache: "no-cache" }); + let t = await ne(L.VERSION, { cache: "no-cache" }); if (!t?.ok) return; let n = String(t.data?.version || "").trim(); - if (a(n, String(t.data?.branch || "").trim().toLowerCase()) || e) { - ue("nightly", { channel: "nightly" }); + if (i(n, String(t.data?.branch || "").trim().toLowerCase()) || e) { + ce("nightly", { channel: "nightly" }); return; } - n && ue(n.startsWith("v") ? n : `v${n}`, { channel: "stable" }); + n && ce(n.startsWith("v") ? n : `v${n}`, { channel: "stable" }); } catch {} } - function pe(e) { + function de(e) { let t = String(e?.channel || "").trim().toLowerCase(), n = String(e?.current || "").trim().toLowerCase(), r = String(e?.latest || "").trim().toLowerCase(); - (t === "nightly" || n === "nightly" || r === "nightly") && ue("nightly", { channel: "nightly" }), F.value = !!e?.available; + (t === "nightly" || n === "nightly" || r === "nightly") && ce("nightly", { channel: "nightly" }), N.value = !!e?.available; } - function me() { + function fe() { try { - nn(j(_.value), se.value, ix); + nn(A(g.value), ae.value, cx); } catch (e) { console.debug?.(e); } } - function he() { + function pe() { try { if (typeof document > "u") return; - te.value = !!document.querySelector(".mjr-mfv.is-visible"); + F.value = !!document.querySelector(".mjr-mfv.is-visible"); } catch (e) { console.debug?.(e); } } - function ge(e) { - te.value = !!e?.detail?.visible; + function me(e) { + F.value = !!e?.detail?.visible; } - function _e(e) { + function he(e) { try { - pe(e?.detail); + de(e?.detail); } catch (e) { console.debug?.(e); } } - function ve() { - window.dispatchEvent(new CustomEvent(B.MFV_TOGGLE)); + function ge() { + window.dispatchEvent(new CustomEvent(H.MFV_TOGGLE)); } - function ye() { + function _e() { ln(); } - function be() { + function ve() { try { - typeof window < "u" && (window.removeEventListener(pr, _e), window.removeEventListener(B.MFV_VISIBILITY_CHANGED, ge)); + typeof window < "u" && (window.removeEventListener(mr, he), window.removeEventListener(H.MFV_VISIBILITY_CHANGED, me)); } catch (e) { console.debug?.(e); } } - return mn(te, () => { - me(); + return mn(F, () => { + fe(); }), bn(async () => { await Nn(); try { - pe(jr()); + de(Mr()); } catch (e) { console.debug?.(e); } - he(), me(), de(l), fe(l); + pe(), fe(), le(c), ue(c); try { - typeof window < "u" && (window.addEventListener(pr, _e), window.addEventListener(B.MFV_VISIBILITY_CHANGED, ge)); + typeof window < "u" && (window.addEventListener(mr, he), window.addEventListener(H.MFV_VISIBILITY_CHANGED, me)); } catch (e) { console.debug?.(e); } try { - u.value._mjrVersionUpdateCleanup = be; + l.value._mjrVersionUpdateCleanup = ve; } catch (e) { console.debug?.(e); } }), Sn(() => { - be(); + ve(); }), t({ isVueHeader: !0, get header() { - return u.value; + return l.value; }, get headerActions() { - return d.value; + return u.value; }, get tabButtons() { - return ae; + return re; }, get customMenuBtn() { - return j(f.value); + return A(d.value); }, get filterBtn() { - return j(p.value); + return A(f.value); }, get sortBtn() { - return j(m.value); + return A(p.value); }, get collectionsBtn() { - return j(h.value); + return A(m.value); }, get pinnedFoldersBtn() { - return j(g.value); + return A(h.value); }, get messageBtn() { - return j(v.value); + return A(_.value); }, get customPopover() { - return w.value?.$el ?? null; + return C.value?.$el ?? null; }, get customSelect() { - return w.value?.customSelect ?? null; + return C.value?.customSelect ?? null; }, get customAddBtn() { - return w.value?.customAddBtn ?? null; + return C.value?.customAddBtn ?? null; }, get customRemoveBtn() { - return w.value?.customRemoveBtn ?? null; + return C.value?.customRemoveBtn ?? null; }, get filterPopover() { - return x.value?.$el ?? null; + return b.value?.$el ?? null; }, get kindSelect() { - return x.value?.kindSelect ?? null; + return b.value?.kindSelect ?? null; }, get wfCheckbox() { - return x.value?.wfCheckbox ?? null; + return b.value?.wfCheckbox ?? null; }, get workflowTypeSelect() { - return x.value?.workflowTypeSelect ?? null; + return b.value?.workflowTypeSelect ?? null; + }, + get workflowIdInput() { + return b.value?.workflowIdInput ?? null; }, get ratingSelect() { - return x.value?.ratingSelect ?? null; + return b.value?.ratingSelect ?? null; }, get minSizeInput() { - return x.value?.minSizeInput ?? null; + return b.value?.minSizeInput ?? null; }, get maxSizeInput() { - return x.value?.maxSizeInput ?? null; + return b.value?.maxSizeInput ?? null; }, get resolutionPresetSelect() { - return x.value?.resolutionPresetSelect ?? null; + return b.value?.resolutionPresetSelect ?? null; }, get minWidthInput() { - return x.value?.minWidthInput ?? null; + return b.value?.minWidthInput ?? null; }, get minHeightInput() { - return x.value?.minHeightInput ?? null; + return b.value?.minHeightInput ?? null; }, get maxWidthInput() { - return x.value?.maxWidthInput ?? null; + return b.value?.maxWidthInput ?? null; }, get maxHeightInput() { - return x.value?.maxHeightInput ?? null; + return b.value?.maxHeightInput ?? null; }, get dateRangeSelect() { - return x.value?.dateRangeSelect ?? null; + return b.value?.dateRangeSelect ?? null; }, get dateExactInput() { - return x.value?.dateExactInput ?? null; + return b.value?.dateExactInput ?? null; }, get agendaContainer() { - return x.value?.agendaContainer ?? null; + return b.value?.agendaContainer ?? null; }, get sortPopover() { - return b.value?.$el ?? null; + return y.value?.$el ?? null; }, sortMenu: document.createElement("div"), get collectionsPopover() { - return S.value?.$el ?? null; + return x.value?.$el ?? null; }, get refreshCollectionsPopover() { - return S.value?.refresh ?? null; + return x.value?.refresh ?? null; }, get pinnedFoldersPopover() { - return C.value?.$el ?? null; + return S.value?.$el ?? null; }, get pinnedFoldersController() { - return C.value ?? null; + return S.value ?? null; }, get pinnedFoldersMenu() { - return C.value?.pinnedFoldersMenu ?? null; + return S.value?.pinnedFoldersMenu ?? null; }, get messagePopover() { - return T.value?.$el ?? null; + return w.value?.$el ?? null; }, get messagePopoverTitle() { - return T.value?.title ?? null; + return w.value?.title ?? null; }, get messageTabBtn() { - return T.value?.messageTabBtn ?? null; + return w.value?.messageTabBtn ?? null; }, get messageTabBadge() { - return T.value?.messageTabBadge ?? null; + return w.value?.messageTabBadge ?? null; }, get historyTabBtn() { - return T.value?.historyTabBtn ?? null; + return w.value?.historyTabBtn ?? null; }, get historyTabBadge() { - return T.value?.historyTabBadge ?? null; + return w.value?.historyTabBadge ?? null; }, get historyTabCount() { - return T.value?.historyTabCount ?? null; + return w.value?.historyTabCount ?? null; }, get historyPanel() { - return T.value?.historyPanel ?? null; + return w.value?.historyPanel ?? null; }, get shortcutsTabBtn() { - return T.value?.shortcutsTabBtn ?? null; + return w.value?.shortcutsTabBtn ?? null; }, get messageList() { - return T.value?.messageList ?? null; + return w.value?.messageList ?? null; }, get shortcutsPanel() { - return T.value?.shortcutsPanel ?? null; + return w.value?.shortcutsPanel ?? null; }, get markReadBtn() { - return T.value?.markReadBtn ?? null; + return w.value?.markReadBtn ?? null; }, get searchSection() { - return y.value?.searchSection ?? null; + return v.value?.searchSection ?? null; }, get searchInputEl() { - return y.value?.searchInputEl ?? null; + return v.value?.searchInputEl ?? null; }, get similarBtn() { - return y.value?.similarBtn ?? null; + return v.value?.similarBtn ?? null; }, setSemanticEnabled(e) { - y.value?.setSemanticEnabled?.(e); + v.value?.setSemanticEnabled?.(e); }, - _headerDispose: be + _headerDispose: ve }), (e, t) => { - let n = Ln("MButton"); - return H(), G(In, null, [W("div", { + let n = Rn("MButton"); + return W(), q(Ln, null, [K("div", { ref_key: "headerRef", - ref: u, + ref: l, class: "mjr-am-header" - }, [W("div", Gb, [W("div", Kb, [ - t[2] ||= W("i", { + }, [K("div", Yb, [K("div", Xb, [ + t[2] ||= K("i", { class: "mjr-am-header-icon pi pi-folder", "aria-hidden": "true" }, null, -1), - W("div", qb, q(J(r)("manager.title")), 1), - W("a", { + K("div", Zb, Y(X(R)("manager.title")), 1), + K("a", { href: "https://ko-fi.com/majoorwaldi", target: "_blank", rel: "noopener noreferrer", class: "mjr-am-version-badge", - "data-mjr-version-channel": N.value, - title: J(r)("tooltip.supportKofi"), - style: An(oe.value), - onMouseenter: t[0] ||= (e) => ee.value = !0, - onMouseleave: t[1] ||= (e) => ee.value = !1 - }, [W("span", { class: Mn(rx) }, q(M.value), 1), W("span", { + "data-mjr-version-channel": M.value, + title: X(R)("tooltip.supportKofi"), + style: An(ie.value), + onMouseenter: t[0] ||= (e) => P.value = !0, + onMouseleave: t[1] ||= (e) => P.value = !1 + }, [K("span", { class: Mn(sx) }, Y(j.value), 1), K("span", { "aria-hidden": "true", style: An({ position: "absolute", @@ -28435,120 +28249,120 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite borderRadius: "50%", background: "#f44336", boxShadow: "0 0 0 1px rgba(255,255,255,0.6)", - display: F.value ? "block" : "none", + display: N.value ? "block" : "none", pointerEvents: "none" }) - }, null, 4)], 44, Jb) - ]), W("div", { + }, null, 4)], 44, Qb) + ]), K("div", { ref_key: "headerActionsRef", - ref: d, + ref: u, class: "mjr-am-header-actions" - }, [W("div", Yb, [ - V(n, { + }, [K("div", $b, [ + U(n, { ref_key: "tabAllRef", - ref: E, + ref: T, type: "button", - class: Mn(["mjr-tab", { "is-active": re.value === "all" }]), + class: Mn(["mjr-tab", { "is-active": ee.value === "all" }]), severity: "secondary", text: "", "data-scope": "all", - title: J(r)("tooltip.tab.all") + title: X(R)("tooltip.tab.all") }, { - default: U(() => [gn(q(J(r)("tab.all")), 1)]), + default: G(() => [gn(Y(X(R)("tab.all")), 1)]), _: 1 }, 8, ["class", "title"]), - V(n, { + U(n, { ref_key: "tabInputsRef", - ref: D, + ref: E, type: "button", - class: Mn(["mjr-tab", { "is-active": re.value === "input" }]), + class: Mn(["mjr-tab", { "is-active": ee.value === "input" }]), severity: "secondary", text: "", "data-scope": "input", - title: J(r)("tooltip.tab.input") + title: X(R)("tooltip.tab.input") }, { - default: U(() => [gn(q(J(r)("tab.input")), 1)]), + default: G(() => [gn(Y(X(R)("tab.input")), 1)]), _: 1 }, 8, ["class", "title"]), - V(n, { + U(n, { ref_key: "tabOutputsRef", - ref: O, + ref: D, type: "button", - class: Mn(["mjr-tab", { "is-active": re.value === "output" }]), + class: Mn(["mjr-tab", { "is-active": ee.value === "output" }]), severity: "secondary", text: "", "data-scope": "output", - title: J(r)("tooltip.tab.output") + title: X(R)("tooltip.tab.output") }, { - default: U(() => [gn(q(J(r)("tab.output")), 1)]), + default: G(() => [gn(Y(X(R)("tab.output")), 1)]), _: 1 }, 8, ["class", "title"]), - V(n, { + U(n, { ref_key: "tabCustomRef", - ref: k, + ref: O, type: "button", - class: Mn(["mjr-tab", { "is-active": re.value === "custom" }]), + class: Mn(["mjr-tab", { "is-active": ee.value === "custom" }]), severity: "secondary", text: "", "data-scope": "custom", - title: J(r)("tooltip.tab.custom") + title: X(R)("tooltip.tab.custom") }, { - default: U(() => [gn(q(J(r)("tab.custom")), 1)]), + default: G(() => [gn(Y(X(R)("tab.custom")), 1)]), _: 1 }, 8, ["class", "title"]), - V(n, { + U(n, { ref_key: "tabSimilarRef", - ref: A, + ref: k, type: "button", - class: Mn(["mjr-tab", { "is-active": re.value === "similar" }]), + class: Mn(["mjr-tab", { "is-active": ee.value === "similar" }]), severity: "secondary", text: "", "data-scope": "similar", - style: An({ display: ie.value ? "" : "none" }), - title: J(r)("tooltip.tab.similar", "Browse current similar findings") + style: An({ display: te.value ? "" : "none" }), + title: X(R)("tooltip.tab.similar", "Browse current similar findings") }, { - default: U(() => [gn(q(J(r)("tab.similar", "Similar")), 1)]), + default: G(() => [gn(Y(X(R)("tab.similar", "Similar")), 1)]), _: 1 }, 8, [ "class", "style", "title" ]) - ]), W("div", Xb, [ - W("div", Zb, [V(n, { + ]), K("div", ex, [ + K("div", tx, [U(n, { ref_key: "customMenuBtnRef", - ref: f, + ref: d, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", - title: J(r)("tooltip.browserFolders"), - "aria-label": J(r)("tooltip.browserFolders") + title: X(R)("tooltip.browserFolders"), + "aria-label": X(R)("tooltip.browserFolders") }, { - default: U(() => [...t[3] ||= [W("i", { + default: G(() => [...t[3] ||= [K("i", { class: "pi pi-folder-open", "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), V(Pb, { + }, 8, ["title", "aria-label"]), U(Rb, { ref_key: "customPopoverRef", - ref: w + ref: C }, null, 512)]), - V(n, { + U(n, { ref_key: "mfvBtnRef", - ref: _, + ref: g, type: "button", - class: Mn(["mjr-icon-btn", { "mjr-mfv-btn-active": te.value }]), + class: Mn(["mjr-icon-btn", { "mjr-mfv-btn-active": F.value }]), severity: "secondary", text: "", rounded: "", - title: se.value, - "aria-label": se.value, - onClick: ve + title: ae.value, + "aria-label": ae.value, + onClick: ge }, { - default: U(() => [W("i", { - class: Mn(ce.value), + default: G(() => [K("i", { + class: Mn(oe.value), "aria-hidden": "true" }, null, 2)]), _: 1 @@ -28557,154 +28371,154 @@ var Zy = { class: "mjr-menu mjr-collections-menu" }, Qy = { class: "mjr-menu-ite "title", "aria-label" ]), - W("div", Qb, [V(n, { + K("div", nx, [U(n, { ref_key: "messageBtnRef", - ref: v, + ref: _, type: "button", class: "mjr-icon-btn mjr-message-btn", severity: "secondary", text: "", rounded: "", - title: J(r)("tooltip.openMessages", "Messages and updates"), - "aria-label": J(r)("tooltip.openMessages", "Messages and updates") + title: X(R)("tooltip.openMessages", "Messages and updates"), + "aria-label": X(R)("tooltip.openMessages", "Messages and updates") }, { - default: U(() => [...t[4] ||= [W("i", { + default: G(() => [...t[4] ||= [K("i", { class: "pi pi-info-circle", "aria-hidden": "true" - }, null, -1), W("span", { + }, null, -1), K("span", { class: "mjr-message-badge", style: { display: "none" }, "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), V(Wb, { + }, 8, ["title", "aria-label"]), U(Jb, { ref_key: "messagePopoverRef", - ref: T + ref: w }, null, 512)]), - V(n, { + U(n, { type: "button", class: "mjr-icon-btn mjr-settings-shortcut-btn", severity: "secondary", text: "", rounded: "", - title: le.value, - "aria-label": le.value, - onClick: ye + title: se.value, + "aria-label": se.value, + onClick: _e }, { - default: U(() => [...t[5] ||= [W("i", { + default: G(() => [...t[5] ||= [K("i", { class: "pi pi-cog", "aria-hidden": "true" }, null, -1)]]), _: 1 }, 8, ["title", "aria-label"]) - ])], 512)])], 512), V(sy, { + ])], 512)])], 512), U($v, { ref_key: "searchBarRef", - ref: y + ref: v }, { - "filter-anchor": U(() => [W("div", $b, [V(n, { + "filter-anchor": G(() => [K("div", rx, [U(n, { ref_key: "filterBtnRef", + ref: f, + type: "button", + class: "mjr-icon-btn", + severity: "secondary", + text: "", + rounded: "", + title: X(R)("label.filters"), + "aria-label": X(R)("label.filters") + }, { + default: G(() => [...t[6] ||= [K("i", { + class: "pi pi-filter", + "aria-hidden": "true" + }, null, -1)]]), + _: 1 + }, 8, ["title", "aria-label"]), U(Ky, { + ref_key: "filterPopoverRef", + ref: b + }, null, 512)])]), + "sort-anchor": G(() => [K("div", ix, [U(n, { + ref_key: "sortBtnRef", ref: p, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", - title: J(r)("label.filters"), - "aria-label": J(r)("label.filters") + title: X(R)("label.sort"), + "aria-label": X(R)("label.sort") }, { - default: U(() => [...t[6] ||= [W("i", { - class: "pi pi-filter", + default: G(() => [K("i", { + class: Mn(I.value), "aria-hidden": "true" - }, null, -1)]]), + }, null, 2)]), _: 1 - }, 8, ["title", "aria-label"]), V(Hy, { - ref_key: "filterPopoverRef", - ref: x + }, 8, ["title", "aria-label"]), U(ny, { + ref_key: "sortPopoverRef", + ref: y }, null, 512)])]), - "sort-anchor": U(() => [W("div", ex, [V(n, { - ref_key: "sortBtnRef", + "collections-anchor": G(() => [K("div", ax, [U(n, { + ref_key: "collectionsBtnRef", ref: m, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", - title: J(r)("label.sort"), - "aria-label": J(r)("label.sort") + title: X(R)("label.collections"), + "aria-label": X(R)("label.collections") }, { - default: U(() => [W("i", { - class: Mn(ne.value), + default: G(() => [...t[7] ||= [K("i", { + class: "pi pi-bookmark", "aria-hidden": "true" - }, null, 2)]), + }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), V(uy, { - ref_key: "sortPopoverRef", - ref: b + }, 8, ["title", "aria-label"]), U(Db, { + ref_key: "collectionsPopoverRef", + ref: x }, null, 512)])]), - "collections-anchor": U(() => [W("div", tx, [V(n, { - ref_key: "collectionsBtnRef", + "pinned-folders-anchor": G(() => [K("div", ox, [U(n, { + ref_key: "pinnedFoldersBtnRef", ref: h, type: "button", class: "mjr-icon-btn", severity: "secondary", text: "", rounded: "", - title: J(r)("label.collections"), - "aria-label": J(r)("label.collections") + title: X(R)("tooltip.pinnedFolders"), + "aria-label": X(R)("tooltip.pinnedFolders") }, { - default: U(() => [...t[7] ||= [W("i", { - class: "pi pi-bookmark", - "aria-hidden": "true" - }, null, -1)]]), - _: 1 - }, 8, ["title", "aria-label"]), V(Cb, { - ref_key: "collectionsPopoverRef", - ref: S - }, null, 512)])]), - "pinned-folders-anchor": U(() => [W("div", nx, [V(n, { - ref_key: "pinnedFoldersBtnRef", - ref: g, - type: "button", - class: "mjr-icon-btn", - severity: "secondary", - text: "", - rounded: "", - title: J(r)("tooltip.pinnedFolders"), - "aria-label": J(r)("tooltip.pinnedFolders") - }, { - default: U(() => [...t[8] ||= [W("i", { + default: G(() => [...t[8] ||= [K("i", { class: "pi pi-folder", "aria-hidden": "true" }, null, -1)]]), _: 1 - }, 8, ["title", "aria-label"]), V(kb, { + }, 8, ["title", "aria-label"]), U(Nb, { ref_key: "pinnedFoldersPopoverRef", - ref: C + ref: S }, null, 512)])]), _: 1 }, 512)], 64); }; } -}, ox = (e) => { +}, ux = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, sx = (e) => { +}, dx = (e) => { let t = String(e || ""); - return r(t === "name_asc" ? "sort.nameAZ" : t === "name_desc" ? "sort.nameZA" : t === "mtime_asc" ? "sort.oldest" : "sort.newest"); -}, cx = (e) => { + return R(t === "name_asc" ? "sort.nameAZ" : t === "name_desc" ? "sort.nameZA" : t === "mtime_asc" ? "sort.oldest" : "sort.newest"); +}, fx = (e) => { let t = String(e || "").toLowerCase(); - return t === "similar" ? r("scope.similar", "Similar") : r(t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : t === "input" || t === "inputs" ? "scope.input" : "scope.output"); + return t === "similar" ? R("scope.similar", "Similar") : R(t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : t === "input" || t === "inputs" ? "scope.input" : "scope.output"); }; -function lx({ label: e, value: t, onClear: n } = {}) { - let i = document.createElement("div"); - i.className = "mjr-context-pill"; - let a = document.createElement("span"); - if (a.className = "mjr-context-pill-text", a.textContent = t != null && String(t).length ? `${e}: ${String(t)}` : String(e || ""), i.appendChild(a), typeof n == "function") { +function px({ label: e, value: t, onClear: n } = {}) { + let r = document.createElement("div"); + r.className = "mjr-context-pill"; + let i = document.createElement("span"); + if (i.className = "mjr-context-pill-text", i.textContent = t != null && String(t).length ? `${e}: ${String(t)}` : String(e || ""), r.appendChild(i), typeof n == "function") { let t = document.createElement("button"); - t.type = "button", t.className = "mjr-context-pill-x", t.title = r("tooltip.clearFilter", { label: e || r("label.filters") }), t.setAttribute("aria-label", r("tooltip.clearFilter", { label: e || r("label.filters") })), t.textContent = "x", t.addEventListener("click", (e) => { + t.type = "button", t.className = "mjr-context-pill-x", t.title = R("tooltip.clearFilter", { label: e || R("label.filters") }), t.setAttribute("aria-label", R("tooltip.clearFilter", { label: e || R("label.filters") })), t.textContent = "x", t.addEventListener("click", (e) => { try { e.preventDefault(), e.stopPropagation(); } catch (e) { @@ -28715,82 +28529,90 @@ function lx({ label: e, value: t, onClear: n } = {}) { } catch (e) { console.debug?.(e); } - }), i.appendChild(t); + }), r.appendChild(t); } - return i; + return r; } -function ux() { +function mx() { let e = document.createElement("div"); return e.className = "mjr-am-context-pills", { wrap: e, - update: ({ state: t, rawQuery: n = "", actions: i = null } = {}) => { - let a = i && typeof i == "object" ? i : {}, o = ox(n || "").trim(), s = o.length > 0 && o !== "*", c = !!(ox(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 || ox(t?.workflowType || "").trim() || ox(t?.dateRangeFilter || "").trim() || ox(t?.dateExactFilter || "").trim()), l = ox(t?.sort || "mtime_desc").trim() !== "mtime_desc", u = ox(t?.collectionId || "").trim().length > 0, d = String(t?.viewScope || t?.scope || "output").toLowerCase(), f = d === "similar", p = d === "custom", m = d !== "output", h = ox(t?.similarSourceAssetId || "").trim(); - if (!(!(s || c || l || u || m || f) && !e.childElementCount)) { + update: ({ state: t, rawQuery: n = "", actions: r = null } = {}) => { + let i = r && typeof r == "object" ? r : {}, a = ux(n || "").trim(), o = a.length > 0 && a !== "*", s = !!(ux(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 || ux(t?.workflowType || "").trim() || ux(t?.workflowId || "").trim() || ux(t?.dateRangeFilter || "").trim() || ux(t?.dateExactFilter || "").trim()), c = ux(t?.sort || "mtime_desc").trim() !== "mtime_desc", l = ux(t?.collectionId || "").trim().length > 0, u = String(t?.viewScope || t?.scope || "output").toLowerCase(), d = u === "similar", f = u === "custom", p = u !== "output", m = ux(t?.similarSourceAssetId || "").trim(); + if (!(!(o || s || c || l || p || d) && !e.childElementCount)) { try { e.replaceChildren(); } catch (e) { console.debug?.(e); } - if (!p && u && e.appendChild(lx({ - label: r("label.collections"), - value: ox(t?.collectionName || t?.collectionId || "").trim(), - onClear: () => a?.clearCollection?.() - })), f && e.appendChild(lx({ - label: r("search.findSimilar", "Find Similar"), - value: h ? r("search.similarReference", "Reference #{id}", { id: h }) : r("scope.similar", "Similar"), - onClear: () => a?.clearSimilarScope?.() - })), m && e.appendChild(lx({ - label: r("label.scope"), - value: cx(d || "output"), - onClear: () => f ? a?.clearSimilarScope?.() : a?.clearScope?.() - })), s && e.appendChild(lx({ - label: r("label.query"), - value: o, - onClear: () => a?.clearQuery?.() - })), ox(t?.kindFilter || "").trim() && e.appendChild(lx({ - label: r("label.type"), - value: ox(t?.kindFilter || "").trim(), - onClear: () => a?.clearKind?.() - })), Number(t?.minRating || 0) > 0 && e.appendChild(lx({ - label: r("label.rating"), + if (!f && l && e.appendChild(px({ + label: R("label.collections"), + value: ux(t?.collectionName || t?.collectionId || "").trim(), + onClear: () => i?.clearCollection?.() + })), d && e.appendChild(px({ + 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(px({ + label: R("label.scope"), + value: fx(u || "output"), + onClear: () => d ? i?.clearSimilarScope?.() : i?.clearScope?.() + })), o && e.appendChild(px({ + label: R("label.query"), + value: a, + onClear: () => i?.clearQuery?.() + })), ux(t?.kindFilter || "").trim() && e.appendChild(px({ + label: R("label.type"), + value: ux(t?.kindFilter || "").trim(), + onClear: () => i?.clearKind?.() + })), Number(t?.minRating || 0) > 0 && e.appendChild(px({ + label: R("label.rating"), value: `>= ${Number(t?.minRating || 0)}`, - onClear: () => a?.clearMinRating?.() - })), t?.workflowOnly && e.appendChild(lx({ - label: r("label.workflow"), - value: r("label.only"), - onClear: () => a?.clearWorkflowOnly?.() - })), ox(t?.workflowType || "").trim() && e.appendChild(lx({ - label: r("label.workflowType"), - value: ox(t?.workflowType || "").trim(), - onClear: () => a?.clearWorkflowType?.() - })), (Number(t?.minSizeMB || 0) || 0) > 0 || (Number(t?.maxSizeMB || 0) || 0) > 0) { - let n = Number(t?.minSizeMB || 0) || 0, i = Number(t?.maxSizeMB || 0) || 0, o = n > 0 && i > 0 ? `${n}-${i} MB` : n > 0 ? `>= ${n} MB` : `<= ${i} MB`; - e.appendChild(lx({ - label: r("sidebar.size"), - value: o, - onClear: () => a?.clearSize?.() + onClear: () => i?.clearMinRating?.() + })), t?.workflowOnly && e.appendChild(px({ + label: R("label.workflow"), + value: R("label.only"), + onClear: () => i?.clearWorkflowOnly?.() + })), ux(t?.workflowType || "").trim() && e.appendChild(px({ + label: R("label.workflowType"), + value: ux(t?.workflowType || "").trim(), + onClear: () => i?.clearWorkflowType?.() + })), ux(t?.workflowId || "").trim()) { + let n = ux(t?.workflowId || "").trim(); + e.appendChild(px({ + label: R("label.sameWorkflow", "Generated with Same Workflow"), + value: n.length > 18 ? `${n.slice(0, 8)}...${n.slice(-6)}` : n, + onClear: () => i?.clearWorkflowId?.() + })); + } + if ((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(px({ + label: R("sidebar.size"), + value: a, + onClear: () => i?.clearSize?.() })); } 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", i = Number(n ? t?.maxWidth : t?.minWidth || 0) || 0, o = Number(n ? t?.maxHeight : t?.minHeight || 0) || 0; - e.appendChild(lx({ - label: r("label.resolution"), - value: `${n ? "<=" : ">="} ${i || 0}x${o || 0} px`, - onClear: () => a?.clearResolution?.() + 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(px({ + label: R("label.resolution"), + value: `${n ? "<=" : ">="} ${r || 0}x${a || 0} px`, + onClear: () => i?.clearResolution?.() })); } - ox(t?.dateRangeFilter || "").trim() && e.appendChild(lx({ - label: r("sidebar.date"), - value: ox(t?.dateRangeFilter || "").trim(), - onClear: () => a?.clearDateRange?.() - })), ox(t?.dateExactFilter || "").trim() && e.appendChild(lx({ - label: r("label.day"), - value: ox(t?.dateExactFilter || "").trim(), - onClear: () => a?.clearDateExact?.() - })), l && e.appendChild(lx({ - label: r("label.sort"), - value: sx(t?.sort), - onClear: () => a?.clearSort?.() + ux(t?.dateRangeFilter || "").trim() && e.appendChild(px({ + label: R("sidebar.date"), + value: ux(t?.dateRangeFilter || "").trim(), + onClear: () => i?.clearDateRange?.() + })), ux(t?.dateExactFilter || "").trim() && e.appendChild(px({ + label: R("label.day"), + value: ux(t?.dateExactFilter || "").trim(), + onClear: () => i?.clearDateExact?.() + })), c && e.appendChild(px({ + label: R("label.sort"), + value: dx(t?.sort), + onClear: () => i?.clearSort?.() })); } } @@ -28798,17 +28620,17 @@ function ux() { } //#endregion //#region ui/vue/components/panel/summaryBarState.ts -var dx = (e, t = "") => r(e, t, void 0), fx = (e) => { +var hx = (e, t = "") => R(e, t, void 0), gx = (e) => { try { return String(e ?? ""); } catch { return ""; } -}, px = (e) => { +}, _x = (e) => { let t = String(e || "").toLowerCase(); - return t === "similar" ? dx("scope.similar", "Similar") : dx(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); + return t === "similar" ? hx("scope.similar", "Similar") : hx(t === "input" || t === "inputs" ? "scope.input" : t === "custom" ? "scope.customBrowser" : t === "all" ? "tab.all" : "scope.output"); }; -function mx(e) { +function vx(e) { try { let t = e?._mjrGetRenderedCards; if (typeof t == "function") { @@ -28820,7 +28642,7 @@ function mx(e) { } return []; } -function hx(e) { +function yx(e) { try { let t = String(e?.dataset?.mjrSelectedAssetIds || "").trim(); if (t) { @@ -28837,8 +28659,8 @@ function hx(e) { } return 0; } -function gx({ state: e, gridContainer: t, context: n = null } = {}) { - let r = mx(t), i = (() => { +function bx({ state: e, gridContainer: t, context: n = null } = {}) { + let r = vx(t), i = (() => { try { let e = 0; for (let t of r) String(t?._mjrAsset?.kind || "").toLowerCase() === "folder" && (e += 1); @@ -28859,12 +28681,12 @@ function gx({ state: e, gridContainer: t, context: n = null } = {}) { } catch (e) { console.debug?.(e); } - return hx(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 ? dx("summary.folders") : dx("summary.assets")}: ${u}`]; - o > 0 && d.push(`${dx("summary.selected")}: ${o}`), d.push(px(l)); + return yx(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 ? hx("summary.folders") : hx("summary.assets")}: ${u}`]; + o > 0 && d.push(`${hx("summary.selected")}: ${o}`), d.push(_x(l)); try { let e = Number(t?.dataset?.mjrHiddenPngSiblings || 0) || 0; - String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${dx("summary.hidden")}: ${e}`); + String(t?.dataset?.mjrHidePngSiblingsEnabled || "") === "1" && e > 0 && d.push(`${hx("summary.hidden")}: ${e}`); } catch (e) { console.debug?.(e); } @@ -28874,23 +28696,23 @@ function gx({ state: e, gridContainer: t, context: n = null } = {}) { total: s, activeScope: l, summaryText: d.filter(Boolean).join(" | "), - duplicateText: h ? `${dx("summary.duplicates")}: ${p} | ${dx("summary.similar")}: ${m}` : "", + duplicateText: h ? `${hx("summary.duplicates")}: ${p} | ${hx("summary.similar")}: ${m}` : "", showDuplicates: h, - rawQuery: fx(n?.rawQuery || "").trim() + rawQuery: gx(n?.rawQuery || "").trim() }; } //#endregion //#region ui/vue/components/panel/SummaryBarSection.vue -var _x = { +var xx = { key: 2, class: "mjr-folder-breadcrumb-separator" -}, vx = { +}, Sx = { key: 0, class: "mjr-folder-breadcrumb-separator" -}, yx = { class: "mjr-am-summary-left" }, bx = { class: "mjr-am-summary-text" }, xx = { class: "mjr-am-summary-right" }, Sx = /* @__PURE__ */ Il({ +}, Cx = { class: "mjr-am-summary-left" }, wx = { class: "mjr-am-summary-text" }, Tx = { class: "mjr-am-summary-right" }, Ex = /* @__PURE__ */ Rl({ __name: "SummaryBarSection", setup(e, { expose: t }) { - let n = $g(), r = K(null), i = K(null), a = K(null), o = K(""), s = K(""), c = K(!1), l = K(!1), u = K(null), d = K(null), f = K([]), p = ux(), m = null; + let n = Ut(), r = J(null), i = J(null), a = J(null), o = J(""), s = J(""), c = J(!1), l = J(!1), u = J(null), d = J(null), f = J([]), p = mx(), m = null; function h() { try { m?.(); @@ -28899,7 +28721,7 @@ var _x = { } } function g({ state: e, gridContainer: t, context: r = null, actions: i = null } = {}) { - let a = gx({ + let a = bx({ state: e, gridContainer: t, context: r @@ -28949,14 +28771,14 @@ var _x = { folderBreadcrumb: i, setFolderBreadcrumb: _ }), (e, t) => { - let n = Ln("MButton"); - return H(), G(In, null, [W("div", { + let n = Rn("MButton"); + return W(), q(Ln, null, [K("div", { ref_key: "folderBreadcrumb", ref: i, class: Mn(["mjr-folder-breadcrumb", { "is-visible": l.value }]), "aria-label": "Folder breadcrumb" }, [ - u.value ? (H(), hn(n, { + u.value ? (W(), hn(n, { key: 0, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -28965,10 +28787,10 @@ var _x = { disabled: u.value.disabled, onClick: t[0] ||= (e) => v(u.value) }, { - default: U(() => [gn(q(u.value.label), 1)]), + default: G(() => [gn(Y(u.value.label), 1)]), _: 1 - }, 8, ["disabled"])) : Y("", !0), - d.value ? (H(), hn(n, { + }, 8, ["disabled"])) : In("", !0), + d.value ? (W(), hn(n, { key: 1, type: "button", class: "mjr-btn-link mjr-folder-breadcrumb-action", @@ -28977,11 +28799,11 @@ var _x = { disabled: d.value.disabled, onClick: t[1] ||= (e) => v(d.value) }, { - default: U(() => [gn(q(d.value.label), 1)]), + default: G(() => [gn(Y(d.value.label), 1)]), _: 1 - }, 8, ["disabled"])) : Y("", !0), - u.value || d.value ? (H(), G("span", _x, " | ")) : Y("", !0), - (H(!0), G(In, null, vn(f.value, (e, t) => (H(), G(In, { key: `${e.target}:${t}` }, [t > 0 ? (H(), G("span", vx, "/")) : Y("", !0), V(n, { + }, 8, ["disabled"])) : In("", !0), + u.value || d.value ? (W(), q("span", xx, " | ")) : In("", !0), + (W(!0), q(Ln, null, vn(f.value, (e, t) => (W(), q(Ln, { key: `${e.target}:${t}` }, [t > 0 ? (W(), q("span", Sx, "/")) : In("", !0), U(n, { type: "button", class: Mn(["mjr-btn-link mjr-folder-breadcrumb-segment", { "is-current": e.current }]), severity: "secondary", @@ -28989,19 +28811,19 @@ var _x = { disabled: e.current, onClick: (t) => v(e) }, { - default: U(() => [gn(q(e.label), 1)]), + default: G(() => [gn(Y(e.label), 1)]), _: 2 }, 1032, [ "class", "disabled", "onClick" ])], 64))), 128)) - ], 2), W("div", { + ], 2), K("div", { ref_key: "summaryBar", ref: r, class: "mjr-am-summary", "aria-live": "polite" - }, [W("div", yx, [W("div", bx, q(o.value), 1)]), W("div", xx, [c.value ? (H(), hn(n, { + }, [K("div", Cx, [K("div", wx, Y(o.value), 1)]), K("div", Tx, [c.value ? (W(), hn(n, { key: 0, type: "button", class: "mjr-am-dup-alert", @@ -29018,9 +28840,9 @@ var _x = { }, onClick: h }, { - default: U(() => [gn(q(s.value), 1)]), + default: G(() => [gn(Y(s.value), 1)]), _: 1 - }, 8, ["title"])) : Y("", !0), W("div", { + }, 8, ["title"])) : In("", !0), K("div", { ref_key: "pillsHost", ref: a }, null, 512)])], 512)], 64); @@ -29029,11 +28851,11 @@ var _x = { }, [["__scopeId", "data-v-0bf75dfa"]]); //#endregion //#region ui/vue/composables/useGridContextMenu.ts -function Cx(e, t) { +function Dx(e, t) { let n = null; function r(e) { if (!(!e || e._mjrGridContextMenuBound)) try { - n = oc({ + n = cc({ gridContainer: e, getState: t }); @@ -29053,11 +28875,11 @@ function Cx(e, t) { } //#endregion //#region ui/vue/composables/useGridKeyboard.ts -function wx(e) { +function Ox(e) { if (!e) return () => {}; let t = e; try { - let n = lo({ + let n = fo({ gridContainer: e, getState: () => t._mjrGetGridState?.() || {}, getSelectedAssets: () => t._mjrGetSelectedAssets?.() || [], @@ -29081,7 +28903,7 @@ function wx(e) { return console.debug?.("[useGridKeyboard] bind failed", e), () => {}; } } -function Tx(e) { +function kx(e) { let t = null, n = () => { try { t?.(); @@ -29091,13 +28913,13 @@ function Tx(e) { t = null; }; mn(e, (e, r) => { - r && n(), e && (t = wx(e)); + r && n(), e && (t = Ox(e)); }, { immediate: !0 }), Sn(n); } //#endregion //#region ui/vue/components/grid/assetsGridHostState.ts -function Ex() {} -function Dx() { +function Ax() {} +function jx() { return new Promise((e) => { try { if (typeof requestAnimationFrame == "function") { @@ -29110,7 +28932,7 @@ function Dx() { e(); }); } -function Ox(e, ...t) { +function Mx(e, ...t) { try { return typeof e == "function" ? e(...t) : void 0; } catch (e) { @@ -29118,21 +28940,21 @@ function Ox(e, ...t) { return; } } -function kx(e = {}) { +function Nx(e = {}) { let t = Array.isArray(e.selectedIds) ? e.selectedIds.map(String).filter(Boolean) : []; return { ids: t, activeId: String(e.activeId || t[0] || "").trim() }; } -function Ax(e, t = {}, n = null) { +function Px(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 jx(e, t = e_()) { - if (!e || !t) return Ex; +function Fx(e, t = Kg()) { + if (!e || !t) return Ax; let n = 0, r = () => { if (!n) try { n = requestAnimationFrame(() => { @@ -29158,8 +28980,8 @@ function jx(e, t = e_()) { } }; } -function Mx(e, { panelStore: t = e_(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { - if (!e) return Ex; +function Ix(e, { panelStore: t = Kg(), onContextChanged: n = null, markUserInteraction: r = null } = {}) { + if (!e) return Ax; let i = 0, a = () => { if (i) try { cancelAnimationFrame(i); @@ -29168,24 +28990,24 @@ function Mx(e, { panelStore: t = e_(), onContextChanged: n = null, markUserInter } try { i = requestAnimationFrame(() => { - i = 0, Ox(n); + i = 0, Mx(n); }); } catch (e) { - console.debug?.(e), i = 0, Ox(n); + console.debug?.(e), i = 0, Mx(n); } }, o = (r) => { let i = r?.detail || {}; if (t) { - let { count: n, total: r } = Ax(e, i, t); + let { count: n, total: r } = Px(e, i, t); t.lastGridCount = n, t.lastGridTotal = r; } - Ox(n); + Mx(n); }, s = (e) => { - if (Ox(r), t) { - let { ids: n, activeId: r } = kx(e?.detail || {}); + if (Mx(r), t) { + let { ids: n, activeId: r } = Nx(e?.detail || {}); t.selectedAssetIds = n, t.activeAssetId = r; } - Ox(n); + Mx(n); }; e.addEventListener("mjr:grid-stats", o), e.addEventListener("mjr:selection-changed", s); try { @@ -29233,14 +29055,14 @@ function Mx(e, { panelStore: t = e_(), onContextChanged: n = null, markUserInter } }; } -async function Nx({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = e_(), onRestoreSidebar: i = null } = {}) { +async function Lx({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, panelStore: r = Kg(), onRestoreSidebar: i = null } = {}) { if (!t || !n || !r) return; try { await e; } catch (e) { console.debug?.(e); } - await Dx(); + await jx(); let a = Number(r.scrollTop || 0) || 0; if (a > 0) try { t.scrollTop = a; @@ -29257,7 +29079,7 @@ async function Nx({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan if (s) { let e = () => { try { - typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : jd(n, s)?.scrollIntoView?.({ + typeof n?._mjrScrollToAssetId == "function" ? n._mjrScrollToAssetId(s) : Nd(n, s)?.scrollIntoView?.({ block: "nearest", behavior: "instant" }); @@ -29268,14 +29090,14 @@ async function Nx({ initialLoadPromise: e, gridWrapper: t, gridContainer: n, pan e(), setTimeout(e, 160); } } - r.sidebarOpen && s && Ox(i); + r.sidebarOpen && s && Mx(i); } //#endregion //#region ui/vue/components/grid/AssetsGrid.vue -var Px = { +var Rx = { __name: "AssetsGrid", setup(e, { expose: t }) { - let n = K(null), r = K(null), i = K(null), a = $g(), o = X(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; + let n = J(null), r = J(null), i = J(null), a = Ut(), o = Z(() => i.value?.gridContainer ?? null), s = null, c = null, l = null, u = null; function d() { try { l?.setVisibility?.(); @@ -29286,7 +29108,7 @@ var Px = { function f() { try { let e = o.value; - e && He(e); + e && We(e); } catch (e) { console.debug?.(e); } @@ -29355,7 +29177,7 @@ var Px = { } }; } - _n("mjr-grid-container-ref", o), Cx(o, () => a), Tx(o); + _n("mjr-grid-container-ref", o), Dx(o, () => a), kx(o); function m() { return o.value || null; } @@ -29367,14 +29189,14 @@ var Px = { } catch (e) { console.debug?.(e); } - c = Mx(t, { + c = Ix(t, { panelStore: a, ...e }); } } return bn(() => { - s = jx(r.value, a), r.value && Number(a.scrollTop || 0) > 0 && (r.value.scrollTop = Number(a.scrollTop || 0)), p(); + s = Fx(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) { @@ -29383,7 +29205,7 @@ var Px = { d(); }), yn(() => { try { - Je(m()); + Ye(m()); } catch (e) { console.debug?.(e); } @@ -29418,12 +29240,12 @@ var Px = { } }), mn(o, (e, t) => { try { - t && t !== e && Je(t); + t && t !== e && Ye(t); } catch (e) { console.debug?.(e); } try { - e && He(e); + e && We(e); } catch (e) { console.debug?.(e); } @@ -29451,7 +29273,7 @@ var Px = { }; }, restoreGridUiState(e, t = {}) { - return Nx({ + return Lx({ initialLoadPromise: e, gridWrapper: r.value, gridContainer: m(), @@ -29467,7 +29289,7 @@ var Px = { } catch (e) { console.debug?.(e); } - return l = Av({ + return l = Sv({ gridContainer: t, gridWrapper: r.value, ...e @@ -29503,7 +29325,7 @@ var Px = { disposeGrid(...e) { return i.value?.dispose?.(...e); } - }), (e, t) => (H(), G("div", { + }), (e, t) => (W(), q("div", { ref_key: "browseSectionRef", ref: n, class: "mjr-am-browse", @@ -29513,7 +29335,7 @@ var Px = { "flex-direction": "row", overflow: "hidden" } - }, [W("div", { + }, [K("div", { ref_key: "gridWrapperRef", ref: r, class: "mjr-am-grid-scroll", @@ -29522,13 +29344,13 @@ var Px = { overflow: "auto", position: "relative" } - }, [V(Af, { + }, [U(Mf, { ref_key: "gridHostRef", ref: i, "scroll-element": r.value }, null, 8, ["scroll-element"])], 512)], 512)); } -}, Fx = { +}, zx = { class: "mjr-sidebar-header", style: { display: "flex", @@ -29539,7 +29361,7 @@ var Px = { "flex-shrink": "0", background: "var(--mjr-surface-2,#2e2e2e)" } -}, Ix = ["title"], Lx = { +}, Bx = ["title"], Vx = { __name: "SidebarHeaderSection", props: { asset: { type: Object, @@ -29549,8 +29371,8 @@ var Px = { setup(e, { emit: t }) { let n = t; return (t, r) => { - let i = Ln("MButton"); - return H(), G("div", Fx, [W("div", { + let i = Rn("MButton"); + return W(), q("div", zx, [K("div", { class: "mjr-sidebar-filename", title: e.asset.filename, style: { @@ -29563,7 +29385,7 @@ var Px = { "min-width": "0", "padding-right": "8px" } - }, q(e.asset.filename), 9, Ix), V(i, { + }, Y(e.asset.filename), 9, Bx), U(i, { type: "button", class: "mjr-sidebar-close", severity: "secondary", @@ -29587,7 +29409,7 @@ var Px = { 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: U(() => [...r[3] ||= [gn("×", -1)]]), + default: G(() => [...r[3] ||= [gn("×", -1)]]), _: 1 })]); }; @@ -29595,14 +29417,14 @@ var Px = { }; //#endregion //#region ui/components/sidebar/utils/format.ts -function Rx(e) { +function Hx(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 zx(e) { +function Ux(e) { if (!e) return ""; let t = /* @__PURE__ */ new Date(Number(e) * 1e3); if (Number.isNaN(t.getTime())) return ""; @@ -29611,13 +29433,13 @@ function zx(e) { } //#endregion //#region ui/vue/components/panel/sidebar/SidebarPreviewSection.vue -var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["src"], Wx = { +var Wx = { class: "mjr-sidebar-preview" }, Gx = ["src"], Kx = ["src"], qx = ["src"], Jx = { key: 3, style: { color: "rgba(255, 255, 255, 0.4)", "font-size": "14px" } -}, Gx = { +}, Yx = { class: "mjr-sidebar-preview-meta", style: { "margin-top": "10px", @@ -29631,7 +29453,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "padding-bottom": "12px", "border-bottom": "1px solid var(--mjr-border, rgba(255, 255, 255, 0.12))" } -}, Kx = { +}, Xx = { __name: "SidebarPreviewSection", props: { asset: { @@ -29644,15 +29466,15 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } }, setup(e) { - let t = e, n = K(null), r = null, i = X(() => De(t.asset) || ""), a = X(() => { + let t = e, n = J(null), r = null, i = Z(() => Fe(t.asset) || ""), a = Z(() => { let e = String(t.asset?.filename || ""), n = e.lastIndexOf("."); return n === -1 ? "" : e.slice(n + 1).toUpperCase(); - }), o = X(() => { + }), o = Z(() => { let e = []; a.value && e.push(a.value), t.asset?.kind && e.push(String(t.asset.kind).toLowerCase()); - let n = Rx(t.asset?.size); + let n = Hx(t.asset?.size); n && e.push(n); - let r = zx(t.asset?.mtime); + let r = Ux(t.asset?.mtime); return r && e.push(r), e.join(" • "); }); function s() { @@ -29696,7 +29518,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr l(); }), yn(() => { s(); - }), (t, r) => (H(), G("div", Bx, [e.showPreviewThumb ? (H(), G("div", { + }), (t, r) => (W(), q("div", Wx, [e.showPreviewThumb ? (W(), q("div", { key: 0, ref_key: "previewContainerRef", ref: n, @@ -29711,7 +29533,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "justify-content": "center", position: "relative" } - }, [e.asset.kind === "image" ? (H(), G("img", { + }, [e.asset.kind === "image" ? (W(), q("img", { key: 0, src: i.value, style: { @@ -29719,7 +29541,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Vx)) : e.asset.kind === "video" ? (H(), G("video", { + }, null, 8, Gx)) : e.asset.kind === "video" ? (W(), q("video", { key: 1, src: i.value, muted: !0, @@ -29732,7 +29554,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "max-height": "100%", "object-fit": "contain" } - }, null, 8, Hx)) : e.asset.kind === "audio" ? (H(), G("audio", { + }, null, 8, Kx)) : e.asset.kind === "audio" ? (W(), q("audio", { key: 2, src: i.value, controls: "", @@ -29741,9 +29563,9 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr width: "92%", "max-width": "560px" } - }, null, 8, Ux)) : (H(), G("div", Wx, q(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : Y("", !0), W("div", Gx, q(o.value), 1)])); + }, null, 8, qx)) : (W(), q("div", Jx, Y(String(e.asset.kind || "PREVIEW").toUpperCase()), 1))], 512)) : In("", !0), K("div", Yx, Y(o.value), 1)])); } -}, qx = { +}, Zx = { class: "mjr-sidebar-section", style: { background: "rgba(255, 255, 255, 0.03)", @@ -29751,15 +29573,22 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "border-radius": "8px", padding: "10px" } -}, Jx = { style: { +}, Qx = { style: { + "font-size": "12px", + "font-weight": "700", + color: "#26a69a", + "margin-bottom": "8px", + "text-transform": "uppercase", + "letter-spacing": "0.4px" +} }, $x = { style: { display: "flex", "flex-direction": "column", gap: "6px" -} }, Yx = { style: { +} }, eS = { style: { "font-size": "12px", opacity: "0.68", "min-width": "92px" -} }, Xx = ["title"], Zx = { +} }, tS = ["title"], nS = { __name: "SidebarFolderSection", props: { asset: { type: Object, @@ -29780,49 +29609,42 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr for (; r >= 1024 && i < n.length - 1;) r /= 1024, i += 1; return `${r.toFixed(+(i > 0))} ${n[i]}`; } - let r = X(() => { + let r = Z(() => { let e = t.asset || {}, r = e.folder_info || e.folderInfo || {}, i = String(r.path || e.filepath || e.subfolder || ""), a = String(r.name || e.filename || "").trim(), o = Number(r.files ?? 0), s = Number(r.folders ?? 0), c = Number(r.size ?? 0), l = Number(r.mtime ?? e.mtime ?? 0), u = Number(r.ctime ?? 0), d = !!r.truncated, f = [ { - label: "Name", + label: R("sidebar.folder.name", "Name"), value: a || "-" }, { - label: "Path", + label: R("sidebar.folder.path", "Path"), value: i || "-" }, { - label: "Folders", + label: R("sidebar.folder.folders", "Folders"), value: Number.isFinite(s) ? String(s) : "-" }, { - label: "Files", + label: R("sidebar.folder.files", "Files"), value: Number.isFinite(o) ? String(o) : "-" }, { - label: "Size", + label: R("sidebar.size", "Size"), value: n(c) } ]; return u > 0 && f.push({ - label: "Created", - value: `${Bt(u) || "-"} ${At(u) || ""}`.trim() + label: R("sidebar.folder.created", "Created"), + value: `${jt(u) || "-"} ${zt(u) || ""}`.trim() }), l > 0 && f.push({ - label: "Modified", - value: `${Bt(l) || "-"} ${At(l) || ""}`.trim() + label: R("sidebar.folder.modified", "Modified"), + value: `${jt(l) || "-"} ${zt(l) || ""}`.trim() }), d && f.push({ - label: "Note", - value: "Scan was truncated for performance", + 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) => (H(), G("div", qx, [t[0] ||= W("div", { style: { - "font-size": "12px", - "font-weight": "700", - color: "#26a69a", - "margin-bottom": "8px", - "text-transform": "uppercase", - "letter-spacing": "0.4px" - } }, " Folder Details ", -1), W("div", Jx, [(H(!0), G(In, null, vn(r.value, (e) => (H(), G("div", { + return (e, t) => (W(), q("div", Zx, [K("div", Qx, Y(X(R)("sidebar.folder.details", "Folder Details")), 1), K("div", $x, [(W(!0), q(Ln, null, vn(r.value, (e) => (W(), q("div", { key: e.label, style: { display: "flex", @@ -29830,18 +29652,18 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "align-items": "flex-start", "justify-content": "space-between" } - }, [W("div", Yx, q(e.label), 1), W("div", { + }, [K("div", eS, Y(e.label), 1), K("div", { style: An(e.valueStyle || "font-size: 12px; text-align: right; word-break: break-word"), title: String(e.value || "") - }, q(e.value), 13, Xx)]))), 128))])])); + }, Y(e.value), 13, tS)]))), 128))])])); } -}, Qx = [ +}, rS = [ "aria-busy", "aria-disabled", "aria-label", "aria-valuenow", "tabindex" -], $x = /* @__PURE__ */ Il({ +], iS = /* @__PURE__ */ Rl({ __name: "RatingEditor", props: { asset: { @@ -29862,99 +29684,99 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr function n(e) { return Math.max(0, Math.min(5, Number(e) || 0)); } - let i = e, a = t, o = n(i.asset?.rating ?? i.modelValue), c = K(o), l = K(0), u = K(!1), d = o, f = o, p = null, m = X(() => l.value > 0 ? l.value : c.value), h = (e) => e <= m.value ? "#FFD45A" : "#555", g = (e) => e <= m.value ? "scale(1.1)" : "scale(1)", _ = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), v = (e) => new Promise((t) => setTimeout(t, e)); - function y(e) { - if (u.value) return; + let r = e, i = t, a = n(r.asset?.rating ?? r.modelValue), o = J(a), s = J(0), c = J(!1), l = a, u = a, d = null, f = Z(() => s.value > 0 ? s.value : o.value), p = (e) => e <= f.value ? "#FFD45A" : "#555", h = (e) => e <= f.value ? "scale(1.1)" : "scale(1)", g = (e) => Math.min(100 * 2 ** Math.max(0, e - 1), 2e3), _ = (e) => new Promise((t) => setTimeout(t, e)); + function v(e) { + if (c.value) return; let t = n(e); - d = t, f = t, t !== c.value && (c.value = t); + l = t, u = t, t !== o.value && (o.value = t); } - function b(e = null) { - c.value = d, f = d, a("update:modelValue", d), e && s(e, "error"); + function y(e = null) { + o.value = l, u = l, i("update:modelValue", l), e && m(e, "error"); } - async function x() { - if (u.value) return; - u.value = !0; + async function b() { + if (c.value) return; + c.value = !0; let e = Date.now(); try { let t = 0; for (; t < 10;) { if (Date.now() - e > 3e4) { - b(r("toast.ratingUpdateFailed", "Rating update failed")); + y(R("toast.ratingUpdateFailed", "Rating update failed")); break; } - t > 0 && await v(_(t)), t += 1; - let o = n(f), l = typeof AbortController < "u" ? new AbortController() : null; - p = l; - let u = null; + t > 0 && await _(g(t)), t += 1; + let a = n(u), s = typeof AbortController < "u" ? new AbortController() : null; + d = s; + let c = null; try { - u = await we(i.asset, o, l ? { signal: l.signal } : {}); + c = await O(r.asset, a, s ? { signal: s.signal } : {}); } catch (e) { console.error("Failed to update rating:", e); } - if (!u?.ok) { - if (u?.code === "ABORTED" && f !== o) continue; - b(u?.error || r("toast.ratingUpdateFailed", "Rating update failed")); + if (!c?.ok) { + if (c?.code === "ABORTED" && u !== a) continue; + y(c?.error || R("toast.ratingUpdateFailed", "Rating update failed")); break; } try { - let e = u?.data?.asset_id ?? null; - e != null && !Ve(i.asset.id) && (i.asset.id = e); + let e = c?.data?.asset_id ?? null; + e != null && !Ie(r.asset.id) && (r.asset.id = e); } catch (e) { console.debug?.(e); } - d = o, c.value = o; + l = a, o.value = a; try { - i.asset.rating = o; + r.asset.rating = a; } catch (e) { console.debug?.(e); } - if (a("update:modelValue", o), a("rating-change", { - assetId: i.asset?.id, - rating: o - }), ht(qt, { - assetId: i.asset?.id == null ? "" : String(i.asset.id), - rating: o - }), f === o) { - s(r("toast.ratingSetN", { n: o }), "success", 1e3); + if (i("update:modelValue", a), i("rating-change", { + assetId: r.asset?.id, + rating: a + }), kt(Zt, { + assetId: r.asset?.id == null ? "" : String(r.asset.id), + rating: a + }), u === a) { + m(R("toast.ratingSetN", { n: a }), "success", 1e3); break; } } - t >= 10 && b(r("toast.ratingUpdateFailed", "Rating update failed")); + t >= 10 && y(R("toast.ratingUpdateFailed", "Rating update failed")); } finally { - p = null, u.value = !1; + d = null, c.value = !1; } } - function S(e) { - if (i.disabled) return; + function x(e) { + if (r.disabled) return; let t = n(e); - f = t, c.value = t, l.value = 0, a("update:modelValue", t); + u = t, o.value = t, s.value = 0, i("update:modelValue", t); try { - p?.abort?.(); + d?.abort?.(); } catch (e) { console.debug?.(e); } - x(); + b(); + } + function S(e) { + x(e); } function C(e) { - S(e); + r.disabled || (s.value = e); } - function w(e) { - i.disabled || (l.value = e); + function w() { + s.value = 0; } - function T() { - l.value = 0; - } - function E(e) { - if (i.disabled) return; + function T(e) { + if (r.disabled) return; let t = null; switch (e.key) { case "ArrowRight": case "ArrowUp": - e.preventDefault(), t = Math.min(5, c.value + 1); + e.preventDefault(), t = Math.min(5, o.value + 1); break; case "ArrowLeft": case "ArrowDown": - e.preventDefault(), t = Math.max(0, c.value - 1); + e.preventDefault(), t = Math.max(0, o.value - 1); break; case "Home": e.preventDefault(), t = 0; @@ -29964,21 +29786,21 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr break; default: e.key >= "0" && e.key <= "5" && (e.preventDefault(), t = parseInt(e.key, 10)); } - t !== null && t !== c.value && S(t); + t !== null && t !== o.value && x(t); } return yn(() => { try { - p?.abort?.(); + d?.abort?.(); } catch (e) { console.debug?.(e); } - }), mn(() => i.modelValue, (e) => { - y(e); - }), mn(() => i.asset?.rating, (e) => { - y(e); + }), mn(() => r.modelValue, (e) => { + v(e); + }), mn(() => r.asset?.rating, (e) => { + v(e); }), (t, n) => { - let i = Ln("MButton"); - return H(), G("div", { + let r = Rn("MButton"); + return W(), q("div", { class: "mjr-rating-editor", style: An({ display: "inline-flex", @@ -29986,16 +29808,16 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr pointerEvents: e.disabled ? "none" : "auto", opacity: e.disabled ? .6 : 1 }), - "aria-busy": u.value, + "aria-busy": c.value, "aria-disabled": e.disabled, role: "slider", - "aria-label": J(r)("rating.label", "Rating"), + "aria-label": X(R)("rating.label", "Rating"), "aria-valuemin": 0, "aria-valuemax": 5, - "aria-valuenow": c.value, + "aria-valuenow": o.value, tabindex: e.disabled ? -1 : 0, - onKeydown: E - }, [(H(), G(In, null, vn(5, (t) => V(i, { + onKeydown: T + }, [(W(), q(Ln, null, vn(5, (t) => U(r, { key: t, type: "button", class: "mjr-rating-star", @@ -30003,8 +29825,8 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr text: "", rounded: "", style: An({ - color: h(t), - transform: g(t), + color: p(t), + transform: h(t), fontSize: "16px", background: "none", border: "none", @@ -30012,14 +29834,14 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr padding: "0", transition: "all 0.15s ease" }), - "aria-label": J(r)("rating.setN", { n: t }), - "aria-pressed": t <= c.value, + "aria-label": X(R)("rating.setN", { n: t }), + "aria-pressed": t <= o.value, disabled: e.disabled, - onClick: (e) => C(t), - onMouseenter: (e) => w(t), - onMouseleave: T + onClick: (e) => S(t), + onMouseenter: (e) => C(t), + onMouseleave: w }, { - default: U(() => [...n[0] ||= [gn(" ★ ", -1)]]), + default: G(() => [...n[0] ||= [gn(" ★ ", -1)]]), _: 1 }, 8, [ "style", @@ -30028,10 +29850,10 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "disabled", "onClick", "onMouseenter" - ])), 64))], 44, Qx); + ])), 64))], 44, rS); }; } -}, [["__scopeId", "data-v-d6a0ab11"]]), eS = { +}, [["__scopeId", "data-v-d6a0ab11"]]), aS = { class: "mjr-sidebar-content", style: { flex: "1", @@ -30041,22 +29863,29 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "flex-direction": "column", gap: "16px" } -}, tS = { +}, oS = { class: "mjr-sidebar-rating-tags", style: { display: "flex", "flex-direction": "column", gap: "10px" } -}, nS = { style: { +}, sS = { style: { display: "flex", "align-items": "center", gap: "8px" -} }, rS = { style: { +} }, cS = { style: { + "font-size": "0.8em", + opacity: "0.6", + "min-width": "44px" +} }, lS = { style: { display: "flex", "flex-direction": "column", gap: "4px" -} }, iS = { +} }, uS = { style: { + "font-size": "0.8em", + opacity: "0.6" +} }, dS = { __name: "AssetSidebarContent", props: { asset: { @@ -30074,52 +29903,45 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr }, emits: ["close"], setup(e, { emit: t }) { - let n = e, r = t, i = X(() => String(n.asset?.kind || "").toLowerCase() === "folder"), a = X(() => Number(n.asset?.rating) || 0), o = X(() => n.asset?.tags || []), s = X(() => { + let n = e, r = t, i = Z(() => String(n.asset?.kind || "").toLowerCase() === "folder"), a = Z(() => Number(n.asset?.rating) || 0), o = Z(() => n.asset?.tags || []), s = Z(() => { try { - return !!(Et()?.sidebar?.showPreviewThumb ?? !0); + return !!(pt()?.sidebar?.showPreviewThumb ?? !0); } catch { return !0; } }); function c() { if (n.sidebar) try { - Hg(n.sidebar); + Gg(n.sidebar); } catch (e) { console.debug?.(e); } else r("close"); } - return (t, n) => (H(), G(In, null, [V(Lx, { + return (t, n) => (W(), q(Ln, null, [U(Vx, { asset: e.asset, onClose: c - }, null, 8, ["asset"]), W("div", eS, [i.value ? (H(), hn(Zx, { + }, null, 8, ["asset"]), K("div", aS, [i.value ? (W(), hn(nS, { key: 0, asset: e.asset - }, null, 8, ["asset"])) : (H(), G(In, { key: 1 }, [ - V(Kx, { + }, null, 8, ["asset"])) : (W(), q(Ln, { key: 1 }, [ + U(Xx, { asset: e.asset, "show-preview-thumb": s.value }, null, 8, ["asset", "show-preview-thumb"]), - W("div", tS, [W("div", nS, [n[0] ||= W("span", { style: { - "font-size": "0.8em", - opacity: "0.6", - "min-width": "44px" - } }, "Rating", -1), V($x, { + K("div", oS, [K("div", sS, [K("span", cS, Y(X(R)("sidebar.rating", "Rating")), 1), U(iS, { asset: e.asset, "model-value": a.value - }, null, 8, ["asset", "model-value"])]), W("div", rS, [n[1] ||= W("span", { style: { - "font-size": "0.8em", - opacity: "0.6" - } }, "Tags", -1), V(fh, { + }, null, 8, ["asset", "model-value"])]), K("div", lS, [K("span", uS, Y(X(R)("sidebar.tags", "Tags")), 1), U(hh, { asset: e.asset, "model-value": o.value }, null, 8, ["asset", "model-value"])])]), - V(Pt, { asset: e.asset }, null, 8, ["asset"]), - V(Rt, { asset: e.asset }, null, 8, ["asset"]), - V(zt, { asset: e.asset }, null, 8, ["asset"]) + U(Lt, { asset: e.asset }, null, 8, ["asset"]), + U(Vt, { asset: e.asset }, null, 8, ["asset"]), + U(Ht, { asset: e.asset }, null, 8, ["asset"]) ], 64))])], 64)); } -}, aS = { +}, fS = { key: 1, class: "mjr-sidebar-placeholder", style: { @@ -30132,21 +29954,21 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "font-size": "0.85em", "text-align": "center" } -}, oS = { +}, pS = { __name: "SidebarSection", setup(e, { expose: t }) { - let n = K(null), { activeAsset: i, onUpdateCallback: a } = Ag(); + let n = J(null), { activeAsset: r, onUpdateCallback: i } = Ng(); return bn(() => { 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; let t = (t) => { - let n = e._currentAsset?.id ?? e._currentFullAsset?.id ?? i.value?.id; + let n = e._currentAsset?.id ?? e._currentFullAsset?.id ?? r.value?.id; return n == null || t == null ? !1 : String(n) === String(t); - }, r = (n) => { - let r = n?.detail || {}, i = r.assetId ?? r.id ?? null, o = Number(r.rating); - if (!(!t(i) || !Number.isFinite(o))) { - Ng({ rating: o }, a.value); + }, a = (n) => { + let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Number(r.rating); + if (!(!t(a) || !Number.isFinite(o))) { + Ig({ rating: o }, i.value); try { e._currentAsset && (e._currentAsset.rating = o), e._currentFullAsset && (e._currentFullAsset.rating = o); } catch (e) { @@ -30154,9 +29976,9 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } } }, o = (n) => { - let r = n?.detail || {}, i = r.assetId ?? r.id ?? null, o = Array.isArray(r.tags) ? r.tags : null; - if (!(!t(i) || !o)) { - Ng({ tags: o }, a.value); + let r = n?.detail || {}, a = r.assetId ?? r.id ?? null, o = Array.isArray(r.tags) ? r.tags : null; + if (!(!t(a) || !o)) { + Ig({ tags: o }, i.value); try { e._currentAsset && (e._currentAsset.tags = o), e._currentFullAsset && (e._currentFullAsset.tags = o); } catch (e) { @@ -30178,11 +30000,11 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr }, e._dispose = e.dispose; let l = c ? { signal: c.signal } : void 0; try { - window.addEventListener(qt, r, l), window.addEventListener(Kt, o, l); + window.addEventListener(Zt, a, l), window.addEventListener(Xt, o, l); } catch (e) { console.debug?.(e); try { - window.addEventListener(qt, r), window.addEventListener(Kt, o), s.push(() => window.removeEventListener(qt, r)), s.push(() => window.removeEventListener(Kt, o)); + window.addEventListener(Zt, a), window.addEventListener(Xt, o), s.push(() => window.removeEventListener(Zt, a)), s.push(() => window.removeEventListener(Xt, o)); } catch (e) { console.debug?.(e); } @@ -30196,7 +30018,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } catch {} }), t({ get sidebar() { return n.value; - } }), (e, t) => (H(), G("div", { + } }), (e, t) => (W(), q("div", { ref_key: "sidebarEl", ref: n, class: "mjr-inline-sidebar", @@ -30208,65 +30030,65 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr transition: "width 140ms ease,max-width 140ms ease,flex-basis 140ms ease,border-color 140ms ease", contain: "layout paint style" } - }, [J(i) ? (H(), hn(iS, { + }, [X(r) ? (W(), hn(dS, { key: 0, - asset: J(i), - "on-update": J(a), + asset: X(r), + "on-update": X(i), sidebar: n.value }, null, 8, [ "asset", "on-update", "sidebar" - ])) : (H(), G("div", aS, q(J(r)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); + ])) : (W(), q("div", fS, Y(X(R)("sidebar.placeholderSelectAsset", "Select an asset to view details")), 1))], 512)); } -}, sS = ["aria-label"], cS = { class: "mjr-context-menu-title" }, lS = { class: "mjr-context-menu-item-left" }, uS = { +}, mS = ["aria-label"], hS = { class: "mjr-context-menu-title" }, gS = { class: "mjr-context-menu-item-left" }, _S = { key: 0, class: "mjr-context-menu-note" -}, dS = { +}, vS = { key: 1, class: "mjr-context-menu-note is-error" -}, fS = { +}, yS = { key: 2, class: "mjr-context-menu-note" -}, pS = { class: "mjr-context-menu-item-left" }, mS = { +}, bS = { class: "mjr-context-menu-item-left" }, xS = { key: 0, class: "mjr-context-menu-hint" -}, hS = { +}, SS = { __name: "AddToCollectionMenu", setup(e) { - let t = K(null), n = K(!1), i = K([]), a = K(""), o = 0, c = null, l = X(() => ({ + let t = J(null), n = J(!1), r = J([]), i = J(""), a = 0, s = null, c = Z(() => ({ position: "fixed", - left: `${Math.round(Number(Xr.x) || 0)}px`, - top: `${Math.round(Number(Xr.y) || 0)}px`, + left: `${Math.round(Number(Zr.x) || 0)}px`, + top: `${Math.round(Number(Zr.y) || 0)}px`, display: "block", zIndex: "10004" - })), u = X(() => Xr.assets.length || 0), d = X(() => r("ctx.addToCollection", "Add to collection") + (u.value > 1 ? ` (${u.value})` : "")); - function f({ collectionName: e, selectedCount: t, addRes: n }) { - let i = Number(n?.data?.added ?? 0) || 0, a = Number(n?.data?.skipped_existing ?? 0) || 0, o = Number(n?.data?.skipped_duplicate ?? 0) || 0, s = String(e || "").trim() || r("label.collection", "collection"), c = r("msg.collectionAdd.added", "Added {added} item(s) to \"{name}\".", { - added: i, - name: s + })), l = Z(() => Zr.assets.length || 0), u = Z(() => R("ctx.addToCollection", "Add to collection") + (l.value > 1 ? ` (${l.value})` : "")); + function d({ collectionName: e, selectedCount: t, addRes: n }) { + let r = Number(n?.data?.added ?? 0) || 0, i = Number(n?.data?.skipped_existing ?? 0) || 0, a = Number(n?.data?.skipped_duplicate ?? 0) || 0, o = String(e || "").trim() || R("label.collection", "collection"), s = R("msg.collectionAdd.added", "Added {added} item(s) to \"{name}\".", { + added: r, + name: o }); - return a > 0 && (c += `\n\n${r("msg.collectionAdd.skippedExisting", "Skipped {count} item(s): already present in the collection.", { count: a })}`), o > 0 && (c += `\n\n${r("msg.collectionAdd.skippedDuplicate", "Ignored {count} duplicate(s) in selection.", { count: o })}`), i === 0 && a > 0 && t > 0 && (c = r("msg.collectionAdd.noneAddedExisting", "No new items added to \"{name}\" (all exist).", { name: s })), c; + return i > 0 && (s += `\n\n${R("msg.collectionAdd.skippedExisting", "Skipped {count} item(s): already present in the collection.", { count: i })}`), a > 0 && (s += `\n\n${R("msg.collectionAdd.skippedDuplicate", "Ignored {count} duplicate(s) in selection.", { count: a })}`), r === 0 && i > 0 && t > 0 && (s = R("msg.collectionAdd.noneAddedExisting", "No new items added to \"{name}\" (all exist).", { name: o })), s; } - function p() { + function f() { let e = t.value; - if (!Xr.open || !e) return; - let n = e.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(Xr.x) || 0, o = Number(Xr.y) || 0; - 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), Xr.x = a, Xr.y = o; + if (!Zr.open || !e) return; + let n = e.getBoundingClientRect(), r = Number(window.innerWidth || 0), i = Number(window.innerHeight || 0), a = Number(Zr.x) || 0, o = Number(Zr.y) || 0; + 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), Zr.x = a, Zr.y = o; } - async function m() { - let e = ++o; - n.value = !0, a.value = ""; + async function p() { + let e = ++a; + n.value = !0, i.value = ""; try { - let t = await me(); - if (e !== o) return; - i.value = Array.isArray(t?.data) ? t.data : []; + let t = await o(); + if (e !== a) return; + r.value = Array.isArray(t?.data) ? t.data : []; } catch (t) { - if (console.error("[AddToCollectionMenu.vue] listCollections failed:", t), e !== o) return; - i.value = [], a.value = r("toast.failedLoadCollections", "Failed to load collections."); + if (console.error("[AddToCollectionMenu.vue] listCollections failed:", t), e !== a) return; + r.value = [], i.value = R("toast.failedLoadCollections", "Failed to load collections."); } finally { - if (e === o) { - n.value = !1, await Nn(), p(); + if (e === a) { + n.value = !1, await Nn(), f(); try { t.value?.querySelector?.(".mjr-context-menu-item:not([aria-disabled=\"true\"])")?.focus?.(); } catch (e) { @@ -30276,85 +30098,85 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } } async function h(e, t) { - let n = Array.isArray(Xr.assets) ? Xr.assets : []; - $r(); - let i = await Ce(e, n); - if (!i?.ok) { - s(i?.error || r("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); + let n = Array.isArray(Zr.assets) ? Zr.assets : []; + ei(); + let r = await x(e, n); + if (!r?.ok) { + m(r?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); return; } - s(f({ + m(d({ collectionName: t, selectedCount: n.length, - addRes: i + addRes: r }), "success", 4e3); } async function g() { - let e = Array.isArray(Xr.assets) ? Xr.assets : []; - $r(); - let t = await Lt(r("dialog.createCollection", "Create collection"), r("dialog.collectionPlaceholder", "My collection")); + let e = Array.isArray(Zr.assets) ? Zr.assets : []; + ei(); + let t = await gt(R("dialog.createCollection", "Create collection"), R("dialog.collectionPlaceholder", "My collection")); if (!t) return; - let n = await xe(t); + let n = await A(t); if (!n?.ok) { - s(n?.error || r("toast.failedCreateCollectionDot", "Failed to create collection."), "error"); + m(n?.error || R("toast.failedCreateCollectionDot", "Failed to create collection."), "error"); return; } - let i = n.data?.id, a = await Ce(i, e); - if (!a?.ok) { - s(a?.error || r("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); + let r = n.data?.id, i = await x(r, e); + if (!i?.ok) { + m(i?.error || R("toast.failedAddAssetsToCollection", "Failed to add assets to collection."), "error"); return; } - s(f({ + m(d({ collectionName: n.data?.name || t, selectedCount: e.length, - addRes: a + addRes: i }), "success", 4e3); } function _(e) { - t.value?.contains?.(e?.target) || $r(); + t.value?.contains?.(e?.target) || ei(); } function v(e) { - e?.key === "Escape" && $r(); + e?.key === "Escape" && ei(); } function y() { - $r(); + ei(); } - return mn(() => Xr.open, async (e) => { - e && (i.value = [], await m()); + return mn(() => Zr.open, async (e) => { + e && (r.value = [], await p()); }), bn(() => { - c = new AbortController(); + s = new AbortController(); let e = { capture: !0, passive: !0, - signal: c.signal + signal: s.signal }; window.addEventListener("pointerdown", _, e), window.addEventListener("keydown", v, { capture: !0, - signal: c.signal + signal: s.signal }), window.addEventListener("scroll", y, e), window.addEventListener("wheel", y, e), window.addEventListener("resize", y, { passive: !0, - signal: c.signal - }), window.addEventListener("mjr-close-all-menus", y, { signal: c.signal }); + signal: s.signal + }), window.addEventListener("mjr-close-all-menus", y, { signal: s.signal }); }), Sn(() => { try { - c?.abort(); + s?.abort(); } catch (e) { console.debug?.(e); } - c = null, $r(); - }), (e, o) => { - let s = Ln("MButton"); - return H(), hn(jn, { to: "body" }, [J(Xr).open ? (H(), G("div", { + s = null, ei(); + }), (e, a) => { + let o = Rn("MButton"); + return W(), hn(jn, { to: "body" }, [X(Zr).open ? (W(), q("div", { key: 0, ref_key: "menuRef", ref: t, class: "mjr-add-to-collection-menu mjr-context-menu", - style: An(l.value), + style: An(c.value), role: "menu", - "aria-label": d.value + "aria-label": u.value }, [ - W("div", cS, q(d.value), 1), - V(s, { + K("div", hS, Y(u.value), 1), + U(o, { type: "button", class: "mjr-context-menu-item", severity: "secondary", @@ -30362,12 +30184,12 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr role: "menuitem", onClick: g }, { - default: U(() => [W("span", lS, [o[0] ||= W("i", { class: "pi pi-plus" }, null, -1), W("span", null, q(J(r)("dialog.createCollection", "Create collection")) + "...", 1)])]), + default: G(() => [K("span", gS, [a[0] ||= K("i", { class: "pi pi-plus" }, null, -1), K("span", null, Y(X(R)("dialog.createCollection", "Create collection")) + "...", 1)])]), _: 1 }), - o[2] ||= W("div", { class: "mjr-context-menu-separator" }, null, -1), - n.value ? (H(), G("div", uS, q(J(r)("msg.loadingCollections", "Loading collections...")), 1)) : a.value ? (H(), G("div", dS, q(a.value), 1)) : i.value.length ? Y("", !0) : (H(), G("div", fS, q(J(r)("msg.noCollections", "No collections yet.")), 1)), - (H(!0), G(In, null, vn(i.value, (e) => (H(), hn(s, { + a[2] ||= K("div", { class: "mjr-context-menu-separator" }, null, -1), + n.value ? (W(), q("div", _S, Y(X(R)("msg.loadingCollections", "Loading collections...")), 1)) : i.value ? (W(), q("div", vS, Y(i.value), 1)) : r.value.length ? In("", !0) : (W(), q("div", yS, Y(X(R)("msg.noCollections", "No collections yet.")), 1)), + (W(!0), q(Ln, null, vn(r.value, (e) => (W(), hn(o, { key: String(e?.id || ""), type: "button", class: "mjr-context-menu-item", @@ -30376,31 +30198,31 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr role: "menuitem", onClick: (t) => h(String(e?.id || ""), String(e?.name || e?.id || "")) }, { - default: U(() => [W("span", pS, [o[1] ||= W("i", { class: "pi pi-bookmark" }, null, -1), W("span", null, q(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (H(), G("span", mS, q(Number(e?.count || 0)), 1)) : Y("", !0)]), + default: G(() => [K("span", bS, [a[1] ||= K("i", { class: "pi pi-bookmark" }, null, -1), K("span", null, Y(String(e?.name || e?.id || "")), 1)]), Number(e?.count || 0) > 0 ? (W(), q("span", xS, Y(Number(e?.count || 0)), 1)) : In("", !0)]), _: 2 }, 1032, ["onClick"]))), 128)) - ], 12, sS)) : Y("", !0)]); + ], 12, mS)) : In("", !0)]); }; } -}, gS = { +}, CS = { key: 0, class: "mjr-context-menu-separator" -}, _S = { class: "mjr-context-menu-item-left" }, vS = { class: "mjr-context-menu-item-right" }, yS = { +}, wS = { class: "mjr-context-menu-item-left" }, TS = { class: "mjr-context-menu-item-right" }, ES = { key: 0, class: "mjr-context-menu-hint" -}, bS = { +}, DS = { key: 1, class: "mjr-context-menu-submenu-arrow" -}, xS = { +}, OS = { key: 0, class: "mjr-context-menu-separator" -}, SS = { class: "mjr-context-menu-item-left" }, CS = { +}, kS = { class: "mjr-context-menu-item-left" }, AS = { key: 0, class: "mjr-context-menu-hint" -}, wS = { +}, jS = { __name: "GridContextMenu", setup(e) { - let t = K(null), n = K(null), r = K(null), i = null, a = null, o = X(() => l($.main, 10031)), s = X(() => l($.submenu, 10032)), c = X(() => l($.tags, 10033)); + let t = J(null), n = J(null), r = J(null), i = null, a = null, o = Z(() => l($.main, 10031)), s = Z(() => l($.submenu, 10032)), c = Z(() => l($.tags, 10033)); function l(e, t) { return { position: "fixed", @@ -30415,7 +30237,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } function d() { u(), i = setTimeout(() => { - So(); + wo(); }, 180); } function f(e, t) { @@ -30435,12 +30257,12 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } function h(e, t) { if (!Array.isArray(e?.submenu) || !e.submenu.length) { - So(); + wo(); return; } u(); let n = (t?.currentTarget)?.getBoundingClientRect?.(); - xo({ + Co({ x: Math.round((n?.right || $.main.x || 0) + 6), y: Math.round((n?.top || $.main.y || 0) - 4), items: e.submenu, @@ -30458,7 +30280,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } catch (e) { console.error("[GridContextMenu.vue] Action failed:", e); } finally { - e.closeOnSelect === !1 ? n === "submenu" && So() : To(); + e.closeOnSelect === !1 ? n === "submenu" && wo() : Do(); } } } @@ -30467,7 +30289,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr h(e, t); return; } - So(); + wo(); } function v(e) { Array.isArray(e?.submenu) && e.submenu.length && d(); @@ -30480,16 +30302,16 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } function x(e) { let i = e?.target; - t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || To(); + t.value?.contains?.(i) || n.value?.contains?.(i) || r.value?.contains?.(i) || Do(); } function S(e) { - e?.key === "Escape" && To(); + e?.key === "Escape" && Do(); } function C() { - To(); + Do(); } function w(e) { - String(e?.detail?.source || "") !== "grid" && To(); + String(e?.detail?.source || "") !== "grid" && Do(); } function T(e) { let t = $.tags.asset; @@ -30530,11 +30352,11 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } catch (e) { console.debug?.(e); } - a = null, To(); + a = null, Do(); }), (e, i) => { - let a = Ln("MButton"); - return H(), hn(jn, { to: "body" }, [ - J($).main.open ? (H(), G("div", { + let a = Rn("MButton"); + return W(), hn(jn, { to: "body" }, [ + X($).main.open ? (W(), q("div", { key: 0, ref_key: "mainMenuRef", ref: t, @@ -30542,7 +30364,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr style: An(o.value), role: "menu", "aria-label": "Grid context menu" - }, [(H(!0), G(In, null, vn(J($).main.items, (e) => (H(), G(In, { key: e.id }, [e.type === "separator" ? (H(), G("div", gS)) : (H(), hn(a, { + }, [(W(!0), q(Ln, null, vn(X($).main.items, (e) => (W(), q(Ln, { key: e.id }, [e.type === "separator" ? (W(), q("div", CS)) : (W(), hn(a, { key: 1, type: "button", class: Mn(["mjr-context-menu-item", { @@ -30558,10 +30380,10 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr onMouseenter: (t) => _(e, t), onMouseleave: (t) => v(e) }, { - default: U(() => [W("span", _S, [e.iconClass ? (H(), G("i", { + default: G(() => [K("span", wS, [e.iconClass ? (W(), q("i", { key: 0, class: Mn(e.iconClass) - }, null, 2)) : Y("", !0), W("span", null, q(e.label), 1)]), W("span", vS, [e.rightHint ? (H(), G("span", yS, q(e.rightHint), 1)) : Y("", !0), Array.isArray(e.submenu) && e.submenu.length ? (H(), G("span", bS, " > ")) : Y("", !0)])]), + }, null, 2)) : In("", !0), K("span", null, Y(e.label), 1)]), K("span", TS, [e.rightHint ? (W(), q("span", ES, Y(e.rightHint), 1)) : In("", !0), Array.isArray(e.submenu) && e.submenu.length ? (W(), q("span", DS, " > ")) : In("", !0)])]), _: 2 }, 1032, [ "class", @@ -30570,8 +30392,8 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "onClick", "onMouseenter", "onMouseleave" - ]))], 64))), 128))], 4)) : Y("", !0), - J($).submenu.open ? (H(), G("div", { + ]))], 64))), 128))], 4)) : In("", !0), + X($).submenu.open ? (W(), q("div", { key: 1, ref_key: "submenuRef", ref: n, @@ -30581,7 +30403,7 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr "aria-label": "Grid context submenu", onMouseenter: y, onMouseleave: b - }, [(H(!0), G(In, null, vn(J($).submenu.items, (e) => (H(), G(In, { key: e.id }, [e.type === "separator" ? (H(), G("div", xS)) : (H(), hn(a, { + }, [(W(!0), q(Ln, null, vn(X($).submenu.items, (e) => (W(), q(Ln, { key: e.id }, [e.type === "separator" ? (W(), q("div", OS)) : (W(), hn(a, { key: 1, type: "button", class: Mn(["mjr-context-menu-item", { "is-disabled": e.disabled }]), @@ -30592,52 +30414,52 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr tabindex: e.disabled ? -1 : 0, onClick: (t) => g(e, t, "submenu") }, { - default: U(() => [W("span", SS, [e.iconClass ? (H(), G("i", { + default: G(() => [K("span", kS, [e.iconClass ? (W(), q("i", { key: 0, class: Mn(e.iconClass) - }, null, 2)) : Y("", !0), W("span", null, q(e.label), 1)]), e.rightHint ? (H(), G("span", CS, q(e.rightHint), 1)) : Y("", !0)]), + }, null, 2)) : In("", !0), K("span", null, Y(e.label), 1)]), e.rightHint ? (W(), q("span", AS, Y(e.rightHint), 1)) : In("", !0)]), _: 2 }, 1032, [ "class", "aria-disabled", "tabindex", "onClick" - ]))], 64))), 128))], 36)) : Y("", !0), - J($).tags.open && J($).tags.asset ? (H(), G("div", { + ]))], 64))), 128))], 36)) : In("", !0), + X($).tags.open && X($).tags.asset ? (W(), q("div", { key: 2, ref_key: "tagsPopoverRef", ref: r, class: "mjr-grid-popover", style: An(c.value) - }, [V(fh, { - asset: J($).tags.asset, - "model-value": J($).tags.asset?.tags || [], + }, [U(hh, { + asset: X($).tags.asset, + "model-value": X($).tags.asset?.tags || [], "onUpdate:modelValue": T, onTagsChange: E - }, null, 8, ["asset", "model-value"])], 4)) : Y("", !0) + }, null, 8, ["asset", "model-value"])], 4)) : In("", !0) ]); }; } -}, TS = { +}, MS = { __name: "ContextMenuPortal", setup(e) { - let t = K(""), n = X(() => vo(t.value)); + let t = J(""), n = Z(() => bo(t.value)); return bn(() => { - t.value = go(); + t.value = vo(); }), Sn(() => { - _o(t.value), t.value = ""; - }), (e, t) => n.value ? (H(), G(In, { key: 0 }, [V(wS), V(hS)], 64)) : Y("", !0); + yo(t.value), t.value = ""; + }), (e, t) => n.value ? (W(), q(Ln, { key: 0 }, [U(jS), U(SS)], 64)) : In("", !0); } -}, ES = { +}, NS = { __name: "App", setup(e) { - let t = K(null), n = K(null), r = K(null), i = K(null), a = K(null), o = K(null), s = null; + let t = J(null), n = J(null), r = J(null), i = J(null), a = J(null), o = J(null), s = null; return bn(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 Qv(t.value, { + s = await Wv(t.value, { useComfyThemeUI: !0, external: e }); @@ -30645,36 +30467,36 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr console.warn("[Majoor] App.vue: mountAssetsManagerPanelRuntime failed", e); } try { - $g().validatePersistedCustomRoot?.(); + Ut().validatePersistedCustomRoot?.(); } catch {} }), Sn(() => { try { s?.dispose?.(); } catch {} s = null; - }), (e, s) => (H(), G(In, null, [ - V(ey, { + }), (e, s) => (W(), q(Ln, null, [ + U(Kv, { ref_key: "statusSectionRef", ref: n }, null, 512), - V(ax, { + U(lx, { ref_key: "headerSectionRef", ref: r }, null, 512), - V(Sx, { + U(Ex, { ref_key: "summaryBarSectionRef", ref: i }, null, 512), - V(Px, { + U(Rx, { ref_key: "assetsGridRef", ref: a }, null, 512), - V(oS, { + U(pS, { ref_key: "sidebarSectionRef", ref: o }, null, 512), - V(TS), - W("div", { + U(MS), + K("div", { ref_key: "containerRef", ref: t, class: "mjr-vue-root", @@ -30687,10 +30509,10 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr }, null, 512) ], 64)); } -}, DS = { +}, PS = { __name: "GeneratedFeedApp", setup(e) { - let t = K(null), n = null; + let t = J(null), n = null; function r(e) { if (!e) return; let t = [ @@ -30709,16 +30531,16 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } return bn(() => { if (t.value) try { - r(t.value), n = Cp(t.value); + r(t.value), n = Tp(t.value); } catch (e) { console.warn("[Majoor] GeneratedFeedApp.vue: createGeneratedFeedHost failed", e); } }), Sn(() => { try { - wp(n); + Ep(n); } catch {} n = null; - }), (e, n) => (H(), G(In, null, [V(TS), W("div", { + }), (e, n) => (W(), q(Ln, null, [U(MS), K("div", { ref_key: "containerRef", ref: t, class: "mjr-vue-feed-root", @@ -30733,47 +30555,47 @@ var Bx = { class: "mjr-sidebar-preview" }, Vx = ["src"], Hx = ["src"], Ux = ["sr } }, null, 512)], 64)); } -}, OS = "data-mjr-topbar-mfv-host", kS = "data-mjr-topbar-mfv-button", AS = "data-mjr-topbar-mfv-slot", jS = "label.floatingViewer", MS = "Viewer", NS = "V", PS = [ +}, FS = "data-mjr-topbar-mfv-host", IS = "data-mjr-topbar-mfv-button", LS = "data-mjr-topbar-mfv-slot", RS = "label.floatingViewer", zS = "Viewer", BS = "V", VS = [ ".actionbar-container", "[data-testid='actionbar-container']", "[data-testid='topbar']", ".comfyui-topbar", ".topbar" -], FS = [ +], HS = [ ".queue-button-group", ".comfyui-button-group", "[role='toolbar']" -], IS = null, LS = null, RS = null, zS = null, BS = null, VS = !1, HS = null, US = !1, WS = !1; -function GS(e) { - if (!(IS && LS === e)) { +], US = null, WS = null, GS = null, KS = null, qS = null, JS = !1, YS = null, XS = !1, ZS = !1; +function QS(e) { + if (!(US && WS === e)) { if (!e) { - !RS && typeof MutationObserver < "u" && (RS = new MutationObserver(() => { - KS() && (RS?.disconnect?.(), RS = null, aC()); - }), RS.observe(document.body, { + !GS && typeof MutationObserver < "u" && (GS = new MutationObserver(() => { + $S() && (GS?.disconnect?.(), GS = null, fC()); + }), GS.observe(document.body, { childList: !0, subtree: !0 })); return; } try { - IS?.disconnect?.(); + US?.disconnect?.(); } catch {} - IS = new MutationObserver(() => aC()), IS.observe(e, { childList: !0 }), LS = e; + US = new MutationObserver(() => fC()), US.observe(e, { childList: !0 }), WS = e; try { - RS?.disconnect?.(); + GS?.disconnect?.(); } catch {} - RS = null; + GS = null; } } -function KS() { +function $S() { if (typeof document > "u") return null; - for (let e of PS) { + for (let e of VS) { let t = document.querySelector(e); if (t) return t; } return null; } -function qS(e = KS()) { +function eC(e = $S()) { if (typeof document > "u") return; let t = document.documentElement?.style; if (!t) return; @@ -30784,157 +30606,157 @@ function qS(e = KS()) { let n = e.getBoundingClientRect(), r = Math.max(60, Math.ceil(n.bottom + 12)); t.setProperty("--mjr-mfv-top-offset", `${r}px`); } -function JS(e) { +function tC(e) { if (!e) return null; - for (let t of FS) { + for (let t of HS) { let n = e.querySelector(t); if (n) return n; } return null; } -function YS(e, t) { +function nC(e, t) { return e ? t?.classList?.contains?.("comfyui-button-group") ? t : t?.parentElement || e : null; } -function XS(e) { +function rC(e) { if (!e) return null; - let t = e.querySelector(`[${AS}]`); - t || (t = document.createElement("div"), t.setAttribute(AS, "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 = JS(e), r = YS(e, n); + let t = e.querySelector(`[${LS}]`); + t || (t = document.createElement("div"), t.setAttribute(LS, "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 = tC(e), r = nC(e, n); return t.parentElement === r ? n && r && r !== n && t.previousSibling !== n ? r.insertBefore(t, n.nextSibling) : !n && t !== r.lastElementChild && r.appendChild(t) : n && r && r !== n ? r.insertBefore(t, n.nextSibling) : r.appendChild(t), t; } -function ZS() { +function iC() { let e = document.createElement("i"); return e.className = "mjr-topbar-mfv-icon pi pi-eye", e.setAttribute("aria-hidden", "true"), e; } -function QS(e = "Viewer") { +function aC(e = "Viewer") { let t = document.createElement("span"); return t.className = "mjr-topbar-mfv-label", t.textContent = e, t; } -function $S(e) { +function oC(e) { if (!e) return; - let t = US ? r("tooltip.closeMFV", "Close Majoor Floating Viewer") : r("tooltip.openMFV", "Open Majoor Floating Viewer"); - nn(e, t, NS, { ariaLabel: t }), e.setAttribute("aria-pressed", US ? "true" : "false"), e.classList.toggle("primary", US), e.classList.toggle("mjr-topbar-mfv-active", US), e.replaceChildren(ZS(), QS(r(jS, MS))); -} -function eC() { - try { - window.dispatchEvent(new Event(B.MFV_TOGGLE)); - } catch (e) { - console.debug?.("[Majoor] top bar MFV launch failed", e); - } - aC(); -} -function tC() { - let e = document.createElement("button"); - return e.type = "button", e.setAttribute(kS, "1"), e.setAttribute("data-command-id", "mjr.toggleFloatingViewer"), e.className = "comfyui-button p-button p-component 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 8px", e.style.gap = "8px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", eC), $S(e), e; -} -function nC() { - let e = document.createElement("div"); - return e.setAttribute(OS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(tC()), e; -} -function rC() { - if (typeof document > "u" || WS) return; - let e = !!document.querySelector(".mjr-mfv.is-visible"); - US !== e && (US = e); -} -function iC() { - let e = KS(); - if (!e) return qS(null), null; - GS(e), rC(); - let t = XS(e); - if (!t) return qS(e), null; - let n = t.querySelector(`[${OS}]`); - return n ||= nC(), n.parentElement !== t && t.replaceChildren(n), qS(e), $S(n.querySelector(`[${kS}]`)), t; -} -function aC() { - VS || (VS = !0, HS = window.setTimeout(() => { - VS = !1, HS = null, iC(); - }, 32)); -} -function oC() { - return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (aC(), zS || (zS = (e) => { - US = !!e?.detail?.visible, WS = !0, aC(); - }, window.addEventListener(B.MFV_VISIBILITY_CHANGED, zS)), BS || (BS = () => aC(), window.addEventListener("resize", BS)), GS(KS()), !0); + let t = XS ? R("tooltip.closeMFV", "Close Majoor Floating Viewer") : R("tooltip.openMFV", "Open Majoor Floating Viewer"); + nn(e, t, BS, { ariaLabel: t }), e.setAttribute("aria-pressed", XS ? "true" : "false"), e.classList.toggle("primary", XS), e.classList.toggle("mjr-topbar-mfv-active", XS), e.replaceChildren(iC(), aC(R(RS, zS))); } function sC() { try { - IS?.disconnect?.(); + window.dispatchEvent(new Event(H.MFV_TOGGLE)); + } catch (e) { + console.debug?.("[Majoor] top bar MFV launch failed", e); + } + fC(); +} +function cC() { + let e = document.createElement("button"); + return e.type = "button", e.setAttribute(IS, "1"), e.setAttribute("data-command-id", "mjr.toggleFloatingViewer"), e.className = "comfyui-button p-button p-component 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 8px", e.style.gap = "8px", e.style.display = "inline-flex", e.style.alignItems = "center", e.style.justifyContent = "center", e.style.whiteSpace = "nowrap", e.addEventListener("click", sC), oC(e), e; +} +function lC() { + let e = document.createElement("div"); + return e.setAttribute(FS, "1"), e.className = "mjr-topbar-mfv-button-host", e.style.position = "relative", e.appendChild(cC()), e; +} +function uC() { + if (typeof document > "u" || ZS) return; + let e = !!document.querySelector(".mjr-mfv.is-visible"); + XS !== e && (XS = e); +} +function dC() { + let e = $S(); + if (!e) return eC(null), null; + QS(e), uC(); + let t = rC(e); + if (!t) return eC(e), null; + let n = t.querySelector(`[${FS}]`); + return n ||= lC(), n.parentElement !== t && t.replaceChildren(n), eC(e), oC(n.querySelector(`[${IS}]`)), t; +} +function fC() { + JS || (JS = !0, YS = window.setTimeout(() => { + JS = !1, YS = null, dC(); + }, 32)); +} +function pC() { + return typeof window > "u" || typeof document > "u" || !document.body ? !1 : (fC(), KS || (KS = (e) => { + XS = !!e?.detail?.visible, ZS = !0, fC(); + }, window.addEventListener(H.MFV_VISIBILITY_CHANGED, KS)), qS || (qS = () => fC(), window.addEventListener("resize", qS)), QS($S()), !0); +} +function mC() { + try { + US?.disconnect?.(); } catch (e) { console.debug?.(e); } - IS = null, LS = null; + US = null, WS = null; try { - RS?.disconnect?.(); + GS?.disconnect?.(); } catch (e) { console.debug?.(e); } - RS = null; + GS = null; try { - HS && window.clearTimeout(HS); + YS && window.clearTimeout(YS); } catch (e) { console.debug?.(e); } - HS = null, zS && typeof window < "u" && window.removeEventListener(B.MFV_VISIBILITY_CHANGED, zS), zS = null, BS && typeof window < "u" && window.removeEventListener("resize", BS), BS = null, VS = !1, US = !1, WS = !1; + YS = null, KS && typeof window < "u" && window.removeEventListener(H.MFV_VISIBILITY_CHANGED, KS), KS = null, qS && typeof window < "u" && window.removeEventListener("resize", qS), qS = null, JS = !1, XS = !1, ZS = !1; try { - document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${OS}]`)?.remove?.(), document.querySelector(`[${AS}]`)?.remove?.(); + document.documentElement?.style?.setProperty("--mjr-mfv-top-offset", "60px"), document.querySelector(`[${FS}]`)?.remove?.(), document.querySelector(`[${LS}]`)?.remove?.(); } catch (e) { console.debug?.(e); } } //#endregion //#region ui/features/runtime/entryUiRegistration.ts -var cC = "mjr-global-runtime-root", lC = "_mjrGlobalRuntimeVueApp", uC = "_mjrSidebarVueApp", dC = "_mjrFeedVueApp", fC = "majoor-generated-feed", pC = null; -function mC() { +var hC = "mjr-global-runtime-root", gC = "_mjrGlobalRuntimeVueApp", _C = "_mjrSidebarVueApp", vC = "_mjrFeedVueApp", yC = "majoor-generated-feed", bC = null; +function xC() { if (typeof document > "u" || !document?.body) return null; - let e = document.getElementById(cC); - return e || (e = document.createElement("div"), e.id = cC, 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(hC); + return e || (e = document.createElement("div"), e.id = hC, 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 hC() { +function SC() { try { - let e = mC(); + let e = xC(); if (!e) return !1; - let t = !!Ft(e, Th, lC); - return oC(), t; + let t = !!Pt(e, Oh, gC); + return pC(), t; } catch { return !1; } } -function gC() { +function CC() { try { - sC(); - let e = document.getElementById(cC); + mC(); + let e = document.getElementById(hC); if (!e) return; - jt(e, lC), e.remove?.(); + Nt(e, gC), e.remove?.(); } catch {} } -function _C(e, t) { - let n = de(e, t); - if (cm(), !n) try { - window.dispatchEvent(new Event(B.OPEN_ASSETS_MANAGER)); +function wC(e, t) { + let n = je(e, t); + if (um(), !n) try { + window.dispatchEvent(new Event(H.OPEN_ASSETS_MANAGER)); } catch (e) { console.debug?.(e); } return n; } -function vC() { +function TC() { try { - window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { reason: "command" } })); + window.dispatchEvent(new CustomEvent(H.RELOAD_GRID, { detail: { reason: "command" } })); } catch (e) { console.debug?.(e); } } -function yC(e) { - let t = _e(e, fC); +function EC(e) { + let t = ke(e, yC); if (!t) try { - refreshGeneratedFeedHosts(); + lp(); } catch (e) { console.debug?.(e); } return t; } -function bC(e) { - return zC(e).find(RC) || null; +function DC(e) { + return KC(e).find(GC) || null; } -function xC(e) { +function OC(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(); @@ -30946,41 +30768,41 @@ function xC(e) { title: String(e?.title || e?.properties?.title || e?.properties?.name || n || "").trim() }; } -function SC(e, t) { - let n = xC(pC); - if (!n) return s(r("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1; - _C(e, t); +function kC(e, t) { + let n = OC(bC); + if (!n) return m(R("toast.nodeContextMissing", "Select an output node first."), "info", 2200), !1; + wC(e, t); try { - typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.pendingNodeContext = n, window.dispatchEvent(new CustomEvent(B.OPEN_NODE_CONTEXT, { detail: n }))); + typeof window < "u" && (window.MajoorAssetsManager = window.MajoorAssetsManager || {}, window.MajoorAssetsManager.pendingNodeContext = n, window.dispatchEvent(new CustomEvent(H.OPEN_NODE_CONTEXT, { detail: n }))); } catch (e) { console.debug?.(e); } return !0; } -function CC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function AC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [ { id: "mjr.openAssetsManager", - label: r("manager.title", "Assets Manager"), - tooltip: r("tooltip.openAssetsManager", "Open Majoor Assets Manager"), - title: r("tooltip.openAssetsManager", "Open Majoor Assets Manager"), - description: r("tooltip.openAssetsManager", "Open Majoor Assets Manager"), + label: R("manager.title", "Assets Manager"), + tooltip: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), + title: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), + description: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), icon: "pi pi-folder-open", - function: () => _C(e, t) + function: () => wC(e, t) }, { id: "mjr.scanAssets", - label: r("command.scanAssets", "Scan assets"), + label: R("command.scanAssets", "Scan assets"), icon: "pi pi-refresh", function: () => n() }, { id: "mjr.toggleFloatingViewer", - label: r("command.toggleFloatingViewer", "Toggle floating viewer"), + label: R("command.toggleFloatingViewer", "Toggle floating viewer"), icon: "pi pi-images", function: () => { try { - window.dispatchEvent(new Event(B.MFV_TOGGLE)); + window.dispatchEvent(new Event(H.MFV_TOGGLE)); } catch (e) { console.debug?.(e); } @@ -30988,20 +30810,20 @@ function CC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { id: "mjr.refreshAssetsGrid", - label: r("command.refreshAssetsGrid", "Refresh assets grid"), + label: R("command.refreshAssetsGrid", "Refresh assets grid"), icon: "pi pi-sync", - function: () => vC() + function: () => TC() }, { id: "mjr.openFloatingViewer", - label: r("command.openFloatingViewer", "Open floating viewer"), - tooltip: r("tooltip.openFloatingViewer", "Open Majoor floating viewer"), - title: r("tooltip.openFloatingViewer", "Open Majoor floating viewer"), - description: r("tooltip.openFloatingViewer", "Open Majoor floating viewer"), + label: R("command.openFloatingViewer", "Open floating viewer"), + tooltip: R("tooltip.openFloatingViewer", "Open Majoor floating viewer"), + title: R("tooltip.openFloatingViewer", "Open Majoor floating viewer"), + description: R("tooltip.openFloatingViewer", "Open Majoor floating viewer"), icon: "pi pi-window-maximize", function: () => { try { - window.dispatchEvent(new Event(B.MFV_OPEN)); + window.dispatchEvent(new Event(H.MFV_OPEN)); } catch (e) { console.debug?.(e); } @@ -31009,31 +30831,31 @@ function CC(e, { sidebarTabId: t, triggerStartupScan: n }) { }, { id: "mjr.openGeneratedFeed", - label: r("command.openGeneratedFeed", "Open generated feed"), - tooltip: r("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), - title: r("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), - description: r("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), + label: R("command.openGeneratedFeed", "Open generated feed"), + tooltip: R("tooltip.openGeneratedFeed", "Open the Majoor generated feed panel"), + 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: () => yC(e) + function: () => EC(e) }, { id: "mjr.openSettings", - label: r("command.openSettings", "Open Majoor settings"), + label: R("command.openSettings", "Open Majoor settings"), icon: "pi pi-cog", function: () => ln(e) }, { id: "mjr.openNodeContext", - label: r("command.openNodeContext", "Show assets from selected node"), - tooltip: r("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), - 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"), + label: R("command.openNodeContext", "Show assets from selected node"), + tooltip: R("tooltip.openNodeContext", "Show the latest indexed assets produced by this node"), + 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: () => SC(e, t) + function: () => kC(e, t) } ]; } -function wC() { +function jC() { return [{ combo: { alt: !0, @@ -31050,7 +30872,7 @@ function wC() { commandId: "mjr.toggleFloatingViewer" }]; } -function TC() { +function MC() { return [{ path: ["Extensions", "Majoor Assets Manager"], commands: [ @@ -31063,45 +30885,45 @@ function TC() { ] }]; } -function EC(e, { sidebarTabId: t, triggerStartupScan: n }) { +function NC(e, { sidebarTabId: t, triggerStartupScan: n }) { return [null, { content: "Majoor Assets Manager", submenu: { options: [ { - content: r("tooltip.openAssetsManager", "Open Majoor Assets Manager"), - callback: () => _C(e, t) + content: R("tooltip.openAssetsManager", "Open Majoor Assets Manager"), + callback: () => wC(e, t) }, { - content: r("command.openFloatingViewer", "Open floating viewer"), + content: R("command.openFloatingViewer", "Open floating viewer"), callback: () => { try { - window.dispatchEvent(new Event(B.MFV_OPEN)); + window.dispatchEvent(new Event(H.MFV_OPEN)); } catch (e) { console.debug?.(e); } } }, { - content: r("command.openGeneratedFeed", "Open generated feed"), - callback: () => yC(e) + content: R("command.openGeneratedFeed", "Open generated feed"), + callback: () => EC(e) }, null, { - content: r("command.refreshAssetsGrid", "Refresh assets grid"), - callback: () => vC() + content: R("command.refreshAssetsGrid", "Refresh assets grid"), + callback: () => TC() }, { - content: r("command.scanAssets", "Scan assets"), + content: R("command.scanAssets", "Scan assets"), callback: () => n() }, { - content: r("command.openSettings", "Open Majoor settings"), + content: R("command.openSettings", "Open Majoor settings"), callback: () => ln(e) } ] } }]; } -function DC() { +function PC() { return [ { label: "Majoor Assets Manager", @@ -31118,25 +30940,25 @@ function DC() { } ]; } -function OC(e, t) { - for (let n of CC(e, t)) ge(e, n); +function FC(e, t) { + for (let n of AC(e, t)) _e(e, n); } -function kC(e) { - for (let t of wC()) N(e, t); +function IC(e) { + for (let t of jC()) ve(e, t); } -function AC(e, { sidebarTabId: t }) { - return om({ sidebarTabId: t }), ce(e, { +function LC(e, { sidebarTabId: t }) { + return cm({ sidebarTabId: t }), pe(e, { id: t, icon: "pi pi-folder", - title: r("manager.title"), - label: r("manager.sidebarLabel"), - tooltip: r("tooltip.sidebarTab"), + title: R("manager.title"), + label: R("manager.sidebarLabel"), + tooltip: R("tooltip.sidebarTab"), type: "custom", render(e) { - cm(), ur({ idleOnly: !0 }).catch(() => null), Ft(e, ES, uC), setTimeout(() => { - let e = dm(); + um(), dr({ idleOnly: !0 }).catch(() => null), Pt(e, NS, _C), setTimeout(() => { + let e = pm(); if (e) try { - window.dispatchEvent(new CustomEvent(B.RELOAD_GRID, { detail: { + window.dispatchEvent(new CustomEvent(H.RELOAD_GRID, { detail: { reason: "pending-generated-assets", pending: e } })); @@ -31148,75 +30970,75 @@ function AC(e, { sidebarTabId: t }) { destroy(e) {} }); } -function jC() { +function RC() { try { - jt(null, uC); + Nt(null, _C); } catch {} } -var MC = !1, NC = "mjr-sidebar-prewarm-host"; -function PC() { - if (MC || typeof document > "u" || !document?.body) return !1; - MC = !0; +var zC = !1, BC = "mjr-sidebar-prewarm-host"; +function VC() { + if (zC || typeof document > "u" || !document?.body) return !1; + zC = !0; try { - let e = document.getElementById(NC); - return e || (e = document.createElement("div"), e.id = NC, 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)), Ft(e, ES, uC), !0; + let e = document.getElementById(BC); + return e || (e = document.createElement("div"), e.id = BC, 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)), Pt(e, NS, _C), !0; } catch (e) { - return console.debug?.(e), MC = !1, !1; + return console.debug?.(e), zC = !1, !1; } } -function FC() { +function HC() { return { - id: fC, - title: r("bottomFeed.title", "Generated Feed"), + id: yC, + title: R("bottomFeed.title", "Generated Feed"), icon: "pi pi-images", type: "custom", render(e) { - Ft(e, DS, dC); + Pt(e, PS, vC); }, destroy(e) {} }; } -function IC() { - return [FC()]; +function UC() { + return [HC()]; } -function LC() { +function WC() { try { - jt(null, dC); + Nt(null, vC); } catch {} } -function RC(e) { +function GC(e) { let t = String(e?.comfyClass || e?.type || e?.constructor?.type || "").trim(); return t ? /save|load|preview/i.test(t) : !1; } -function zC(e) { +function KC(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 BC(e) { - return pC = bC(e), pC ? [ +function qC(e) { + return bC = DC(e), bC ? [ "mjr.openNodeContext", "mjr.openAssetsManager", "mjr.openFloatingViewer" ] : []; } -function VC(e, t) { +function JC(e, t) { return { content: e, callback: t }; } -function HC(e, t, { sidebarTabId: n }) { - return RC(e) ? [ - VC("View in Assets Manager", () => _C(t, n)), - VC("Open in Floating Viewer", () => { +function YC(e, t, { sidebarTabId: n }) { + return GC(e) ? [ + JC("View in Assets Manager", () => wC(t, n)), + JC("Open in Floating Viewer", () => { try { - window.dispatchEvent(new Event(B.MFV_OPEN)); + window.dispatchEvent(new Event(H.MFV_OPEN)); } catch (e) { console.debug?.(e); } }), - VC("Index Output", () => { + JC("Index Output", () => { try { - vC(), s(r("toast.rescanningFile", "Rescanning file..."), "info", 1800); + TC(), m(R("toast.rescanningFile", "Rescanning file..."), "info", 1800); } catch (e) { console.debug?.(e); } @@ -31225,23 +31047,23 @@ function HC(e, t, { sidebarTabId: n }) { } //#endregion //#region ui/features/runtime/entryRuntimeLifecycle.ts -var UC = "__MJR_ENTRY_RUNTIME__"; -function WC(e, t) { +var XC = "__MJR_ENTRY_RUNTIME__"; +function ZC(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(B.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(B.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrScanProgressHandler && e.removeEventListener(B.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(B.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(B.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(B.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(B.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(B.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); + 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(H.STRUCTURED_EVENT, e._mjrStructuredEventHandler), e._mjrScanCompleteHandler && e.removeEventListener(H.SCAN_COMPLETE, e._mjrScanCompleteHandler), e._mjrScanProgressHandler && e.removeEventListener(H.SCAN_PROGRESS, e._mjrScanProgressHandler), e._mjrAssetIndexingHandler && e.removeEventListener(H.ASSET_INDEXING, e._mjrAssetIndexingHandler), e._mjrAssetIndexedHandler && e.removeEventListener(H.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(H.ENRICHMENT_STATUS, e._mjrEnrichmentStatusHandler), e._mjrDbRestoreStatusHandler && e.removeEventListener(H.DB_RESTORE_STATUS, e._mjrDbRestoreStatusHandler), e._mjrRuntimeStatusHandler && (e.removeEventListener("progress", e._mjrRuntimeStatusHandler), e.removeEventListener("status", e._mjrRuntimeStatusHandler), e.removeEventListener(H.RUNTIME_STATUS, e._mjrRuntimeStatusHandler), e.removeEventListener("execution_cached", e._mjrExecutionCachedHandler)); } catch (e) { t?.(e, "entry.removeApiHandlers"); } } -function GC(e, t) { +function QC(e, t) { try { let t = e?.assetsDeletedHandler; - t && typeof window < "u" && window.removeEventListener(B.ASSETS_DELETED, t); + t && typeof window < "u" && window.removeEventListener(H.ASSETS_DELETED, t); } catch (e) { t?.(e, "entry.removeRuntimeWindowHandlers"); } } -function KC(e, { reportError: t } = {}) { +function $C(e, { reportError: t } = {}) { if (!(!e || typeof e != "object")) { try { let t = Array.isArray(e._listenerCleanupFns) ? e._listenerCleanupFns : []; @@ -31266,13 +31088,13 @@ function KC(e, { reportError: t } = {}) { console.warn("[MJR teardown]", e); } try { - WC(e.api || null, t), GC(e, t); + ZC(e.api || null, t), QC(e, t); } catch (e) { console.warn("[MJR teardown]", e); } } } -function qC(e, t, n, r, i = void 0) { +function ew(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 { @@ -31292,11 +31114,11 @@ function qC(e, t, n, r, i = void 0) { } }), null; } -function JC({ cleanupEntryRuntimeFn: e = KC, teardownLiveStreamTracker: t, teardownNodeStream: n, teardownFloatingViewerManager: r, teardownGeneratedFeed: i, teardownAssetsSidebar: a, teardownGlobalRuntime: o, teardownTopBarMfvButton: s, reportError: c }) { +function tw({ cleanupEntryRuntimeFn: e = $C, 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[UC]; + let t = window[XC]; e(t, { reportError: c }); } catch (e) { console.warn("[MJR teardown]", e); @@ -31336,7 +31158,7 @@ function JC({ cleanupEntryRuntimeFn: e = KC, teardownLiveStreamTracker: t, teard } catch (e) { console.warn("[MJR teardown]", e); } - window[UC] = { + window[XC] = { api: null, assetsDeletedHandler: null, _cleanupControllers: [], @@ -31349,35 +31171,35 @@ function JC({ cleanupEntryRuntimeFn: e = KC, teardownLiveStreamTracker: t, teard } //#endregion //#region ui/entry.ts -var YC = null, XC = null, ZC = "majoor-assets", QC = "__MJR_EXECUTION_RUNTIME__", $C = "Majoor.AssetsManager", ew = { +var nw = null, rw = null, iw = "majoor-assets", aw = "__MJR_EXECUTION_RUNTIME__", ow = "Majoor.AssetsManager", sw = { active: null, promptId: "" -}, 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) { +}, cw = null, lw = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, uw = /^[0-9a-f]{20,}$/i; +function dw(...e) { for (let t of e) { let e = String(t || "").trim(); if (e) return e; } return ""; } -function aw(e) { +function fw(e) { let t = String(e || "").trim(); - return nw.test(t) || rw.test(t); + return lw.test(t) || uw.test(t); } -function ow(e) { - return iw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); +function pw(e) { + return dw(e?.title, e?.properties?.title, e?.properties?.name, e?.properties?.label, e?.name); } -function sw(e) { +function mw(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 cw(e) { - return sw(e).length > 0; +function hw(e) { + return mw(e).length > 0; } -function lw(e) { +function gw(e) { return !e || typeof e != "object" ? !1 : [ e.subgraph, e._subgraph, @@ -31388,13 +31210,13 @@ function lw(e) { e.subgraph_instance?.graph, e.inner_graph, e.subgraph_graph - ].some(cw) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : aw(e.type) && !!ow(e); + ].some(hw) || Array.isArray(e.nodes) && e.nodes.length > 0 && e.nodes !== e.graph?.nodes ? !0 : fw(e.type) && !!pw(e); } -function uw(e, t) { - let n = String(e?.type || t || "").trim(), r = ow(e); - return aw(n) ? r || "Subgraph" : n || r || "Node"; +function _w(e, t) { + let n = String(e?.type || t || "").trim(), r = pw(e); + return fw(n) ? r || "Subgraph" : n || r || "Node"; } -function dw() { +function vw() { try { return typeof window > "u" ? { active_prompt_id: null, @@ -31403,84 +31225,84 @@ function dw() { progress_value: null, progress_max: null, cached_nodes: [] - } : ((!window[QC] || typeof window[QC] != "object") && (window[QC] = { + } : ((!window[aw] || typeof window[aw] != "object") && (window[aw] = { active_prompt_id: null, queue_remaining: null, progress_node: null, progress_value: null, progress_max: null, cached_nodes: [] - }), window[QC]); + }), window[aw]); } catch (e) { return console.debug?.(e), {}; } } -function fw(e = {}) { +function yw(e = {}) { try { - let t = dw(); - Object.assign(t, e || {}), window.dispatchEvent(new CustomEvent(B.RUNTIME_STATUS, { detail: { ...t } })); + let t = vw(); + Object.assign(t, e || {}), window.dispatchEvent(new CustomEvent(H.RUNTIME_STATUS, { detail: { ...t } })); } catch (e) { console.debug?.(e); } } -async function pw({ active: e, promptId: t = "" } = {}) { +async function bw({ active: e, promptId: t = "" } = {}) { let n = !!e, r = String(t || "").trim(); - if (!(ew.active === n && ew.promptId === r)) { - ew = { + if (!(sw.active === n && sw.promptId === r)) { + sw = { active: n, promptId: r }; try { - await ye(Le.RUNTIME_EXECUTION, { + await y(L.RUNTIME_EXECUTION, { active: n, prompt_id: r || void 0, - cooldown_ms: Number(I.EXECUTION_IDLE_GRACE_MS) || 6e3 + cooldown_ms: Number(z.EXECUTION_IDLE_GRACE_MS) || 6e3 }); } catch (e) { - at(e, "entry.execution_state_sync"); + st(e, "entry.execution_state_sync"); } } } -function mw() { +function xw() { try { - return !!String(dw()?.active_prompt_id || "").trim(); + return !!String(vw()?.active_prompt_id || "").trim(); } catch (e) { return console.debug?.(e), !1; } } -function hw(e = 1200) { +function Sw(e = 1200) { try { - tw && clearTimeout(tw); + cw && clearTimeout(cw); } catch (e) { console.debug?.(e); } - tw = setTimeout(() => { - if (tw = null, mw()) { - hw(e); + cw = setTimeout(() => { + if (cw = null, xw()) { + Sw(e); return; } - let t = qe(); - t && Br(t); + let t = Je(); + t && Vr(t); }, Math.max(250, Number(e) || 0)); } -function gw(e) { - import("./chunks/LiveStreamTracker-FHT3u-OV.js").then((t) => { - YC = t; +function Cw(e) { + import("./chunks/LiveStreamTracker-mAm9Jo6q.js").then((t) => { + nw = 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-_rtriits.js").then((t) => { - XC = t; + }).catch((e) => console.warn("[MJR setup] LiveStreamTracker load failed:", e)), import("./chunks/NodeStreamController-EQygLyLg.js").then((t) => { + rw = t; try { t.initNodeStream({ app: e, - onOutput: (e) => nt.feedNodeStream(e), + onOutput: (e) => it.feedNodeStream(e), onStatus: (t, n) => { try { - let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = lw(r), a = ow(r), o = i ? "Subgraph" : uw(r, n); - nt.setNodeStreamSelection?.(t, o, i ? a || uw(r, n) : a); + let r = (e?.graph ?? e?.canvas?.graph ?? null)?.getNodeById?.(Number(t)), i = gw(r), a = pw(r), o = i ? "Subgraph" : _w(r, n); + it.setNodeStreamSelection?.(t, o, i ? a || _w(r, n) : a); } catch (e) { console.debug?.("[NodeStream] onStatus failed", e); } @@ -31491,12 +31313,12 @@ function gw(e) { } }).catch((e) => console.warn("[MJR setup] NodeStream load failed:", e)); } -async function _w(e, t) { - let n = await D({ +async function ww(e, t) { + let n = await xe({ app: e, timeoutMs: 4e3 - }) || C(e); - if (he(n || null), !n) { + }) || fe(e); + if (Se(n || null), !n) { console.warn("Majoor API not available, real-time updates disabled"); return; } @@ -31504,93 +31326,93 @@ async function _w(e, t) { api: n, app: e }).catch((e) => console.debug?.("[Majoor] MFV progress tracking init failed", e)); - let i = null; + let r = null; try { - i = typeof window < "u" && window.__MJR_ENTRY_RUNTIME__ || null; + r = typeof window < "u" && window.__MJR_ENTRY_RUNTIME__ || null; } catch (e) { console.debug?.(e); } - WC(i?.api || null, at), n !== i?.api && WC(n, at), GC(i, at), await wm({ + ZC(r?.api || null, st), n !== r?.api && ZC(n, st), QC(r, st), await Em({ api: n, - runtime: i, + runtime: r, executionRuntime: t, appRef: Jn, - liveStreamModule: YC, - ensureExecutionRuntime: dw, - emitRuntimeStatus: fw, - getActiveGridContainer: qe, - pushGeneratedAsset: Sp, - upsertAsset: Jr, - upsertAssetNow: Yr, - removeAssetsFromGrid: qr, - getEnrichmentState: St, - setEnrichmentState: Wt, - comfyToast: s, - t: r, - reportError: at, - registerCleanableListener: qC, - syncExecutionBackendState: pw + liveStreamModule: nw, + ensureExecutionRuntime: vw, + emitRuntimeStatus: yw, + getActiveGridContainer: Je, + pushGeneratedAsset: wp, + upsertAsset: Yr, + upsertAssetNow: Xr, + removeAssetsFromGrid: Jr, + getEnrichmentState: Jt, + setEnrichmentState: lt, + comfyToast: m, + t: R, + reportError: st, + registerCleanableListener: ew, + syncExecutionBackendState: bw }); } -var vw = Wp({ - post: ye, - ENDPOINTS: Le, - reportError: at, - extractOutputFiles: Gp, - ensureExecutionRuntime: dw, - emitRuntimeStatus: fw, - refreshGeneratedFeedHosts: sp, - getActiveGridContainer: qe +var Tw = Kp({ + post: y, + ENDPOINTS: L, + reportError: st, + extractOutputFiles: qp, + ensureExecutionRuntime: vw, + emitRuntimeStatus: yw, + refreshGeneratedFeedHosts: lp, + getActiveGridContainer: Je }); Jn.registerExtension({ - name: $C, - settings: st(Jn), - commands: CC(Jn, { - sidebarTabId: ZC, - triggerStartupScan: cr + name: ow, + settings: Dt(Jn), + commands: AC(Jn, { + sidebarTabId: iw, + triggerStartupScan: lr }), - keybindings: wC(), - menuCommands: TC(), - aboutPageBadges: DC(), - bottomPanelTabs: IC(), + keybindings: jC(), + menuCommands: MC(), + aboutPageBadges: PC(), + bottomPanelTabs: UC(), async setup() { - JC({ - cleanupEntryRuntimeFn: KC, - teardownLiveStreamTracker: (e) => YC?.teardownLiveStreamTracker(e), - teardownNodeStream: (e) => XC?.teardownNodeStream(e), - teardownFloatingViewerManager: et, - teardownGeneratedFeed: LC, - teardownAssetsSidebar: jC, - teardownGlobalRuntime: gC, - teardownTopBarMfvButton: sC, - reportError: at - }), Om(), f(Jn); - let e = await A({ timeoutMs: 12e3 }) || Jn; - f(e), nh(e); + tw({ + cleanupEntryRuntimeFn: $C, + teardownLiveStreamTracker: (e) => nw?.teardownLiveStreamTracker(e), + teardownNodeStream: (e) => rw?.teardownNodeStream(e), + teardownFloatingViewerManager: nt, + teardownGeneratedFeed: WC, + teardownAssetsSidebar: RC, + teardownGlobalRuntime: CC, + teardownTopBarMfvButton: mC, + reportError: st + }), Am(), me(Jn); + let e = await Ce({ timeoutMs: 12e3 }) || Jn; + me(e), ah(e); try { typeof window < "u" && (window.__MJR_RUNTIME_APP__ = e); } catch (e) { console.debug?.(e); } - fr(), Pr({ enabled: !0 }), hC(), gw(e), Tt(e, () => { - let e = qe(); + pr(), Fr({ enabled: !0 }), SC(), Cw(e), mt(e, () => { + let e = Je(); if (e) { - if (I.DEFER_GRID_FETCH_DURING_EXECUTION && mw()) { - hw(); + if (z.DEFER_GRID_FETCH_DURING_EXECUTION && xw()) { + Sw(); return; } - Br(e); + Vr(e); } - }), OC(e, { - sidebarTabId: ZC, - triggerStartupScan: cr - }), kC(e), setTimeout(() => { - Mr(); - }, 5e3), _w(e, vw).catch((e) => at(e, "entry.api_setup")), AC(e, { sidebarTabId: ZC }) ? it("[Majoor] Sidebar tab registered (Vue)") : console.warn("Majoor Assets Manager: extensionManager.registerSidebarTab is unavailable"); + }), FC(e, { + sidebarTabId: iw, + triggerStartupScan: lr + }), IC(e), setTimeout(() => { + Nr(); + }, 5e3), ww(e, Tw).catch((e) => st(e, "entry.api_setup")), LC(e, { sidebarTabId: iw }) ? ot("[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 { - PC(); + VC(); } catch (e) { console.debug?.(e); } @@ -31599,26 +31421,26 @@ Jn.registerExtension({ } catch (e) { console.debug?.(e); } - Tm({ resolveNodeStreamModule: async () => (XC ||= await import("./chunks/NodeStreamController-_rtriits.js"), XC) }); + Dm({ resolveNodeStreamModule: async () => (rw ||= await import("./chunks/NodeStreamController-EQygLyLg.js"), rw) }); }, onNodeOutputsUpdated(e) { try { - vw.handleNodeOutputsUpdated(e); + Tw.handleNodeOutputsUpdated(e); } catch (e) { console.debug?.("[Majoor] onNodeOutputsUpdated error", e); } }, getNodeMenuItems(e) { - return HC(e, Jn, { sidebarTabId: ZC }); + return YC(e, Jn, { sidebarTabId: iw }); }, getCanvasMenuItems(e) { - return EC(Jn, { - sidebarTabId: ZC, - triggerStartupScan: cr + return NC(Jn, { + sidebarTabId: iw, + triggerStartupScan: lr }); }, getSelectionToolboxCommands(e) { - return BC(e); + return qC(e); } }); //#endregion diff --git a/mjr_am_backend/features/index/searcher.py b/mjr_am_backend/features/index/searcher.py index 80bc4d7d..50eb5832 100644 --- a/mjr_am_backend/features/index/searcher.py +++ b/mjr_am_backend/features/index/searcher.py @@ -281,6 +281,7 @@ def _build_filter_clauses(filters: dict[str, Any] | None, alias: str = "a") -> t _append_subfolder_filter(filters, alias, clauses, params) _append_numeric_range_filters(filters, alias, clauses, params) _append_tag_filter(filters, clauses, params) + _append_workflow_id_filter(filters, alias, clauses, params) _append_workflow_type_filter(filters, clauses, params) _append_has_workflow_filter(filters, clauses) _append_mtime_filters(filters, alias, clauses, params) @@ -423,6 +424,28 @@ def _append_workflow_type_filter(filters: dict[str, Any], clauses: list[str], pa params.extend(variants) +def _append_workflow_id_filter( + filters: dict[str, Any], + alias: str, + clauses: list[str], + params: list[Any], +) -> None: + workflow_id = str(filters.get("workflow_id") or "").strip() + if not workflow_id: + return + workflow_id = workflow_id[:255] + workflow_id_expr = _safe_metadata_json_extract("$.workflow_id") + workflow_obj_id_expr = _safe_metadata_json_extract("$.workflow.id") + clauses.append( + "AND (" + f"TRIM(COALESCE({alias}.workflow_id, '')) = ? " + f"OR {workflow_id_expr} = ? " + f"OR {workflow_obj_id_expr} = ?" + ")" + ) + params.extend([workflow_id, workflow_id, workflow_id]) + + def _workflow_type_variants(raw: str) -> list[str]: alias_map = { "T2I": ["T2I"], diff --git a/mjr_am_backend/features/metadata/extractors.py b/mjr_am_backend/features/metadata/extractors.py index 23cdb805..df3d3c1f 100644 --- a/mjr_am_backend/features/metadata/extractors.py +++ b/mjr_am_backend/features/metadata/extractors.py @@ -1189,7 +1189,12 @@ def _apply_workflow_prompt_quality( prompt: dict[str, Any] | None, ) -> None: if looks_like_comfyui_workflow(workflow): + if not isinstance(workflow, dict): + return metadata["workflow"] = workflow + workflow_id = str(workflow.get("id") or "").strip() + if workflow_id and not metadata.get("workflow_id"): + metadata["workflow_id"] = workflow_id[:255] _bump_quality(metadata, "full") if looks_like_comfyui_prompt_graph(prompt): metadata["prompt"] = prompt diff --git a/mjr_am_backend/routes/search/query_sanitizer.py b/mjr_am_backend/routes/search/query_sanitizer.py index 00792ae9..c79315ad 100644 --- a/mjr_am_backend/routes/search/query_sanitizer.py +++ b/mjr_am_backend/routes/search/query_sanitizer.py @@ -259,6 +259,13 @@ def _apply_workflow_type_filter(query: "Mapping[str, Any]", filters: "dict[str, filters["workflow_type"] = workflow_type +def _apply_workflow_id_filter(query: "Mapping[str, Any]", filters: "dict[str, Any]") -> None: + if "workflow_id" in query: + workflow_id = str(query["workflow_id"] or "").strip() + if workflow_id: + filters["workflow_id"] = workflow_id[:255] + + def parse_request_filters( query: Mapping[str, Any], inline_filters: dict[str, Any] | None = None, @@ -279,6 +286,7 @@ def parse_request_filters( return err _apply_workflow_type_filter(query, filters) + _apply_workflow_id_filter(query, filters) _apply_bool_flags(query, filters) date_err = _apply_date_filters(query, filters) diff --git a/ui/api/clientOps.ts b/ui/api/clientOps.ts index 8a5569c5..eeb34b71 100644 --- a/ui/api/clientOps.ts +++ b/ui/api/clientOps.ts @@ -429,7 +429,7 @@ export async function getCollectionAssets(collectionId: any) { /** * Semantic search by natural-language query via SigLIP2 embeddings. * @param {string} query - * @param {number|{topK?:number, scope?:string, customRootId?:string, subfolder?:string, kind?:string, hasWorkflow?:boolean, minRating?:number, minSizeMB?:number, maxSizeMB?:number, minWidth?:number, minHeight?:number, maxWidth?:number, maxHeight?:number, workflowType?:string, dateRange?:string, dateExact?:string}} [topKOrOptions=20] + * @param {number|{topK?:number, scope?:string, customRootId?:string, subfolder?:string, kind?:string, hasWorkflow?:boolean, minRating?:number, minSizeMB?:number, maxSizeMB?:number, minWidth?:number, minHeight?:number, maxWidth?:number, maxHeight?:number, workflowType?:string, workflowId?:string, dateRange?:string, dateExact?:string}} [topKOrOptions=20] * @returns {Promise>} */ export async function vectorSearch(query: any, topKOrOptions: number | Record = 20) { @@ -457,6 +457,7 @@ export async function vectorSearch(query: any, topKOrOptions: number | Record { try { - const app = getComfyApp(); + const app = getRawHostApp(); return app?.ui || null; } catch { return null; @@ -24,17 +24,7 @@ export const getExtensionManagerDialog = (): MajoorExtensionDialog | null => { typeof dlg.confirm === "function" || typeof dlg.prompt === "function"); try { - const app = getComfyApp(); - const dlg = getExtensionDialogApi(app); - if (hasDialogMethod(dlg)) { - return dlg; - } - } catch (e) { - console.debug?.(e); - } - try { - const app = typeof window !== "undefined" ? window?.app : null; - const dlg = app?.extensionManager?.dialog || null; + const dlg = getHostDialogApi(); if (hasDialogMethod(dlg)) { return dlg; } @@ -46,17 +36,7 @@ export const getExtensionManagerDialog = (): MajoorExtensionDialog | null => { export const getExtensionManagerToast = (): MajoorExtensionToast | null => { try { - const app = getComfyApp(); - const toast = getExtensionToastApi(app); - if (toast && typeof toast.add === "function") { - return toast; - } - } catch (e) { - console.debug?.(e); - } - try { - const app = typeof window !== "undefined" ? window?.app : null; - const toast = app?.extensionManager?.toast || null; + const toast = getHostToastApi(); if (toast && typeof toast.add === "function") { return toast; } diff --git a/ui/app/graphTraversal.ts b/ui/app/graphTraversal.ts index 76c882d2..8184d484 100644 --- a/ui/app/graphTraversal.ts +++ b/ui/app/graphTraversal.ts @@ -3,7 +3,7 @@ type LooseRecord = Record; export type GraphVisit = { graph: LooseRecord; label: string }; export type GraphNodeVisit = { node: LooseRecord; graph: LooseRecord; label: string }; -export function getHostRootGraph(app: any): LooseRecord | null { +export function getHostRootGraph(app: any = null): LooseRecord | null { return app?.rootGraph ?? app?.graph?.rootGraph ?? app?.graph ?? app?.canvas?.graph ?? null; } diff --git a/ui/app/hostAdapter.ts b/ui/app/hostAdapter.ts index 550c4c94..2cf6da64 100644 --- a/ui/app/hostAdapter.ts +++ b/ui/app/hostAdapter.ts @@ -26,6 +26,7 @@ import type { MajoorComfyApp, MajoorComfyApi, MajoorExtensionManager } from "../ import { activateBottomPanelTabCompat, activateSidebarTabCompat, + fetchComfyApi, getComfyApi, getComfyApp, getExtensionDialogApi, @@ -42,10 +43,19 @@ import { waitForComfyApi, waitForComfyApp, } from "./comfyApiBridge.js"; +import { findGraphNodeById, getHostRootGraph, walkGraphNodes } from "./graphTraversal.js"; // -- 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", + "node-selected", + "node-deselected", + "node-selection-change", +]; // -- lifecycle ----------------------------------------------------------------- @@ -108,6 +118,17 @@ export function showToast(opts: { severity?: string; summary?: string; detail?: } } +/** + * Returns the raw ComfyUI toast API when available. + */ +export function getHostToastApi(app: any = null): any { + try { + return getExtensionToastApi(app || _app || getComfyApp()) || null; + } catch { + return null; + } +} + // -- dialogs ------------------------------------------------------------------- /** @@ -133,6 +154,17 @@ export async function confirm(opts: { message: string; header?: string } | null return false; } +/** + * Returns the raw ComfyUI dialog API when available. + */ +export function getHostDialogApi(app: any = null): any { + try { + return getExtensionDialogApi(app || _app || getComfyApp()) || null; + } catch { + return null; + } +} + // -- settings ------------------------------------------------------------------ /** @@ -151,6 +183,15 @@ export function getSetting(key: string, defaultValue: any = null): any { } } +export function getSettingForApp(app: any, key: string, defaultValue: any = null): any { + try { + const value = getSettingValue(app || _app || getComfyApp(), key); + return value !== null && value !== undefined ? value : defaultValue; + } catch { + return defaultValue; + } +} + /** * Write a ComfyUI setting value. * @@ -166,6 +207,14 @@ export function setSetting(key: string, value: any): boolean { } } +export function setSettingForApp(app: any, key: string, value: any): boolean { + try { + return setSettingValue(app || _app || getComfyApp(), key, value); + } catch { + return false; + } +} + /** * Get the raw ComfyUI settings API (for registration, not for reading ad-hoc values). * Prefer `getSetting()` for reading individual settings. @@ -365,6 +414,549 @@ export async function waitForRawHostApi(options: { timeoutMs?: number; warnOnTim } } +/** + * Send an HTTP request through ComfyUI's API layer when available. + * Falls back to the bridge compatibility logic when the host is still warming up. + * + * @param {string} url + * @param {RequestInit | null} [options=null] + * @param {object | null} [app=null] + * @returns {Promise} + */ +export async function fetchHostApi(url: string, options: RequestInit | null = null, app: any = null): Promise { + try { + return await fetchComfyApi(url, options, app || _app || getComfyApp()); + } catch { + return fetch(url, { credentials: "include", ...(options || {}) }); + } +} + +function _safeAddEventListener(target: any, type: string, handler: EventListener): (() => void) | null { + if (!target || typeof target.addEventListener !== "function") return null; + try { + target.addEventListener(type, handler); + } catch { + return null; + } + return () => { + try { + target.removeEventListener?.(type, handler); + } catch (e) { + console.debug?.(e); + } + }; +} + +export function observeHostCanvasSelection( + onSelectionChange: (() => void) | null | undefined, + options: { app?: any; includePointerFallback?: boolean } = {}, +): (() => void) | null { + if (typeof onSelectionChange !== "function") return null; + const app = options.app || _app || getComfyApp(); + const canvas = app?.canvas; + if (!canvas) return null; + + const cleanups: Array<() => void> = []; + let callbackBound = false; + const eventTargets = [canvas, app, app?.graph].filter( + (target, index, all) => target && all.indexOf(target) === index, + ); + + const scheduleSelectionChange = () => { + try { + onSelectionChange(); + } catch (e) { + console.debug?.(e); + } + }; + + for (const target of eventTargets) { + for (const type of HOST_CANVAS_SELECTION_EVENT_TYPES) { + const cleanup = _safeAddEventListener(target, type, scheduleSelectionChange); + if (cleanup) { + cleanups.push(cleanup); + callbackBound = true; + } + } + } + + if (!callbackBound) { + const hadOwnOnNodeSelected = Object.prototype.hasOwnProperty.call(canvas, "onNodeSelected"); + const hadOwnOnSelectionChange = Object.prototype.hasOwnProperty.call( + canvas, + "onSelectionChange", + ); + const hadOwnOnNodeDeselected = Object.prototype.hasOwnProperty.call( + canvas, + "onNodeDeselected", + ); + const originalOnNodeSelected = canvas.onNodeSelected; + const originalOnSelectionChange = canvas.onSelectionChange; + const originalOnNodeDeselected = canvas.onNodeDeselected; + + canvas.onNodeSelected = function (node: any) { + originalOnNodeSelected?.call(this, node); + scheduleSelectionChange(); + }; + canvas.onSelectionChange = function (selectedNodes: any) { + originalOnSelectionChange?.call(this, selectedNodes); + scheduleSelectionChange(); + }; + canvas.onNodeDeselected = function (node: any) { + originalOnNodeDeselected?.call(this, node); + scheduleSelectionChange(); + }; + + cleanups.push(() => { + try { + if (hadOwnOnNodeSelected) canvas.onNodeSelected = originalOnNodeSelected; + else delete canvas.onNodeSelected; + if (hadOwnOnSelectionChange) canvas.onSelectionChange = originalOnSelectionChange; + else delete canvas.onSelectionChange; + if (hadOwnOnNodeDeselected) canvas.onNodeDeselected = originalOnNodeDeselected; + else delete canvas.onNodeDeselected; + } catch (e) { + console.debug?.(e); + } + }); + } + + if (options.includePointerFallback !== false && canvas.canvas?.addEventListener) { + const cleanup = _safeAddEventListener(canvas.canvas, "pointerup", scheduleSelectionChange); + if (cleanup) cleanups.push(cleanup); + } + + let disposed = false; + return () => { + if (disposed) return; + disposed = true; + for (const cleanup of cleanups.splice(0).reverse()) { + cleanup(); + } + }; +} + +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; + const api = liveApi || getRawHostApi(runtimeApp); + if (api && typeof api.interrupt === "function") { + await api.interrupt(); + return true; + } + if (api && typeof api.fetchApi === "function") { + const resp = await api.fetchApi("/interrupt", { method: "POST" }); + if (!resp?.ok) throw new Error(`POST /interrupt failed (${resp?.status})`); + return true; + } + const resp = await fetch("/interrupt", { method: "POST", credentials: "include" }); + if (!resp.ok) throw new Error(`POST /interrupt failed (${resp.status})`); + return false; +} + +function _getHostCanvas(app: any = null): any { + const runtimeApp = app || _app || getComfyApp(); + return runtimeApp?.canvas || null; +} + +export function getHostCanvas(app: any = null): any { + return _getHostCanvas(app); +} + +function _getHostGraph(app: any = null): any { + const runtimeApp = app || _app || getComfyApp(); + return runtimeApp?.graph || runtimeApp?.canvas?.graph || null; +} + +export function getHostGraph(app: any = null): any { + return _getHostGraph(app); +} + +function _cloneHostQueuedWidgetValue(value: T): T { + if (value == null || typeof value !== "object") return value; + try { + return typeof structuredClone === "function" + ? structuredClone(value) + : JSON.parse(JSON.stringify(value)); + } catch { + return value; + } +} + +function _walkHostGraphNodes(graph: any, callback: (node: any) => void) { + walkGraphNodes(graph, ({ node }) => callback(node)); +} + +function _captureHostQueuedWidgetSnapshots(graph: any): Array<{ widget: any; value: any }> { + const snapshots: Array<{ widget: any; value: any }> = []; + _walkHostGraphNodes(graph, (node: any) => { + for (const widget of node?.widgets ?? []) { + snapshots.push({ widget, value: _cloneHostQueuedWidgetValue(widget?.value) }); + } + }); + return snapshots; +} + +function _restoreHostQueuedWidgetSnapshots( + app: any, + snapshots: Array<{ widget: any; value: any }> | null, +) { + for (const entry of Array.isArray(snapshots) ? snapshots : []) { + const widget = entry?.widget; + if (!widget || typeof widget !== "object") continue; + const restoredValue = _cloneHostQueuedWidgetValue(entry?.value); + try { + widget.value = restoredValue; + } catch (e) { + console.debug?.(e); + continue; + } + try { + widget.callback?.(restoredValue); + } catch (e) { + console.debug?.(e); + } + } + refreshHostCanvasGraph(app, { change: false }); +} + +function _resolveHostClientId(api: any, app: any): string { + const candidates = [ + api?.clientId, + api?.clientID, + api?.client_id, + app?.clientId, + app?.clientID, + app?.client_id, + ]; + for (const value of candidates) { + const safe = String(value || "").trim(); + if (safe) return safe; + } + return ""; +} + +function _readSelectedCanvasCollection(app: any = null): any { + const canvas = _getHostCanvas(app); + return canvas?.selected_nodes ?? canvas?.selectedNodes ?? null; +} + +export function getSelectedHostCanvasNodes(app: any = null): any[] { + const selected = _readSelectedCanvasCollection(app); + if (!selected) return []; + if (Array.isArray(selected)) return selected.filter(Boolean); + if (selected instanceof Map) return Array.from(selected.values()).filter(Boolean); + if (typeof selected === "object") return Object.values(selected).filter(Boolean); + return []; +} + +export function getSelectedHostCanvasNodeIds(app: any = null): string[] { + return getSelectedHostCanvasNodes(app) + .map((node: any) => String(node?.id ?? "").trim()) + .filter(Boolean); +} + +export function getFirstSelectedHostCanvasNode(app: any = null): any { + return getSelectedHostCanvasNodes(app)[0] || null; +} + +export function refreshHostCanvasGraph(app: any = null, options: { draw?: boolean; change?: boolean } = {}): boolean { + try { + const runtimeApp = app || _app || getComfyApp(); + const canvas = _getHostCanvas(runtimeApp); + const graph = _getHostGraph(runtimeApp); + canvas?.setDirty?.(true, true); + if (options.draw !== false) { + canvas?.draw?.(true, true); + } + graph?.setDirtyCanvas?.(true, true); + if (options.change !== false) { + graph?.change?.(); + } + return Boolean(canvas || graph); + } catch (e) { + console.debug?.(e); + return false; + } +} + +export function notifyHostNodeGraphChanged( + node: any, + app: any = null, + options: { draw?: boolean; change?: boolean } = {}, +): boolean { + try { + const runtimeApp = app || _app || getComfyApp(); + const rootGraph = _getHostGraph(runtimeApp); + const nodeGraph = node?.graph ?? null; + if (nodeGraph && nodeGraph !== rootGraph) { + nodeGraph.setDirtyCanvas?.(true, true); + if (options.change !== false) { + nodeGraph.change?.(); + } + } + return refreshHostCanvasGraph(runtimeApp, options); + } catch (e) { + console.debug?.(e); + return false; + } +} + +export function addNodeToHostGraph(node: any, app: any = null): boolean { + if (!node) return false; + try { + const runtimeApp = app || _app || getComfyApp(); + const graph = _getHostGraph(runtimeApp); + if (!graph || typeof graph.add !== "function") return false; + graph.add(node); + notifyHostNodeGraphChanged(node, runtimeApp); + return true; + } catch (e) { + console.debug?.(e); + return false; + } +} + +export function importWorkflowIntoHostCanvas(workflow: any, app: any = null): boolean { + const runtimeApp = app || _app || getComfyApp(); + if (!workflow || typeof workflow !== "object") return false; + try { + if (typeof runtimeApp?.loadGraphData === "function") { + runtimeApp.loadGraphData(workflow); + return true; + } + const graph = _getHostGraph(runtimeApp); + if (typeof graph?.configure === "function") { + graph.configure(workflow); + refreshHostCanvasGraph(runtimeApp, { draw: false, change: false }); + return true; + } + } catch (e) { + console.debug?.(e); + } + return false; +} + +export async function queueHostPrompt( + options: { + app?: any; + forceNativeQueue?: boolean; + resolvePromptData?: ((app: any) => any | Promise) | null; + enrichPromptData?: ((promptData: any) => any) | null; + buildPromptRequestBody?: ((promptData: any, context: { clientId: string }) => any) | null; + } = {}, +): Promise { + const app = options.app || _app || getComfyApp(); + if (!app) throw new Error("ComfyUI app not available"); + + const api = getRawHostApi(app); + const hasApiPath = Boolean( + (api && typeof api.queuePrompt === "function") || + (api && typeof api.fetchApi === "function"), + ); + + if ((options.forceNativeQueue || !hasApiPath) && typeof app.queuePrompt === "function") { + await app.queuePrompt(0); + return true; + } + + const rootGraph = getHostRootGraph(app); + let widgetSnapshots: Array<{ widget: any; value: any }> | null = null; + try { + widgetSnapshots = _captureHostQueuedWidgetSnapshots(rootGraph); + _walkHostGraphNodes(rootGraph, (node: any) => { + for (const widget of node?.widgets ?? []) { + widget.beforeQueued?.({ isPartialExecution: false }); + } + }); + + const resolver = + typeof options.resolvePromptData === "function" + ? options.resolvePromptData + : (runtimeApp: any) => runtimeApp?.graphToPrompt?.(); + const promptData = await resolver(app); + if (!promptData?.output) throw new Error("graphToPrompt returned empty output"); + + const enriched = + typeof options.enrichPromptData === "function" + ? options.enrichPromptData(promptData) + : promptData; + + if (api && typeof api.queuePrompt === "function") { + await api.queuePrompt(0, enriched); + _walkHostGraphNodes(rootGraph, (node: any) => { + for (const widget of node?.widgets ?? []) { + widget.afterQueued?.({ isPartialExecution: false }); + } + }); + refreshHostCanvasGraph(app, { change: false }); + return true; + } + + const bodyBuilder = + typeof options.buildPromptRequestBody === "function" + ? options.buildPromptRequestBody + : (pd: any, context: { clientId: string }) => { + const body: Record = { + prompt: pd?.output, + extra_data: pd?.extra_data || {}, + }; + if (context.clientId) body.client_id = context.clientId; + return body; + }; + const body = bodyBuilder(promptData, { clientId: _resolveHostClientId(api, app) }); + + if (api && typeof api.fetchApi === "function") { + const resp = await api.fetchApi("/prompt", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + if (!resp?.ok) throw new Error(`POST /prompt failed (${resp?.status})`); + _walkHostGraphNodes(rootGraph, (node: any) => { + for (const widget of node?.widgets ?? []) { + widget.afterQueued?.({ isPartialExecution: false }); + } + }); + refreshHostCanvasGraph(app, { change: false }); + return true; + } + + const resp = await fetch("/prompt", { + method: "POST", + credentials: "include", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + if (!resp.ok) throw new Error(`POST /prompt failed (${resp.status})`); + _walkHostGraphNodes(rootGraph, (node: any) => { + for (const widget of node?.widgets ?? []) { + widget.afterQueued?.({ isPartialExecution: false }); + } + }); + refreshHostCanvasGraph(app, { change: false }); + return false; + } catch (error) { + _restoreHostQueuedWidgetSnapshots(app, widgetSnapshots); + throw error; + } +} + +export function focusHostCanvasNode( + node: any, + options: { app?: any; select?: boolean; focusCanvas?: boolean } = {}, +): boolean { + if (!node) return false; + try { + const runtimeApp = options.app || _app || getComfyApp(); + const canvas = _getHostCanvas(runtimeApp); + if (!canvas) return false; + if (options.select !== false) { + canvas.selectNode?.(node, false); + } + if (typeof canvas.centerOnNode === "function") { + canvas.centerOnNode(node); + } else if (node.pos && canvas.ds) { + const canvasEl = canvas.canvas || canvas.element || null; + const width = Number(canvasEl?.width || canvasEl?.clientWidth || 800) || 800; + const height = Number(canvasEl?.height || canvasEl?.clientHeight || 600) || 600; + const scale = Number(canvas.ds?.scale || 1) || 1; + const nodeWidth = Number(node?.size?.[0] || 100) || 100; + const nodeHeight = Number(node?.size?.[1] || 80) || 80; + const offsetX = -Number(node.pos[0] || 0) + width / (2 * scale) - nodeWidth / 2; + const offsetY = -Number(node.pos[1] || 0) + height / (2 * scale) - nodeHeight / 2; + if (Array.isArray(canvas.ds.offset)) { + canvas.ds.offset[0] = offsetX; + canvas.ds.offset[1] = offsetY; + } else if (canvas.ds.offset && typeof canvas.ds.offset === "object") { + canvas.ds.offset.x = offsetX; + canvas.ds.offset.y = offsetY; + } + canvas.setDirty?.(true, true); + } + if (options.focusCanvas !== false) { + canvas.canvas?.focus?.(); + } + return true; + } catch (e) { + console.debug?.(e); + return false; + } +} + +export function centerHostCanvasNodeById(nodeId: any, app: any = null): boolean { + const safeNodeId = String(nodeId || "").trim(); + if (!safeNodeId) return false; + try { + const runtimeApp = app || _app || getComfyApp(); + const node = findGraphNodeById(getHostRootGraph(runtimeApp), safeNodeId); + if (!node) return false; + return focusHostCanvasNode(node, { app: runtimeApp, select: false, focusCanvas: false }); + } catch (e) { + console.debug?.(e); + return false; + } +} + // -- graph/canvas helpers ----------------------------------------------------- function _getMainCanvasState() { @@ -468,9 +1060,13 @@ export const hostAdapter = { isReady, ready, showToast, + getHostToastApi, confirm, + getHostDialogApi, getSetting, + getSettingForApp, setSetting, + setSettingForApp, getHostSettingsApi, registerSidebarTab, registerSidebarTabForApp, @@ -486,6 +1082,22 @@ export const hostAdapter = { getRawHostApp, getRawHostApi, waitForRawHostApi, + fetchHostApi, + queueHostPrompt, + observeHostCanvasSelection, + wrapHostQueuePrompt, + interruptHostExecution, + getSelectedHostCanvasNodes, + getSelectedHostCanvasNodeIds, + getFirstSelectedHostCanvasNode, + getHostCanvas, + getHostGraph, + refreshHostCanvasGraph, + notifyHostNodeGraphChanged, + importWorkflowIntoHostCanvas, + addNodeToHostGraph, + focusHostCanvasNode, + centerHostCanvasNodeById, centerGraphCanvasOnWorldPoint, getGraphCanvasViewportBounds, }; diff --git a/ui/app/i18n.ts b/ui/app/i18n.ts index 23b894af..bd2aece5 100644 --- a/ui/app/i18n.ts +++ b/ui/app/i18n.ts @@ -11,7 +11,7 @@ * - RTL language support for Arabic/Persian */ import type { MajoorComfyApp } from "../types/comfyui-frontend.js"; -import { getSettingValue } from "./comfyApiBridge.js"; +import { getSettingForApp } from "./hostAdapter.js"; import { SettingsStore } from "./settings/SettingsStore.js"; const DEFAULT_LANG = "en-US"; @@ -378,6 +378,7 @@ const DICTIONARY: Record> = { "label.only": "Only", "label.toastHistory": "History", "label.workflowType": "WF Type", + "label.sameWorkflow": "Generated with Same Workflow", "label.resolution": "Resolution", "label.fileSizeMB": "File size (MB)", "label.min": "Min", @@ -426,6 +427,7 @@ const DICTIONARY: Record> = { "tooltip.copyFieldValue": "Copy value", "tooltip.filterByFileType": "Filter by file type", "tooltip.filterWorkflowOnly": "Show only assets with embedded workflow data", + "tooltip.filterWorkflowId": "Filter assets generated from the same embedded workflow id", "tooltip.filterMinRating": "Filter by minimum rating", "tooltip.filterByDateRange": "Filter by date range", "tooltip.widthPx": "Width in pixels", @@ -476,6 +478,8 @@ const DICTIONARY: Record> = { "tooltip.captureView": "Save view as image", "tooltip.pendingRefresh": "Pending: metadata refresh in progress", "tooltip.noAssetsDay": "No assets on this day", + "tooltip.assetsDaySingular": "{count} asset", + "tooltip.assetsDayPlural": "{count} assets", "tooltip.deleteCollection": "Delete collection", "tooltip.viewerShortcuts": "Viewer keyboard shortcuts", "tooltip.singleViewMode": "Single view mode (one image)", @@ -514,6 +518,17 @@ const DICTIONARY: Record> = { "filter.thisMonth": "This month", "filter.last7days": "Last 7 days", "filter.last30days": "Last 30 days", + "placeholder.workflowId": "Workflow ID", + "action.generate": "Generate", + "action.clear": "Clear", + "action.refresh": "Refresh", + "weekday.monShort": "Mon", + "weekday.tueShort": "Tue", + "weekday.wedShort": "Wed", + "weekday.thuShort": "Thu", + "weekday.friShort": "Fri", + "weekday.satShort": "Sat", + "weekday.sunShort": "Sun", "group.core": "Core", "group.media": "Media", "group.time": "Time", @@ -531,6 +546,10 @@ const DICTIONARY: Record> = { // --- Panel: Status --- "status.checking": "Checking...", "status.ready": "Ready", + "status.loading": "Loading", + "status.disabled": "Disabled", + "status.na": "N/A", + "status.generating": "Generating...", "status.scanning": "Scanning...", "status.error": "Error", "status.capabilities": "Capabilities", @@ -548,6 +567,8 @@ const DICTIONARY: Record> = { "status.available": "available", "status.missing": "missing", "status.path": "Path", + "state.on": "on", + "state.off": "off", "status.pathAuto": "auto / not configured", "status.noAssets": "No assets indexed yet ({scope})", "status.clickToScan": "Click the dot to start a scan", @@ -715,7 +736,19 @@ const DICTIONARY: Record> = { "viewer.noWorkflow": "No workflow data", "viewer.noMetadata": "No metadata available", "viewer.copySuccess": "Copied to clipboard!", + "viewer.copySuccessShort": "Copied!", "viewer.copyFailed": "Failed to copy", + "viewer.mode": "Viewer mode", + "viewer.mode.simple": "Simple", + "viewer.mode.abCompare": "A/B Compare", + "viewer.mode.sideBySide": "Side-by-side", + "viewer.mode.grid": "Grid", + "viewer.pinSlots": "Pin slots A/B/C/D", + "viewer.loadingGenerationData": "Loading generation data...", + "viewer.errorLoadingMetadata": "Error Loading Metadata", + "viewer.noGenerationDataFile": "No generation data found for this file.", + "viewer.metadataErrorWithCode": "{message}\n\nCode: {code}\nClick to retry.", + "viewer.metadataErrorRetry": "{message}\n\nClick to retry.", "video.controls": "Video controls", "video.previewControls": "Video preview controls", "video.playPause": "Play/Pause", @@ -765,6 +798,200 @@ const DICTIONARY: Record> = { "sidebar.date": "Date", "sidebar.size": "Size", "sidebar.genTime": "Generation time", + "sidebar.fileInfo.title": "File Info", + "sidebar.fileInfo.dimensionsTooltip": "Image/video resolution in pixels", + "sidebar.fileInfo.duration": "Duration", + "sidebar.fileInfo.durationTooltip": "Video duration", + "sidebar.fileInfo.fpsTooltip": "Native frame rate", + "sidebar.fileInfo.length": "Length", + "sidebar.fileInfo.frames": "{count} frames", + "sidebar.fileInfo.lengthTooltip": "Total frame count", + "sidebar.fileInfo.generationTime": "Generation Time", + "sidebar.fileInfo.generationTimeTooltip": + "Time taken to generate this asset (workflow execution time)", + "sidebar.fileInfo.time": "Time", + "sidebar.fileInfo.dateTooltip": "File creation/generation date", + "sidebar.fileInfo.timeTooltip": "File creation/generation time", + "sidebar.fileInfo.fileSize": "File Size", + "sidebar.fileInfo.fileSizeTooltip": "File size on disk", + "sidebar.fileInfo.assetId": "Asset ID", + "sidebar.fileInfo.assetIdTooltip": "Internal database asset identifier", + "sidebar.fileInfo.jobId": "Job ID", + "sidebar.fileInfo.jobIdTooltip": "Workflow execution job identifier (prompt_id)", + "sidebar.fileInfo.sourceNode": "Source Node", + "sidebar.fileInfo.sourceNodeTooltip": "ComfyUI node id that produced this file", + "sidebar.fileInfo.nodeType": "Node Type", + "sidebar.fileInfo.nodeTypeTooltip": "ComfyUI node class that produced this file", + "sidebar.fileInfo.workflowId": "Workflow ID", + "sidebar.fileInfo.workflowIdTooltip": + "ComfyUI workflow identifier (from workflow.id in extra_data)", + "sidebar.folder.details": "Folder Details", + "sidebar.folder.name": "Name", + "sidebar.folder.path": "Path", + "sidebar.folder.folders": "Folders", + "sidebar.folder.files": "Files", + "sidebar.folder.created": "Created", + "sidebar.folder.modified": "Modified", + "sidebar.folder.note": "Note", + "sidebar.folder.scanTruncated": "Scan was truncated for performance", + "sidebar.generation.title": "Generation", + "sidebar.generation.workflowEngine": "Workflow engine: {value}", + "sidebar.generation.apiProvider": "API provider: {value}", + "sidebar.generation.override": "Override", + "sidebar.generation.overrideTooltip": "This field was forced by Majoor Gen Info Override", + "sidebar.generation.metadataTruncated": "Metadata Truncated", + "sidebar.generation.metadataTruncatedBody": + "Generation data is incomplete because it exceeded the size limit.", + "sidebar.generation.generationData": "Generation Data", + "sidebar.generation.mediaOnlyPipeline": + "This file looks like a media-only pipeline (e.g. LoadVideo/VideoCombine) and does not contain generation parameters.", + "sidebar.generation.promptPipeline": "Prompt Pipeline ({count} variants)", + "sidebar.generation.promptN": "Prompt {n}", + "sidebar.generation.positive": "POSITIVE", + "sidebar.generation.negative": "NEGATIVE", + "sidebar.generation.positivePrompt": "Positive Prompt", + "sidebar.generation.negativePrompt": "Negative Prompt", + "sidebar.generation.promptAlignment": "Prompt Alignment", + "sidebar.generation.promptAlignmentTooltip": + "How closely the generated image matches the prompt (SigLIP2 score)", + "sidebar.generation.aiCaptionTooltip": "AI caption generated by Florence-2", + "sidebar.generation.copyCaptionTooltip": "Click to copy caption", + "sidebar.generation.aiCaptionDisabled": "AI caption controls are disabled", + "sidebar.generation.aiDisabledEnv": + "AI features are disabled (enable vector search env var).", + "sidebar.generation.aiDisabledSettings": "AI features are disabled in settings.", + "sidebar.generation.imageDescription": "Image Description", + "sidebar.generation.noImageDescription": "No image description yet.", + "sidebar.generation.lyrics": "Lyrics", + "sidebar.generation.pipeline": "Generation Pipeline", + "sidebar.generation.stageBase": "Base", + "sidebar.generation.stageTextToImage": "Text-to-Image", + "sidebar.generation.stageImageToImage": "Image-to-Image", + "sidebar.generation.stageInpaint": "Inpaint", + "sidebar.generation.stageUpscale": "Upscale", + "sidebar.generation.stageRefine": "Refine", + "sidebar.generation.stageRefineUpscale": "Refine / Upscale", + "sidebar.generation.stagePassN": "Pass {n}", + "sidebar.generation.modelBranches": "Model Branches", + "sidebar.generation.highNoise": "High Noise", + "sidebar.generation.lowNoise": "Low Noise", + "sidebar.generation.loraStack": "LoRA Stack", + "sidebar.generation.modelLora": "Model & LoRA", + "sidebar.generation.model": "Model", + "sidebar.generation.models": "Models", + "sidebar.generation.sampling": "Sampling", + "sidebar.generation.audio": "Audio", + "sidebar.generation.image": "Image", + "sidebar.generation.notes": "Notes", + "sidebar.generation.ttsInstruction": "TTS Instruction", + "sidebar.generation.seed": "Seed", + "sidebar.generation.copySeedTooltip": "Click to copy seed: {seed}", + "sidebar.generation.sourceFiles": "Source Files", + "sidebar.generation.customInfoN": "Custom Info {n}", + "sidebar.generation.checkpoint": "Checkpoint", + "sidebar.generation.checkpointN": "Checkpoint {n}", + "sidebar.generation.upscaler": "Upscaler", + "sidebar.generation.loras": "LoRAs", + "sidebar.generation.sampler": "Sampler", + "sidebar.generation.steps": "Steps", + "sidebar.generation.cfgScale": "CFG Scale", + "sidebar.generation.cfgHighNoise": "CFG High Noise", + "sidebar.generation.cfgLowNoise": "CFG Low Noise", + "sidebar.generation.scheduler": "Scheduler", + "sidebar.generation.denoise": "Denoise", + "sidebar.generation.narratorVoice": "Narrator Voice", + "sidebar.generation.language": "Language", + "sidebar.generation.repetitionPenalty": "Repetition Penalty", + "sidebar.generation.maxNewTokens": "Max New Tokens", + "sidebar.generation.device": "Device", + "sidebar.generation.voicePreset": "Voice Preset", + "sidebar.generation.compileMode": "Compile Mode", + "sidebar.generation.torchCompile": "Torch Compile", + "sidebar.generation.cudaGraphs": "CUDA Graphs", + "sidebar.generation.xVectorOnly": "X-Vector Only", + "sidebar.generation.chunking": "Chunking", + "sidebar.generation.maxCharsChunk": "Max Chars/Chunk", + "sidebar.generation.chunkMethod": "Chunk Method", + "sidebar.generation.silenceBetweenChunks": "Silence Between Chunks (ms)", + "sidebar.generation.audioCache": "Audio Cache", + "sidebar.generation.batchSize": "Batch Size", + "sidebar.generation.lyricsStrength": "Lyrics Strength", + "sidebar.generation.clipSkip": "Clip Skip", + "sidebar.generation.workflowNotes": "Workflow Notes", + "sidebar.generation.temperature": "Temperature", + "sidebar.generation.dtype": "Dtype", + "sidebar.generation.attention": "Attention", + "workflowSidebar.nodes": "Nodes", + "workflowSidebar.links": "Links", + "workflowSidebar.groups": "Groups", + "workflowSidebar.close": "Close sidebar", + "workflowSidebar.graphMap": "Graph Map", + "workflowSidebar.comfyWorkflow": "ComfyUI Workflow", + "workflowSidebar.workflowNodes": "Workflow Nodes", + "workflowSidebar.moreNodes": "+{count} more nodes", + "workflowSidebar.sourceSynthetic": "Synthetic", + "workflowSidebar.sourceEmbedded": "Embedded", + "workflowSidebar.sizeCompact": "Compact", + "workflowSidebar.sizeComfort": "Comfort", + "workflowSidebar.sizeExpanded": "Expanded", + "workflowSidebar.minimapSizeTitle": "{label} minimap", + "workflowSidebar.nodeLabels": "Node Labels", + "workflowSidebar.nodeColors": "Node Colors", + "workflowSidebar.showLinks": "Show Links", + "workflowSidebar.showFramesGroups": "Show Frames/Groups", + "workflowSidebar.renderBypassState": "Render Bypass State", + "workflowSidebar.renderErrorState": "Render Error State", + "workflowSidebar.showViewport": "Show Viewport", + "workflowSidebar.minimapHint": "Click/drag to navigate - wheel to zoom", + "workflowSidebar.showRawJson": "Show raw JSON", + "genInfoOverride.autoFillFromWorkflow": "Auto fill from workflow", + "genInfoOverride.pick": "Pick", + "genInfoOverride.pickField": "Pick {field}", + "genInfoOverride.pickFromWorkflow": "Pick Gen Info from workflow", + "model3d.controlHint": "Rotate: left drag Pan: right drag Zoom: wheel", + "model3d.viewportAction": "3D viewport action", + "model3d.preview": "3D preview", + "model3d.unavailable": "3D viewer unavailable", + "model3d.background": "Background", + "model3d.material": "Material", + "model3d.skeleton": "Skeleton", + "model3d.lights": "Lights", + "model3d.intensity": "Intensity", + "model3d.play": "Play", + "model3d.pause": "Pause", + "model3d.playPause": "Play / Pause", + "model3d.playbackSpeed": "Playback speed", + "model3d.reset": "Reset", + "model3d.resetView": "Reset 3D view", + "model3d.grid": "Grid", + "model3d.toggleGrid": "Toggle grid", + "model3d.persp": "Persp", + "model3d.ortho": "Ortho", + "model3d.switchCamera": "Switch perspective / orthographic", + "model3d.settings": "Settings", + "model3d.downloadFile": "Download {file}", + "badge.collisionName": "Name: {name}", + "badge.collisionPaths": "Paths:", + "badge.collisionSelect": "Click to select collisions in current view", + "badge.workflow.pendingParsing": "Pending: parsing metadata...", + "badge.workflow.complete": "Complete: workflow + generation data detected", + "badge.workflow.partialWorkflowOnly": "Partial: workflow only (generation data missing)", + "badge.workflow.partialGenerationOnly": "Partial: generation data only (workflow missing)", + "badge.workflow.none": "None: no workflow or generation data found", + "badge.workflow.pendingNotParsed": "Pending: metadata not parsed yet", + "badge.workflow.enrichmentQueued": + "Pending: database metadata enrichment in progress ({count} queued)", + "badge.workflow.enrichment": "Pending: database metadata enrichment in progress", + "badge.workflow.aiTooltip": "{title}\nAI: {ai}\nClick to rescan this file", + "badge.workflow.tooltip": "{title}\nClick to rescan this file", + "badge.ai.vectorIndexed": "vector indexed", + "badge.ai.tagSuggestions": "AI tag suggestions", + "badge.ai.enhancedPrompt": "enhanced prompt", + "badge.ai.indexed": "indexed", + "badge.rating": "Rating: {rating} star{plural}", + "badge.generationTimeMinutes": "Generation time: {minutes} minutes ({seconds}s)", + "badge.generationTimeSeconds": "Generation time: {seconds} seconds", + "badge.tags": "Tags: {tags}", // --- Context Menu --- "ctx.openViewer": "Open in viewer", @@ -802,6 +1029,7 @@ const DICTIONARY: Record> = { "dialog.yes": "Yes", "dialog.no": "No", "dialog.ok": "OK", + "dialog.close": "Close", "dialog.prompt": "Prompt", "dialog.choiceTypeNumber": "Type a number:", "dialog.delete.title": "Delete file?", @@ -1057,6 +1285,9 @@ const DICTIONARY: Record> = { "tooltip.openMessages": "Messages et nouveautes", "tooltip.openMessagesUnread": "Messages ({count} non lus)", "tooltip.markMessagesRead": "Marquer tous les messages comme lus", + "tooltip.noAssetsDay": "Aucun asset ce jour", + "tooltip.assetsDaySingular": "{count} asset", + "tooltip.assetsDayPlural": "{count} assets", "tooltip.previewStreamOff": "Preview KSampler : OFF - cliquer pour afficher les images de denoising pendant l'execution", "tooltip.previewStreamOn": @@ -1070,7 +1301,235 @@ const DICTIONARY: Record> = { "tooltip.queueStop": "Arreter la generation", "tooltip.noUnreadMessages": "Aucun message non lu", "label.toastHistory": "Historique", + "label.sameWorkflow": "Generes avec le meme workflow", "tooltip.tab.similar": "Parcourir les trouvailles similaires courantes", + "tooltip.filterWorkflowId": "Filtrer les assets generes depuis le meme workflow embarque", + "placeholder.workflowId": "Workflow ID", + "action.copy": "Copier", + "action.generate": "Generer", + "action.clickToCopy": "Cliquer pour copier", + "action.clear": "Effacer", + "action.refresh": "Rafraichir", + "status.loading": "Chargement", + "status.disabled": "Desactive", + "status.na": "N/A", + "status.generating": "Generation...", + "status.unavailable": "Indisponible", + "state.on": "on", + "state.off": "off", + "viewer.copySuccessShort": "Copie !", + "viewer.loadingGenerationData": "Chargement des donnees de generation...", + "viewer.errorLoadingMetadata": "Erreur de chargement des metadonnees", + "viewer.noGenerationDataFile": "Aucune donnee de generation trouvee pour ce fichier.", + "viewer.metadataErrorWithCode": "{message}\n\nCode : {code}\nCliquer pour reessayer.", + "viewer.metadataErrorRetry": "{message}\n\nCliquer pour reessayer.", + "sidebar.fileInfo.title": "Infos fichier", + "sidebar.fileInfo.dimensionsTooltip": "Resolution image/video en pixels", + "sidebar.fileInfo.duration": "Duree", + "sidebar.fileInfo.durationTooltip": "Duree de la video", + "sidebar.fileInfo.fpsTooltip": "Frequence d'image native", + "sidebar.fileInfo.length": "Longueur", + "sidebar.fileInfo.frames": "{count} frames", + "sidebar.fileInfo.lengthTooltip": "Nombre total de frames", + "sidebar.fileInfo.generationTime": "Temps de generation", + "sidebar.fileInfo.generationTimeTooltip": + "Temps necessaire pour generer cet asset (temps d'execution workflow)", + "sidebar.fileInfo.time": "Heure", + "sidebar.fileInfo.dateTooltip": "Date de creation/generation du fichier", + "sidebar.fileInfo.timeTooltip": "Heure de creation/generation du fichier", + "sidebar.fileInfo.fileSize": "Taille fichier", + "sidebar.fileInfo.fileSizeTooltip": "Taille du fichier sur disque", + "sidebar.fileInfo.assetId": "Asset ID", + "sidebar.fileInfo.assetIdTooltip": "Identifiant interne de l'asset en base", + "sidebar.fileInfo.jobId": "Job ID", + "sidebar.fileInfo.jobIdTooltip": "Identifiant du job workflow (prompt_id)", + "sidebar.fileInfo.sourceNode": "Node source", + "sidebar.fileInfo.sourceNodeTooltip": "ID du node ComfyUI qui a produit ce fichier", + "sidebar.fileInfo.nodeType": "Type de node", + "sidebar.fileInfo.nodeTypeTooltip": "Classe du node ComfyUI qui a produit ce fichier", + "sidebar.fileInfo.workflowId": "Workflow ID", + "sidebar.fileInfo.workflowIdTooltip": + "Identifiant du workflow ComfyUI (depuis workflow.id dans extra_data)", + "sidebar.folder.details": "Details dossier", + "sidebar.folder.name": "Nom", + "sidebar.folder.path": "Chemin", + "sidebar.folder.folders": "Dossiers", + "sidebar.folder.files": "Fichiers", + "sidebar.folder.created": "Cree", + "sidebar.folder.modified": "Modifie", + "sidebar.folder.note": "Note", + "sidebar.folder.scanTruncated": "Scan tronque pour les performances", + "sidebar.generation.title": "Generation", + "sidebar.generation.workflowEngine": "Moteur workflow : {value}", + "sidebar.generation.apiProvider": "Provider API : {value}", + "sidebar.generation.override": "Override", + "sidebar.generation.overrideTooltip": "Ce champ a ete force par Majoor Gen Info Override", + "sidebar.generation.metadataTruncated": "Metadonnees tronquees", + "sidebar.generation.metadataTruncatedBody": + "Les donnees de generation sont incompletes car elles depassent la limite de taille.", + "sidebar.generation.generationData": "Donnees de generation", + "sidebar.generation.mediaOnlyPipeline": + "Ce fichier ressemble a une pipeline media-only (ex. LoadVideo/VideoCombine) et ne contient pas de parametres de generation.", + "sidebar.generation.promptPipeline": "Pipeline prompt ({count} variantes)", + "sidebar.generation.promptN": "Prompt {n}", + "sidebar.generation.positive": "POSITIF", + "sidebar.generation.negative": "NEGATIF", + "sidebar.generation.positivePrompt": "Prompt positif", + "sidebar.generation.negativePrompt": "Prompt negatif", + "sidebar.generation.promptAlignment": "Alignement prompt", + "sidebar.generation.promptAlignmentTooltip": + "Mesure a quel point l'image generee correspond au prompt (score SigLIP2)", + "sidebar.generation.aiCaptionTooltip": "Caption IA generee par Florence-2", + "sidebar.generation.copyCaptionTooltip": "Cliquer pour copier la caption", + "sidebar.generation.aiCaptionDisabled": "Les controles de caption IA sont desactives", + "sidebar.generation.aiDisabledEnv": + "Les fonctions IA sont desactivees (activez la variable d'environnement vector search).", + "sidebar.generation.aiDisabledSettings": "Les fonctions IA sont desactivees dans les parametres.", + "sidebar.generation.imageDescription": "Description image", + "sidebar.generation.noImageDescription": "Aucune description image pour le moment.", + "sidebar.generation.lyrics": "Lyrics", + "sidebar.generation.pipeline": "Pipeline de generation", + "sidebar.generation.stageBase": "Base", + "sidebar.generation.stageTextToImage": "Texte vers image", + "sidebar.generation.stageImageToImage": "Image vers image", + "sidebar.generation.stageInpaint": "Inpaint", + "sidebar.generation.stageUpscale": "Upscale", + "sidebar.generation.stageRefine": "Refine", + "sidebar.generation.stageRefineUpscale": "Refine / Upscale", + "sidebar.generation.stagePassN": "Pass {n}", + "sidebar.generation.modelBranches": "Branches modele", + "sidebar.generation.highNoise": "High Noise", + "sidebar.generation.lowNoise": "Low Noise", + "sidebar.generation.loraStack": "Stack LoRA", + "sidebar.generation.modelLora": "Modele & LoRA", + "sidebar.generation.model": "Modele", + "sidebar.generation.sampling": "Sampling", + "sidebar.generation.audio": "Audio", + "sidebar.generation.image": "Image", + "sidebar.generation.notes": "Notes", + "sidebar.generation.ttsInstruction": "Instruction TTS", + "sidebar.generation.seed": "Seed", + "sidebar.generation.copySeedTooltip": "Cliquer pour copier le seed : {seed}", + "sidebar.generation.sourceFiles": "Fichiers source", + "sidebar.generation.customInfoN": "Info custom {n}", + "sidebar.generation.checkpoint": "Checkpoint", + "sidebar.generation.checkpointN": "Checkpoint {n}", + "sidebar.generation.upscaler": "Upscaler", + "sidebar.generation.loras": "LoRAs", + "sidebar.generation.sampler": "Sampler", + "sidebar.generation.steps": "Steps", + "sidebar.generation.cfgScale": "CFG Scale", + "sidebar.generation.cfgHighNoise": "CFG High Noise", + "sidebar.generation.cfgLowNoise": "CFG Low Noise", + "sidebar.generation.scheduler": "Scheduler", + "sidebar.generation.denoise": "Denoise", + "sidebar.generation.narratorVoice": "Voix narrateur", + "sidebar.generation.language": "Langue", + "sidebar.generation.repetitionPenalty": "Repetition Penalty", + "sidebar.generation.maxNewTokens": "Max New Tokens", + "sidebar.generation.device": "Device", + "sidebar.generation.voicePreset": "Voice Preset", + "sidebar.generation.compileMode": "Compile Mode", + "sidebar.generation.torchCompile": "Torch Compile", + "sidebar.generation.cudaGraphs": "CUDA Graphs", + "sidebar.generation.xVectorOnly": "X-Vector Only", + "sidebar.generation.chunking": "Chunking", + "sidebar.generation.maxCharsChunk": "Max Chars/Chunk", + "sidebar.generation.chunkMethod": "Methode chunk", + "sidebar.generation.silenceBetweenChunks": "Silence entre chunks (ms)", + "sidebar.generation.audioCache": "Cache audio", + "sidebar.generation.batchSize": "Batch Size", + "sidebar.generation.lyricsStrength": "Lyrics Strength", + "sidebar.generation.clipSkip": "Clip Skip", + "sidebar.generation.workflowNotes": "Notes workflow", + "sidebar.generation.temperature": "Temperature", + "sidebar.generation.dtype": "Dtype", + "sidebar.generation.attention": "Attention", + "viewer.mode": "Mode viewer", + "viewer.mode.simple": "Simple", + "viewer.mode.abCompare": "Comparaison A/B", + "viewer.mode.sideBySide": "Cote a cote", + "viewer.mode.grid": "Grille", + "viewer.pinSlots": "Epingler les slots A/B/C/D", + "workflowSidebar.nodes": "Noeuds", + "workflowSidebar.links": "Liens", + "workflowSidebar.groups": "Groupes", + "workflowSidebar.close": "Fermer la sidebar", + "workflowSidebar.graphMap": "Graph Map", + "workflowSidebar.comfyWorkflow": "Workflow ComfyUI", + "workflowSidebar.workflowNodes": "Noeuds du workflow", + "workflowSidebar.moreNodes": "+{count} noeuds en plus", + "workflowSidebar.sourceSynthetic": "Synthetique", + "workflowSidebar.sourceEmbedded": "Integre", + "workflowSidebar.sizeCompact": "Compact", + "workflowSidebar.sizeComfort": "Confort", + "workflowSidebar.sizeExpanded": "Etendu", + "workflowSidebar.minimapSizeTitle": "Mini-map {label}", + "workflowSidebar.nodeLabels": "Labels des noeuds", + "workflowSidebar.nodeColors": "Couleurs des noeuds", + "workflowSidebar.showLinks": "Afficher les liens", + "workflowSidebar.showFramesGroups": "Afficher frames/groupes", + "workflowSidebar.renderBypassState": "Afficher l'etat bypass", + "workflowSidebar.renderErrorState": "Afficher l'etat erreur", + "workflowSidebar.showViewport": "Afficher le viewport", + "workflowSidebar.minimapHint": "Cliquer/glisser pour naviguer - molette pour zoomer", + "workflowSidebar.showRawJson": "Afficher le JSON brut", + "genInfoOverride.autoFillFromWorkflow": "Auto-fill depuis le workflow", + "genInfoOverride.pick": "Choisir", + "genInfoOverride.pickField": "Choisir {field}", + "genInfoOverride.pickFromWorkflow": "Choisir Gen Info depuis le workflow", + "dialog.close": "Fermer", + "model3d.controlHint": "Rotation : drag gauche Pan : drag droit Zoom : molette", + "model3d.viewportAction": "Action viewport 3D", + "model3d.preview": "Preview 3D", + "model3d.unavailable": "Viewer 3D indisponible", + "model3d.background": "Fond", + "model3d.material": "Materiau", + "model3d.skeleton": "Squelette", + "model3d.lights": "Lumieres", + "model3d.intensity": "Intensite", + "model3d.play": "Lecture", + "model3d.pause": "Pause", + "model3d.playPause": "Lecture / Pause", + "model3d.playbackSpeed": "Vitesse de lecture", + "model3d.reset": "Reset", + "model3d.resetView": "Reset vue 3D", + "model3d.grid": "Grille", + "model3d.toggleGrid": "Afficher/masquer la grille", + "model3d.persp": "Persp", + "model3d.ortho": "Ortho", + "model3d.switchCamera": "Basculer perspective / orthographique", + "model3d.settings": "Parametres", + "model3d.downloadFile": "Telecharger {file}", + "badge.collisionName": "Nom : {name}", + "badge.collisionPaths": "Chemins :", + "badge.collisionSelect": "Cliquer pour selectionner les collisions dans la vue courante", + "badge.workflow.pendingParsing": "En attente : parsing des metadonnees...", + "badge.workflow.complete": "Complet : workflow + donnees de generation detectes", + "badge.workflow.partialWorkflowOnly": "Partiel : workflow seulement (donnees de generation manquantes)", + "badge.workflow.partialGenerationOnly": "Partiel : donnees de generation seulement (workflow manquant)", + "badge.workflow.none": "Aucun : aucun workflow ou donnees de generation trouves", + "badge.workflow.pendingNotParsed": "En attente : metadonnees pas encore parsees", + "badge.workflow.enrichmentQueued": + "En attente : enrichissement des metadonnees en base ({count} en file)", + "badge.workflow.enrichment": "En attente : enrichissement des metadonnees en base", + "badge.workflow.aiTooltip": "{title}\nIA : {ai}\nCliquer pour rescanner ce fichier", + "badge.workflow.tooltip": "{title}\nCliquer pour rescanner ce fichier", + "badge.ai.vectorIndexed": "vecteur indexe", + "badge.ai.tagSuggestions": "suggestions de tags IA", + "badge.ai.enhancedPrompt": "prompt enrichi", + "badge.ai.indexed": "indexe", + "badge.rating": "Rating : {rating} etoile{plural}", + "badge.generationTimeMinutes": "Temps de generation : {minutes} minutes ({seconds}s)", + "badge.generationTimeSeconds": "Temps de generation : {seconds} secondes", + "badge.tags": "Tags : {tags}", + "weekday.monShort": "Lun", + "weekday.tueShort": "Mar", + "weekday.wedShort": "Mer", + "weekday.thuShort": "Jeu", + "weekday.friShort": "Ven", + "weekday.satShort": "Sam", + "weekday.sunShort": "Dim", "setting.ai.vector.enabled.name": "Activer la recherche semantique IA", "setting.ai.vector.enabled.desc": @@ -1468,7 +1927,7 @@ function _readComfyLocaleCandidates(app: any) { "ComfyUI.Frontend.Locale", ]; for (const key of settingKeys) { - pushCandidate(getSettingValue(app, key)); + pushCandidate(getSettingForApp(app, key)); } // Additional frontend locale surfaces (if present). diff --git a/ui/app/openMajoorSettings.ts b/ui/app/openMajoorSettings.ts index b531ae23..30f6ea79 100644 --- a/ui/app/openMajoorSettings.ts +++ b/ui/app/openMajoorSettings.ts @@ -1,7 +1,7 @@ -import { getComfyApp } from "./comfyApiBridge.js"; +import { getRawHostApp } from "./hostAdapter.js"; import { openMajoorSettingsDialog } from "./settings/MajoorSettingsDialog.js"; -export function openMajoorSettings(app: any = getComfyApp()): any { +export function openMajoorSettings(app: any = getRawHostApp()): any { return openMajoorSettingsDialog(app); } diff --git a/ui/app/settings/MajoorSettingsDialog.ts b/ui/app/settings/MajoorSettingsDialog.ts index eb332189..a9924159 100644 --- a/ui/app/settings/MajoorSettingsDialog.ts +++ b/ui/app/settings/MajoorSettingsDialog.ts @@ -1,4 +1,4 @@ -import { getComfyApp } from "../comfyApiBridge.js"; +import { getRawHostApp } from "../hostAdapter.js"; import { t } from "../i18n.js"; import { buildMajoorSettings } from "./SettingsPanel.js"; @@ -428,7 +428,7 @@ export function closeMajoorSettingsDialog(): void { dialogState.root.hidden = true; } -export function openMajoorSettingsDialog(app: any | null = getComfyApp()): any { +export function openMajoorSettingsDialog(app: any | null = getRawHostApp()): any { if (typeof document === "undefined") return false; if (!dialogState?.root?.isConnected) { dialogState = buildDialog(); diff --git a/ui/app/settings/SettingsPanel.ts b/ui/app/settings/SettingsPanel.ts index 71b9cf3e..e0a585f7 100644 --- a/ui/app/settings/SettingsPanel.ts +++ b/ui/app/settings/SettingsPanel.ts @@ -10,7 +10,7 @@ import { safeDispatchCustomEvent } from "../../utils/events.js"; import { initI18n, setFollowComfyLanguage, startComfyLanguageSync } from "../i18n.js"; import { debounce } from "../../utils/debounce.js"; import { getWatcherStatus, toggleWatcher } from "../../api/client.js"; -import { setSettingValue } from "../comfyApiBridge.js"; +import { setSettingForApp } from "../hostAdapter.js"; import { loadMajoorSettings, @@ -148,7 +148,7 @@ function syncComfySettingValue(app: any, definition: any, value: any) { if (_syncingComfySettingIds.has(id)) return false; _syncingComfySettingIds.add(id); try { - return setSettingValue(app, id, value); + return setSettingForApp(app, id, value); } finally { _syncingComfySettingIds.delete(id); } diff --git a/ui/app/toast.ts b/ui/app/toast.ts index 51c6e680..ce95bf1d 100644 --- a/ui/app/toast.ts +++ b/ui/app/toast.ts @@ -6,7 +6,7 @@ * * Priority integration with ComfyUI extensionManager.toast API (ComfyUI v1.3+). */ -import { getComfyApp, getExtensionToastApi } from "./comfyApiBridge.js"; +import { getHostToastApi } from "./hostAdapter.js"; import { t } from "./i18n.js"; import { addToastHistory } from "../features/panel/messages/toastHistory.js"; @@ -454,11 +454,10 @@ export function comfyToast(message: any, type = "info", duration?: number | null // Treat as persistent only when caller explicitly passes 0 or a non-finite value. const persistent = !(Number.isFinite(Number(duration)) && Number(duration) > 0); - const app = getComfyApp(); // 1. Try ComfyUI extensionManager toast (ComfyUI v1.3+ standard) try { - const toastApi = getExtensionToastApi(app); + const toastApi = getHostToastApi(); if (toastApi && typeof toastApi.add === "function") { let severity = type; if (severity === "warning") severity = "warn"; // PrimeVue uses "warn" not "warning" @@ -491,9 +490,10 @@ export function comfyToast(message: any, type = "info", duration?: number | null } // 2. Try generic ComfyUI app.ui.toast (Older or alternative implementations) - if (app?.ui?.toast) { + const legacyApp = (globalThis as any)?.app || (typeof window !== "undefined" ? (window as any)?.app : null); + if (legacyApp?.ui?.toast) { try { - return app.ui.toast(message, type); + return legacyApp.ui.toast(message, type); } catch (e) { console.debug("Native app.ui.toast failed", e); } diff --git a/ui/components/Badges.ts b/ui/components/Badges.ts index 1d6aa3e5..3c8b6cff 100644 --- a/ui/components/Badges.ts +++ b/ui/components/Badges.ts @@ -4,6 +4,7 @@ import { resolveAssetStatusDotColor } from "../features/status/AssetStatusDotTheme.js"; import { getRuntimeEnrichmentState } from "../stores/runtimeEnrichmentState.js"; import { detectKind } from "../features/grid/AssetCardRenderer.js"; +import { t } from "../app/i18n.js"; /** * Create file type badge (overlaid on thumbnail) @@ -17,13 +18,13 @@ function _buildCollisionTitle({ ext = "", filename = "", count = 0, paths = [] } : []; if (n < 2) return `${safeExt} file`; const lines = [`${safeExt}+ name collision in current view (${n})`]; - if (safeName) lines.push(`Name: ${safeName}`); + if (safeName) lines.push(t("badge.collisionName", "Name: {name}", { name: safeName })); if (list.length) { - lines.push("Paths:"); + lines.push(t("badge.collisionPaths", "Paths:")); for (const p of list.slice(0, 4)) lines.push(`- ${p}`); if (list.length > 4) lines.push(`- ... +${list.length - 4} more`); } - lines.push("Click to select collisions in current view"); + lines.push(t("badge.collisionSelect", "Click to select collisions in current view")); return lines.join("\n"); } @@ -241,23 +242,23 @@ export function createWorkflowDot(asset: Record | null | undefined) const enrichmentQueue = enrichment.queueLength; const enrichmentActive = enrichment.active || enrichmentQueue > 0; - let title = "Pending: parsing metadata\u2026"; + let title = t("badge.workflow.pendingParsing", "Pending: parsing metadata..."); const anyTrue = hasWorkflow === true || hasGen === true; const anyFalse = hasWorkflow === false || hasGen === false; const anyUnknown = hasWorkflow === null || hasGen === null; if (hasWorkflow === true && hasGen === true) { - title = "Complete: workflow + generation data detected"; + title = t("badge.workflow.complete", "Complete: workflow + generation data detected"); } else if (anyTrue) { title = hasWorkflow === true - ? "Partial: workflow only (generation data missing)" - : "Partial: generation data only (workflow missing)"; + ? t("badge.workflow.partialWorkflowOnly", "Partial: workflow only (generation data missing)") + : t("badge.workflow.partialGenerationOnly", "Partial: generation data only (workflow missing)"); } else if (anyFalse && !anyTrue && !anyUnknown) { - title = "None: no workflow or generation data found"; + title = t("badge.workflow.none", "None: no workflow or generation data found"); } else if (anyUnknown) { - title = "Pending: metadata not parsed yet"; + title = t("badge.workflow.pendingNotParsed", "Pending: metadata not parsed yet"); } let status = anyUnknown @@ -271,16 +272,16 @@ export function createWorkflowDot(asset: Record | null | undefined) status = "pending"; title = enrichmentQueue > 0 - ? `Pending: database metadata enrichment in progress (${enrichmentQueue} queued)` - : "Pending: database metadata enrichment in progress"; + ? t("badge.workflow.enrichmentQueued", "Pending: database metadata enrichment in progress ({count} queued)", { count: enrichmentQueue }) + : t("badge.workflow.enrichment", "Pending: database metadata enrichment in progress"); } applyAssetStatusDotState(dot, status, title, { asset }); const ai = detectAiInfo(asset); if (ai.hasAiInfo) { const aiBits = []; - if (ai.hasVectorIndexed) aiBits.push("vector indexed"); - if (ai.hasAutoTags) aiBits.push("AI tag suggestions"); - if (ai.hasEnhancedPrompt) aiBits.push("enhanced prompt"); + if (ai.hasVectorIndexed) aiBits.push(t("badge.ai.vectorIndexed", "vector indexed")); + if (ai.hasAutoTags) aiBits.push(t("badge.ai.tagSuggestions", "AI tag suggestions")); + if (ai.hasEnhancedPrompt) aiBits.push(t("badge.ai.enhancedPrompt", "enhanced prompt")); dot.textContent = ""; const icon = document.createElement("i"); @@ -295,7 +296,10 @@ export function createWorkflowDot(asset: Record | null | undefined) } catch (e: any) { console.debug?.(e); } - dot.title = `${title}\nAI: ${aiBits.length ? aiBits.join(", ") : "indexed"}\nClick to rescan this file`; + dot.title = t("badge.workflow.aiTooltip", "{title}\nAI: {ai}\nClick to rescan this file", { + title, + ai: aiBits.length ? aiBits.join(", ") : t("badge.ai.indexed", "indexed"), + }); } else { try { dot.dataset.mjrAi = "0"; @@ -303,7 +307,7 @@ export function createWorkflowDot(asset: Record | null | undefined) console.debug?.(e); } dot.textContent = "\u25CF"; - dot.title = `${title}\nClick to rescan this file`; + dot.title = t("badge.workflow.tooltip", "{title}\nClick to rescan this file", { title }); } return dot; @@ -348,7 +352,10 @@ export function createRatingBadge(rating: number | null | undefined): HTMLElemen const badge = document.createElement("div"); badge.className = "mjr-rating-badge"; - badge.title = `Rating: ${ratingValue} star${ratingValue > 1 ? "s" : ""}`; + badge.title = t("badge.rating", "Rating: {rating} star{plural}", { + rating: ratingValue, + plural: ratingValue > 1 ? "s" : "", + }); badge.style.cssText = ` position: absolute; top: 6px; @@ -426,13 +433,16 @@ export function formatGenTime(ms: any) { const mins = (totalSecs / 60).toFixed(1); return { text: `${mins}m`, - title: `Generation time: ${mins} minutes (${totalSecs.toFixed(1)}s)`, + title: t("badge.generationTimeMinutes", "Generation time: {minutes} minutes ({seconds}s)", { + minutes: mins, + seconds: totalSecs.toFixed(1), + }), }; } const secs = totalSecs.toFixed(1); return { text: `${secs}s`, - title: `Generation time: ${secs} seconds`, + title: t("badge.generationTimeSeconds", "Generation time: {seconds} seconds", { seconds: secs }), }; } @@ -510,7 +520,7 @@ export function createTagsBadge(tags: string[] | null | undefined): HTMLElement } badge.textContent = normalizedTags.join(", "); - badge.title = `Tags: ${normalizedTags.join(", ")}`; + badge.title = t("badge.tags", "Tags: {tags}", { tags: normalizedTags.join(", ") }); badge.style.cssText = ` position: absolute; bottom: 6px; diff --git a/ui/components/ViewerRuntime.ts b/ui/components/ViewerRuntime.ts index 32960a85..44173f0b 100644 --- a/ui/components/ViewerRuntime.ts +++ b/ui/components/ViewerRuntime.ts @@ -12,6 +12,7 @@ import { getFileMetadataScoped, } from "../api/client.js"; import { ASSET_RATING_CHANGED_EVENT, ASSET_TAGS_CHANGED_EVENT } from "../app/events.js"; +import { t } from "../app/i18n.js"; import { bindViewerContextMenu, unbindViewerContextMenu, @@ -1089,7 +1090,7 @@ function createViewer() { const empty = document.createElement("div"); empty.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);"; - empty.textContent = "No generation data found for this file."; + empty.textContent = t("viewer.noGenerationDataFile", "No generation data found for this file."); block.appendChild(empty); try { @@ -1099,7 +1100,7 @@ function createViewer() { details.style.cssText = "border: 1px solid rgba(255,255,255,0.10); border-radius: 10px; background: rgba(255,255,255,0.04); overflow: hidden;"; const summary = document.createElement("summary"); - summary.textContent = "Raw metadata"; + summary.textContent = t("msg.rawMetadata", "Raw metadata"); summary.style.cssText = "cursor: pointer; padding: 10px 12px; color: rgba(255,255,255,0.78); user-select: none;"; const pre = document.createElement("pre"); diff --git a/ui/components/sidebar/parsers/comfyWorkflowParser.ts b/ui/components/sidebar/parsers/comfyWorkflowParser.ts index e033b510..285f641c 100644 --- a/ui/components/sidebar/parsers/comfyWorkflowParser.ts +++ b/ui/components/sidebar/parsers/comfyWorkflowParser.ts @@ -19,6 +19,8 @@ export function parseComfyUIWorkflow(workflow: any): Record | null const metadata: Record = {}; const loras = []; + const promptGraph = getPromptGraph(workflow); + const samplerPasses: any[] = []; for (const node of collectComfyWorkflowNodes(workflow)) { if (!node || typeof node !== "object") continue; @@ -86,6 +88,21 @@ export function parseComfyUIWorkflow(workflow: any): Record | null if (inputs.scheduler && !metadata.scheduler) metadata.scheduler = inputs.scheduler; if (inputs.denoise !== undefined && metadata.denoise === undefined) metadata.denoise = inputs.denoise; + if (isSamplerClass(classType)) { + const passStage = classifySamplerPass(node, promptGraph); + const linkedSettings = resolveSamplerLinkedSettings(node, promptGraph); + const linkedModel = resolveLinkedModelName(node?.inputs?.model, promptGraph); + samplerPasses.push({ + sampler_name: inputs.sampler_name || linkedSettings.sampler_name || inputs.sampler, + scheduler: inputs.scheduler || linkedSettings.scheduler, + steps: inputs.steps ?? linkedSettings.steps, + cfg: inputs.cfg, + denoise: inputs.denoise ?? linkedSettings.denoise, + seed: inputs.seed ?? inputs.noise_seed, + model: linkedModel, + pass_stage: passStage, + }); + } if (inputs.width !== undefined && metadata.width === undefined) metadata.width = inputs.width; @@ -135,9 +152,137 @@ export function parseComfyUIWorkflow(workflow: any): Record | null } if (loras.length) metadata.loras = loras; + if (samplerPasses.length > 1) metadata.all_samplers = samplerPasses; return Object.keys(metadata).length > 0 ? metadata : null; } +function getPromptGraph(workflow: any): Record | null { + if (!workflow || typeof workflow !== "object") return null; + const candidate = workflow.prompt && typeof workflow.prompt === "object" ? workflow.prompt : workflow; + return looksLikeComfyPromptGraph(candidate) ? candidate : null; +} + +function isSamplerClass(classType: string): boolean { + if (classType.includes("ksamplerselect") || classType.includes("samplerselect")) return false; + return ( + classType.includes("ksampler") || + classType.includes("samplercustom") || + classType.includes("sampler_custom") + ); +} + +function classifySamplerPass(node: any, promptGraph: Record | null): string { + if (!promptGraph) return ""; + const linkedModel = resolveLinkedModelName(node?.inputs?.model, promptGraph).toLowerCase(); + if (/\b(upscale|upscaler|_to_\d{3,5}|to[_-]?\d{3,5})\b/i.test(linkedModel)) { + return "upscale"; + } + const allInputs = collectUpstreamClassTypes(node, promptGraph); + const allHaystack = allInputs.join(" "); + if (/\b(pidconditioning|upscale|latentupscale|imageupscalewithmodel)\b/i.test(allHaystack)) { + return "upscale"; + } + const upstream = collectUpstreamClassTypes(node, promptGraph, "latent_image"); + const haystack = upstream.join(" "); + if (/\b(inpaint|vaeencodeforinpaint|setlatentnoise mask|masktoimage)\b/i.test(haystack)) { + return "inpaint"; + } + if (/\b(upscale|latentupscale|imageupscalewithmodel|ultimate|supir|esrgan|realesrgan)\b/i.test(haystack)) { + return "upscale"; + } + if (/\b(vaeencode|loadimage|imagebatch|imagetolatent)\b/i.test(haystack)) { + return "img2img"; + } + if (/\b(emptylatentimage|emptysd3latentimage|emptychromaradiancelatentimage|empty latent)\b/i.test(haystack)) { + return "txt2img"; + } + return ""; +} + +function collectUpstreamClassTypes( + node: any, + promptGraph: Record, + inputName?: string, +): string[] { + const startValues = inputName ? [node?.inputs?.[inputName]] : Object.values(node?.inputs || {}); + const out: string[] = []; + const visited = new Set(); + const visit = (current: any) => { + const id = String(current?._mjrPromptId || current?.id || ""); + if (id && visited.has(id)) return; + if (id) visited.add(id); + const classType = String(current?.class_type || current?.type || current?._meta?.title || ""); + if (classType) out.push(classType.toLowerCase()); + const inputs = current?.inputs && typeof current.inputs === "object" ? current.inputs : {}; + for (const value of Object.values(inputs)) { + const linked = getLinkedNode(value, promptGraph); + if (linked) visit(linked); + } + }; + for (const value of startValues) { + const start = getLinkedNode(value, promptGraph); + if (start) visit(start); + } + return out; +} + +function resolveSamplerLinkedSettings(node: any, promptGraph: Record | null) { + const out: Record = {}; + if (!promptGraph) return out; + const samplerNode = getLinkedNode(node?.inputs?.sampler, promptGraph); + const samplerInputs = samplerNode?.inputs || {}; + if (samplerInputs.sampler_name) out.sampler_name = samplerInputs.sampler_name; + const sigmasNode = getLinkedNode(node?.inputs?.sigmas, promptGraph); + const sigmasInputs = sigmasNode?.inputs || {}; + if (sigmasInputs.scheduler) out.scheduler = sigmasInputs.scheduler; + if (sigmasInputs.steps !== undefined) out.steps = sigmasInputs.steps; + if (sigmasInputs.denoise !== undefined) out.denoise = sigmasInputs.denoise; + return out; +} + +function resolveLinkedModelName(value: any, promptGraph: Record | null): string { + if (!promptGraph) return ""; + const visited = new Set(); + const visit = (linkValue: any): string => { + const current = getLinkedNode(linkValue, promptGraph); + if (!current) return ""; + const id = String(current?._mjrPromptId || current?.id || ""); + if (id && visited.has(id)) return ""; + if (id) visited.add(id); + const inputs = current?.inputs || {}; + const direct = + inputs.unet_name || + inputs.ckpt_name || + inputs.model_name || + inputs.model || + inputs.checkpoint || + inputs.checkpoint_name || + ""; + if (typeof direct === "string" && direct.trim()) return direct.trim(); + for (const upstream of Object.values(inputs)) { + const found = visit(upstream); + if (found) return found; + } + return ""; + }; + return visit(value); +} + +function getLinkedNode(value: any, promptGraph: Record): any | null { + if (!Array.isArray(value) || value.length < 1) return null; + const nodeId = String(value[0]); + const node = promptGraph[nodeId]; + if (!node || typeof node !== "object") return null; + if (!node._mjrPromptId) { + try { + Object.defineProperty(node, "_mjrPromptId", { value: nodeId, enumerable: false }); + } catch { + // Non-extensible metadata objects are rare; traversal can continue without stable ids. + } + } + return node; +} + function collectComfyWorkflowNodes(workflow: any, visited = new WeakSet()): any[] { if (!workflow || typeof workflow !== "object") return []; if (visited.has(workflow)) return []; diff --git a/ui/components/sidebar/parsers/geninfoParser.ts b/ui/components/sidebar/parsers/geninfoParser.ts index 3fcd7fd2..eca099dc 100644 --- a/ui/components/sidebar/parsers/geninfoParser.ts +++ b/ui/components/sidebar/parsers/geninfoParser.ts @@ -221,10 +221,19 @@ export function normalizeGenerationMetadata(raw: any): Record | nul } } if (overrideFields.size) mapped.override_fields = Array.from(overrideFields); + enrichSamplerStagesFromNativeWorkflow(mapped, raw); if (Object.keys(mapped).length) return mapped; } + const parsedFromWorkflow = parseComfyUIWorkflow(raw); + if (parsedFromWorkflow) return parsedFromWorkflow; + + if (looksLikeComfyPromptGraph(raw)) { + const parsed = parseComfyUIWorkflow({ prompt: raw }); + if (parsed) return parsed; + } + const flatKeys = [ "prompt", "negative_prompt", @@ -241,14 +250,6 @@ export function normalizeGenerationMetadata(raw: any): Record | nul const hasFlatKey = flatKeys.some((k: any) => Object.prototype.hasOwnProperty.call(raw, k)); if (hasFlatKey) return raw; - const parsedFromWorkflow = parseComfyUIWorkflow(raw); - if (parsedFromWorkflow) return parsedFromWorkflow; - - if (looksLikeComfyPromptGraph(raw)) { - const parsed = parseComfyUIWorkflow({ prompt: raw }); - if (parsed) return parsed; - } - const maybeParams = raw["parameters"] || raw["PNG:Parameters"] || @@ -294,6 +295,33 @@ export function normalizeGenerationMetadata(raw: any): Record | nul return null; } +function enrichSamplerStagesFromNativeWorkflow(mapped: Record, raw: any) { + const nativeWorkflow = + raw?.workflow || + raw?.Workflow || + raw?.comfy_workflow || + raw?.comfy || + raw?.comfyui || + raw?.ComfyUI || + null; + if (!nativeWorkflow || typeof nativeWorkflow !== "object") return; + const parsed = parseComfyUIWorkflow(nativeWorkflow); + const nativeSamplers = Array.isArray(parsed?.all_samplers) ? parsed.all_samplers : []; + if (!nativeSamplers.length) return; + for (const key of ["all_samplers", "chained_passes"]) { + const current = Array.isArray(mapped[key]) ? mapped[key] : []; + if (!current.length) continue; + mapped[key] = current.map((item: any, index: number) => { + const stage = nativeSamplers[index]?.pass_stage; + if (!stage || item?.pass_stage) return item; + return { ...item, pass_stage: stage }; + }); + } + if (!Array.isArray(mapped.all_samplers) && nativeSamplers.length > 1) { + mapped.all_samplers = nativeSamplers; + } +} + export function looksLikeFilePathPrompt(value: any): boolean { const raw = typeof value === "string" ? value.trim() : ""; if (!raw || raw.includes("\n")) return false; diff --git a/ui/components/sidebar/utils/minimap.ts b/ui/components/sidebar/utils/minimap.ts index 1ed8011a..b4444abf 100644 --- a/ui/components/sidebar/utils/minimap.ts +++ b/ui/components/sidebar/utils/minimap.ts @@ -68,10 +68,11 @@ export function drawWorkflowMinimap(canvas: HTMLCanvasElement, workflow: any, op renderErrorState: true, showViewport: true, showNodeLabels: false, + expandSubgraphs: true, ...(options && typeof options === "object" ? options : {}), }; - const renderWorkflow = expandSubgraphsForMinimap(workflow); + const renderWorkflow = settings.expandSubgraphs === false ? workflow : expandSubgraphsForMinimap(workflow); const nodes = Array.isArray(renderWorkflow?.nodes) ? renderWorkflow.nodes : []; const groups = (Array.isArray(renderWorkflow?.groups) && renderWorkflow.groups) || diff --git a/ui/features/filters/calendar/AgendaCalendar.ts b/ui/features/filters/calendar/AgendaCalendar.ts index 0419ad44..0d111c8e 100644 --- a/ui/features/filters/calendar/AgendaCalendar.ts +++ b/ui/features/filters/calendar/AgendaCalendar.ts @@ -171,12 +171,12 @@ export function createAgendaCalendar({ const clearBtn = document.createElement("button"); clearBtn.type = "button"; clearBtn.className = "mjr-btn mjr-agenda-clear"; - clearBtn.textContent = "Clear"; + clearBtn.textContent = t("action.clear", "Clear"); const refreshBtn = document.createElement("button"); refreshBtn.type = "button"; refreshBtn.className = "mjr-btn mjr-agenda-refresh"; - refreshBtn.textContent = "Refresh"; + refreshBtn.textContent = t("action.refresh", "Refresh"); footer.appendChild(clearBtn); footer.appendChild(refreshBtn); @@ -202,7 +202,15 @@ export function createAgendaCalendar({ grid.innerHTML = ""; - const weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; + const weekdays = [ + t("weekday.monShort", "Mon"), + t("weekday.tueShort", "Tue"), + t("weekday.wedShort", "Wed"), + t("weekday.thuShort", "Thu"), + t("weekday.friShort", "Fri"), + t("weekday.satShort", "Sat"), + t("weekday.sunShort", "Sun"), + ]; for (const w of weekdays) { const el = document.createElement("div"); el.className = "mjr-agenda-weekday"; @@ -236,11 +244,16 @@ export function createAgendaCalendar({ if (count > 0) { cell.classList.add("mjr-agenda-day--has-assets"); - cell.title = `${count} asset${count === 1 ? "" : "s"}`; + const countLabel = t( + count === 1 ? "tooltip.assetsDaySingular" : "tooltip.assetsDayPlural", + count === 1 ? "{count} asset" : "{count} assets", + { count }, + ); + cell.title = countLabel; const badge = document.createElement("span"); badge.className = "mjr-agenda-day-badge"; badge.textContent = count > 99 ? "99+" : String(count); - badge.setAttribute("aria-label", `${count} asset${count === 1 ? "" : "s"}`); + badge.setAttribute("aria-label", countLabel); cell.appendChild(badge); } else { cell.title = t("tooltip.noAssetsDay", "No assets on this day"); diff --git a/ui/features/geninfo/genInfoOverridePicker.ts b/ui/features/geninfo/genInfoOverridePicker.ts index 3967da25..65b2dc0c 100644 --- a/ui/features/geninfo/genInfoOverridePicker.ts +++ b/ui/features/geninfo/genInfoOverridePicker.ts @@ -1,5 +1,6 @@ import { getRawHostApp } from "../../app/hostAdapter.js"; import { collectGraphVisits, findGraphNodeById, getGraphNodes } from "../../app/graphTraversal.js"; +import { t } from "../../app/i18n.js"; import { writeWidgetValue } from "../viewer/workflowSidebar/widgetAdapters.js"; type LooseRecord = Record; @@ -7,8 +8,8 @@ type Candidate = { field: string; label: string; value: any; source: string }; const EXTENSION_ID = "Majoor.GenInfoOverridePicker"; const TARGET_NODE = "MajoorGenInfoOverride"; -const AUTO_FILL_BUTTON = "Auto fill from workflow"; -const PICK_BUTTON_PREFIX = "Pick"; +const AUTO_FILL_BUTTON = t("genInfoOverride.autoFillFromWorkflow", "Auto fill from workflow"); +const PICK_BUTTON_PREFIX = t("genInfoOverride.pick", "Pick"); const FIELD_ALIASES: Record = { positive_prompt: ["positive_prompt", "prompt", "text"], negative_prompt: ["negative_prompt", "negative", "negative_text"], @@ -280,14 +281,10 @@ function registerExecutedVisualSync(runtimeApp: any): void { executedListenerRegistered = true; api.addEventListener("executed", (event: any) => { const nodeId = event?.detail?.node ?? event?.detail?.display_node; - const payload = extractExecutedOverridePayload(event); - if (!nodeId || !payload) return; + if (!nodeId) return; const node = findGraphNodeById(runtimeApp, nodeId); if (!node || String(node?.comfyClass || node?.type || "") !== TARGET_NODE) return; - const count = applyPayloadToWidgets(node, payload); - if (!count) return; - runtimeApp?.graph?.setDirtyCanvas?.(true, true); - runtimeApp?.graph?.change?.(); + syncNodeFromExecutedMessage(node, event?.detail?.output, runtimeApp); }); } @@ -306,10 +303,14 @@ function showPicker(node: LooseRecord, runtimeApp: any, targetField: string | nu overlay.style.cssText = "position:fixed;inset:0;z-index:1000000;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center"; const panel = document.createElement("div"); panel.style.cssText = "width:min(720px,92vw);max-height:80vh;overflow:auto;background:#202020;color:#eee;border:1px solid #555;border-radius:8px;padding:12px;box-shadow:0 16px 48px rgba(0,0,0,.55);font:12px sans-serif"; - const title = targetField ? `Pick ${targetField.replace(/_/g, " ")}` : "Pick Gen Info from workflow"; - panel.innerHTML = `
`; + const title = targetField + ? t("genInfoOverride.pickField", "Pick {field}", { field: targetField.replace(/_/g, " ") }) + : t("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"); + panel.innerHTML = `
`; const strong = panel.querySelector("strong"); if (strong) strong.textContent = title; + const closeButton = panel.querySelector("[data-close]"); + if (closeButton) closeButton.textContent = t("dialog.close", "Close"); for (const candidate of candidates) { const row = document.createElement("button"); row.type = "button"; @@ -331,6 +332,27 @@ function showPicker(node: LooseRecord, runtimeApp: any, targetField: string | nu document.body.appendChild(overlay); } +function getNodeMenuItems(node: any, runtimeApp: any) { + if (String(node?.comfyClass || node?.type || "") !== TARGET_NODE) return []; + const items = [ + { + content: t("genInfoOverride.pickFromWorkflow", "Pick Gen Info from workflow"), + callback: () => showPicker(node, runtimeApp), + }, + ]; + for (const item of PICK_FIELDS) { + items.push({ + content: `Pick ${item.label}`, + callback: () => showPicker(node, runtimeApp, item.field), + }); + } + items.push({ + content: AUTO_FILL_BUTTON, + callback: () => autoFillFromWorkflow(node, runtimeApp), + }); + return items; +} + export function registerGenInfoOverridePicker(appRef: any = null): void { if (registered) return; const runtimeApp = appRef || getRawHostApp(); @@ -345,38 +367,8 @@ export function registerGenInfoOverridePicker(appRef: any = null): void { async nodeCreated(node: any) { ensurePickerWidgets(node, runtimeApp); }, - async beforeRegisterNodeDef(nodeType: any, nodeData: any) { - if (String(nodeData?.name || "") !== TARGET_NODE) return; - const prevCreated = nodeType.prototype.onNodeCreated; - nodeType.prototype.onNodeCreated = function () { - const result = prevCreated?.apply?.(this, arguments as any); - ensurePickerWidgets(this, runtimeApp); - return result; - }; - const prevExecuted = nodeType.prototype.onExecuted; - nodeType.prototype.onExecuted = function (message: any) { - const result = prevExecuted?.apply?.(this, arguments as any); - syncNodeFromExecutedMessage(this, message, runtimeApp); - return result; - }; - const prev = nodeType.prototype.getExtraMenuOptions; - nodeType.prototype.getExtraMenuOptions = function (_canvas: any, options: any[]) { - prev?.apply?.(this, arguments as any); - options.push({ - content: "Pick Gen Info from workflow", - callback: () => showPicker(this, runtimeApp), - }); - for (const item of PICK_FIELDS) { - options.push({ - content: `Pick ${item.label}`, - callback: () => showPicker(this, runtimeApp, item.field), - }); - } - options.push({ - content: AUTO_FILL_BUTTON, - callback: () => autoFillFromWorkflow(this, runtimeApp), - }); - }; + getNodeMenuItems(node: any) { + return getNodeMenuItems(node, runtimeApp); }, }); setTimeout(() => { diff --git a/ui/features/panel/controllers/contextController.ts b/ui/features/panel/controllers/contextController.ts index 875a990c..12fe9fb8 100644 --- a/ui/features/panel/controllers/contextController.ts +++ b/ui/features/panel/controllers/contextController.ts @@ -30,6 +30,7 @@ export function createContextController({ kindSelect, wfCheckbox, workflowTypeSelect, + workflowIdInput, ratingSelect, minSizeInput, maxSizeInput, @@ -67,6 +68,7 @@ export function createContextController({ "maxHeight", "resolutionCompare", "workflowType", + "workflowId", "dateRangeFilter", "dateExactFilter", "sort", @@ -281,6 +283,19 @@ export function createContextController({ console.debug?.(e); } }, + clearWorkflowId: async () => { + try { + setStateValue("workflowId", ""); + _safeSetValue(workflowIdInput, ""); + } catch (e) { + console.debug?.(e); + } + try { + await reloadGrid?.(); + } catch (e) { + console.debug?.(e); + } + }, clearSize: async () => { try { setStateValue("minSizeMB", 0); @@ -377,6 +392,7 @@ export function createContextController({ setStateValue("maxHeight", 0); setStateValue("resolutionCompare", "gte"); setStateValue("workflowType", ""); + setStateValue("workflowId", ""); setStateValue("dateRangeFilter", ""); setStateValue("dateExactFilter", ""); setStateValue("sort", "mtime_desc"); @@ -404,6 +420,7 @@ export function createContextController({ _safeSetValue(kindSelect, ""); _safeSetChecked(wfCheckbox, false); _safeSetValue(workflowTypeSelect, ""); + _safeSetValue(workflowIdInput, ""); _safeSetValue(ratingSelect, "0"); _safeSetValue(minSizeInput, ""); _safeSetValue(maxSizeInput, ""); @@ -455,6 +472,7 @@ export function createContextController({ (Number(getStateValue("maxWidth", 0) || 0) || 0) > 0 || (Number(getStateValue("maxHeight", 0) || 0) || 0) > 0 || String(getStateValue("workflowType", "") || "").trim().length > 0 || + String(getStateValue("workflowId", "") || "").trim().length > 0 || getStateValue("dateRangeFilter", "") || "" || getStateValue("dateExactFilter", "") || diff --git a/ui/features/panel/controllers/filtersController.ts b/ui/features/panel/controllers/filtersController.ts index 38617273..1d17a797 100644 --- a/ui/features/panel/controllers/filtersController.ts +++ b/ui/features/panel/controllers/filtersController.ts @@ -13,6 +13,7 @@ export function bindFilters({ kindSelect, wfCheckbox, workflowTypeSelect, + workflowIdInput, ratingSelect, minSizeInput, maxSizeInput, @@ -33,6 +34,7 @@ export function bindFilters({ "workflowOnly", "minRating", "workflowType", + "workflowId", "minSizeMB", "maxSizeMB", "minWidth", @@ -155,6 +157,22 @@ export function bindFilters({ lifecycleSignal ? { signal: lifecycleSignal } : undefined, ); } + if (workflowIdInput) { + addManagedListener( + workflowIdInput, + "change", + () => { + write("workflowId", String(workflowIdInput.value || "").trim()); + try { + onFiltersChanged?.(); + } catch (e) { + console.debug?.(e); + } + scheduleReload(); + }, + lifecycleSignal ? { signal: lifecycleSignal } : undefined, + ); + } const applySizeFilter = () => { const minVal = parseLooseNumber(minSizeInput?.value || 0); diff --git a/ui/features/panel/controllers/gridController.ts b/ui/features/panel/controllers/gridController.ts index aa6bab77..3748e2e0 100644 --- a/ui/features/panel/controllers/gridController.ts +++ b/ui/features/panel/controllers/gridController.ts @@ -30,6 +30,7 @@ export function createGridController({ "maxWidth", "maxHeight", "workflowType", + "workflowId", "dateRangeFilter", "dateExactFilter", "sort", @@ -144,6 +145,7 @@ export function createGridController({ String(read("workflowType", "") || "") .trim() .toUpperCase() || null, + workflowId: String(read("workflowId", "") || "").trim() || null, dateRange: String(read("dateRangeFilter", "") || "") .trim() @@ -328,6 +330,7 @@ export function createGridController({ gridContainer.dataset.mjrFilterMaxWidth = String(read("maxWidth", 0) || 0); gridContainer.dataset.mjrFilterMaxHeight = String(read("maxHeight", 0) || 0); gridContainer.dataset.mjrFilterWorkflowType = String(read("workflowType", "") || ""); + gridContainer.dataset.mjrFilterWorkflowId = String(read("workflowId", "") || ""); gridContainer.dataset.mjrFilterDateRange = read("dateRangeFilter", "") || ""; gridContainer.dataset.mjrFilterDateExact = read("dateExactFilter", "") || ""; gridContainer.dataset.mjrSort = read("sort", "mtime_desc") || "mtime_desc"; diff --git a/ui/features/panel/panelFiltersInit.ts b/ui/features/panel/panelFiltersInit.ts index ee7936df..ea684918 100644 --- a/ui/features/panel/panelFiltersInit.ts +++ b/ui/features/panel/panelFiltersInit.ts @@ -18,6 +18,7 @@ export function setupFiltersInit({ kindSelect, wfCheckbox, workflowTypeSelect, + workflowIdInput, ratingSelect, minSizeInput, maxSizeInput, @@ -47,6 +48,7 @@ export function setupFiltersInit({ workflowTypeSelect.value = String(state.workflowType || "") .trim() .toUpperCase(); + if (workflowIdInput) workflowIdInput.value = String(state.workflowId || "").trim(); ratingSelect.value = String(Number(state.minRating || 0) || 0); minSizeInput.value = Number(state.minSizeMB || 0) > 0 ? String(state.minSizeMB) : ""; maxSizeInput.value = Number(state.maxSizeMB || 0) > 0 ? String(state.maxSizeMB) : ""; @@ -89,11 +91,6 @@ export function setupFiltersInit({ } catch (e) { console.debug?.(e); } - try { - popovers?.close?.(filterPopover); - } catch (e) { - console.debug?.(e); - } void exitSimilarViewIfActive({ reload: false }); try { agendaCalendar?.refresh?.(); @@ -131,6 +128,7 @@ export function setupFiltersInit({ kindSelect, wfCheckbox, workflowTypeSelect, + workflowIdInput, ratingSelect, minSizeInput, maxSizeInput, diff --git a/ui/features/panel/panelRuntime.ts b/ui/features/panel/panelRuntime.ts index 57b05a53..be762421 100644 --- a/ui/features/panel/panelRuntime.ts +++ b/ui/features/panel/panelRuntime.ts @@ -163,6 +163,7 @@ async function _mountPanelRuntimeImpl(container: any, { useComfyThemeUI = true, kindSelect, wfCheckbox, workflowTypeSelect, + workflowIdInput, ratingSelect, minSizeInput, maxSizeInput, @@ -866,6 +867,7 @@ async function _mountPanelRuntimeImpl(container: any, { useComfyThemeUI = true, kindSelect, wfCheckbox, workflowTypeSelect, + workflowIdInput, ratingSelect, minSizeInput, maxSizeInput, @@ -906,6 +908,7 @@ async function _mountPanelRuntimeImpl(container: any, { useComfyThemeUI = true, kindSelect, wfCheckbox, workflowTypeSelect, + workflowIdInput, ratingSelect, minSizeInput, maxSizeInput, diff --git a/ui/features/panel/views/contextPillsView.ts b/ui/features/panel/views/contextPillsView.ts index ac60f05a..6a27362d 100644 --- a/ui/features/panel/views/contextPillsView.ts +++ b/ui/features/panel/views/contextPillsView.ts @@ -85,6 +85,7 @@ export function createContextPillsView(): Record { (Number(state?.maxWidth || 0) || 0) > 0 || (Number(state?.maxHeight || 0) || 0) > 0 || _safeText(state?.workflowType || "").trim() || + _safeText(state?.workflowId || "").trim() || _safeText(state?.dateRangeFilter || "").trim() || _safeText(state?.dateExactFilter || "").trim() ); @@ -190,6 +191,16 @@ export function createContextPillsView(): Record { }), ); } + if (_safeText(state?.workflowId || "").trim()) { + const workflowId = _safeText(state?.workflowId || "").trim(); + root.appendChild( + _createPill({ + label: t("label.sameWorkflow", "Generated with Same Workflow"), + value: workflowId.length > 18 ? `${workflowId.slice(0, 8)}...${workflowId.slice(-6)}` : workflowId, + onClear: () => safeActions?.clearWorkflowId?.(), + }), + ); + } if ((Number(state?.minSizeMB || 0) || 0) > 0 || (Number(state?.maxSizeMB || 0) || 0) > 0) { const min = Number(state?.minSizeMB || 0) || 0; const max = Number(state?.maxSizeMB || 0) || 0; diff --git a/ui/features/viewer/floatingViewerManager.ts b/ui/features/viewer/floatingViewerManager.ts index 65eaff86..bdd7fdc8 100644 --- a/ui/features/viewer/floatingViewerManager.ts +++ b/ui/features/viewer/floatingViewerManager.ts @@ -13,7 +13,7 @@ import { EVENTS } from "../../app/events.js"; import { APP_CONFIG } from "../../app/config.js"; import { getAssetsBatch } from "../../api/client.js"; -import { getRawHostApp } from "../../app/hostAdapter.js"; +import { observeHostCanvasSelection } from "../../app/hostAdapter.js"; import { getActiveGridContainer } from "../panel/panelRuntimeRefs.js"; import { getSelectedIdSet } from "../grid/GridSelectionManager.js"; import { getHotkeysState, isHotkeysSuspended } from "../panel/controllers/hotkeysState.js"; @@ -397,13 +397,7 @@ function _unbindSelectionListener() { // -- Node selection hooks (canvas -> sidebar sync) ----------------------------- let _nodeSelectionBound = false; -let _origOnNodeSelected: any = null; -let _origOnSelectionChange: any = null; -let _origOnNodeDeselected: any = null; -let _hadOwnOnNodeSelected = false; -let _hadOwnOnSelectionChange = false; -let _hadOwnOnNodeDeselected = false; -let _canvasPointerupHandler: any = null; +let _disposeNodeSelectionBinding: any = null; let _sidebarRefreshTimer: any = null; let _sidebarRefreshTimerKind = ""; @@ -453,48 +447,10 @@ function _clearScheduledCanvasNodeSelection() { function _bindNodeSelectionListener() { if (_nodeSelectionBound) return; try { - const app = getRawHostApp(); - const canvas = app?.canvas; - if (!canvas) return; - - _hadOwnOnNodeSelected = Object.prototype.hasOwnProperty.call(canvas, "onNodeSelected"); - _hadOwnOnSelectionChange = Object.prototype.hasOwnProperty.call( - canvas, - "onSelectionChange", - ); - _hadOwnOnNodeDeselected = Object.prototype.hasOwnProperty.call( - canvas, - "onNodeDeselected", - ); - - _origOnNodeSelected = canvas.onNodeSelected; - _origOnSelectionChange = canvas.onSelectionChange; - _origOnNodeDeselected = canvas.onNodeDeselected; - - canvas.onNodeSelected = function (node: any) { - _origOnNodeSelected?.call(this, node); - _onCanvasNodeSelection(); - }; - canvas.onSelectionChange = function (selectedNodes: any) { - _origOnSelectionChange?.call(this, selectedNodes); - _onCanvasNodeSelection(); - }; - // Needed for deselect-all (click on empty canvas) - LiteGraph calls - // onNodeDeselected for each previously-selected node when clearing. - canvas.onNodeDeselected = function (node: any) { - _origOnNodeDeselected?.call(this, node); - _onCanvasNodeSelection(); - }; - - // DOM-level fallback: catches cases that bypass LiteGraph callbacks - // (e.g. keyboard-only selection, custom ComfyUI selection code). - const canvasDomEl = canvas.canvas; - if (canvasDomEl?.addEventListener) { - _canvasPointerupHandler = _scheduleCanvasNodeSelection; - canvasDomEl.addEventListener("pointerup", _canvasPointerupHandler); - } - - _nodeSelectionBound = true; + _disposeNodeSelectionBinding = observeHostCanvasSelection(_scheduleCanvasNodeSelection, { + includePointerFallback: true, + }); + _nodeSelectionBound = typeof _disposeNodeSelectionBinding === "function"; } catch (e: any) { console.debug?.("[MFV] _bindNodeSelectionListener error", e); } @@ -504,29 +460,11 @@ function _unbindNodeSelectionListener() { if (!_nodeSelectionBound) return; _clearScheduledCanvasNodeSelection(); try { - const app = getRawHostApp(); - const canvas = app?.canvas; - if (canvas) { - if (_hadOwnOnNodeSelected) canvas.onNodeSelected = _origOnNodeSelected; - else delete canvas.onNodeSelected; - if (_hadOwnOnSelectionChange) canvas.onSelectionChange = _origOnSelectionChange; - else delete canvas.onSelectionChange; - if (_hadOwnOnNodeDeselected) canvas.onNodeDeselected = _origOnNodeDeselected; - else delete canvas.onNodeDeselected; - if (_canvasPointerupHandler && canvas.canvas?.removeEventListener) { - canvas.canvas.removeEventListener("pointerup", _canvasPointerupHandler); - } - } + _disposeNodeSelectionBinding?.(); } catch (e: any) { console.debug?.("[MFV] _unbindNodeSelectionListener error", e); } - _origOnNodeSelected = null; - _origOnSelectionChange = null; - _origOnNodeDeselected = null; - _hadOwnOnNodeSelected = false; - _hadOwnOnSelectionChange = false; - _hadOwnOnNodeDeselected = false; - _canvasPointerupHandler = null; + _disposeNodeSelectionBinding = null; _nodeSelectionBound = false; } diff --git a/ui/features/viewer/floatingViewerProgress.ts b/ui/features/viewer/floatingViewerProgress.ts index 40a81241..95d3cf2c 100644 --- a/ui/features/viewer/floatingViewerProgress.ts +++ b/ui/features/viewer/floatingViewerProgress.ts @@ -1,8 +1,13 @@ -import { getRawHostApi, getRawHostApp, waitForRawHostApi } from "../../app/hostAdapter.js"; +import { + centerHostCanvasNodeById, + getRawHostApi, + getRawHostApp, + waitForRawHostApi, + wrapHostQueuePrompt, +} from "../../app/hostAdapter.js"; import { findGraphNodeById, getHostRootGraph } from "../../app/graphTraversal.js"; const PROGRESS_UPDATE_EVENT = "progress-update"; -const QUEUE_PROMPT_PATCH_KEY = Symbol.for("mjr.mfv.progress.queuePromptPatch"); const GLOBAL_SERVICE_KEY = "__MJR_MFV_PROGRESS_SERVICE__"; function getGlobalHost() { @@ -128,6 +133,7 @@ export class FloatingViewerProgressService extends EventTarget { this._api = null; this._listenerEntries = []; this._initPromise = null; + this._queuePromptBinding = null; } getSnapshot() { @@ -189,52 +195,41 @@ export class FloatingViewerProgressService extends EventTarget { } _patchQueuePrompt(api: any) { - if (!api || typeof api.queuePrompt !== "function") return; - const existing = api.queuePrompt?.[QUEUE_PROMPT_PATCH_KEY]; - if (existing?.service === this) return; - if (existing?.service && existing.service !== this) return; - - const originalQueuePrompt = api.queuePrompt; 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; + } - const wrappedQueuePrompt = 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; - } - - 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; - }; - - Object.defineProperty(wrappedQueuePrompt, QUEUE_PROMPT_PATCH_KEY, { - configurable: true, - value: { - service, - originalQueuePrompt, + 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; + }; }, }); - - api.queuePrompt = wrappedQueuePrompt; } _attachApiListeners(api: any) { @@ -332,21 +327,15 @@ export class FloatingViewerProgressService extends EventTarget { } } - if ( - resetPatchedQueuePrompt && - this._api?.queuePrompt?.[QUEUE_PROMPT_PATCH_KEY]?.service === this - ) { + if (resetPatchedQueuePrompt && this._queuePromptBinding?.owner === this) { try { - const original = - this._api.queuePrompt[QUEUE_PROMPT_PATCH_KEY]?.originalQueuePrompt || null; - if (typeof original === "function") { - this._api.queuePrompt = original; - } + this._queuePromptBinding.restore?.(); } catch (e: any) { console.debug?.(e); } } + this._queuePromptBinding = null; this._api = null; if (!keepState) { this.promptsMap.clear(); @@ -517,12 +506,7 @@ function centerFloatingViewerProgressNode(viewer: any, nodeId: any) { const safeNodeId = String(nodeId || "").trim(); if (!safeNodeId) return false; try { - const app = getRawHostApp(); - const canvas = app?.canvas || null; - const node = findGraphNodeById(getHostRootGraph(app), safeNodeId); - if (!node || typeof canvas?.centerOnNode !== "function") return false; - canvas.centerOnNode(node); - return true; + return centerHostCanvasNodeById(safeNodeId, getRawHostApp()); } catch (e: any) { console.debug?.(e); return false; diff --git a/ui/features/viewer/floatingViewerUi.ts b/ui/features/viewer/floatingViewerUi.ts index a46475e0..f216d8f7 100644 --- a/ui/features/viewer/floatingViewerUi.ts +++ b/ui/features/viewer/floatingViewerUi.ts @@ -295,27 +295,27 @@ export function buildFloatingViewerToolbar(viewer: any): HTMLElement { const modeDrop = _mkIconDrop( '', - "Viewer mode", + t("viewer.mode", "Viewer mode"), [ { value: MFV_MODES.SIMPLE, - html: 'Simple', + html: `${t("viewer.mode.simple", "Simple")}`, }, { value: MFV_MODES.AB, - html: 'A/B Compare', + html: `${t("viewer.mode.abCompare", "A/B Compare")}`, }, { value: MFV_MODES.SIDE, - html: 'Side-by-side', + html: `${t("viewer.mode.sideBySide", "Side-by-side")}`, }, { value: MFV_MODES.GRID, - html: 'Grid', + html: `${t("viewer.mode.grid", "Grid")}`, }, { value: MFV_MODES.GRAPH, - html: 'Graph Map', + html: `${t("workflowSidebar.graphMap", "Graph Map")}`, }, ], viewer, @@ -330,7 +330,7 @@ export function buildFloatingViewerToolbar(viewer: any): HTMLElement { const pinBtn = document.createElement("button"); pinBtn.type = "button"; pinBtn.className = "mjr-icon-btn mjr-mfv-pin-trigger"; - pinBtn.title = "Pin slots A/B/C/D"; + pinBtn.title = t("viewer.pinSlots", "Pin slots A/B/C/D"); pinBtn.setAttribute("aria-haspopup", "dialog"); pinBtn.setAttribute("aria-expanded", "false"); pinBtn.innerHTML = ''; diff --git a/ui/features/viewer/model3dRenderer.impl.ts b/ui/features/viewer/model3dRenderer.impl.ts index 45447761..00b87b5b 100644 --- a/ui/features/viewer/model3dRenderer.impl.ts +++ b/ui/features/viewer/model3dRenderer.impl.ts @@ -1,6 +1,7 @@ import { buildViewerResourceURL } from "../../api/endpoints.js"; import { APP_CONFIG } from "../../app/config.js"; import { EVENTS } from "../../app/events.js"; +import { t } from "../../app/i18n.js"; import { applyModel3DMaterialMode as _applyMaterialMode, buildRenderableModel3DObject as _buildRenderableObject, @@ -44,7 +45,7 @@ export const MODEL3D_EXTS = new Set(Object.keys(MODEL3D_EXT_TO_LOADER)); export const PREVIEWABLE_MODEL3D_LOADERS = new Set(["gltf", "obj", "fbx", "stl", "ply"]); const MODEL3D_VIEWER_DEFAULT_BG = "#282828"; -const MODEL3D_DEFAULT_CONTROL_HINT = "Rotate: left drag Pan: right drag Zoom: wheel"; +const MODEL3D_DEFAULT_CONTROL_HINT = t("model3d.controlHint", "Rotate: left drag Pan: right drag Zoom: wheel"); const MODEL3D_VIEW_MODES = Object.freeze({ PERSPECTIVE: "perspective", ORTHOGRAPHIC: "orthographic", @@ -291,10 +292,10 @@ export function createModel3DMediaElement(asset: any, url: any, options: Record< const viewportTools = document.createElement("div"); viewportTools.style.cssText = "display:flex;align-items:center;gap:6px;flex-wrap:wrap;pointer-events:auto;"; - const resetViewBtn = _createViewportButton("Reset", "Reset 3D view"); - const gridBtn = _createViewportButton("Grid", "Toggle grid"); - const cameraModeBtn = _createViewportButton("Persp", "Switch perspective / orthographic"); - const settingsBtn = _createViewportButton("Settings", "Settings"); + const resetViewBtn = _createViewportButton(t("model3d.reset", "Reset"), t("model3d.resetView", "Reset 3D view")); + const gridBtn = _createViewportButton(t("model3d.grid", "Grid"), t("model3d.toggleGrid", "Toggle grid")); + const cameraModeBtn = _createViewportButton(t("model3d.persp", "Persp"), t("model3d.switchCamera", "Switch perspective / orthographic")); + const settingsBtn = _createViewportButton(t("model3d.settings", "Settings"), t("model3d.settings", "Settings")); viewportTools.append(resetViewBtn, gridBtn, cameraModeBtn, settingsBtn); viewportToolbar.appendChild(viewportTools); host.appendChild(viewportToolbar); @@ -592,7 +593,7 @@ export function createModel3DMediaElement(asset: any, url: any, options: Record< animationActions[idx] = action; currentAnimIdx = idx; isAnimPlaying = true; - animDom.playBtn.textContent = "Pause"; + animDom.playBtn.textContent = t("model3d.pause", "Pause"); // Scale progress slider steps to clip duration for consistent seek granularity // (~10ms steps, min 100 ticks, max 10000 ticks) try { @@ -606,14 +607,14 @@ export function createModel3DMediaElement(asset: any, url: any, options: Record< if (isAnimPlaying) { animationMixer.timeScale = 0; isAnimPlaying = false; - animDom.playBtn.textContent = "Play"; + animDom.playBtn.textContent = t("model3d.play", "Play"); } else { animationMixer.timeScale = animSpeed; if (!animationActions[currentAnimIdx]?.isRunning?.()) { playAnimation(currentAnimIdx); } else { isAnimPlaying = true; - animDom.playBtn.textContent = "Pause"; + animDom.playBtn.textContent = t("model3d.pause", "Pause"); } } }; @@ -686,7 +687,7 @@ export function createModel3DMediaElement(asset: any, url: any, options: Record< _setViewportButtonActive(gridBtn, Boolean(gridHelper?.visible)); _setViewportButtonActive(cameraModeBtn, viewportMode === MODEL3D_VIEW_MODES.ORTHOGRAPHIC); cameraModeBtn.textContent = - viewportMode === MODEL3D_VIEW_MODES.ORTHOGRAPHIC ? "Ortho" : "Persp"; + viewportMode === MODEL3D_VIEW_MODES.ORTHOGRAPHIC ? t("model3d.ortho", "Ortho") : t("model3d.persp", "Persp"); _setViewportButtonActive(settingsBtn, settingsPanelVisible); }; @@ -980,7 +981,7 @@ export function createModel3DMediaElement(asset: any, url: any, options: Record< const dl = document.createElement("a"); dl.href = url; dl.download = String(asset?.filename || "model"); - dl.textContent = `Download ${String(asset?.filename || "file")}`; + dl.textContent = t("model3d.downloadFile", "Download {file}", { file: String(asset?.filename || "file") }); dl.style.cssText = [ "position:absolute", "bottom:18px", diff --git a/ui/features/viewer/model3dSupport.ts b/ui/features/viewer/model3dSupport.ts index 30436794..0cced69c 100644 --- a/ui/features/viewer/model3dSupport.ts +++ b/ui/features/viewer/model3dSupport.ts @@ -1,4 +1,5 @@ import { drawMediaError } from "./imageProcessor.js"; +import { t } from "../../app/i18n.js"; const MODEL3D_ANIMATION_SPEEDS = [0.25, 0.5, 1.0, 1.5, 2.0]; const MODEL3D_ANIM_BAR_HEIGHT_PX = 44; @@ -30,7 +31,7 @@ export function createModel3DViewportButton(label: string, title: string): HTMLB button.type = "button"; button.textContent = String(label || ""); button.title = String(title || label || ""); - button.setAttribute("aria-label", String(title || label || "3D viewport action")); + button.setAttribute("aria-label", String(title || label || t("model3d.viewportAction", "3D viewport action"))); button.style.cssText = [ "height:28px", "padding:0 10px", @@ -117,7 +118,7 @@ export function drawModel3DMessage(canvas: HTMLCanvasElement, title: string, hin ctx.font = "600 18px system-ui, sans-serif"; ctx.textAlign = "center"; ctx.textBaseline = "middle"; - ctx.fillText(String(title || "3D preview"), cx, cy + 44); + ctx.fillText(String(title || t("model3d.preview", "3D preview")), cx, cy + 44); if (hint) { ctx.fillStyle = "rgba(255,255,255,0.62)"; ctx.font = "13px system-ui, sans-serif"; @@ -126,7 +127,7 @@ export function drawModel3DMessage(canvas: HTMLCanvasElement, title: string, hin } catch (e: any) { console.debug?.(e); try { - drawMediaError(canvas, title, hint || "3D viewer unavailable"); + drawMediaError(canvas, title, hint || t("model3d.unavailable", "3D viewer unavailable")); } catch (err: any) { console.debug?.(err); } @@ -260,7 +261,7 @@ export function createModel3DSettingsPanel({ bgInput.value = defaultBgColor || "#282828"; bgInput.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;"; - addRow("Background", bgInput); + addRow(t("model3d.background", "Background"), bgInput); addSectionHeader("Model"); const materialSel = makeSelect( @@ -273,7 +274,7 @@ export function createModel3DSettingsPanel({ ], "original", ); - addRow("Material", materialSel); + addRow(t("model3d.material", "Material"), materialSel); const upSel = makeSelect( [ @@ -296,16 +297,16 @@ export function createModel3DSettingsPanel({ skeletonToggle.type = "checkbox"; skeletonToggle.checked = false; skeletonToggle.style.cssText = "cursor:pointer;accent-color:#4CAF50;flex-shrink:0;"; - skeletonRow = addRow("Skeleton", skeletonToggle); + skeletonRow = addRow(t("model3d.skeleton", "Skeleton"), skeletonToggle); } addSectionHeader("Camera"); const fovData = makeSlider(15, 120, 1, defaultFov ?? 75); addRow("FOV", fovData.wrap); - addSectionHeader("Lights"); + addSectionHeader(t("model3d.lights", "Lights")); const lightData = makeSlider(0, 5, 0.1, defaultLightIntensity ?? 1.0); - addRow("Intensity", lightData.wrap); + addRow(t("model3d.intensity", "Intensity"), lightData.wrap); return { panel, @@ -355,8 +356,8 @@ export function createModel3DAnimationBar() { const playBtn = document.createElement("button"); playBtn.type = "button"; - playBtn.textContent = "Play"; - playBtn.title = "Play / Pause"; + playBtn.textContent = t("model3d.play", "Play"); + playBtn.title = t("model3d.playPause", "Play / Pause"); playBtn.style.cssText = [ "width:28px", "height:28px", @@ -375,7 +376,7 @@ export function createModel3DAnimationBar() { ].join(";"); const speedSel = document.createElement("select"); - speedSel.title = "Playback speed"; + speedSel.title = t("model3d.playbackSpeed", "Playback speed"); speedSel.style.cssText = [ "background:rgba(20,24,34,0.9)", "color:rgba(255,255,255,0.8)", diff --git a/ui/features/viewer/workflowGraphMap/WorkflowGraphMapPanel.ts b/ui/features/viewer/workflowGraphMap/WorkflowGraphMapPanel.ts index d9664066..87b7f31c 100644 --- a/ui/features/viewer/workflowGraphMap/WorkflowGraphMapPanel.ts +++ b/ui/features/viewer/workflowGraphMap/WorkflowGraphMapPanel.ts @@ -7,6 +7,7 @@ import { getNodeParamEntries, getNodeType, getNodeTypeLabel, + getNodeWidgetValueEntries, getWorkflowNodes, resolveAssetWorkflow, } from "./workflowGraphMapData.js"; @@ -33,6 +34,8 @@ export class WorkflowGraphMapPanel { this._drag = null; this._previewMedia = null; this._previewKey = ""; + this._subgraphDisplayMode = "expand"; + this._modeButtons = new Map(); this._el = this._build(); } @@ -93,6 +96,15 @@ export class WorkflowGraphMapPanel { this._status.className = "mjr-wgm-status"; root.appendChild(this._status); + if (this._large) { + this._toolbar = document.createElement("div"); + this._toolbar.className = "mjr-wgm-toolbar"; + this._toolbar.appendChild(this._makeModeButton("Expand subgraphs", "expand")); + this._toolbar.appendChild(this._makeModeButton("Host nodes only", "host")); + root.appendChild(this._toolbar); + this._syncModeButtons(); + } + this._details = document.createElement("div"); this._details.className = "mjr-wgm-details"; root.appendChild(this._details); @@ -162,6 +174,7 @@ export class WorkflowGraphMapPanel { this._renderInfo = drawWorkflowMinimap(canvas, this._workflow, { showNodeLabels: true, showViewport: false, + expandSubgraphs: this._subgraphDisplayMode !== "host", view: { hoveredNodeId: this._selectedNodeId || null, zoom: this._view.zoom, @@ -177,7 +190,8 @@ export class WorkflowGraphMapPanel { } _renderDetails() { - const nodeCount = getWorkflowNodes(this._workflow).length; + const includeSubgraphs = this._subgraphDisplayMode !== "host"; + const nodeCount = getWorkflowNodes(this._workflow, { includeSubgraphs }).length; if (!this._workflow) { this._status.textContent = this._large ? "No workflow graph in selected image" @@ -187,11 +201,11 @@ export class WorkflowGraphMapPanel { } this._status.textContent = this._large ? this._selectedNodeId - ? `${nodeCount} nodes - selected #${this._selectedNodeId}` - : `${nodeCount} nodes - select a node` + ? `${nodeCount} nodes (${this._subgraphDisplayMode}) - selected #${this._selectedNodeId}` + : `${nodeCount} nodes (${this._subgraphDisplayMode}) - select a node` : `${nodeCount} nodes - graph opened in viewer`; - const node = findWorkflowNode(this._workflow, this._selectedNodeId); + const node = findWorkflowNode(this._workflow, this._selectedNodeId, { includeSubgraphs }); if (!node) { const empty = document.createElement("div"); empty.className = "mjr-ws-sidebar-empty"; @@ -228,39 +242,151 @@ export class WorkflowGraphMapPanel { }), ); - const params = document.createElement("div"); - params.className = "mjr-wgm-params"; - for (const [key, value] of getNodeParamEntries(node)) { - const row = document.createElement("div"); - row.className = "mjr-wgm-param"; - row.tabIndex = 0; - row.role = "button"; - row.title = `Copy ${String(key)}`; - const k = document.createElement("span"); - k.className = "mjr-wgm-param-key"; - k.textContent = String(key); - const v = document.createElement("span"); - v.className = "mjr-wgm-param-value"; - v.textContent = _formatValue(value); - row.appendChild(k); - row.appendChild(v); - row.addEventListener("click", () => this._copyParam(row, value)); - row.addEventListener("keydown", (event: any) => { - if (event.key !== "Enter" && event.key !== " ") return; - event.preventDefault?.(); - this._copyParam(row, value); - }); - params.appendChild(row); - } + const visual = this._buildNodeVisual(node); - if (!params.childElementCount) { + _replaceChildren(this._details, title, meta, visual, actions); + } + + _makeModeButton(label: any, mode: "expand" | "host") { + const button = document.createElement("button"); + button.type = "button"; + button.className = "mjr-wgm-mode"; + button.textContent = String(label); + button.addEventListener("click", () => this._setSubgraphDisplayMode(mode)); + this._modeButtons.set(mode, button); + return button; + } + + _setSubgraphDisplayMode(mode: "expand" | "host") { + if (mode !== "expand" && mode !== "host") return; + if (this._subgraphDisplayMode === mode) return; + this._subgraphDisplayMode = mode; + if (mode === "host" && String(this._selectedNodeId || "").includes("::")) { + this._selectedNodeId = ""; + } + this._syncModeButtons(); + this.refresh(); + } + + _syncModeButtons() { + for (const [mode, button] of this._modeButtons.entries()) { + button.classList.toggle("is-active", mode === this._subgraphDisplayMode); + } + } + + _buildNodeVisual(node: any) { + const card = document.createElement("section"); + card.className = "mjr-wgm-node-visual"; + card.classList.add(`is-${_getNodeVisualCategory(node)}`); + + const header = document.createElement("div"); + header.className = "mjr-wgm-node-visual-header"; + const nodeType = document.createElement("span"); + nodeType.className = "mjr-wgm-node-visual-type"; + nodeType.textContent = getNodeTypeLabel(node) || getNodeType(node) || "Node"; + const nodeId = document.createElement("span"); + nodeId.className = "mjr-wgm-node-visual-id"; + nodeId.textContent = `#${String(node?.id ?? this._selectedNodeId ?? "")}`; + header.append(nodeType, nodeId); + + const portsWrap = document.createElement("div"); + portsWrap.className = "mjr-wgm-node-ports"; + const inputsCol = this._buildPortColumn("Inputs", node?.inputs, "in"); + const outputsCol = this._buildPortColumn("Outputs", node?.outputs, "out"); + portsWrap.append(inputsCol, outputsCol); + + const widgets = document.createElement("div"); + widgets.className = "mjr-wgm-node-widgets"; + const widgetsTitle = document.createElement("div"); + widgetsTitle.className = "mjr-wgm-node-widgets-title"; + widgetsTitle.textContent = "Widgets"; + widgets.appendChild(widgetsTitle); + const widgetEntries = _normalizeWidgetEntries(node); + if (!widgetEntries.length) { const empty = document.createElement("div"); - empty.className = "mjr-ws-node-empty"; - empty.textContent = "No simple parameters found"; - params.appendChild(empty); + empty.className = "mjr-wgm-node-widget-empty"; + empty.textContent = "No widget values"; + widgets.appendChild(empty); + } else { + for (const entry of widgetEntries.slice(0, 12)) { + const row = document.createElement("div"); + row.className = "mjr-wgm-node-widget"; + row.tabIndex = 0; + row.role = "button"; + const widgetLabel = String(entry?.label || entry?.key || "value"); + row.title = `Copy ${widgetLabel}`; + const key = document.createElement("span"); + key.className = "mjr-wgm-node-widget-key"; + key.textContent = widgetLabel; + const value = document.createElement("span"); + value.className = "mjr-wgm-node-widget-value"; + const displayValue = _formatWidgetValue(entry?.value); + value.textContent = displayValue; + if (_isMultilineWidgetValue(entry?.value, displayValue)) { + row.classList.add("is-multiline"); + } + if (_isExpandedTextWidgetLabel(widgetLabel)) { + row.classList.add("is-text-field"); + } + row.append(key, value); + row.addEventListener("click", () => this._copyParam(row, entry?.value)); + row.addEventListener("keydown", (event: any) => { + if (event.key !== "Enter" && event.key !== " ") return; + event.preventDefault?.(); + this._copyParam(row, entry?.value); + }); + widgets.appendChild(row); + } + if (widgetEntries.length > 12) { + const more = document.createElement("div"); + more.className = "mjr-wgm-node-widget-more"; + more.textContent = `+${widgetEntries.length - 12} more values`; + widgets.appendChild(more); + } } - _replaceChildren(this._details, title, meta, actions, params); + card.append(header, portsWrap, widgets); + return card; + } + + _buildPortColumn(title: any, ports: any, direction: "in" | "out") { + const col = document.createElement("div"); + col.className = "mjr-wgm-node-ports-col"; + const titleEl = document.createElement("div"); + titleEl.className = "mjr-wgm-node-ports-title"; + titleEl.textContent = String(title); + col.appendChild(titleEl); + + const list = document.createElement("div"); + list.className = "mjr-wgm-node-ports-list"; + const items = _normalizePorts(ports).slice(0, 8); + if (!items.length) { + const empty = document.createElement("div"); + empty.className = "mjr-wgm-node-port-empty"; + empty.textContent = "-"; + list.appendChild(empty); + } else { + for (const item of items) { + const row = document.createElement("div"); + row.className = "mjr-wgm-node-port"; + const dot = document.createElement("span"); + dot.className = `mjr-wgm-node-port-dot is-${direction}`; + const name = document.createElement("span"); + name.className = "mjr-wgm-node-port-name"; + const info = _formatPortInfo(item); + name.textContent = info.label; + row.append(dot, name); + if (info.type) { + const type = document.createElement("span"); + type.className = "mjr-wgm-node-port-type"; + type.textContent = info.type; + row.appendChild(type); + } + list.appendChild(row); + } + } + col.appendChild(list); + return col; } _makeAction(label: any, iconClass: any, action: any) { @@ -478,6 +604,89 @@ function _formatValue(value: any) { } } +function _formatWidgetValue(value: any) { + if (value == null) return ""; + if (typeof value === "string") return value.replace(/\r\n?/g, "\n").trim(); + return _formatValue(value); +} + +function _isMultilineWidgetValue(rawValue: any, displayValue: any) { + if (typeof rawValue !== "string") return false; + const text = String(displayValue || ""); + return text.includes("\n") || text.length > 120; +} + +function _isExpandedTextWidgetLabel(label: any) { + const normalized = String(label || "") + .toLowerCase() + .replace(/[^a-z0-9]/g, ""); + if (!normalized) return false; + return ( + normalized === "text" || + normalized === "prompt" || + normalized === "positive" || + normalized === "negative" || + normalized === "string" || + normalized === "caption" + ); +} + +function _normalizePorts(ports: any) { + if (!Array.isArray(ports)) return []; + return ports.filter(Boolean).map((port: any) => ({ + name: String(port?.name || port?.label || "").trim(), + type: String(port?.type || port?.slot_type || port?.data_type || "").trim(), + })); +} + +function _formatPortInfo(item: any) { + const label = String(item?.name || item?.label || item?.type || "port").trim() || "port"; + const type = String(item?.type || "").trim(); + const normalizedLabel = _normalizePortToken(label); + const normalizedType = _normalizePortToken(type); + const hasDistinctType = Boolean(normalizedType) && normalizedType !== normalizedLabel; + return { + label, + type: hasDistinctType ? type : "", + }; +} + +function _normalizePortToken(value: any) { + return String(value || "") + .toLowerCase() + .replace(/[^a-z0-9]/g, ""); +} + +function _normalizeWidgetEntries(node: any): Array<{ label: any; key?: any; value: any }> { + const fromWidgets = getNodeWidgetValueEntries(node); + if (Array.isArray(fromWidgets) && fromWidgets.length) { + return fromWidgets.map((entry: any) => ({ + label: entry?.label, + key: entry?.key, + value: entry?.value, + })); + } + const fromParams = getNodeParamEntries(node); + const entries = Array.isArray(fromParams) + ? fromParams.map(([label, value]: any) => ({ label, value })) + : []; + return entries.slice(0, 160); +} + +function _getNodeVisualCategory(node: any) { + const type = String(getNodeType(node) || "").toLowerCase(); + const label = String(getNodeTypeLabel(node) || "").toLowerCase(); + const text = `${type} ${label}`; + if (!text.trim()) return "generic"; + if (/ksampler|sampler|scheduler|cfg|steps|noise|seed/.test(text)) return "sampler"; + if (/checkpoint|clip|vae|unet|lora|model|loader/.test(text)) return "model"; + if (/text|prompt|token|encode|decoder|caption|florence/.test(text)) return "text"; + if (/latent|image|mask|video|audio|preview|save|load|upscale/.test(text)) return "media"; + if (/controlnet|conditioning|guidance|adapter|ipadapter/.test(text)) return "control"; + if (/math|logic|switch|merge|concat|combine|route|branch|reroute/.test(text)) return "logic"; + return "generic"; +} + function _normalizePreviewAsset(asset: any) { if (!asset || typeof asset !== "object") return asset; const candidates = Array.isArray(asset.previewCandidates) ? asset.previewCandidates : []; diff --git a/ui/features/viewer/workflowGraphMap/workflowGraphMapActions.ts b/ui/features/viewer/workflowGraphMap/workflowGraphMapActions.ts index 3e67198c..e5b91407 100644 --- a/ui/features/viewer/workflowGraphMap/workflowGraphMapActions.ts +++ b/ui/features/viewer/workflowGraphMap/workflowGraphMapActions.ts @@ -1,4 +1,10 @@ -import { getRawHostApp } from "../../../app/hostAdapter.js"; +import { + addNodeToHostGraph, + getFirstSelectedHostCanvasNode, + getHostGraph, + importWorkflowIntoHostCanvas, + refreshHostCanvasGraph, +} from "../../../app/hostAdapter.js"; import { copyTextToClipboard } from "../../../utils/dom.js"; import { writeWidgetValue } from "../workflowSidebar/widgetAdapters.js"; import { @@ -38,28 +44,11 @@ export function formatParamClipboardValue(value: any): string { } export function importWorkflowToCanvas(workflow: any): boolean { - const app = getRawHostApp(); - if (!workflow || typeof workflow !== "object") return false; - if (typeof app?.loadGraphData === "function") { - app.loadGraphData(workflow); - return true; - } - if (typeof app?.canvas?.graph?.configure === "function") { - app.canvas.graph.configure(workflow); - app.canvas.graph.setDirtyCanvas?.(true, true); - return true; - } - if (typeof app?.graph?.configure === "function") { - app.graph.configure(workflow); - app.graph.setDirtyCanvas?.(true, true); - return true; - } - return false; + return importWorkflowIntoHostCanvas(workflow); } export function importNodeToCurrentGraph(node: LooseRecord | null | undefined): boolean { - const app = getRawHostApp(); - const graph = app?.graph ?? app?.canvas?.graph ?? null; + const graph = getHostGraph(); if (!node || !graph || typeof graph.add !== "function") return false; const nodeType = String(node?.type || node?.class_type || node?.comfyClass || "").trim(); @@ -91,10 +80,7 @@ export function importNodeToCurrentGraph(node: LooseRecord | null | undefined): } else { Object.assign(created, clone); } - graph.add(created); - graph.setDirtyCanvas?.(true, true); - app?.canvas?.setDirty?.(true, true); - return true; + return addNodeToHostGraph(created); } catch (e: any) { console.debug?.("[MFV Graph Map] import node failed", e); return false; @@ -104,8 +90,7 @@ export function importNodeToCurrentGraph(node: LooseRecord | null | undefined): export function transferNodeParamsToSelectedCanvasNode( sourceNode: LooseRecord | null | undefined, ): TransferResult { - const app = getRawHostApp(); - const targetNode = getSingleSelectedCanvasNode(app); + const targetNode = getSingleSelectedCanvasNode(); if (!sourceNode || !targetNode) return { ok: false, count: 0, reason: "no-target" }; const sourceEntries = getNodeWidgetValueEntries(sourceNode); @@ -141,10 +126,7 @@ export function transferNodeParamsToSelectedCanvasNode( } } - app?.canvas?.setDirty?.(true, true); - app?.canvas?.draw?.(true, true); - app?.graph?.setDirtyCanvas?.(true, true); - app?.graph?.change?.(); + refreshHostCanvasGraph(); return { ok: count > 0, @@ -154,13 +136,8 @@ export function transferNodeParamsToSelectedCanvasNode( }; } -export function getSingleSelectedCanvasNode(app: any = getRawHostApp()): LooseRecord | null { - const selected = app?.canvas?.selected_nodes ?? app?.canvas?.selectedNodes ?? null; - if (!selected) return null; - if (Array.isArray(selected)) return selected.filter(Boolean)[0] || null; - if (selected instanceof Map) return Array.from(selected.values()).filter(Boolean)[0] || null; - if (typeof selected === "object") return Object.values(selected).filter(Boolean)[0] || null; - return null; +export function getSingleSelectedCanvasNode(): LooseRecord | null { + return (getFirstSelectedHostCanvasNode() as LooseRecord | null) || null; } function _widgetKeys(widget: WidgetRecord): string[] { diff --git a/ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts b/ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts index 615a35d3..84ec473f 100644 --- a/ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts +++ b/ui/features/viewer/workflowGraphMap/workflowGraphMapData.ts @@ -1,7 +1,7 @@ import { synthesizeWorkflowFromPromptGraph, } from "../../../components/sidebar/utils/minimap.js"; -import { fetchComfyApi } from "../../../app/comfyApiBridge.js"; +import { fetchHostApi } from "../../../app/hostAdapter.js"; import { getWorkflowNodeDisplayName, getWorkflowNodeRawType, @@ -24,7 +24,7 @@ export async function ensureWorkflowObjectInfo(workflow: any): Promise if (!missing.length) return; try { if (!OBJECT_INFO_ALL_PROMISE) { - OBJECT_INFO_ALL_PROMISE = fetchComfyApi("/object_info") + OBJECT_INFO_ALL_PROMISE = fetchHostApi("/object_info") .then((res: any) => (res?.ok ? res.json() : null)) .then((data: any) => { if (data && typeof data === "object") { @@ -55,26 +55,33 @@ export function resolveAssetWorkflow(asset: any): any { return null; } -export function getWorkflowNodes(workflow: any): unknown[] { +export function getWorkflowNodes(workflow: any, options: any = null): unknown[] { + const includeSubgraphs = options?.includeSubgraphs !== false; const nodes = Array.isArray(workflow?.nodes) ? workflow.nodes.filter(Boolean) : []; + if (!includeSubgraphs) return nodes; const out = [...nodes]; const definitions = _getSubgraphDefinitions(workflow); for (const node of nodes) { const subgraph = _getNodeSubgraph(workflow, node, definitions); - if (subgraph) out.push(...getWorkflowNodes(subgraph)); + if (!subgraph) continue; + out.push(...getWorkflowNodes(subgraph, options)); } return out; } -export function findWorkflowNode(workflow: any, nodeId: any): any { +export function findWorkflowNode(workflow: any, nodeId: any, options: any = null): any { + const includeSubgraphs = options?.includeSubgraphs !== false; const wanted = String(nodeId ?? ""); if (!wanted) return null; + if (!includeSubgraphs) { + return ( + (Array.isArray(workflow?.nodes) ? workflow.nodes : []).find( + (node: any) => String(node?.id ?? node?.ID ?? "") === wanted, + ) || null + ); + } if (wanted.includes("::")) { - const [parentId, ...rest] = wanted.split("::"); - const childId = rest.join("::"); - const parent = findWorkflowNode(workflow, parentId); - const subgraph = parent ? _getNodeSubgraph(workflow, parent, _getSubgraphDefinitions(workflow)) : null; - return subgraph ? findWorkflowNode(subgraph, childId) : null; + return _findWorkflowNodeByPath(workflow, wanted.split("::").filter(Boolean)); } const direct = (Array.isArray(workflow?.nodes) ? workflow.nodes : []).find( @@ -145,10 +152,10 @@ function _getNodeValueParamEntries(node: any) { export function getNodeWidgetValueEntries(node: any) { const widgetsValuesRaw = node?.widgets_values; - if (widgetsValuesRaw && typeof widgetsValuesRaw === "object" && !Array.isArray(widgetsValuesRaw)) { + if (_isPlainObjectWidgetsMap(widgetsValuesRaw)) { return Object.entries(widgetsValuesRaw).map(([label, value], index) => ({ label, value, index })); } - const widgetsValues = Array.isArray(widgetsValuesRaw) ? widgetsValuesRaw : []; + const widgetsValues = _coerceWidgetValuesArray(widgetsValuesRaw); const widgets = Array.isArray(node?.widgets) ? node.widgets : []; const objectInfo = getNodeObjectInfo(node); const objectInputNames = getObjectInfoWidgetInputNames(objectInfo); @@ -156,16 +163,43 @@ export function getNodeWidgetValueEntries(node: any) { return widgetsValues.map((value, index) => { const guessedLabel = _guessWidgetLabel(node, index, value); const label = - widgets[index]?.name || - widgets[index]?.label || objectInputNames[index] || inputSlotNames[index] || + widgets[index]?.name || + widgets[index]?.label || guessedLabel || `param ${index + 1}`; return { label, value, index }; }); } +function _isPlainObjectWidgetsMap(widgetsValuesRaw: any) { + return Boolean( + widgetsValuesRaw && + typeof widgetsValuesRaw === "object" && + !Array.isArray(widgetsValuesRaw) && + !_looksArrayLikeWidgetsValues(widgetsValuesRaw), + ); +} + +function _coerceWidgetValuesArray(widgetsValuesRaw: any) { + if (Array.isArray(widgetsValuesRaw)) return widgetsValuesRaw; + if (!_looksArrayLikeWidgetsValues(widgetsValuesRaw)) return []; + const length = Math.max(0, Math.floor(Number(widgetsValuesRaw.length) || 0)); + const out = []; + for (let index = 0; index < length; index += 1) { + out.push(widgetsValuesRaw[index]); + } + return out; +} + +function _looksArrayLikeWidgetsValues(widgetsValuesRaw: any) { + if (!widgetsValuesRaw || typeof widgetsValuesRaw !== "object" || Array.isArray(widgetsValuesRaw)) return false; + const length = Number(widgetsValuesRaw.length); + if (!Number.isFinite(length) || length < 0) return false; + return true; +} + export function getNodeInputSlotNames(node: any) { const inputs = Array.isArray(node?.inputs) ? node.inputs : []; const widgetInputs = inputs.filter(_inputLooksLikeWidget); @@ -599,3 +633,22 @@ function _getNodeSubgraph(workflow: any, node: any, definitions = _getSubgraphDe if (Array.isArray(node?.nodes)) return { nodes: node.nodes }; return null; } + +function _findWorkflowNodeByPath(workflow: any, idPath: any[]) { + let cursorGraph = workflow; + let resolvedNode = null; + for (let index = 0; index < idPath.length; index += 1) { + const idPart = String(idPath[index] ?? "").trim(); + if (!idPart) return null; + resolvedNode = + (Array.isArray(cursorGraph?.nodes) ? cursorGraph.nodes : []).find( + (node: any) => String(node?.id ?? node?.ID ?? "") === idPart, + ) || null; + if (!resolvedNode) return null; + if (index >= idPath.length - 1) break; + const subgraph = _getNodeSubgraph(cursorGraph, resolvedNode, _getSubgraphDefinitions(cursorGraph)); + if (!subgraph) return null; + cursorGraph = subgraph; + } + return resolvedNode; +} diff --git a/ui/features/viewer/workflowSidebar/NodeWidgetRenderer.ts b/ui/features/viewer/workflowSidebar/NodeWidgetRenderer.ts index 137fc5fd..d9c9f53f 100644 --- a/ui/features/viewer/workflowSidebar/NodeWidgetRenderer.ts +++ b/ui/features/viewer/workflowSidebar/NodeWidgetRenderer.ts @@ -3,7 +3,7 @@ * as an editable HTML section. */ -import { getRawHostApp } from "../../../app/hostAdapter.js"; +import { focusHostCanvasNode, notifyHostNodeGraphChanged } from "../../../app/hostAdapter.js"; import { createWidgetInput } from "./widgetAdapters.js"; type LooseRecord = Record; @@ -319,16 +319,7 @@ export class NodeWidgetRenderer { } autoFit(); try { - const app = getRawHostApp(); - const canvas = app?.canvas ?? null; - canvas?.setDirty?.(true, true); - canvas?.draw?.(true, true); - const nodeGraph = node?.graph ?? null; - if (nodeGraph && nodeGraph !== app?.graph) { - nodeGraph.setDirtyCanvas?.(true, true); - nodeGraph.change?.(); - } - app?.graph?.change?.(); + notifyHostNodeGraphChanged(node); } catch (_: any) {} }); (textarea as AutoFitElement)._mjrAutoFit = autoFit; @@ -423,18 +414,7 @@ export class NodeWidgetRenderer { const node = this._node; if (!node) return; try { - const app = getRawHostApp(); - const canvas = app?.canvas; - if (!canvas) return; - if (typeof canvas.centerOnNode === "function") { - canvas.centerOnNode(node); - } else if (canvas.ds && node.pos) { - const cw = canvas.canvas?.width || canvas.element?.width || 800; - const ch = canvas.canvas?.height || canvas.element?.height || 600; - canvas.ds.offset[0] = -node.pos[0] - (node.size?.[0] || 0) / 2 + cw / 2; - canvas.ds.offset[1] = -node.pos[1] - (node.size?.[1] || 0) / 2 + ch / 2; - canvas.setDirty?.(true, true); - } + focusHostCanvasNode(node, { select: false, focusCanvas: false }); } catch (e: any) { console.debug?.("[MFV sidebar] locateNode error", e); } diff --git a/ui/features/viewer/workflowSidebar/WorkflowNodesTab.ts b/ui/features/viewer/workflowSidebar/WorkflowNodesTab.ts index f6c8c920..a85908f2 100644 --- a/ui/features/viewer/workflowSidebar/WorkflowNodesTab.ts +++ b/ui/features/viewer/workflowSidebar/WorkflowNodesTab.ts @@ -9,7 +9,7 @@ * value sync runs every frame without touching the DOM structure. */ -import { getRawHostApp } from "../../../app/hostAdapter.js"; +import { focusHostCanvasNode, getSelectedHostCanvasNodeIds } from "../../../app/hostAdapter.js"; import { getGraphNodes, getHostRootGraph, getNodeSubgraphs } from "../../../app/graphTraversal.js"; import { NodeWidgetRenderer } from "./NodeWidgetRenderer.js"; @@ -23,8 +23,6 @@ type WorkflowTreeItemElement = HTMLDivElement & { _mjrChildCount?: number; }; -const getComfyApp = () => getRawHostApp(); - export class WorkflowNodesTab { [key: string]: any; _searchQuery: string; @@ -283,8 +281,7 @@ export class WorkflowNodesTab { function _getGraph() { try { - const app = getComfyApp(); - return getHostRootGraph(app); + return getHostRootGraph(); } catch { return null; } @@ -358,27 +355,7 @@ function _setChildrenToggleLabel(btn: any, count: any, isOpen: any) { function _focusNode(node: any) { try { - const app = getComfyApp(); - const canvas = app?.canvas; - if (!canvas) return; - - canvas.selectNode?.(node, false); - - if (typeof canvas.centerOnNode === "function") { - canvas.centerOnNode(node); - } else if (node.pos && canvas.ds) { - const canvasEl = canvas.canvas; - const w = canvasEl?.width ?? 800; - const h = canvasEl?.height ?? 600; - const scale = canvas.ds.scale ?? 1; - canvas.ds.offset = [ - -node.pos[0] + w / (2 * scale) - (node.size?.[0] ?? 100) / 2, - -node.pos[1] + h / (2 * scale) - (node.size?.[1] ?? 80) / 2, - ]; - canvas.setDirty?.(true, true); - } - - canvas.canvas?.focus?.(); + focusHostCanvasNode(node); } catch (e: any) { console.debug?.("[MFV] _focusNode", e); } @@ -386,21 +363,7 @@ function _focusNode(node: any) { function _getSelectedNodeIds() { try { - const app = getComfyApp(); - const selected = app?.canvas?.selected_nodes ?? app?.canvas?.selectedNodes ?? null; - if (!selected) return []; - if (Array.isArray(selected)) - return selected.map((node: any) => String(node?.id ?? "")).filter(Boolean); - if (selected instanceof Map) { - return Array.from(selected.values()) - .map((node: any) => String((node as LooseRecord | null)?.id ?? "")) - .filter(Boolean); - } - if (typeof selected === "object") { - return Object.values(selected) - .map((node: any) => String((node as LooseRecord | null)?.id ?? "")) - .filter(Boolean); - } + return getSelectedHostCanvasNodeIds(); } catch (e: any) { console.debug?.("[MFV] _getSelectedNodeIds", e); } diff --git a/ui/features/viewer/workflowSidebar/WorkflowSidebar.ts b/ui/features/viewer/workflowSidebar/WorkflowSidebar.ts index 03a4bf0d..81d2d9fa 100644 --- a/ui/features/viewer/workflowSidebar/WorkflowSidebar.ts +++ b/ui/features/viewer/workflowSidebar/WorkflowSidebar.ts @@ -7,6 +7,7 @@ import { WorkflowNodesTab } from "./WorkflowNodesTab.js"; import { WorkflowGraphMapPanel } from "../workflowGraphMap/WorkflowGraphMapPanel.js"; +import { t } from "../../../app/i18n.js"; const LIVE_SYNC_FALLBACK_MS = 16; const LIVE_SYNC_INTERVAL_MS = 250; @@ -128,13 +129,13 @@ export class WorkflowSidebar { const title = document.createElement("span"); title.className = "mjr-ws-sidebar-title"; - title.textContent = "Nodes"; + title.textContent = t("workflowSidebar.nodes", "Nodes"); header.appendChild(title); const closeBtn = document.createElement("button"); closeBtn.type = "button"; closeBtn.className = "mjr-icon-btn"; - closeBtn.title = "Close sidebar"; + closeBtn.title = t("workflowSidebar.close", "Close sidebar"); closeBtn.innerHTML = ''; closeBtn.addEventListener("click", () => { const wasGraph = this._activeMode === "graph"; @@ -147,8 +148,8 @@ export class WorkflowSidebar { const tabBar = document.createElement("div"); tabBar.className = "mjr-ws-tab-bar"; - this._nodesModeBtn = this._makeModeButton("Nodes", "pi pi-sliders-h", "nodes"); - this._graphModeBtn = this._makeModeButton("Graph Map", "pi pi-sitemap", "graph"); + this._nodesModeBtn = this._makeModeButton(t("workflowSidebar.nodes", "Nodes"), "pi pi-sliders-h", "nodes"); + this._graphModeBtn = this._makeModeButton(t("workflowSidebar.graphMap", "Graph Map"), "pi pi-sitemap", "graph"); tabBar.appendChild(this._nodesModeBtn); tabBar.appendChild(this._graphModeBtn); panel.appendChild(tabBar); diff --git a/ui/features/viewer/workflowSidebar/sidebarRunButton.ts b/ui/features/viewer/workflowSidebar/sidebarRunButton.ts index 3c125e04..c6c7fb15 100644 --- a/ui/features/viewer/workflowSidebar/sidebarRunButton.ts +++ b/ui/features/viewer/workflowSidebar/sidebarRunButton.ts @@ -7,7 +7,7 @@ import { APP_CONFIG } from "../../../app/config.js"; import { getHostRootGraph, walkGraphNodes } from "../../../app/graphTraversal.js"; -import { getRawHostApi, getRawHostApp } from "../../../app/hostAdapter.js"; +import { getRawHostApp, interruptHostExecution, queueHostPrompt, refreshHostCanvasGraph } from "../../../app/hostAdapter.js"; import { t } from "../../../app/i18n.js"; import { ensureFloatingViewerProgressTracking, @@ -162,25 +162,8 @@ export function createRunButton(): { el: HTMLDivElement; dispose: () => void } { } async function stopCurrentGeneration(): Promise { - const app = getRawHostApp(); - // Prefer live app.api for the same auth-context reasons as queueCurrentPrompt. - const liveApi = app?.api && typeof app.api.interrupt === "function" ? app.api : null; - const api = liveApi ?? getRawHostApi(app); - - if (api && typeof api.interrupt === "function") { - await api.interrupt(); - return { tracked: true }; - } - - if (api && typeof api.fetchApi === "function") { - const resp = await api.fetchApi("/interrupt", { method: "POST" }); - if (!resp?.ok) throw new Error(`POST /interrupt failed (${resp?.status})`); - return { tracked: true }; - } - - const resp = await fetch("/interrupt", { method: "POST", credentials: "include" }); - if (!resp.ok) throw new Error(`POST /interrupt failed (${resp.status})`); - return { tracked: false }; + const tracked = await interruptHostExecution(getRawHostApp()); + return { tracked }; } async function handleClick(): Promise { @@ -300,87 +283,6 @@ export function buildPromptRequestBody( return body; } -function resolveClientId(api: LooseRecord | null | undefined, app: LooseRecord | null | undefined): string { - const candidates = [ - api?.clientId, - api?.clientID, - api?.client_id, - app?.clientId, - app?.clientID, - app?.client_id, - ]; - for (const value of candidates) { - const safe = String(value || "").trim(); - if (safe) return safe; - } - return ""; -} - -/** - * Walk all nodes in a ComfyUI graph recursively, including inner nodes of any - * subgraphs, and invoke callback(node) for each. This mirrors the graph-walk - * ComfyUI's native queuePrompt performs before/after serialising the prompt. - */ -function _walkAllNodes( - graph: any, - callback: (node: LooseRecord) => void, -): void { - walkGraphNodes(graph, ({ node }) => { - callback(node); - }); -} - -function _cloneQueuedWidgetValue(value: T): T { - if (value == null || typeof value !== "object") return value; - try { - return typeof structuredClone === "function" - ? structuredClone(value) - : JSON.parse(JSON.stringify(value)); - } catch { - return value; - } -} - -function _captureQueuedWidgetSnapshots(graph: any): WidgetSnapshot[] { - const snapshots: WidgetSnapshot[] = []; - _walkAllNodes(graph, (node: any) => { - for (const widget of node.widgets ?? []) { - snapshots.push({ - widget, - value: _cloneQueuedWidgetValue(widget?.value), - }); - } - }); - return snapshots; -} - -function _restoreQueuedWidgetSnapshots( - app: LooseRecord | null | undefined, - snapshots: WidgetSnapshot[] | null, -): void { - for (const entry of Array.isArray(snapshots) ? snapshots : []) { - const widget = entry?.widget; - if (!widget || typeof widget !== "object") continue; - const restoredValue = _cloneQueuedWidgetValue(entry?.value); - try { - widget.value = restoredValue; - } catch (e: any) { - console.debug?.(e); - continue; - } - try { - widget.callback?.(restoredValue); - } catch (e: any) { - console.debug?.(e); - } - } - try { - app?.canvas?.draw?.(true, true); - } catch (e: any) { - console.debug?.(e); - } -} - function _nodeLooksLikeApiNode(node: LooseRecord): boolean { const nodeCtor = node?.constructor as LooseRecord | undefined; const candidates = [node?.type, node?.comfyClass, node?.class_type, nodeCtor?.type]; @@ -389,7 +291,7 @@ function _nodeLooksLikeApiNode(node: LooseRecord): boolean { export function graphContainsApiNode(graph: any): boolean { let found = false; - _walkAllNodes(graph, (node: any) => { + walkGraphNodes(graph, ({ node }) => { if (found) return; found = _nodeLooksLikeApiNode(node); }); @@ -417,91 +319,23 @@ async function queueCurrentPrompt(): Promise { const app = getRawHostApp(); if (!app) throw new Error("ComfyUI app not available"); - // Resolve API references early so we can choose the path before touching - // widget state (beforeQueued must not be called twice for the same run). - const liveApi = app?.api && typeof app.api.queuePrompt === "function" ? app.api : null; - const api = liveApi ?? getRawHostApi(app); - const hasApiPath = Boolean( - (api && typeof api.queuePrompt === "function") || - (api && typeof api.fetchApi === "function"), - ); - const rootGraph = getHostRootGraph(app); const mustUseNativeQueue = graphContainsApiNode(rootGraph); - // Path 4: delegate entirely to app.queuePrompt which handles beforeQueued, - // graphToPrompt, afterQueued, and auth internally. API Node workflows need - // this because ComfyUI injects auth_token_comfy_org during native queueing. - if ((mustUseNativeQueue || !hasApiPath) && typeof app.queuePrompt === "function") { - await app.queuePrompt(0); - return { tracked: true }; - } - - let widgetSnapshots: WidgetSnapshot[] | null = null; - - // Paths 1-3 and 5: mirror ComfyUI's native beforeQueued cycle. - // ComfyUI's queuePrompt walks ALL nodes (including inner subgraph nodes) and - // calls widget.beforeQueued() before serialising the graph. This is what - // triggers control_after_generate (randomize / increment / decrement) to - // update the seed widget value before graphToPrompt reads it. - try { - widgetSnapshots = _captureQueuedWidgetSnapshots(rootGraph); - _walkAllNodes(rootGraph, (node: any) => { - for (const w of node.widgets ?? []) { - w.beforeQueued?.({ isPartialExecution: false }); - } - }); - - const promptData = - typeof app.graphToPrompt === "function" ? await app.graphToPrompt() : null; - if (!promptData?.output) throw new Error("graphToPrompt returned empty output"); - - let result; - - if (api && typeof api.queuePrompt === "function") { - // Prefer the live app.api reference - matches the native Queue button's - // auth context and avoids stale cached references after session renewal. - await api.queuePrompt(0, enrichPromptDataForMfv(promptData)); - result = { tracked: true }; - } else if (api && typeof api.fetchApi === "function") { - const resp = await api.fetchApi("/prompt", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify( - buildPromptRequestBody(promptData, { - clientId: resolveClientId(api, app), - }), - ), - }); - if (!resp?.ok) throw new Error(`POST /prompt failed (${resp?.status})`); - result = { tracked: true }; - } else { - const resp = await fetch("/prompt", { - method: "POST", - credentials: "include", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify( - buildPromptRequestBody(promptData, { - clientId: resolveClientId(null, app), - }), - ), - }); - if (!resp.ok) throw new Error(`POST /prompt failed (${resp.status})`); - result = { tracked: false }; - } - - // Mirror ComfyUI's afterQueued cycle and redraw the canvas so that widget - // displays (e.g. the new seed value) reflect the post-queue state immediately. - _walkAllNodes(rootGraph, (node: any) => { - for (const w of node.widgets ?? []) { - w.afterQueued?.({ isPartialExecution: false }); - } - }); - app.canvas?.draw?.(true, true); - - return result; - } catch (error: any) { - _restoreQueuedWidgetSnapshots(app, widgetSnapshots); - throw error; - } + const tracked = await queueHostPrompt({ + app, + forceNativeQueue: mustUseNativeQueue, + resolvePromptData(runtimeApp: any) { + return typeof runtimeApp?.graphToPrompt === "function" + ? runtimeApp.graphToPrompt() + : null; + }, + enrichPromptData(promptData: any) { + return enrichPromptDataForMfv(promptData); + }, + buildPromptRequestBody(promptData: any, context: { clientId: string }) { + return buildPromptRequestBody(promptData, { clientId: context.clientId }); + }, + }); + return { tracked }; } diff --git a/ui/features/viewer/workflowSidebar/widgetAdapters.ts b/ui/features/viewer/workflowSidebar/widgetAdapters.ts index e21a000d..36946b89 100644 --- a/ui/features/viewer/workflowSidebar/widgetAdapters.ts +++ b/ui/features/viewer/workflowSidebar/widgetAdapters.ts @@ -5,7 +5,7 @@ * No module state — every function is stateless. */ -import { getRawHostApp } from "../../../app/hostAdapter.js"; +import { getHostCanvas, notifyHostNodeGraphChanged } from "../../../app/hostAdapter.js"; type LooseRecord = Record; type WidgetRecord = LooseRecord; @@ -83,8 +83,7 @@ export function writeWidgetValue( // Called AFTER the callback so it reflects the final snapped/clamped value. try { - const app = getRawHostApp(); - const canvas = app?.canvas ?? null; + const canvas = getHostCanvas(); const resolvedNode = node ?? widget?.parent ?? null; // Save value before callback: LiteGraph number callbacks snap widget.value to // multiples of step2 (e.g. 1025 → 1024 for step2=16). We restore afterwards so @@ -97,17 +96,7 @@ export function writeWidgetValue( widget.value = savedValue; } _syncWidgetDomElement(widget); - canvas?.setDirty?.(true, true); - canvas?.draw?.(true, true); - // Notify the node's own graph (may be an inner subgraph graph, different from root). - const nodeGraph = resolvedNode?.graph ?? null; - if (nodeGraph && nodeGraph !== app?.graph) { - nodeGraph.setDirtyCanvas?.(true, true); - nodeGraph.change?.(); - } - // Always notify root graph (triggers ComfyUI workflow tracking). - app?.graph?.setDirtyCanvas?.(true, true); - app?.graph?.change?.(); + notifyHostNodeGraphChanged(resolvedNode); } catch (e: any) { console.debug?.("[MFV] writeWidgetValue", e); } diff --git a/ui/integration/comfy_send_to_am.ts b/ui/integration/comfy_send_to_am.ts index 11eb01f2..5f62cdc9 100644 --- a/ui/integration/comfy_send_to_am.ts +++ b/ui/integration/comfy_send_to_am.ts @@ -12,7 +12,12 @@ * a failure here cannot break the asset grid. */ -import { getComfyApp, getComfyApi } from "../app/comfyApiBridge.js"; +import { + activateSidebarTabForApp, + getRawHostApi, + getRawHostApp, + showToast, +} from "../app/hostAdapter.js"; const EXTENSION_ID = "MajoorAssetsManager.SendTo"; const MENU_LABEL = "Send to Asset Manager"; @@ -31,6 +36,11 @@ const TARGET_NODE_TYPES = new Set([ "SaveAudio", ]); +function isTargetNode(node: any) { + const name = String(node?.comfyClass || node?.type || "").trim(); + return TARGET_NODE_TYPES.has(name); +} + /** * Resolve the most recent output filenames produced by this node from its * last execution payload (stored on the node by ComfyUI core when results @@ -90,19 +100,24 @@ function collectOutputDescriptors(node: any) { } async function sendDescriptorsToAssetManager(descriptors: any) { - const app = getComfyApp(); - const api = getComfyApi(app); + const app = getRawHostApp(); + const api = getRawHostApi(app); if (!descriptors.length) { - try { - app?.extensionManager?.toast?.add?.({ - severity: "warn", - summary: "Majoor Assets Manager", - detail: "No output to send (run the node first).", - life: 3500, - }); - } catch { - /* ignore */ - } + showToast({ + severity: "warn", + summary: "Majoor Assets Manager", + detail: "No output to send (run the node first).", + life: 3500, + }); + return; + } + if (!api || typeof api.fetchApi !== "function") { + showToast({ + severity: "error", + summary: "Majoor Assets Manager", + detail: "ComfyUI API unavailable.", + life: 4000, + }); return; } try { @@ -117,19 +132,15 @@ async function sendDescriptorsToAssetManager(descriptors: any) { // Even when the backend endpoint isn't wired yet (404), opening the // sidebar tab gives the user the asset grid where freshly indexed // files appear within a couple seconds. - try { - app?.extensionManager?.sidebarTab?.toggleSidebarTab?.("majoor-assets"); - } catch { - /* sidebar API not available */ - } - app?.extensionManager?.toast?.add?.({ + activateSidebarTabForApp(app, "majoor-assets"); + showToast({ severity: "success", summary: "Majoor Assets Manager", detail: `Sent ${descriptors.length} item(s) to the asset grid.`, life: 2500, }); } catch (err: any) { - app?.extensionManager?.toast?.add?.({ + showToast({ severity: "error", summary: "Majoor Assets Manager", detail: `Failed to send: ${err?.message || err}`, @@ -139,7 +150,7 @@ async function sendDescriptorsToAssetManager(descriptors: any) { } function registerSendToMenu() { - const app = getComfyApp(); + const app = getRawHostApp(); if (!app || typeof app.registerExtension !== "function") { // ComfyUI not ready yet — retry shortly. The main bundle is loaded // before app.js is exposed on globalThis in some Vite builds. @@ -148,33 +159,22 @@ function registerSendToMenu() { } app.registerExtension({ name: EXTENSION_ID, - async beforeRegisterNodeDef(nodeType: any, nodeData: any) { + getNodeMenuItems(node: any) { try { - const name = String(nodeData?.name || ""); - if (!TARGET_NODE_TYPES.has(name)) { - return; + if (!isTargetNode(node)) { + return []; } - const prevGetMenu = nodeType.prototype.getExtraMenuOptions; - nodeType.prototype.getExtraMenuOptions = function (canvas: any, options: any) { - // Preserve any options injected by other extensions. - if (typeof prevGetMenu === "function") { - try { - prevGetMenu.apply(this, arguments); - } catch { - /* upstream menu hook should never break ours */ - } - } - const self = this; - options.push({ + return [ + { content: MENU_LABEL, callback: () => { - const descriptors = collectOutputDescriptors(self); + const descriptors = collectOutputDescriptors(node); void sendDescriptorsToAssetManager(descriptors); }, - }); - }; + }, + ]; } catch { - /* extension must not crash node registration */ + return []; } }, }); diff --git a/ui/stores/usePanelStore.ts b/ui/stores/usePanelStore.ts index 8122f6ac..fdd0b6e2 100644 --- a/ui/stores/usePanelStore.ts +++ b/ui/stores/usePanelStore.ts @@ -37,6 +37,7 @@ interface PanelState { maxWidth: number; maxHeight: number; workflowType: string; + workflowId: string; sort: string; searchQuery: string; scrollTop: number; @@ -124,6 +125,7 @@ function sanitize(raw: any): StoredPanelState { maxWidth: clampInt(row.maxWidth), maxHeight: clampInt(row.maxHeight), workflowType: toStr(row.workflowType), + workflowId: toStr(row.workflowId || row.workflow_id), sort: toStr(row.sort || "mtime_desc"), searchQuery: toStr(row.searchQuery), scrollTop: clampInt(row.scrollTop), @@ -189,6 +191,7 @@ export const usePanelStore = defineStore("mjr-panel", () => { const maxWidth = ref(saved.maxWidth || 0); const maxHeight = ref(saved.maxHeight || 0); const workflowType = ref(saved.workflowType || ""); + const workflowId = ref(saved.workflowId || ""); const sort = ref(saved.sort || "mtime_desc"); const searchQuery = ref(saved.searchQuery || ""); const scrollTop = ref(saved.scrollTop || 0); @@ -230,6 +233,7 @@ export const usePanelStore = defineStore("mjr-panel", () => { maxWidth: maxWidth.value, maxHeight: maxHeight.value, workflowType: workflowType.value, + workflowId: workflowId.value, sort: sort.value, searchQuery: searchQuery.value, scrollTop: scrollTop.value, @@ -261,6 +265,7 @@ export const usePanelStore = defineStore("mjr-panel", () => { maxWidth, maxHeight, workflowType, + workflowId, sort, searchQuery, scrollTop, @@ -315,6 +320,7 @@ export const usePanelStore = defineStore("mjr-panel", () => { maxWidth.value = 0; maxHeight.value = 0; workflowType.value = ""; + workflowId.value = ""; searchQuery.value = ""; } @@ -397,6 +403,7 @@ export const usePanelStore = defineStore("mjr-panel", () => { maxWidth, maxHeight, workflowType, + workflowId, sort, searchQuery, scrollTop, diff --git a/ui/tests/generation_prompt_sanitization.vitest.ts b/ui/tests/generation_prompt_sanitization.vitest.ts index 52538593..7a38452d 100644 --- a/ui/tests/generation_prompt_sanitization.vitest.ts +++ b/ui/tests/generation_prompt_sanitization.vitest.ts @@ -117,8 +117,8 @@ describe("generation prompt sanitization", () => { ]); expect(state.modelFields).toEqual( expect.arrayContaining([ - { label: "CLIP", value: "umt5_xxl_fp8_e4m3fn_scaled" }, - { label: "VAE", value: "wan_2.1_vae" }, + expect.objectContaining({ label: "CLIP", value: "umt5_xxl_fp8_e4m3fn_scaled" }), + expect.objectContaining({ label: "VAE", value: "wan_2.1_vae" }), ]), ); expect(state.modelFields.find((item) => item.label === "UNet High Noise")).toBeFalsy(); @@ -126,9 +126,9 @@ describe("generation prompt sanitization", () => { expect(state.modelFields.find((item) => item.label === "UNet")).toBeFalsy(); expect(state.samplingFields).toEqual( expect.arrayContaining([ - { label: "Steps", value: 8 }, - { label: "CFG High Noise", value: 1 }, - { label: "CFG Low Noise", value: 1 }, + expect.objectContaining({ label: "Steps", value: 8 }), + expect.objectContaining({ label: "CFG High Noise", value: 1 }), + expect.objectContaining({ label: "CFG Low Noise", value: 1 }), ]), ); expect(state.modelFields.find((item) => item.label === "LoRAs")?.value).toContain( @@ -157,4 +157,148 @@ describe("generation prompt sanitization", () => { ); expect(normalized.model_groups[0].label).toBe("High Noise"); }); + + it("labels ComfyUI native sampler passes from upstream latent nodes", () => { + const state = buildGenerationSectionState({ + id: 101, + kind: "image", + metadata: { + prompt: { + "3": { + class_type: "KSampler", + inputs: { + seed: 1, + steps: 8, + cfg: 1, + sampler_name: "lcm", + scheduler: "simple", + denoise: 1, + latent_image: ["5", 0], + }, + }, + "5": { + class_type: "EmptyLatentImage", + inputs: { width: 512, height: 512, batch_size: 1 }, + }, + "9": { + class_type: "LatentUpscale", + inputs: { samples: ["3", 0], width: 1024, height: 1024 }, + }, + "10": { + class_type: "KSampler", + inputs: { + seed: 2, + steps: 4, + cfg: 1, + sampler_name: "lcm", + scheduler: "simple", + denoise: 0.35, + latent_image: ["9", 0], + }, + }, + }, + }, + }); + + expect(state.pipelineTabs.map((tab) => tab.label)).toEqual([ + "Text-to-Image", + "Upscale", + ]); + }); + + it("extracts sampler custom stages and models from linked ComfyUI nodes", () => { + const state = buildGenerationSectionState({ + id: 102, + kind: "image", + metadata: { + prompt: { + "244": { class_type: "LoadImage", inputs: { image: "source.png" } }, + "95:29": { class_type: "VAELoader", inputs: { vae_name: "FLUX/ae.safetensors" } }, + "95:28": { + class_type: "UNETLoader", + inputs: { unet_name: "Z-IMAGE/TURBO/z_image_turbo_bf16.safetensors" }, + }, + "95:13": { + class_type: "EmptySD3LatentImage", + inputs: { width: 1024, height: 1024 }, + }, + "95:242": { + class_type: "VAEEncode", + inputs: { pixels: ["244", 0], vae: ["95:29", 0] }, + }, + "95:243": { + class_type: "ComfySwitchNode", + inputs: { switch: true, on_false: ["95:13", 0], on_true: ["95:242", 0] }, + }, + "95:11": { + class_type: "ModelSamplingAuraFlow", + inputs: { model: ["95:28", 0] }, + }, + "95:3": { + class_type: "KSampler", + inputs: { + seed: 100, + steps: 8, + cfg: 1, + sampler_name: "res_multistep", + scheduler: "simple", + denoise: 1, + model: ["95:11", 0], + latent_image: ["95:243", 0], + }, + }, + "94:82": { + class_type: "UNETLoader", + inputs: { unet_name: "pid_flux1_1024_to_4096_4step_bf16.safetensors" }, + }, + "94:76": { class_type: "KSamplerSelect", inputs: { sampler_name: "lcm" } }, + "94:77": { + class_type: "BasicScheduler", + inputs: { scheduler: "simple", steps: 4, denoise: 1, model: ["94:82", 0] }, + }, + "94:84": { + class_type: "EmptyChromaRadianceLatentImage", + inputs: { width: 4096, height: 4096 }, + }, + "94:86": { + class_type: "PiDConditioning", + inputs: { latent: ["95:3", 0] }, + }, + "94:75": { + class_type: "SamplerCustom", + inputs: { + noise_seed: 3, + cfg: 1, + model: ["94:82", 0], + positive: ["94:86", 0], + sampler: ["94:76", 0], + sigmas: ["94:77", 0], + latent_image: ["94:84", 0], + }, + }, + }, + }, + }); + + expect(state.pipelineTabs.map((tab) => tab.label)).toEqual(["Image-to-Image", "Upscale"]); + expect(state.pipelineTabs[0].fields).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + label: "Model", + value: "Z-IMAGE/TURBO/z_image_turbo_bf16.safetensors", + }), + expect.objectContaining({ label: "Sampler", value: "res_multistep" }), + ]), + ); + expect(state.pipelineTabs[1].fields).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + label: "Model", + value: "pid_flux1_1024_to_4096_4step_bf16.safetensors", + }), + expect.objectContaining({ label: "Sampler", value: "lcm" }), + expect.objectContaining({ label: "Steps", value: "4" }), + ]), + ); + }); }); diff --git a/ui/tests/host_adapter_contract.vitest.ts b/ui/tests/host_adapter_contract.vitest.ts new file mode 100644 index 00000000..ba6800f5 --- /dev/null +++ b/ui/tests/host_adapter_contract.vitest.ts @@ -0,0 +1,260 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const bridgeState = vi.hoisted(() => { + let comfyApp: any = null; + return { + reset() { + comfyApp = null; + }, + setApp(app: any) { + comfyApp = app; + }, + getApp() { + return comfyApp; + }, + }; +}); + +vi.mock("../app/comfyApiBridge.js", () => ({ + activateBottomPanelTabCompat: vi.fn(() => false), + activateSidebarTabCompat: vi.fn(() => false), + fetchComfyApi: vi.fn(async () => new Response(null, { status: 200 })), + getComfyApi: vi.fn((app?: any) => app?.api || null), + getComfyApp: vi.fn(() => bridgeState.getApp()), + getExtensionDialogApi: vi.fn(() => null), + getExtensionManager: vi.fn(() => null), + getExtensionToastApi: vi.fn(() => null), + getSettingValue: vi.fn(() => null), + getSettingsApi: vi.fn(() => null), + registerBottomPanelTabCompat: vi.fn(() => false), + registerCommandCompat: vi.fn(() => false), + registerKeybindingCompat: vi.fn(() => false), + registerSidebarTabCompat: vi.fn(() => false), + setComfyApp: vi.fn((app: any) => { + bridgeState.setApp(app); + return app; + }), + setSettingValue: vi.fn(() => false), + waitForComfyApi: vi.fn(async () => null), + waitForComfyApp: vi.fn(async () => bridgeState.getApp()), +})); + +describe("hostAdapter contract", () => { + beforeEach(async () => { + vi.resetModules(); + bridgeState.reset(); + }); + + it("observeHostCanvasSelection uses event path and unsubscribes cleanly", async () => { + const mod = await import("../app/hostAdapter.js"); + + const canvasHost = new EventTarget(); + const appHost = new EventTarget(); + const graphHost = new EventTarget(); + const canvasDom = new EventTarget(); + + const app = Object.assign(appHost, { + canvas: Object.assign(canvasHost, { canvas: canvasDom }), + graph: graphHost, + }); + + mod.init(app); + + const onSelectionChange = vi.fn(); + const dispose = mod.observeHostCanvasSelection(onSelectionChange, { + includePointerFallback: true, + }); + + expect(typeof dispose).toBe("function"); + + canvasHost.dispatchEvent(new Event("selectionchange")); + appHost.dispatchEvent(new Event("node-selection-change")); + canvasDom.dispatchEvent(new Event("pointerup")); + + expect(onSelectionChange).toHaveBeenCalledTimes(3); + + dispose?.(); + canvasHost.dispatchEvent(new Event("selectionchange")); + canvasDom.dispatchEvent(new Event("pointerup")); + + expect(onSelectionChange).toHaveBeenCalledTimes(3); + }); + + it("observeHostCanvasSelection falls back to LiteGraph callbacks and restores originals", async () => { + const mod = await import("../app/hostAdapter.js"); + + const originalSelected = vi.fn(); + const originalSelectionChange = vi.fn(); + + const canvasDom = new EventTarget(); + const canvas: any = { + onNodeSelected: originalSelected, + onSelectionChange: originalSelectionChange, + canvas: canvasDom, + }; + const app = { canvas, graph: null }; + mod.init(app); + + const onSelectionChange = vi.fn(); + const dispose = mod.observeHostCanvasSelection(onSelectionChange); + + expect(typeof canvas.onNodeSelected).toBe("function"); + expect(typeof canvas.onSelectionChange).toBe("function"); + expect(typeof canvas.onNodeDeselected).toBe("function"); + + canvas.onNodeSelected({ id: 1 }); + canvas.onSelectionChange({}); + canvas.onNodeDeselected({ id: 1 }); + + expect(originalSelected).toHaveBeenCalledTimes(1); + expect(originalSelectionChange).toHaveBeenCalledTimes(1); + expect(onSelectionChange).toHaveBeenCalledTimes(3); + + dispose?.(); + + expect(canvas.onNodeSelected).toBe(originalSelected); + expect(canvas.onSelectionChange).toBe(originalSelectionChange); + 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"); + + const subgraph = { + setDirtyCanvas: vi.fn(), + change: vi.fn(), + }; + const graph = { + setDirtyCanvas: vi.fn(), + change: vi.fn(), + add: vi.fn(), + }; + const canvas = { + setDirty: vi.fn(), + draw: vi.fn(), + selected_nodes: [{ id: 12 }, { id: 34 }], + }; + const app = { graph, canvas }; + mod.init(app); + + const node = { id: 99, graph: subgraph }; + expect(mod.notifyHostNodeGraphChanged(node, app)).toBe(true); + expect(subgraph.setDirtyCanvas).toHaveBeenCalledWith(true, true); + expect(subgraph.change).toHaveBeenCalled(); + expect(canvas.setDirty).toHaveBeenCalledWith(true, true); + expect(canvas.draw).toHaveBeenCalledWith(true, true); + expect(graph.setDirtyCanvas).toHaveBeenCalledWith(true, true); + expect(graph.change).toHaveBeenCalled(); + + expect(mod.getSelectedHostCanvasNodeIds(app)).toEqual(["12", "34"]); + expect(mod.getFirstSelectedHostCanvasNode(app)).toEqual({ id: 12 }); + + const newNode = { id: 777, graph }; + expect(mod.addNodeToHostGraph(newNode, app)).toBe(true); + expect(graph.add).toHaveBeenCalledWith(newNode); + }); + + it("queues prompt through api.queuePrompt path with widget cycle", async () => { + const mod = await import("../app/hostAdapter.js"); + + const widget = { + value: 10, + beforeQueued: vi.fn(() => { + widget.value = 11; + }), + afterQueued: vi.fn(), + callback: vi.fn(), + }; + const api = { + queuePrompt: vi.fn(async () => ({ prompt_id: "p-1" })), + }; + const app = { + api, + graphToPrompt: vi.fn(async () => ({ output: { 1: { class_type: "KSampler" } } })), + graph: { + _nodes: [{ widgets: [widget] }], + setDirtyCanvas: vi.fn(), + change: vi.fn(), + }, + canvas: { + setDirty: vi.fn(), + draw: vi.fn(), + }, + }; + + mod.init(app); + + const tracked = await mod.queueHostPrompt({ + app, + enrichPromptData: (promptData: any) => ({ ...promptData, extra_data: { preview_method: "taesd" } }), + }); + + expect(tracked).toBe(true); + expect(api.queuePrompt).toHaveBeenCalledTimes(1); + expect(widget.beforeQueued).toHaveBeenCalledTimes(1); + expect(widget.afterQueued).toHaveBeenCalledTimes(1); + expect(app.canvas.draw).toHaveBeenCalledWith(true, true); + }); + + it("centers node by id through host canvas helper", async () => { + const mod = await import("../app/hostAdapter.js"); + + const centered = vi.fn(); + const app = { + graph: { + _nodes: [{ id: 42, pos: [0, 0], size: [100, 80] }], + }, + canvas: { + centerOnNode: centered, + }, + }; + mod.init(app); + + expect(mod.centerHostCanvasNodeById(42, app)).toBe(true); + expect(centered).toHaveBeenCalledTimes(1); + }); +}); diff --git a/ui/tests/panel_primevue_controls.vitest.ts b/ui/tests/panel_primevue_controls.vitest.ts index 1165afba..1be00158 100644 --- a/ui/tests/panel_primevue_controls.vitest.ts +++ b/ui/tests/panel_primevue_controls.vitest.ts @@ -28,6 +28,13 @@ vi.mock("../app/i18n.js", () => ({ t: (key, fallback) => fallback || key, })); +vi.mock("../features/filters/calendar/AgendaCalendar.js", () => ({ + createAgendaCalendar: vi.fn(() => ({ + refresh: vi.fn(), + dispose: vi.fn(), + })), +})); + const MButtonStub = { props: { severity: String, @@ -281,6 +288,72 @@ describe("PrimeVue-backed panel controls", () => { wrapper.unmount(); }); + it("clears the active date range when an exact date is selected", async () => { + panelStore.dateRangeFilter = "today"; + + const mod = await import("../vue/components/panel/FilterPopover.vue"); + const wrapper = mount(mod.default, { + global: { stubs: GLOBAL_STUBS }, + }); + + wrapper.vm.dateExactInput.value = "2026-06-03"; + wrapper.vm.dateExactInput.dispatchEvent(new Event("change", { bubbles: true })); + + expect(panelStore.dateExactFilter).toBe("2026-06-03"); + expect(panelStore.dateRangeFilter).toBe(""); + expect(wrapper.vm.dateRangeSelect.value).toBe(""); + + wrapper.unmount(); + }); + + it("keeps the Vue filter popover open while filter edits debounce a reload", async () => { + vi.useFakeTimers(); + const { setupFiltersInit } = await import("../features/panel/panelFiltersInit.js"); + const popovers = { close: vi.fn() }; + const reloadGrid = vi.fn(async () => {}); + const panelLifecycleAC = new AbortController(); + const input = () => document.createElement("input"); + const select = () => document.createElement("select"); + const agendaContainer = document.createElement("div"); + + const { disposeFilters } = setupFiltersInit({ + state: panelStore, + hasVueHeaderSection: true, + kindSelect: select(), + wfCheckbox: input(), + workflowTypeSelect: select(), + ratingSelect: select(), + minSizeInput: input(), + maxSizeInput: input(), + resolutionPresetSelect: select(), + minWidthInput: input(), + minHeightInput: input(), + maxWidthInput: input(), + maxHeightInput: input(), + dateRangeSelect: select(), + dateExactInput: input(), + agendaContainer, + gridController: { reloadGrid }, + reconcileVisibleSelection: vi.fn(), + exitSimilarViewIfActive: vi.fn(async () => {}), + notifyContextChanged: vi.fn(), + panelLifecycleAC, + popovers, + filterPopover: document.createElement("div"), + }); + + window.dispatchEvent(new CustomEvent("mjr:filters-changed")); + + expect(popovers.close).not.toHaveBeenCalled(); + + await vi.advanceTimersByTimeAsync(260); + expect(reloadGrid).toHaveBeenCalledOnce(); + + disposeFilters(); + panelLifecycleAC.abort(); + vi.useRealTimers(); + }); + it("exposes CustomRootsPopover PrimeVue actions as real DOM buttons", async () => { const mod = await import("../vue/components/panel/CustomRootsPopover.vue"); const wrapper = mount(mod.default, { diff --git a/ui/tests/use_grid_query.vitest.ts b/ui/tests/use_grid_query.vitest.ts index 36a97a83..e6869786 100644 --- a/ui/tests/use_grid_query.vitest.ts +++ b/ui/tests/use_grid_query.vitest.ts @@ -173,6 +173,7 @@ describe("useGridQuery helpers", () => { "", "", "", + "", ].join("|")); expect(gridQueryKey(query)).not.toBe(gridListQueryKey(query)); }); diff --git a/ui/tests/use_grid_snapshot_cache.vitest.ts b/ui/tests/use_grid_snapshot_cache.vitest.ts index 58b68ae7..7d9b6013 100644 --- a/ui/tests/use_grid_snapshot_cache.vitest.ts +++ b/ui/tests/use_grid_snapshot_cache.vitest.ts @@ -54,6 +54,7 @@ describe("useGridSnapshotCache", () => { maxWidth: "", maxHeight: "", workflowType: "", + workflowId: "", dateRange: "", dateExact: "", sort: "mtime_desc", diff --git a/ui/tests/workflow_graph_map_data.vitest.ts b/ui/tests/workflow_graph_map_data.vitest.ts index 537d0d7f..93f4130a 100644 --- a/ui/tests/workflow_graph_map_data.vitest.ts +++ b/ui/tests/workflow_graph_map_data.vitest.ts @@ -3,6 +3,7 @@ import { describe, expect, it } from "vitest"; import { + findWorkflowNode, getNodeDisplayName, getNodeInputSlotNames, getNodeParamEntries, @@ -386,4 +387,48 @@ describe("workflow graph map data", () => { ]), ); }); + + it("supports root-only mode for node listing and lookup", () => { + const workflow = { + nodes: [ + { + id: 2, + type: "sg-runtime", + subgraph: { + id: "runtime-subgraph", + nodes: [{ id: 1, type: "InnerRuntime" }], + links: [], + }, + }, + ], + links: [], + }; + + expect(getWorkflowNodes(workflow, { includeSubgraphs: false }).map((node: any) => String(node.id))).toEqual(["2"]); + expect(getWorkflowNodes(workflow, { includeSubgraphs: true }).map((node: any) => String(node.id))).toEqual(["2", "1"]); + expect(findWorkflowNode(workflow, "2::1", { includeSubgraphs: false })).toBeNull(); + expect(findWorkflowNode(workflow, "2::1", { includeSubgraphs: true })?.type).toBe("InnerRuntime"); + }); + + it("treats array-like widgets_values safely and prefers input slot labels", () => { + const node = { + id: 12, + type: "Sampler", + inputs: [ + { name: "seed", type: "INT", widget: { name: "seed" } }, + { name: "steps", type: "INT", widget: { name: "steps" } }, + ], + widgets: [{ name: "swapped_steps" }, { name: "swapped_seed" }], + widgets_values: { + 0: 123, + 1: 28, + length: 2, + }, + }; + + expect(getNodeWidgetValueEntries(node)).toEqual([ + { label: "seed", value: 123, index: 0 }, + { label: "steps", value: 28, index: 1 }, + ]); + }); }); diff --git a/ui/theme/theme-comfy.css b/ui/theme/theme-comfy.css index 1583bbf5..bb58098b 100644 --- a/ui/theme/theme-comfy.css +++ b/ui/theme/theme-comfy.css @@ -5829,6 +5829,38 @@ body.mjr-mfv-popout-body { backdrop-filter: blur(8px); } +.mjr-wgm-toolbar { + position: absolute; + left: 10px; + top: 46px; + z-index: 2; + display: inline-flex; + gap: 6px; + max-width: min(420px, calc(100% - 20px)); +} + +.mjr-wgm-mode { + min-height: 26px; + padding: 3px 8px; + border-radius: 999px; + border: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(0, 0, 0, 0.5); + color: rgba(255, 255, 255, 0.72); + font-size: 10px; + cursor: pointer; +} + +.mjr-wgm-mode:hover { + border-color: rgba(149, 183, 255, 0.45); + color: rgba(255, 255, 255, 0.9); +} + +.mjr-wgm-mode.is-active { + border-color: rgba(124, 186, 255, 0.62); + background: rgba(79, 123, 214, 0.26); + color: rgba(235, 245, 255, 0.96); +} + .mjr-wgm--large .mjr-wgm-details { position: absolute; right: 10px; @@ -5968,6 +6000,274 @@ body.mjr-mfv-popout-body { color: rgba(255, 255, 255, 0.82); } +.mjr-wgm-node-visual { + --mjr-wgm-node-accent: rgba(115, 155, 255, 0.88); + --mjr-wgm-node-accent-soft: rgba(115, 155, 255, 0.22); + display: grid; + gap: 8px; + margin-top: 2px; + padding: 8px; + border-radius: 6px; + border: 1px solid color-mix(in srgb, var(--mjr-wgm-node-accent) 34%, rgba(255, 255, 255, 0.1)); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.08), + 0 10px 24px rgba(0, 0, 0, 0.24); + background: + linear-gradient(180deg, color-mix(in srgb, var(--mjr-wgm-node-accent-soft) 100%, transparent), rgba(44, 56, 88, 0.2)), + rgba(13, 16, 24, 0.85); +} + +.mjr-wgm-node-visual::before { + content: ""; + display: block; + height: 2px; + margin: -8px -8px 6px; + border-radius: 6px 6px 0 0; + background: linear-gradient(90deg, var(--mjr-wgm-node-accent), rgba(255, 255, 255, 0.12)); +} + +.mjr-wgm-node-visual.is-model { + --mjr-wgm-node-accent: rgba(124, 186, 255, 0.9); + --mjr-wgm-node-accent-soft: rgba(70, 123, 181, 0.34); +} + +.mjr-wgm-node-visual.is-sampler { + --mjr-wgm-node-accent: rgba(143, 228, 167, 0.9); + --mjr-wgm-node-accent-soft: rgba(64, 133, 88, 0.34); +} + +.mjr-wgm-node-visual.is-text { + --mjr-wgm-node-accent: rgba(255, 192, 114, 0.9); + --mjr-wgm-node-accent-soft: rgba(154, 102, 49, 0.34); +} + +.mjr-wgm-node-visual.is-media { + --mjr-wgm-node-accent: rgba(154, 170, 255, 0.9); + --mjr-wgm-node-accent-soft: rgba(83, 93, 165, 0.34); +} + +.mjr-wgm-node-visual.is-control { + --mjr-wgm-node-accent: rgba(255, 139, 169, 0.9); + --mjr-wgm-node-accent-soft: rgba(145, 70, 95, 0.34); +} + +.mjr-wgm-node-visual.is-logic { + --mjr-wgm-node-accent: rgba(188, 168, 255, 0.9); + --mjr-wgm-node-accent-soft: rgba(105, 86, 153, 0.34); +} + +.mjr-wgm-node-visual-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + padding-bottom: 6px; + border-bottom: 1px solid color-mix(in srgb, var(--mjr-wgm-node-accent) 25%, rgba(255, 255, 255, 0.14)); +} + +.mjr-wgm-node-visual-type { + font-size: 11px; + font-weight: 700; + color: rgba(236, 244, 255, 0.94); + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.35); +} + +.mjr-wgm-node-visual-id { + font-size: 10px; + color: rgba(194, 213, 255, 0.78); +} + +.mjr-wgm-node-ports { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; +} + +.mjr-wgm-node-ports-col { + min-width: 0; +} + +.mjr-wgm-node-ports-title { + margin-bottom: 4px; + font-size: 10px; + letter-spacing: 0.02em; + text-transform: uppercase; + color: rgba(255, 255, 255, 0.45); +} + +.mjr-wgm-node-ports-list { + display: grid; + gap: 3px; +} + +.mjr-wgm-node-port, +.mjr-wgm-node-port-empty { + display: flex; + align-items: center; + gap: 6px; + min-height: 18px; + padding: 2px 6px; + border-radius: 4px; + border: 1px solid rgba(255, 255, 255, 0.06); + background: rgba(0, 0, 0, 0.24); +} + +.mjr-wgm-node-port-empty { + color: rgba(255, 255, 255, 0.26); +} + +.mjr-wgm-node-port-dot { + width: 8px; + height: 8px; + border-radius: 999px; + flex: 0 0 auto; + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.18) inset; +} + +.mjr-wgm-node-port-dot.is-in { + background: rgba(135, 196, 255, 0.9); +} + +.mjr-wgm-node-port-dot.is-out { + background: rgba(144, 238, 174, 0.9); +} + +.mjr-wgm-node-port-name { + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 10px; + color: rgba(255, 255, 255, 0.78); +} + +.mjr-wgm-node-port-type { + flex: 0 0 auto; + max-width: 45%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 9px; + letter-spacing: 0.02em; + text-transform: uppercase; + padding: 1px 5px; + border-radius: 999px; + border: 1px solid rgba(255, 255, 255, 0.14); + background: rgba(255, 255, 255, 0.08); + color: rgba(224, 236, 255, 0.9); +} + +.mjr-wgm-node-widgets { + display: grid; + gap: 4px; +} + +.mjr-wgm-node-widgets-title { + margin-bottom: 2px; + font-size: 10px; + letter-spacing: 0.02em; + text-transform: uppercase; + color: rgba(255, 255, 255, 0.45); +} + +.mjr-wgm-node-widget, +.mjr-wgm-node-widget-empty { + display: grid; + grid-template-columns: minmax(70px, 0.42fr) minmax(0, 1fr); + gap: 8px; + padding: 4px 6px; + border-radius: 4px; + border: 1px solid rgba(255, 255, 255, 0.06); + background: rgba(0, 0, 0, 0.2); +} + +.mjr-wgm-node-widget { + cursor: pointer; + transition: + background 120ms ease, + border-color 120ms ease; +} + +.mjr-wgm-node-widget:hover, +.mjr-wgm-node-widget:focus-visible { + background: rgba(255, 255, 255, 0.09); + border-color: rgba(255, 255, 255, 0.2); + outline: none; +} + +.mjr-wgm-node-widget.is-ok { + border-color: rgba(79, 210, 125, 0.7); + background: rgba(79, 210, 125, 0.16); +} + +.mjr-wgm-node-widget.is-error { + border-color: rgba(255, 90, 90, 0.7); + background: rgba(255, 90, 90, 0.16); +} + +.mjr-wgm-node-widget-empty { + grid-template-columns: 1fr; + color: rgba(255, 255, 255, 0.34); +} + +.mjr-wgm-node-widget-key { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 10px; + color: rgba(255, 255, 255, 0.52); +} + +.mjr-wgm-node-widget-value { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 10px; + color: rgba(255, 255, 255, 0.88); +} + +.mjr-wgm-node-widget.is-multiline { + grid-template-columns: 1fr; + align-items: start; + gap: 4px; +} + +.mjr-wgm-node-widget.is-multiline .mjr-wgm-node-widget-key { + white-space: nowrap; +} + +.mjr-wgm-node-widget.is-multiline .mjr-wgm-node-widget-value { + white-space: pre-wrap; + word-break: break-word; + overflow-wrap: anywhere; + line-height: 1.35; + max-height: 9.2em; + overflow-y: auto; + padding-right: 2px; +} + +.mjr-wgm-node-widget.is-multiline.is-text-field .mjr-wgm-node-widget-value { + max-height: 16em; + line-height: 1.4; +} + +.mjr-wgm-node-widget-more { + font-size: 10px; + color: rgba(255, 255, 255, 0.46); + text-align: right; +} + +@media (max-width: 820px) { + .mjr-wgm--large .mjr-wgm-details { + width: min(380px, calc(100% - 20px)); + } + + .mjr-wgm-node-ports { + grid-template-columns: 1fr; + } +} + .mjr-ws-search-wrap { position: relative; display: flex; diff --git a/ui/vue/components/panel/FilterPopover.vue b/ui/vue/components/panel/FilterPopover.vue index c06e5262..943303a0 100644 --- a/ui/vue/components/panel/FilterPopover.vue +++ b/ui/vue/components/panel/FilterPopover.vue @@ -27,6 +27,7 @@ const maxWidthInputRef = ref(null); const maxHeightInputRef = ref(null); const agendaContainerRef = ref(null); const dateExactInputRef = ref(null); +const workflowIdInputRef = ref(null); const resolveDomElement = (value) => value?.$el || value || null; const getInputValue = (inputRef) => resolveDomElement(inputRef.value)?.value || ""; @@ -138,6 +139,11 @@ const applyWorkflowTypeValue = (value, { emit = true } = {}) => { if (emit) dispatchFiltersChanged(); }; +const applyWorkflowIdValue = (value, { emit = true } = {}) => { + panelStore.workflowId = String(value || "").trim(); + if (emit) dispatchFiltersChanged(); +}; + const applyRatingValue = (value, { emit = true } = {}) => { panelStore.minRating = Number(value || 0) || 0; if (emit) dispatchFiltersChanged(); @@ -206,6 +212,9 @@ const applyDateRangeValue = (value, { emit = true } = {}) => { const onDateExactChange = (event) => { panelStore.dateExactFilter = String(event?.target?.value || "").trim(); + if (panelStore.dateExactFilter && panelStore.dateRangeFilter) { + panelStore.dateRangeFilter = ""; + } dispatchFiltersChanged(); }; @@ -263,6 +272,10 @@ const workflowTypeControl = createValueFacade({ .toUpperCase(), setValue: applyWorkflowTypeValue, }); +const workflowIdControl = createValueFacade({ + getValue: () => String(panelStore.workflowId || "").trim(), + setValue: applyWorkflowIdValue, +}); const ratingSelectControl = createValueFacade({ getValue: () => String(Number(panelStore.minRating || 0) || 0), setValue: applyRatingValue, @@ -276,10 +289,61 @@ const dateRangeControl = createValueFacade({ setValue: applyDateRangeValue, }); +const activeFiltersCount = computed(() => { + let count = 0; + if (String(panelStore.kindFilter || "").trim()) count += 1; + if (Boolean(panelStore.workflowOnly)) count += 1; + if (String(panelStore.workflowType || "").trim()) count += 1; + if (String(panelStore.workflowId || "").trim()) count += 1; + if ((Number(panelStore.minRating || 0) || 0) > 0) count += 1; + if ((Number(panelStore.minSizeMB || 0) || 0) > 0 || (Number(panelStore.maxSizeMB || 0) || 0) > 0) { + count += 1; + } + if ( + (Number(panelStore.minWidth || 0) || 0) > 0 || + (Number(panelStore.minHeight || 0) || 0) > 0 || + (Number(panelStore.maxWidth || 0) || 0) > 0 || + (Number(panelStore.maxHeight || 0) || 0) > 0 + ) { + count += 1; + } + if (String(panelStore.dateRangeFilter || "").trim()) count += 1; + if (String(panelStore.dateExactFilter || "").trim()) count += 1; + return count; +}); + +const clearAllFilters = () => { + panelStore.kindFilter = ""; + panelStore.workflowOnly = false; + panelStore.workflowType = ""; + panelStore.workflowId = ""; + panelStore.minRating = 0; + panelStore.minSizeMB = 0; + panelStore.maxSizeMB = 0; + panelStore.minWidth = 0; + panelStore.minHeight = 0; + panelStore.maxWidth = 0; + panelStore.maxHeight = 0; + panelStore.dateRangeFilter = ""; + panelStore.dateExactFilter = ""; + + setInputValue(minSizeInputRef, ""); + setInputValue(maxSizeInputRef, ""); + setInputValue(minWidthInputRef, ""); + setInputValue(minHeightInputRef, ""); + setInputValue(maxWidthInputRef, ""); + setInputValue(maxHeightInputRef, ""); + setInputValue(dateExactInputRef, ""); + setInputValue(workflowIdInputRef, ""); + + dispatchFiltersChanged(); +}; + defineExpose({ get kindSelect() { return kindSelectControl; }, get wfCheckbox() { return workflowOnlyControl; }, get workflowTypeSelect() { return workflowTypeControl; }, + get workflowIdInput() { return workflowIdControl; }, get ratingSelect() { return ratingSelectControl; }, get minSizeInput() { return resolveDomElement(minSizeInputRef.value); }, get maxSizeInput() { return resolveDomElement(maxSizeInputRef.value); }, @@ -302,6 +366,26 @@ defineExpose({ --> @@ -507,6 +612,7 @@ defineExpose({
+
@@ -539,28 +645,95 @@ defineExpose({
+ diff --git a/ui/vue/components/panel/HeaderSection.vue b/ui/vue/components/panel/HeaderSection.vue index 204c58ab..cb0179c9 100644 --- a/ui/vue/components/panel/HeaderSection.vue +++ b/ui/vue/components/panel/HeaderSection.vue @@ -347,6 +347,7 @@ defineExpose({ get kindSelect() { return filterPopoverRef.value?.kindSelect ?? null; }, get wfCheckbox() { return filterPopoverRef.value?.wfCheckbox ?? null; }, get workflowTypeSelect() { return filterPopoverRef.value?.workflowTypeSelect ?? null; }, + get workflowIdInput() { return filterPopoverRef.value?.workflowIdInput ?? null; }, get ratingSelect() { return filterPopoverRef.value?.ratingSelect ?? null; }, get minSizeInput() { return filterPopoverRef.value?.minSizeInput ?? null; }, get maxSizeInput() { return filterPopoverRef.value?.maxSizeInput ?? null; }, diff --git a/ui/vue/components/panel/sidebar/AssetSidebarContent.vue b/ui/vue/components/panel/sidebar/AssetSidebarContent.vue index 6bcc768d..c24b124a 100644 --- a/ui/vue/components/panel/sidebar/AssetSidebarContent.vue +++ b/ui/vue/components/panel/sidebar/AssetSidebarContent.vue @@ -8,6 +8,7 @@ import { computed } from "vue"; import { closeSidebar } from "../../../../components/sidebar/SidebarView.js"; import { loadMajoorSettings } from "../../../../app/settings.js"; +import { t } from "../../../../app/i18n.js"; import SidebarHeaderSection from "./SidebarHeaderSection.vue"; import SidebarPreviewSection from "./SidebarPreviewSection.vue"; import SidebarFileInfoSection from "./SidebarFileInfoSection.vue"; @@ -72,14 +73,14 @@ function handleClose() { style="display:flex;flex-direction:column;gap:10px" >
- Rating + {{ t("sidebar.rating", "Rating") }}
- Tags + {{ t("sidebar.tags", "Tags") }} import { computed } from "vue"; +import { t } from "../../../../app/i18n.js"; +import { usePanelStore } from "../../../../stores/usePanelStore.js"; import { formatDate, formatTime, formatDuration } from "../../../../utils/format.js"; import { formatFps, readAssetFps, readAssetFrameCount } from "../../../../utils/mediaFps.js"; import { genTimeColor, normalizeGenerationTimeMs } from "../../../../components/Badges.js"; @@ -8,6 +10,22 @@ const props = defineProps({ asset: { type: Object, required: true }, }); +function applySameWorkflowFilter(workflowId) { + const id = String(workflowId || "").trim(); + if (!id) return; + try { + const panelStore = usePanelStore(); + panelStore.workflowId = id; + } catch (e) { + console.debug?.(e); + } + try { + window.dispatchEvent(new CustomEvent("mjr:filters-changed")); + } catch (e) { + console.debug?.(e); + } +} + function formatFileSize(bytes) { if (!bytes || bytes <= 0) return "0 B"; const units = ["B", "KB", "MB", "GB"]; @@ -34,15 +52,8 @@ function isAnimatedMedia(asset) { function readAssetField(asset, key) { const direct = asset?.[key] ?? asset?.file_info?.[key]; if (direct !== undefined && direct !== null && direct !== "") return direct; - // Fallback for fields nested under user_metadata (the backend may surface - // workflow.id only inside the raw metadata payload). Keep this fallback - // narrow to known keys to avoid surprising consumers. if (key === "workflow_id") { - return ( - asset?.user_metadata?.workflow?.id - ?? asset?.metadata?.workflow_id - ?? "" - ); + return asset?.user_metadata?.workflow?.id ?? asset?.metadata?.workflow_id ?? ""; } return ""; } @@ -52,29 +63,34 @@ const rows = computed(() => { const fileData = []; if (asset.width && asset.height) { fileData.push({ - label: "Dimensions", - value: `${asset.width} × ${asset.height}`, - tooltip: "Image/video resolution in pixels", + label: t("sidebar.dimensions", "Dimensions"), + value: `${asset.width} x ${asset.height}`, + tooltip: t("sidebar.fileInfo.dimensionsTooltip", "Image/video resolution in pixels"), }); } if (asset.duration && asset.duration > 0) { fileData.push({ - label: "Duration", + label: t("sidebar.fileInfo.duration", "Duration"), value: formatDuration(asset.duration), - tooltip: "Video duration", + tooltip: t("sidebar.fileInfo.durationTooltip", "Video duration"), }); } if (isAnimatedMedia(asset)) { const fps = readAssetFps(asset); if (fps != null) { - fileData.push({ label: "FPS", value: formatFps(fps), tooltip: "Native frame rate" }); + fileData.push({ + label: "FPS", + value: formatFps(fps), + tooltip: t("sidebar.fileInfo.fpsTooltip", "Native frame rate"), + }); } const frameCount = readAssetFrameCount(asset, fps); if (frameCount != null) { + const count = Math.max(0, Math.floor(frameCount)); fileData.push({ - label: "Length", - value: `${Math.max(0, Math.floor(frameCount))} frames`, - tooltip: "Total frame count", + label: t("sidebar.fileInfo.length", "Length"), + value: t("sidebar.fileInfo.frames", "{count} frames", { count }), + tooltip: t("sidebar.fileInfo.lengthTooltip", "Total frame count"), }); } } @@ -83,9 +99,9 @@ const rows = computed(() => { ); if (genTimeMs > 0) { fileData.push({ - label: "Generation Time", + label: t("sidebar.fileInfo.generationTime", "Generation Time"), value: `${(Number(genTimeMs) / 1000).toFixed(1)}s`, - tooltip: "Time taken to generate this asset (workflow execution time)", + tooltip: t("sidebar.fileInfo.generationTimeTooltip", "Time taken to generate this asset (workflow execution time)"), valueStyle: `color: ${genTimeColor(genTimeMs)}; font-weight: 600;`, }); } @@ -94,30 +110,67 @@ const rows = computed(() => { if (timestamp) { const dateStr = formatDate(timestamp); const timeStr = formatTime(timestamp); - if (dateStr) fileData.push({ label: "Date", value: dateStr, tooltip: "File creation/generation date" }); - if (timeStr) fileData.push({ label: "Time", value: timeStr, tooltip: "File creation/generation time" }); + if (dateStr) { + fileData.push({ + label: t("sidebar.date", "Date"), + value: dateStr, + tooltip: t("sidebar.fileInfo.dateTooltip", "File creation/generation date"), + }); + } + if (timeStr) { + fileData.push({ + label: t("sidebar.fileInfo.time", "Time"), + value: timeStr, + tooltip: t("sidebar.fileInfo.timeTooltip", "File creation/generation time"), + }); + } } if (asset.size && asset.size > 0) { - fileData.push({ label: "File Size", value: formatFileSize(asset.size), tooltip: "File size on disk" }); + fileData.push({ + label: t("sidebar.fileInfo.fileSize", "File Size"), + value: formatFileSize(asset.size), + tooltip: t("sidebar.fileInfo.fileSizeTooltip", "File size on disk"), + }); } if (asset.id != null) { - fileData.push({ label: "Asset ID", value: String(asset.id), tooltip: "Internal database asset identifier" }); + fileData.push({ + label: t("sidebar.fileInfo.assetId", "Asset ID"), + value: String(asset.id), + tooltip: t("sidebar.fileInfo.assetIdTooltip", "Internal database asset identifier"), + }); } const jobId = String(readAssetField(asset, "job_id") || "").trim(); if (jobId) { - fileData.push({ label: "Job ID", value: jobId, tooltip: "Workflow execution job identifier (prompt_id)" }); + fileData.push({ + label: t("sidebar.fileInfo.jobId", "Job ID"), + value: jobId, + tooltip: t("sidebar.fileInfo.jobIdTooltip", "Workflow execution job identifier (prompt_id)"), + }); } const sourceNodeId = String(readAssetField(asset, "source_node_id") || "").trim(); if (sourceNodeId) { - fileData.push({ label: "Source Node", value: sourceNodeId, tooltip: "ComfyUI node id that produced this file" }); + fileData.push({ + label: t("sidebar.fileInfo.sourceNode", "Source Node"), + value: sourceNodeId, + tooltip: t("sidebar.fileInfo.sourceNodeTooltip", "ComfyUI node id that produced this file"), + }); } const sourceNodeType = String(readAssetField(asset, "source_node_type") || "").trim(); if (sourceNodeType) { - fileData.push({ label: "Node Type", value: sourceNodeType, tooltip: "ComfyUI node class that produced this file" }); + fileData.push({ + label: t("sidebar.fileInfo.nodeType", "Node Type"), + value: sourceNodeType, + tooltip: t("sidebar.fileInfo.nodeTypeTooltip", "ComfyUI node class that produced this file"), + }); } const workflowId = String(readAssetField(asset, "workflow_id") || "").trim(); if (workflowId) { - fileData.push({ label: "Workflow ID", value: workflowId, tooltip: "ComfyUI workflow identifier (from workflow.id in extra_data)" }); + fileData.push({ + label: t("sidebar.fileInfo.workflowId", "Workflow ID"), + value: workflowId, + tooltip: t("sidebar.fileInfo.workflowIdTooltip", "ComfyUI workflow identifier (from workflow.id in extra_data)"), + action: "sameWorkflow", + }); } return fileData; }); @@ -144,7 +197,7 @@ const rows = computed(() => { letter-spacing: 0.4px; " > - File Info + {{ t("sidebar.fileInfo.title", "File Info") }}
{
{{ row.label }}
+
diff --git a/ui/vue/components/panel/sidebar/SidebarFolderSection.vue b/ui/vue/components/panel/sidebar/SidebarFolderSection.vue index 5fb03352..9dea92d9 100644 --- a/ui/vue/components/panel/sidebar/SidebarFolderSection.vue +++ b/ui/vue/components/panel/sidebar/SidebarFolderSection.vue @@ -1,5 +1,6 @@ @@ -187,8 +190,8 @@ const errorContent = computed(() => { v-if="props.loading" style="padding:10px 12px;border-radius:10px;border:1px solid rgba(33,150,243,0.35);background:rgba(33,150,243,0.08);color:rgba(255,255,255,0.86);white-space:pre-wrap" > -
Loading
-
Loading generation data...
+
{{ t("status.loading", "Loading") }}
+
{{ t("viewer.loadingGenerationData", "Loading generation data...") }}
{ :style="{ cursor: props.onRetry ? 'pointer' : 'default' }" @click="handleRetry" > -
Error Loading Metadata
+
{{ t("viewer.errorLoadingMetadata", "Error Loading Metadata") }}
{{ errorContent }}
@@ -218,7 +221,7 @@ const errorContent = computed(() => { v-if="showEmptyState" style="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)" > - No generation data found for this file. + {{ t("viewer.noGenerationDataFile", "No generation data found for this file.") }}
{ - Raw metadata + {{ t("msg.rawMetadata", "Raw metadata") }}
 = {}, stableQuery = "
         !(Number(state.maxWidth || 0) > 0) &&
         !(Number(state.maxHeight || 0) > 0) &&
         !String(state.workflowType || "").trim() &&
+        !String(state.workflowId || "").trim() &&
         !state.dateRangeFilter &&
         !state.dateExactFilter
     );
diff --git a/ui/vue/composables/useGridLoader.ts b/ui/vue/composables/useGridLoader.ts
index 819f153a..3ff3ed88 100644
--- a/ui/vue/composables/useGridLoader.ts
+++ b/ui/vue/composables/useGridLoader.ts
@@ -322,6 +322,7 @@ export function useGridLoader({
             "maxWidth",
             "maxHeight",
             "workflowType",
+            "workflowId",
             "dateRange",
             "dateExact",
             "semanticMode",
diff --git a/ui/vue/composables/useVirtualGrid.ts b/ui/vue/composables/useVirtualGrid.ts
index 252477f2..162960f8 100644
--- a/ui/vue/composables/useVirtualGrid.ts
+++ b/ui/vue/composables/useVirtualGrid.ts
@@ -291,6 +291,7 @@ function _assetMatchesActiveFilters(gridContainer: any, asset: any) {
     const workflowOnly = query.workflowOnly;
     const minRating = query.minRating;
     const workflowType = query.workflowType.toLowerCase();
+    const workflowId = String(query.workflowId || "").trim();
     const dateExact = query.dateExact;
     const assetSubfolder = String(asset?.subfolder || "").trim().toLowerCase();
     const assetType = String(asset?.type || asset?.source || "output")
@@ -300,6 +301,13 @@ function _assetMatchesActiveFilters(gridContainer: any, asset: any) {
     const assetWorkflowType = String(asset?.workflow_type || asset?.workflowType || "")
         .trim()
         .toLowerCase();
+    const assetWorkflowId = String(
+        asset?.workflow_id ||
+            asset?.workflowId ||
+            asset?.metadata?.workflow_id ||
+            asset?.metadata?.workflow?.id ||
+            "",
+    ).trim();
     const assetDate = String(asset?.date_exact || asset?.date || "").trim();
     const hasWorkflow = asset?.has_workflow ?? asset?.hasWorkflow ?? null;
 
@@ -312,6 +320,7 @@ function _assetMatchesActiveFilters(gridContainer: any, asset: any) {
     if (workflowOnly && hasWorkflow !== null && !hasWorkflow) return false;
     if (minRating > 0 && (Number(asset?.rating || 0) || 0) < minRating) return false;
     if (workflowType && assetWorkflowType !== workflowType) return false;
+    if (workflowId && assetWorkflowId && assetWorkflowId !== workflowId) return false;
     if (dateExact && assetDate && assetDate !== dateExact) return false;
 
     return true;
@@ -350,6 +359,7 @@ export async function fetchPage(
         maxWidth,
         maxHeight,
         workflowType,
+        workflowId,
         dateRange,
         dateExact,
     } = queryState;
@@ -393,6 +403,7 @@ export async function fetchPage(
             maxWidth: maxWidth > 0 ? maxWidth : null,
             maxHeight: maxHeight > 0 ? maxHeight : null,
             workflowType: workflowType || null,
+            workflowId: workflowId || null,
             dateRange: dateRange || null,
             dateExact: dateExact || null,
             sort: sortKey,
diff --git a/ui/vue/grid/useGridQuery.ts b/ui/vue/grid/useGridQuery.ts
index 4fd46246..c69436d8 100644
--- a/ui/vue/grid/useGridQuery.ts
+++ b/ui/vue/grid/useGridQuery.ts
@@ -43,6 +43,7 @@ export function createGridQuery(input: Record = {}) {
         maxWidth: numberValue(input.maxWidth, 0),
         maxHeight: numberValue(input.maxHeight, 0),
         workflowType: stringValue(input.workflowType).toUpperCase(),
+        workflowId: stringValue(input.workflowId),
         dateRange: stringValue(input.dateRange).toLowerCase(),
         dateExact: stringValue(input.dateExact),
         sort: stringValue(input.sort, "mtime_desc").toLowerCase(),
@@ -76,6 +77,7 @@ export function readGridQueryFromDataset(dataset: Record = {}, over
         maxWidth: dataset.mjrFilterMaxWidth,
         maxHeight: dataset.mjrFilterMaxHeight,
         workflowType: dataset.mjrFilterWorkflowType,
+        workflowId: dataset.mjrFilterWorkflowId,
         dateRange: dataset.mjrFilterDateRange,
         dateExact: dataset.mjrFilterDateExact,
         sort: dataset.mjrSort,
@@ -124,6 +126,7 @@ export function gridQueryKey(query: Record = {}): string {
         normalized.maxWidth || "",
         normalized.maxHeight || "",
         normalized.workflowType,
+        normalized.workflowId,
         normalized.dateRange,
         normalized.dateExact,
         normalized.semanticMode === undefined ? "" : normalized.semanticMode ? "1" : "0",
@@ -151,6 +154,7 @@ export function gridListQueryKey(query: Record = {}): string {
         normalized.maxWidth || "",
         normalized.maxHeight || "",
         normalized.workflowType,
+        normalized.workflowId,
         normalized.dateRange,
         normalized.dateExact,
     ].join("|");
@@ -176,6 +180,7 @@ export function gridQueryHasActiveFilters(query: Record = {}): bool
         normalized.maxWidth > 0 ||
         normalized.maxHeight > 0 ||
         normalized.workflowType ||
+        normalized.workflowId ||
         normalized.dateRange ||
         normalized.dateExact
     );
diff --git a/ui/vue/grid/useGridSnapshotCache.ts b/ui/vue/grid/useGridSnapshotCache.ts
index 7b2dd79a..945690bd 100644
--- a/ui/vue/grid/useGridSnapshotCache.ts
+++ b/ui/vue/grid/useGridSnapshotCache.ts
@@ -65,6 +65,8 @@ const GRID_SNAPSHOT_ASSET_FIELDS = [
     "hasGenerationData",
     "workflow_type",
     "workflowType",
+    "workflow_id",
+    "workflowId",
     "generation_time_ms",
     "positive_prompt",
     "enhanced_caption",
@@ -108,6 +110,7 @@ export function buildGridSnapshotKey(parts: Record = {}): string {
         maxWidth: normalizeSnapshotPart(parts.maxWidth || ""),
         maxHeight: normalizeSnapshotPart(parts.maxHeight || ""),
         workflowType: normalizeSnapshotPart(parts.workflowType || "").toUpperCase(),
+        workflowId: normalizeSnapshotPart(parts.workflowId || ""),
         dateRange: normalizeSnapshotPart(parts.dateRange || ""),
         dateExact: normalizeSnapshotPart(parts.dateExact || ""),
         sort: normalizeSnapshotPart(parts.sort || "mtime_desc", "mtime_desc"),