/* portal-views.css — the four result views (docs/plans/2026-09-29-portal-views-and-shared-profile-
 * design.md §4, §5.1, §11, §12; phase P2). Loaded AFTER portal-browse.css (it owns the card look the
 * views share) and before the site brand sheet.
 *
 * ITEMS PER ROW follow the RESULTS REGION, not the frame (D2): `.br-master-pane` is the named
 * inline-size container `results`. (The pane, not #brMaster: #brMaster's 1rem padding and its
 * scrollbar would put the design's worked case — 1536×864 with the rail docked, an 82rem region —
 * at ~79rem and give Mini 8 where §4.1 / §16.1 say 10.) Each view container carries `--cols`;
 * JS reads the resolved value (PortalViews.readCols) and never repeats a threshold here.
 *
 *   Grid  2 | 3 (>= 30rem) | 4 (>= 48rem) | 5 (>= 68rem)     Mini 4 | 6 | 8 (>= 48rem) | 10 (>= 80rem)
 *   Brief 1 | 2 (>= 64rem)                                    List 1 (a <table>, §4.3)
 *
 * TV (html.ui-tv, set only by the TV shell, §5.1) has FIXED counts that never depend on container
 * queries (Chromium 80 baseline): Grid 5, Mini 10, Brief 2, by higher specificity. An engine
 * without container queries and not in TV mode gets frame-width fallbacks (@supports below).
 * aspect-ratio (Chromium 88+) has the padding-box fallback; TV styles :focus, not :focus-visible.
 *
 * REM-ONLY (the px lint gate), --pt-* tokens, every interactive target >= 2.75rem.
 */

.br-master-pane { container: results / inline-size; }

/* the column-count probe PortalViews.readCols inserts for one read and removes */
.v-probe { position: absolute; visibility: hidden; width: 0; height: 0; overflow: hidden; pointer-events: none; }

/* ══ the column model ══ */
.v-grid, .v-mini, .v-brief { display: grid; grid-template-columns: repeat(var(--cols), minmax(0, 1fr)); }
.v-grid { --cols: 2; gap: 1rem; }
.v-mini { --cols: 4; gap: .6rem; }
.v-brief { --cols: 1; gap: .5rem; }
.v-list { --cols: 1; }
@container results (min-width: 30rem) { .v-grid { --cols: 3; } .v-mini { --cols: 6; } }
@container results (min-width: 48rem) { .v-grid { --cols: 4; } .v-mini { --cols: 8; } }
@container results (min-width: 64rem) { .v-brief { --cols: 2; } }
@container results (min-width: 68rem) { .v-grid { --cols: 5; } }
@container results (min-width: 80rem) { .v-mini { --cols: 10; } }

/* no container queries and not TV: approximate the region by the frame (rail docked >= 90rem) */
@supports not (container-type: inline-size) {
  @media (min-width: 40rem) { .v-grid { --cols: 3; } .v-mini { --cols: 6; } }
  @media (min-width: 60rem) { .v-grid { --cols: 4; } .v-mini { --cols: 8; } }
  @media (min-width: 80rem) { .v-brief { --cols: 2; } }
  @media (min-width: 90rem) { .v-grid { --cols: 5; } }
  @media (min-width: 100rem) { .v-mini { --cols: 10; } }
}

/* TV: fixed counts, higher specificity, independent of @container support (§4.1, §5.1) */
html.ui-tv .v-grid { --cols: 5; }
html.ui-tv .v-mini { --cols: 10; }
html.ui-tv .v-brief { --cols: 2; }

/* ══ media boxes: the photo's box is reserved before the bytes arrive (CLS, §12) ══ */
.v-media { position: relative; display: block; overflow: hidden; background: var(--pt-surface-3); flex: none; }
.v-media.ar-portrait { aspect-ratio: 4 / 5; }
.v-media.ar-square { aspect-ratio: 1 / 1; }
.v-media.ar-landscape { aspect-ratio: 16 / 9; }
.v-media > .v-img, .v-media > .v-ph { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
.v-img { display: block; object-fit: cover; }
/* the 4:5 frame's default framing, shared with the detail hero (portal-panels.css): biased to the
   top; a card's focal point (image_focal, docs/PHOTO_FRAMES.md) overrides it inline */
.v-media.ar-portrait > .v-img { object-position: 50% 20%; }
@supports not (aspect-ratio: 1 / 1) {
  .v-media.ar-portrait, .v-media.ar-square, .v-media.ar-landscape { height: 0; }
  .v-media.ar-portrait { padding-bottom: 125%; }
  .v-media.ar-square { padding-bottom: 100%; }
  .v-media.ar-landscape { padding-bottom: 56.25%; }
}
/* the image_state placeholder: an icon plus a label, the same in every view (§4.7) */
.v-ph { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .3rem;
  color: var(--pt-muted); background: var(--pt-surface-3); text-align: center; padding: .25rem; }
.v-ph > i { font-size: 1.3rem; color: var(--pt-faint); }
.v-ph-l { font-size: .7rem; font-weight: 600; line-height: 1.15; }
.v-ph-none .v-ph-l { display: none; }               /* "No photo" is decoration: the icon alone */
/* small surfaces keep the label for assistive tech only */
.lthumb .v-ph-l, .brow-ph .v-ph-l { position: absolute; width: .0625rem; height: .0625rem; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; }
.lthumb .v-ph > i, .brow-ph .v-ph > i { font-size: 1rem; }

/* ══ locks (§8.2): a glyph + the reason as real text ══ */
.v-lock { display: inline-flex; align-items: center; gap: .3rem; color: var(--pt-muted); min-width: 0; }
.v-lock > i { font-size: .72rem; color: var(--pt-faint); flex: none; }
.v-lock-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-style: italic; }

/* ══ the site tool slot (§9.1): one click, a plain anchor, 2.75rem ══ */
.v-tool { flex: none; display: inline-flex; align-items: center; justify-content: center; gap: .35rem;
  min-width: var(--pt-touch-min); min-height: var(--pt-touch-min); padding: 0 .5rem; border-radius: var(--pt-radius-md);
  border: .0625rem solid var(--pt-accent-line); color: var(--pt-accent-ink); background: var(--pt-surface);
  text-decoration: none; font-size: .8rem; font-weight: 700; }
.v-tool:hover { background: var(--pt-accent-bg); }
.v-tool:focus-visible { outline: .125rem solid var(--pt-accent-strong); outline-offset: .0625rem; }
.v-tool-icon { width: var(--pt-touch-min); height: var(--pt-touch-min); padding: 0; }
.v-tool-icon .v-tool-l { position: absolute; width: .0625rem; height: .0625rem; overflow: hidden; clip: rect(0 0 0 0);
  white-space: nowrap; }
html.ui-tv .v-tool { display: none; }               /* absent on TV (§16.13) */

/* ══ GRID (§4.5) — photo first ══ */
.v-grid .gcard { min-width: 0; }
.v-grid .gcard-band { position: relative; }
.v-onphoto { position: absolute; top: .5rem; left: .5rem; right: .5rem; display: flex; gap: .3rem; flex-wrap: wrap;
  pointer-events: none; }
.v-onphoto .br-badge-tag { background: var(--pt-surface); color: var(--pt-text); box-shadow: 0 .0625rem .25rem rgba(15, 23, 42, .25); }
.br-badge-tag { display: inline-flex; align-items: center; gap: .3rem; max-width: 100%; white-space: nowrap; }
.br-badge-tag > i { font-size: .62rem; flex: none; }
.v-badge-t { overflow: hidden; text-overflow: ellipsis; }
.v-grid .gcard-body { gap: .2rem; min-width: 0; }
.v-l1 { display: flex; align-items: center; gap: .4rem; min-width: 0; }
.v-l1 .gcard-title { flex: 1; min-width: 0; }
.v-l2, .v-l3 { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .78rem; color: var(--pt-muted); }
.v-l3 { color: var(--pt-faint); }
.v-meta { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; }
.v-grid .v-l3 { display: none; }                      /* L3 only at a >= 72rem region */
@container results (min-width: 72rem) { .v-grid .v-l3 { display: block; } }
/* phones (< 30rem region): the icons take their own line so the title keeps the caption width */
@container results (max-width: 29.99rem) {
  .v-grid .v-l1 { flex-wrap: wrap; }
  .v-grid .v-l1 .gcard-title { flex: 1 0 100%; }
}

/* ══ MINI (§4.6) — volume: nothing over the photo, a two-line caption ══ */
.v-mini .mtile { min-width: 0; border-left-width: .0625rem; }
.v-mini .mtile-cap { display: flex; flex-direction: column; gap: .1rem; padding: .3rem .4rem .35rem; min-width: 0;
  font-size: .75rem; white-space: normal; }
.mtile-t { display: block; width: 100%; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mtile-row { display: flex; align-items: center; gap: .25rem; min-width: 0; }
.mtile-row .mtile-facts { flex: 1; font-size: .72rem; }
.v-mini .v-tool { display: none; }                    /* the tool sits on the facts line only at >= 48rem */
@container results (min-width: 48rem) { .v-mini .v-tool { display: inline-flex; } }
html.ui-tv .v-mini .v-tool { display: none; }
/* the status ring: colour on the photo's edge, the word in the tile's text (sr) */
.v-mini .mtile .v-media::after { content: ""; position: absolute; top: 0; right: 0; bottom: 0; left: 0;
  pointer-events: none; box-shadow: inset 0 0 0 .1875rem transparent; }
.v-mini .mtile.t-good .v-media::after { box-shadow: inset 0 0 0 .1875rem var(--pt-good); }
.v-mini .mtile.t-warn .v-media::after { box-shadow: inset 0 0 0 .1875rem var(--pt-warn); }
.v-mini .mtile.t-bad .v-media::after { box-shadow: inset 0 0 0 .1875rem var(--pt-bad); }
.v-mini .mtile.t-good, .v-mini .mtile.t-warn, .v-mini .mtile.t-bad { border-left: .0625rem solid var(--pt-line); }
/* volume: skip rendering work for tiles off screen (§12); the intrinsic size keeps the scrollbar honest */
.v-mini .mtile { content-visibility: auto; contain-intrinsic-size: auto 10rem; }

/* ══ BRIEF (§4.4) — two or three lines with a small photo ══ */
/* The NAME is never squeezed by the action run (§4.4, §16.17): the text column keeps at least 12rem
   (the name >= 4rem inside it, after the icon badges and the status), and when the run does not
   fit beside it the row WRAPS and the run takes its own line, right-aligned, under the text. */
.v-brief .brow { margin-bottom: 0; min-height: 6.5rem; align-items: center; min-width: 0; flex-wrap: wrap; row-gap: .4rem; }
.v-brief .brow-ph { width: 5rem; height: 5rem; border-radius: var(--pt-radius-md); }
.v-brief .brow-ph.v-media { aspect-ratio: auto; padding-bottom: 0; }
.v-brief .brow-body { gap: .25rem; flex: 1 1 0; min-width: 12rem; }
.v-brief .brow-l1 { flex-wrap: nowrap; gap: .4rem; min-width: 0; overflow: hidden; }
.v-brief .brow-t { flex: 0 1 auto; min-width: 4rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v-brief .v-brief-b { flex: none; }
.v-end { margin-left: auto; display: inline-flex; align-items: center; gap: .4rem; flex: none; }
.v-acts { display: flex; align-items: center; gap: .25rem; flex: none; margin-left: auto; }
.v-brief .brow { content-visibility: auto; contain-intrinsic-size: auto 6.5rem; }
@container results (max-width: 29.99rem) {
  .v-brief .brow-ph { width: 4rem; height: 4rem; }
  /* badges go icon-only so one is never clipped mid-word; the text stays for assistive tech */
  .v-brief .v-brief-b .v-badge-t { position: absolute; width: .0625rem; height: .0625rem; overflow: hidden;
    clip: rect(0 0 0 0); white-space: nowrap; }
  .v-brief .v-brief-b { padding: .15rem .35rem; }
}

/* ══ LIST (§4.3, P3): a real <table> ══
   The table scrolls INSIDE its own wrapper, in both axes, so the header is sticky to the wrapper's
   top and the Name column to its left edge (a sticky cell inside an overflow-x box only sticks to
   that box). #brMaster therefore stops scrolling while it holds a table: the count line, the host's
   bulk bar and the pager stay put above / below it, and only the table moves sideways on a phone.
   (An engine without :has() keeps #brMaster scrolling; the header then scrolls with the rows.) */
.br-master:has(> .v-tablewrap) { display: flex; flex-direction: column; overflow: hidden; }
.br-master:has(> .v-tablewrap) > * { flex: none; }
.br-master:has(> .v-tablewrap) > .v-tablewrap { flex: 1 1 auto; min-height: 0; }
.v-tablewrap { overflow: auto; scroll-padding-top: 2.75rem; scroll-padding-left: 14.5rem; border: .0625rem solid var(--pt-line); border-radius: var(--pt-radius-md);
  background: var(--pt-surface); }
/* FIXED table layout (INP at 100 rows, §12): the browser sizes columns from the header widths below,
   never by measuring every cell; the table's width is set by the renderer as max(100%, Σ widths). */
.v-table { border-collapse: separate; border-spacing: 0; table-layout: fixed; width: 100%; font-size: .82rem; }
.v-table th, .v-table td { padding: 0 .6rem; text-align: start; vertical-align: middle; white-space: nowrap;
  border-bottom: .0625rem solid var(--pt-line); }
/* the sticky header (and its frozen corner above everything) */
.v-table thead th { position: sticky; top: 0; z-index: 2; height: 2.75rem; background: var(--pt-surface-2);
  font-size: .7rem; font-weight: 700; text-transform: uppercase; letter-spacing: .015em; color: var(--pt-faint); }
/* the frozen first column: thumbnail + name (+ the host's bulk checkbox) */
.v-table .v-frozen { position: sticky; left: 0; z-index: 1; background: var(--pt-surface);
  box-shadow: inset -.0625rem 0 0 var(--pt-line); }
.v-table thead th.v-frozen { z-index: 3; background: var(--pt-surface-2); }
/* fixed 3.25rem rows */
.v-table tbody tr.lrow { height: 3.25rem; cursor: pointer; }
.v-table tbody tr.lrow:hover > td { background: var(--pt-surface-2); }
.v-table tbody tr.lrow.sel > td { background: var(--pt-accent-bg); }
/* My Saved Items' bulk pick (.is-picked on the row) tints the CELLS: the frozen cell's own opaque
   background would otherwise hide a row tint */
.v-table tbody tr.lrow.is-picked > td { background: var(--pt-accent-bg); }
.v-table tbody tr.lrow.sel > td.v-frozen { box-shadow: inset .1875rem 0 0 var(--pt-accent-strong), inset -.0625rem 0 0 var(--pt-line); }
.v-table tbody tr.lrow:focus { outline: none; }
.v-table tbody tr.lrow:focus-visible > td { box-shadow: inset 0 .125rem 0 var(--pt-accent-strong), inset 0 -.125rem 0 var(--pt-accent-strong); }
/* the frozen cell of a focused row keeps the ring's top and bottom lines (it no longer loses them
   to the selection accent: both are drawn, the edge line too) */
.v-table tbody tr.lrow:focus-visible > td.v-frozen { box-shadow: inset 0 .125rem 0 var(--pt-accent-strong),
  inset 0 -.125rem 0 var(--pt-accent-strong), inset -.0625rem 0 0 var(--pt-line); }
.v-table tbody tr.lrow.sel:focus-visible > td.v-frozen { box-shadow: inset 0 .125rem 0 var(--pt-accent-strong),
  inset 0 -.125rem 0 var(--pt-accent-strong), inset .1875rem 0 0 var(--pt-accent-strong), inset -.0625rem 0 0 var(--pt-line); }
/* the frozen column has a FIXED width, so the table box can keep it out of the way: scroll-padding
   (below) = its width + the header height, and a focused / scrolled-to cell is never under it (2.4.11) */
.v-namecell { display: flex; align-items: center; gap: .6rem; width: 13.3rem; }
.v-name { display: flex; flex-direction: column; flex: 1 1 auto; min-width: 4rem; overflow: hidden; }
.lname-t { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lname-s { font-size: .72rem; color: var(--pt-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lthumb { width: 2.5rem; height: 2.5rem; border-radius: var(--pt-radius-sm); }
.lthumb.v-media { aspect-ratio: auto; padding-bottom: 0; }
/* widths (§4.3): the token's minimum, twice it at most; a cell ellipsizes and carries a title */
/* widths (§4.3: xs / s / m / l), border-box; the table's extra width is shared out over them. Keep
   these numbers equal to COL_REM in portal-views.js (the table-width sum). */
.v-table th, .v-table td { box-sizing: border-box; }
.v-table .v-th-name { width: 14.5rem; }
.v-table .v-w-xs { width: 4.5rem; }
.v-table .v-w-s { width: 6rem; }
.v-table .v-w-m { width: 8rem; }
.v-table .v-w-l { width: 12rem; }
.v-table .v-th-status { width: 6.5rem; }
.v-table td { overflow: hidden; text-overflow: ellipsis; }
.v-table td.v-frozen { overflow: visible; }
/* a header keeps its whole label; the "+" wraps under it rather than being clipped */
.v-table thead th { white-space: normal; }
.v-table thead .v-th { flex-wrap: wrap; row-gap: 0; }
.v-table .v-num { text-align: end; font-variant-numeric: tabular-nums; }
.v-table .v-num .v-th { justify-content: flex-end; }
.v-table td.lacts { display: table-cell; text-align: end; }
.v-table td.lacts > * { display: inline-flex; vertical-align: middle; }
.v-table td.lacts > .br-ra { flex-wrap: nowrap; }
.v-table td.is-locked .v-lock { justify-content: flex-start; }
.v-table .v-num.is-locked .v-lock { justify-content: flex-end; }
.v-phtr > td { padding: .25rem .5rem; }
/* header controls: the sort button (whole label, an arrow, the key's ordinal), "+", Columns */
.v-th { display: flex; align-items: center; gap: .25rem; }
.v-th-l { white-space: nowrap; }
.v-sort, .v-sort-add, .v-colbtn { display: inline-flex; align-items: center; justify-content: center; gap: .3rem;
  min-height: var(--pt-touch-min); min-width: var(--pt-touch-min); padding: 0 .4rem; border: 0; border-radius: var(--pt-radius-sm);
  background: transparent; color: inherit; font: inherit; text-transform: inherit; letter-spacing: inherit; cursor: pointer; }
.v-sort:hover, .v-sort-add:hover, .v-colbtn:hover { background: var(--pt-surface-3); color: var(--pt-text); }
.v-sort:focus-visible, .v-sort-add:focus-visible, .v-colbtn:focus-visible { outline: .125rem solid var(--pt-accent-strong); outline-offset: -.125rem; }
.v-sort.is-sorted { color: var(--pt-accent-ink); }
.v-sort-ic { font-size: .7rem; opacity: .7; }
.v-sort.is-sorted .v-sort-ic { opacity: 1; }
.v-sort-n { min-width: 1rem; height: 1rem; border-radius: 999rem; display: inline-flex; align-items: center; justify-content: center;
  font-size: .62rem; background: var(--pt-accent-bg); color: var(--pt-accent-ink); }
.v-sort-add { min-width: var(--pt-touch-min); padding: 0; opacity: .75; }
.v-colbtn { margin-left: auto; border: .0625rem solid var(--pt-line-2); background: var(--pt-surface); text-transform: none; letter-spacing: 0;
  font-weight: 600; font-size: .78rem; color: var(--pt-muted); }
/* the column chooser: a disclosure above the table */
.v-colpanel { margin: 0 0 .6rem; padding: .75rem; border: .0625rem solid var(--pt-line-2); border-radius: var(--pt-radius-md);
  background: var(--pt-surface); max-width: 28rem; }
.v-colpanel-h { font-weight: 700; font-size: .85rem; }
.v-colpanel-hint { font-size: .75rem; color: var(--pt-muted); margin: .15rem 0 .5rem; }
.v-collist { list-style: none; margin: 0; padding: 0; max-height: 18rem; overflow: auto; }
.v-colitem { display: flex; align-items: center; gap: .25rem; }
.v-colchk { flex: 1; display: flex; align-items: center; gap: .5rem; min-height: var(--pt-touch-min); cursor: pointer; }
.v-colchk input { width: 1.25rem; height: 1.25rem; }
.v-colmv { width: var(--pt-touch-min); height: var(--pt-touch-min); border: .0625rem solid var(--pt-line); border-radius: var(--pt-radius-sm);
  background: var(--pt-surface-2); color: var(--pt-muted); cursor: pointer; }
.v-colmv[disabled] { opacity: .4; cursor: default; }
.v-colpanel-foot { display: flex; justify-content: flex-end; gap: .5rem; margin-top: .6rem; }
/* phones: the frozen Name column narrows (the name stays >= 4rem), the rest scrolls inside the table */
@container results (max-width: 29.99rem) {
  .v-namecell { width: 10.5rem; gap: .45rem; }     /* bulk box + thumb + a name >= 4rem */
  .v-table .v-th-name { width: 11.75rem; }
  .v-tablewrap { scroll-padding-left: 11.75rem; }
  .v-colbtn .v-colbtn-l { position: absolute; width: .0625rem; height: .0625rem; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
}
/* TV: no column chooser (it moves into ⋯ with the TV shell, §5.4); headers stay focusable buttons */
html.ui-tv .v-colbtn { display: none; }
html.ui-tv .v-sort:focus, html.ui-tv .v-sort-add:focus { outline: .25rem solid var(--pt-accent-strong); outline-offset: -.25rem; }
html.ui-tv .v-table tbody tr.lrow:focus > td, html.ui-tv .v-table tbody tr.lrow:focus > td.v-frozen {
  box-shadow: inset 0 .25rem 0 var(--pt-accent-strong), inset 0 -.25rem 0 var(--pt-accent-strong); }

/* ══ TV (§5.1, §5.4): focus always visible on :focus (not :focus-visible), cheap transitions ══ */
html.ui-tv .gcard:focus, html.ui-tv .mtile:focus, html.ui-tv .brow:focus {
  outline: .25rem solid var(--pt-accent-strong); outline-offset: .125rem; transform: scale(1.04);
  transition: transform .15s; }
html.ui-tv .gcard:hover { transform: none; }

@media (prefers-reduced-motion: reduce) {
  html.ui-tv .gcard:focus, html.ui-tv .mtile:focus, html.ui-tv .brow:focus { transform: none; transition: none; }
}

/* ---- library API 1.7 (WP2) ---------------------------------------------------------------- */
/* score pills: over the GRID photo (top right, above the scrim-free photo), after the BRIEF title */
.v-scores { display: inline-flex; gap: .3rem; flex-wrap: wrap; align-items: center; }
.v-score { display: inline-flex; align-items: baseline; gap: .15rem; padding: .1rem .45rem; border-radius: 999rem;
  font-size: .72rem; font-weight: 700; background: var(--pt-accent-bg); color: var(--pt-accent-ink);
  border: .0625rem solid var(--pt-accent-line); font-variant-numeric: tabular-nums; white-space: nowrap; }
.v-onphoto-score { position: absolute; top: .5rem; right: .5rem; justify-content: flex-end; pointer-events: none; }
.v-onphoto-score .v-score { background: var(--pt-surface); color: var(--pt-text); border-color: transparent;
  box-shadow: 0 .0625rem .25rem rgba(15, 23, 42, .25); }
.v-brief-score { margin-inline-start: .35rem; }
/* a source list row's own note (the list owner's store): plain text, under the row */
.v-note { display: flex; align-items: flex-start; gap: .35rem; min-width: 0; margin-top: .2rem;
  color: var(--pt-muted); font-size: .78rem; }
.v-note > i { font-size: .7rem; margin-top: .2rem; color: var(--pt-faint); flex: none; }
.v-note-t { min-width: 0; overflow-wrap: anywhere; }
.v-note-clamp .v-note-t, .brow-note .v-note-t { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.lname-n .v-note-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
