dsh-remotion 0.10.4 → 0.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # 更新记录
2
2
 
3
+ ## 0.10.5 (2026-11-04)
4
+
5
+ - 同步共享界面:嵌入设置时继承宿主底色,输入框跟随主题,空状态保持可读宽度;新版 DSH 可显示插件设置图标。
6
+ - Align embedded surfaces, themed inputs, readable empty states and optional native settings icons.
7
+ - 工具文本返回项目与任务编号,可查询进度或取消。
8
+ - Expose project/job ids for progress queries and cancellation.
9
+
10
+
3
11
  ## 0.10.4 (2026-10-30)
4
12
 
5
13
  - 视频工作台:导出前新增检查清单(标题、画幅与时长、素材数、已保存修订、渲染环境、上一份成品对应的修订);预览与导出任务显示真实步骤进度,失败后可就同一修订直接重试;同一工程在别处更新时不再提供会导致反复冲突的「保存后继续」,改为显式重新载入或保留输入;保存/导出按钮不可用时给出具体原因;空工程列表提供「新建视频」入口。
package/docs/WORKBENCH.md CHANGED
@@ -43,3 +43,9 @@ Edit the template sources and run pnpm run build. Commit generated lib/client.js
43
43
  工程列表可按关键词筛选,并按最近更新、最早更新或自然标题顺序排列;多个词需要同时匹配。PPT 只查目录中的标题和工程路径;视频查标题、正文和模板,当前列表与归档列表各自保留筛选条件。清空搜索会恢复完整列表,返回工程库会保留刚才的搜索和排序。筛选只在本机列表中执行,不读取未选工程的完整文件,也不修改工程内容。
44
44
 
45
45
  Search the local project list and sort by newest update, oldest update or natural title. Multiple terms must all match. PPT searches catalog titles and paths; video searches titles, text and templates, with separate active/archive filters. Clear restores the full list; returning from editing preserves filters. Filtering does not load unselected project files or change project contents.
46
+
47
+ ## 任务与环境 / Jobs and preparation
48
+
49
+ 工具返回项目编号与任务编号。查询进度使用 `action: job`,取消使用 `action: cancel`,两者的 `job` 参数填写返回的任务编号。关闭 DSH 后任务不能续跑,保存的工程仍保留。
50
+
51
+ Tool text includes project and job ids. Use the returned job id with `action: job` or `action: cancel`. Saved projects survive a restart; running processes do not resume.
package/lib/client.js CHANGED
@@ -55,7 +55,7 @@ function createWorkbenchUI(React) {
55
55
  }
56
56
  function Page({ title, subtitle, actions, children, workbench = false, className, rootRef, ...props }) {
57
57
  return h('section', { ...props, ref: rootRef, className: cx('dshw', 'w-page', className), 'data-main': workbench ? 'true' : 'false' },
58
- h('style', null, styles),
58
+ h(Styles, { key: 'styles' }),
59
59
  h('header', { className: 'w-page-header' }, h('div', { className: 'w-heading' }, h('h1', null, title), subtitle ? h('p', { className: 'w-subtitle' }, subtitle) : null), actions ? h('div', { className: 'w-header-actions' }, actions) : null),
60
60
  h('div', { className: 'w-body' }, children));
61
61
  }
@@ -78,10 +78,10 @@ function createWorkbenchUI(React) {
78
78
  }
79
79
  function Status({ children, tone = 'info', className }) {
80
80
  if (!children) return null;
81
- return h('div', { className: cx('w-status', 'w-status-' + tone, className), role: tone === 'error' ? 'alert' : 'status', 'aria-live': tone === 'error' ? 'assertive' : 'polite' }, h(Icon, { name: tone === 'success' ? 'check' : 'info', size: 18 }), h('div', null, children));
81
+ return h('div', { className: cx('dshw', 'w-status', 'w-status-' + tone, className), role: tone === 'error' ? 'alert' : 'status', 'aria-live': tone === 'error' ? 'assertive' : 'polite' }, h(Icon, { name: tone === 'success' ? 'check' : 'info', size: 18 }), h('div', null, children));
82
82
  }
83
83
  function Empty({ title, children, action, icon = 'file' }) {
84
- return h('div', { className: 'w-empty' }, h(Icon, { name: icon, size: 32 }), h('h2', null, title), children ? h('div', { className: 'w-muted' }, children) : null, action ? h('div', { className: 'w-toolbar' }, action) : null);
84
+ return h('div', { className: 'dshw w-empty' }, h(Styles, { key: 'styles' }), h(Icon, { name: icon, size: 32 }), h('h2', null, title), children ? h('div', { className: 'w-muted' }, children) : null, action ? h('div', { className: 'w-toolbar' }, action) : null);
85
85
  }
86
86
  function Split({ list, detail, selected, onBack, backLabel, className, listWidth = 360 }) {
87
87
  const ref = useRef(null);
@@ -125,7 +125,8 @@ function createWorkbenchUI(React) {
125
125
  else if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); }
126
126
  else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); }
127
127
  }
128
- return h('div', { className: 'w-overlay', onClick: event => { if (!busy && event.target === event.currentTarget) onClose(); } },
128
+ return h('div', { className: 'dshw w-overlay', onClick: event => { if (!busy && event.target === event.currentTarget) onClose(); } },
129
+ h(Styles, { key: 'styles' }),
129
130
  h('section', { ref: panel, className: cx('w-dialog', className), role: 'dialog', 'aria-modal': true, 'aria-labelledby': id, tabIndex: -1, onKeyDown: keydown },
130
131
  h('header', { className: 'w-dialog-header' }, h('h2', { id }, title), h(IconButton, { icon: 'close', label: closeLabel, disabled: busy, onClick: onClose })), h('div', { className: 'w-dialog-body' }, children)));
131
132
  }
@@ -136,10 +137,10 @@ function createWorkbenchUI(React) {
136
137
  ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({ name: 'sidebar.panellist', id, order, label }, function WorkbenchIcon({ size }) { return h(Icon, { name: icon, size }); }));
137
138
  }
138
139
  const styles = `
139
- .dshw{--w-bg:var(--dsw-alias-bg-layer-1,#fff);--w-soft:var(--dsw-alias-bg-layer-2,#f7f8fa);--w-text:var(--dsw-alias-label-primary,#18202c);--w-muted:var(--dsw-alias-label-secondary,#667085);--w-border:var(--dsw-alias-border-l3,#e7e9ef);--w-accent:var(--dsh-plugin-workbench-accent,#4f6bdb);--w-selected:color-mix(in srgb,var(--w-accent) 10%,var(--w-bg));--w-primary:var(--w-text);--w-on-primary:var(--w-bg);container-type:inline-size;container-name:dsh-workbench;color:var(--w-text);background:var(--w-bg);font:14px/1.65 var(--dsh-font-family-content,system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif);min-width:0;max-width:100%;box-sizing:border-box;text-align:start;color-scheme:inherit}
140
- .dshw *,.dshw *:before,.dshw *:after{box-sizing:border-box}.dshw h1,.dshw h2,.dshw h3,.dshw h4,.dshw p{margin:0}.dshw h1{font-size:30px;line-height:1.25;letter-spacing:-.025em;font-weight:650}.dshw h2{font-size:24px;line-height:1.35;font-weight:650;letter-spacing:-.015em;overflow-wrap:anywhere}.dshw h3,.dshw h4{font-size:16px;line-height:1.4;font-weight:600}.dshw a{color:var(--w-accent);text-underline-offset:3px;overflow-wrap:anywhere}.dshw button,.dshw input,.dshw select,.dshw textarea{font:inherit;color:inherit;max-width:100%}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select,.dshw textarea{background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 11px;min-width:0;line-height:1.5}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select{min-height:38px}.dshw textarea{resize:vertical}.dshw input[type=checkbox],.dshw input[type=radio]{width:16px;height:16px;flex-shrink:0;accent-color:var(--w-accent)}.dshw :focus-visible{outline:2px solid var(--w-accent);outline-offset:3px}.dshw button:disabled,.dshw input:disabled,.dshw select:disabled,.dshw textarea:disabled{opacity:.5;cursor:not-allowed}.dshw label{font-size:13px}.dshw fieldset{min-width:0;border:1px solid var(--w-border);border-radius:8px}.dshw summary{cursor:pointer;font-weight:550;list-style:none;display:flex;align-items:center;gap:8px}.dshw summary::-webkit-details-marker{display:none}.dshw summary:after{content:'';display:block;margin-inline-start:auto;width:7px;height:7px;border-inline-end:1.75px solid currentColor;border-bottom:1.75px solid currentColor;transform:rotate(45deg);flex-shrink:0}.dshw details[open]>summary:after{transform:rotate(225deg)}.dshw details>summary+*{margin-top:12px}.dshw pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace;max-width:100%;background:var(--w-soft);border-radius:6px;padding:14px}.dshw img,.dshw video,.dshw iframe{max-width:100%}
141
- .w-page{display:flex;flex-direction:column;position:relative;padding:0;min-height:540px;gap:0}.w-page[data-main=true]{height:100%;min-height:0;padding:calc(24px + var(--dsh-frame-top-clearance,0px)) 28px 0 max(28px,var(--dsh-frame-leading-clearance,0px));overflow:auto}.w-page-header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;padding-bottom:22px;flex-shrink:0}.w-heading{min-width:0}.w-subtitle{margin-top:8px!important;font-size:14px;color:var(--w-muted);line-height:1.6}.w-header-actions,.w-toolbar,.w-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0}.w-header-actions{justify-content:flex-end}.w-body,.w-tabs-layout{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0}.w-body{overflow:auto}.w-tab-panel{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:auto}.w-tabs{display:flex;align-items:stretch;gap:20px;border-bottom:1px solid var(--w-border);flex-shrink:0;overflow-x:auto;scrollbar-width:thin}.dshw .w-tabs>button{border:0;border-bottom:2px solid transparent;background:transparent;padding:11px 8px 13px;white-space:nowrap;font-size:14px;font-weight:550;cursor:pointer;color:var(--w-muted);display:flex;align-items:center;gap:7px}.dshw .w-tabs>button[aria-selected=true]{border-bottom-color:var(--w-accent);color:var(--w-accent)}.w-count,.w-tag{font-size:12px;line-height:1.5;display:inline-flex;align-items:center;flex-shrink:0;background:var(--w-soft);border-radius:5px;padding:1px 6px;color:var(--w-muted)}.w-tabs [aria-selected=true] .w-count,.w-selected .w-tag{color:var(--w-accent);background:var(--w-selected)}
142
- .dshw .w-button{display:inline-flex;justify-content:center;align-items:center;gap:7px;background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 12px;min-height:36px;line-height:1.4;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;white-space:normal}.dshw .w-button:not(:disabled):hover{background:var(--w-soft)}.dshw .w-primary{background:var(--w-primary);border-color:var(--w-primary);color:var(--w-on-primary)}.dshw .w-primary:not(:disabled):hover{background:var(--w-primary);opacity:.9}.dshw .w-ghost{background:transparent;border-color:transparent}.dshw .w-danger{color:var(--dsw-alias-state-error-primary,#b43c3c)}.dshw .w-icon-button{width:36px;min-width:36px;padding:8px}.dshw .w-button svg{flex-shrink:0}.w-muted{color:var(--w-muted);font-size:12px;line-height:1.6}.w-section{padding:24px 0;border-bottom:1px solid var(--w-border);min-width:0}.w-section>h3{margin-bottom:12px}.w-section>p+p{margin-top:8px}.w-fields{display:grid;gap:16px;min-width:0}.w-field{display:grid;gap:6px;min-width:0}.w-field>input,.w-field>select,.w-field>textarea{width:100%}.w-status{display:flex;align-items:flex-start;gap:8px;padding:11px 13px;margin:12px 0;border:1px solid var(--w-border);border-radius:8px;background:var(--w-soft);font-size:13px;overflow-wrap:anywhere;flex-shrink:0}.w-status>svg{flex-shrink:0;margin-top:2px}.w-status-error{color:var(--dsw-alias-state-error-primary,#ad3636)}.w-status-success{color:var(--dsw-alias-state-success-primary,#24794a)}.w-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;max-width:580px;padding:48px 24px;margin:auto;min-height:280px;overflow-wrap:anywhere}.w-empty>svg{color:var(--w-muted)}.w-empty h2{font-size:20px}.w-empty .w-muted{font-size:14px}.w-empty .w-toolbar{justify-content:center}
140
+ .dshw{--w-bg:var(--dsw-alias-bg-layer-1,#fff);--w-soft:var(--dsw-alias-bg-layer-2,#f7f8fa);--w-text:var(--dsw-alias-label-primary,#18202c);--w-muted:var(--dsw-alias-label-secondary,#667085);--w-border:var(--dsw-alias-border-l3,#e7e9ef);--w-accent:var(--dsh-plugin-workbench-accent,#4f6bdb);--w-selected:color-mix(in srgb,var(--w-accent) 10%,var(--w-bg));--w-primary:var(--w-text);--w-on-primary:var(--w-bg);container-type:inline-size;container-name:dsh-workbench;color:var(--w-text);font:14px/1.65 var(--dsh-font-family-content,system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif);min-width:0;max-width:100%;box-sizing:border-box;text-align:start;color-scheme:inherit}
141
+ .dshw *,.dshw *:before,.dshw *:after{box-sizing:border-box}.dshw h1,.dshw h2,.dshw h3,.dshw h4,.dshw p{margin:0}.dshw h1{font-size:30px;line-height:1.25;letter-spacing:-.025em;font-weight:650}.dshw h2{font-size:24px;line-height:1.35;font-weight:650;letter-spacing:-.015em;overflow-wrap:anywhere}.dshw h3,.dshw h4{font-size:16px;line-height:1.4;font-weight:600}.dshw a{color:var(--w-accent);text-underline-offset:3px;overflow-wrap:anywhere}.dshw button,.dshw input,.dshw select,.dshw textarea{font:inherit;color:inherit;max-width:100%}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select,.dshw textarea{background:var(--dsw-specific-input-major,var(--w-bg));border:1px solid var(--w-border);border-radius:8px;padding:8px 11px;min-width:0;line-height:1.5}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select{min-height:38px}.dshw textarea{resize:vertical}.dshw input[type=checkbox],.dshw input[type=radio]{width:16px;height:16px;flex-shrink:0;accent-color:var(--w-accent)}.dshw :focus-visible{outline:2px solid var(--w-accent);outline-offset:3px}.dshw button:disabled,.dshw input:disabled,.dshw select:disabled,.dshw textarea:disabled{opacity:.5;cursor:not-allowed}.dshw label{font-size:13px}.dshw fieldset{min-width:0;border:1px solid var(--w-border);border-radius:8px}.dshw summary{cursor:pointer;font-weight:550;list-style:none;display:flex;align-items:center;gap:8px}.dshw summary::-webkit-details-marker{display:none}.dshw summary:after{content:'';display:block;margin-inline-start:auto;width:7px;height:7px;border-inline-end:1.75px solid currentColor;border-bottom:1.75px solid currentColor;transform:rotate(45deg);flex-shrink:0}.dshw details[open]>summary:after{transform:rotate(225deg)}.dshw details>summary+*{margin-top:12px}.dshw pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace;max-width:100%;background:var(--w-soft);border-radius:6px;padding:14px}.dshw img,.dshw video,.dshw iframe{max-width:100%}
142
+ .w-page{display:flex;flex-direction:column;position:relative;padding:0;min-height:540px;gap:0}.w-page[data-main=true]{height:100%;min-height:0;padding:calc(24px + var(--dsh-frame-top-clearance,0px)) 28px 0 max(28px,var(--dsh-frame-leading-clearance,0px));overflow:auto}.dshw[data-main=true]{background:var(--w-bg)}.dshw.w-page,.dshw .w-body,.dshw .w-tab-panel{overflow-x:clip}.w-page-header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;padding-bottom:22px;flex-shrink:0}.w-heading{min-width:0}.w-subtitle{margin-top:8px!important;font-size:14px;color:var(--w-muted);line-height:1.6}.w-header-actions,.w-toolbar,.w-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0}.w-header-actions{justify-content:flex-end}.w-body,.w-tabs-layout{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0}.w-body{overflow:auto}.w-tab-panel{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:auto}.w-tabs{display:flex;align-items:stretch;gap:20px;border-bottom:1px solid var(--w-border);flex-shrink:0;overflow-x:auto;scrollbar-width:thin}.dshw .w-tabs>button{border:0;border-bottom:2px solid transparent;background:transparent;padding:11px 8px 13px;white-space:nowrap;font-size:14px;font-weight:550;cursor:pointer;color:var(--w-muted);display:flex;align-items:center;gap:7px}.dshw .w-tabs>button[aria-selected=true]{border-bottom-color:var(--w-accent);color:var(--w-accent)}.w-count,.w-tag{font-size:12px;line-height:1.5;display:inline-flex;align-items:center;flex-shrink:0;background:var(--w-soft);border-radius:5px;padding:1px 6px;color:var(--w-muted)}.w-tabs [aria-selected=true] .w-count,.w-selected .w-tag{color:var(--w-accent);background:var(--w-selected)}
143
+ .dshw .w-button{display:inline-flex;justify-content:center;align-items:center;gap:7px;background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 12px;min-height:36px;line-height:1.4;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;white-space:normal}.dshw .w-button:not(:disabled):hover{background:var(--w-soft)}.dshw .w-primary{background:var(--w-primary);border-color:var(--w-primary);color:var(--w-on-primary)}.dshw .w-primary:not(:disabled):hover{background:var(--w-primary);opacity:.9}.dshw .w-ghost{background:transparent;border-color:transparent}.dshw .w-danger{color:var(--dsw-alias-state-error-primary,#b43c3c)}.dshw .w-icon-button{width:36px;min-width:36px;padding:8px}.dshw .w-button svg{flex-shrink:0}.w-muted{color:var(--w-muted);font-size:12px;line-height:1.6}.w-section{padding:24px 0;border-bottom:1px solid var(--w-border);min-width:0}.w-section>h3{margin-bottom:12px}.w-section>p+p{margin-top:8px}.w-fields{display:grid;gap:16px;min-width:0}.w-field{display:grid;gap:6px;min-width:0}.w-field>input,.w-field>select,.w-field>textarea{width:100%}.w-status{display:flex;align-items:flex-start;gap:8px;padding:11px 13px;margin:12px 0;border:1px solid var(--w-border);border-radius:8px;background:var(--w-soft);font-size:13px;overflow-wrap:anywhere;flex-shrink:0}.w-status>svg{flex-shrink:0;margin-top:2px}.w-status-error{color:var(--dsw-alias-state-error-primary,#ad3636)}.w-status-success{color:var(--dsw-alias-state-success-primary,#24794a)}.w-status-warn{color:var(--dsw-alias-state-warning-primary,#8a5a00)}.w-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;width:100%;max-width:580px;padding:48px 24px;margin:auto;min-height:280px;overflow-wrap:anywhere}.w-empty>svg{color:var(--w-muted)}.w-empty h2{font-size:20px}.w-empty .w-muted{font-size:14px}.w-empty .w-toolbar{justify-content:center}
143
144
  .w-split{display:grid;grid-template-columns:minmax(240px,var(--w-list-width)) minmax(0,1fr);min-height:460px;flex:1;min-width:0}.w-master{min-width:0;border-inline-end:1px solid var(--w-border);overflow:auto;padding-bottom:24px}.w-detail{min-width:0;padding:26px 28px;overflow:auto;overflow-wrap:anywhere;display:flex;flex-direction:column}.w-master-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:20px 16px}.w-search{display:flex;align-items:center;gap:8px;border:1px solid var(--w-border);border-radius:8px;padding:0 10px;min-width:0;flex:1;background:var(--w-bg)}.w-search>svg{color:var(--w-muted);flex-shrink:0}.dshw .w-search>input{border:0!important;background:transparent!important;padding:8px 0!important;width:100%;outline-offset:0}.w-row{display:flex;gap:0;min-width:0;position:relative;border-bottom:1px solid var(--w-border);border-inline-start:3px solid transparent}.w-row-select{display:flex;align-items:flex-start;padding:21px 0 0 14px}.dshw .w-row-button{display:flex;flex-direction:column;align-items:stretch;gap:7px;text-align:start;width:100%;padding:18px 18px 18px 16px;border:0;background:transparent;color:inherit;min-width:0;cursor:pointer;line-height:1.5}.dshw .w-row-button:hover{background:var(--w-soft)}.w-row-head{display:flex;align-items:flex-start;gap:10px;justify-content:space-between;min-width:0}.w-row-head>strong{font-size:14px;line-height:1.5;font-weight:600;overflow-wrap:anywhere}.w-row-meta,.w-row-description{color:var(--w-muted);font-size:12px;line-height:1.6;overflow-wrap:anywhere}.w-row-description{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.w-selected{background:var(--w-selected);border-inline-start-color:var(--w-accent)}.w-back{display:none!important}.w-detail-title{margin-bottom:12px!important}.w-detail-meta{color:var(--w-muted);font-size:13px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.w-detail-footer{padding:24px 0;display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:auto;border-top:1px solid var(--w-border)}.w-detail-footer .w-muted{flex:1;min-width:160px}.w-definition{display:grid;grid-template-columns:minmax(80px,120px) minmax(0,1fr);gap:8px 16px;font-size:14px;margin:20px 0}.w-definition dt{color:var(--w-muted)}.w-definition dd{margin:0;min-width:0;overflow-wrap:anywhere}
144
145
  .w-switch-label{display:inline-flex;align-items:center;gap:8px;font-size:13px;position:relative;cursor:pointer}.w-switch-label>input{position:absolute;opacity:0;inset-inline-end:0;width:36px!important;height:22px!important;margin:0;cursor:pointer}.w-switch-track{width:36px;height:22px;border-radius:12px;display:block;background:var(--w-border);border:1px solid var(--w-border);pointer-events:none;padding:2px;transition:background .15s}.w-switch-track:before{content:'';display:block;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0002;transition:transform .15s}.w-switch-label>input:checked+.w-switch-track{background:var(--w-accent);border-color:var(--w-accent)}.w-switch-label>input:checked+.w-switch-track:before{transform:translateX(14px)}.w-switch-label>input:focus-visible+.w-switch-track{outline:2px solid var(--w-accent);outline-offset:3px}.w-switch-label:has(>input:disabled){opacity:.5;cursor:not-allowed}
145
146
  .w-overlay{position:fixed;inset:0;background:#0005;display:flex;justify-content:flex-end;z-index:1000;padding:12px;overflow:auto}.w-dialog{width:min(620px,100%);max-height:100%;display:flex;flex-direction:column;min-height:0;background:var(--w-bg);color:var(--w-text);border:1px solid var(--w-border);border-radius:12px;box-shadow:0 18px 70px #0003}.w-dialog-header{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:20px 24px;border-bottom:1px solid var(--w-border);flex-shrink:0}.w-dialog-header>h2{font-size:20px}.w-dialog-body{overflow:auto;padding:20px 24px;min-height:0}.w-editor-grid{display:grid;grid-template-columns:210px minmax(0,1fr) 300px;min-height:500px;flex:1}.w-editor-list{padding:20px 12px;border-inline-end:1px solid var(--w-border);min-width:0}.w-editor-canvas{background:var(--w-soft);padding:20px;min-width:0;display:flex;flex-direction:column;gap:14px}.w-editor-inspector{padding:24px;border-inline-start:1px solid var(--w-border);min-width:0;overflow:auto}.w-editor-inspector h3{margin-bottom:18px}.w-preview-empty{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:12px;aspect-ratio:16/9;min-height:180px;background:var(--w-soft);border:1px solid var(--w-border);border-radius:8px;padding:24px;color:var(--w-muted)}.w-content-pad{padding:24px 0}.w-stack{display:flex;flex-direction:column;gap:16px;min-width:0}.w-scroll-x{overflow:auto;max-width:100%}
@@ -148,7 +149,8 @@ function createWorkbenchUI(React) {
148
149
  @media(max-width:700px){.w-page[data-main=true]{padding:calc(16px + var(--dsh-frame-top-clearance,0px)) 16px 0 max(16px,var(--dsh-frame-leading-clearance,0px))}.w-overlay{padding:8px}.w-dialog{width:100%}}
149
150
  @media(prefers-reduced-motion:reduce){.dshw *,.dshw *:before{scroll-behavior:auto!important;transition:none!important;animation:none!important}}
150
151
  `;
151
- return { Icon, Button, IconButton, Page, Tabs, Status, Empty, Split, Row, Search, Switch, Dialog, register, styles };
152
+ function Styles() { return h('style', null, styles); }
153
+ return { Icon, Button, IconButton, Page, Tabs, Status, Empty, Split, Row, Search, Switch, Dialog, Styles, register, styles };
152
154
  }
153
155
 
154
156
  /* One update control per plugin. Only transport, idle guards and installation
@@ -228,6 +230,13 @@ function __stardustUpdatesWrap(definition, participant) {
228
230
  const React = require('react');
229
231
  return { ...original, apply(ctx, ...args) {
230
232
  const result = original.apply?.call(this, ctx, ...args);
233
+ // The optional alpha.3 slot stays dormant in older hosts; its scoped
234
+ // injection unregisters naturally when the plugin is unloaded.
235
+ if (participant.iconData && participant.sectionIds?.length && typeof ctx.inject === 'function') ctx.inject(['slots'], host => {
236
+ for (const id of new Set(participant.sectionIds)) host.slots.inject('settings.section.icon', () => host.slots.register({ name: 'settings.section.icon', id }, function PluginSettingsIcon({ size = 20 }) {
237
+ return React.createElement('img', { src: participant.iconData, alt: '', 'aria-hidden': true, width: size, height: size, style: { objectFit: 'contain', display: 'block', flexShrink: 0 } });
238
+ }));
239
+ });
231
240
  if (typeof ctx.inject === 'function') ctx.inject(['slots', 'locale', 'remote', 'remote.pluginManager'], host => __stardustUpdatesJoin(host, React, require, participant));
232
241
  return result;
233
242
  } };
@@ -333,6 +342,16 @@ function __stardustUpdatesClient(ctx, React, require, shared) {
333
342
  'owner-required': t('只有 profile 拥有者能管理更新。', 'Only the profile owner can manage updates.'),
334
343
  })[code] || t('操作未完成,请刷新后重试。DSH 不会因此自动重启。', 'The operation could not be completed. Refresh and retry. DSH will not restart automatically.');
335
344
  }
345
+ // releaseOf() keeps the failing engine/peer range check as a stable code; say which
346
+ // environment has to change instead of only reporting that the release is incompatible.
347
+ function requirement(release) {
348
+ return ({
349
+ 'dsh-version': t('需要换成与该版本匹配的 DSH 本体', 'it needs a different DSH version'),
350
+ 'node-version': t('需要换成与该版本匹配的 Node.js', 'it needs a different Node.js version'),
351
+ deprecated: t('作者已把这个版本标记为弃用', 'the author marked this release as deprecated'),
352
+ 'not-bundle': t('这个版本不是可加载的 DSH 插件包', 'this release is not a loadable DSH plugin bundle'),
353
+ })[release?.reason] || t('发布元数据的兼容范围与当前环境不符', 'its published compatibility range does not match this environment');
354
+ }
336
355
  function jobLabel(job) {
337
356
  return ({ verifying: t('正在核对版本', 'Verifying release'), installing: t('正在安装', 'Installing'), cancelling: t('正在请求取消', 'Requesting cancellation'), complete: t('已更新', 'Updated'), 'restart-required': t('已安装,等待你手动重启', 'Installed; manual restart needed'), restored: t('更新未成功,已恢复原版本', 'Update failed; previous version restored'), 'restore-failed': t('恢复未成功,请检查官方插件管理', 'Recovery failed; check native plugin management'), unknown: t('结果未确认,请检查官方插件管理', 'Result unconfirmed; check native plugin management'), cancelled: t('已取消', 'Cancelled'), failed: t('更新未成功', 'Update failed') })[job.state] || job.state;
338
357
  }
@@ -371,7 +390,7 @@ function __stardustUpdatesClient(ctx, React, require, shared) {
371
390
  const title = language() === 'en' ? original.labelEn : original.label;
372
391
  const ownPage = pageState(true), unconfirmed = ['unknown', 'restore-failed'].includes(snapshot.job?.state), pageBusy = ownPage.busy || (snapshot.pages.clients || []).some(client => client.id !== id && client.busy), installLocked = working || activeJob() || unconfirmed || snapshot.updaterRestart || snapshot.preferenceError || !snapshot.activity.known || snapshot.activity.busy || snapshot.pages.dirty || ownPage.dirty || pageBusy || !snapshot.pages.known;
373
392
  const checkingThis = checking || snapshot.checkingNames?.includes(target);
374
- const status = row.sourceKind !== 'registry' ? t('本地 / 外部来源,保留原安装方式', 'Local / external source; keep original install method') : row.loadError ? t('加载异常,请先检查官方插件管理', 'Loading error; check native plugin management') : row.error ? t('检查失败,可以重试', 'Check failed; retry available') : row.release && !row.release.compatible ? t('新版本暂不兼容当前环境', 'Latest release is incompatible with this environment') : row.available ? (prefs.ignoredVersion === row.release.version ? t('已忽略提醒,仍可手动更新', 'Reminder ignored; manual update available') : t('有新版本', 'Update available')) : row.checkedAt ? t('当前已是最新稳定版', 'Latest stable version') : t('尚未检查', 'Not checked yet');
393
+ const status = row.sourceKind !== 'registry' ? t('本地 / 外部来源,保留原安装方式', 'Local / external source; keep original install method') : row.loadError ? t('加载异常,请先检查官方插件管理', 'Loading error; check native plugin management') : row.error ? t('检查失败,可以重试', 'Check failed; retry available') : row.release && !row.release.compatible ? t('新版本暂不兼容当前环境:', 'Latest release is incompatible with this environment: ') + requirement(row.release) : row.available ? (prefs.ignoredVersion === row.release.version ? t('已忽略提醒,仍可手动更新', 'Reminder ignored; manual update available') : t('有新版本', 'Update available')) : row.checkedAt ? t('当前已是最新稳定版', 'Latest stable version') : t('尚未检查', 'Not checked yet');
375
394
  return h(FooterFrame, { name, label: title, subtitle: original.name + ' · ' + original.version, actions: h(W.Button, { icon: 'refresh', disabled: checkingThis || row.sourceKind !== 'registry', onClick: check }, checkingThis ? t('正在检查…', 'Checking…') : target === '@stardustlc/dsh-suite' ? t('检查整包更新', 'Check Suite updates') : t('检查更新', 'Check for updates')) },
376
395
  original.bundledBy && h(W.Status, null, t('此插件随 Suite 安装。以下设置与安装作用于 Suite 整包,以保持组件版本一致。单独安装的插件可以独立更新。', 'This plugin was installed through Suite. These controls update Suite as a package so its components stay consistent. Independently installed plugins update individually.')),
377
396
  h('section', { className: 'w-section' }, (original.bundledBy || row.available) && h('p', { className: 'updates-version' }, target + ' · ' + row.version, row.release?.version && row.release.version !== row.version ? ' → ' + row.release.version : ''), h('p', { className: 'w-muted updates-note' }, status), !row.enabled && h('p', { className: 'w-muted' }, t('当前已停用,更新后仍保持停用。', 'Currently disabled; it will remain disabled after updating.')), row.checkedAt && h('p', { className: 'w-muted updates-note' }, t('上次检查:', 'Last checked: ') + new Date(row.checkedAt).toLocaleString(language() === 'en' ? 'en-US' : 'zh-CN')),
@@ -576,10 +595,10 @@ function createWorkbenchUI(React) {
576
595
  ctx.slots.inject('sidebar.panellist', () => ctx.slots.register({ name: 'sidebar.panellist', id, order, label }, function WorkbenchIcon({ size }) { return h(Icon, { name: icon, size }); }));
577
596
  }
578
597
  const styles = `
579
- .dshw{--w-bg:var(--dsw-alias-bg-layer-1,#fff);--w-soft:var(--dsw-alias-bg-layer-2,#f7f8fa);--w-text:var(--dsw-alias-label-primary,#18202c);--w-muted:var(--dsw-alias-label-secondary,#667085);--w-border:var(--dsw-alias-border-l3,#e7e9ef);--w-accent:var(--dsh-plugin-workbench-accent,#4f6bdb);--w-selected:color-mix(in srgb,var(--w-accent) 10%,var(--w-bg));--w-primary:var(--w-text);--w-on-primary:var(--w-bg);container-type:inline-size;container-name:dsh-workbench;color:var(--w-text);background:var(--w-bg);font:14px/1.65 var(--dsh-font-family-content,system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif);min-width:0;max-width:100%;box-sizing:border-box;text-align:start;color-scheme:inherit}
580
- .dshw *,.dshw *:before,.dshw *:after{box-sizing:border-box}.dshw h1,.dshw h2,.dshw h3,.dshw h4,.dshw p{margin:0}.dshw h1{font-size:30px;line-height:1.25;letter-spacing:-.025em;font-weight:650}.dshw h2{font-size:24px;line-height:1.35;font-weight:650;letter-spacing:-.015em;overflow-wrap:anywhere}.dshw h3,.dshw h4{font-size:16px;line-height:1.4;font-weight:600}.dshw a{color:var(--w-accent);text-underline-offset:3px;overflow-wrap:anywhere}.dshw button,.dshw input,.dshw select,.dshw textarea{font:inherit;color:inherit;max-width:100%}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select,.dshw textarea{background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 11px;min-width:0;line-height:1.5}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select{min-height:38px}.dshw textarea{resize:vertical}.dshw input[type=checkbox],.dshw input[type=radio]{width:16px;height:16px;flex-shrink:0;accent-color:var(--w-accent)}.dshw :focus-visible{outline:2px solid var(--w-accent);outline-offset:3px}.dshw button:disabled,.dshw input:disabled,.dshw select:disabled,.dshw textarea:disabled{opacity:.5;cursor:not-allowed}.dshw label{font-size:13px}.dshw fieldset{min-width:0;border:1px solid var(--w-border);border-radius:8px}.dshw summary{cursor:pointer;font-weight:550;list-style:none;display:flex;align-items:center;gap:8px}.dshw summary::-webkit-details-marker{display:none}.dshw summary:after{content:'';display:block;margin-inline-start:auto;width:7px;height:7px;border-inline-end:1.75px solid currentColor;border-bottom:1.75px solid currentColor;transform:rotate(45deg);flex-shrink:0}.dshw details[open]>summary:after{transform:rotate(225deg)}.dshw details>summary+*{margin-top:12px}.dshw pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace;max-width:100%;background:var(--w-soft);border-radius:6px;padding:14px}.dshw img,.dshw video,.dshw iframe{max-width:100%}
581
- .w-page{display:flex;flex-direction:column;position:relative;padding:0;min-height:540px;gap:0}.w-page[data-main=true]{height:100%;min-height:0;padding:calc(24px + var(--dsh-frame-top-clearance,0px)) 28px 0 max(28px,var(--dsh-frame-leading-clearance,0px));overflow:auto}.w-page-header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;padding-bottom:22px;flex-shrink:0}.w-heading{min-width:0}.w-subtitle{margin-top:8px!important;font-size:14px;color:var(--w-muted);line-height:1.6}.w-header-actions,.w-toolbar,.w-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0}.w-header-actions{justify-content:flex-end}.w-body,.w-tabs-layout{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0}.w-body{overflow:auto}.w-tab-panel{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:auto}.w-tabs{display:flex;align-items:stretch;gap:20px;border-bottom:1px solid var(--w-border);flex-shrink:0;overflow-x:auto;scrollbar-width:thin}.dshw .w-tabs>button{border:0;border-bottom:2px solid transparent;background:transparent;padding:11px 8px 13px;white-space:nowrap;font-size:14px;font-weight:550;cursor:pointer;color:var(--w-muted);display:flex;align-items:center;gap:7px}.dshw .w-tabs>button[aria-selected=true]{border-bottom-color:var(--w-accent);color:var(--w-accent)}.w-count,.w-tag{font-size:12px;line-height:1.5;display:inline-flex;align-items:center;flex-shrink:0;background:var(--w-soft);border-radius:5px;padding:1px 6px;color:var(--w-muted)}.w-tabs [aria-selected=true] .w-count,.w-selected .w-tag{color:var(--w-accent);background:var(--w-selected)}
582
- .dshw .w-button{display:inline-flex;justify-content:center;align-items:center;gap:7px;background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 12px;min-height:36px;line-height:1.4;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;white-space:normal}.dshw .w-button:not(:disabled):hover{background:var(--w-soft)}.dshw .w-primary{background:var(--w-primary);border-color:var(--w-primary);color:var(--w-on-primary)}.dshw .w-primary:not(:disabled):hover{background:var(--w-primary);opacity:.9}.dshw .w-ghost{background:transparent;border-color:transparent}.dshw .w-danger{color:var(--dsw-alias-state-error-primary,#b43c3c)}.dshw .w-icon-button{width:36px;min-width:36px;padding:8px}.dshw .w-button svg{flex-shrink:0}.w-muted{color:var(--w-muted);font-size:12px;line-height:1.6}.w-section{padding:24px 0;border-bottom:1px solid var(--w-border);min-width:0}.w-section>h3{margin-bottom:12px}.w-section>p+p{margin-top:8px}.w-fields{display:grid;gap:16px;min-width:0}.w-field{display:grid;gap:6px;min-width:0}.w-field>input,.w-field>select,.w-field>textarea{width:100%}.w-status{display:flex;align-items:flex-start;gap:8px;padding:11px 13px;margin:12px 0;border:1px solid var(--w-border);border-radius:8px;background:var(--w-soft);font-size:13px;overflow-wrap:anywhere;flex-shrink:0}.w-status>svg{flex-shrink:0;margin-top:2px}.w-status-error{color:var(--dsw-alias-state-error-primary,#ad3636)}.w-status-success{color:var(--dsw-alias-state-success-primary,#24794a)}.w-status-warn{color:var(--dsw-alias-state-warning-primary,#8a5a00)}.w-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;max-width:580px;padding:48px 24px;margin:auto;min-height:280px;overflow-wrap:anywhere}.w-empty>svg{color:var(--w-muted)}.w-empty h2{font-size:20px}.w-empty .w-muted{font-size:14px}.w-empty .w-toolbar{justify-content:center}
598
+ .dshw{--w-bg:var(--dsw-alias-bg-layer-1,#fff);--w-soft:var(--dsw-alias-bg-layer-2,#f7f8fa);--w-text:var(--dsw-alias-label-primary,#18202c);--w-muted:var(--dsw-alias-label-secondary,#667085);--w-border:var(--dsw-alias-border-l3,#e7e9ef);--w-accent:var(--dsh-plugin-workbench-accent,#4f6bdb);--w-selected:color-mix(in srgb,var(--w-accent) 10%,var(--w-bg));--w-primary:var(--w-text);--w-on-primary:var(--w-bg);container-type:inline-size;container-name:dsh-workbench;color:var(--w-text);font:14px/1.65 var(--dsh-font-family-content,system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif);min-width:0;max-width:100%;box-sizing:border-box;text-align:start;color-scheme:inherit}
599
+ .dshw *,.dshw *:before,.dshw *:after{box-sizing:border-box}.dshw h1,.dshw h2,.dshw h3,.dshw h4,.dshw p{margin:0}.dshw h1{font-size:30px;line-height:1.25;letter-spacing:-.025em;font-weight:650}.dshw h2{font-size:24px;line-height:1.35;font-weight:650;letter-spacing:-.015em;overflow-wrap:anywhere}.dshw h3,.dshw h4{font-size:16px;line-height:1.4;font-weight:600}.dshw a{color:var(--w-accent);text-underline-offset:3px;overflow-wrap:anywhere}.dshw button,.dshw input,.dshw select,.dshw textarea{font:inherit;color:inherit;max-width:100%}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select,.dshw textarea{background:var(--dsw-specific-input-major,var(--w-bg));border:1px solid var(--w-border);border-radius:8px;padding:8px 11px;min-width:0;line-height:1.5}.dshw input:not([type=checkbox]):not([type=radio]):not([type=file]),.dshw select{min-height:38px}.dshw textarea{resize:vertical}.dshw input[type=checkbox],.dshw input[type=radio]{width:16px;height:16px;flex-shrink:0;accent-color:var(--w-accent)}.dshw :focus-visible{outline:2px solid var(--w-accent);outline-offset:3px}.dshw button:disabled,.dshw input:disabled,.dshw select:disabled,.dshw textarea:disabled{opacity:.5;cursor:not-allowed}.dshw label{font-size:13px}.dshw fieldset{min-width:0;border:1px solid var(--w-border);border-radius:8px}.dshw summary{cursor:pointer;font-weight:550;list-style:none;display:flex;align-items:center;gap:8px}.dshw summary::-webkit-details-marker{display:none}.dshw summary:after{content:'';display:block;margin-inline-start:auto;width:7px;height:7px;border-inline-end:1.75px solid currentColor;border-bottom:1.75px solid currentColor;transform:rotate(45deg);flex-shrink:0}.dshw details[open]>summary:after{transform:rotate(225deg)}.dshw details>summary+*{margin-top:12px}.dshw pre{white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.7 ui-monospace,SFMono-Regular,Consolas,monospace;max-width:100%;background:var(--w-soft);border-radius:6px;padding:14px}.dshw img,.dshw video,.dshw iframe{max-width:100%}
600
+ .w-page{display:flex;flex-direction:column;position:relative;padding:0;min-height:540px;gap:0}.w-page[data-main=true]{height:100%;min-height:0;padding:calc(24px + var(--dsh-frame-top-clearance,0px)) 28px 0 max(28px,var(--dsh-frame-leading-clearance,0px));overflow:auto}.dshw[data-main=true]{background:var(--w-bg)}.dshw.w-page,.dshw .w-body,.dshw .w-tab-panel{overflow-x:clip}.w-page-header{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;padding-bottom:22px;flex-shrink:0}.w-heading{min-width:0}.w-subtitle{margin-top:8px!important;font-size:14px;color:var(--w-muted);line-height:1.6}.w-header-actions,.w-toolbar,.w-actions{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-width:0}.w-header-actions{justify-content:flex-end}.w-body,.w-tabs-layout{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0}.w-body{overflow:auto}.w-tab-panel{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:auto}.w-tabs{display:flex;align-items:stretch;gap:20px;border-bottom:1px solid var(--w-border);flex-shrink:0;overflow-x:auto;scrollbar-width:thin}.dshw .w-tabs>button{border:0;border-bottom:2px solid transparent;background:transparent;padding:11px 8px 13px;white-space:nowrap;font-size:14px;font-weight:550;cursor:pointer;color:var(--w-muted);display:flex;align-items:center;gap:7px}.dshw .w-tabs>button[aria-selected=true]{border-bottom-color:var(--w-accent);color:var(--w-accent)}.w-count,.w-tag{font-size:12px;line-height:1.5;display:inline-flex;align-items:center;flex-shrink:0;background:var(--w-soft);border-radius:5px;padding:1px 6px;color:var(--w-muted)}.w-tabs [aria-selected=true] .w-count,.w-selected .w-tag{color:var(--w-accent);background:var(--w-selected)}
601
+ .dshw .w-button{display:inline-flex;justify-content:center;align-items:center;gap:7px;background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 12px;min-height:36px;line-height:1.4;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;white-space:normal}.dshw .w-button:not(:disabled):hover{background:var(--w-soft)}.dshw .w-primary{background:var(--w-primary);border-color:var(--w-primary);color:var(--w-on-primary)}.dshw .w-primary:not(:disabled):hover{background:var(--w-primary);opacity:.9}.dshw .w-ghost{background:transparent;border-color:transparent}.dshw .w-danger{color:var(--dsw-alias-state-error-primary,#b43c3c)}.dshw .w-icon-button{width:36px;min-width:36px;padding:8px}.dshw .w-button svg{flex-shrink:0}.w-muted{color:var(--w-muted);font-size:12px;line-height:1.6}.w-section{padding:24px 0;border-bottom:1px solid var(--w-border);min-width:0}.w-section>h3{margin-bottom:12px}.w-section>p+p{margin-top:8px}.w-fields{display:grid;gap:16px;min-width:0}.w-field{display:grid;gap:6px;min-width:0}.w-field>input,.w-field>select,.w-field>textarea{width:100%}.w-status{display:flex;align-items:flex-start;gap:8px;padding:11px 13px;margin:12px 0;border:1px solid var(--w-border);border-radius:8px;background:var(--w-soft);font-size:13px;overflow-wrap:anywhere;flex-shrink:0}.w-status>svg{flex-shrink:0;margin-top:2px}.w-status-error{color:var(--dsw-alias-state-error-primary,#ad3636)}.w-status-success{color:var(--dsw-alias-state-success-primary,#24794a)}.w-status-warn{color:var(--dsw-alias-state-warning-primary,#8a5a00)}.w-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:14px;width:100%;max-width:580px;padding:48px 24px;margin:auto;min-height:280px;overflow-wrap:anywhere}.w-empty>svg{color:var(--w-muted)}.w-empty h2{font-size:20px}.w-empty .w-muted{font-size:14px}.w-empty .w-toolbar{justify-content:center}
583
602
  .w-split{display:grid;grid-template-columns:minmax(240px,var(--w-list-width)) minmax(0,1fr);min-height:460px;flex:1;min-width:0}.w-master{min-width:0;border-inline-end:1px solid var(--w-border);overflow:auto;padding-bottom:24px}.w-detail{min-width:0;padding:26px 28px;overflow:auto;overflow-wrap:anywhere;display:flex;flex-direction:column}.w-master-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:20px 16px}.w-search{display:flex;align-items:center;gap:8px;border:1px solid var(--w-border);border-radius:8px;padding:0 10px;min-width:0;flex:1;background:var(--w-bg)}.w-search>svg{color:var(--w-muted);flex-shrink:0}.dshw .w-search>input{border:0!important;background:transparent!important;padding:8px 0!important;width:100%;outline-offset:0}.w-row{display:flex;gap:0;min-width:0;position:relative;border-bottom:1px solid var(--w-border);border-inline-start:3px solid transparent}.w-row-select{display:flex;align-items:flex-start;padding:21px 0 0 14px}.dshw .w-row-button{display:flex;flex-direction:column;align-items:stretch;gap:7px;text-align:start;width:100%;padding:18px 18px 18px 16px;border:0;background:transparent;color:inherit;min-width:0;cursor:pointer;line-height:1.5}.dshw .w-row-button:hover{background:var(--w-soft)}.w-row-head{display:flex;align-items:flex-start;gap:10px;justify-content:space-between;min-width:0}.w-row-head>strong{font-size:14px;line-height:1.5;font-weight:600;overflow-wrap:anywhere}.w-row-meta,.w-row-description{color:var(--w-muted);font-size:12px;line-height:1.6;overflow-wrap:anywhere}.w-row-description{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.w-selected{background:var(--w-selected);border-inline-start-color:var(--w-accent)}.w-back{display:none!important}.w-detail-title{margin-bottom:12px!important}.w-detail-meta{color:var(--w-muted);font-size:13px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.w-detail-footer{padding:24px 0;display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:auto;border-top:1px solid var(--w-border)}.w-detail-footer .w-muted{flex:1;min-width:160px}.w-definition{display:grid;grid-template-columns:minmax(80px,120px) minmax(0,1fr);gap:8px 16px;font-size:14px;margin:20px 0}.w-definition dt{color:var(--w-muted)}.w-definition dd{margin:0;min-width:0;overflow-wrap:anywhere}
584
603
  .w-switch-label{display:inline-flex;align-items:center;gap:8px;font-size:13px;position:relative;cursor:pointer}.w-switch-label>input{position:absolute;opacity:0;inset-inline-end:0;width:36px!important;height:22px!important;margin:0;cursor:pointer}.w-switch-track{width:36px;height:22px;border-radius:12px;display:block;background:var(--w-border);border:1px solid var(--w-border);pointer-events:none;padding:2px;transition:background .15s}.w-switch-track:before{content:'';display:block;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #0002;transition:transform .15s}.w-switch-label>input:checked+.w-switch-track{background:var(--w-accent);border-color:var(--w-accent)}.w-switch-label>input:checked+.w-switch-track:before{transform:translateX(14px)}.w-switch-label>input:focus-visible+.w-switch-track{outline:2px solid var(--w-accent);outline-offset:3px}.w-switch-label:has(>input:disabled){opacity:.5;cursor:not-allowed}
585
604
  .w-overlay{position:fixed;inset:0;background:#0005;display:flex;justify-content:flex-end;z-index:1000;padding:12px;overflow:auto}.w-dialog{width:min(620px,100%);max-height:100%;display:flex;flex-direction:column;min-height:0;background:var(--w-bg);color:var(--w-text);border:1px solid var(--w-border);border-radius:12px;box-shadow:0 18px 70px #0003}.w-dialog-header{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:20px 24px;border-bottom:1px solid var(--w-border);flex-shrink:0}.w-dialog-header>h2{font-size:20px}.w-dialog-body{overflow:auto;padding:20px 24px;min-height:0}.w-editor-grid{display:grid;grid-template-columns:210px minmax(0,1fr) 300px;min-height:500px;flex:1}.w-editor-list{padding:20px 12px;border-inline-end:1px solid var(--w-border);min-width:0}.w-editor-canvas{background:var(--w-soft);padding:20px;min-width:0;display:flex;flex-direction:column;gap:14px}.w-editor-inspector{padding:24px;border-inline-start:1px solid var(--w-border);min-width:0;overflow:auto}.w-editor-inspector h3{margin-bottom:18px}.w-preview-empty{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;gap:12px;aspect-ratio:16/9;min-height:180px;background:var(--w-soft);border:1px solid var(--w-border);border-radius:8px;padding:24px;color:var(--w-muted)}.w-content-pad{padding:24px 0}.w-stack{display:flex;flex-direction:column;gap:16px;min-width:0}.w-scroll-x{overflow:auto;max-width:100%}
@@ -912,9 +931,9 @@ h('div', { className: 'bar' }, h('button', { disabled: busy || dirty || activeJo
912
931
  locale = ctx.get?.('locale') || ctx.locale;
913
932
  }
914
933
  catch { } W.register(ctx,{id:'dsh-'+engine+'.workbench',label:()=>title,icon:engine==='hyperframes'?'layers':'play',component:Workbench,inject:()=>({locale}),order:engine==='hyperframes'?65:66});
915
- ctx.slots.inject('settings.section', () => ctx.slots.register({ name: 'settings.section', id: 'dsh-' + engine, order: engine === 'hyperframes' ? 62 : 63, label: () => title, inject: () => ({ locale }) }, Workbench)); }
934
+ ctx.slots.inject('settings.section', () => ctx.slots.register({ name: 'settings.section', id: 'dsh-remotion', order: engine === 'hyperframes' ? 62 : 63, label: () => title, inject: () => ({ locale }) }, Workbench)); }
916
935
  return { inject: ['slots', 'locale'], apply };
917
- } },{"name":"dsh-remotion","version":"0.1.0","hasWorkbench":true,"packageVersion":"0.10.4","label":"Remotion","labelEn":"Remotion","suiteComponent":true}));
936
+ } },{"name":"dsh-remotion","version":"0.1.0","hasWorkbench":true,"packageVersion":"0.10.5","label":"Remotion","labelEn":"Remotion","suiteComponent":true,"sectionIds":["dsh-remotion"],"iconData":"data:image/webp;base64,UklGRtRZAABXRUJQVlA4WAoAAAAQAAAA/wAA/wAAQUxQSLcXAAABDAaNpIjZ9S+7cEDzAiJiAni94dZr/V7YLxlvOL3zzon/4uNFDViDy4RLhO6Srxi5XKhrpAMabYQsbXBIR6tk4Z0NuMuwQClVLiX27XjA/s+QHf//XlXVJ7aTRbJIsrZt27Zt27Zt27bjrHmyjLG7wRSf1zVdXd3TmPPxJyJgwbYat3lClSxviuIgQIvVX9q1bbeNpEg6y4lvQpnfiUEF4FYb4jpA401EyIJtO0ql7UUmAxGTO4Wn3b/U5rv/9x9/YcL+C/kHxLkQURQJwVkbfKwQKWXNRVuawITwrtR18Kpb7XHoYQfsuulSXYhI8DYyJYqLt9PKh9z24YR/HXynWl84uBcx0QaCR0TUf48HfzSIndUqdsbB4Y+L+1Gbd1L8e+u6y7NT4WClVNoY6ztjlLL4fRfibQ5p1TrkolY4KKmNTXdaWlxZpzYttuy9f8Np6e1zNlMEN1JbdTFWjy314DxYqW3AOc/5N/AvLXFeG0VC0MCb5sIoY20mhEhjcxJtUVVL0RGTYOJrpyJxg9BOfNOVWNtzTVrxY9h6LItLh5U4rM0JBOOnzIPSthEXhMYIQayNOWzgS9AqXMzGl7ZiuSOI5DFYl0Tb4jf4HcGzjJIWAWekMmEm7G1eR6JN8Ycpp4KShQPs1HGvPf7wI8+8M36SBZzSKdAYxduOTcbpYv8wv1CVw+x3TlljUIufrZZ+a5/66t/1iEmStzFrwTYDnEX3Ilmo8VmYfMVQP0ex8wt38LFfQ+sw2VWItxFxxh6Ir5GAMbivPzEeCcaSGRNR/dTOlymXIP/kLUmEDTSx46w5770bMlCzaquOjo0OWTRxThv+BR2Aws4JsEiwYP6arlIu6PqE90tz1qYU8czMefEJMdU3PGzjQXjHDVppk2233WKVwR18k00zRUSHButb7eZsTC0sqwEy6kBrznEmAY3162CcqP9e94ye5tXSdtYPz5+4XNRUbXOC1ppjA9642ZtTlM0MxRK5PAI6mcV5wylmysveNQ0OMJ5hKj5UjjhpvuZpm2PU53vogLdqq1Sf/BmJwRvud/IZx26/6CeJbGp835G1UJ9bJFxsnwmJqtZhxqW9m6VtjtPtwYM0DqGWLPoI0RJnfTwLdecwayJMgkE9RhGt+CN0BkUtFll/26k5kqBNoYNXuCKDKM0Etd/+5blwMLLudED3NPjz3WuOm4KaCWukyUzVHC5vYawJpnUcXYcxxvfPsXS5QXDaaAScDehetI3h8/NzEU9MxuZa4cXOvlzKvDYr1qTCI6FsDBPvnTCIeHrGut/loJQJmmB4aPYxSTBmbJyHB2Jw0cRarBj1+gnahzEKu1CU7pcaW48FjW8bMDIyMOpiZMzFIkY9193n0L3X6R3/hptPeGz9HA9xKT2aHo9ovemxRJoBvNy24qWnMaEH0YDr/3IA3KTnthRNiBV/DJ2AxvShqRC01j9OZrC+coAIa8y4p8//LrbgS2kAfLEJcd5cbrFy/QoJKJycmsZp2UlQPi8NwchEhuIAm5BJtFJwN3aiZkIRneX/qrzwl57E0phS51FQ4dK10I1SV0zLcPtFPfLRoGZCnF6CCpiRr0oNBZ2HWgZ7s78Ao7hzmWqqGkb1bh7EqGtrQImwdjXiYS0roiHTYfzSM3pbkJfWLdFoqhJvtifWNMLFa9bU93pVxGhBLNzsHNGpkMHa1mpkzgfAJ4qSi0k0jauuAW19SNySLA2vamg/ePmlPAUr1N7mXtsDGCdXJN4ssGEQhyTBGa1+77czdbhoOYA4UyxLinMS91JL07A4eFKHL3TtmICgRZ4yAKw1WUuTEk4u1hlMHUgRbw7JQ2MjkrUe9vEhaP1J0FIbYxpoeuxh91mDl1doDiI4o5avoJP14eUUeX4H5WRYzCzO8T3Q3pi9o2dTEMEF3QSZ0CDxfXeKGKeV/k7KWiXBWp6WUho/b0dcNAO5WyV/XhI3xs0L9BakxypUMFk/3MNNZ8DosUY53NiZmgHdhnkBJfH1dTrQ+tDpnAK9Fmh4nLvJUpC0zPiVKWKV3939I9R0kuz4m9+DcQXB8bidamgPdHa9rqs+9XkZVilPM1QGcCZLzWqT1A3LR9RIWXtK9bvvcSaOmQwH59vMpZ9WtrWWkUrY3LjEJTVuY5xXv69R/8Pf/HEWTIOCVSaFmNzD4+hG4i5iVScmiNPSP0OHNYVjVOuWyILCQ+2rr4VEtPgP0AFFoYBdKkBR7Szy2b2PWKdnI8aqfqsvvzzdTzzWtl1NF1sYWd22opjlWcUa7q74xRh1/Pnz5eRODiBsNDwF5pmzWOS9iXi1wxs+X6KPEEqfgOeiAB7SLO++rZU4l6Iq6x5bYZjm5sg5hc7S/hupjsYYty2J6qZ1GOMpWuWp1ArVRqXW1fsymLV6ZUnQftCAy6FAgwKtaOUjwOc1fuhXXWPsBzEAqT94N0HWDIO6WT4MVUm8uHfM48Qres6y0mWsD7UO7aRYHez6OR+AwpEkqrl9MFTmn8da0oZcADXKAmudcf+sQLySuDgrnHYSudhB7aKsLQBhgxU+7UCsiriiDqtVFYBpbyPFnVs1iUuqmBTRyZBhpmIdsErVbj8KqWTs3OUrmCRofRhDfQXtTBttyh6J86i46vyh8HL1NllEPVoRozR+5tVjO5fVFDuOupSDqpbE6uHnplGbkT4EauAEGhMqJn0xTmca2AZBbWOA8r3Yeufx1kPSjLM7IFW4gTBOKUq3SVSqvUdoMVYE04ZUKRB0JaRJK7o4per7je04xTBjdHYDiQr5XaFMoBrNr5KDPu05Fp25edXpk8Bo/r+gM8tMhv/QAkv63VGGzrX1Ci8Sq0x4bUqPymB/Ae1pioUCsm7GrlmRgNPgaTBpUmJ/3fU1gshLNTTRXUFnD1cEER2dYmxN3KYY11UPIo9Jh3coYLtry1WDOD0KlaeWEMgy8W/SMtvz44nO7qsEGPFxibYGF5SQTWq7V8dHi1nE2NrKxKuAfpPgyxzsQisKojvTHGPMGQxK9RwTiQerAE4LzIARZrJ/M5UqnwDSx1oY9+/iFSBGvf7wWlpvGF2dc258X02ewjt05eyKagifn8Y4MLzsQqtQHKTlJlioIY2JA4lVROw6I2sleOtmFUik4zVKhRMqEHBaoWYnFi/QH2+f9LF7FVwXFdSXHe9pfNWxEsFV+BDWAG1mSKSCmPny9bHGruUPGHV6E4O88yPzqR70aj/qMcawGyEs86VX3yJWBaODkqr01LYfNfhxlzKvy3g8lELOwL1F3KHsuJOlF745DZkJQ/mhBZ6UhXgc9MBjbAxOilQK6XRC6nOJc0iUPTwtTes+gehogkmgEsiIoWfMHWNaSp7E6EOoVGXiJHsRtVMpJK2Ush1zmbt4yublDjgtE4842CQOpfqYCjk4g1WCiD5LDcbEaylaty/zIXkBUb29EoZF1j6GgdfaDSb2p6jMRpfTgt5zO7j9mIVD2Y6oqpSO6fVYnM5mZ3YoCcFLm7bELJjG8Djebj1tZgG5OPadAcwBsMb+c/kAYiUdqs/EGyGZw+j+hLGRLQnjshvPBGOn8rvVEAYmX7qwP6VR+W5xSuxd4IPPKZkE2apUiP3QJQooL9Mp8noJuOMt3VGjLP55dIMWfxyoiHiJ0had7puc0gDC84IKz8HUqcOpWmS4JisywnBs7rU30sKOOX/tnolW0vLgwQznJJixRh91EDKDm6DjV0AZwP75weP33HHKAsTuuc+0AeHHWBlcn4j2xntmnJah2kyBIEcVypGWxp/vZ9JKdMUio/YjkmPN06X/hEUZow6rAq1sjHXBfOmYXc0riy4q6PiwwrFcnoGEs0InI+lQCV3n7JFFKzdu+sAbhFG/P6C9Tg+0XIpwimO3vdlOoukjAAVmzkesHPqmdi5ouFTU17CfUtmqykCclROhaFQCMOr/G6yHPMA0Wd7lrsN0lVPFSB/K2Bhbjv06RdaZqVttdEqzv/UZBqKmMOxwrId8060UYTQSJmniapDnmk8Ie+qk9kE+G6Pt5uUIt0xvbNL5AhMAVbYNPvFkqkNTlqYITg9ApbWYZrjeZIe1fAmqnGW8tMaVpRC6GPX9E6YOb075UW5OXxPS2gWy64uA7uDWfEEfW44B2oK2Q/q4Yi8v+mPKnJK1fODflF0CgIUyaF2/JAP0W+hmyAbwMQZLiYR64Qio4XzUBrOv6E1RSTSuvt/7R8I0Bw9ayWaDeQ20LLbpwWFlmaAjokVGJzQu+P6Ar0rz8nOq0pFKzfYAhpLHxD7UwkrSw37F35NeMwMA4Uk0OqWPdnXSGaGGO6ilHIdx2nsWlG3chugagPZ4TKGKGaLqpobW+YmVI7Xj/TBZ9qpTmClmJpc9SgUNfluReDlSVxwB5dkaGwNPEc1bQPTySn0fm78E0iarxzqeX0tMpuQ5Q/NWGnFthnfXjctwo3qMbTkOOtY2M5cgHSQNFGFNpN8AHIHegbsYRSUYWdOyyRtwyrpAiNWkPyItTnkcq7B78WmMdhrpoHWoRAKn20PfZPxuSFxYOBhdA6dVHjxgjOHO6wtN5TQ7T48UDUEbQcl8VIjHWMD0Y+HqDRl3ofEZsaJxoTe2IL8/YfoPQaed12IwpT/xgnFeobDaGmyjfcGBYM+Op4gVi42h8oM3t4cFr2HlTOuOoqL7XryIWm4PwbAI00o4LKU/yjUa1wkmCj1twBgoZfKh4axEoeXNSIOAZ7pRkcRpwLOAzSPBGz9bGbRidwh4OXWq0QsXKn1yxtZ6qgZniqgHUkMruKezwfS+fl2pWOJEw496cq7NJ6iDta5xRxJcPTpz/UKJCVG/9L2YZzKzfy7NMNP+u8ueP1ptqjGtV7ACxluo30jvrUEqv8AB1pNhppCnbQ51VVWCabkY9X7YwgG6kd05CP4Yn1zbwGDlALH8sVjR9ifGaOkjb7vnBadMbpJwcWVLTZwnllGFtzpzHp9OT0CWQkiA/TAvsns7M49mKgsStxdvgOSRiKjj7XCm9DA10nIhZRGLTrzjsgR2qA0nQN8r+kL7tlm6eNummJ/7UjmaXgf9EQRukyUkT9YYairedCWJUuCuNFX0ChGBCLmlisUnvSRVPps+pARtEBHt5ne4v2yRQbO3IC/vv0H4s7OKDwQtMzPbZBvAXZCN4F5JFcCdjW9X+B2o51ioAHcIv1Tx2aHa7MP3AqaBLgjLzArEC/YdXoZKe8iYgsycZaDHsHjMrkDhmGI3BXV4HtLazM9YQGQ5jNKchXULfvaLH4sWUfc3fCtsPl6bzYosghnCY93A+zkl+7+YPRoyXz6Hkr4osSgnT6MxtjgITrvO8KeXDpm9NW4htxoqSbHVfNuc3ZR4eKjGyi1JFJXa9SYYFZR6J2et3fWvoR0MOoJp4jjkx2ZThhVyMhe04XdQuiEl2z6v33m2u1SYjxnflSo80TTzE/veLxWRJCg6W4euYTDr389nw/AdsMjQiNu0GJaYLRhYMfniViQK0LReD6dqPPrzg+QA+2Frd88H1PvYbIjC07lvRrTcLym2Fqc2+FpG3pYCFlGkN0r1mCVIs17DXeDqEtMGEcs5vtpUr69taPuHjp/S0NM+jEojmEwBHYfyGvUVrPnoNRvlu8lp6YlQ6ZMbP/D5Mvq7M9JOsdZFfAVW1B/C6EgFiYMoyvetWl9DZTDgHehQbiHEtFg/x91yN3Bgkf71UZRreCukTcUNNOjXz2Gr+xpiufDds8XM5BRweJ7gtJo2Jh13EJ3hP4wFNhx7ZDq2SS46XupGnngiA4dVeJMieh0qv9oO/vVZYhutxdU3JRk3L88GGE6Ds0wvYTB1EO02ASb9EUpfiiBzfHTCATS+zNP2JGgH6ExZv+4hWJN+RPbS/GriWEwJ9JG4ikTR3a6cddAm+fSId8qAwTP/UpDuhQaiDUyM7+PKEzcmFpWg0AEFlCKfICeE7QSkXCFNk29M3W7v7Tx54rpsf1zo6fae4tRMVK1DZ+syjVolV0R0eh0a33wozuGy3zViAV5NktuS05fXAfb9txKnXP9sDW0lzj8UMvzxDrHO3pPcjEIyra/xY85Njyx+p4hW2GNB7azLwuWmcfiVOGA30Z92jJu9dt5Kt6AzUVM4nJ6BzlI2c0ynrRWQGnargAvKNRbJKBxCUf7rahiBuXiaVp4H68OcV2ci0DzamaZtaOf00bi6AKMrp+G/Yq49gI6CbqBoDoQd7G6bnsB6r9WYEy72txMvxOa44s+w6oIzYWx2fwZXDR8l/zILhacKGnkuqN+1M+DQABeYdUwVgwqy08tYk2F/Fxe+WZB4Uf2t+l9sZZHGznt0J6IQdmbzp1rX+KIHsaI6XV7z+VECN08IdJMx2Q6exN1FBbScXDPOod8vT9VUIDyUxtYkitl9XQPtrWSaXZcIOBBCdGiMuo3uUEQSo/bfZG9msJqS+4hjoMhdP0vHaWmVraelyWjrzidkkWNnHlGIfzQ+YwUEEe0FZU+OFi4fW7rdh/+8KPjmVk/WKyAQdFamPQatc5BETyABTlG4xv5lkLiiEFycBQZzLq65YiDlFnqesMaHhZx5RhZojNgVOvzJ44lcYUNQADdl3TGxN7H8k/fNkqzwyCb59b6eLMnkyXFXBVFDhMPsocQLELu0nQavrOL83MzAoSj9rnCFA/Phe0HTyaXyByMxJtMj5l6ZgYSi7wG4RvN8KyvXHO6oUzEnAvq9uExsD0h6U0B34/F+OjGtP7EiZlpt/ZwGwaP9q1NSxWXNelxNDYwiYoXNNtdsJPwHcVLwJpz/VVZBP32O3lvv/L0ItCZubjoEyMo6JKgYugRGN0zoth7nd6Pe4qHiXoeFvV778LlQDXEV9NXnVva9MG52ce+lZxEt/wNkoIRdg3AO4BJBPCkcRaLIXvdDvoDUftVfGENMnO63eFKm6GFHgrreD6dU1jLCOvoPLHmPl2nMPYRE4QNv9/kDzkhdnprxMb0N+HylEszBJajn4aMcnGm4LjUNUdRe32CTwbStIxKsFCsqb7fOZaOtWV5Ywe4ha7IOMI9Qw20UiZIss4HVj3sLyjYIW6fcgbE6TzFb6cS0y3+E2pxKcEALLTXT6VxwqRuppkOrvMxcxgL+ei0nr1WulxBGdASUTmcbKbJELz5GHY3vl3geDoDLpZlh3EmtcR7tq0NJlO21W2fD+rOQplAhUkQbY+xWFG37+sS5c2Za03hcrkM9tj3/yqOX50yUcKlFf4YmY9JKaamyaFGFsLqAwzSOoRZO1GvY0P5vQjasZJxI7VhiyowyrjZk/lumwAHOOnjOJV7BerNnYRTs0ST8NQxzWvQvqAZV7NuI++u15SVdYTz1O/yFn/42sHP+eP+cLQ/7ENJmAA4OLhhppDbhFGnxfXLICOM8ovVnOx1NT5Z8MV7+fLYdBy+32gpDe3rzs32DWoab8PCy65xq6byHWkmpvFetaecw9cwuJMLcf6t5zv8e7BpeqMAadHjggeZCtKPFW6FMujiWEUqaxrxR2uGfa9a5aOQcBNycd44c4M0hzGWHGlRm/vRIh2qsPYGFFpUuaMHX4ZTOAOOx5wC0MgCU0iZr5ymlnMPvVywS27uH7XnB3c+8+tKTd5y98yKMPLlZybqtUCoTf9KnF8hri52g7gBPLZP+eNK4PV5JaTyeLJXWcS6khcOnl9bzB8RikfVfI+i13SdzWfvggO7EhIhYGqvnmaq/3o/CaWVS/6WNcWtWczWCnFOfE8b6lVAcc34WJr30xhw4JJz97f7N2lPffZ/4tQbMnqiR5tzEV49bQhAJHliHO/fPy879tx8N55RU3ks+pbIOU0/rVNnFGApGHdY68+nxk2oAIKf99O6tx67Xm9iiu1z02Lujxnz2yl0nrNHNq7WJui+2ykqL9llh38uf+nhc6+QpU/76/osXrj1s7d7+CsVz5f7tdn098L066JHH96/yciyZ932Lvkussd6Gay09qEOK1JMoTFHPG0t5jniXvv37924f+H3l/13Togff+9GPkyZNGPHI0ctFCf5U4UjEU3IRFwKPr5TMRphlMx7OJs99adkpX1TH3n26imaxYHmWWEB/mtzTiBTEfFesDJT4vtrE/+oo/PD+Tvr/fv3vP3+7QwBWUDgg9kEAANCoAJ0BKgABAAE+MRSIQqIhIRatDVQgAwSzN3C48Hgsz/AdhxjvzP5B+yBWX7j/Y/1f/ePdT1SdV+Vnz1/0/8f+bPzN/0vqi/TP/q9wD9YP+l/kvW9/bv3Yft/6hP2p/bv3gP99+4Hud/vP/G/ZL/d/IB/bf85/8fbL/7nsOf5H/rf//3AP2u///ru/up/5/k4/tH/G/df/w/IR+1H//9gD/7+oB/3+KA/lPoQ8GfzPg7+LfOv3L+7fs3/df2y+M3L31Wf6Hob/G/tz+B/u/7b/4T9xvlP/d+Dvxk/o/zb+AL8f/mP91/uH7Q/4j9rvp/+v/3XcJWX9AX16+gf5f/EfuP/mf3h9qn/S/uvqZ9lP+37gH8w/pX+j/vf7wf2v///WP/H8Fr8D/tv2k+AH+b/1X/Xf5z8pPpb/l/+f/nv9d+z3tc/OP8F/z/8b/r/2q+wb+Tf0v/S/3L/Kf93/Hf///3/d36//2Z/8Puj/rl/1/z/Q9gZGGv/6FR9dJ/8+1ulk7bujzoWrGMJLEgmFtRmZvHr/0Kj6yqSJZlBhzu0/zbO5RMXm8Zja3v/KRseqIqiK1Kq4JsaTHOp6ePrpPzoQbmngTV4S09kZ2U7FzGr/uMmcBlyaZryrURi7N76ywDy5E9Qqfb+zm02Q9C4m25dTCMcDOsBNqnDaAo9DqtDKbhMvndKzFekBXMnGnryjRf/0R3hv0+hZYVlF76NRKA7SwSJyVUcUlPw5vxwGHdpE/CJrbwhTUZwnPHrpPzz7gC6Nw/OG5YlP2VuKJmNd/The0cD6Y6loV8VuoULHpCJ9jEmJV+ZZ9tNypWE0aIVmt19r64fWzRFmMNbRtKuOoY/IxSYevM3cJXjfUOgzOaQ5FICgzGbDX6FoZD9H00fro/z3O36tpJWJWPyKQyaEI9dN+gFV4ZtlvkoOhfOHouz+R5rF/wzFFbngpSKZK3Kh8pUOOVIgdFcx0FNQIMJGSCplXJRIVULll4j2XdVwRmNCLxeN14TUn1Z+IeJ2xaMCXWFuZtQ8Jrfimhmur+RCFowf15NFiY0mFkusrPAv0n/GTNaTb4Zvc7PTzv/CLYxU82YaLpSHqUAO/Uw6xDWPkCJv2WifIbvp76f4V8uQz9N9ey4t+qGc4BenYgszLOxF0ElFhljIrPubFthJJjn6VpvJL823U5scVcE4vCeWRt6Kz3ED2w5NRb0EbPaFHZlY3dWAWkZwtrTuu8K3S8HowoLXwyN4ZT8HYzLNpwWQuc5Eohb2IfQ0+fwOHLa6B4TlF1BVoS+1uNVxRWRR4vHh8tSIBJ+gsMsuS59hn6pa41m/+q8CFwo+bI2E/Y9Chh3RqFXkYpN/Xb9ykRjsavIVPffQAV8d/1pWtGpq9ovorJyT/wXUbeyuHKrIg/xp6QrvuuQ5Hj3h7STNOKw4e/zVyN7uYGiAKRLGsPecmZVAMkzbvyquKrih1x7Z+8GcxEGIEF4i/uPmDasLbtFlFuVpmLIEatiEizDwtnzudocjPpUL/ChfWii+8E36EJsyltW9Nkako6ppM/g0lHu06/LxBh/nVNqlIoW4ptCOSIIylZlp4N6zvgR86lOa9Sn2neGg5tMTIoNDH5sD5+7e/F/rS1jq07Rj2rbTIzWYLqk0KF/WB9BLaoHZw4dbsagr4kvQv5q80UMXjCV1yAOaFnTACM80wQ/Sh0OpuNyDTlfepKcn1jXcFtUVC6VJZghHmEI6y3BsKlGnT4/v5UjcI215QIQ3xc4o9Bu+/nh89vh1tzeJkw3zKeajV7Of44NR/Zj/6pria3P6FR9dJ/9Co+uSAAD+/9JAAAHgw6XOmBEwfA1OyP8OPE0VXEbQeD0OeT2yN0IjBG9Q9hVjIPcozNknqobYwy3UH4Lkb8Zr5NvZEvuauAoKrumoE5yr9U3tE0c7ApLWipAbC87eAJI16VDvwmKSbv4gJCG85ycLS7FWZcbaTc8dkdXzhvgzitCDw2J6XVON+KaUcoFzxYhCzM81K1GEQJtUgR2BXIzBINvwW7fkulD+igi9ulQNt+/o9bmdasDswk0PBclPmaCEILtQ7pLA5idWDsM3Y2kfjxmM41QZ+oXa2wJR4gCdz6OlAlfACRaEvbyUDQ4eiPKSG61r4MNKhbyjDPdrSzPeJpm/j7icbZbLcvmPpQKQlKDHmp28ZZJn9+GxKXVXclr/5LMvY5hSfN6s9XjwYfS97rp4Ay1HO5IQDWdLzqTb3rDQWbjSQCq4iy5xsDz+jr0ceWjDUhp90+mW4wV8OXTuzVEzB4eUOdV98v0LA7RHR3/uv6mqdghrJ+itKHQdkvE6BNOb5TSlz5tJtIOxiaiSa99tPN7MDBuq6VUoKbmSjbhQNEa+uWpBtcfJ8BSf4HJAYMAzNvueNSgiPyDqPy7T25lUun7ZyZx0m+iUQzJO54sVr6z3LTAq7YZngEdvAsUnwl6ArNZgtpyXQcj0pjlVbojanD4DoonIf1HhqUf5cyeXdJ3e+mWQd8/U+C47sE1TGxxmlMcxi1qoPwJ3B4ji7w23NtVqbnoM2aIkCGqvHOV6U9qJc8kmdnrUi1XcgW0Z5iHAidba1XBM7Iu4i4iEisPJ6w+gryhfQv79R3xQb3sFY7E8zQgR1TYhLuI1gx+nYUxmyeuM1V+Vts6wCbhpsrsvfF1lh7zbiO8zv/loD8EyfaIkeba0MlQJen7Nv4P/gHB10jpivCTj/6zpfZOp/Pclo68UnGUE0POX7narsaKFFSxcbYyOn7curCZh72vNtfS3ZDYBDfIj2Y1wweDUG2Vm1IiJ1zTXPk4v31vI7zB3NfLbs3hxeLglnhXKI+BjLMnorMShRhUX5fsG1ZeKrQaLZ5DzEMgNtJ7e93xUI8HPKTswOm7nCH3HjJb1w4uCE1alaNEor85eqrqJRvt6ZNh5Am87QJfMbin0TanHN6tUe+hp09u9lCnvW9au2/XtClqucJ5bEGYPDNVwQDED3/KmeSau1nzt2Gq+gEfMvodnU8Hn3CFZIt+dPEOHVKOslbbS89Mp4Jugnrl7063b8GeAx9XNflOlvZTp5P1K0zzu/cLm4+2ecNHN6NBUcim5AHBSOd03VPpGFcr8zxb6HYYWGiDbzBvyz0YTfOhmXOA7m2vmZc9y9XzqBcVLU+HIXBrHLeHn1TXzmCP9FKy3oxghA8lWjX/OxXGSKT0q4SDF+ATyGr7i/VV51Q2W5bRBzEPpeDsCDbOeAFAQyOYaftbZDUkv9aIjuJUt89kr0IEvICYOCuxl37E7NKsswBQHfyebFzz+vZsd5cYLAYiv4/l8UZUHLMaoKknqbSfvQuqBKDxf+Nuu+iiThWdLUrxcBHHKDhk7LC90jVn5g0VN3Ggs8bsEu0aQsQ41weHKfhdBcYOSWwFeaQsk+qMggx3uFkjtxswA6/P4I6SAO2iHZPus1TGaakCjC6APnU7gZtO4VN8ke1piFrtIUr5P57bTF9MvWb3DBn+BhbkSwHqBCVt391l9WRlaYlfEj3nj9qwj5Js1JoKfN53le5tVgP+TWijOA2n68tdF3RDm1gLkOdv9Gv11wwm5MfgA5oy/xmV9dRjF7EaR+ddQnBE11AiQ1FOf/a6fGagUeRwGOBCW5pB174jDURUrJ+j7+TxC9Y8GeMh/U5levSfCmoOYA/9MdrJXAWUxo+CPiwgSRXWULUCuWphOFIC6dBRZKRNcjoKTYzsBMHjXpSXBYAktO+CGJnXOaK9Rcg5jvNr0MK35z+DDmm9CFsvvUWEdWm3CfW0krvyNM5D3rV7lPYkf3wnrner+qEH3j5ixslobTUfraVVBBbehI3xZcBCS+n6FlRACqpid7Qm2xU6NjFoHWlTys2VQaV5oksltyY5as7Ls/493f2JGkxa65QYNrl8W7JkGq3w8YQWccqQbMqQBnd0ZnhHjUyAj9ywV2D1pvTbgkoHwyCOJG2ohV9JAoOgODafBw4iwj4P9xPW/U9gB6B3IRSWOwg2zk6L3p4GYw55WFfVVz45uwpxPIw/kOgUlE83JAU7QnRorc7e9Q81Qi/dx0IZuyD4IYSTKnp9oJwzZWiIZpMnsA50qUlB86dDCJS+CtQOttWBogkDKB5tQKLRanGRYpcM+uOSVTmP1oWtOx9k07xVf0qVP4N/5JzTtVu4A0z25EbMlglbiPQiL9JXJLDy4PdgB4pYPCImn29FvpwSUE6wKr53zNQpoBrF/yCk2OpJL6S5+eoG8M6fwrHo7AiOkxnAcYEKJBLwQxWxPRXQPGo7oto/12+PcZ3sQ4O2u7gFlbXvLyJCo9u6lP0WEzij6JRRuUg9vVpcGlqnqmPuH5knUXtR4k/FOrsXey/kANp3HTbpDogi50pxEKnY+i6dz3cQf+0wugUxG5NHy8/QiFs5Uxfa4esy25NfenmG5UmUvd3y8jvPh7+DqL6EFn5QVM0UzarY/cOaHwyUH0wTrCTmo6T+7esp2x1MHBuP/lxIvP3UCseYazQ2WEAzvIqjKPtiDpvrh4vurwmiUVFWFhCFZDfkS5qra/TszQmpXqHqWasyMSsLZkPJpcDfKTm4qiEJpnXJpkrZdJ1D5HoFDEFVUqlSvppYc3Hs2Zc13Ixn3X7r2rI41Hsa6IfhMAi2aCgWYllcnQvxlYpUyvQhLYyctU/YbduxlC5fbAn97rI0O7d0NqHQb9alSOH6BxNuHCRq/MgXNNGAtgqzczHb9p0X4M76yZjN3VNVL8oDxBTQWoEFj8L6kDqt0yxY2d0SQdi6Xe25tSgO+29UQ08rQHjd21JAFiw9tr2TQRRPyiNaBVF8Fq+FtIciIE0wt5WUca6AAw8CU0sa4+H/Zme/oPZBlRlBgm08Wc1FIoQdjKHhgw0rVvIaN5SJ5optAON+c/pTk1mJY2iDKLH4TnYFNP2FiTv7XQpTH4HoVL6z7M52tTypcfBwzRGfVWieol1+1OtSaUh73BJEymPLlBUYUpqir3xWqDivf7V7h0o5s76Lf9J93raWWorooVuGk/OJc1vvb6WZ/FSwri9RcRh/flOIkw+o/VFLOXpkiNo2o021YsqwS0N4yBUpOquPWWlw34WlweMegC/CShXpxWt7nXooFdzLYuthBq8I2G1las02cRbO0YsI1Ix889Eg/E3fyLTnwEZrv9imuQUEv05e249DDAWrE3MIGN4tFuzgie8H/mH+jWwY2yllabqERXS16LoRMrm77g9oOojmjgIgjbsvxXzk+rJC4Oi7URqeBBmfxpJToR1MHKgsZIZA4w7uA1rkVjUlVssqg9cgTzNlXVC2ZXN5exdpGsh9LlEwHou0cBO/XZD/SXA1yhVpplEMeHZ6lMQCqvCH+Bl1MtuPgK4qQOHLxc4crPT46fBscn8B2m66QtBav0/mCZzKsFI5ZZTZYsiuTIgGXwbFf4bk3oozoogwgrx9wHYCqsQ8+CzWgWEHveXpZapBXAaN9sOd6uN1q6HxnLxDyGEEkd3uv5M7LX8KITcMmeVTFUhPJfI+t7OVdhDA9PpfwYXqX3/RTo9rwfoVeIgYyzaYvqu3jz1c9K3lRUNWDmFT29NjMnsdvAt3y6rAH+qY12QvAen0jiRKoMtu9PdApA/+Ne/TIbGprLqqpZiDEui3hOQJIpgzvAcyQz9EzxYa/sGfr5jEsU0kfwRX/rt1OwjYgX+jNkGs+/6CLUxc32Ux0ZP1xCF2QRyGYraZi+QzfikZmwA08o5wRvZWS/2Tf5A4AGyNB1HfA3RoqLppl8IToFmYVi75kQfJUzQVsirdDBLvEiQKrig1BqKAptaJN6HCJc6HmwFcAUGJ0JvSkXFN1WK4PQW7ZdwWCAJdgVl35Z1uTN7pwi3boQCpVWeFXQ2b7HDo2BefiXUIbYvetY+YZC7bERXKSeBXXAVP1EjSuxVsQ82QSguwaois0iMIxqPbcv44gV+rwDNJL6uGVS7Hh8UOtdjcns5TzMnQfyHhUMC5BKZ9Ct2X199aFXH+XPQjf4/1swZaiiZlxyl+5hb9mwn/FVT43Rq0+9+AT+5OZl4S+zfsW46dTG1tel30z2BDtu1S1W5rwax3rvO0lLdOSw2jhVvNMp/MthmoYah/s8gPTKZKoPFY1T/YpdZhK6k8fa0mnHKt/jm7RZZm1xr12JyaJfxtIusLv35Q5bgFP7dSN5XXQAIKsAJHAoEDLauIFCsvk8OuuKfSGjNoyNgjHRQA8Xd3R0FGIAUzf955PR35i9L54xZ6JoezA8w8sHPf8qV7TYelzS+k7kMBKU1UasM8BX94ovNGqhPH68ws6PpCjUyhf0o/Qo+0Pwthy1WtJ545QqYpwMxOSO1P1KuRLNimjzQ5AY35pEzrbEELzCBILSX5d0CwyIzO30XRT8e+rCgZGCAA2Cny9WWjBVKa6sauDrmHrE6ZS9m/y5HBlJ1ZR6qxqgftIlUnuoMxyavy2WkgZ3myIiN0Ft4ZN5HCSJvQA1gaumwLaBbrw9+RFDunwdPO/D82DpjtafgXXynHO1Vg9vFWjYu2za3/zY59MHDndalNsyIJ0Q93pbwp2nkR8sB7qZ/mP6JMm1FjBVY7pKIgcTvRONPSW89Q60uTDBMm7Xg/jtCSt4CJmPhYJinisnyKhQ+bNpMblRqIZ8UMBUaN4OubwNYIjUIq+PJZHkV8yX/3XvxzcGwNL6QwJ9opdWfom31FbUXz0UL9sUImgu2kSBgmJB0Dtyohux+COw1a8Kb5/rJcgtDYUFnXpQCRc9LT4shhI+l0NESvxnMoFX65/weKCy3Itdvt9aeNgqf/98mbz2rW1sLmUH8Yobww7RouwYnC/PIYDA0PWquTwJ2FQ4UPCYKLpaG2BviJNsFWW2XRniMeWkXdbNV0o237HecROSYYbafnwOs5DhyCJjD7fZobnpKcIU1BMCeTlYm7l+QaK1CthK7WiYpHEU+svR1xwFoWfwpdZLUY3nI0YXDM7NB8SMonNa2R7krC46DMk/BUffm02gP6ykIUptSDjzn8Y5HbRPOg97Y09VBE2If+nXW0eDxCn6Zs2kjOUlSCuyRrYLtY0xNPUVVN5jduLQOVJHttL5ZqZKailgNy66O0y4sksvdD51y/SIARtMKBqF61bYWnFOXes7FjxxVtkzZ6pXfb+d0L4vLcMyCf8LJ4lIzhdsuSeemrWIlvphj/HJ3FymoV1A7z6UPZAVTWHTGEanZW70xo/WQsOFAFEYwuZNU7wE8XMnn55yaqfgc/GpVkGODuB0FOl3FONhH3lDhRWj3aLtKt6kMpkdmOm0p3rA7jsMuIk/4dVjJXFZVcEBrd9NYGeS2XQ2RQbbTyf0P11IXqycAni6ygwaOM0r2wody6bFBil+BhfRjc3GWWs6GVze+Qs5DoxdEtHtiflwBaP67/yyf7kWwKgXbuRz7XT88c4Y9ufq/YZlCE3f78fc2WUlQklbJDRc5AkKys74hllazTLWnwsFktRl6pNmOZ91DolZWDe0oW+LLfxnL3g793PbqDoy6SIZhrMQRFBhBafFHvIsaxQ6P2gpiVDB9n2GfpFUMx9LJDN4pyg4kh84+B/1Zuf5DJj7QE88u7D++67o6KLZbLZTUFWsyWkLJonBEIcH1IkEmHzFKUnpiNFfXiOQJ3+L+5ireLkjW9ZFmpg2KPR/ji/SbxAOLPSxclkoEWhj/ba/BOd0qUduehGXb7y9Nvmma4FuVKATSfLmHS61uCnaJ9mJfM0GF7I7EAlsSntHz0vzyUKjdW8TcSY/Fl4SGnI/Xb4Hr3EdE/suN+CBP3j0nqwrvrPXiHWLra41871BOilOThZZM+nKyo9o8znNMKsqrHgJrtjUS4hXAd16w5X3RJbXQUJ7d4VXIDozFkFGATL9akWsokf0JuLmv3IuiYZ91g5SjGgYAdXiRkvu7AJrG6/o5pusqzDxDYnRaoZb4+tLs/oz9iC/XoLBUDOsKAgYIKCsWmnOTjkC/dWDVlb7ptzshiqNdPxEan6RS4DtwGxMTeg/oC4ciWI+tvRkroy6vVuF6tR/Fux0Q5N31nJtOeKMPdWEMnV1/qqC4sVerNoLxFFllUScWcXJQQL992rqfozcD8BT+SUtuFwPfgn8ZQSbQoRGLfbDXy9ccZkfdmQN+12FwO4IWwpdGRLEkf8F3lFYkC6ReOyVocfmdMtvYwfcoTJBssBpMoelpcNwUmwuS+L+tVuPl7rKLt5WBvUzD9D97YF+DsLc51dyQHJuGKpqzNnWFhtq4fRb00Um/Qy8gytae3zkvEe5f9t/dw/CxV49GsoQLoSZ4pVHob9wIl/SRUTTFJB2bQ5PxL+CZpBFc75cXQDwyExptJUqbXI27hx+FpvYRHtY5Eok/IHUYA0cYN/jm7qriKkN/WluNnG8W574MuNT6m9b8Po4XztYusP0lt6xyYI4747jocpsVK6IfrIQXeZXZILYPoLs3WG4wFjr18y5PdFbhmB1lL2QcGfzRz4Ma9KIGFdYP7XhZWqcBItBUbFgHggWTWDlvSVwzouVKpLhh8RtsyN5v4rUizyjoUwcmyDLgqJBIXRegbZ8YvxDV+TnPALEPO9BQkUQ9ebmwQx5rSfiaoK0mHjUSA9DFvDExcJ/sDns7+QbTkfC4EXU4NjT7fZt+vQEK6pW4MnnIR3CP5KdRzWtFkpIgOXOMxL+yhBI+1w6R+oyZy35KqvQiOKar/TgAobI5dVDdKzMIUlu3658jjXCYqqpb1r9kKaTfwGsQQAIFgg+N2V/oyGdoEgw9cX3LZgmzCTjpS7n02NrB3vPCE8xQj9tb6arnuKwEH04JIJrJFN7mWbA/mv1snuG2n++JD8QIjzZDOXFXKjo9CUk3aM2mYfVVUpyBLXJExCRQ2ldNaprvy4lA/lxEOAhfPdj0CgTDrsTFtL78TzKcoLdO9T8TNQPoHGiixLcVqFKp8Q2A0PQ/5tExFWaG2ePZB5DgrXzS69HW2C6PWr1km4G1Eyg/B6RmpTLZrE4aDxOJGW90WGS0Kn4AQjeVnK9Ah6W97dZzALX5HZ5AOYYVIfbpcQZ+cxZIyObMLyy+YJKy7RrDIKuMXW4EVBB2Pg7Ft5YpH8ZTbp5JQ8ZONxnS8LPkrPMYP0IxVkKCCihcfuJfHb3OupiRgXpWWe1rH/yXxvx7tynSY75Xl4hRC4dMnJvuW3MHMbpsTYVkhJAKJLF9HnZ5oTJ3m/Ol+mFB3JHUau/82TNrOWGsfLn2S/y4szCIK52GJPzmzIeshmI429n3RzB3PaaF+hz5z1/24uoopc4Qm58mE5BiMQnM5uSwgzqxyTSkLJ4annXGD/40rtRnbgxcRONSfVpgU7viLW86628IPQmlC8UumTRFyFhLpHA1pvQKtp55wzfAJr5OvILpUC5mEZaVKzrO00St0glsUKO0/jRN3v+cyT2Gl6TBxhb56zDG0+cbzYLLV3clDo4aBzOgaVxnGZQH6kT5yPvcm4vC/uzpjbWkDSPqPARzyWJ/T+xjDgRFawd5U+q9fxWLyw1jTmeEDQFhExL1WF+gvxwFRF0TH1P6AazQJkS5ogySEHguBoF8yaVAuLDzkPafOIy1zq02WIODHOthcGHHgRJKYrojC15j088jQUtzA3QE3OnUdXlSThJnva5rwarYG93MEvN6FG6VvdnDMMfxQSTQImC+nq2+Ys2fpeSu29+YT/TxrgVnJeLIqudLmv3toh6ER8cK+NeAu1qOnBdBScYtQz0vEX2AyRTxF5hN2cJ/PW6iVYPG09eFV3RdFvT3WzQxQgtK0wknW7qfpFK143y8Rbs8T0yJYIOSzLuVhXZr5bXkAXgj693k7D29lGN9aUvykLxTH5fSdX1TZXzcQqlwj5jb8D9STO4CfBrQHq6LpWg7cKvD3v53DOomS5JT+c37eZ/y6z5huZrijR4TKdEv6VJBvoIKVdPnNbUtG5PBydRyoI2KrEskcKJqAp7pKkOBeQRlakCm1SHiL3BI/WOmYYz18Gqe5SrUmGZ3csnoFsFUCKn+shKWaXHZSBNGFV8IqC/aYId3IG9xsyVmSrxL6/d/otuIte8tZ7ha7puUE/0bwjVg5zKWfs1230BEGvKm/NnH7EF7fXyMGBbfJT6kL7Ks5Cp+WV+gyH/+EP++fY568WUBovcSpKhNYfIJKPfeu3/LFfVRfJpmujdtiFRCh5wYb+KLBJO/HA0VIC4JYcK/1VZN8mujPUDrYbxJs/k+K+4PhKGLsUkpiSUwkTZf06er9cTXepOxl4plWfjZp+kpmCsrT5jkw7yq9Iz9onu61u9e+X9Ln3G4glnH97/UYgo41CzPOZrUbqGKmHkiXImF61RP+ItvF5oKM7zCdiL8pY5Ys+m2g9vTKfZj/HlQiUms68ddXAflgQzsy71IdpFtE5nIlauX+tisJxm/0Pf9284qV2KW/vZaMSHSFk/ry1shGDgHV5xPWFtNkV5HOh70ZwsviZNU3pebaTKg0qIQ2o0GKdn1y4qrm4DA2Hn7QN79fcwqvr6yizZ6icdFUL8smAqr1k88IcPZoHxoJ9psXBQ6efW6rEVqIQ/YfnzdwgXImSZ6lkPuvUBBcw7c4PzLhT74UbbUIxJRGbvn9NLedVSFfhfRKvedOAzH8siL75uhutx/D44D9gnnWlgum6PnzXBc27uHlBH5tjttBGYmN6AFcjAjOTYDTxCWNUbJ8G3g+1s3R3voxeWBboqiV/xAWDKBDx/ZfbQgIYKopBFEVnXEsx52+E5oeEvwdrBTYqSUv2HEITKIREUZbc4pn+Tdyu9g6XJ05m2PCz6Ti71KugniRyMWiwJYuVg4ZsKdjdI90REmqEeperOLRNYhx+16DCM1Xc4kNrCBI+r1Pt3bWEGOQkl8LI0AFUr3/eGHUdSwveVXp94W0b5uOsPJ41LeWTEJHcPE+nd6cCSCj0OJY+6Yci6NYTPQshbBHDd4LnO5f0UUmUnxfGit5CirQh/5Bhtlqv9BAAsYIYCjV2GaOksZm1eoKAEQWJpuhbHPb8OM9Hi3vXe/h4J2Wxuz3/aJqPtMmGMwjola6aKhH4DgvuIxONv2Rj6A94JQHY//TgxpQP9xQKmpyxDOQUfbEeuH6YrZ6XHC7POju73oBEd20ksz7xBQwzsU1eP6Z4/sWk0RbJBpdC1MKSE+mrP1exd7xYUQiq5AXm9Yk9HmYJ5TXgqWHaANnjhM+ruQL5ETLLUP1xk8dx8FOFdKmfHqZqeMJuzWR1t/nVsapfqK67+Yy7iL2ITbU2Z0kJ4iFHB4OVIPgqx1sgz0lqWy7GHNtnXuXPp08V3prQMx73aaFtmkSonVKb2ITRRBkVwZXK+cNlWeITVMVr1XV5zlXX3vjlkryJ1X918tPALXiFEps1/sTD9GQ3TREOAT0AqhWiS3AYebDXMqajaFLIF/MoDiSh6jBJWAy9WHglg401BC10WRuyrvoP6Yq4uR5x6plyVJmMXCH86K5AwTd5yru/GkyDU8a9Lv8PgKB5fOtwU4RAGRywc5iWJzNqj7GQQjDEGPkfv5lGmovMxuqPCaz/3q1Vo77pqo2YUN26KXfZLs72BkGxkWLE8KMvlA9uftZ/Lcs4jS0075/o4JtLIN+PgtlzahK61h/ZFuT0EXGIO53BQxSP3OmFKqSwEPPlccE0QHxb4xpHcat2YjxrQk0b9eF17TZBNFZpwUdSnlE/9t92Q8Bjy8UZYYfMYwZ3QSEEeXGM1LF/OVS4+s+8MU1NChSgIDK8cHeDl2IgwKARr9a1KJ7T4/Q8ozE3iG3/lafji70edGz5xTyezE0LU6d3vwFjnJJhRmK8uJGN93Au3vJO+grzEfi8Mzzn8eRX/AEE2k7r3FMT570B7XZLBt/5n7byFbueF67X/GnQrdX93kfz9qmlPDJ9U023/K4NMmOYG3OsSdjEvyNyxBY6J48gqn2l58RlkwUi4ZV6I8nBLyHvDJVqH4fnont/386sYJPC0RBkAGG2j/oa2srHBTPRIMAz6etVbwZtiel4BAVtThdYCpMckaFCgI6XJHGdTyeL2U4tdE2cxd91o50zhZyLu1Sltdqz6WwhQn3UURQ/0N2aoAqav6L4zk+QyRgxFWPOtNCzwrIHUFb/EFhvc3i6fjg/9xZ5SH5yrF93YjlTnRTsqm55lYyLwTwux7ZATIXiyHqLndqRv4uwSnnyS3Noxgu+OyQc9GxBmMD5EOg4KYZ5hF7Kpe+8RJHAkjbUn4QsZvho1ap2e3Jezjwb39f1hOhG6dPvlm7V1uzK9kZ+ZsbmMxzW+aGwMFlQb9IBKf8urtivTrPpYgeWdSZ6fLFh6P/XvuoJGX0pJ3YkpKaTEdmDsYY3gCANv4Cx+eK+rpWvC3d97M4qySK1GbiEa+l5VcsXEK2LesrxrOhuVqmZ1IxTxzmiqiUGDgDuNjo2OVFJB6mXrn1wj+edRRVGT3S27IuJca7uY8T0UxUj3R+9BcTKqS54AwPF1Tzd8iRNoEIx4d68g0e8QGeFBJGoDQz5XraQYgmjXp/8A0RyeYVCgf3uW4mLSsM7qXNwP+gW020LeRcS/YQI/dfStdxzIoCBngYE1bQbxlpjs8OMEn/r4QDrYmiUvXgorlFIlpB5oeLDVI/c7Z9kTB60FC+qPena+Ye2khFsvkZ91G8/NEKKbxH4GuTDW9zB5A1JucSssxw222FSOuKfUMVieeK0s/l20CHEgDuChpDUR2x67XOvu0eKdChl9ei2nAw4E1g0sF16aEXdWWc8GsfKPCuiBETu2StafHPAO0e3L7sOF8OZIGVHC5qx7Q+nZr0F7Q6kq7lJAlCmv11Y3vNAFTH7o13Akw9rx9fhfdfOgGbTx5WMBnqQhqK/UbdX9/zax2gOGp+6fDAreWwatrzzvwPw73YDg1+SgrFCGhtrmhQgI0LwThc/rvua4m880HgwdQYrcSV+NW33amXdCLdmqzAWz8o47cQStkpf/kmKBbrtExEVa3J87SR5MwDDXxyJhlJgU8VT4NdrXPb0nrt5Wx/7q1mAteUeld0iVzKqRB5dg/pp5i8Gr4RnwbAGg95GY1epfO5d7PHeb1tj40w+M4YzVT+jVSNcRg6Us0z/+w7C2Y+DHUhAKCvzeaZT/hMA02zODqooUAmYq3rkYhUyDP9hFOFccAfAIB0RgvmJvSx309pB5VTDV7Pya913iZCriQZ3oxlpzUeNuvYPRjKii4cKmQ2WKJjQppzABhlJQx4XJz++vtkraC2catcDC2B62GFu3C8kPX44LiESjLxtW1Y4la7shenCS6G1oJkFwCgZcvLPAJsIEdItwa8am7B/2YCHnCCs46ysHUcZbfDvtxCtEdxePUPjpIb3qiI5OXodqYpydrthyWokEPgmbLKUlWGKcQkZFlti4Q1HiCnYqEFnJdBucGkPXsbi7jxQtYjL8m93k1iR9jUSWWoZ3pPjoTB0gOL3qP4FUjQL7FFFj4AUxyJcHdWZA4IxMmKWbg1AWRHHEJt6hJgKF9wi2+UiXpu6hNYH4AICOhpiU5fBr41oEHfSu8vYPp+iMzSN0hUsTh3itkyotNAkCK09kljOYt4KA5OGqkRUUh8Rnjrl6O0sboI7SvqpTkSUUQwCebNSb5pkR6pRmy5ISDZvrKTthp/zWB4xfAYztPoSeGYYoIbyjjhMd3Z8ovw+6CKedmrsRpRdEYJDTvRyqEa11KnoTEsEV4VzAu/PZlXbjPo5uHUCEaX9EerU7TDZ7lAksty5J1M1lgAbTSC8QTa6/QZEuVG2iqrS+C2Ocn/YL5/S7WOg0ka3XZkw4hQbg4dFZqmYD21grbWxWl5zp9tAFWiHMewMK4GBFLupmkOgDas5ilXkKawJaMEvtpGdNMDpvwUCK1+JDsmr2LrQO9dX993BOIGS6qHqt4hPAkHj2iZRxmlPY1O32bR9VHxayiYcBuV6nBdG1Pzst/UUDDXapCu9jMgLGFFqwprKFkSQf07ojb5JlHrUJ2gNuvofCdagf1AxSGd4pXy1WeX9u8xfSVHGK0BGZk72sU+fdCu5nJTT3pOAib6PuS7fnur8/XM+2m7ZHkO3mhWTXrXdyMxMVb3WM2jvW441LHttqU9kE3AEfknfqyhEnMwphQ0KXADkCKYzl2e37F/tcY6p1i9G5PVhUoOpROpZyFfExQsCOY0SN+HxeoJsShxTbZbDNVN4da3Mu+PnOHG4GUi12v1NrgKnzm+ZmPipWEwtLEDWpZH3ZEsyhVliY+wnryoaRmddys2ZXr9cJcXj5zwzoEz+qVb9YWwmZtxz9WA4m2IhxypxipZ4BneOejJWL3HXmtILrcH1uM6aXP2ep/kHJOapJdqb//344DjXEz+AXSUsXc4Pi5Jds4PcUYzsU8ijP1TteRLY9pXsTUpLArAMxDWGYagytgwcp+9FyyRJPLD+QeIAwWGJmfXATcxwxngqYCvB6tgokD6zfeybUjt/cOY1yH67R6gXEr8MHDwLiUUskSbApyruyNZ/a88NZq0BL6QNU/N6EztV25bDL0bw/90fvjDwFSOcLpiXkkkB3CmrKDC+j9/QF4R5KIggS7dE2y1zymY11b/9Rps7f0hnHFGCSHdPlL8FTxn1LaN/OdQu852wxn+kwoRfqSo/OUIZUf03kOClev7fCauUo8ee7381IPNNGhScRQPqQbs0sEfYudG9YlzObirjRrLcESL+kDFhLqjFbqIFqunR8kqwxCpQgARiMJhuRUVXreVrs7EQPv9aFTX5akDDmomqwyY2P7CqbBxuWwmCPGQeU4lVrTDjtZn2pHL6JQctq1r90pmuM4pcpkGq6kAACKMTSVsF7rNf49CrAoWGrVh/vmgpX6Kf7a6gKZ69pxoW2EDcdRR4qtDuSn6L31ZBx6GpWRkH3VEjJMKbnBXaUsrp+l0Mnh7hx06YJcq8/NUEaNY69tiPqG32NGqJbHkatwR9VtXsq46P+6WoDBKF6vU4u71w9LpuvDKFzRyz+yFiNCewkYcvqQGB87hUtzOLqFFkLxt4nBKERNlFjam88jA9ygsxvG63ULnLppocl4gVWWMUMOHqjyY16KC0P3fUF64sLWDHq9K4H6vS3M82XHzJ+r5yZX9Rg6Wk/4tqbxou2IG2mPE90j1lElQ2NSDglfau7ZMxnf8wJACmiQ7QkFU+IcP5t5PftA/1LH4hsFvAj3ZlHKT0xVETkILjD9KO7AOu7/F2R88l4k8TCScWvcT2MWEAgE1AuFeXHkapz5zQqH1UiLaoipwX09OWVjmA6f8ovgfVIT0M52aXzGnKB5u108NiRsPIbnXOSh/el5Sph7oC1FQhxcMs4ex4UiodTj72J1Tc4Fnd2ee3npwg8smNRCIfT+Vu7gPVfLwtpYeH4NaH6xEtY4P9CubmoSnPPbw/H7uqdWWi8/D1AqISwp018X18ExlCPd9b2akTfUi/0oLuY2DJtaya+w054Lm1GyLac9bpTLtEsnx142H4GsWeQhEJvXPiTQLFjhlAygsPaSEvnlftEZHqbngzRcdl5zNecBuniz56bWf8dhvIHbyRjGOQ8k3W0h2awUNVd7xu1ttTQbZhIdnfvjMqO3cZd2tT9Ph74SmF+wj5hq2EYd0WeygGb9SBREdIEuG08bnnjoJu4dQhNXWPRHlhksK7H/rwxts7bBB9262j2BEAufIzYmk+n/yxjfrkiBgNWZyFa6tzPEzmKyOEB9GbLcxXouLnkKDm0FTJ88JL6Wjx2bM0k3caIcR077/dfRAExQOzgAlC3sz4081xKMGtOpSmV7eaMrkUF94QWnZVumbEJCRje20awgV43Q3mwOJ9XJJl86J8KNa/stY/nPSXVZRRcFI/vOXU4HYzAQUWJW9tIGXyUVVmgp3TT6wawrYpstOyT39uBpSU5xAfZTcNBkkYx1PyGGOtd4C8XJRCzgZ/94HsT/IPeLJWhqCmBwxgZZgXvkpPXNzVMgfjPX/9+gBBVZ6YILGnd0j+chgIuEXpWrUjfF2KWXavVhvAFP+IxhbzyZu9pJbDI5G0ESi7OpVOXibF0nZY9uSHNtvWvxwRCsYWRU67uK0+ffg0zpnSE/KOtqM8+ekrfzIMgHupbdOWZQUuasnOv4IcVoWxuf455cs6yBQbJcGv8Hys4cE8xsSvPB3/jNN2nlvmBwzt3l67+tpYqS5pZOo0CMLVOYxJuRVrmZ5zCOcAdVwkpnvMOjpky91nWrRx/ULjL4vJUYvW0nnIUuxTTY4YjrNkLEavGEX4g2TTSVjzL90DkUWpD+uGm38NcUDXKOBP7cRDnFGFKA3MpyUH3KPYHL04IzK7uSQtb1RD+fv7DtHVf3LAezIJQ1ZBM7tHyj+9r9Mmf5j88tfA5uoINoiRvXTKTlmJ/y/Hb8sC4U1uOtRN5PJ2MSn0ozY1qPPBbmHNOqn5LNeTfxOhzduwJ8xJ+UMLHLfC0mjZzcL1EzAepEZ1Hn82V4BcHoGdP+lKocf0Um0LEV3Gfxbr465o62aRIID2OKAkwO0/eGk8LGZC7bqWLNmkOfC25hfcY+fX+lKGx5NHwa3i3RL9yGnQKZSh9mF00iiZB+ruA415MRnsZTbVLz3KzeNqqldRFIO0+tVDslOTscEidjF7MUOEGJW+hb7IW5e6xBkha3iMFW14JYeouH2goijkMqvPgX6ooDH8PJAXmKFxxaK2Q1ArymeboHyTcmNUKsqmjcLr1P6/AzzdE+3TQw5ogFiUZ7ZRnLNBv5NbNvqmGzqxaRh/pG3AI2supXYLd+m5EXGlGFh7syLSk2J/+UlRX+kXwll/LkT2f53hqQ7f1J6H8pyVvAeppGV2z4L6kb2TZiTUiEHu9lPbFWcJIxlk0GRPyqdQtAoIJMMk842CqTUbjdVUZy57uuBiA0//3Z77yZ+erh+ubWlxku9l2jk52jr6GkoBvJpKNvyQyXNeH5etjY9sOVKtrCl5bGzgu4u61e0DK1nm3KXI+0MKRoOFpzXG792m8Ai0fa5nTtmb8897f5v/btz+GLcyla8H6401+5oIzQ+zRfrMMekl+n97jV3QMCYq77KX5ropE53l7iPVTSygt9May4sfYx6bS8Q520eEepY2ZiCJ+KamF44dP+m9H5DbEkXA6rqyt8b/95T0JOngQXAyHkNhDhKemJYtyqwfRARhN7wqu0RkWRH7FNWqGG5udUDT/C9F1tr87lhwxL04hbQPoFN+1Dq3Ez8lKDhGUPCAAaB5i3EMvu9Pw7LP8AQ2qGOUenXCPAde3fe/gIwGePppBUSO5s9UTEO7pJ8uBkABg/e7K9P6xLH8jJXVXRsVYSi9p1dhu7zUAYgaWWhkwjB5lEKlzPGj6Wzs0g1CrJSdaOmQdt0iaYBTYlJeBSIYxUH83nPBgpLd2QjsG4A3Q2njzUuDprdOcc5QR+P2PGJNjJg7xwCvsDEyglOlnPbqR7Hr4mK+7KUlzZYsJ3pMlXUkxQ1eNMhK9zrji4f19B4uM7pZBCtuXbzAkPHlrGToQ/K2KaYtHybzxnyUMVa2rcVviC3QF9Z1HAAEvsnOO7FEw52eYdagcOq8RDjSRq5SGfYK9+dsMfczlyPDZu5/LkGvMtzufvDM6nxahgxdfQe4cqGTqbESfVEWbXTMpfYtkRqjiuAOgpqrRgfEkkP6b0ETSKdKzEWLBrW+Cb7w6JXgzwPG23jr5ILjkBMGpWRKDZArcRQCw7SJh3YNi+oSLdFAXXo9YDAfJZpek+wpRrZougOyq0sH03g5kDtxZ6Dgbfj7NUZhyevWpfxPmQ28BVGNmeB4yin6asydRno+8agg1rlIpLAIq5tDLsjJo9D1YbTWruQibTEnXEiDRkD89Gk54pwpQany3UFxVKLq9GJy3+o5y7VXHZq5nWvlIEk3Fvl9NgLDg6h9eaoWsk+H4tSRRTac4eSy3mtznMSUsrzQ80LsVt5A7jdyEtRx4BihncsW+pQWb74jQlAAhS+BBHNhheNAlH+XSN8LkjJhZaPv0Ye8DsUeh0jUMMf1/eOPe2tKdFNM9KIq05FG8PSB/OMZjophR/P/DQef0G+GQapg3S05+Pdt/C0ipTNxQ8UZSIYBb8XiIE9yKF4q0+oJvj/P4tjmZWv+V0Z+4Oz9Jp+R6x1CDajQCqUZ2JjyuSuTKuQDp2gyq65kDxN+3Guw9o++LTxlbfujFBQ80HVj3ST26w5STCugyvQDee7SidxX5qubJ+SmvH8l78YCFoxSXV9IqtSB1LFl7HmM5cWPqFozHkDrwMxWOgLop2T6JN3jHFLxvs+CvsMpmntWxaJFe5m5heR+zVIiJi+zmKvPomGse1nMtKtrTko6yT+Swty2QiDTzRiT6w9czX5Sk90uH1+26dnPUUgvu0mK+WX7UasNDBAXVXcfwPSclJfDzzC85oqXYiYAfbOilZYrD8oDUFhbyMQCf8l4Mpz8Qst0v5AvRhBakx/NJPGSifUoXegBNns9AtMeyghrN1PneXc/HM2zlTodSC+WpKPwZjd6VDSpp1oIG/yYFOLc2RhtLptReIHyxq0vwuWf+pN3/xT0q9AnntNRrbGI9TdQs5lZ8rjS/zsGRBQiLiy+XVnkv4P7yg95Nz1pdjmqQhONWYl6n/xzn0MgHMkujEHCUZvsdBDre5sOLA2EN7suf0yaOmBetN7qYWZM9X2TMcXwwNAws3GSe/WjXPrWu46YzgXQ9ErLfCuhOJQUsXSIPNfhANVjdrCyVHX6dD35hB/9NpaUj5Q0/Z03uT//x6nyhJffd4yqujMoWND7qmdA8D+ppId80F78ceKiNVn8X1YrN+cgN2oBDDyi29/d9nu+n69DR4I+GEG3+JiWWNHvJriYMCU84DKi3tS+5+WZHH8JrDr5OaDJZBOs++4RCIbPvK6CNBQDtdbGXn0M1Cl2izgMzSwQ/3fNVuax+PWq04EmvFYgK7Q0orOGWknW3KC5LVYVmb/abJR53Wy0mj6DkvCwr42FLSdWbRLmoU8QtzTkIc5iH514c9nlISy5dX0uYx/u5FL/CGEDBM5wzFPppLp5+xPNYRJFjdU+ultAunVuP0n44q9Vq0amlZWCwV1jE/f3XBfZuvMYqec13UgJrU1YQzUrIqIV1OFeEy3pnompfd0YmTehxnR4T7QmOknYp4p8Dmr0mqbQn96e9A+SnRErTrkZHZlPtbvgYK1S0li95WHsLXGYM1rA4siZ5a58xOjCI59Yk/5qTDS+BCVyqhYcYI15LbqQ6/Ys0LLcCBYBaSc4bOYWgsmZRT9Ow7aabovv8+QrZaU9+tOt2tDz4z3WxyGfkCH+klXv5lSbmfKBIwpJdU0E0HgE41cyIowH82Bm0+eW8cRkQG3uOflB8BdbqtWmbaZ4LuOxpYQRNcoiYITmsioBzcJqydxQZE2UeC/BP5fY6H4WCwPuCehWSYo8pdD1mdj/qmc2zZ8Ehu7jp3ilUvcN+aIz5ufx7ssF97iDPHArdJnfaVTimZILBrN4+qxeoun09ZtGHjOI38Yim+K/yZKUSCyu6RFPiTfHfzLSPoO3IAsyLKc3wcUcpyWyJD+4iOkJdBJJwvl+Ly/WoJ+O2rAwQqf3Bvb5iNE+1+wjtA7B1vRWsp5GLxeB0msTifLrg/zA1QCU99ZC487Vhp8F/gDl763fcMTDphrAgZX1RjNaM3wDoTsJuQk5bjVhfVCV4hCR+Ra30E3pelM7tlmGBAN6oi3wmdumd5OHJLDaaS/b36dummzOY6xgnt17my1Fz8e0j2Qd2BLjPhh+jK7GXDTDyN3Pc2HLM838B8VbT5DPAhknzmJ3Q1yFZZqJGJiAjrpzdroN9qZYLA/dVR3JO0I+cJjkdeZvu+p1e+3skdNh8gyPixZGy+7q8SYslWSxeFmcbZqR+ZP/kEuN9bT0YihrYz1PmJelrIgHW/Y8G0eRsRXJLIO2iph7ErYuxOY1H1LK9+bVs1AFpX/sxHj4UVQl3Ac8AhyV2PMTrTFwagw22LNr5evKbHz28Oueq3pYiURIp/uKnPmcEe6dAie5i+PNBA5m7zP/vXITuAP71OzKW5/8Qm2RRsxn2N951ajsHfy7XTmses9Dc0ADgsaihC2WXI00xKfmuRP54eedDWnBSdXODn+BFupb9l09raWtsrruxk9QSXFEPMN/lfKQyQ9ldTt3Ga6Pls9Eevuj0sqHbZfs60SZ9mlYEmee8guH8GVeufgH4WYcJC10lo60Ub9iIpiJTZd8VIUCXo8ZFK2dDs/G1tsm51NM7kly0fldtLhl/BT4TZCGCaCKMhTtHImG3aRhqhTn0K99IIIQljbSsTxL+R0eTU2tXNldtGi4cGlr6ir8R3pq59kfqMQ8F0Kw07GK4YOiAzrBbYLjCo9O4+W/Azr55RTedXs0EeHoev/BNF4fTbO18PwngMU4ukl2yhCjMpD5517PAEjEnys41Nfem3hUmXYLTIgjQpfkD1ndeSw0LGpduXDPVk0mZTkcFkmbNKAp4wWv2rMeFPB0f49NWngn7vvkZEAEVWmbnE1TgNN6CQzaOCdXKhg5EFn0JCfsn8x1qT5C3Bct8pZV5Lbg8TFqS7q3AJRSEho7p1W4/GwaTaWfHwz3SRfQBAuIeVCudQnrhuwqKZ8i4TnHo1z4vR5tOBkpYfdD7urp88RxcxwBU8nXau4365C5YVW59GDRMECgG5gKSHS0VNdwBnZGr1VmkDZ8MOdrxOZz853C/EmzCrTI5cTfFGzfiLLYZKrSYfYFUZv0smyQs+xxl74l2PzpLZJRQvX+FpVEubjiyAFzrefmSZq6WD7OCfwoaWzb6pJRAD/0ZwPaG+esFTzChqhrw4GqTMDyHzA/SrNyY+3Z/XhMkRotEzi2YGatglXpnRbR65bvtZG4CRYaS6LX2HNZvFEkXfzNlOVA6LaalEEQZHyWsd7+S+MIFoLM8Q4c+cyYj+VezBSFG6CsRkShJGdf3diEmp8SasRPzz7hbGSE2PXJLfyY7uLtExUra8/4Kj1TKACoF1YrKfhzRbSml2YSuu9FLE8m0ar7AfKPIygdXGMqn4IMJ/HRanK/X0lzkwrwaadUDqW55/udwS2LY6NASpXUeJqrmICN1YCgWh957GewAYZo/gbCg7CtB8VBb2u88fHWhAC2yEW+F9eCl03YgWVQfoELZOuZgkrMp7HBVodKyMB9axAgCtGW75nwkV1WJpcbf7sUdtu7S/pZGru5Qa69CdB/STfDefuU2nOvXE+SpERAjm1suSOC09oG00A3/+nm1Jn7X+Izx/0gZQpQ91DNEJ3zhLuL4mee/f3xpKov3I9SZ9SHoj6O0ffHBWgBI+z7V0FUNeyAKWB5k31pMoOEAG/+lBSA5Daep8I1ONIHUXmX2PuJwOik7nYq5bHxQ61B/NxUR7kjscgKL54/cyPJjheNcu2HffuCbrYFM4KD0L7djXiNk8t8OQb+qQ7FRiu/5Mo9KnQLdvhCVr5y07W4PM1uTyhWvuPL20JRXivCmGWJRJ6aP4OFq0F6UY/ix7hltCdPt5I0Vr3nk5aXMgF/yrQO7wEurj6HY0CVSh6SJBb8c6nmo6/RPDAc2JFL72+RosJAaI2NOijz+GmDdcHK1LvpJfMJpuWy/8x1C3+ulq0GegUbQcMG11bgvrsu5cBxSWO+JR7ccaHpNb3/vdvc5IDD6h4pMdbvhnFbJ0vtUozJWLsbwNX7sV3oH+O6/oGDMzACGhnJi17tbXH/1bLipw922E/5jQZckBQTcD3XRJxUubmWfaNjKsec6w3vG58dEWijuDXOTt+wFCmqSHdAFCVQlwzn6kraE8ajrd1RNgZCFTfgY/eQS1EJkMFkzFAaRqtX2nBUPidELGA3WdyBSXyjdrz+/VUs6ZQzp4QfOstV7cFTMekarRsDfxsMClM4/4xt4n1uLd6Q0Lfo/THJWp/bJpsc/D1orjxJaDtr5R7pyFcxQexAryNSTFE2x9IPWSpHEGDpVvorr4xdW8+s2YXXkCooX4ezZuW5D+C8EEHvSvwmwxgX+mi6IGlbyxCSYfIcQkDgAC0XJicPBndLLnPvPjxz3p0ch/uoXXemQlKlxfPC/tydy7S5ViuR3zjskpf971ZrN0r1yNS8vqUz2Ce4ttmCS39/ZuIdIsVaNEzn1ZCjPhD8B+WHgeK8t5xcsPE2B9E22eaT4/Ggz0ljgYAh3l6kkmbrFVMklw/NnwVOZm+tZUX8LnLKy5dzZtUsE3I1wZoNEg4LXyfYYxOsR/kXt5aPZC0ye65zen9IbUjRe5iTY9wylKYyPzidOEnswIx/6XmcoP3AydrFKCsdLqia4phpYL4t2s2fgGw7m1+UugJoVUghXydtsD/DjTjMaowjkTlg49VxUX7ji0solhSmRthbkgOIMJUSKtvJHbiKqJlnTXnQAtTq0WRXmJQBI+kdAHQsqJKGLRCs5ETSaZoOFopEXP0fUF7ERc34uZdLJpdnP2v6tvhb20dMTuM+nAx1HPN41FpDsMqxc5N6ABUaGnU+6X/0SWWgsRG7MNlkYxmulo326R6HLi5BEC5H93RzJotstGMTACSBKoEXhBavNAH8AAAA"}));
918
937
 
919
938
  })();
920
939
 
@@ -32,7 +32,7 @@ function npmCli() {
32
32
  function childEnv(root) {
33
33
  const result = {};
34
34
  for (const [key, value] of Object.entries(process.env))
35
- if (/^(path|pathext|systemroot|windir|userprofile|home|appdata|localappdata|https?_proxy|all_proxy|no_proxy|comspec|programfiles|programfiles\(x86\))$/i.test(key))
35
+ if (/^(path|pathext|systemroot|windir|userprofile|home|appdata|localappdata|https?_proxy|all_proxy|no_proxy|comspec|programfiles|programfiles\(x86\)|hyperframes_browser_path|puppeteer_download_base_url)$/i.test(key))
36
36
  result[key] = value;
37
37
  return { ...result, ELECTRON_RUN_AS_NODE: '1', DSH_DESKTOP_NODE_EXECUTABLE: process.execPath, HOME: join(root, 'user-home'), USERPROFILE: join(root, 'user-home'), APPDATA: join(root, 'user-home', 'AppData/Roaming'), LOCALAPPDATA: join(root, 'user-home', 'AppData/Local'), CI: '1', NO_COLOR: '1', BROWSER: 'none', TEMP: join(root, 'tmp'), TMP: join(root, 'tmp'), TMPDIR: join(root, 'tmp'), npm_config_userconfig: join(root, 'local.npmrc'), npm_config_cache: join(root, 'npm-cache'), PUPPETEER_CACHE_DIR: join(root, 'browser'), HYPERFRAMES_NO_UPDATE_CHECK: '1', HYPERFRAMES_SKIP_SKILLS: '1', HYPERFRAMES_TELEMETRY_DISABLED: '1', DO_NOT_TRACK: '1', HYPERFRAMES_EXTRACT_CACHE_DIR: join(root, 'frames') };
38
38
  }
@@ -59,7 +59,9 @@ export class MediaWorkbench {
59
59
  throw new Error('请重新准备渲染环境,浏览器路径尚未验证。');
60
60
  const file = await realpath(value), normalize = (p) => process.platform === 'win32' ? p.toLowerCase() : p;
61
61
  const known = await Promise.all(installedChromePaths().map(p => realpath(p).catch(() => '')));
62
- if (!known.some(p => normalize(p) === normalize(file)))
62
+ const configured = this.engine === 'hyperframes' && process.env.HYPERFRAMES_BROWSER_PATH?.trim();
63
+ const explicit = configured ? await realpath(configured).catch(() => '') : '';
64
+ if (!known.some(p => normalize(p) === normalize(file)) && (!explicit || normalize(explicit) !== normalize(file)))
63
65
  await this.store.checkPath(file);
64
66
  if (!(await stat(file)).isFile())
65
67
  throw new Error('浏览器文件不存在,请重新准备环境。');
@@ -72,10 +74,12 @@ export class MediaWorkbench {
72
74
  const pkg = JSON.parse(await readFile(join(this.runtime, 'node_modules', this.engine === 'hyperframes' ? 'hyperframes' : '@remotion/cli', 'package.json'), 'utf8'));
73
75
  const stamp = JSON.parse(await readFile(join(this.runtime, 'ready.json'), 'utf8'));
74
76
  const file = await this.browserFile(stamp.browserPath);
75
- ready = pkg.version === version && stamp.version === version && !(this.engine === 'hyperframes' && process.platform === 'win32' && !/^chrome-headless-shell\.exe$/i.test(basename(file)));
77
+ const explicit = process.env.HYPERFRAMES_BROWSER_PATH?.trim();
78
+ const configured = explicit ? await realpath(explicit).catch(() => '') : '';
79
+ ready = pkg.version === version && stamp.version === version && (this.engine !== 'hyperframes' || (stamp.prerequisites === 2 && (process.platform !== 'win32' || /^chrome-headless-shell\.exe$/i.test(basename(file)) || configured === file)));
76
80
  }
77
81
  catch { }
78
- return { ready, version, node: process.version, hint: this.engine === 'hyperframes' ? '首次下载官方 CLI;Windows 使用官方专用渲染浏览器,其他系统优先复用 Chrome。还需 PATH 中的 FFmpeg。' : '首次下载官方 CLI。优先使用已安装的 Chrome,没有时下载浏览器。Remotion 使用官方许可证:https://www.remotion.dev/license' };
82
+ return { ready, version, node: process.version, hint: this.engine === 'hyperframes' ? '首次下载官方 CLI;Windows 使用官方专用渲染浏览器,其他系统优先复用 Chrome。还需 PATH 中的 FFmpeg 和 FFprobe。可用 HYPERFRAMES_BROWSER_PATH 指定已有浏览器;下载代理沿用系统设置;浏览器下载受限时可先手动安装。' : '首次下载官方 CLI。优先使用已安装的 Chrome,没有时下载浏览器。Remotion 使用官方许可证:https://www.remotion.dev/license' };
79
83
  }
80
84
  job(id) { const job = this.jobs.get(mediaId(id)); if (!job)
81
85
  throw new Error('任务不存在或 DSH 已重启。工程仍保留,请检查成品后重新操作。'); return structuredClone(job.view); }
@@ -167,6 +171,8 @@ export class MediaWorkbench {
167
171
  if (this.engine === 'hyperframes') {
168
172
  job.view.stage = '检查 FFmpeg';
169
173
  await this.run(job, 'ffmpeg', ['-version'], this.runtime);
174
+ job.view.stage = '检查 FFprobe';
175
+ await this.run(job, 'ffprobe', ['-version'], this.runtime);
170
176
  }
171
177
  const dependencies = this.engine === 'hyperframes' ? { hyperframes: MEDIA_VERSIONS.hyperframes, gsap: MEDIA_VERSIONS.gsap } : { '@remotion/cli': MEDIA_VERSIONS.remotion, remotion: MEDIA_VERSIONS.remotion, react: '18.3.1', 'react-dom': '18.3.1' };
172
178
  await writeFile(join(this.runtime, 'package.json'), JSON.stringify({ private: true, dependencies }));
@@ -176,13 +182,26 @@ export class MediaWorkbench {
176
182
  await this.run(job, process.execPath, [this.cli(), ...(this.engine === 'hyperframes' ? ['--version'] : ['versions'])], this.runtime);
177
183
  job.view.stage = '检查或下载 Chrome';
178
184
  if (this.engine === 'hyperframes') {
179
- if (process.platform === 'win32') {
180
- job.view.stage = '下载专用渲染浏览器';
181
- // ensure prefers the managed shell; path alone would fall back to desktop Chrome.
182
- // Avoid --force: the pinned CLI leaves its first spinner running after a forced install.
183
- await this.run(job, process.execPath, [this.cli(), 'browser', 'ensure'], this.runtime);
185
+ const configured = process.env.HYPERFRAMES_BROWSER_PATH?.trim();
186
+ if (configured) {
187
+ // An explicit operator path is validated before use, never downloaded over.
188
+ job.view.lines.push(await this.browserFile(configured));
189
+ }
190
+ else {
191
+ let available = '';
192
+ try {
193
+ await this.run(job, process.execPath, [this.cli(), 'browser', 'path'], this.runtime);
194
+ available = await this.browserFile(job.view.lines.at(-1).trim());
195
+ }
196
+ catch {
197
+ job.controller.signal.throwIfAborted();
198
+ }
199
+ if (!available || (process.platform === 'win32' && !/^chrome-headless-shell\.exe$/i.test(basename(available)))) {
200
+ job.view.stage = '下载专用渲染浏览器;可取消后设置 HYPERFRAMES_BROWSER_PATH 使用本机浏览器';
201
+ await this.run(job, process.execPath, [this.cli(), 'browser', 'ensure'], this.runtime);
202
+ await this.run(job, process.execPath, [this.cli(), 'browser', 'path'], this.runtime);
203
+ }
184
204
  }
185
- await this.run(job, process.execPath, [this.cli(), 'browser', 'path'], this.runtime);
186
205
  }
187
206
  else {
188
207
  const installed = installedChromePaths().find(existsSync);
@@ -191,7 +210,7 @@ export class MediaWorkbench {
191
210
  await this.run(job, process.execPath, ['-e', "require('@remotion/renderer').ensureBrowser({logLevel:'error',browserExecutable:process.argv[1]||null}).then(v=>console.log(require('node:fs').realpathSync(v.path))).catch(e=>{console.error(e.message);process.exitCode=1})", installed || ''], this.runtime);
192
211
  }
193
212
  const browserPath = await this.browserFile(job.view.lines.at(-1).trim());
194
- await writeFile(join(this.runtime, 'ready.json'), JSON.stringify({ version: MEDIA_VERSIONS[this.engine], browserPath }));
213
+ await writeFile(join(this.runtime, 'ready.json'), JSON.stringify({ version: MEDIA_VERSIONS[this.engine], browserPath, ...(this.engine === 'hyperframes' ? { prerequisites: 2 } : {}) }));
195
214
  }
196
215
  else if (snapshot) {
197
216
  const p = snapshot.project, dir = join(await this.store.path(p.id), 'runs', job.view.id);
@@ -275,7 +294,7 @@ export class MediaWorkbench {
275
294
  catch (e) {
276
295
  const message = e?.code === 'ELOCKED' ? '另一个 DSH 实例正在运行本插件任务,请等待完成或在那个实例中停止任务。' : errorMessage(e);
277
296
  job.view.state = job.controller.signal.aborted ? 'cancelled' : 'failed';
278
- job.view.stage = job.view.state === 'cancelled' ? '已取消;工程已保留' : /^官方 .*命令未完成/.test(message) ? '官方任务未完成,请展开运行记录后重试。工程已保留。' : /spawn ffmpeg ENOENT/.test(message) ? '未找到 FFmpeg,请安装并加入 PATH,重启 DSH 后重试。工程已保留。' : message;
297
+ job.view.stage = job.view.state === 'cancelled' ? '已取消;工程已保留' : /^官方 .*命令未完成/.test(message) ? '官方任务未完成,请展开运行记录后重试。工程已保留。' : /spawn ffprobe ENOENT/.test(message) ? '未找到 FFprobe。请安装包含 FFmpeg 和 FFprobe 的完整工具包并加入 PATH,重启 DSH 后重新准备环境。工程已保留。' : /spawn ffmpeg ENOENT/.test(message) ? '未找到 FFmpeg,请安装并加入 PATH,重启 DSH 后重试。工程已保留。' : message;
279
298
  this.log(job, message);
280
299
  }
281
300
  finally {
@@ -468,13 +487,17 @@ export function installMediaWorkbench(ctx, engine) {
468
487
  if (Array.isArray(value.projects)) {
469
488
  lines.push('已保存工程:' + value.projects.length);
470
489
  for (const project of value.projects)
471
- lines.push('- ' + project.title + '(版本 ' + project.revision + ')');
490
+ lines.push('- ' + project.title + '(版本 ' + project.revision + ';项目编号:' + project.id + ')');
472
491
  lines.push(value.environment?.ready ? '渲染环境已就绪。' : '首次预览或导出前,请显式准备渲染环境。');
473
492
  }
474
493
  else if (value.title)
475
- lines.push('工程:' + value.title + '(版本 ' + value.revision + ')');
494
+ lines.push('工程:' + value.title + '(版本 ' + value.revision + ')', '项目编号:' + value.id);
476
495
  else if (value.state) {
477
- lines.push('任务状态:' + value.state, value.stage || '');
496
+ lines.push('任务状态:' + value.state, '任务编号:' + value.id, value.stage || '');
497
+ if (value.projectId)
498
+ lines.push('项目编号:' + value.projectId);
499
+ if (value.state === 'running')
500
+ lines.push('可用 action: job 查询,或 action: cancel 取消;job 参数使用上述任务编号。');
478
501
  if (value.url)
479
502
  lines.push('预览:' + value.url);
480
503
  if (value.message)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-remotion",
3
- "version": "0.10.4",
3
+ "version": "0.10.5",
4
4
  "description": "DSH React 视频工作台:官方 Remotion 技能、工程检索、模板、素材排序、Studio 预览与 MP4 导出。欢迎提交 issues 和 PR。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -62,7 +62,7 @@
62
62
  "fflate": "0.8.3",
63
63
  "proper-lockfile": "4.1.2",
64
64
  "yaml": "^2.9.0",
65
- "@stardustlc/dsh-updates": "0.1.3"
65
+ "@stardustlc/dsh-updates": "0.1.4"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@types/node": "^24.0.0",