showPageview: true
pageviewType: "default"
<head><!-- 체스퀸 홈페이지는 아래 바로가기 링크를 눌러 방문해 주세요 -->
<style id="cq-home-pageview">html body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .oopy-footer:has(#oopy-pageview){display:flex!important;justify-content:center!important;width:100%;margin:24px auto 32px!important}
html body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) #oopy-pageview{display:flex!important;align-items:center;gap:8px;padding:12px 18px;border:1px solid #e4e7e8;border-radius:8px;font-size:14px}
html body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) #oopy-pageview>span{font-size:0}
html body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) #oopy-pageview>span:after{content:"오늘 방문 조회";font-size:14px}</style>
<style>html.cqh-pending body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .width.padding:has(>.notion-page-block), html.cqh-pending body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .notion-page-content.width.padding {width:100%!important;max-width:1080px!important;padding-left:28px!important;padding-right:28px!important} html.cqh-pending .notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"] h1.page-title {font-size:30px!important;line-height:1.35!important;letter-spacing:-1px!important;margin-bottom:12px!important} html.cqh-pending body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .notion-page-controls {height:44px!important;min-height:0!important;margin:0!important;padding:0!important} html.cqh-pending body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .notion-page-content:not(:has(#cq-dashboard)) {position:relative;height:170px;min-height:170px;overflow:hidden} html.cqh-pending body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .notion-page-content:not(:has(#cq-dashboard))>* {visibility:hidden} html.cqh-pending body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .notion-page-content:not(:has(#cq-dashboard))::before {content:"대회 정보를 불러오는 중입니다.";position:absolute;top:30px;left:28px;color:#666d71;font-size:14px;line-height:1.6} @media(max-width:700px) {   html.cqh-pending body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .width.padding:has(>.notion-page-block),   html.cqh-pending body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .notion-page-content.width.padding {padding-left:20px!important;padding-right:20px!important}   html.cqh-pending .notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"] h1.page-title {font-size:25px!important}   html.cqh-pending body:has(.notion-page-block[data-block-id="fee695e2-33ef-40f6-aad3-7cdf54f41061"]) .notion-page-content:not(:has(#cq-dashboard))::before {left:20px} } body:has(#cq-dashboard) .width.padding:has(>.notion-page-block), body:has(#cq-dashboard) .notion-page-content.width.padding {width:100%!important;max-width:1080px!important;padding-left:28px!important;padding-right:28px!important} body:has(#cq-dashboard) .notion-page-block h1.page-title {font-size:30px!important;line-height:1.35!important;letter-spacing:-1px!important;margin-bottom:12px!important} body:has(#cq-dashboard) .notion-page-controls {height:44px!important;min-height:0!important;margin:0!important;padding:0!important} body:has(#cq-dashboard) .notion-page-content>.cqh-native {display:none!important} #cq-dashboard {--cqh-ink:#252b30;--cqh-muted:#666d71;--cqh-line:#e4e7e8;--cqh-green:#27614d;--cqh-soft:#f3f7f5;width:100%;color:var(--cqh-ink);font-size:15px;line-height:1.6;padding-bottom:28px} #cq-dashboard * {box-sizing:border-box} #cq-dashboard a {color:inherit;text-decoration:none!important;border-bottom:none!important} #cq-dashboard a:hover {color:var(--cqh-green)} #cq-dashboard a:focus-visible {outline:3px solid #78ac98;outline-offset:4px;border-radius:3px} #cq-dashboard .cqh-nav {display:flex;gap:10px;flex-wrap:wrap;margin:0 0 32px} #cq-dashboard .cqh-nav a {border:1px solid #d8e0dc!important;padding:9px 17px;border-radius:7px;font-weight:600;background:#fff;min-height:44px;display:flex;align-items:center;gap:18px} #cq-dashboard .cqh-nav .cqh-primary {background:var(--cqh-green);border-color:var(--cqh-green)!important;color:#fff} #cq-dashboard .cqh-section {min-width:0;margin-bottom:30px} #cq-dashboard .cqh-section-head {display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:13px} #cq-dashboard h2 {font-size:20px;letter-spacing:-.5px;line-height:1.4;margin:0;font-weight:700;color:var(--cqh-ink)} #cq-dashboard .cqh-section-head p {color:var(--cqh-muted);font-size:13px;margin:5px 0 0} #cq-dashboard .cqh-more {white-space:nowrap;font-size:13px;color:var(--cqh-muted);padding:8px 0} #cq-dashboard .cqh-more span {padding-left:4px} #cq-dashboard .cqh-table {width:100%;border-collapse:collapse;border-spacing:0;text-align:left;font-size:14px;table-layout:auto} #cq-dashboard .cqh-table th {font-weight:500;background:#f5f6f6;color:var(--cqh-muted);font-size:12px;padding:9px 14px;border-top:1px solid var(--cqh-line);border-bottom:1px solid var(--cqh-line)} #cq-dashboard .cqh-table td {padding:13px 14px;border-bottom:1px solid #ebedec;vertical-align:middle} #cq-dashboard .cqh-table tr:hover td {background:#f8faf9} #cq-dashboard .cqh-date {width:116px;white-space:nowrap;font-variant-numeric:tabular-nums;color:#47514e;font-weight:600} #cq-dashboard .cqh-name {font-weight:600;word-break:keep-all;overflow-wrap:anywhere} #cq-dashboard .cqh-name a {line-height:1.5} #cq-dashboard .cqh-region {width:82px;white-space:nowrap;color:var(--cqh-muted);font-size:13px} #cq-dashboard .cqh-state {width:90px;white-space:nowrap} #cq-dashboard .cqh-status {display:inline-block;background:#eef6f1;color:#256546;border-radius:4px;font-size:12px;padding:2px 7px;font-weight:500} #cq-dashboard .cqh-recommended {font-size:10px;font-weight:600;margin-left:7px;border:1px solid #d5dfd8;border-radius:3px;padding:1px 5px;color:#52715b;white-space:nowrap;display:inline-block;vertical-align:1px} #cq-dashboard .cqh-note {font-size:12px;color:var(--cqh-muted);margin:10px 0 0} #cq-dashboard .cqh-banner {display:block;margin:0 auto 34px;width:100%;max-width:760px;aspect-ratio:831/134;max-height:116px;border-radius:7px;overflow:hidden;background-repeat:no-repeat;background-position:center;background-size:contain} #cq-dashboard .cqh-pair {display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:32px} #cq-dashboard .cqh-list {list-style:none!important;padding:0!important;margin:0!important;border-top:1px solid var(--cqh-line)} #cq-dashboard .cqh-list li {margin:0;padding:0;border-bottom:1px solid #ebedec} #cq-dashboard .cqh-list li>a {display:flex;gap:12px;align-items:baseline;padding:12px 0;min-height:52px} #cq-dashboard .cqh-list time {flex:0 0 76px;color:var(--cqh-muted);font-size:12px;font-variant-numeric:tabular-nums} #cq-dashboard .cqh-list a>span:not(.cqh-arrow) {flex:1;min-width:0;font-size:14px;word-break:keep-all;overflow-wrap:anywhere} #cq-dashboard .cqh-arrow {flex:0 0 12px;color:#8b9290;font-size:13px} #cq-dashboard .cqh-club-list {list-style:none!important;padding:0!important;margin:0!important;border-top:1px solid var(--cqh-line)} #cq-dashboard .cqh-club-list li {display:grid;grid-template-columns:80px minmax(160px,1fr) minmax(200px,1.3fr);gap:16px;align-items:center;padding:11px 0;border-bottom:1px solid #ebedec;margin:0} #cq-dashboard .cqh-club-region {font-size:12px;color:var(--cqh-muted)} #cq-dashboard .cqh-club-list a {font-size:14px;font-weight:500} #cq-dashboard .cqh-club-time {font-size:13px;color:var(--cqh-muted)} #cq-dashboard .cqh-footer {background:#f5f7f6;border:1px solid var(--cqh-line);border-radius:7px;padding:20px 22px;display:flex;justify-content:space-between;gap:20px;align-items:center;margin-top:4px} #cq-dashboard .cqh-footer strong {font-size:14px;font-weight:600} #cq-dashboard .cqh-footer p {font-size:12px;color:var(--cqh-muted);margin:5px 0 0} #cq-dashboard .cqh-footer-links {display:flex;gap:20px;flex-wrap:wrap;font-size:12px;white-space:nowrap} #cq-dashboard .cqh-empty {font-size:14px;color:var(--cqh-muted);padding:20px 0} #cq-dashboard .cqh-total {font-size:14px;font-weight:500;color:var(--cqh-green);margin-left:5px} #cq-dashboard .cqh-months {display:flex;gap:8px;flex-wrap:wrap;margin:0 0 14px} #cq-dashboard .cqh-months button,#cq-dashboard .cqh-expand {font:inherit;font-size:13px;cursor:pointer;border:1px solid #d8e0dc;border-radius:6px;padding:9px 14px;color:var(--cqh-ink);background:#fff;min-height:42px} #cq-dashboard .cqh-months button[aria-pressed="true"] {background:var(--cqh-green);border-color:var(--cqh-green);color:#fff} #cq-dashboard .cqh-months button span {margin-left:5px;opacity:.8;font-size:12px} #cq-dashboard .cqh-showing {font-size:12px;color:var(--cqh-muted);margin:10px 0;text-align:right} #cq-dashboard .cqh-expand {width:100%;background:var(--cqh-soft);margin-bottom:4px} #cq-dashboard .cqh-expand[hidden] {display:none!important} #cq-dashboard button:focus-visible {outline:3px solid #78ac98;outline-offset:3px} @media(max-width:700px) {   body:has(#cq-dashboard) .width.padding:has(>.notion-page-block),body:has(#cq-dashboard) .notion-page-content.width.padding {padding-left:20px!important;padding-right:20px!important}   body:has(#cq-dashboard) .notion-page-block h1.page-title {font-size:25px!important}   #cq-dashboard .cqh-nav {gap:7px;margin-bottom:26px}   #cq-dashboard .cqh-nav a {font-size:13px;padding:8px 11px;gap:7px;min-height:42px}   #cq-dashboard h2 {font-size:19px}   #cq-dashboard .cqh-section-head {gap:8px}   #cq-dashboard .cqh-table,#cq-dashboard .cqh-table tbody {display:block;width:100%}   #cq-dashboard .cqh-table {border-top:1px solid var(--cqh-line)}   #cq-dashboard .cqh-table thead {position:absolute;clip-path:inset(50%);width:1px;height:1px;overflow:hidden}   #cq-dashboard .cqh-table tr {display:grid;grid-template-columns:auto 1fr auto;gap:6px 12px;padding:12px 0;border-bottom:1px solid #e7ebe9}   #cq-dashboard .cqh-table td {padding:0;border:0;width:auto;display:block}   #cq-dashboard .cqh-date {grid-row:1;grid-column:1;font-size:12px}   #cq-dashboard .cqh-region {grid-row:1;grid-column:2;font-size:12px}   #cq-dashboard .cqh-state {grid-row:1;grid-column:3}   #cq-dashboard .cqh-name {grid-row:2;grid-column:1/-1;font-size:14px}   #cq-dashboard .cqh-pair {grid-template-columns:minmax(0,1fr);gap:0}   #cq-dashboard .cqh-banner {margin-bottom:28px}   #cq-dashboard .cqh-list time {flex-basis:66px}   #cq-dashboard .cqh-club-list li {grid-template-columns:55px minmax(0,1fr);gap:3px 12px}   #cq-dashboard .cqh-club-time {grid-column:2;font-size:12px}   #cq-dashboard .cqh-footer {display:block;padding:18px}   #cq-dashboard .cqh-footer-links {margin-top:14px;gap:17px} } #cq-dashboard .cqh-special {margin-bottom:20px} #cq-dashboard .cqh-special-label {margin:0 0 10px;font-size:13px;font-weight:600;color:var(--cqh-green)} #cq-dashboard .cqh-special-grid {display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px} #cq-dashboard .cqh-special-card {border:1px solid #d8e4dd;border-radius:7px;background:#f7faf8;padding:16px 18px} #cq-dashboard .cqh-special-date {font-size:13px;font-weight:600;color:var(--cqh-green)} #cq-dashboard .cqh-special-card h3 {font-size:16px;line-height:1.5;margin:5px 0 8px;letter-spacing:-.3px} #cq-dashboard .cqh-special-card p {font-size:13px;line-height:1.65;margin:3px 0;color:var(--cqh-muted)} #cq-dashboard .cqh-special-actions {display:flex;gap:16px;align-items:center;margin-top:12px;font-size:13px;font-weight:600} #cq-dashboard .cqh-special-apply {display:inline-flex;align-items:center;justify-content:center;padding:8px 14px;min-height:40px;border-radius:5px;background:var(--cqh-green);color:#fff!important} @media(max-width:700px) {   #cq-dashboard .cqh-special-grid {grid-template-columns:minmax(0,1fr)}   #cq-dashboard .cqh-special-card {padding:14px 16px} } #cq-dashboard .cqh-club-update {margin:0 0 20px;border:1px solid #d8e4dd;border-radius:7px;background:#f7faf8;padding:18px} #cq-dashboard .cqh-club-update h3 {margin:0 0 12px;font-size:16px;line-height:1.5;letter-spacing:-.3px} #cq-dashboard .cqh-club-update-grid {display:grid;grid-template-columns:1.15fr 1fr;gap:24px} #cq-dashboard .cqh-club-update p {font-size:13px;line-height:1.65;color:var(--cqh-muted);margin:4px 0} #cq-dashboard .cqh-club-update .cqh-club-update-time {font-weight:600;color:var(--cqh-green)} #cq-dashboard .cqh-club-update strong {font-size:13px;font-weight:600} #cq-dashboard .cqh-club-update-links {display:flex;align-items:center;gap:12px 18px;flex-wrap:wrap;margin-top:14px;font-size:13px;font-weight:600} #cq-dashboard .cqh-club-update-link {display:inline-flex;align-items:center;min-height:40px} @media(max-width:700px) {   #cq-dashboard .cqh-club-update {padding:14px 16px}   #cq-dashboard .cqh-club-update-grid {grid-template-columns:minmax(0,1fr);gap:10px} } #cq-dashboard{font-size:16px} #cq-dashboard h2{font-size:22px} #cq-dashboard .cqh-nav{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;margin-bottom:24px} #cq-dashboard .cqh-nav a{justify-content:center;font-size:16px;padding:10px 8px;min-height:48px;white-space:nowrap} #cq-dashboard .cqh-table{font-size:16px} #cq-dashboard .cqh-table th,#cq-dashboard .cqh-region,#cq-dashboard .cqh-status,#cq-dashboard .cqh-note,#cq-dashboard .cqh-showing,#cq-dashboard .cqh-section-head p,#cq-dashboard .cqh-more,#cq-dashboard .cqh-months button,#cq-dashboard .cqh-expand{font-size:14px} #cq-dashboard .cqh-table td{padding:12px 14px} #cq-dashboard .cqh-date{width:138px} #cq-dashboard .cqh-table .cqh-name{font-size:16px;line-height:1.6} #cq-dashboard .cqh-table .cqh-name a{display:inline-block;min-height:24px} #cq-dashboard .cqh-months button,#cq-dashboard .cqh-expand{min-height:44px} #cq-dashboard .cqh-months button span{font-size:13px} #cq-dashboard .cqh-recommended{font-size:12px} #cq-dashboard .cqh-list li>a{align-items:flex-start;padding:14px 0;gap:12px} #cq-dashboard .cqh-list time{flex:0 0 94px;font-size:14px;line-height:1.6;white-space:nowrap} #cq-dashboard .cqh-list a>span:not(.cqh-arrow){font-size:16px;line-height:1.6} #cq-dashboard .cqh-updated{display:block;font-size:13px;color:var(--cqh-muted);font-weight:400;margin-top:4px} #cq-dashboard .cqh-club-list a{font-size:16px} #cq-dashboard .cqh-club-region,#cq-dashboard .cqh-club-time,#cq-dashboard .cqh-special-label,#cq-dashboard .cqh-special-date,#cq-dashboard .cqh-special-card p,#cq-dashboard .cqh-special-actions,#cq-dashboard .cqh-club-update p,#cq-dashboard .cqh-club-update strong,#cq-dashboard .cqh-club-update-links,#cq-dashboard .cqh-footer p,#cq-dashboard .cqh-footer-links{font-size:14px} #cq-dashboard .cqh-special-apply,#cq-dashboard .cqh-club-update-link{min-height:44px} @media(max-width:700px){  #cq-dashboard .cqh-nav{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}  #cq-dashboard h2{font-size:21px}  #cq-dashboard .cqh-table .cqh-date,#cq-dashboard .cqh-table .cqh-region{font-size:14px;width:auto}  #cq-dashboard .cqh-table .cqh-name{font-size:16px}  #cq-dashboard .cqh-table td{padding:0}  #cq-dashboard .cqh-list li>a{display:grid;grid-template-columns:minmax(0,1fr) 16px;gap:4px 12px}  #cq-dashboard .cqh-list time{grid-column:1;grid-row:1}  #cq-dashboard .cqh-list-copy,#cq-dashboard .cqh-list a>span:not(.cqh-arrow){grid-column:1;grid-row:2}  #cq-dashboard .cqh-arrow{grid-column:2;grid-row:1/3;align-self:center}  #cq-dashboard .cqh-club-list li{grid-template-columns:64px minmax(0,1fr)} } #cq-dashboard .cqh-overseas-recruit{border:1px solid #d8e4dd;border-left:4px solid var(--cqh-green);border-radius:7px;background:var(--cqh-soft);padding:20px 22px} #cq-dashboard .cqh-overseas-recruit .cqh-section-head{margin-bottom:14px} #cq-dashboard .cqh-overseas-recruit h3{margin:0 0 8px;font-size:19px;line-height:1.5;letter-spacing:-.3px} #cq-dashboard .cqh-overseas-recruit p{margin:5px 0;font-size:14px;line-height:1.65;color:var(--cqh-muted)} #cq-dashboard .cqh-overseas-recruit .cqh-recruit-dates{color:var(--cqh-ink);font-weight:600} #cq-dashboard .cqh-overseas-recruit .cqh-recruit-link{display:inline-flex;align-items:center;justify-content:center;min-height:44px;margin-top:12px;padding:9px 16px;background:var(--cqh-green);color:#fff;border-radius:6px;font-size:14px;font-weight:600} @media(max-width:700px){#cq-dashboard .cqh-overseas-recruit{padding:16px}#cq-dashboard .cqh-overseas-recruit h3{font-size:18px}} #cq-dashboard{--cqh-standard-ink:#285478;--cqh-standard-bg:#edf4fa;--cqh-rapid-ink:#805315;--cqh-rapid-bg:#fbf3e4;--cqh-blitz-ink:#674578;--cqh-blitz-bg:#f4eef8} #cq-dashboard .cqh-types{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px;max-width:100%} #cq-dashboard .cqh-type{display:inline-flex;align-items:center;max-width:100%;padding:2px 8px;border:1px solid transparent;border-radius:4px;font-size:13px;font-weight:600;line-height:1.5;white-space:nowrap} #cq-dashboard .cqh-type-standard{color:var(--cqh-standard-ink);background:var(--cqh-standard-bg);border-color:#d3e2ee} #cq-dashboard .cqh-type-rapid{color:var(--cqh-rapid-ink);background:var(--cqh-rapid-bg);border-color:#eadbbf} #cq-dashboard .cqh-type-blitz{color:var(--cqh-blitz-ink);background:var(--cqh-blitz-bg);border-color:#e0d4e8} #cq-dashboard .cqh-type-unknown{color:var(--cqh-muted);background:#f5f6f6;border-color:var(--cqh-line)}
/* Participant roster: six initially, accessible native expansion. */
#cq-dashboard .cqh-roster-more{margin-top:12px;min-width:0}
#cq-dashboard .cqh-roster-more>summary{cursor:pointer;min-height:44px;padding:10px 14px;border:1px solid var(--cqh-line);border-radius:6px;background:var(--cqh-soft);font-size:14px;line-height:1.6;overflow-wrap:anywhere}
#cq-dashboard .cqh-roster-more>summary:focus-visible{outline:3px solid #78ac98;outline-offset:3px}
#cq-dashboard .cqh-roster-more .cqh-roster-collapse,#cq-dashboard .cqh-roster-more[open] .cqh-roster-expand{display:none}
#cq-dashboard .cqh-roster-more[open] .cqh-roster-collapse{display:inline}
#cq-dashboard .cqh-roster-more .cqh-list{margin-top:8px!important}
/* Approved responsive tournament dashboard, September 2026. */
body:has(#cq-dashboard) #cq-top-utility{display:flex!important}
body:has(#cq-dashboard) #cq-top-utility .cq-utility-group{display:none!important}
#cq-dashboard [hidden]{display:none!important}
#cq-dashboard .cqn-fresh{margin:0 0 32px;border-top:3px solid var(--cqh-green);border-bottom:1px solid var(--cqh-line)}
#cq-dashboard .cqn-fresh-head{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:17px 16px;background:#edf5f0}
#cq-dashboard .cqn-fresh-head h2{font-size:18px;color:var(--cqh-green)}
#cq-dashboard .cqn-period{font-size:12px;color:var(--cqh-green);white-space:nowrap}
#cq-dashboard .cqn-fresh-row{display:grid;grid-template-columns:80px minmax(0,1fr) auto 24px;gap:16px;align-items:center;padding:18px 16px;border-top:1px solid var(--cqh-line)!important;min-width:0}
#cq-dashboard .cqn-fresh-row:hover{background:var(--cqh-soft)}
#cq-dashboard .cqn-fresh-copy{min-width:0}
#cq-dashboard .cqn-title{font-size:16px;font-weight:750;line-height:1.5;letter-spacing:-.25px;word-break:keep-all;overflow-wrap:anywhere}
#cq-dashboard .cqn-new{display:inline-block;vertical-align:2px;margin-right:7px;padding:1px 5px;border-radius:3px;background:#edf5f0;color:var(--cqh-green);font-size:10px;font-weight:750;letter-spacing:.5px;line-height:1.6;white-space:nowrap}
#cq-dashboard .cqn-meta{display:flex;align-items:center;flex-wrap:wrap;gap:6px 10px;margin-top:6px;color:var(--cqh-muted);font-size:12px;line-height:1.5}
#cq-dashboard .cqn-meta .cqh-types{display:contents;margin:0}
#cq-dashboard .cqn-meta .cqh-type{font-size:11px;padding:1px 6px}
#cq-dashboard .cqn-stamp{color:var(--cqh-muted);font-size:12px;white-space:nowrap}
#cq-dashboard .cqn-fresh-row:first-child .cqn-stamp{color:var(--cqh-green);font-weight:600}
#cq-dashboard .cqn-fresh-arrow{color:var(--cqh-green)}
#cq-dashboard .cqn-inline-date{display:none}
#cq-dashboard .cqn-controls{display:flex;align-items:center;flex-wrap:wrap;gap:12px;margin:0 0 14px}
#cq-dashboard .cqn-view{display:flex;gap:0;border:1px solid var(--cqh-line);border-radius:6px;padding:3px;background:var(--cqh-soft)}
#cq-dashboard .cqn-view button{font:inherit;font-size:13px;min-height:38px;border:0;padding:7px 13px;border-radius:4px;background:transparent;color:var(--cqh-ink);cursor:pointer}
#cq-dashboard .cqn-view button[aria-pressed=true]{background:var(--cqh-green);color:#fff}
#cq-dashboard .cqh-months{margin:0;gap:6px;margin-right:auto}
#cq-dashboard .cqh-months button{font-size:13px;padding:8px 12px}
#cq-dashboard .cqn-sort{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--cqh-muted)}
#cq-dashboard .cqn-sort select{font:inherit;font-size:13px;min-height:44px;padding:8px 10px;border:1px solid var(--cqh-line);border-radius:6px;color:var(--cqh-ink);background:#fff}
#cq-dashboard .cqn-sort select:focus-visible{outline:3px solid #78ac98;outline-offset:3px}
#cq-dashboard .cqn-grid{display:grid;grid-template-columns:96px minmax(0,1fr) 116px 44px;align-items:center;gap:18px}
#cq-dashboard .cqn-list-head{padding:11px 13px;background:var(--cqh-soft);border-top:1px solid var(--cqh-line);border-bottom:1px solid var(--cqh-line);font-size:12px;color:var(--cqh-muted)}
#cq-dashboard .cqn-row{padding:18px 13px;border-bottom:1px solid var(--cqh-line)}
#cq-dashboard .cqn-row:hover{background:var(--cqh-soft)}
#cq-dashboard .cqn-event{min-width:0}
#cq-dashboard .cqn-event .cqn-title{display:block;line-height:1.5}
#cq-dashboard .cqn-event .cqn-title:hover{text-decoration:underline!important;text-underline-offset:3px}
#cq-dashboard .cqn-date{font-size:15px;font-weight:650;font-variant-numeric:tabular-nums;line-height:1.5}
#cq-dashboard .cqn-date small{display:block;margin-top:3px;color:var(--cqh-muted);font-size:11px;font-weight:400}
#cq-dashboard .cqn-audience{margin-top:5px;color:var(--cqh-muted);font-size:12px;line-height:1.5;word-break:keep-all;overflow-wrap:anywhere}
#cq-dashboard .cqn-deadline{font-size:14px;font-weight:650;font-variant-numeric:tabular-nums}
#cq-dashboard .cqn-deadline small{display:block;margin-top:3px;color:var(--cqh-green);font-size:11px;font-weight:400}
#cq-dashboard .cqn-deadline .cqn-urgent{display:inline-block;background:#fff0e7;color:#a24423;font-weight:650;padding:2px 6px;border-radius:3px}
#cq-dashboard .cqn-deadline:empty{min-height:0}
#cq-dashboard .cqn-mobile-label{display:none}
#cq-dashboard .cqn-chevron{display:flex;align-items:center;justify-content:center;width:44px;min-height:44px;color:var(--cqh-muted);font-size:18px}
#cq-dashboard .cqn-cal-heading,#cq-dashboard .cqn-selection{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 0 13px}
#cq-dashboard .cqn-cal-heading h3,#cq-dashboard .cqn-selection h3{font-size:19px;font-weight:700;margin:0;line-height:1.5}
#cq-dashboard .cqn-cal-heading span{font-size:12px;color:var(--cqh-muted)}
#cq-dashboard .cqn-calendar{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:0;background:var(--cqh-line);border:1px solid var(--cqh-line);border-radius:6px;overflow:hidden}
#cq-dashboard #cqn-calendar>*{border-right:1px solid var(--cqh-line);border-bottom:1px solid var(--cqh-line)}
#cq-dashboard #cqn-calendar>:nth-child(7n){border-right:0}
#cq-dashboard #cqn-calendar>:nth-last-child(-n+7){border-bottom:0}
#cq-dashboard .cqn-weekday{background:var(--cqh-soft);text-align:center;padding:10px 0;color:var(--cqh-muted);font-size:12px}
#cq-dashboard .cqn-day{font:inherit;min-width:0;min-height:100px;padding:9px 8px;border:0;border-radius:0;text-align:left;display:flex;flex-direction:column;align-items:stretch;gap:6px;background:#fff;color:var(--cqh-ink);cursor:pointer}
#cq-dashboard .cqn-day:hover{background:var(--cqh-soft)}
#cq-dashboard .cqn-day[aria-pressed=true]{background:#edf5f0;box-shadow:inset 0 0 0 2px var(--cqh-green)}
#cq-dashboard .cqn-day:focus-visible{outline-offset:-3px}
#cq-dashboard .cqn-day-top{display:flex;justify-content:space-between;align-items:center;gap:3px;font-size:12px;font-variant-numeric:tabular-nums}
#cq-dashboard .cqn-day-num{font-weight:650}
#cq-dashboard .cqn-day-count{font-size:11px;color:var(--cqh-green)}
#cq-dashboard .cqn-day-name{padding:2px 4px;border-radius:3px;color:var(--cqh-green);background:#edf5f0;font-size:11px;line-height:1.5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#cq-dashboard .cqn-day-more{font-size:11px;color:var(--cqh-muted)}
#cq-dashboard .cq-fide{display:inline-block;max-width:100%;padding:2px 7px;border:1px solid #b9d1e1;border-radius:4px;background:#eef5fa;color:#285478;font-size:12px;font-weight:600;line-height:1.5;white-space:normal;overflow-wrap:anywhere}
#cq-dashboard .cq-rating{margin-top:7px;min-width:0}
@media(min-width:521px) and (max-width:800px){#cq-dashboard .cq-rating{grid-column:2}}
@media(max-width:520px){#cq-dashboard .cq-rating{margin-top:1px}}
#cq-dashboard .cqn-day-empty{min-height:100px;background:var(--cqh-soft)}
#cq-dashboard .cqn-selection{padding:22px 0 13px}
#cq-dashboard .cqn-selection h3{font-size:17px}
#cq-dashboard .cqn-selection span{font-size:13px;color:var(--cqh-green)}
#cq-dashboard .cqn-empty{padding:24px 12px;text-align:center;font-size:13px;color:var(--cqh-muted)}
#cq-dashboard .cqn-fresh-more{border:0;border-top:1px solid var(--cqh-line);border-radius:0;margin:0;background:var(--cqh-soft)}
@media(max-width:740px){#cq-dashboard .cqn-grid{grid-template-columns:80px minmax(0,1fr) 95px 44px;gap:12px}}
@media(max-width:570px){
#cq-dashboard .cqn-fresh{margin-bottom:28px}
#cq-dashboard .cqn-fresh-head{padding:14px 12px;gap:8px}
#cq-dashboard .cqn-fresh-head h2{font-size:17px}
#cq-dashboard .cqn-period{font-size:11px}
#cq-dashboard .cqn-fresh-row{grid-template-columns:minmax(0,1fr) 20px;gap:7px 9px;padding:16px 12px}
#cq-dashboard .cqn-fresh-copy{grid-column:1;grid-row:1}
#cq-dashboard .cqn-fresh-row>.cqn-date{display:none}
#cq-dashboard .cqn-stamp{grid-column:1;grid-row:2;font-size:11px}
#cq-dashboard .cqn-fresh-arrow{grid-column:2;grid-row:1/span 2}
#cq-dashboard .cqn-inline-date{display:inline;color:var(--cqh-ink);font-weight:600;font-variant-numeric:tabular-nums}
#cq-dashboard .cqn-list-head{display:none}
#cq-dashboard .cqn-event-list{border-top:1px solid var(--cqh-line)}
#cq-dashboard .cqn-row{grid-template-columns:minmax(0,1fr) 44px;grid-template-areas:'title arrow' 'deadline arrow';padding:18px 0;gap:10px 8px}
#cq-dashboard .cqn-row>.cqn-date{display:none}
#cq-dashboard .cqn-event{grid-area:title}
#cq-dashboard .cqn-chevron{grid-area:arrow;align-self:start}
#cq-dashboard .cqn-deadline{grid-area:deadline;display:flex;align-items:center;flex-wrap:wrap;gap:6px;font-size:12px}
#cq-dashboard .cqn-deadline small{margin:0}
#cq-dashboard .cqn-mobile-label{display:inline;font-size:11px;font-weight:400;color:var(--cqh-muted)}
#cq-dashboard .cqn-no-deadline{grid-template-areas:'title arrow'}
#cq-dashboard .cqn-no-deadline .cqn-deadline{display:none}
#cq-dashboard .cqn-day{min-height:65px;padding:9px 4px;gap:4px}
#cq-dashboard .cqn-day-top{flex-direction:column;gap:6px;font-size:13px}
#cq-dashboard .cqn-day-name,#cq-dashboard .cqn-day-more{display:none}
#cq-dashboard .cqn-day-empty{min-height:65px}
#cq-dashboard .cqn-cal-heading h3{font-size:18px}
#cq-dashboard .cqn-cal-heading span{font-size:11px}
#cq-dashboard .cqn-selection h3{font-size:16px}
#cq-dashboard .cqn-controls{gap:10px}
#cq-dashboard .cqn-sort{margin-left:auto}
#cq-dashboard .cqh-months{margin-right:0}
#cq-dashboard .cqh-months button{padding:8px 10px}
}

#cq-dashboard .cqn-event .cqn-title{font-family:inherit;border:0;border-radius:2px;background:transparent;color:inherit;text-align:left;min-height:0;padding:0;cursor:pointer}
#cq-dashboard .cqn-chevron{font:inherit;font-size:20px;padding:0;background:transparent;border:0;border-radius:4px;cursor:pointer}
#cq-dashboard .cqn-chevron[aria-expanded=true] span{transform:rotate(180deg)}
#cq-dashboard .cqn-event-row{border-bottom:1px solid var(--cqh-line)}
#cq-dashboard .cqn-event-row>.cqn-row{border-bottom:0}
#cq-dashboard .cqn-summary{padding:18px 21px;margin:0 13px 14px;border-radius:6px;background:#edf5f0}
#cq-dashboard .cqn-summary dl{display:grid;grid-template-columns:75px minmax(0,1fr);gap:8px 14px;margin:0 0 14px;font-size:13px;line-height:1.6}
#cq-dashboard .cqn-summary dt{color:var(--cqh-muted)}
#cq-dashboard .cqn-summary dd{margin:0;word-break:keep-all;overflow-wrap:anywhere}
#cq-dashboard .cqn-summary-link{display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:9px 15px;border-radius:5px;background:var(--cqh-green);color:#fff!important;font-size:13px;font-weight:650}
@media(max-width:570px){#cq-dashboard .cqn-summary{margin:0 0 14px;padding:16px}#cq-dashboard .cqn-summary dl{grid-template-columns:62px minmax(0,1fr);gap:8px 10px}}

#cq-dashboard .cqn-source-note{margin:0 0 14px;padding:10px 12px;border:1px solid var(--cqh-line);border-radius:6px;background:var(--cqh-soft)}
#cq-dashboard .cqn-source-note a{text-decoration:underline!important;text-underline-offset:3px}
#cq-dashboard .cqn-status-filter{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 14px}
#cq-dashboard .cqn-status-filter button{font:inherit;font-size:14px;min-height:44px;padding:8px 15px;border:1px solid #d8e0dc;border-radius:6px;color:var(--cqh-ink);background:#fff;cursor:pointer}
#cq-dashboard .cqn-status-filter button[aria-pressed=true]{background:var(--cqh-green);border-color:var(--cqh-green);color:#fff}
#cq-dashboard .cqn-status-filter button span{margin-left:5px;font-size:12px;opacity:.85}
#cq-dashboard .cqn-status{display:inline-flex;align-items:center;padding:1px 6px;border:1px solid var(--cqh-line);border-radius:4px;font-size:11px;line-height:1.5;font-weight:600;white-space:nowrap;color:var(--cqh-muted);background:#f5f6f6}
#cq-dashboard .cqn-status.cqn-open,#cq-dashboard .cqn-status.cqn-ongoing{color:#256546;background:#eef6f1;border-color:#d5e5dc}
#cq-dashboard .cqn-status.cqn-partial{color:#805315;background:#fbf3e4;border-color:#eadbbf}
#cq-dashboard .cqn-day-name.cqn-closed,#cq-dashboard .cqn-day-name.cqn-check{color:var(--cqh-muted);background:#f2f4f3}
#cq-dashboard .cqn-summary .cqn-summary-status{margin:0 0 12px;display:flex;gap:6px;flex-wrap:wrap}

    
    #cq-dashboard .cq-available{--cq-bg:light-dark(#ffffff,#191e1b);--cq-ink:light-dark(#252b30,#f0f3f1);--cq-muted:light-dark(#626b66,#adb8b1);--cq-line:light-dark(#dfe6e1,#36423a);--cq-soft:light-dark(#f3f7f5,#222d26);--cq-green:light-dark(#27614d,#9bcdb7);--cq-solid:light-dark(#27614d,#9bcdb7);--cq-solid-ink:light-dark(#ffffff,#183527);--cq-rapid:light-dark(#826124,#ddc694);--cq-rapid-bg:light-dark(#fbf6ea,#302b20);--cq-blitz:light-dark(#745d83,#c6b5d5);--cq-blitz-bg:light-dark(#f6f1f9,#302837);font:400 14px/1.65 'Noto Sans KR',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;color:var(--cq-ink);width:100%;background:var(--cq-bg);border-radius:8px;overflow:clip;text-align:left}
    #cq-dashboard .cq-available *{box-sizing:border-box}
    #cq-dashboard .cq-available [hidden]{display:none!important}
    #cq-dashboard .cq-available button{font:inherit;color:inherit}
    #cq-dashboard .cq-available h1,#cq-dashboard .cq-available h2,#cq-dashboard .cq-available h3,#cq-dashboard .cq-available h4,#cq-dashboard .cq-available p{margin:0}
    #cq-dashboard .cq-available .cq-nav{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px 32px;border-bottom:1px solid var(--cq-line);font-size:13px;font-weight:600}
    #cq-dashboard .cq-available .cq-brand{letter-spacing:.06em;color:var(--cq-green);font-weight:700}
    #cq-dashboard .cq-available .cq-nav-items{display:flex;gap:28px;color:var(--cq-muted)}
    #cq-dashboard .cq-available .cq-page{padding:24px 32px 32px}
    #cq-dashboard .cq-available .cq-breadcrumb{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;gap:12px;color:var(--cq-muted);font-size:12px}
    #cq-dashboard .cq-available .cq-home{display:inline-flex;gap:6px;align-items:center;color:var(--cq-green);font-weight:600}
    #cq-dashboard .cq-available .cq-draft{border:1px solid var(--cq-line);padding:3px 8px;border-radius:4px;white-space:nowrap}
    #cq-dashboard .cq-available h1{font-size:26px;line-height:1.4;letter-spacing:-.8px;font-weight:700;margin-bottom:24px}
    #cq-dashboard .cq-available .cq-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}
    #cq-dashboard .cq-available .cq-title-line{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
    #cq-dashboard .cq-available h2{font-size:20px;line-height:1.4;font-weight:700;letter-spacing:-.5px}
    #cq-dashboard .cq-available .cq-total{font-size:14px;color:var(--cq-green);font-weight:500;font-variant-numeric:tabular-nums}
    #cq-dashboard .cq-available .cq-sub{font-size:13px;color:var(--cq-muted);margin-top:7px}
    #cq-dashboard .cq-available .cq-view{display:flex;gap:4px;padding:4px;border:1px solid var(--cq-line);border-radius:6px;flex-shrink:0}
    #cq-dashboard .cq-available .cq-view button{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:7px 11px;background:transparent;border:0;border-radius:3px;font-size:13px;min-height:36px}
    #cq-dashboard .cq-available .cq-view button[aria-pressed=true]{background:var(--cq-solid);color:var(--cq-solid-ink)}
    #cq-dashboard .cq-available .cq-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:20px 0 24px;padding-bottom:16px;border-bottom:1px solid var(--cq-line);flex-wrap:wrap}
    #cq-dashboard .cq-available .cq-months{display:flex;gap:4px}
    #cq-dashboard .cq-available .cq-months button{border:0;background:transparent;padding:6px 12px;min-height:36px;border-radius:4px;color:var(--cq-muted);font-size:13px}
    #cq-dashboard .cq-available .cq-months button[aria-pressed=true]{background:var(--cq-soft);color:var(--cq-green);font-weight:700}
    #cq-dashboard .cq-available .cq-legend{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--cq-muted)}
    #cq-dashboard .cq-available .cq-new{display:inline-block;background:var(--cq-soft);color:var(--cq-green);font-size:11px;font-weight:700;line-height:1.5;letter-spacing:.06em;padding:2px 5px;border-radius:2px;vertical-align:2px;margin-right:5px}
    #cq-dashboard .cq-available .cq-columns{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:28px;align-items:start}
    #cq-dashboard .cq-available .cq-group{min-width:0;--cq-type:var(--cq-green);--cq-type-bg:var(--cq-soft)}
    #cq-dashboard .cq-available .cq-group[data-type=rapid]{--cq-type:var(--cq-rapid);--cq-type-bg:var(--cq-rapid-bg)}
    #cq-dashboard .cq-available .cq-group[data-type=blitz]{--cq-type:var(--cq-blitz);--cq-type-bg:var(--cq-blitz-bg)}
    #cq-dashboard .cq-available .cq-group-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 14px 15px;border-top:3px solid var(--cq-type);background:var(--cq-type-bg);margin-bottom:2px}
    #cq-dashboard .cq-available .cq-group-title{font-size:18px;font-weight:700;letter-spacing:-.4px;line-height:1.4;color:var(--cq-type)}
    #cq-dashboard .cq-available .cq-en{display:block;font-size:11px;line-height:1.5;letter-spacing:.12em;margin-top:3px;font-weight:500;color:var(--cq-type)}
    #cq-dashboard .cq-available .cq-count{font-size:13px;font-weight:600;color:var(--cq-type);white-space:nowrap;font-variant-numeric:tabular-nums}
    #cq-dashboard .cq-available .cq-event{padding:18px 4px;border-bottom:1px solid var(--cq-line)}
    #cq-dashboard .cq-available .cq-event-meta{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--cq-muted);margin-bottom:7px;flex-wrap:wrap}
    #cq-dashboard .cq-available .cq-date{font-size:14px;line-height:1.5;color:var(--cq-ink);font-weight:700;font-variant-numeric:tabular-nums}
    #cq-dashboard .cq-available .cq-weekday{font-size:12px;font-weight:400;color:var(--cq-muted);margin-left:3px}
    #cq-dashboard .cq-available .cq-region{border-left:1px solid var(--cq-line);padding-left:8px}
    #cq-dashboard .cq-available .cq-deadline{display:inline-flex;align-items:center;flex:none;white-space:nowrap;font-size:11px;font-weight:700;line-height:1.5;padding:2px 6px;border:1px solid #dfe3e1;border-radius:4px;font-variant-numeric:tabular-nums}
    #cq-dashboard .cq-available .cq-deadline-week{color:#59665f;background:#f3f5f4;border-color:#dfe3e1}
    #cq-dashboard .cq-available .cq-deadline-soon{color:#98430b;background:#fff2e6;border-color:#f2d0aa}
    #cq-dashboard .cq-available .cq-deadline-today{color:#a52828;background:#fff0f0;border-color:#edc4c4}
    @media(min-width:521px) and (max-width:800px){#cq-dashboard .cq-available .cq-deadline{margin-top:6px}}
    #cq-dashboard .cq-available .cq-event h4{font-size:15px;line-height:1.7;font-weight:600;letter-spacing:-.3px;word-break:keep-all;overflow-wrap:anywhere}
    #cq-dashboard .cq-available .cq-audience{font-size:12px;color:var(--cq-muted);margin-top:6px;word-break:keep-all;overflow-wrap:anywhere}
    #cq-dashboard .cq-available .cq-more{display:flex;align-items:center;justify-content:center;width:100%;gap:8px;min-height:44px;background:var(--cq-bg);border:1px solid var(--cq-line);border-radius:4px;margin-top:12px;font-size:13px;color:var(--cq-ink)}
    #cq-dashboard .cq-available .cq-more:hover{background:var(--cq-soft)}
    #cq-dashboard .cq-available .cq-end{font-size:12px;color:var(--cq-muted);padding:12px 4px}
    #cq-dashboard .cq-available .cq-empty{font-size:13px;color:var(--cq-muted);padding:24px 4px;border-bottom:1px solid var(--cq-line)}
    #cq-dashboard .cq-available .cq-unclassified{margin-top:24px;border-top:1px solid var(--cq-line);border-bottom:1px solid var(--cq-line);padding:0 4px;font-size:12px;color:var(--cq-muted)}
    #cq-dashboard .cq-available .cq-unclassified summary{padding:13px 0}
    #cq-dashboard .cq-available .cq-unclassified-body{padding:0 0 14px;color:var(--cq-ink);font-size:13px}
    #cq-dashboard .cq-available .cq-unclassified-body p{margin-top:5px;color:var(--cq-muted);font-size:12px}
    #cq-dashboard .cq-available .cq-note{font-size:12px;color:var(--cq-muted);margin-top:12px}
    #cq-dashboard .cq-available .cq-bottom{border-top:1px solid var(--cq-line);margin-top:32px;padding-top:20px;display:flex;gap:28px;flex-wrap:wrap;font-size:14px;font-weight:600;color:var(--cq-muted)}
    #cq-dashboard .cq-available .cq-calendar{margin-bottom:24px}
    #cq-dashboard .cq-available .cq-calendar-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
    #cq-dashboard .cq-available .cq-calendar-head h3{font-size:17px;font-weight:700}
    #cq-dashboard .cq-available .cq-calendar-key{display:flex;gap:12px;font-size:11px;color:var(--cq-muted);flex-wrap:wrap}
    #cq-dashboard .cq-available .cq-calendar-key span{display:inline-flex;align-items:center;gap:4px}
    #cq-dashboard .cq-available .cq-dot{width:5px;height:5px;border-radius:50%;display:inline-block;background:var(--cq-green);flex:none}
    #cq-dashboard .cq-available .cq-dot.rapid{background:var(--cq-rapid)}
    #cq-dashboard .cq-available .cq-dot.blitz{background:var(--cq-blitz)}
    #cq-dashboard .cq-available .cq-dot.unknown{background:var(--cq-muted)}
    #cq-dashboard .cq-available .cq-calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:1px;background:var(--cq-line);border:1px solid var(--cq-line);border-radius:4px;overflow:hidden}
    #cq-dashboard .cq-available .cq-dow{padding:6px;text-align:center;font-size:11px;color:var(--cq-muted);background:var(--cq-soft)}
    #cq-dashboard .cq-available .cq-day{display:flex;flex-direction:column;align-items:flex-start;gap:3px;min-height:68px;padding:8px;border:0;background:var(--cq-bg);font-size:12px;text-align:left}
    #cq-dashboard .cq-available .cq-day[aria-pressed=true]{background:var(--cq-soft);box-shadow:inset 0 0 0 2px var(--cq-green)}
    #cq-dashboard .cq-available .cq-day:disabled{color:var(--cq-muted);cursor:default}
    #cq-dashboard .cq-available .cq-day-empty{background:var(--cq-soft)}
    #cq-dashboard .cq-available .cq-day-count{font-size:11px;color:var(--cq-muted)}
    #cq-dashboard .cq-available .cq-day-dots{display:flex;gap:3px}
    #cq-dashboard .cq-available .cq-selection{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:12px;font-size:13px;color:var(--cq-green)}
    #cq-dashboard .cq-available .cq-selection button{border:0;background:transparent;padding:6px 0;font-size:12px;text-decoration:underline;text-underline-offset:4px}
    #cq-dashboard .cq-available .cq-status{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
    @media(max-width:800px){#cq-dashboard .cq-available .cq-columns{grid-template-columns:minmax(0,1fr);gap:24px}#cq-dashboard .cq-available .cq-group-head{padding:12px 14px}#cq-dashboard .cq-available .cq-en{display:inline;font-size:11px;margin:0 0 0 10px}#cq-dashboard .cq-available .cq-event{display:grid;grid-template-columns:118px minmax(0,1fr);column-gap:16px;padding:16px 4px}#cq-dashboard .cq-available .cq-event-meta{display:block;margin:0}#cq-dashboard .cq-available .cq-date{display:block}#cq-dashboard .cq-available .cq-region{display:block;border:0;padding:4px 0 0}#cq-dashboard .cq-available .cq-audience{grid-column:2}#cq-dashboard .cq-available .cq-event h4{align-self:center}#cq-dashboard .cq-available .cq-end{padding-bottom:0}#cq-dashboard .cq-available .cq-more{margin-top:10px}#cq-dashboard .cq-available .cq-nav-items{gap:16px}}
    @media(max-width:520px){#cq-dashboard .cq-available .cq-page{padding:20px 16px 24px}#cq-dashboard .cq-available .cq-nav{padding:14px 16px;gap:12px}#cq-dashboard .cq-available .cq-nav-items{font-size:11px;gap:12px}#cq-dashboard .cq-available .cq-nav-items span:last-child{display:none}#cq-dashboard .cq-available h1{font-size:22px;margin-bottom:22px}#cq-dashboard .cq-available .cq-heading{align-items:flex-start;gap:16px}#cq-dashboard .cq-available h2{font-size:19px}#cq-dashboard .cq-available .cq-view{width:100%;display:grid;grid-template-columns:1fr 1fr}#cq-dashboard .cq-available .cq-view button{min-height:40px}#cq-dashboard .cq-available .cq-toolbar{gap:10px;margin:16px 0 20px;padding-bottom:14px}#cq-dashboard .cq-available .cq-months{width:100%;justify-content:space-between}#cq-dashboard .cq-available .cq-months button{min-height:40px;flex:1}#cq-dashboard .cq-available .cq-event{grid-template-columns:minmax(0,1fr);gap:6px;padding:16px 2px}#cq-dashboard .cq-available .cq-event-meta{display:flex;gap:8px;margin:0}#cq-dashboard .cq-available .cq-region{display:inline;padding:0 0 0 8px;border-left:1px solid var(--cq-line)}#cq-dashboard .cq-available .cq-audience{grid-column:1;margin-top:0}#cq-dashboard .cq-available .cq-group-title{font-size:18px}#cq-dashboard .cq-available .cq-day{min-height:58px;padding:6px}#cq-dashboard .cq-available .cq-calendar-head{align-items:flex-start;flex-direction:column;gap:6px}#cq-dashboard .cq-available .cq-bottom{gap:16px;font-size:13px}#cq-dashboard .cq-available .cq-breadcrumb{margin-bottom:16px}}
  
#cq-dashboard .cq-available{font-family:inherit;border-radius:0;padding-bottom:32px} #cq-dashboard .cq-available .cq-view{flex-wrap:wrap} #cq-dashboard .cq-available .cq-all-link{display:flex;align-items:center;padding:7px 10px;font-size:12px;color:var(--cqh-muted)} #cq-dashboard .cq-available .cq-event a:hover{text-decoration:underline!important;text-underline-offset:4px} #cq-dashboard .cq-available .cq-event h4{margin:0} #cq-dashboard .cq-available [hidden]{display:none!important} #cq-dashboard #cq-calendar-panel{margin-top:24px} #cq-dashboard #cq-calendar-panel .cqn-fresh,#cq-dashboard #cq-calendar-panel .cqh-upcoming>.cqh-section-head,#cq-dashboard #cq-calendar-panel .cqn-view{display:none!important} #cq-dashboard .cq-available .cq-months{flex-wrap:wrap} #cq-dashboard #cq-calendar-panel .cqn-list-head{grid-template-columns:116px minmax(0,1fr) 40px} #cq-dashboard #cq-calendar-panel .cqn-list-head>span:nth-child(3){display:none} #cq-dashboard #cq-calendar-panel .cqn-row{grid-template-columns:116px minmax(0,1fr) 40px} #cq-dashboard #cq-calendar-panel .cqn-deadline{display:none} @media(max-width:570px){#cq-dashboard #cq-calendar-panel .cqn-row{grid-template-columns:minmax(0,1fr) 32px}}
</style><script>(function(){"use strict";const PAGE="fee695e233ef40f6aad37cdf54f41061";const VIEWS={archive:"3fa27f52bbd581d9a9c1000c5159b601",open:"3e227f52bbd581a2be88000ca5fd191f",future:"3ea27f52bbd58112b6b4000c48837061",rosters:"3e227f52bbd58138800f000c1b7a5fca",results:"3e227f52bbd581329981000c22920c5b",clubs:"3e227f52bbd5810b8260000c8d84bbb2",news:"89e7e91b7378459eae011f1052229c82"};const SOURCES={events:"d2f0b6954848424ea981592226c0ecd5",news:"29949d9585344126bfd4ffddb7db523d",clubs:"358d97d6f88a4b7d87415821b4d8af6e"};const RECOMMENDED=new Set(["31b27f52bbd58084953bdc00dd6963c1","3cd27f52bbd5809aaea1f10197bc2ef2","3c127f52bbd5815eb091cdc5f841eba7","3db27f52bbd58139902ce3dc65754e3b"]);const URLS={map:"/tournament-map",calendar:"/national-chess",clubs:"/8686b405-b761-4368-a7ee-ca11278641ab",news:"/22a27f52-bbd5-80d3-ac9a-f7d023c3d963",rosters:"/national-chess?section=rosters&view=list",results:"/national-chess?section=results&view=list",open:"/3e227f52-bbd5-811e-b6a1-d2013e782c7d"};const compact=s=>String(s||"").replace(/-/g,"");const text=v=>Array.isArray(v)?v.map(x=>Array.isArray(x)?String(x[0]||""):"").join(""):String(v||"");const esc=s=>String(s||"").replace(/[&<>"']/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[c]));function date(v){if(!Array.isArray(v))return null;for(const x of v){if(x&&!Array.isArray(x)&&x.start_date)return x;const d=date(x);if(d)return d}return null}function today(){return new Date(Date.now()+9*36e5).toISOString().slice(0,10)}function dateLabel(start,end){const fmt=d=>d?Number(d.slice(5,7))+"."+Number(d.slice(8,10)):"일정 확인";return fmt(start)+(end&&end!==start?"–"+fmt(end):"")}function tournamentTypes(tags){const values=new Set(tags.map(value=>String(value).trim()));const types=[{key:"standard",label:"스탠다드",tags:["스탠다드"]},{key:"rapid",label:"래피드",tags:["래피드"]},{key:"blitz",label:"블리츠",tags:["블리츠","블릿츠"]}];const explicit=types.filter(type=>type.tags.some(tag=>values.has(tag)));if(explicit.length)return explicit;return types.filter(type=>type.key==="standard"&&values.has("스탠다드접수중"))}function tournamentTypeBadges(tags){const types=tournamentTypes(tags);return'<span class="cqh-types">'+(types.length?types.map(type=>'<span class="cqh-type cqh-type-'+type.key+'">'+type.label+"</span>").join(""):'<span class="cqh-type cqh-type-unknown">유형 확인</span>')+"</span>"}
function isCancelled(row) {
  return row.tags.includes('취소') || row.state === '취소' || /\[\s*취소\s*\]/.test(row.title);
}
function isClosed(row, day) {
  const explicit = row.tags.some(tag => ['마감','접수마감','접수 마감','모집마감','모집 마감'].includes(tag)) ||
    ['마감','접수마감','접수 마감','모집마감','모집 마감'].includes(row.state) || /\[\s*마감\s*\]|접수\s*마감|모집\s*마감/.test(row.title);
  const fallbackCutoff = !row.deadline && !row.deadlineAt && row.start
    ? new Date(Date.parse(row.start + 'T00:00:00Z') - 7 * 86400000).toISOString().slice(0, 10) : '';
  return explicit || !!(fallbackCutoff && day >= fallbackCutoff) || !!(row.deadlineAt ? row.deadlineAt <= Date.now() : row.deadline && row.deadline < day);
}
function isOpen(row, day) {
  if (!row.start || (row.end || row.start) < day || isCancelled(row) || isClosed(row, day) || row.state === '접수 예정') return false;
  return row.state === '접수 중' || row.tags.some(tag => tag === '스탠다드접수중' || tag === '래피드접수중' || tag === '접수중');
}
function isDomestic(row) {
  const place = [row.address, row.place].filter(Boolean).join(' ');
  if (row.tags.includes('온라인') || /\bonline\b|온라인/i.test(place)) return false;
  if (row.region && row.region !== '지역 확인') return true;
  if (row.latitude > 33 && row.latitude < 39 && row.longitude > 124 && row.longitude < 132) return true;
  if (/\bSouth Korea\b|대한민국/i.test(place)) return true;
  return row.tags.includes('국내대회') && !row.tags.includes('해외대회');
}
function isScheduledDomestic(row) {
  return !!validDay(row.start) && (row.end || row.start) >= row.start && !isCancelled(row) && isDomestic(row);
}
function registrationStatus(row, day) {
  if ((row.end || row.start) < day) return {key:'closed', label:'대회 종료'};
  if (row.state === '접수 예정') return {key:'check', label:'접수 예정'};
  if (isClosed(row, day)) return {key:'closed', label:'접수 마감'};
  if (row.state === '대기자 접수 중') return {key:'partial', label:'대기자 접수 중'};
  if (/\[[^\]]+마감\]/.test(row.title) || row.tags.includes('일부 마감') || row.state === '일부 마감') return {key:'partial', label:'일부 마감'};
  if (isOpen(row, day)) return {key:'open', label:'접수 중'};
  return {key:'check', label:'접수 정보 미확인'};
}
function eventStatusMarkup(row, day) {
  const status = registrationStatus(row, day);
  return (onDay(row, day) ? '<span class="cqn-status cqn-ongoing">진행 중</span>' : '') +
    '<span class="cqn-status cqn-' + status.key + '">' + status.label + '</span>';
}
function region(tags,address){const places=["서울","경기","인천","강원","대전","세종","충북","충남","대구","경북","부산","울산","경남","광주","전북","전남","제주"];const known=places.find(x=>tags.includes(x));if(known)return known;const aliases={"경기도":"경기","충청북도":"충북","충청남도":"충남","경상북도":"경북","경상남도":"경남","전라북도":"전북","전라남도":"전남"};const full=Object.keys(aliases).find(x=>address.startsWith(x));return full?aliases[full]:places.find(x=>address.startsWith(x))||"지역 확인"}
function validDay(value) {
  const candidate = String(value || '').slice(0, 10);
  if (!/^\d{4}-\d{2}-\d{2}$/.test(candidate)) return '';
  const parsed = new Date(candidate + 'T00:00:00Z');
  return Number.isFinite(parsed.getTime()) && parsed.toISOString().slice(0, 10) === candidate ? candidate : '';
}
function kstDay(timestamp) {
  if (!Number.isFinite(timestamp) || timestamp <= 0) return '';
  const value = new Date(timestamp + 9 * 36e5);
  return Number.isFinite(value.getTime()) ? value.toISOString().slice(0, 10) : '';
}
function dayGap(from, to) {
  if (!validDay(from) || !validDay(to)) return NaN;
  return Math.round((Date.parse(to + 'T00:00:00Z') - Date.parse(from + 'T00:00:00Z')) / 864e5);
}

function zonedParts(timestamp, zone) {
  const parts = new Intl.DateTimeFormat('en-CA', {timeZone:zone, year:'numeric', month:'2-digit', day:'2-digit', hour:'2-digit', minute:'2-digit', second:'2-digit', hourCycle:'h23'}).formatToParts(new Date(timestamp));
  return Object.fromEntries(parts.filter(part => part.type !== 'literal').map(part => [part.type, part.value]));
}
function zonedTimestamp(day, time, zone) {
  try {
    const offset = String(zone || '').match(/^(?:UTC|GMT)([+-])(\d{1,2})(?::?(\d{2}))?$/i);
    if (offset && +offset[2] <= 14 && +(offset[3] || 0) < 60) {
      const minutes = (+offset[2] * 60 + +(offset[3] || 0)) * (offset[1] === '+' ? 1 : -1);
      return Date.parse(day + 'T' + time + ':00Z') - minutes * 60000;
    }
    const [year, month, date] = day.split('-').map(Number);
    const [hour, minute] = time.split(':').map(Number);
    const desired = Date.UTC(year, month - 1, date, hour, minute);
    let guess = desired;
    for (let index = 0; index < 3; index++) {
      const p = zonedParts(guess, zone);
      const observed = Date.UTC(+p.year, +p.month - 1, +p.day, +p.hour, +p.minute, +p.second);
      const next = guess + desired - observed;
      if (next === guess) break;
      guess = next;
    }
    const check = zonedParts(guess, zone);
    return check.year + '-' + check.month + '-' + check.day === day && check.hour + ':' + check.minute === time ? guess : 0;
  } catch (error) { return 0; }
}
function deadlineInfo(value) {
  const raw = String(value?.start_date || '');
  const day = validDay(raw);
  if (!day) return {deadline:'', deadlineTime:'', deadlineAt:0};
  const offsetTimestamp = /T\d{2}:\d{2}.*(?:Z|[+-]\d{2}:?\d{2})$/i.test(raw) ? Date.parse(raw) : NaN;
  if (Number.isFinite(offsetTimestamp)) {
    // Explicit instants are displayed in the Korean site's time zone.
    const zone = 'Asia/Seoul';
    try {
      const parts = zonedParts(offsetTimestamp, zone);
      return {deadline:parts.year + '-' + parts.month + '-' + parts.day, deadlineTime:parts.hour + ':' + parts.minute, deadlineAt:offsetTimestamp};
    } catch (error) { return {deadline:day, deadlineTime:'', deadlineAt:offsetTimestamp}; }
  }
  const found = String(value?.start_time || '').match(/^(\d{1,2}):(\d{2})(?::\d{2})?$/);
  const time = found && +found[1] < 24 && +found[2] < 60 ? found[1].padStart(2, '0') + ':' + found[2] : '';
  const instant = time ? zonedTimestamp(day, time, value?.time_zone || 'Asia/Seoul') : 0;
  if (instant) {
    const parts = zonedParts(instant, 'Asia/Seoul');
    return {deadline:parts.year + '-' + parts.month + '-' + parts.day, deadlineTime:parts.hour + ':' + parts.minute, deadlineAt:instant};
  }
  return {deadline:day, deadlineTime:time, deadlineAt:0};
}
function calendarLabel(title) {
  const short = String(title || '').replace(/^(?:\s*(?:제\s*\d+\s*회|\d{4}(?:년)?))\s*/g, '')
    .replace(/^제\s*\d+\s*회\s*/, '').replace(/^마인드스포츠올림피아드\s*/, '')
    .replace(/(?:\s*FIDE\s*공인)/gi, '').replace(/체스연맹\s*회장배/g, '회장배')
    .replace(/연맹\s*회장배/g, '회장배').replace(/\s*체스대회(?=\s*(?:[·(]|$))/g, '')
    .replace(/\s+/g, ' ').trim();
  return short || String(title || '');
}

function eventMonths(rows) {
  const values = new Set();
  rows.forEach(row => {
    if (!validDay(row.start)) return;
    const finish = validDay(row.end) && row.end >= row.start ? row.end : row.start;
    const cursor = new Date(row.start.slice(0, 7) + '-01T00:00:00Z');
    while (cursor.toISOString().slice(0, 7) <= finish.slice(0, 7)) {
      values.add(cursor.toISOString().slice(0, 7));
      cursor.setUTCMonth(cursor.getUTCMonth() + 1);
    }
  });
  return [...values].sort();
}
function inMonth(row, month) {
  if (!month) return true;
  return row.start.slice(0, 7) <= month && (row.end || row.start).slice(0, 7) >= month;
}
function onDay(row, day) { return row.start <= day && (row.end || row.start) >= day; }
function freshEvents(rows, day) {
  return rows.filter(row => { const age = dayGap(row.createdDate, day); return age >= 0 && age < 7 && !(row.createdAt > Date.now()); })
    .sort((a, b) => b.createdDate.localeCompare(a.createdDate) || b.createdAt - a.createdAt || a.title.localeCompare(b.title, 'ko'));
}
function dayName(day) {
  const value = validDay(day);
  return value ? ['일요일','월요일','화요일','수요일','목요일','금요일','토요일'][new Date(value + 'T00:00:00Z').getUTCDay()] : '';
}
function eventDayName(row) {
  return row.end && row.end !== row.start ? dayName(row.start).replace('요일', '') + '–' + dayName(row.end) : dayName(row.start);
}
function deadlineMarkup(row, day) {
  if (!row.deadline) return '';
  const left = dayGap(day, row.deadline);
  const label = !isOpen(row, day) ? '' : left === 0 ? '오늘 마감' : left > 0 ? 'D-' + left : '';
  return '<span class="cqn-mobile-label">접수마감</span><span>' + esc(dateLabel(row.deadline)) + (row.deadlineTime ? ' ' + esc(row.deadlineTime) : '') + '</span>' +
    (label ? '<small' + (left <= 7 ? ' class="cqn-urgent"' : '') + '>' + label + '</small>' : '');
}
// The source field is populated only from explicit official rated-event evidence.
// A blank field means unverified, never "not rated"; this is not a results-processing status.
function fideBadge(row) {
  const scope = String(row.fideRating || '').trim();
  return scope ? '<span class="cq-fide" title="' + esc('FIDE ' + scope + ' 레이팅 반영 대상 대회') + '">FIDE 레이팅 반영 · ' + esc(scope) + '</span>' : '';
}
function eventMeta(row, day) {
  const types = tournamentTypes(row.tags);
  return '<span class="cqn-inline-date">' + esc(dateLabel(row.start, row.end)) + '</span>' +
    (row.region && row.region !== '지역 확인' ? '<span>' + esc(row.region) + '</span>' : '') +
    (types.length ? '<span class="cqh-types">' + types.map(type => '<span class="cqh-type cqh-type-' + type.key + '">' + type.label + '</span>').join('') + '</span>' : '') +
    (row.recommended ? '<span class="cqh-recommended">추천</span>' : '') +
    fideBadge(row) + eventStatusMarkup(row, day);
}

function tournamentRows(rows, day) {
  return rows.map(row => {
    const id = 'cqn-summary-' + compact(row.id);
    return `<article class="cqn-event-row"><div class="cqn-row cqn-grid${row.deadline ? '' : ' cqn-no-deadline'}">
      <time class="cqn-date" datetime="${esc(row.start)}">${esc(dateLabel(row.start,row.end))}<small>${esc(eventDayName(row))}</small></time>
      <div class="cqn-event"><button type="button" class="cqn-title" data-expand="${esc(compact(row.id))}" aria-expanded="false" aria-controls="${esc(id)}">${esc(row.title)}</button><div class="cqn-meta">${eventMeta(row, day)}</div>${row.audience ? `<div class="cqn-audience">${esc(row.audience)}</div>` : ''}</div>
      <div class="cqn-deadline">${deadlineMarkup(row, day)}</div><button type="button" class="cqn-chevron" data-expand="${esc(compact(row.id))}" aria-expanded="false" aria-controls="${esc(id)}" aria-label="${esc(row.title)} 요약 보기"><span aria-hidden="true">⌄</span></button>
      </div><div class="cqn-summary" id="${esc(id)}" hidden><div class="cqn-summary-status">${eventStatusMarkup(row, day)}</div><dl><dt>대회일</dt><dd>${esc(row.start.slice(0,4))}년 ${esc(dateLabel(row.start,row.end))} · ${esc(eventDayName(row))}</dd>${row.place ? `<dt>장소</dt><dd>${esc(row.place)}</dd>` : ''}${row.audience ? `<dt>참가대상</dt><dd>${esc(row.audience)}</dd>` : ''}${row.deadline ? `<dt>접수마감</dt><dd>${esc(row.deadline.slice(0,4))}년 ${esc(dateLabel(row.deadline))}${row.deadlineTime ? ' ' + esc(row.deadlineTime) : ''}</dd>` : ''}</dl><a class="cqn-summary-link" href="${esc(row.url)}">${isOpen(row, day) ? '상세 안내·참가 신청' : '상세 안내'} <span aria-hidden="true">↗</span></a></div>
    </article>`;
  }).join('');
}
function tournamentSection(data) {
  return `<section class="cq-available" aria-labelledby="cq-available-title">
    <div class="cq-heading"><div><div class="cq-title-line"><h2 id="cq-available-title">참가 가능한 대회</h2><span class="cq-total" id="cq-total">${data.open.length}개</span></div><p class="cq-sub">종목별로 접수 중인 대회를 확인하세요.</p></div><div class="cq-view" role="group" aria-label="대시보드 보기"><button type="button" data-cq-view="groups" aria-pressed="true">종목별 목록</button><button type="button" data-cq-view="calendar" aria-pressed="false">달력</button><a class="cq-all-link" href="${URLS.calendar}?section=all&view=list">전체 일정 ↗</a></div></div>
    ${data.openPartial ? `<p class="cq-note" role="status">일부 대회만 불러왔습니다. <a href="${URLS.calendar}?section=all&view=list">전체 일정</a>에서 추가 대회를 확인해 주세요.</p>` : ''}
    <div id="cq-list-panel"><div class="cq-toolbar"><div class="cq-months" role="group" aria-label="참가 가능한 대회 월 선택"></div><span class="cq-legend">마감 임박 우선 · 그 외 대회일순</span></div>
    <div class="cq-columns">${[['standard','스탠다드','STANDARD'],['rapid','래피드','RAPID'],['blitz','블리츠','BLITZ']].map(([key,label,en])=>`<section class="cq-group" data-type="${key}" aria-labelledby="cq-${key}-title"><div class="cq-group-head"><h3 class="cq-group-title" id="cq-${key}-title">${label}<span class="cq-en">${en}</span></h3><span class="cq-count" id="cq-${key}-count"></span></div><div id="cq-${key}-events"></div><div id="cq-${key}-footer"></div></section>`).join('')}</div>
    <details class="cq-unclassified" id="cq-unclassified" hidden><summary>종목 확인 중인 대회 <span id="cq-unknown-count"></span></summary><div class="cq-unclassified-body" id="cq-unclassified-body"></div></details><p class="cq-note">참가 조건과 잔여 인원은 대회별 상세 안내를 확인해 주세요.</p><p class="cq-status" id="cq-live" role="status" aria-live="polite"></p></div>
    <div id="cq-calendar-panel" hidden>${calendarTournamentSection(data)}</div>
  </section>`;
}
// Only verified registration deadlines, never the event date or the fallback cutoff.
function registrationUrgency(row, day) {
  if (!validDay(row.deadline) || !isOpen(row, day)) return null;
  const left = dayGap(day, row.deadline);
  return Number.isFinite(left) && left >= 0 && left <= 7 ? left : null;
}
function registrationBadge(row, day) {
  const left = registrationUrgency(row, day);
  if (left === null) return '';
  const tone = left === 0 ? 'today' : left <= 3 ? 'soon' : 'week';
  return '<span class="cq-deadline cq-deadline-' + tone + '">' + (left === 0 ? '오늘 마감' : '마감 D-' + left) + '</span>';
}
function prioritizeRegistration(rows, day) {
  return rows.map((row, index) => ({row, index, left:registrationUrgency(row, day)}))
    .sort((a,b) => (a.left === null ? 8 : a.left) - (b.left === null ? 8 : b.left) || a.index - b.index)
    .map(item => item.row);
}
function mountTournamentGroups(root,data){
  const host=root.querySelector('.cq-available');
  const day=today(),names={standard:'스탠다드',rapid:'래피드',blitz:'블리츠'};
  const fresh=freshEvents(data.open,day),rank=new Map(fresh.map((row,index)=>[row.id,index]));
  const months=eventMonths(data.open);
  let month='',view='groups';
  const expanded={standard:false,rapid:false,blitz:false};
  const find=id=>host.querySelector('#'+id);
  function card(row){
    return `<article class="cq-event"><div class="cq-event-meta"><time class="cq-date" datetime="${esc(row.start)}">${esc(dateLabel(row.start,row.end))}<span class="cq-weekday">${esc(eventDayName(row).replace(/요일/g,''))}</span></time>${row.region&&row.region!=='지역 확인'?`<span class="cq-region">${esc(row.region)}</span>`:''}${registrationBadge(row,day)}</div><h4>${rank.has(row.id)?'<span class="cq-new">NEW</span>':''}<a href="${esc(row.url)}">${esc(row.title)}</a></h4>${row.audience?`<p class="cq-audience">${esc(row.audience)}</p>`:''}${row.fideRating?`<div class="cq-rating">${fideBadge(row)}</div>`:''}</article>`;
  }
  function render(){
    const rows=data.open.filter(row=>isOpen(row,day)&&inMonth(row,month));
    find('cq-total').textContent=rows.length+'개';
    host.querySelector('.cq-months').innerHTML=[['','전체'],...months.map(value=>[value,(value.slice(0,4)!==day.slice(0,4)?value.slice(0,4)+'년 ':'')+Number(value.slice(5))+'월'])].map(([value,label])=>`<button type="button" data-cq-month="${value}" aria-pressed="${month===value}">${esc(label)}</button>`).join('');
    for(const key of Object.keys(names)){
      const list=prioritizeRegistration(rows.filter(row=>tournamentTypes(row.tags).some(type=>type.key===key)).sort((a,b)=>a.start.localeCompare(b.start)||a.title.localeCompare(b.title,'ko')),day);
      const shown=expanded[key]?list:list.slice(0,3);
      find('cq-'+key+'-count').textContent=list.length+'개';
      find('cq-'+key+'-events').innerHTML=shown.length?shown.map(card).join(''):`<p class="cq-empty">${month?'선택한 달에':'현재'} 접수 중인 ${names[key]} 대회가 없습니다.</p>`;
      find('cq-'+key+'-footer').innerHTML=list.length>3?`<button class="cq-more" type="button" data-cq-expand="${key}" aria-expanded="${expanded[key]}" aria-controls="cq-${key}-events">${expanded[key]?names[key]+' 접기':names[key]+' 더 보기 · '+(list.length-3)+'개'} <span aria-hidden="true">${expanded[key]?'−':'+'}</span></button>`:list.length?`<p class="cq-end">${names[key]} ${list.length}개 모두 표시</p>`:'';
    }
    const unknown=rows.filter(row=>!tournamentTypes(row.tags).length);
    find('cq-unclassified').hidden=!unknown.length;
    find('cq-unknown-count').textContent=unknown.length+'개';
    find('cq-unclassified-body').innerHTML=unknown.map(row=>`<p><a href="${esc(row.url)}">${esc(dateLabel(row.start,row.end))} · ${esc(row.title)}</a></p>`).join('');
    find('cq-live').textContent=(month?Number(month.slice(5))+'월':'전체')+' · '+rows.length+'개 대회를 종목별로 표시합니다.';
  }
  host.addEventListener('click',event=>{
    const button=event.target.closest('button');if(!button||!host.contains(button))return;
    if(button.hasAttribute('data-cq-month')){
      month=button.dataset.cqMonth;Object.keys(expanded).forEach(key=>expanded[key]=false);render();host.querySelector('[data-cq-month="'+month+'"]').focus({preventScroll:true});
    }else if(button.dataset.cqExpand){
      const key=button.dataset.cqExpand;expanded[key]=!expanded[key];render();host.querySelector('[data-cq-expand="'+key+'"]').focus({preventScroll:true});
    }else if(button.dataset.cqView){
      view=button.dataset.cqView;
      find('cq-list-panel').hidden=view!=='groups';find('cq-calendar-panel').hidden=view!=='calendar';
      find('cq-available-title').textContent=view==='groups'?'참가 가능한 대회':'대회 일정';
      find('cq-total').hidden=view!=='groups';
      host.querySelector('.cq-sub').textContent=view==='groups'?'종목별로 접수 중인 대회를 확인하세요.':'지난 대회와 앞으로 열릴 국내 대회를 확인하세요.';
      host.querySelectorAll('[data-cq-view]').forEach(el=>el.setAttribute('aria-pressed',String(el.dataset.cqView===view)));
    }
  });
  render();
}

function calendarTournamentSection(data) {
  return `<section class="cqn-fresh" aria-labelledby="cqn-fresh-title" hidden>
    <div class="cqn-fresh-head"><h2 id="cqn-fresh-title">신규 대회 <span class="cqh-total" id="cqn-fresh-count"></span></h2><span class="cqn-period">최근 7일</span></div>
    <div id="cqn-fresh-list"></div><button class="cqh-expand cqn-fresh-more" id="cqn-fresh-more" type="button" aria-expanded="false" aria-controls="cqn-fresh-list" hidden>신규 대회 더 보기</button>
  </section>
  <section class="cqh-section cqh-upcoming" aria-labelledby="cqh-upcoming-title">
    <div class="cqh-section-head"><h2 id="cqh-upcoming-title">대회 일정 <span class="cqh-total" id="cqn-event-total">${data.eventsPartial ? '불러온 ' : ''}${data.events.length}개</span></h2><a class="cqh-more" href="${URLS.calendar}?section=all&view=list">전체 일정 <span aria-hidden="true">↗</span></a></div>
    ${data.eventsPartial ? `<p class="cqh-note cqn-source-note" role="status">일부 일정만 불러왔습니다. <a href="${URLS.calendar}?section=all&view=list">전체 일정</a>에서 추가 대회를 확인해 주세요.</p>` : ''}
    <div class="cqn-status-filter" role="group" aria-label="대회 접수 상태"><button type="button" data-status="all" aria-pressed="true">전체 <span>${data.events.length}</span></button><button type="button" data-status="open" aria-pressed="false">접수 중 <span>${data.open.length}</span></button></div>
    <div class="cqn-controls"><div class="cqn-view" role="group" aria-label="대회 보기 방식"><button type="button" data-view="list" aria-pressed="false">목록</button><button type="button" data-view="calendar" aria-pressed="false">달력</button></div>
    <label class="cqn-sort">연도 <select id="cqn-year" aria-label="대회 일정 연도"></select></label><div class="cqh-months" role="group" aria-label="대회 월 선택"></div><label class="cqn-sort">정렬 <select id="cqn-sort"><option value="date">대회일순</option><option value="deadline">마감임박순</option></select></label></div>
    <div id="cqn-calendar-section" hidden><div class="cqn-cal-heading"><h3 id="cqn-calendar-month"></h3><span id="cqn-calendar-scope">대회일 기준 · 국내 전체 대회</span></div><div class="cqn-calendar" id="cqn-calendar" role="group"></div><div class="cqn-selection"><h3 id="cqn-selection-title"></h3><span id="cqn-selection-count" aria-live="polite"></span></div></div>
    <div class="cqn-list-head cqn-grid" aria-hidden="true"><span>대회일</span><span>대회 정보</span><span>접수마감</span><span></span></div><div id="cqh-event-list" class="cqn-event-list"></div><p class="cqh-showing" aria-live="polite"></p><button class="cqh-expand" id="cqn-event-more" type="button" aria-expanded="false" aria-controls="cqh-event-list" hidden>대회 더 보기</button>
    <p class="cqh-note">지난 대회부터 앞으로 열릴 국내 대회까지 확인할 수 있습니다. 접수 상태와 참가 조건은 대회별 상세 안내를 확인해 주세요.</p>
  </section>`;
}
function mountTournaments(root, data) {
  const day = today();
  const months = eventMonths(data.events);
  const initialMonth = months.includes(day.slice(0, 7)) ? day.slice(0, 7) : months.find(month => month >= day.slice(0, 7)) || months[0] || day.slice(0, 7);
  let view = 'calendar';
  let month = view === 'list' ? '' : initialMonth;
  let selectedDay = '', expanded = false, freshExpanded = false, statusFilter = 'all';
  let selectedYear = initialMonth.slice(0, 4);
  function filteredEvents() { return statusFilter === 'open' ? data.open : data.events; }
  const fresh = freshEvents(data.open, day);
  const freshSection = root.querySelector('.cqn-fresh');
  root.prepend(freshSection);
  freshSection.hidden = !fresh.length;
  function renderFresh() {
    const shown = freshExpanded ? fresh : fresh.slice(0, 3);
    root.querySelector('#cqn-fresh-count').textContent = fresh.length + '개';
    root.querySelector('#cqn-fresh-list').innerHTML = shown.map(row => {
      const age = dayGap(row.createdDate, day);
      return `<a class="cqn-fresh-row" href="${esc(row.url)}"><time class="cqn-date" datetime="${esc(row.start)}">${esc(dateLabel(row.start,row.end))}</time><div class="cqn-fresh-copy"><div class="cqn-title"><span class="cqn-new">NEW</span>${esc(row.title)}</div><div class="cqn-meta">${eventMeta(row, day)}</div></div><time class="cqn-stamp" datetime="${esc(row.createdDate)}">${age === 0 ? '오늘 등록' : age + '일 전 등록'}</time><span class="cqn-fresh-arrow" aria-hidden="true">→</span></a>`;
    }).join('');
    const button = root.querySelector('#cqn-fresh-more');
    button.hidden = fresh.length <= 3;
    button.textContent = freshExpanded ? '접기' : '신규 대회 더 보기 (' + (fresh.length - shown.length) + '개)';
    button.setAttribute('aria-expanded', String(freshExpanded));
  }
  function selectInitialDay() {
    const available = filteredEvents().filter(row => inMonth(row, month));
    selectedDay = month === day.slice(0, 7) && available.some(row => onDay(row, day)) ? day :
      available.map(row => row.start.startsWith(month) ? row.start : month + '-01').sort()[0] || month + '-01';
  }
  function renderCalendar() {
    if (!month) month = initialMonth;
    if (!selectedDay.startsWith(month)) selectInitialDay();
    const [year, monthNumber] = month.split('-').map(Number);
    const offset = new Date(Date.UTC(year, monthNumber - 1, 1)).getUTCDay();
    const length = new Date(Date.UTC(year, monthNumber, 0)).getUTCDate();
    const label = year + '년 ' + monthNumber + '월';
    root.querySelector('#cqn-calendar-month').textContent = label;
    const calendar = root.querySelector('#cqn-calendar');
    calendar.setAttribute('aria-label', label + ' 대회 달력');
    let html = ['일','월','화','수','목','금','토'].map(name => '<div class="cqn-weekday">' + name + '</div>').join('');
    html += '<div class="cqn-day-empty" aria-hidden="true"></div>'.repeat(offset);
    for (let number = 1; number <= length; number++) {
      const dateValue = month + '-' + String(number).padStart(2, '0');
      const events = filteredEvents().filter(row => onDay(row, dateValue));
      html += `<button class="cqn-day" type="button" data-day="${dateValue}" aria-pressed="${dateValue === selectedDay}" aria-label="${esc(monthNumber + '월 ' + number + '일 ' + dayName(dateValue) + ', 대회 ' + events.length + '개' + (events.length ? ' · ' + events.map(row => row.title + ' ' + registrationStatus(row, day).label + (row.fideRating ? ' · FIDE 레이팅 반영 · ' + row.fideRating : '')).join(' · ') : ''))}"><span class="cqn-day-top"><span class="cqn-day-num">${number}</span>${events.length ? `<span class="cqn-day-count">${events.length}개</span>` : ''}</span>${events.slice(0, 2).map(row => `<span class="cqn-day-name cqn-${registrationStatus(row, day).key}" title="${esc(row.title + ' · ' + registrationStatus(row, day).label + (row.fideRating ? ' · FIDE 레이팅 반영 · ' + row.fideRating : ''))}">${row.fideRating ? 'FIDE · ' : ''}${esc(calendarLabel(row.title))}</span>`).join('')}${events.length > 2 ? `<span class="cqn-day-more">+${events.length - 2}개 더</span>` : ''}</button>`;
    }
    html += '<div class="cqn-day-empty" aria-hidden="true"></div>'.repeat((7 - (offset + length) % 7) % 7);
    calendar.innerHTML = html;
    root.querySelector('#cqn-selection-title').textContent = Number(selectedDay.slice(5, 7)) + '월 ' + Number(selectedDay.slice(8)) + '일 ' + dayName(selectedDay);
  }
  function render() {
    const isCalendar = view === 'calendar';
    const scoped = filteredEvents();
    root.querySelectorAll('[data-status]').forEach(button => button.setAttribute('aria-pressed', String(button.dataset.status === statusFilter)));
    root.querySelector('#cqn-event-total').textContent = (data.eventsPartial ? '불러온 ' : '') + scoped.length + '개';
    root.querySelector('#cqn-calendar-scope').textContent = statusFilter === 'open' ? '대회일 기준 · 접수 중인 대회' : '대회일 기준 · 국내 전체 대회';
    if (isCalendar && !month) { month = initialMonth; selectedYear = initialMonth.slice(0, 4); }
    root.querySelector('#cqn-calendar-section').hidden = !isCalendar;
    root.querySelector('#cqn-sort').closest('label').hidden = isCalendar;
    root.querySelectorAll('[data-view]').forEach(button => button.setAttribute('aria-pressed', String(button.dataset.view === view)));
    const years = [...new Set((months.length ? months : [initialMonth]).map(value => value.slice(0, 4)))];
    root.querySelector('#cqn-year').innerHTML = years.map(value => `<option value="${value}"${value === selectedYear ? ' selected' : ''}>${value}년</option>`).join('');
    const monthChoices = (months.length ? months : [initialMonth]).filter(value => value.startsWith(selectedYear));
    root.querySelector('.cqh-months').innerHTML = (isCalendar ? '' : `<button type="button" data-month="" aria-pressed="${!month}">전체 <span>${scoped.length}</span></button>`) + monthChoices.map(value => `<button type="button" data-month="${value}" aria-pressed="${value === month}">${value.slice(0, 4) !== day.slice(0, 4) ? value.slice(0, 4) + '년 ' : ''}${Number(value.slice(5))}월 <span>${scoped.filter(row => inMonth(row, value)).length}</span></button>`).join('');
    if (isCalendar) renderCalendar();
    const matching = scoped.filter(row => isCalendar ? onDay(row, selectedDay) : inMonth(row, month));
    if (!isCalendar && root.querySelector('#cqn-sort').value === 'deadline') matching.sort((a, b) => {
      const aDeadline = isOpen(a, day) ? a.deadline || '9999' : '9999';
      const bDeadline = isOpen(b, day) ? b.deadline || '9999' : '9999';
      return aDeadline.localeCompare(bDeadline) || (aDeadline !== '9999' ? (a.deadlineTime || '23:59').localeCompare(b.deadlineTime || '23:59') : 0) || a.start.localeCompare(b.start);
    });
    const events = isCalendar || expanded ? matching : matching.slice(0, 10);
    root.querySelector('#cqh-event-list').innerHTML = events.length ? tournamentRows(events, day) : '<p class="cqn-empty">' + (statusFilter === 'open' ? (isCalendar ? '이 날짜에 접수 중인 대회가 없습니다.' : '선택한 기간에 접수 중으로 안내된 대회가 없습니다.') : (isCalendar ? '이 날짜에 표시할 대회가 없습니다.' : '선택한 기간에 표시할 국내 대회가 없습니다.')) + '</p>';
    root.querySelector('.cqn-list-head').hidden = !events.length;
    root.querySelector('#cqn-selection-count').textContent = matching.length + '개 대회';
    const showing = root.querySelector('.cqh-showing');
    showing.hidden = isCalendar;
    showing.textContent = (month ? Number(month.slice(5)) + '월' : '전체') + ' ' + matching.length + '개 중 ' + events.length + '개 표시';
    const more = root.querySelector('#cqn-event-more');
    more.hidden = isCalendar || matching.length <= 10;
    more.textContent = expanded ? '접기' : '대회 더 보기 (' + (matching.length - events.length) + '개)';
    more.setAttribute('aria-expanded', String(expanded));
  }
  root.querySelector('.cqn-status-filter').addEventListener('click', event => {
    const button = event.target.closest('[data-status]');
    if (!button) return;
    statusFilter = button.dataset.status;
    expanded = false;
    selectedDay = '';
    render();
  });
  root.querySelector('.cqn-view').addEventListener('click', event => {
    const button = event.target.closest('[data-view]');
    if (!button) return;
    view = button.dataset.view;
    expanded = false;
    if (view === 'calendar' && !month) { month = initialMonth; selectedYear = initialMonth.slice(0, 4); }
    render();
  });
  root.querySelector('.cqh-months').addEventListener('click', event => {
    const button = event.target.closest('[data-month]');
    if (!button) return;
    month = button.dataset.month;
    expanded = false;
    selectedDay = '';
    render();
  });
  root.querySelector('#cqn-year').addEventListener('change', event => {
    selectedYear = event.target.value;
    const choices = months.filter(value => value.startsWith(selectedYear));
    month = choices.includes(selectedYear + '-' + (month || initialMonth).slice(5)) ? selectedYear + '-' + (month || initialMonth).slice(5) : choices[0] || initialMonth;
    selectedDay = ''; expanded = false; render();
  });
  root.querySelector('#cqn-sort').addEventListener('change', () => { expanded = false; render(); });
  root.querySelector('#cqn-event-more').addEventListener('click', () => { expanded = !expanded; render(); });
  root.querySelector('#cqn-fresh-more').addEventListener('click', () => { freshExpanded = !freshExpanded; renderFresh(); });
  root.querySelector('#cqn-calendar').addEventListener('click', event => {
    const button = event.target.closest('[data-day]');
    if (!button) return;
    selectedDay = button.dataset.day;
    render();
    root.querySelector('[data-day="' + selectedDay + '"]')?.focus({preventScroll:true});
  });
  root.querySelector('#cqh-event-list').addEventListener('click', event => {
    const button = event.target.closest('[data-expand]');
    if (!button) return;
    const id = button.dataset.expand;
    const panel = root.querySelector('#cqn-summary-' + id);
    if (!panel) return;
    const open = panel.hidden;
    panel.hidden = !open;
    root.querySelectorAll('[data-expand="' + id + '"]').forEach(trigger => trigger.setAttribute('aria-expanded', String(open)));
  });
  renderFresh();
  render();
}

function loadData(p){const rm=p.recordMap||{},blocks={...rm.block},collections={...rm.collection},views=p.queryCollectionResult||{},viewPartial={};Object.values(views).forEach(q=>{Object.assign(collections,q.recordMap?.collection||{});Object.entries(q.recordMap?.block||{}).forEach(([id,b])=>{if(!blocks[id]||(b.value?.last_edited_time||0)>=(blocks[id].value?.last_edited_time||0))blocks[id]=b})});function rows(kind,source){const query=Object.entries(views).find(([id])=>compact(id)===VIEWS[kind])?.[1];if(!query){if(kind==="archive"){viewPartial.archive=true;return[]}throw Error("홈 데이터 준비 중")}const result=query.result?.reducerResults?.collection_group_results;const schema=Object.entries(collections).find(([id])=>compact(id)===SOURCES[source])?.[1]?.value?.schema;if(!schema||!result)throw Error("홈 데이터 준비 중");viewPartial[kind]=!!result.hasMore;const keys=Object.fromEntries(Object.entries(schema).map(([id,v])=>[v.name,id]));return(result.blockIds||[]).map(id=>{const b=blocks[id]?.value;if(!b)return null;const props=b.properties||{},get=n=>props[keys[n]],title=text(get(source==="news"?"기사 제목":"이름"));const day=date(get(source==="news"?"게시일":"대회날짜"));const tags=text(get("태그")).split(",").map(s=>s.trim());const address=text(get("지도 주소"))||text(get("대회 장소"));
const closing=date(get("접수마감일"));
const published=date(get("등록일"))||date(get("공개일"));
const createdAt=Number(b.created_time)||0;
const createdDate=published?validDay(published.start_date):kstDay(createdAt);
const closingInfo=deadlineInfo(closing);
const audience=text(get("참가대상"))||text(get("참가 대상"))||text(get("대상"));
return{id,title,fideRating:text(get("FIDE 레이팅")).trim(),url:"/"+id,updatedAt:Number(b.last_edited_time)||0,createdAt,createdDate,audience,address,latitude:Number(text(get("지도 위도"))),longitude:Number(text(get("지도 경도"))),place:text(get("대회 장소"))||text(get("지도 주소")),start:validDay(day?.start_date),end:validDay(day?.end_date),...closingInfo,tags,region:region(tags,address),recommended:RECOMMENDED.has(compact(id))||tags.includes("추천대회"),summary:text(get("요약")),publisher:text(get("출처")),state:text(get("상태")),clubRegion:text(get("지역")),time:text(get("시간")),days:text(get("요일")).split(",").filter(s=>/^[월화수목금토일]요일$/.test(s.trim())).join("·")}}).filter(r=>r&&r.title)}const currentDay=today();const mergedEvents=[...new Map([...rows("archive","events"),...rows("open","events"),...rows("future","events")].map(row=>[compact(row.id),row])).values()];const events=mergedEvents.filter(r=>isScheduledDomestic(r)).sort((a,b)=>a.start.localeCompare(b.start)||Number(b.recommended)-Number(a.recommended)||a.title.localeCompare(b.title,"ko"));return{events,eventsPartial:!!(viewPartial.archive||viewPartial.open||viewPartial.future),openPartial:!!(viewPartial.open||viewPartial.future),open:events.filter(r=>isOpen(r,currentDay)),rosters:rows("rosters","events").filter(r=>r.start&&(r.end||r.start)>=today()).sort((a,b)=>a.start.localeCompare(b.start)),results:rows("results","events").sort((a,b)=>(b.end||b.start).localeCompare(a.end||a.start)||b.start.localeCompare(a.start)).slice(0,3),news:rows("news","news").filter(r=>r.state==="게시완료").sort((a,b)=>b.start.localeCompare(a.start)).slice(0,3),clubs:rows("clubs","clubs").slice(0,5)}}function heading(title,href,label){return`<div class="cqh-section-head"><h2>${title}</h2><a class="cqh-more" href="${href}">${label||"전체 보기"} <span aria-hidden="true">↗</span></a></div>`}function updatedLabel(timestamp){if(!Number.isFinite(timestamp)||timestamp<=0)return"";const value=new Date(timestamp);if(isNaN(value.getTime()))return"";const day=new Date(value.getTime()+9*36e5).toISOString().slice(0,10);return"안내 수정 "+dateLabel(day)}function compactList(rows,section){return rows.length?`<ul class="cqh-list">${rows.map(r=>`<li><a href="${esc(r.url+(section?"?section="+section:""))}"><time>${esc(dateLabel(r.start,r.end))}</time><span class="cqh-list-copy">${esc(r.title)}${updatedLabel(r.updatedAt)?`<small class="cqh-updated">${esc(updatedLabel(r.updatedAt))}</small>`:""}</span><span class="cqh-arrow" aria-hidden="true">→</span></a></li>`).join("")}</ul>`:'<p class="cqh-empty">등록된 안내가 아직 없습니다.</p>'}function rosterList(rows){const first=compactList(rows.slice(0,6),"rosters");return first+(rows.length>6?`<details class="cqh-roster-more"><summary><span class="cqh-roster-expand">참가자명단 더 보기 (${rows.length-6}개)</span><span class="cqh-roster-collapse">참가자명단 접기</span></summary>${compactList(rows.slice(6),"rosters")}</details>`:"")}function specialClubs(host){const headers=["모임","날짜","시간","참가 대상","참가비","신청"];const table=[...host.querySelectorAll("table")].find(el=>{const row=el.querySelector("tr");return row&&[...row.children].map(c=>c.textContent.trim()).join("|")===headers.join("|")});if(!table)return[];return[...table.querySelectorAll("tr")].slice(1).map(row=>{const cells=[...row.children];if(cells.length!==headers.length)return null;const values=cells.map(c=>c.textContent.trim());const start=values[1].match(/^\d{4}-\d{2}-\d{2}/)?.[0];const url=cells[0].querySelector("a")?.getAttribute("href");const apply=cells[5].querySelector("a")?.getAttribute("href");if(!start||start<today()||!url||!apply)return null;return{title:values[0],start,day:values[1].replace(/^\d{4}-(\d{2})-(\d{2})/,(_,m,d)=>Number(m)+"월 "+Number(d)+"일"),time:values[2],audience:values[3],fee:values[4],url,apply}}).filter(Boolean)}function specialClubList(rows){return rows.length?`<div class="cqh-special"><p class="cqh-special-label">추석 특집 · 체스프릭</p><div class="cqh-special-grid">${rows.map(r=>`<article class="cqh-special-card"><time class="cqh-special-date" datetime="${esc(r.start)}">${esc(r.day)}</time><h3><a href="${esc(r.url)}">${esc(r.title)}</a></h3><p>${esc(r.time)}</p><p>${esc(r.audience)}</p><p>참가비 ${esc(r.fee)}</p><div class="cqh-special-actions"><a class="cqh-special-apply" href="${esc(r.apply)}" target="_blank" rel="noopener noreferrer">참가신청 ↗</a><a href="${esc(r.url)}">상세 안내 →</a></div></article>`).join("")}</div></div>`:""}function clubUpdates(host){return[...host.querySelectorAll("table")].filter(table=>{const first=table.querySelector("tr");return first&&[...first.children].map(c=>c.textContent.trim()).join("|")==="클럽 소식|안내"}).map(table=>{const fields=Object.fromEntries([...table.querySelectorAll("tr")].slice(1).map(row=>{const cells=[...row.children];return[cells[0]?.textContent.trim(),{text:cells[1]?.textContent.trim()||"",url:cells[1]?.querySelector("a")?.getAttribute("href")||""}]}));if(!fields["클럽"]?.url)return null;return{title:fields["클럽"].text,url:fields["클럽"].url,time:fields["운영"]?.text||"",practice:fields["연습경기"]?.text||"",tv:fields["TV 설치"]?.text||"",links:["모임 예약","연습경기 신청","클럽 정보"].map(key=>fields[key]).filter(item=>item?.url)}}).filter(Boolean)}function clubUpdateList(rows){return rows.map(r=>`<article class="cqh-club-update"><h3><a href="${esc(r.url)}">${esc(r.title)} · 모임 소식</a></h3><div class="cqh-club-update-grid"><div><p class="cqh-club-update-time">${esc(r.time)}</p><p>${esc(r.practice)}</p></div><div><strong>TV 설치</strong><p>${esc(r.tv)}</p></div></div><div class="cqh-club-update-links">${r.links.map((link,index)=>`<a class="${index===0?"cqh-special-apply":"cqh-club-update-link"}" href="${esc(link.url)}" target="_blank" rel="noopener noreferrer">${esc(link.text)} ↗</a>`).join("")}<a href="${esc(r.url)}">상세 안내 →</a></div></article>`).join("")}function hideNative(host,root){[...host.children].forEach(el=>{if(el!==root)el.classList.add("cqh-native")})}function finishLoading(){document.documentElement.classList.remove("cqh-pending");clearTimeout(loadingFallback)}function init(){const page=document.querySelector(".notion-page-block");if(compact(page?.dataset.blockId)!==PAGE)return;const existing=document.getElementById("cq-dashboard");if(existing&&existing.dataset.version==="20261016-rosters-six-v1"){hideNative(existing.parentElement,existing);finishLoading();return}let p;try{p=JSON.parse(document.getElementById("__NEXT_DATA__").textContent).props.pageProps}catch(e){return}if(compact(p.pageID)!==PAGE)return;const host=document.querySelector(".notion-page-content");if(!host)return;let data;try{data=loadData(p)}catch(e){return}const special=specialClubs(host);const clubNews=clubUpdates(host);const specialPaths=new Set([...special,...clubNews].map(r=>new URL(r.url,location.origin).pathname.replace(/\/$/,"")));data.clubs=data.clubs.filter(r=>!specialPaths.has(new URL(r.url,location.origin).pathname.replace(/\/$/,"")));const bannerSrc="";const root=document.createElement("div");root.id="cq-dashboard";root.dataset.version="20261016-rosters-six-v1";root.innerHTML=`${tournamentSection(data)}\n      \n      <div class="cqh-pair"><section class="cqh-section">${heading("참가자명단",URLS.rosters)}${rosterList(data.rosters)}</section><section class="cqh-section">${heading("대회 결과",URLS.results)}${compactList(data.results,"results")}</section></div>\n      ${bannerSrc?`<a class="cqh-banner" href="/31b27f52-bbd5-8084-953b-dc00dd6963c1" aria-label="제2회 성동구연맹회장배 체스대회 · 유소년 자세히 보기"></a>`:""}\n      <section class="cqh-section cqh-news">${heading("체스소식",URLS.news)}<ul class="cqh-list">${data.news.map(r=>`<li><a href="${esc(r.url)}"><time>${esc(dateLabel(r.start))}</time><span>${esc(r.title)}</span><span class="cqh-arrow" aria-hidden="true">↗</span></a></li>`).join("")||'<li class="cqh-empty">새 소식을 준비하고 있습니다.</li>'}</ul></section>\n      <section class="cqh-section cqh-clubs">${heading("체스모임",URLS.clubs)}${specialClubList(special)}${clubUpdateList(clubNews)}<ul class="cqh-club-list">${data.clubs.map(r=>`<li><span class="cqh-club-region">${esc(r.clubRegion||"지역 확인")}</span><a href="${esc(r.url)}">${esc(r.title)}</a><span class="cqh-club-time">${esc([r.days,r.time].filter(Boolean).join(" · ")||"시간은 상세 안내 확인")}</span></li>`).join("")}</ul></section>\n      <footer class="cqh-footer"><div><strong>체스퀸 이용 안내</strong><p>월요일 신규 대회 · 수요일 대회 결과 · 금요일 참가자명단</p><p>참가 신청·자격·입금·환불은 각 대회 주최 측에 직접 문의해 주세요.</p><p>체스퀸은 사이트에 게시할 <a href="/3ec27f52-bbd5-81bb-bbbb-eceef626eb65">대회 정보 등록·수정</a> 요청만 받습니다.</p></div><div class="cqh-footer-links"><a href="<https://open.kakao.com/o/glVwwcCh>" target="_blank" rel="noopener">오픈채팅 참여 ↗</a><a href="<https://open.kakao.com/o/sUBLg3fh>" target="_blank" rel="noopener">대회·모임 제보 ↗</a></div></footer>`;mountTournaments(root,data);mountTournamentGroups(root,data);const banner=root.querySelector(".cqh-banner");if(banner)banner.style.backgroundImage="url("+JSON.stringify(bannerSrc)+")";if(existing)existing.replaceWith(root);else host.prepend(root);hideNative(host,root);finishLoading()}document.documentElement.classList.add("cqh-pending");const loadingFallback=setTimeout(finishLoading,8e3);const firstMountAt=Date.now()+750;let scheduled=false;function scheduleInit(){if(scheduled)return;scheduled=true;setTimeout(()=>{scheduled=false;init()},Math.max(100,firstMountAt-Date.now()))}const observer=new MutationObserver(()=>{const page=document.querySelector(".notion-page-block");if(compact(page?.dataset.blockId)!==PAGE)return;const root=document.getElementById("cq-dashboard");if(!root||root.dataset.version!=="20261016-rosters-six-v1"||[...root.parentElement.children].some(el=>el!==root&&!el.classList.contains("cqh-native")))scheduleInit()});observer.observe(document.documentElement,{childList:true,subtree:true});document.addEventListener("DOMContentLoaded",scheduleInit,{once:true});window.addEventListener("pageshow",scheduleInit);scheduleInit()})();</script></head>

<aside> ♟️

체스퀸 홈페이지 안내

대회 일정과 체스모임 정보는 홈페이지에서 확인해 주세요.

체스퀸 홈페이지 바로가기 →

즐겨찾기와 공유에는 위 주소를 사용해 주세요.

</aside>

대회 지도 · 대회 일정 · 체스모임 · 체스소식

대회 일정

지난 대회와 앞으로 열릴 국내 대회를 날짜순으로 확인하세요.

Untitled

접수 조건과 잔여 인원은 대회별 상세 안내에서 확인해 주세요.

성동구_유소년_체스대회_노션배너_831x134.svg

참가자명단

Untitled

대회 결과

Untitled

체스소식

Untitled

체스소식

체스모임

Untitled

체스퀸 이용 안내

월요일 신규 대회 · 수요일 대회 결과 · 금요일 참가자명단