Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
7060279
docs: sync CODEMAPS/RUNBOOK/CONTRIBUTING to 2026-06-18 codebase state
DavidHLP Jun 18, 2026
14ca103
chore: rollup prior session WIP and shared typography migration
DavidHLP Jun 18, 2026
02fa0a9
chore: finalize shared typography migration across both apps
DavidHLP Jun 19, 2026
a7cbe15
chore: drop legacy docs and sync shared typography tokens
DavidHLP Jun 19, 2026
0adb72c
chore: move arthas-mcp-usage reference into docs/ops
DavidHLP Jun 19, 2026
fc2f450
docs: regenerate codemaps, contributing, env, and runbook from sources
DavidHLP Jun 19, 2026
17c3fc3
refactor: tighten description view typography with shared design tokens
DavidHLP Jun 19, 2026
78d82ef
chore: ignore local IDE tool state under docs vault
DavidHLP Jun 19, 2026
6092bc8
docs: add yaml frontmatter and chinese overview to contributor-facing…
DavidHLP Jun 19, 2026
5d64378
docs: add docs index and writing conventions guide
DavidHLP Jun 19, 2026
cc34144
docs: add architecture decision records covering verdict sandbox queu…
DavidHLP Jun 19, 2026
45ae051
feat(theme): adopt LXGW WenKai project-wide and add theme system docs
DavidHLP Jun 19, 2026
b77dd46
refactor(auth): align management auth views with terminal precision s…
DavidHLP Jun 19, 2026
c54e212
docs: share Obsidian vault config and selective .gitignore
DavidHLP Jun 19, 2026
99a0350
docs: add frontmatter to CODEMAPS snapshots and a CODEMAPS index note
DavidHLP Jun 19, 2026
e7e509c
docs(adr): convert cross-refs to wikilinks and complete the relation …
DavidHLP Jun 19, 2026
8652bc7
docs: migrate note links to [[wikilinks]] across index, theme, runboo…
DavidHLP Jun 19, 2026
a748ed7
docs: update DOCS_CONVENTIONS to govern the wikilink vault standard
DavidHLP Jun 19, 2026
4ad0aae
feat: add ctrl+key navigation shortcuts to site header
DavidHLP Jun 19, 2026
5b20ba7
chore: scaffold shared/auth-ui package and pnpm workspace
DavidHLP Jun 19, 2026
03dc11a
feat(auth-ui): extract auth components and layouts to shared package
DavidHLP Jun 19, 2026
db03439
refactor: rewrite 6 auth views as thin AuthLayout shells
DavidHLP Jun 19, 2026
bf2c1c6
test: add shared/auth-ui component specs covering props, slots, and c…
DavidHLP Jun 19, 2026
d56839b
docs(adr): record shared/auth-ui extraction as ADR-012 and sync index…
DavidHLP Jun 19, 2026
a974033
chore(management): normalize trailing newline in lib/utils.ts after c…
DavidHLP Jun 19, 2026
9d509ca
chore: ignore vue-tsc *.tsbuildinfo build cache
DavidHLP Jun 19, 2026
6c6a44b
fix(management): anchor AreaChart test data at UTC midnight and expan…
DavidHLP Jun 19, 2026
5e0d5e4
feat(management): add custom tooltip and crosshair to dashboard AreaC…
DavidHLP Jun 19, 2026
17520bc
feat(management): stretch dashboard and analytics cards to fill grid …
DavidHLP Jun 19, 2026
4ccabef
refactor: use nav.moderation in moderation queue
DavidHLP Jun 19, 2026
f3bdf0a
fix(moderation): wire resolved and dismissed counts into queue stats
DavidHLP Jun 19, 2026
f9c8d6b
feat(db): seed moderation queue, reports, appeals, bans and warnings
DavidHLP Jun 19, 2026
6aeb8f5
docs(moderation): add ops deep-dive for stats and seed data
DavidHLP Jun 19, 2026
31624aa
feat(management): add help page and global search palette
DavidHLP Jun 19, 2026
000d99e
refactor(management): tighten contest list transition timing
DavidHLP Jun 19, 2026
a8f17f7
docs: add project screenshots to README
DavidHLP Jun 19, 2026
146017b
docs: add the 8 README project screenshots
DavidHLP Jun 19, 2026
45305a3
chore(deps-dev): bump the console-development group across 1 director…
dependabot[bot] Jun 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ dist-ssr/
.eslintcache
.stylelintcache
.vite-inspect
# vue-tsc incremental build cache (replaces the stale `.tsbuildinfo`
# pattern that only matched the flat-package layout; vue-tsc 2.x writes
# `*.tsbuildinfo` next to each tsconfig.json).
*.tsbuildinfo
**/tsconfig.tsbuildinfo
**/tsconfig.*.tsbuildinfo
# 环境变量文件(含敏感信息,禁止进入 Git)
.env
.env.*
Expand Down
227 changes: 74 additions & 153 deletions .reports/codemap-diff.txt
Original file line number Diff line number Diff line change
@@ -1,153 +1,74 @@
Codemap Update Report - 2026-06-12
==================================

Files Scanned : 2038 (was 1923 — ↑115)
Java 735, Vue 821, TS 482 (excl. shared), test files 46
__tests__ dirs 21
Backend Java : 735 (was 708, +27)
Vue (both FEs) : 821 (was 820, +1)
TS (both FEs) : 482 (was 445, +37)
Migrations : 25 (was 20, +5)
Controllers : 43 (was 41, +2 — ProblemNote + SolutionTopic)
Modules : 26 (unchanged)
Shared Packages : 4 (unchanged)
Codemaps Updated : 5 (all)

Change Magnitude
----------------
Cumulative delta vs 2026-06-10 baseline:
Migrations: 20 → 25 (+25.0%)
Controllers: 41 → 43 (+4.9%)
Java sources: 708 → 735 (+3.8%)
TS sources: 445 → 482 (+8.3%)
Weighted overall: ~10-15% — under 30% threshold → in-place update.

Change Summary
-------------
[MINOR] docs/CODEMAPS/architecture.md
- Freshness header: 2026-06-10 → 2026-06-12, new file counts
- Backend purpose: appended ", notes, topics, etc." (new domain features)
- Data flow: +2 bullets (reactions / notes & topics)
- Migration listing: refreshed to 25 files; latest 5 listed
- New "Recent Architectural Themes" section (5 bullets)

[MINOR] docs/CODEMAPS/backend.md
- Controllers: 41 → 43, with new ProblemNote + SolutionTopic rows
- User-facing routes: +3 (problem note GET/POST, solution topics)
- Edge operations: noted LIKE/DISLIKE/FAVORITE expansion
- problem/ module: noted "notes NEW 2026-06-11"
- solution/ module: noted "topics NEW 2026-06-11"
- notification: noted "logical delete added 2026-06-11"

[MINOR] docs/CODEMAPS/frontend.md
- New "Recent Console Changes" section with full file list (10 modified,
2 new __tests__ dirs)
- features/sider/ note: AppLayout/SidebarInset refactored 2026-06-12
- Vue/TS counts refreshed (Console ~351/~217, Mgmt ~470/~265)

[MINOR] docs/CODEMAPS/data.md
- Migrations: 20 → 25, appended 5 newest
- Table groups: +problem_notes, +solution_topics
- Notification group: noted is_deleted + system→system_enabled
- Edge ops: noted enum expansion
- Relationships: +users<problem_notes, +problems<problem_notes,
+solutions<solution_topics
- Header: baseline tables extended to include the 3 new ones

[MINOR] docs/CODEMAPS/dependencies.md
- No dependency version changes detected
- Header refreshed to 2026-06-12
- All other content unchanged

Architecture Changes (2026-06-10 → 2026-06-12)
----------------------------------------------
1. PROBLEM NOTES FEATURE
- New `problem_notes` table (V20260611_140000): 1:1 user×problem, MEDIUMTEXT
content, FK cascade on user/problem delete
- New `ProblemNoteController` exposes GET/POST /problems/{problemId}/note
- Closes a long-standing gap: console/src/api/interaction.ts was
calling these endpoints with 0 server backing

2. SOLUTION TOPICS TAXONOMY (BUG-01 fix)
- New `solution_topics` table (V20260611140000): 8 algorithm topics
seeded (greedy/dp/binary-search/...)
- New `SolutionTopicController` exposes GET /api/solutions/topics
- 3-col composite index (is_active, is_deleted, sort_order) per MySQL
coding conventions

3. EDGE OPERATIONS REACTION ENUM
- V20260610150000 expands `edge_operations.operation_type` to include
LIKE / DISLIKE / FAVORITE (was: VOTE_UP/DOWN/ANALYZE/VIEW)
- Backward compatible: only ADDS values, unique key already supports
- Enables viewer-reaction display per user

4. NOTIFICATION PREFERENCE COLUMN RENAME
- V20260611120000 renames `system` → `system_enabled` on
notification_preferences to avoid MySQL 9.x reserved keyword
- Fixes BadSqlGrammarException in NotificationPreferenceMapper

5. NOTIFICATIONS LOGICAL DELETE
- V20260611130000 adds `notifications.is_deleted` + composite index
(user_id, is_deleted, created_at)
- Pairs with future @TableLogic annotation on Notification entity

New Artifacts
-------------
Backend (Java):
+ modules/problem/controller/ProblemNoteController.java
+ modules/problem/entity/ProblemNote.java (presumed)
+ modules/solution/controller/SolutionTopicController.java
+ modules/solution/entity/SolutionTopic.java (presumed)

Migrations:
+ V20260610150000__Extend_Edge_Operations_For_Problem_Reactions.sql
+ V20260611120000__Rename_Notification_Pref_System_Column.sql
+ V20260611130000__Add_Notifications_Is_Deleted.sql
+ V20260611_140000__Create_Problem_Notes_Table.sql
+ V20260611140000__Create_Solution_Topics_Table.sql

Console (Vue/TS, modified):
~ components/common/data-table/DataTableToolbar.vue
~ components/problem/ProblemSetSidebar.vue
~ components/ui/sidebar/SidebarInset.vue
~ features/sider/AppLayout.vue
~ views/personal/components/{LearningProgressChart,SkillRadarChart,
SubmissionHistoryChart,UserProfileCard,UserStatsPanel}.vue
~ i18n/locales/{en-US,zh-CN}/personal.ts

Console (new test suites):
+ components/common/data-table/__tests__/
+ components/ui/sidebar/__tests__/

Staleness Warnings
------------------
- shared/design-system/ contains only style.css; still flagged as legacy
residual across all 5 codemaps. Cleanup candidate (carry-over).
- console/src/api/recommendation.ts, console/src/views/recommendations/,
management/src/views/recommendations/ — still orphaned after backend
module removal (carry-over).
- management store count (470 Vue / 265 TS) is approximate — exact counts
not re-measured this session; refresh on next codemap pass for precision.
- Vue/TS counts for both frontends are estimated (no exact glob scan this
session). The previous numbers (Console 344/211, Mgmt 476/234) were
from a precise glob scan; use next /ecc:update-codemaps run to refresh.

Open Follow-up
--------------
1. Remove console/management `recommendation*` API + view files (dead code)
2. Decide on shared/design-system/ retirement (style.css only)
3. New test suites under data-table/__tests__ and sidebar/__tests__ — run
`cd console && pnpm test` to confirm coverage and add cases for
SidebarInset + DataTableToolbar variants touched in this period
4. Personal dashboard refactor (5 chart components + i18n keys) — verify
`pnpm validate:i18n-keys` passes once the refactor lands
5. Refresh exact Vue/TS file counts on next codemap run for precision

Diff Methodology
----------------
- Baseline: 2026-06-10 codemaps + previous diff report
- Scanning: `find` (Java, Vue, TS, __tests__ dirs) + module/controller
enumeration + migration listing
- Threshold rule: cumulative >30% delta requires user approval before
overwrite; this pass at ~10-15% was in-place
- Files re-read in full via Read tool before Write (per Write-tool contract)
# Codemap Diff Report

Generated: 2026-06-19
Previous codemap baseline: 2026-06-18 (commit 7060279f4)
Scan scope: docs/CODEMAPS/ (6 files)
Diff threshold: <=30% → update in place (no overwrite approval needed).
Special case: a7cbe154d (2026-06-19) deleted all 6 codemaps via "drop legacy docs" chore
→ full re-creation required (not a normal diff).

## Files added/removed/modified since last scan (codebase side)

### Commits since previous codemap sync (7060279f4..HEAD = 3 commits)

- a7cbe154d chore: drop legacy docs and sync shared typography tokens
- **Deleted** all 6 codemaps (this report's special case)
- Deleted docs/CONTRIBUTING.md, ENV.md, PRIVACY.md, README.md, RUNBOOK.md, SHARED_TYPOGRAPHY_DESIGN.md
- Deleted docs/adr/* (12 ADRs)
- Deleted docs/DOCS-SPEC.md, docs/contest/* (R-plans + reviews)
- Synced typography tokens across both frontends
- 02fa0a919 chore: finalize shared typography migration across both apps
- console + management design-system alignment
- 14ca103ba chore: rollup prior session WIP and shared typography migration
- composite rollup of prior uncommitted typography work

Net: **0 architecture/dependency changes** since 2026-06-18 baseline.
All 3 commits are typography/cleanup only. Codemap content drift vs 7060279f4 baseline ≈ 0–2%.

## Codemap re-creation (2026-06-19)

| File | Bytes | Token est. | Notes |
| ----------------------- | ------ | ---------- | -------------------------------------- |
| architecture.md | ~3700 | ~900 | ADR-008..011, 5 PM2 apps, full topology |
| backend.md | ~3300 | ~850 | 26 modules · 43 controllers · 588 Java |
| frontend.md | ~3600 | ~900 | Console + Management + shared/ layout |
| data.md | ~3600 | ~900 | 34 migrations, table groups, contest isolation |
| dependencies.md | ~3400 | ~850 | pom + both package.json + infra images |
| sandbox.md | ~3100 | ~850 | ADR-001/002 verdict codec, build pipeline |

Total: ~20.7 KB / ~5250 tokens. All under 1000-token target per file.

## Verified accurate (no drift) vs 2026-06-18 baseline

- Backend: 26 modules, 43 controllers, 588 Java files (matches ecosystem + source scan)
- Frontend: console (365 files) + management (348 files) — view/store trees stable
- Migrations: still 34 (no new migrations in 3 commits)
- PM2: still 5 apps (4 long-lived + 1 one-shot ulticode-init-db)
- Arthas: still 4.2.2 STATELESS
- Sandbox image: still ulticode-sandbox:latest
- Shared packages: still 5 (auth-core, theme, design-system, badge-config, sandbox-types)
- Docker images: mysql:9.1, redis:7-alpine, nacos/nacos-server:v2.3.2

## New dependencies detected

None — all changes are typography/design-system refactors of existing tokens. No new
runtime deps added. No new Docker images pulled.

## Architecture changes

None since 2026-06-18 baseline. Latest architecture shift (ADR-007 virtual contest
lifecycle + ADR-011 CRIT-6 shadow mode) is already captured in last sync.

## Staleness warnings (90+ days)

None. No `docs/*.md` file currently exceeds 30 days of age (all writes are within
the 2026-06 cycle).

## Follow-up (not auto-fixed)

- `.reports/codemap-diff.txt` itself — preserve last 2 versions for diff history
- If /ecc:update-docs is also invoked next, it will need fresh CONTRIB/RUNBOOK/ENV
docs (all currently missing after a7cbe154d)
- The 4 uncommitted local changes (incl. console/src/features/layout/panels/LayoutPanelHeader.vue)
are unrelated to codemap content; do not auto-include in codemaps until committed
- repo is ahead 4 of origin/main; codemaps are untracked files in working tree, not committed
17 changes: 0 additions & 17 deletions .reports/doc-update.txt

This file was deleted.

71 changes: 71 additions & 0 deletions .reports/docs-update.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Documentation Update

Generated: 2026-06-19
Trigger: /ecc:update-docs
Previous docs baseline: 2026-06-18 (commit 7060279f4)
Special case: a7cbe154d (2026-06-19) deleted the entire docs/ tree
(CONTRIBUTING/ENV/RUNBOOK/ADR/privacy/readme) as part of
"chore: drop legacy docs" — full re-creation required.

## Updated (re-created from source-of-truth)

| File | Bytes | Token est. | Source-of-truth |
| ----------------------- | ------ | ---------- | ------------------------------------------------ |
| docs/ENV.md | 11935 | ~3100 | `.env.example`, `.env.test.example`, `application.yml`, `ecosystem.config.cjs`, `scripts/dev/init-env.sh` |
| docs/CONTRIBUTING.md | 13635 | ~3600 | `package.json` (console/management/shared/auth-core), `scripts/dev/`, `AGENTS.md`, `CLAUDE.md` |
| docs/RUNBOOK.md | 15942 | ~4100 | `CLAUDE.md`, `ecosystem.config.cjs`, `scripts/`, `infrastructure/`, `.github/workflows/` |

Total new doc bytes: ~41.5 KB / ~10,800 tokens.

## Auto-generated sections (marked in-file)

- `docs/CONTRIBUTING.md` §5 — scripts tables (derived from each package's `package.json`)
- `docs/ENV.md` — every env var table (derived from `.env.example` + `.env.test.example`)

Manual sections (prose / narrative) are left intact and **not** wrapped in
AUTO-GENERATED markers.

## Flagged for manual review (90+ days)

None. All 9 docs files (`arthas-mcp-usage.md` + `CODEMAPS/*` + new 3) were
written/modified within the 2026-06-19 session.

## Skipped (not auto-created per skill rule)

The following were also deleted by `a7cbe154d` but are **not** auto-created
("Only create new doc files if the command explicitly requests it"):

- `docs/adr/ADR-000..011` (12 Architecture Decision Records)
- `docs/PRIVACY.md` (privacy policy)
- `docs/SHARED_TYPOGRAPHY_DESIGN.md` (typography design — obsolete post-migration)
- `docs/DOCS-SPEC.md` (old docs spec — obsolete)
- `docs/README.md` (docs/ index — top-level `README.md` is sufficient)
- `docs/contest/*` (R-plans + reviews — task plans, ephemeral by nature)

If the team wants the ADRs back, they should be recreated individually as they
encode the actual decisions and can't be derived from code.

## Other docs in tree (preserved)

- `docs/arthas-mcp-usage.md` → moved to `docs/ops/arthas-mcp-usage.md` (11.0 KB, 2026-06-19) — Arthas MCP usage guide; `docs/ops/` is the new home for ops/tooling references
- `docs/ops/README.md` (NEW, 2026-06-19) — naming + frontmatter convention for `docs/ops/`
- `docs/CODEMAPS/{architecture,backend,frontend,data,dependencies,sandbox}.md`
(created earlier this session by /ecc:update-codemaps)

## Verification recommendations

After this docs pass, the team may want to spot-check that the auto-generated
script tables match the actual `package.json` `scripts` blocks. The skill rule
"Always generate from code, never manually edit generated sections" means
future /ecc:update-docs runs should re-derive these tables.

## Staleness warnings

None.

## Follow-up (not auto-fixed)

- The 4 uncommitted local changes (incl. `console/src/features/layout/panels/LayoutPanelHeader.vue`)
remain in working tree; docs are untracked and not committed
- repo is ahead 4 of origin/main
- If a future task needs the ADRs back, run a one-off generation or hand-write them
5 changes: 3 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
| **[.claude/rules/](./.claude/rules/)** | Claude Code 按 paths 触发的子规则 (backend/, frontend/, database/) | 触及对应路径时自动加载 |
| **[.cursor/rules/](./.cursor/rules/)** | Cursor IDE 按 globs 触发的 `.mdc` 规则(codegraph、frontend-rules、springboot-rules) | Cursor 环境中触及 `console/`/`management/`/`backend-spring/` 时 |
| **[.claude/agents/](./.claude/agents/)** | 可调用的领域子代理 | 复杂规划、代码审查、安全审查、TDD、构建修复等场景 |
| **[docs/](./docs/)** | 架构、运维、安全专题文档(`CODEMAPS/`、`ENV.md`、`CONTRIBUTING.md`、安全审查报告) | 架构梳理、运维排障、安全合规 |
| **[docs/](./docs/)** | 项目工程文档。子目录:`README.md`(索引)· `CONTRIBUTING.md`(开发)· `RUNBOOK.md`(on-call)· `ENV.md`(环境变量)· `DOCS_CONVENTIONS.md`(文档规范)· `CODEMAPS/`(架构快照)· `adr/`(决策记录)· `ops/`(运维深读)· **`theme/`**(前端主题系统,6 篇:Token / 颜色模式 / 密度 / 组件原语 / 扩展;2026-06-19 新增) | 查架构/部署/合规走 [`docs/README.md` §1–§3](./docs/README.md) 的"先读这份"表 |
| **[docs/theme/](./docs/theme/)** | 前端主题系统(2026-06-19 新增)。4 层分层(state / tokens / primitives / bootstrap)、Design Token 全集、light/dark/system + compact/comfortable 切换、组件原语清单。**项目字体 = LXGW WenKai 楷体,全站统一(包括 Monaco 编辑器 / ECharts 默认字体)** | 改前端颜色 / 字体 / 密度 / 动效 / 组件样式时先读 [`docs/theme/README.md`](./docs/theme/README.md) |

子代理简表(详见 `.claude/agents/<name>.md`):
`planner` · `architect` · `code-reviewer` · `java-reviewer` · `security-reviewer` · `tdd-guide` · `build-error-resolver` · `refactor-cleaner` · `doc-updater` · `e2e-runner` · `rust-reviewer`
Expand Down Expand Up @@ -167,7 +168,7 @@ java -jar tools/arthas-boot.jar <PID>
4. **回退**:`./mvnw -Dtest='*IT' test -B` 跑问题单测/集成测试做对照(验证 N+1 / 重复添加逻辑时直接走这条)
5. 同步 MCP 阻塞 30s 时,**用 `mcp__plugin_context-mode_context-mode__ctx_execute` 跑 java 反射/grep 类检查**(后台子进程,无 MCP 超时)
- 见 `.claude/rules/backend/09-java-runtime-diagnostics.md` 的强制约束:阻塞命令必须带 `-n N` (N ≤ 5) 限制执行次数
- **Arthas MCP 实战手册**: `docs/arthas-mcp-usage.md` — 含 watch/trace/stack 真实调用样本(本会话 2026-06-18 验证)、OGNL 速查、降级路径
- **Arthas MCP 实战手册**: `docs/ops/arthas-mcp-usage.md` — 含 watch/trace/stack 真实调用样本(本会话 2026-06-18 验证)、OGNL 速查、降级路径
- **增强命令并发模式**: 后台 bash `run_in_background=true` 持续 curl 触发目标端点(选没限流的 register/GET,login 是 60s/5 次窗口会被拦截),同步发 `mcp__arthas-mcp__trace/watch/stack` 配 `numberOfExecutions=1` + `timeout=12`;MCP 客户端 timeout 30s,所以 arthas 端 timeout 永远 ≤ 25

### MCP 配置 (.mcp.json)
Expand Down
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,28 @@

**在线编程平台 (Online Judge)** — 一个功能完整的在线判题系统,支持题目练习、竞赛、社区讨论、成就系统等。

## 项目截图

> 想看更多视图、对比 light/dark 主题或下载原图:见 [docs/screenshots/](docs/screenshots/README.md)。

### 用户端 (Console · 9002 · light)

![论坛帖子列表](docs/screenshots/forum-list-light.png)

### 用户端 (Console · 9002 · dark)

![论坛平台](docs/screenshots/forum-thread-dark.png)
![论坛帖子详情](docs/screenshots/forum-detail-dark.png)
![UltiCode 竞赛](docs/screenshots/contests-dark.png)
![题库专题](docs/screenshots/problem-set-dark.png)
![题目详情 + 在线 IDE](docs/screenshots/problem-detail-dark.png)

### 管理端 (Management · 9003 · dark)

![管理后台 — 数据分析](docs/screenshots/analytics-dashboard-dark.png)
![管理后台 — 仪表板](docs/screenshots/admin-dashboard-dark.png)


## 架构概览

```
Expand Down
Loading
Loading