dsh-deepseek-account 0.1.5 → 0.1.7
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 +9 -0
- package/README.en.md +5 -3
- package/README.md +5 -3
- package/dist/client/client.js +30 -9
- package/docs/ARCHITECTURE.md +3 -1
- package/docs/releases/v0.1.6.md +62 -0
- package/docs/releases/v0.1.7.md +58 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.7 - 2026-08-31
|
|
4
|
+
|
|
5
|
+
- Stack sidebar footer actions vertically when official full-width actions such as Cordis Plugin are present, preventing the account entry from overflowing beyond the sidebar edge.
|
|
6
|
+
|
|
7
|
+
## 0.1.6 - 2026-08-30
|
|
8
|
+
|
|
9
|
+
- Replace the Harness settings gear with exactly one DeepSeek whale icon even when shell CSS overrides `hidden` or the settings row re-renders in place.
|
|
10
|
+
- Remove visible Provider quota headings and decorative sidebar backgrounds while retaining accessible labels and complete account details.
|
|
11
|
+
|
|
3
12
|
## 0.1.5 - 2026-08-30
|
|
4
13
|
|
|
5
14
|
- Group Codex five-hour and weekly quota data into compact visual blocks with stronger percentage hierarchy and secondary reset-time rows.
|
package/README.en.md
CHANGED
|
@@ -34,16 +34,18 @@ Requirements:
|
|
|
34
34
|
Install the current stable version:
|
|
35
35
|
|
|
36
36
|
```sh
|
|
37
|
-
dsh plugin --profile web add dsh-deepseek-account@0.1.
|
|
37
|
+
dsh plugin --profile web add dsh-deepseek-account@0.1.7
|
|
38
38
|
dsh web
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
In the current conversation's Web UI:
|
|
42
42
|
|
|
43
|
-
1. The sidebar footer shows account
|
|
44
|
-
2. The settings navigation
|
|
43
|
+
1. The sidebar footer identifies the current account source with its Provider icon and shows account details without decorative backgrounds; click it to refresh, or let it refresh once automatically after each conversation turn finishes.
|
|
44
|
+
2. The settings navigation replaces the generic gear in place with the DeepSeek whale icon; the “DeepSeek account” page shows CNY/USD total, granted, and topped-up balances.
|
|
45
45
|
3. “Sign in and top up” opens only `https://platform.deepseek.com/balance` in a new page.
|
|
46
46
|
|
|
47
|
+
When another entry such as the official Cordis Plugin also occupies the sidebar footer, this plugin stacks the footer actions vertically so multiple full-width entries cannot push each other outside the sidebar.
|
|
48
|
+
|
|
47
49
|
Continue to pin an exact version when upgrading so pre-release dependencies cannot drift:
|
|
48
50
|
|
|
49
51
|
```sh
|
package/README.md
CHANGED
|
@@ -34,16 +34,18 @@ DeepSeek Harness 的独立账户插件:在一个侧栏入口中展示当前对
|
|
|
34
34
|
安装当前稳定版本:
|
|
35
35
|
|
|
36
36
|
```sh
|
|
37
|
-
dsh plugin --profile web add dsh-deepseek-account@0.1.
|
|
37
|
+
dsh plugin --profile web add dsh-deepseek-account@0.1.7
|
|
38
38
|
dsh web
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
打开当前对话的 Web 界面后:
|
|
42
42
|
|
|
43
|
-
1.
|
|
44
|
-
2.
|
|
43
|
+
1. 侧栏底部以 Provider 图标标识当前账户来源,直接显示无额外底色的账户信息;点击可手动刷新,每轮对话结束后也会主动刷新一次。
|
|
44
|
+
2. 设置导航用 DeepSeek 鲸鱼图标原位替换通用齿轮;“DeepSeek 账户”页面可查看 CNY/USD 的总余额、赠送余额和充值余额。
|
|
45
45
|
3. “登录并充值”只会在新页面打开 `https://platform.deepseek.com/balance`。
|
|
46
46
|
|
|
47
|
+
当官方 Cordis Plugin 等其他入口同时占用侧栏 footer 时,本插件会让同一 footer 中的入口纵向排列,避免多个全宽入口互相挤出侧栏。
|
|
48
|
+
|
|
47
49
|
升级时继续使用精确版本,避免预发布阶段的依赖漂移:
|
|
48
50
|
|
|
49
51
|
```sh
|
package/dist/client/client.js
CHANGED
|
@@ -242,9 +242,8 @@ window.__ModuleLoader__.load({
|
|
|
242
242
|
function mountSettingsNavIcon(button) {
|
|
243
243
|
const existing = button?.querySelector?.("[data-dsh-deepseek-account-nav-icon]")
|
|
244
244
|
if (existing !== null && existing !== undefined) return undefined
|
|
245
|
-
const original = button?.querySelector?.("svg")
|
|
245
|
+
const original = button?.querySelector?.("svg:not([data-dsh-deepseek-account-nav-icon])")
|
|
246
246
|
if (original === null || original === undefined || typeof document.createElementNS !== "function") return undefined
|
|
247
|
-
const wasHidden = original.hidden === true
|
|
248
247
|
const icon = document.createElementNS("http://www.w3.org/2000/svg", "svg")
|
|
249
248
|
icon.dataset.dshDeepseekAccountNavIcon = ""
|
|
250
249
|
icon.setAttribute("viewBox", "0 0 24 24")
|
|
@@ -257,15 +256,37 @@ window.__ModuleLoader__.load({
|
|
|
257
256
|
const path = document.createElementNS("http://www.w3.org/2000/svg", "path")
|
|
258
257
|
path.setAttribute("d", providerIconPaths.deepseek)
|
|
259
258
|
icon.append(path)
|
|
260
|
-
original.hidden = true
|
|
261
259
|
original.after(icon)
|
|
260
|
+
const hidden = new Map()
|
|
261
|
+
const refresh = () => {
|
|
262
|
+
const current = button.querySelector?.("svg:not([data-dsh-deepseek-account-nav-icon])")
|
|
263
|
+
if (current === null || current === undefined) return
|
|
264
|
+
if (!hidden.has(current)) {
|
|
265
|
+
hidden.set(current, {
|
|
266
|
+
hidden: current.hidden === true,
|
|
267
|
+
display: current.style?.getPropertyValue?.("display") ?? "",
|
|
268
|
+
priority: current.style?.getPropertyPriority?.("display") ?? "",
|
|
269
|
+
})
|
|
270
|
+
}
|
|
271
|
+
current.hidden = true
|
|
272
|
+
current.style?.setProperty?.("display", "none", "important")
|
|
273
|
+
if (button.querySelector?.("[data-dsh-deepseek-account-nav-icon]") !== icon) current.after(icon)
|
|
274
|
+
}
|
|
275
|
+
refresh()
|
|
262
276
|
let mounted = true
|
|
263
|
-
|
|
277
|
+
const cleanup = () => {
|
|
264
278
|
if (!mounted) return
|
|
265
279
|
mounted = false
|
|
266
|
-
|
|
280
|
+
for (const [element, previous] of hidden) {
|
|
281
|
+
element.hidden = previous.hidden
|
|
282
|
+
if (previous.display === "") element.style?.removeProperty?.("display")
|
|
283
|
+
else element.style?.setProperty?.("display", previous.display, previous.priority)
|
|
284
|
+
}
|
|
285
|
+
hidden.clear()
|
|
267
286
|
icon.remove()
|
|
268
287
|
}
|
|
288
|
+
cleanup.refresh = refresh
|
|
289
|
+
return cleanup
|
|
269
290
|
}
|
|
270
291
|
|
|
271
292
|
function installSettingsNavIcon() {
|
|
@@ -277,10 +298,10 @@ window.__ModuleLoader__.load({
|
|
|
277
298
|
if (button.isConnected === false) { cleanup(); mounted.delete(button) }
|
|
278
299
|
}
|
|
279
300
|
for (const button of document.body.querySelectorAll("button")) {
|
|
280
|
-
if (mounted.has(button)) continue
|
|
281
301
|
const matches = Array.from(button.querySelectorAll?.("span") ?? [])
|
|
282
302
|
.some((node) => labels.has(node.textContent?.trim()))
|
|
283
303
|
if (!matches) continue
|
|
304
|
+
if (mounted.has(button)) { mounted.get(button).refresh(); continue }
|
|
284
305
|
const cleanup = mountSettingsNavIcon(button)
|
|
285
306
|
if (cleanup !== undefined) mounted.set(button, cleanup)
|
|
286
307
|
}
|
|
@@ -319,7 +340,7 @@ window.__ModuleLoader__.load({
|
|
|
319
340
|
}, wide
|
|
320
341
|
? React.createElement(React.Fragment, null,
|
|
321
342
|
React.createElement("span", { className: "dsh-deepseek-account-symbol", "aria-hidden": "true" }, ProviderIcon({ provider })),
|
|
322
|
-
React.createElement("span", { className: "dsh-deepseek-account-copy" },
|
|
343
|
+
React.createElement("span", { className: "dsh-deepseek-account-copy" },
|
|
323
344
|
SidebarDetails({ provider, state: currentState, presentation, t })),
|
|
324
345
|
React.createElement("span", { "aria-hidden": "true" }, busy ? "…" : "↻"))
|
|
325
346
|
: ProviderIcon({ provider }))
|
|
@@ -353,8 +374,8 @@ window.__ModuleLoader__.load({
|
|
|
353
374
|
if (document.querySelector('style[data-dsh-deepseek-account]')) return () => {}
|
|
354
375
|
const style = document.createElement("style")
|
|
355
376
|
style.dataset.dshDeepseekAccount = ""
|
|
356
|
-
style.textContent = ".dsh-deepseek-account-card{display:grid;width:100%;min-height:48px;margin:3px 0;padding:4px 3px;border:0;border-radius:8px;grid-template-columns:22px minmax(0,1fr) 16px;align-items:center;gap:10px;color:inherit;background:transparent;cursor:pointer;font:inherit;text-align:left}.dsh-deepseek-account-card:hover
|
|
357
|
-
style.textContent += ".dsh-deepseek-account-provider-icon{display:block;width:18px;height:18px;margin:auto}.dsh-deepseek-account-copy{gap:2px}.dsh-deepseek-account-copy small{overflow:visible;line-height:1.35;overflow-wrap:anywhere;text-overflow:clip;white-space:normal}.dsh-deepseek-account-quota-windows{display:grid;gap:4px
|
|
377
|
+
style.textContent = ".dsh-deepseek-account-card{display:grid;width:100%;min-height:48px;margin:3px 0;padding:4px 3px;border:0;border-radius:8px;grid-template-columns:22px minmax(0,1fr) 16px;align-items:center;gap:10px;color:inherit;background:transparent;cursor:pointer;font:inherit;text-align:left}.dsh-deepseek-account-card:hover{background:transparent}.dsh-deepseek-account-rail:hover{background:var(--dsw-alias-interactive-bg-hover)}.dsh-deepseek-account-symbol{font-weight:650;text-align:center}.dsh-deepseek-account-copy{display:flex;min-width:0;flex-direction:column}.dsh-deepseek-account-copy small{overflow:hidden;color:var(--dsw-alias-label-tertiary);font-size:11px;text-overflow:ellipsis;white-space:nowrap}.dsh-deepseek-account-rail{display:grid;width:36px;height:36px;margin:4px auto;border:0;border-radius:8px;place-items:center;color:inherit;background:transparent;cursor:pointer;font-size:10px;font-weight:650}.dsh-deepseek-account-page{box-sizing:border-box;width:min(860px,100%);padding:8px 4px 40px;color:var(--dsw-alias-label-primary)}.dsh-deepseek-account-page h2{margin:0}.dsh-deepseek-account-description{color:var(--dsw-alias-label-secondary)}.dsh-deepseek-account-panel{margin-top:14px;padding:18px;border:1px solid var(--dsw-alias-border-l2);border-radius:16px;background:var(--dsw-alias-bg-layer-1)}.dsh-deepseek-account-head{display:flex;align-items:center;justify-content:space-between;gap:12px}.dsh-deepseek-account-head h3{margin:0}.dsh-deepseek-account-head button,.dsh-deepseek-account-topup{min-height:34px;border:1px solid var(--dsw-alias-border-l2);border-radius:999px;padding:0 13px;color:inherit;background:transparent;font:inherit}.dsh-deepseek-account-balances{display:grid;margin-top:14px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px}.dsh-deepseek-account-balance{display:flex;flex-direction:column;gap:5px;padding:14px;border-radius:12px;background:var(--dsw-alias-bg-layer-2,var(--dsw-alias-interactive-bg-hover))}.dsh-deepseek-account-balance strong{font-size:22px}.dsh-deepseek-account-balance span,.dsh-deepseek-account-panel p,.dsh-deepseek-account-panel small{color:var(--dsw-alias-label-secondary);font-size:12px}.dsh-deepseek-account-warning{color:var(--dsw-alias-state-warn-label)!important}.dsh-deepseek-account-topup{display:inline-flex;align-items:center;color:#fff;text-decoration:none;background:var(--dsw-alias-state-business-primary)}"
|
|
378
|
+
style.textContent += "div:has(>.dsh-deepseek-account-card),div:has(>.dsh-deepseek-account-rail){flex-direction:column}.dsh-deepseek-account-provider-icon{display:block;width:18px;height:18px;margin:auto}.dsh-deepseek-account-copy{gap:2px}.dsh-deepseek-account-copy small{overflow:visible;line-height:1.35;overflow-wrap:anywhere;text-overflow:clip;white-space:normal}.dsh-deepseek-account-quota-windows{display:grid;gap:4px}.dsh-deepseek-account-quota-window{display:grid;min-width:0;padding:1px 0;border-radius:0;grid-template-columns:auto minmax(0,1fr);align-items:baseline;column-gap:6px;background:transparent}.dsh-deepseek-account-quota-period{font-size:11px;font-weight:650}.dsh-deepseek-account-quota-remaining{min-width:0;color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600}.dsh-deepseek-account-quota-reset{grid-column:1/-1;font-size:10px!important;line-height:1.25!important}"
|
|
358
379
|
document.head.append(style)
|
|
359
380
|
return () => style.remove()
|
|
360
381
|
}
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -68,7 +68,9 @@ await balance.read({ force? })
|
|
|
68
68
|
|
|
69
69
|
完成刷新只观察 `ctx.sessions.list` 已公开的 `current` 与 `running` 状态。同一会话仅在 `true → false` 时触发;初始空闲、重复空闲通知和切换到另一个空闲会话都不能触发。不要为此增加定时轮询或读取完整对话日志。
|
|
70
70
|
|
|
71
|
-
设置导航图标 adapter 只匹配插件拥有的中英文 label
|
|
71
|
+
设置导航图标 adapter 只匹配插件拥有的中英文 label,以内联高优先级样式隐藏 Harness 原图标并挂载唯一鲸鱼图标。它必须在同一按钮被 Harness 原位重绘后重新隐藏新的原图标,重复 DOM 通知不得重复挂载;插件卸载时必须断开观察、移除鲸鱼并恢复接触过的全部原图标及其原始样式。Harness 将来提供正式 section 图标接口后,应删除这个临时 adapter。
|
|
72
|
+
|
|
73
|
+
`sidebar.footer.action` 是 list slot,但官方 sidebar 容器默认使用单行 flex,官方 Cordis 入口本身又是不可收缩的全宽元素。本插件通过只匹配“直接包含本插件 card/rail 的父容器”将该 footer 改为纵向排列;不得依赖 sidebar 或 Cordis 的构建期哈希类名,也不得覆盖官方入口自身的宽度、定位或弹层样式。
|
|
72
74
|
|
|
73
75
|
### Optional Provider adapters
|
|
74
76
|
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
## 中文
|
|
2
|
+
|
|
3
|
+
`0.1.6` 修正 DeepSeek 账户设置项同时显示齿轮和鲸鱼的问题,并进一步精简侧栏账户信息的视觉层级。
|
|
4
|
+
|
|
5
|
+
### 主要变化
|
|
6
|
+
|
|
7
|
+
- DeepSeek 鲸鱼图标现在会原位替换 Harness 通用齿轮,而不是追加在齿轮旁边。
|
|
8
|
+
- 即使 Harness 样式覆盖 HTML `hidden`,或在同一个设置按钮内重新渲染齿轮 SVG,插件也会保持只显示一个鲸鱼图标。
|
|
9
|
+
- 侧栏不再重复显示“Codex 额度”“Grok 额度”或“账户余额”等 Provider 标题,由对应图标承担视觉识别。
|
|
10
|
+
- 移除展开侧栏卡片及 Codex 5 小时/每周额度行的装饰性底色;Grok 和 DeepSeek 信息同样直接融入侧栏背景。
|
|
11
|
+
- 可访问名称仍保留 Provider 和完整账户信息;插件卸载时会恢复 Harness 原图标及其原始样式。
|
|
12
|
+
|
|
13
|
+
### 兼容性与安全边界
|
|
14
|
+
|
|
15
|
+
- 图标适配只匹配本插件拥有的中英文“DeepSeek 账户”设置项,不修改其他导航项或桌面端代码。
|
|
16
|
+
- 本版本不接入 DeepSeek 网页登录、用量分析或插件内充值,也不读取网页 Cookie、账户密码或支付数据。
|
|
17
|
+
- Grok/Codex 仍是可选数据源,其认证、模型、设置和 RPC 行为不变。
|
|
18
|
+
|
|
19
|
+
### 验证限制
|
|
20
|
+
|
|
21
|
+
- 自动化测试覆盖高优先级隐藏原齿轮、Harness 原位重绘、鲸鱼去重、卸载恢复、图标-only 标题以及无底色账户详情。
|
|
22
|
+
- 已通过模块测试、构建和 npm 打包预检;真实 Harness GUI 视觉验收仍需安装并重启后确认。
|
|
23
|
+
|
|
24
|
+
安装:
|
|
25
|
+
|
|
26
|
+
```sh
|
|
27
|
+
dsh plugin --profile web add dsh-deepseek-account@0.1.6
|
|
28
|
+
dsh web
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
<details>
|
|
32
|
+
<summary>English release notes</summary>
|
|
33
|
+
|
|
34
|
+
`0.1.6` fixes the settings row showing both the generic gear and the DeepSeek whale, and further simplifies the sidebar account presentation.
|
|
35
|
+
|
|
36
|
+
### Changes
|
|
37
|
+
|
|
38
|
+
- The DeepSeek whale now replaces the Harness gear in place instead of being appended beside it.
|
|
39
|
+
- The plugin keeps exactly one whale visible even when Harness CSS overrides HTML `hidden` or the shell re-renders its gear SVG inside the same settings button.
|
|
40
|
+
- The sidebar no longer repeats Provider headings such as “Codex quota”, “Grok quota”, or “Account balance”; the corresponding icon provides visual identity.
|
|
41
|
+
- Decorative backgrounds are removed from expanded sidebar cards and Codex five-hour/weekly rows. Grok and DeepSeek details also sit directly on the sidebar background.
|
|
42
|
+
- Accessible names still retain the Provider and complete account details. Plugin cleanup restores the Harness icon and its original styles.
|
|
43
|
+
|
|
44
|
+
### Compatibility and security boundaries
|
|
45
|
+
|
|
46
|
+
- The icon adapter matches only this plugin's Chinese and English “DeepSeek account” settings entry. It does not modify other navigation entries or desktop application code.
|
|
47
|
+
- This release does not add DeepSeek web login, usage analytics, or in-plugin payment, and it does not read web cookies, passwords, or payment data.
|
|
48
|
+
- Grok and Codex remain optional data sources; their authentication, models, settings, and RPC behavior are unchanged.
|
|
49
|
+
|
|
50
|
+
### Verification limits
|
|
51
|
+
|
|
52
|
+
- Automated tests cover high-priority gear hiding, in-place Harness re-renders, whale deduplication, cleanup restoration, icon-only headings, and background-free account details.
|
|
53
|
+
- Module tests, build, and npm pack preflight passed. Live Harness GUI visual acceptance remains pending installation and restart.
|
|
54
|
+
|
|
55
|
+
Install:
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
dsh plugin --profile web add dsh-deepseek-account@0.1.6
|
|
59
|
+
dsh web
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
</details>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
## 中文
|
|
2
|
+
|
|
3
|
+
`0.1.7` 修复本插件与官方 Cordis Plugin 等全宽侧栏 footer 入口同时启用时,账户入口被挤出侧栏的问题。
|
|
4
|
+
|
|
5
|
+
### 主要变化
|
|
6
|
+
|
|
7
|
+
- 当同一 sidebar footer 存在多个全宽入口时,将这些入口纵向排列,避免横向溢出。
|
|
8
|
+
- 展开侧栏的账户卡片与收起侧栏的图标入口均使用同一兼容布局。
|
|
9
|
+
- 兼容层只作用于本插件账户入口的实际父容器,不依赖官方插件的私有类名。
|
|
10
|
+
|
|
11
|
+
### 兼容性与安全边界
|
|
12
|
+
|
|
13
|
+
- 不修改官方 Cordis Plugin、其他插件或 DeepSeek 桌面端代码。
|
|
14
|
+
- 不改变 DeepSeek、Grok 或 Codex 的账户读取、认证、模型、设置及 RPC 行为。
|
|
15
|
+
- 不新增网页登录、用量分析或插件内充值能力。
|
|
16
|
+
|
|
17
|
+
### 验证限制
|
|
18
|
+
|
|
19
|
+
- 自动化回归测试覆盖官方全宽 footer 入口共存时的纵向布局,并禁止依赖官方私有类名。
|
|
20
|
+
- 已通过模块测试、构建和 npm 打包预检;真实 Harness GUI 视觉验收仍需安装并重启后,在 Cordis Plugin 启用状态下确认。
|
|
21
|
+
|
|
22
|
+
安装:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
dsh plugin --profile web add dsh-deepseek-account@0.1.7
|
|
26
|
+
dsh web
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
<details>
|
|
30
|
+
<summary>English release notes</summary>
|
|
31
|
+
|
|
32
|
+
`0.1.7` fixes the account entry being pushed outside the sidebar when this plugin and full-width official footer entries such as Cordis Plugin are enabled together.
|
|
33
|
+
|
|
34
|
+
### Changes
|
|
35
|
+
|
|
36
|
+
- Footer entries are stacked vertically when multiple full-width actions share the same sidebar footer, preventing horizontal overflow.
|
|
37
|
+
- The expanded account card and collapsed icon rail use the same compatibility layout.
|
|
38
|
+
- The compatibility layer targets the account entry's actual parent container and does not depend on private classes from official plugins.
|
|
39
|
+
|
|
40
|
+
### Compatibility and security boundaries
|
|
41
|
+
|
|
42
|
+
- This release does not modify Cordis Plugin, other plugins, or DeepSeek desktop application code.
|
|
43
|
+
- DeepSeek, Grok, and Codex account reads, authentication, models, settings, and RPC behavior are unchanged.
|
|
44
|
+
- No web login, usage analytics, or in-plugin payment capability is added.
|
|
45
|
+
|
|
46
|
+
### Verification limits
|
|
47
|
+
|
|
48
|
+
- Automated regression tests cover vertical layout alongside an official full-width footer action and prohibit dependencies on official private class names.
|
|
49
|
+
- Module tests, build, and npm pack preflight passed. Live Harness GUI visual acceptance remains pending installation, restart, and confirmation with Cordis Plugin enabled.
|
|
50
|
+
|
|
51
|
+
Install:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
dsh plugin --profile web add dsh-deepseek-account@0.1.7
|
|
55
|
+
dsh web
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
</details>
|