:root {
  color-scheme: light;
  /* 底色一律是白。灰只以发丝线和小控件填充存在，不再有成片的灰块。
     此前页底 #fafafa、表头/榜单条/筛选条各铺一层 #f5f5f5，
     整屏就成了深浅不一的灰斑拼接 —— 这就是"脏"。
     分区改由一道线加留白承担，颜色仍只留给语义：涨跌、成败、告警。 */
  --bg: #ffffff;          /* 页面底 */
  --surface: #ffffff;     /* 卡片、面板 */
  --surface-soft: #f6f6f6;/* 唯一的浅填充：输入框、轨道、悬停 */
  --line: #e8e8e8;        /* 细分隔线 */
  --line-strong: #d6d6d6; /* 需要被看见的边框 */
  --text: #0a0a0a;
  --text-secondary: #525252;
  --text-muted: #6e6e6e;
  /* 强调色：单色系统里"重"就是黑。主按钮、选中态一律实心近黑配白字，
     灰底灰字等于没有主次，也是"脏"的来源之一。 */
  --blue: #171717;          /* 强调用的文字、描边、图表线 */
  --green: #16835d;
  --green-soft: #eaf7f1;
  --green-ink: #0f5f43;   /* 绿底上的字：#16835d 压 #eaf7f1 只有 4.3:1 */
  --amber: #a96308;
  --amber-soft: #fff5e5;
  --danger: #c43b3b;
  --shadow: 0 8px 24px rgba(0, 0, 0, .08);
  --shadow-sm: 0 1px 2px rgba(0, 0, 0, .05);
  --sidebar-width: 184px;
  /* 侧栏与顶栏也是白的，只用右／下边线跟正文分开 */
  --chrome-bg: #ffffff;
  --chrome-line: #e8e8e8;
  --fill: #f6f6f6;
  /* 选中态的浅填充，取值就是 --line 那一档：不新增灰阶，
     跟悬停的 #f6f6f6 差 14 级,一眼分得出，也不会跟 1px 的线放在一起比较 */
  --fill-strong: #e8e8e8;

  /* 间距阶：4 的倍数，取消 3/5/7/9 这类无规律取值 */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 24px;

  /* 字阶：五档。最小 11px，原先大量 10px 正文在实机上偏小 */
  --fs-xs: 11px;
  --fs-sm: 12px;
  --fs-md: 13px;
  --fs-lg: 15px;
  --fs-xl: 20px;

  /* 字重：三档，取消 650 / 750 / 800 这类非常规值 */
  --fw-medium: 500;
  --fw-semibold: 600;
  --fw-bold: 700;

  --radius-sm: 4px;
  --radius-md: 6px;
  --radius-lg: 8px;

  /* 控件高度：两档，同一行内的控件必须等高 */
  --control-sm: 28px;
  --control-md: 32px;

  /* 语义色：以下每一项此前都是散落的字面量，其中多组彼此近似却写法不同 */
  --text-emphasis: #0a0a0a;
  --border-hover: #c2c2c2;
  --row-hover: #f6f6f6;
  --progress-track: #e8e8e8;
  --on-dark: #ffffff;
  --brand-mark: #171717;
  --blue-ink: #ffffff;
  --blue-border: #171717;
  --blue-border-soft: #d6d6d6;
  --blue-border-hover: #000000;
  --blue-fill: #171717;
  --blue-fill-hover: #000000;
  --amber-border: #d9a55f;
  --amber-ink: #7d5114;
}

* { box-sizing: border-box; }
[hidden] { display: none !important; }

/* 键盘焦点统一成一道蓝环。输入框自身 outline 被清掉，由容器的 focus-within 承担。 */
:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; border-radius: var(--radius-sm); }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
}

html, body { min-height: 100%; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: Inter, "SF Pro Text", "PingFang SC", "Microsoft YaHei", Arial, sans-serif;
  font-size: 14px;
  letter-spacing: 0;
}

button, input, select { font: inherit; letter-spacing: 0; }
button { color: inherit; }

.app-shell { min-height: 100vh; min-height: 100dvh; }

.sidebar {
  position: fixed;
  inset: 0 auto 0 0;
  z-index: 30;
  display: flex;
  width: var(--sidebar-width);
  flex-direction: column;
  background: var(--chrome-bg);
  border-right: 1px solid var(--chrome-line);
}

.brand {
  display: flex;
  min-height: 44px;
  align-items: center;
  gap: var(--space-2);
  padding: 0 var(--space-2);
  border-bottom: 1px solid var(--chrome-line);
}

.brand-mark {
  display: grid;
  width: 26px;
  height: 26px;
  flex: 0 0 26px;
  place-items: center;
  border-radius: var(--radius-md);
  background: var(--brand-mark);
  color: var(--on-dark);
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
}

.brand-icon {
  display: grid;
  width: var(--control-sm);
  height: var(--control-sm);
  flex: 0 0 var(--control-sm);
  place-items: center;
  border-radius: var(--radius-md);
  background: var(--green-soft);
}

.brand-logo {
  display: block;
  width: 22px;
  height: 8px;
  fill: var(--green-ink);
}

.brand strong { min-width: 0; color: var(--text-emphasis); font-size: var(--fs-md); font-weight: var(--fw-semibold); line-height: 18px; white-space: nowrap; }
.sidebar-close { display: none !important; margin-left: auto; }

/* 分段控件：侧栏的导航切换与榜单切换共用同一套视觉，避免同一种交互出现两种长相 */
.sidebar-mode-tabs, .ranking-tabs { display: grid; gap: 2px; padding: 2px; border: 1px solid var(--chrome-line); border-radius: var(--radius-md); background: var(--fill); }
.sidebar-mode-tab, .ranking-tab { display: inline-flex; min-width: 0; min-height: var(--control-sm); align-items: center; justify-content: center; gap: var(--space-1); padding: 0 var(--space-2); border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--text-muted); cursor: pointer; font-size: var(--fs-xs); font-weight: var(--fw-semibold); }
.sidebar-mode-tab svg, .ranking-tab svg { width: 13px; height: 13px; }
.sidebar-mode-tab.active, .ranking-tab.active { background: var(--surface); color: var(--text); box-shadow: var(--shadow-sm); }
.sidebar-mode-tab:hover:not(.active), .ranking-tab:hover:not(:disabled):not(.active) { color: var(--text-secondary); }

.sidebar-mode-tabs { grid-template-columns: 1fr 1fr; margin: var(--space-2) var(--space-2) var(--space-1); }

.category-tree { flex: 1; overflow-y: auto; padding: 0 var(--space-2) var(--space-2); }

/* 未登录时分类页签压根不下发，侧栏里只剩一个按钮。
   一项还长成分段控件，看着像坏掉的切换器 —— 用 :only-child 认出这种形态，
   整条退化成普通的分区标题：左对齐、弱化、不可点。
   判据取自 markup 本身，不依赖任何要等接口才加上的类。 */
.sidebar-mode-tabs:has(.sidebar-mode-tab:only-child) {
  display: block; padding: 0; border: 0; background: transparent;
  margin: var(--space-3) var(--space-2) var(--space-1);
}
.sidebar-mode-tab:only-child {
  width: 100%; min-height: 0; padding: 0; justify-content: flex-start;
  gap: var(--space-1); background: transparent; box-shadow: none;
  color: var(--text-muted); font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  cursor: default; pointer-events: none;
}
.sidebar-mode-tab:only-child svg { width: 12px; height: 12px; }

.subject-panel { min-height: 0; flex: 1; flex-direction: column; }
.subject-panel:not([hidden]) { display: flex; }
.subject-search { display: grid; height: var(--control-sm); flex: 0 0 var(--control-sm); grid-template-columns: 15px minmax(0, 1fr); align-items: center; gap: var(--space-1); margin: 0 var(--space-2) var(--space-1); padding: 0 var(--space-2); border: 1px solid var(--line-strong); border-radius: var(--radius-sm); background: var(--surface); }
.subject-search:focus-within { border-color: var(--blue); box-shadow: 0 0 0 2px rgba(23, 23, 23, .15); }
.subject-search svg { width: 13px; height: 13px; color: var(--text-muted); }
.subject-search input { min-width: 0; border: 0; outline: 0; background: transparent; color: var(--text); font-size: var(--fs-xs); }
.subject-list-meta { display: flex; flex: 0 0 auto; justify-content: space-between; padding: 0 var(--space-2) var(--space-1); color: var(--text-muted); font-size: var(--fs-xs); }
.subject-list { min-height: 0; flex: 1; overflow-y: auto; padding: 0 var(--space-2) var(--space-2); }
.subject-row { display: grid; width: 100%; min-height: var(--control-sm); grid-template-columns: 20px minmax(0, 1fr) auto; align-items: center; gap: var(--space-1); padding: 2px var(--space-2); border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--text-secondary); cursor: pointer; text-align: left; }
.subject-row:hover { background: var(--fill); }
/* 选中态统一：一档浅填充 + 左侧一道竖条 + 加粗。
   三个信号叠在一起已经足够醒目，不需要整块涂黑。
   竖条用 inset 阴影画，不占位，不会让文字跳动。 */
.subject-row.active { background: var(--fill-strong); color: var(--text-emphasis); font-weight: var(--fw-semibold); box-shadow: inset 2px 0 0 var(--text); }
.subject-rank { color: var(--text-muted); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; text-align: right; }
.subject-name { overflow: hidden; font-size: var(--fs-xs); font-weight: var(--fw-medium); text-overflow: ellipsis; white-space: nowrap; }
.subject-count { color: var(--text-muted); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
.subject-row.active .subject-rank, .subject-row.active .subject-count { color: var(--text-secondary); }
.subject-empty { padding: var(--space-5) var(--space-2); color: var(--text-muted); font-size: var(--fs-xs); text-align: center; }

.category-all, .category-group-toggle, .category-leaf {
  display: flex;
  width: 100%;
  min-height: 28px;
  align-items: center;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  cursor: pointer;
  text-align: left;
}

.category-all { justify-content: space-between; padding: 0 var(--space-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.category-all small { color: var(--blue); font-size: var(--fs-xs); font-weight: var(--fw-semibold); }
/* 「全部游戏」是默认状态，不是用户挑出来的筛选项 —— 每次打开页面它都亮着。
   把它做成跟叶子节点一样的实心黑，等于侧栏顶上常驻一条黑杠，太重。
   用一档浅填充表示"在这儿"就够了，实心黑留给真正被选中的分类。 */
.category-all.active { background: var(--fill-strong); color: var(--text-emphasis); box-shadow: inset 2px 0 0 var(--text); }
.category-leaf.active { background: var(--fill-strong); color: var(--text-emphasis); font-weight: var(--fw-semibold); box-shadow: inset 2px 0 0 var(--text); }
.category-leaf.active span:last-child { color: var(--text-secondary); }
.category-group.selected > .category-group-toggle { color: var(--text); font-weight: var(--fw-semibold); }
.category-all:hover, .category-group-toggle:hover, .category-leaf:hover { background: var(--fill); }
.category-leaf span:last-child { color: var(--text-muted); font-size: var(--fs-xs); }

.category-group { margin-top: 1px; }
.category-group-toggle { gap: var(--space-1); padding: 0 var(--space-2); color: var(--text-secondary); font-size: var(--fs-sm); font-weight: var(--fw-medium); }
.category-group-toggle svg { width: 13px; height: 13px; transition: transform .16s ease; }
.category-group.expanded .category-group-toggle svg { transform: rotate(90deg); }
.category-group-toggle span:nth-child(2) { flex: 1; }
.category-group-toggle small { color: var(--text-muted); font-size: var(--fs-xs); }
.category-children { display: none; padding-left: var(--space-3); }
.category-group.expanded .category-children { display: block; }
.category-leaf { justify-content: space-between; min-height: var(--control-sm); padding: 0 var(--space-2); color: var(--text-secondary); font-size: var(--fs-sm); }

.main-content { min-width: 0; margin-left: var(--sidebar-width); }

.topbar {
  display: flex;
  min-height: 44px;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  padding: 0 var(--space-4);
  background: var(--chrome-bg);
  border-bottom: 1px solid var(--chrome-line);
}

.title-group { display: flex; align-items: center; gap: var(--space-2); min-width: 0; }
.title-group h1 { margin: 0; color: var(--text-emphasis); font-size: var(--fs-lg); font-weight: var(--fw-semibold); line-height: 22px; }
.menu-button { display: none !important; }
.header-actions { display: flex; align-items: center; gap: var(--space-2); }


.button, .icon-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-md);
  background: var(--surface);
  cursor: pointer;
}

.button { min-height: var(--control-md); gap: var(--space-1); padding: 0 var(--space-3); font-size: var(--fs-sm); font-weight: var(--fw-semibold); white-space: nowrap; }
.button svg { width: 15px; height: 15px; }
.button:hover:not(:disabled), .icon-button:hover:not(:disabled) { border-color: var(--border-hover); background: var(--surface-soft); }
.button.primary { border-color: var(--blue-border); background: var(--blue-fill); color: var(--blue-ink); }
.button.primary:hover:not(:disabled) { border-color: var(--blue-border-hover); background: var(--blue-fill-hover); }
.button:disabled { cursor: not-allowed; opacity: .5; }

.icon-button { width: var(--control-md); height: var(--control-md); padding: 0; }
.icon-button svg { width: 17px; height: 17px; }
.icon-button.small { width: var(--control-sm); height: var(--control-sm); border: 0; background: transparent; }

/* 运维信息默认收成一行：这是一个看数据的页面，状态九成时间只是在说"完成了"，
   不该占掉首屏。异常或进行中时由脚本自动展开。 */
.status-strip { margin: var(--space-2) var(--space-4) 0; overflow: hidden; border: 1px solid var(--chrome-line); border-radius: var(--radius-md); background: var(--surface); }
.status-summary { display: flex; width: 100%; min-height: var(--control-md); align-items: center; gap: var(--space-2); padding: 0 var(--space-3); border: 0; background: transparent; color: var(--text-secondary); cursor: pointer; font-size: var(--fs-sm); text-align: left; }
.status-summary:hover { background: var(--fill); }
.status-summary > svg { width: 15px; height: 15px; flex: 0 0 auto; color: var(--text-muted); transition: transform .16s ease; }
.status-summary[aria-expanded="true"] > svg { transform: rotate(180deg); }
.status-dot { width: 7px; height: 7px; flex: 0 0 7px; border-radius: 50%; background: var(--text-muted); }
.status-dot.ok { background: var(--green); }
.status-dot.busy { background: var(--blue); animation: status-pulse 1.4s ease-in-out infinite; }
.status-dot.warn { background: var(--amber); }
.status-dot.error { background: var(--danger); }
@keyframes status-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .3; } }
.status-line { flex: 0 0 auto; color: var(--text); font-weight: var(--fw-semibold); }
.status-aside { min-width: 0; flex: 1; overflow: hidden; color: var(--text-muted); font-size: var(--fs-xs); text-overflow: ellipsis; white-space: nowrap; }
.status-panel { border-top: 1px solid var(--chrome-line); }
.status-panel[hidden] { display: none; }

.summary-band {
  display: grid;
  grid-template-columns: repeat(3, minmax(180px, 1fr));
  background: var(--surface);
  border-bottom: 1px solid var(--chrome-line);
}

/* 标签、数值、说明纵向堆叠：横排时说明里的数字会和主数值抢读，"分类 82 条展示路径 77" 无法一眼配对 */
.summary-item { min-width: 0; padding: var(--space-2) var(--space-3); }
.summary-item + .summary-item { border-left: 1px solid var(--chrome-line); }
.summary-item span, .summary-item strong, .summary-item small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.summary-item span { color: var(--text-muted); font-size: var(--fs-xs); }
.summary-item strong { margin-top: 1px; color: var(--text-emphasis); font-size: var(--fs-xl); line-height: 24px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.summary-item small { color: var(--text-muted); font-size: var(--fs-xs); }
.summary-item small.warning { color: var(--amber); font-weight: var(--fw-semibold); }

/* 面板改为按需展开后不必再把三块挤进一行，调度独占一行才放得下下次执行时间 */
.collection-panel { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); background: var(--surface); }
.collection-status-bar { display: grid; grid-template-columns: minmax(108px, auto) minmax(80px, 1fr) 32px; align-items: center; gap: var(--space-2); min-height: 34px; padding: var(--space-1) var(--space-3); }
.collection-status-bar + .collection-status-bar { border-left: 1px solid var(--chrome-line); }
.collection-status-copy { min-width: 0; }
.collection-status-copy span, .collection-status-copy small { display: block; }
.collection-state { color: var(--text-secondary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.collection-status-copy small { margin-top: 2px; overflow: hidden; color: var(--text-muted); font-size: var(--fs-xs); text-overflow: ellipsis; white-space: nowrap; }
.collection-progress { height: 3px; overflow: hidden; border-radius: 2px; background: var(--progress-track); }
.collection-progress span { display: block; width: 0; height: 100%; background: var(--blue); transition: width .2s ease; }
.collection-status-bar > strong { color: var(--text-secondary); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; text-align: right; }
.collection-status-bar.failed .collection-progress span { background: var(--danger); }
.collection-status-bar.complete .collection-progress span { background: var(--green); }
.collection-status-bar.complete { grid-template-columns: minmax(0, 1fr); }
.collection-status-bar.complete .collection-progress, .collection-status-bar.complete > strong { display: none; }
.collection-status-bar.actionable { grid-template-columns: minmax(108px, auto) minmax(60px, 1fr) 32px auto; }
.status-action { display: inline-flex; height: var(--control-sm); align-items: center; gap: var(--space-1); padding: 0 var(--space-2); border: 1px solid var(--amber-border); border-radius: var(--radius-sm); background: var(--amber-soft); color: var(--amber-ink); font-size: var(--fs-xs); font-weight: var(--fw-semibold); white-space: nowrap; cursor: pointer; }
.status-action:hover:not(:disabled) { border-color: var(--amber-ink); }
.status-action:disabled { cursor: not-allowed; opacity: .5; }
.status-action[hidden] { display: none; }
.status-action svg { width: 13px; height: 13px; }
.schedule-status-bar { display: flex; min-width: 0; min-height: 34px; flex-wrap: wrap; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3); border-top: 1px solid var(--chrome-line); color: var(--text-secondary); font-size: var(--fs-xs); grid-column: 1 / -1; }
.schedule-toggle, .schedule-control { display: inline-flex; height: var(--control-sm); flex: 0 0 auto; align-items: center; gap: var(--space-1); }
.schedule-toggle { font-weight: var(--fw-semibold); }
.schedule-toggle input { width: 14px; height: 14px; margin: 0; accent-color: var(--blue); }
.schedule-control { overflow: hidden; padding-left: var(--space-2); border: 1px solid var(--line-strong); border-radius: var(--radius-sm); background: var(--surface); }
.schedule-control span { color: var(--text-muted); }
/* 外壳已是 control-sm，内控件减去上下 1px 描边正好贴合 */
.schedule-control select, .schedule-control input { height: calc(var(--control-sm) - 2px); border: 0; outline: 0; background: transparent; color: var(--text); font-size: var(--fs-xs); }
.schedule-control select { max-width: 96px; padding: 0 var(--space-1); }
.schedule-control input { width: 72px; padding: 0 var(--space-1); }
.schedule-status-bar small { min-width: 0; flex: 1; overflow: hidden; color: var(--text-muted); text-overflow: ellipsis; white-space: nowrap; }
.schedule-status-bar.disabled { opacity: .62; }

.workspace {
  margin: var(--space-1) var(--space-4) var(--space-4);
  overflow: hidden;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
}

.ranking-bar { display: flex; min-height: 40px; align-items: center; justify-content: space-between; gap: var(--space-3); padding: var(--space-1) var(--space-3); border-bottom: 1px solid var(--line); background: var(--surface); }
.ranking-bar[hidden] { display: none; }
.ranking-navigation { display: flex; min-width: 0; align-items: center; gap: var(--space-2); }
.ranking-scope { flex: 0 0 auto; color: var(--text-muted); font-size: var(--fs-xs); font-weight: var(--fw-semibold); white-space: nowrap; }
.ranking-tabs { grid-template-columns: repeat(3, minmax(92px, 1fr)); border-color: var(--line); }
.ranking-tab strong { min-width: 20px; color: var(--text-muted); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; font-weight: var(--fw-semibold); text-align: right; }
.ranking-tab.active strong { color: var(--blue); }
.ranking-tab:disabled { cursor: not-allowed; opacity: .42; }
.ranking-snapshot-meta { overflow: hidden; color: var(--text-muted); font-size: var(--fs-xs); text-overflow: ellipsis; white-space: nowrap; }

.toolbar {
  display: flex;
  min-height: 44px;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-3);
  border-bottom: 1px solid var(--line);
}

.search-box {
  display: grid;
  width: min(420px, 38vw);
  height: var(--control-md);
  grid-template-columns: 20px 1fr auto;
  align-items: center;
  gap: var(--space-2);
  padding: 0 var(--space-3);
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-md);
  background: var(--surface);
}

.search-box:focus-within { border-color: var(--blue); box-shadow: 0 0 0 2px rgba(23, 23, 23, .15); }
.search-box svg { width: 16px; height: 16px; color: var(--text-muted); }
.search-box input { min-width: 0; border: 0; outline: 0; color: var(--text); font-size: var(--fs-md); }
.search-box input::placeholder { color: var(--text-muted); }
kbd { padding: 1px var(--space-1); border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface-soft); color: var(--text-muted); font-size: var(--fs-xs); }

.select-control { display: flex; height: var(--control-md); align-items: center; overflow: hidden; border: 1px solid var(--line-strong); border-radius: var(--radius-md); background: var(--surface); }
.select-control span { padding-left: var(--space-3); color: var(--text-muted); font-size: var(--fs-xs); white-space: nowrap; }
.select-control select { height: 100%; max-width: 185px; padding: 0 26px 0 var(--space-2); border: 0; outline: 0; background: transparent; color: var(--text); font-size: var(--fs-sm); }
.filter-reset { margin-left: auto; padding: 0 var(--space-2); border: 0; background: transparent; color: var(--blue); font-size: var(--fs-sm); font-weight: var(--fw-medium); cursor: pointer; }

.announcement-bar:not([hidden]) {
  display: flex;
  min-height: 48px;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  border-bottom: 1px solid var(--line);
  background: var(--surface);
  color: var(--text-secondary);
  font-size: var(--fs-md);
  line-height: 1.6;
}
.announcement-icon { display: grid; width: 24px; height: 24px; flex: 0 0 24px; place-items: center; border-radius: 50%; background: var(--green-soft); color: var(--green-ink); }
.announcement-icon svg { width: 14px; height: 14px; stroke-width: 1.6; }
.announcement-copy { display: grid; min-width: 0; flex: 1; grid-template-columns: fit-content(180px) minmax(0, 1fr); align-items: baseline; gap: var(--space-3); overflow-wrap: anywhere; }
.announcement-copy strong { color: var(--text); font-size: var(--fs-sm); font-weight: var(--fw-medium); }
.announcement-copy p { min-width: 0; margin: 0; padding-left: var(--space-3); border-left: 1px solid var(--line); white-space: pre-wrap; }
@media (max-width: 680px) {
  .announcement-bar:not([hidden]) { align-items: flex-start; padding: var(--space-3); }
  .announcement-copy { grid-template-columns: minmax(0, 1fr); gap: var(--space-1); }
  .announcement-copy p { padding-left: 0; border-left: 0; }
}
.active-filter { display: flex; min-height: 40px; align-items: center; gap: var(--space-2); padding: var(--space-1) var(--space-3); border-bottom: 1px solid var(--line); background: var(--surface); color: var(--text); font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
.active-filter > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.filter-clear { display: inline-flex; height: var(--control-sm); flex: 0 0 auto; align-items: center; gap: var(--space-1); padding: 0 var(--space-2); border: 1px solid var(--blue-border-soft); border-radius: var(--radius-sm); background: var(--surface); color: var(--blue); cursor: pointer; font-size: var(--fs-xs); font-weight: var(--fw-semibold); }
.filter-clear svg { width: 13px; height: 13px; }
.filter-clear:hover { background: var(--fill); border-color: var(--border-hover); }

/* 横向滚动阴影：窄屏只看得到前两列时，右缘的阴影提示右侧还有内容，滚到头会自动消失 */
.table-scroll {
  overflow-x: auto;
  background:
    linear-gradient(to right, var(--surface), rgba(255, 255, 255, 0)) left center,
    linear-gradient(to left, var(--surface), rgba(255, 255, 255, 0)) right center,
    radial-gradient(farthest-side at 0 50%, rgba(0, 0, 0, .14), rgba(0, 0, 0, 0)) left center,
    radial-gradient(farthest-side at 100% 50%, rgba(0, 0, 0, .14), rgba(0, 0, 0, 0)) right center;
  background-repeat: no-repeat;
  background-size: 28px 100%, 28px 100%, 16px 100%, 16px 100%;
  background-attachment: local, local, scroll, scroll;
}
.game-table { width: 100%; min-width: 1080px; border-collapse: collapse; table-layout: fixed; }
.game-table th { height: 34px; padding: 0 var(--space-2); border-bottom: 1px solid var(--line-strong); background: var(--surface); color: var(--text-muted); font-size: var(--fs-xs); font-weight: var(--fw-semibold); text-align: left; }
.game-table td { height: 52px; padding: var(--space-1) var(--space-2); border-bottom: 1px solid var(--line); color: var(--text-secondary); font-size: var(--fs-sm); vertical-align: middle; }
.game-table tbody tr { cursor: pointer; }
.game-table tbody tr:hover { background: var(--row-hover); }
.game-table tbody tr:last-child td { border-bottom: 0; }

/* 看过的行置灰，标记"这一轮浏览到哪了"。刷新页面即清空。
   用降低不透明度而不是改字色：一次改动就能把图标、徽标、数字一起压下去，
   且各处的色阶关系保持不变。悬停时恢复，避免影响实际阅读。 */
.game-table tbody tr.viewed { opacity: .45; }
.game-table tbody tr.viewed:hover,
.game-table tbody tr.viewed:focus-visible { opacity: 1; }
@media (prefers-reduced-motion: no-preference) {
  .game-table tbody tr { transition: opacity .15s ease; }
}
/* 列宽按类名而不是位置：未登录时"分类"那一列整个不下发，
   用 nth-child 的话后面每一列都会套错宽度、右对齐也会落到别的列上。 */
.col-game { width: 220px; }
.col-developer { width: 178px; }
.col-category { width: 158px; }
.col-version { width: 90px; }
.col-date { width: 88px; }
.col-online { width: 108px; }
.col-favorite { width: 100px; }
.col-action { width: 32px; }
.number-column { text-align: right !important; }
/* 数值列整列右对齐，否则同一格里主数值靠右、副文案靠左 */
.game-table td.number-cell { text-align: right; }

.game-cell { display: grid; grid-template-columns: 34px 1fr; align-items: center; gap: var(--space-2); min-width: 0; }
.game-cell.ranked { grid-template-columns: 22px 34px minmax(0, 1fr); gap: var(--space-2); }
.game-cell > div { min-width: 0; }
.server-rank { color: var(--text-secondary); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; font-weight: var(--fw-bold); text-align: center; }
.server-rank::before { content: "#"; color: var(--text-muted); font-size: var(--fs-xs); font-weight: var(--fw-medium); }
.game-icon { width: 34px; height: 34px; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--surface-soft); object-fit: cover; }
.game-icon.image-missing { border-style: dashed; background: var(--fill-strong); }
.game-name { display: block; overflow: hidden; color: var(--text); font-size: var(--fs-md); font-weight: var(--fw-semibold); text-overflow: ellipsis; white-space: nowrap; }
.package-name { display: block; overflow: hidden; margin-top: 1px; color: var(--text-muted); font-family: "SFMono-Regular", Consolas, monospace; font-size: var(--fs-xs); text-overflow: ellipsis; white-space: nowrap; }
.category-path { display: block; overflow: hidden; color: var(--text-secondary); text-overflow: ellipsis; white-space: nowrap; }
.category-more { display: block; margin-top: 2px; color: var(--blue); font-size: var(--fs-xs); }
.developer-subject { display: block; width: 100%; overflow: hidden; padding: 0; border: 0; background: transparent; color: var(--text); cursor: pointer; font-size: var(--fs-sm); font-weight: var(--fw-medium); text-align: left; text-overflow: ellipsis; white-space: nowrap; }
.developer-subject:hover, .developer-subject:focus-visible { color: var(--blue); }
.developer-id { display: block; overflow: hidden; margin-top: 1px; color: var(--text-muted); font-family: "SFMono-Regular", Consolas, monospace; font-size: var(--fs-xs); text-overflow: ellipsis; white-space: nowrap; }
.table-primary { display: block; color: var(--text); font-weight: var(--fw-medium); }
.table-secondary { display: block; margin-top: 2px; color: var(--text-muted); font-size: var(--fs-xs); }
.metric-primary { display: block; color: var(--text); font-variant-numeric: tabular-nums; font-weight: var(--fw-semibold); text-align: right; }
.rating-positive { color: var(--green); }
.row-action { border: 0; background: transparent; }

.empty-state { min-height: 320px; align-items: center; justify-content: center; flex-direction: column; color: var(--text-muted); }
.empty-state:not([hidden]) { display: flex; }
.empty-state svg { width: 28px; height: 28px; margin-bottom: var(--space-2); }
.empty-state strong { color: var(--text-secondary); }
.empty-state span { margin-top: var(--space-1); font-size: var(--fs-sm); }

.list-error:not([hidden]) { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-2); padding: var(--space-3); border-top: 1px solid var(--line-strong); background: var(--surface-soft); color: var(--text-secondary); font-size: var(--fs-sm); }
.list-error p { margin: var(--space-1) 0 0; }
.list-error button { flex-shrink: 0; }
.table-footer { display: flex; min-height: 44px; align-items: center; justify-content: space-between; padding: 0 var(--space-3); border-top: 1px solid var(--line); color: var(--text-muted); font-size: var(--fs-xs); }
.stream-controls { display: flex; align-items: center; gap: var(--space-2); }
.stream-controls .icon-button { width: var(--control-sm); height: var(--control-sm); }
.load-more-button { display: inline-flex; height: var(--control-sm); align-items: center; gap: var(--space-1); padding: 0 var(--space-3); border: 1px solid var(--line-strong); border-radius: var(--radius-sm); background: var(--surface); color: var(--text-secondary); font-size: var(--fs-xs); font-weight: var(--fw-medium); cursor: pointer; }
.load-more-button:hover { border-color: var(--border-hover); background: var(--surface-soft); }
.load-more-button svg { width: 14px; height: 14px; }
.load-more-button[hidden] { display: none; }

.drawer-backdrop, .mobile-backdrop { position: fixed; inset: 0; display: none; background: rgba(0, 0, 0, .28); }
.drawer-backdrop { z-index: 85; }
.mobile-backdrop { z-index: 70; }
.drawer-backdrop.open, .mobile-backdrop.open { display: block; }

.detail-drawer {
  position: fixed;
  inset: 0 0 0 auto;
  z-index: 90;
  width: min(620px, 92vw);
  height: 100vh;
  height: 100dvh;
  overflow-y: auto;
  overscroll-behavior: contain;
  background: var(--surface);
  box-shadow: var(--shadow);
  transform: translateX(105%);
  transition: transform .2s ease;
}
.detail-drawer.open { transform: translateX(0); }

.drawer-header { position: sticky; top: 0; z-index: 2; display: flex; min-height: 56px; align-items: center; gap: var(--space-2); padding: max(var(--space-2), env(safe-area-inset-top)) var(--space-4) var(--space-2); border-bottom: 1px solid var(--line); background: rgba(255,255,255,.97); }
.drawer-header .game-icon { width: 40px; height: 40px; }
.drawer-title { min-width: 0; flex: 1; }
.drawer-title h2 { margin: 0; overflow: hidden; font-size: var(--fs-lg); text-overflow: ellipsis; white-space: nowrap; }
/* 资料完整度属于整条记录，放在标题下说一次，不必在每个分区重复 */
.drawer-badge { display: inline-block; margin-top: 2px; padding: 1px var(--space-2); border-radius: 999px; background: var(--fill); color: var(--text-muted); font-size: var(--fs-xs); font-weight: var(--fw-medium); }
.drawer-badge.ok { background: var(--green-soft); color: var(--green-ink); }
.drawer-body { padding: 0 var(--space-4) var(--space-5); }
.drawer-section { padding: var(--space-3) 0; border-bottom: 1px solid var(--line); }
.drawer-section:last-child { border-bottom: 0; }
.section-heading { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); margin-bottom: var(--space-2); }
.section-heading h3 { margin: 0; font-size: var(--fs-md); }
.section-heading span { color: var(--text-muted); font-size: var(--fs-xs); }

.trend-loading, .trend-empty { display: grid; min-height: 58px; grid-template-columns: 22px auto minmax(0, 1fr); align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3); border: 1px dashed var(--line-strong); border-radius: var(--radius-md); background: var(--surface); color: var(--text-muted); }
.trend-loading svg { width: 18px; height: 18px; animation: trend-spin 1s linear infinite; }
.trend-loading span { font-size: var(--fs-xs); }
.trend-empty svg { width: 20px; height: 20px; }
.trend-empty strong { color: var(--text-secondary); font-size: var(--fs-sm); }
.trend-empty span { font-size: var(--fs-xs); text-align: right; }
@keyframes trend-spin { to { transform: rotate(360deg); } }
.trend-panel { padding: var(--space-2) var(--space-2) var(--space-2); border: 1px solid var(--line-strong); border-radius: var(--radius-md); background: var(--surface); }
.trend-metrics { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-4); }
.trend-metrics span { display: block; color: var(--text-muted); font-size: var(--fs-xs); }
.trend-metrics strong { display: block; margin-top: 2px; color: var(--text); font-size: var(--fs-lg); font-variant-numeric: tabular-nums; }
.trend-metrics strong em { margin-left: var(--space-2); font-size: var(--fs-xs); font-style: normal; font-weight: var(--fw-semibold); }
.trend-metrics em.up { color: var(--green); }
.trend-metrics em.down { color: var(--danger); }
.trend-metrics em.flat { color: var(--text-secondary); }
.trend-metrics small { display: block; margin-top: var(--space-1); color: var(--text-muted); font-size: var(--fs-xs); }
.trend-ranges { display: flex; flex-shrink: 0; gap: 2px; padding: 2px; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--fill); }
.trend-ranges button { padding: var(--space-1) var(--space-2); border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--text-secondary); cursor: pointer; font-size: var(--fs-xs); }
.trend-ranges button:hover:not(:disabled) { color: var(--text); }
.trend-ranges button.on { background: var(--surface); color: var(--text); font-weight: var(--fw-semibold); box-shadow: var(--shadow-sm); }
.trend-ranges button:disabled { opacity: .38; cursor: not-allowed; }
.trend-canvas { position: relative; margin: var(--space-2) 0 0 52px; touch-action: none; cursor: crosshair; }
.trend-scale { position: absolute; inset: 0 auto 0 -52px; width: 52px; color: var(--text-muted); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; pointer-events: none; }
.trend-scale span { position: absolute; right: 8px; transform: translateY(-50%); white-space: nowrap; }
.trend-chart { display: block; width: 100%; height: 170px; overflow: visible; }
.trend-chart .trend-grid line { stroke: var(--line); stroke-width: 1; stroke-dasharray: 2 5; vector-effect: non-scaling-stroke; }
.trend-chart polyline { fill: none; stroke: var(--blue); stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; vector-effect: non-scaling-stroke; }
/* 空档只作连接示意，用虚线弱化，避免把未观测区间读成真实走势 */
.trend-chart .trend-gap { stroke: var(--blue); stroke-width: 1.5; stroke-dasharray: 3 4; opacity: .38; vector-effect: non-scaling-stroke; }
/* 实测点单独画出：采样密集的时段才能被看成一段真实观测，而不是折线上的一个转折 */
.trend-chart .trend-observed circle { fill: var(--blue); stroke: none; opacity: .55; }
.trend-chart circle.lone { fill: var(--blue); stroke: none; }
.trend-chart circle.peak { fill: var(--surface); stroke: var(--blue); stroke-width: 2; vector-effect: non-scaling-stroke; }
.trend-chart circle.current { fill: var(--blue); stroke: var(--surface); stroke-width: 2; vector-effect: non-scaling-stroke; }
.trend-chart .trend-samples line { stroke: var(--line-strong); stroke-width: 1; vector-effect: non-scaling-stroke; }
.trend-cursor, .trend-focus, .trend-tip { position: absolute; opacity: 0; transition: opacity .12s ease; pointer-events: none; }
.trend-canvas.tracking .trend-cursor, .trend-canvas.tracking .trend-focus, .trend-canvas.tracking .trend-tip { opacity: 1; }
.trend-cursor { top: 0; bottom: -12px; width: 1px; background: var(--line-strong); }
.trend-focus { width: 9px; height: 9px; transform: translate(-50%, -50%); border: 2px solid var(--blue); border-radius: 50%; background: var(--surface); }
.trend-tip { transform: translate(-50%, calc(-100% - 12px)); padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); background: var(--text); color: var(--on-dark); white-space: nowrap; box-shadow: var(--shadow); }
.trend-tip.below { transform: translate(-50%, 12px); }
.trend-tip b { display: block; font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.trend-tip span { display: block; margin-top: 1px; color: rgba(255, 255, 255, .68); font-size: var(--fs-xs); }
.trend-axis { position: relative; height: 13px; margin-left: 52px; color: var(--text-muted); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
.trend-axis span { position: absolute; top: 0; transform: translateX(-50%); white-space: nowrap; }
.trend-note { margin: var(--space-2) 0 0; color: var(--text-muted); font-size: var(--fs-xs); }

/* 抽屉够宽时排三列：字段值多数很短，两列会把面板拉长一截 */
.detail-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2) var(--space-4); }
.detail-field.wide { grid-column: span 2; }
/* 低频字段收进折叠区，常用信息保持在一屏内 */
.drawer-more { margin-top: var(--space-1); padding: 0 var(--space-4) var(--space-4); }
.drawer-more > summary { display: flex; align-items: baseline; gap: var(--space-2); padding: var(--space-2) 0; border-top: 1px solid var(--line); color: var(--text-secondary); cursor: pointer; font-size: var(--fs-sm); font-weight: var(--fw-bold); list-style: none; }
.drawer-more > summary::-webkit-details-marker { display: none; }
.drawer-more > summary::before { color: var(--text-muted); content: "▸"; font-size: var(--fs-xs); }
.drawer-more[open] > summary::before { content: "▾"; }
.drawer-more > summary small { color: var(--text-muted); font-size: var(--fs-xs); font-weight: 400; }
.drawer-more > summary:hover { color: var(--blue); }
.drawer-more > *:not(summary) { margin-top: var(--space-3); }
.detail-field dt { margin-bottom: 2px; color: var(--text-muted); font-size: var(--fs-xs); }
.detail-field dd { margin: 0; overflow-wrap: anywhere; color: var(--text); font-size: var(--fs-sm); line-height: 17px; }
.detail-field small { display: block; margin-top: var(--space-1); color: var(--text-muted); font-size: var(--fs-xs); line-height: 15px; }
.compact-grid { max-width: 430px; }
.summary-text { margin: 0; color: var(--text-secondary); line-height: 1.75; }
.tag-list { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.tag-group + .tag-group { margin-top: var(--space-2); }
.tag-group-label { display: block; margin-bottom: var(--space-1); color: var(--text-muted); font-size: var(--fs-xs); }
.tag-chip { padding: var(--space-1) var(--space-2); border: 1px solid var(--line-strong); border-radius: var(--radius-sm); background: var(--surface); color: var(--text-secondary); font-size: var(--fs-xs); }
.tag-chip.category { border-color: var(--line-strong); background: var(--surface); color: var(--text); font-weight: var(--fw-semibold); }
.identity-route { margin-top: var(--space-2); }

.route-list { display: grid; gap: var(--space-2); }
.route-row { display: grid; grid-template-columns: minmax(0, 1fr) 28px; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-2) var(--space-2) var(--space-2); border: 1px solid var(--line-strong); border-radius: var(--radius-md); background: var(--surface); }
.route-row > div { min-width: 0; }
.route-row span { display: block; margin-bottom: var(--space-1); color: var(--text-muted); font-size: var(--fs-xs); }
/* 下载地址收成一行：整段 URL 铺三行会把抽屉撑开，而它的用途只是复制走 */
.route-row code { display: block; overflow: hidden; color: var(--text); font-family: "SFMono-Regular", Consolas, monospace; font-size: var(--fs-xs); line-height: 16px; text-overflow: ellipsis; white-space: nowrap; }

.corner-list { display: grid; gap: var(--space-2); }
.corner-item { display: grid; grid-template-columns: 124px minmax(0, 1fr); gap: var(--space-3); align-items: center; padding: var(--space-2); border: 1px solid var(--line); border-radius: var(--radius-md); }
.corner-preview { display: flex; min-height: 34px; align-items: center; justify-content: center; padding: var(--space-2) var(--space-2); border-radius: var(--radius-sm); font-size: var(--fs-xs); font-weight: var(--fw-bold); text-align: center; }
.corner-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2) var(--space-3); margin: 0; }
.corner-meta .wide { grid-column: span 3; }
.corner-meta dt { color: var(--text-muted); font-size: var(--fs-xs); }
.corner-meta dd { margin: 2px 0 0; overflow-wrap: anywhere; color: var(--text); font-size: var(--fs-xs); }

.toast { position: fixed; right: 24px; bottom: 24px; z-index: 100; padding: var(--space-2) var(--space-3); border-radius: var(--radius-md); background: var(--text); color: var(--on-dark); box-shadow: var(--shadow); font-size: var(--fs-sm); opacity: 0; pointer-events: none; transform: translateY(8px); transition: .18s ease; }
.toast.show { opacity: 1; transform: translateY(0); }

@media (max-width: 1180px) {
  .header-actions .button span { display: none; }
  .toolbar { flex-wrap: wrap; }
  .search-box { width: 100%; }
  .filter-reset { margin-left: auto; }
}

@media (max-width: 900px) {
  .sidebar { z-index: 80; transform: translateX(-105%); transition: transform .2s ease; }
  .sidebar.open { transform: translateX(0); }
  .sidebar-close, .menu-button { display: inline-flex !important; }
  .main-content { margin-left: 0; }
  .topbar { padding: 0 var(--space-3); }
  .status-strip, .workspace { margin-left: var(--space-3); margin-right: var(--space-3); }
}

@media (max-width: 680px) {
  .topbar { min-height: 56px; align-items: center; }
  .button { padding: 0 var(--space-2); }
  .button span { display: none; }
  /* 三个指标等宽并排，纵向堆叠后窄屏也能一眼配对，不必再靠隐藏说明来腾地方 */
  .summary-band { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .summary-item { padding: var(--space-2); }
  .summary-item strong { font-size: var(--fs-lg); line-height: 19px; }
  .collection-panel { grid-template-columns: 1fr; }
  .collection-status-bar { grid-template-columns: minmax(110px, auto) minmax(60px, 1fr) 30px; gap: var(--space-2); }
  .collection-status-bar.actionable { grid-template-columns: minmax(100px, auto) minmax(40px, 1fr) 30px auto; }
  .collection-status-bar + .collection-status-bar { border-top: 1px solid var(--chrome-line); border-left: 0; }
  .schedule-status-bar small { flex-basis: 100%; }
  .workspace { margin-top: var(--space-2); }
  .ranking-bar { align-items: stretch; flex-direction: column; gap: var(--space-1); padding: var(--space-2); }
  .ranking-navigation { width: 100%; gap: var(--space-2); }
  .ranking-tabs { width: 100%; flex: 1; grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .ranking-tab { min-width: 0; padding: 0 var(--space-1); }
  .toolbar { align-items: stretch; }
  .search-box kbd { display: none; }
  /* 窄屏放不下"标签 + 取值"，改为隐藏标签、让选项文案自带含义 */
  .select-control { flex: 1; min-width: 0; }
  .select-control span { display: none; }
  .select-control select { width: 100%; min-width: 0; max-width: none; padding-left: var(--space-3); }
  /* 重置筛选跟下拉同排，不再独占一行 */
  .filter-reset { flex: 0 0 auto; height: var(--control-md); margin-left: 0; }
  .table-footer { flex-wrap: wrap; align-items: center; gap: var(--space-2); padding-top: var(--space-2); padding-bottom: var(--space-2); }
  .detail-drawer { width: 100%; }
  .drawer-header { padding: max(var(--space-2), env(safe-area-inset-top)) max(var(--space-3), env(safe-area-inset-right)) var(--space-2) max(var(--space-3), env(safe-area-inset-left)); }
  .drawer-body { padding: 0 max(var(--space-3), env(safe-area-inset-right)) max(var(--space-5), env(safe-area-inset-bottom)) max(var(--space-3), env(safe-area-inset-left)); }
  .detail-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3) var(--space-3); }
  .drawer-more { padding: 0 var(--space-3) var(--space-3); }
  .trend-loading, .trend-empty { grid-template-columns: 20px 1fr; gap: var(--space-1) var(--space-2); }
  .trend-empty span { grid-column: 2; text-align: left; }
  .compact-grid { max-width: none; }
  .corner-item { grid-template-columns: 1fr; }
  .toast { right: 14px; bottom: 14px; left: 14px; text-align: center; }
}

/* 顶栏的账号位。登录体系本身早就在跑，但页面上一直没有入口 ——
   用户既进不去，也看不出自己是否已登录。 */
.account-slot { display: inline-flex; align-items: center; gap: var(--space-1); }
.account-user {
  display: inline-flex; align-items: center; gap: var(--space-1);
  max-width: 130px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: var(--text-secondary); font-size: var(--fs-xs);
}
.account-user strong { color: var(--text); font-weight: var(--fw-semibold); }
