// ==UserScript== // @name Backloggd Data Transfer // @name:ru Backloggd Data Transfer // @namespace https://github.com/NemoKing1210/backloggd-data-transfer // @version 0.7.0 // @author NemoKing1210 // @description Import game logs into Backloggd from other platforms via a unified transfer file // @description:ru Импорт игровых логов в Backloggd из других площадок через единый transfer-файл // @license MIT // @icon https://www.backloggd.com/favicon.ico // @homepage https://github.com/NemoKing1210/backloggd-data-transfer // @homepageURL https://github.com/NemoKing1210/backloggd-data-transfer // @source https://github.com/NemoKing1210/backloggd-data-transfer.git // @supportURL https://github.com/NemoKing1210/backloggd-data-transfer/issues // @downloadURL https://raw.githubusercontent.com/NemoKing1210/backloggd-data-transfer/main/backloggd-data-transfer.user.js // @updateURL https://raw.githubusercontent.com/NemoKing1210/backloggd-data-transfer/main/backloggd-data-transfer.user.js // @match https://www.backloggd.com/* // @match https://backloggd.com/* // @tag backloggd // @tag games // @tag import // @tag export // @connect www.backloggd.com // @connect backloggd.com // @grant GM_addStyle // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_xmlhttpRequest // @run-at document-idle // @noframes // ==/UserScript== (r=>{if(typeof GM_addStyle=="function"){GM_addStyle(r);return}const e=document.createElement("style");e.textContent=r,document.head.append(e)})(' :root{--bdt-accent: #3db89a;--bdt-accent-hover: #48c9a8;--bdt-bg: #1a1d24;--bdt-bg-elevated: #232833;--bdt-text: #e8eaed;--bdt-muted: #9aa0a6;--bdt-border: rgba(255, 255, 255, .1);--bdt-danger: #e57373;--bdt-ok: #81c784;--bdt-warn: #ffb74d;--bdt-shadow: 0 12px 40px rgba(0, 0, 0, .45);--bdt-radius: 12px;--bdt-font: "Segoe UI", system-ui, -apple-system, sans-serif}#bdt-nav-transfer{white-space:nowrap;vertical-align:middle;background-color:var(--bdt-accent)!important;border-color:transparent!important;color:#0b1210!important;font-weight:600}#bdt-nav-transfer:hover,#bdt-nav-transfer:focus-visible{filter:brightness(1.06);color:#0b1210!important}#add-a-game+#bdt-nav-transfer,#blp-nav-settings+#bdt-nav-transfer{min-height:var(--bdt-nav-btn-h, unset)}#bdt-nav-transfer.nav-item,li.nav-item>#bdt-nav-transfer{margin-left:.5rem}.bdt-panel-backdrop{position:fixed;inset:0;z-index:2147483001;display:grid;place-items:center;padding:1rem;background:#0000008c;backdrop-filter:blur(2px)}.bdt-panel{width:min(1560px,100%);max-height:min(96vh,1380px);display:flex;flex-direction:column;overflow:hidden;background:var(--bdt-bg);color:var(--bdt-text);border:1px solid var(--bdt-border);border-radius:var(--bdt-radius);box-shadow:var(--bdt-shadow);font-family:var(--bdt-font)}.bdt-panel__header{flex:0 0 auto;display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;padding:1rem 1.1rem .6rem;border-bottom:1px solid var(--bdt-border);background:var(--bdt-bg)}.bdt-panel__title{margin:0;font-size:1.15rem;font-weight:700}.bdt-panel__subtitle{margin:.25rem 0 0;color:var(--bdt-muted);font-size:.82rem}.bdt-panel__close{border:0;background:transparent;color:var(--bdt-muted);font-size:1.5rem;line-height:1;cursor:pointer;padding:0 .2rem}.bdt-panel__close:hover{color:var(--bdt-text)}.bdt-panel__tabs{flex:0 0 auto;display:flex;gap:.25rem;padding:.6rem .8rem;border-bottom:1px solid var(--bdt-border);background:var(--bdt-bg)}.bdt-tab{display:inline-flex;align-items:center;gap:.4rem;border:0;background:transparent;color:var(--bdt-muted);padding:.45rem .7rem;border-radius:8px;cursor:pointer;font:600 .82rem/1.2 var(--bdt-font)}.bdt-tab.is-active,.bdt-tab:hover{background:var(--bdt-bg-elevated);color:var(--bdt-text)}.bdt-tab.is-locked{opacity:.72;cursor:not-allowed}.bdt-tab.is-locked:hover{background:transparent;color:var(--bdt-muted)}.bdt-tab__badge{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:1.45rem;height:1.2rem;padding:0 .4rem;border-radius:999px;border:1px solid var(--bdt-border);background:#ffffff0f;color:var(--bdt-muted);font-size:.68rem;font-weight:700;font-variant-numeric:tabular-nums;line-height:1;letter-spacing:.01em;white-space:nowrap}.bdt-tab.is-active .bdt-tab__badge{color:var(--bdt-text);background:#ffffff17;border-color:#ffffff24}.bdt-tab__badge--soon{text-transform:uppercase;letter-spacing:.03em}.bdt-tab__badge.is-mid{color:var(--bdt-warn);background:#ffb74d1f;border-color:#ffb74d59}.bdt-tab__badge.is-high{color:var(--bdt-danger);background:#e573731f;border-color:#e5737366}.bdt-tab.is-active .bdt-tab__badge.is-mid{color:var(--bdt-warn);background:#ffb74d29}.bdt-tab.is-active .bdt-tab__badge.is-high{color:var(--bdt-danger);background:#e5737329}.bdt-tab__badge[hidden]{display:none!important}.bdt-panel__body{flex:1 1 auto;min-height:0;overflow:auto;padding:.9rem 1.1rem 1.2rem;overscroll-behavior:contain;--bdt-body-pad-x: 1.1rem;--bdt-body-pad-b: 1.2rem}.bdt-tab-panel{display:grid;gap:.75rem}.bdt-import{gap:1rem}.bdt-steps{list-style:none;margin:0;padding:.15rem 0 .25rem;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.35rem;position:relative}.bdt-steps.has-mapping{grid-template-columns:repeat(4,minmax(0,1fr))}.bdt-steps__item[hidden]{display:none!important}.bdt-steps:before{content:"";position:absolute;left:12%;right:12%;top:1.15rem;height:1px;background:linear-gradient(90deg,transparent,rgba(61,184,154,.35),transparent);pointer-events:none}.bdt-steps__item{position:relative;z-index:1;display:flex;justify-content:center}.bdt-steps__btn{display:grid;justify-items:center;gap:.35rem;width:100%;max-width:9.5rem;border:0;background:transparent;color:var(--bdt-muted);cursor:pointer;padding:.15rem;font:600 .72rem/1.2 var(--bdt-font);letter-spacing:.04em;text-transform:uppercase}.bdt-steps__btn:disabled{cursor:default}.bdt-steps__index{display:grid;place-items:center;width:1.85rem;height:1.85rem;border-radius:999px;border:1px solid var(--bdt-border);background:var(--bdt-bg);font-size:.78rem;font-variant-numeric:tabular-nums;transition:background-color .2s ease,border-color .2s ease,color .2s ease,box-shadow .2s ease}.bdt-steps__label{text-align:center}.bdt-steps__btn.is-current{color:var(--bdt-text)}.bdt-steps__btn.is-current .bdt-steps__index{border-color:var(--bdt-accent);background:var(--bdt-accent);color:#0b1210;box-shadow:0 0 0 4px #3db89a1f}.bdt-steps__btn.is-done .bdt-steps__index{border-color:#5a9e5e;background:#5a9e5e;color:#0b1210}.bdt-steps__btn.is-busy .bdt-steps__index{animation:bdt-pulse 1.1s ease-in-out infinite}.bdt-steps__btn:not(:disabled):hover .bdt-steps__index{border-color:var(--bdt-accent)}@keyframes bdt-pulse{0%,to{box-shadow:0 0 #3db89a47}50%{box-shadow:0 0 0 6px #3db89a00}}.bdt-stages{display:grid;gap:.85rem;min-height:0}.bdt-stage{display:grid;gap:.85rem;opacity:0;transform:translateY(10px)}.bdt-stage.is-active{opacity:1}.bdt-stage.is-enter{animation:bdt-stage-enter .32s cubic-bezier(.22,1,.36,1) both}@keyframes bdt-stage-enter{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.bdt-stage__lead{margin:0;color:var(--bdt-muted);font-size:.88rem;line-height:1.45}.bdt-stage__hero{display:grid;justify-items:center;gap:.45rem;text-align:center;padding:1.4rem 1rem .6rem}.bdt-stage__orb{width:2.6rem;height:2.6rem;border-radius:999px;border:2px solid rgba(61,184,154,.28);border-top-color:var(--bdt-accent);animation:bdt-spin .8s linear infinite;margin-bottom:.35rem}.bdt-stage__orb--done{animation:none;border-color:#81c78473;background:radial-gradient(circle at 50% 50%,rgba(129,199,132,.35),transparent 65%),#81c7841f;position:relative}.bdt-stage__orb--done:after{content:"";position:absolute;inset:.7rem .75rem .75rem .85rem;border:solid var(--bdt-ok);border-width:0 0 2px 2px;transform:rotate(-45deg)}.bdt-stage__orb--warn{animation:none;border-color:#ffb74d8c;background:radial-gradient(circle at 50% 50%,rgba(255,183,77,.28),transparent 65%),#ffb74d1a;position:relative}.bdt-stage__orb--warn:after{content:"!";position:absolute;inset:0;display:grid;place-items:center;color:var(--bdt-warn);font-size:1.15rem;font-weight:800;line-height:1}.bdt-stage__orb--fail{animation:none;border-color:#e573738c;background:radial-gradient(circle at 50% 50%,rgba(229,115,115,.3),transparent 65%),#e573731a;position:relative}.bdt-stage__orb--fail:before,.bdt-stage__orb--fail:after{content:"";position:absolute;top:50%;left:50%;width:1rem;height:2px;background:var(--bdt-danger);border-radius:2px}.bdt-stage__orb--fail:before{transform:translate(-50%,-50%) rotate(45deg)}.bdt-stage__orb--fail:after{transform:translate(-50%,-50%) rotate(-45deg)}.bdt-auth-gate{display:grid;justify-items:center;gap:.55rem;text-align:center;padding:1.5rem 1.1rem 1.2rem;border:1px solid rgba(229,115,115,.35);border-radius:12px;background:linear-gradient(165deg,rgba(229,115,115,.1),transparent 55%),var(--bdt-bg-elevated)}.bdt-auth-gate__icon{display:grid;place-items:center;width:2.6rem;height:2.6rem;border-radius:999px;background:#e5737324;color:var(--bdt-danger);font-size:1.05rem;margin-bottom:.15rem}.bdt-auth-gate__title{margin:0;font-size:1.05rem;font-weight:700}.bdt-auth-gate__text{margin:0;max-width:28rem;color:var(--bdt-muted);font-size:.86rem;line-height:1.45}.bdt-auth-gate__detail{margin:0;max-width:28rem;padding:.55rem .7rem;border-radius:8px;background:#0003;border:1px solid rgba(229,115,115,.25);color:var(--bdt-danger);font-size:.78rem;line-height:1.4;word-break:break-word}.bdt-auth-gate .bdt-btn{margin-top:.35rem;text-decoration:none}.bdt-auth-gate__field{display:grid;gap:.35rem;width:min(100%,16rem);margin-top:.25rem;text-align:left}.bdt-auth-gate__label{font-size:.78rem;font-weight:600;color:var(--bdt-text)}.bdt-auth-gate__input{width:100%;box-sizing:border-box;padding:.55rem .7rem;border-radius:8px;border:1px solid var(--bdt-border);background:#00000040;color:var(--bdt-text);font:inherit;font-size:.92rem}.bdt-auth-gate__input:focus{outline:none;border-color:#3db89aa6;box-shadow:0 0 0 2px #3db89a2e}.bdt-auth-gate__hint{margin:0;max-width:28rem;color:var(--bdt-muted);font-size:.75rem;line-height:1.4}.bdt-import-errors{list-style:none;margin:.35rem 0 0;padding:0;display:grid;gap:.4rem;width:min(100%,28rem);text-align:left}.bdt-import-errors li{display:grid;gap:.15rem;padding:.55rem .7rem;border-radius:8px;background:#e5737314;border:1px solid rgba(229,115,115,.28);font-size:.8rem;line-height:1.35}.bdt-import-errors strong{color:var(--bdt-text)}.bdt-import-errors span{color:var(--bdt-danger);word-break:break-word}.bdt-stage__title{margin:0;font-size:1.05rem;font-weight:700}.bdt-stage__text{margin:0;max-width:28rem;color:var(--bdt-muted);font-size:.86rem;line-height:1.45}.bdt-stage__meta{margin:.35rem 0 0;color:var(--bdt-accent);font-size:.82rem;font-weight:650;font-variant-numeric:tabular-nums}.bdt-stage__footer{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.55rem;padding-top:.25rem}.bdt-stage__footer--sticky{position:sticky;bottom:calc(-1 * var(--bdt-body-pad-b, 1.2rem));z-index:3;margin-top:.5rem;margin-left:calc(-1 * var(--bdt-body-pad-x, 1.1rem));margin-right:calc(-1 * var(--bdt-body-pad-x, 1.1rem));padding:.8rem var(--bdt-body-pad-x, 1.1rem) var(--bdt-body-pad-b, 1.2rem);border-top:1px solid var(--bdt-border);background:var(--bdt-bg);box-shadow:0 -10px 24px #00000059}.bdt-stage[data-bdt-stage=review] .bdt-match-scroll{max-height:min(48vh,480px)}.bdt-muted{margin:0;color:var(--bdt-muted);font-size:.88rem;line-height:1.45}.bdt-stub{font-size:.8rem;opacity:.9}.bdt-field{display:grid;gap:.4rem}.bdt-field__label{margin:0;font-size:.78rem;font-weight:600;color:var(--bdt-muted);text-transform:uppercase;letter-spacing:.03em}.bdt-field__hint{font-size:.8rem}.bdt-format-cards{display:grid;grid-template-columns:1fr 1fr;gap:.75rem}.bdt-format-card{position:relative;display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:.85rem;margin:0;padding:1rem 1rem .95rem;text-align:left;border:1px solid var(--bdt-border);border-radius:14px;background:linear-gradient(160deg,rgba(255,255,255,.03),transparent 42%),var(--bdt-bg-elevated);color:var(--bdt-text);cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease,background-color .15s ease}.bdt-format-card:hover{border-color:#3db89a66;transform:translateY(-1px)}.bdt-format-card.is-disabled,.bdt-format-card:disabled{cursor:not-allowed;opacity:.55;filter:grayscale(.35);box-shadow:none;transform:none;background:linear-gradient(160deg,rgba(255,255,255,.02),transparent 42%),var(--bdt-bg)}.bdt-format-card.is-disabled:hover,.bdt-format-card:disabled:hover{border-color:var(--bdt-border);transform:none}.bdt-format-card.is-disabled .bdt-format-card__check,.bdt-format-card:disabled .bdt-format-card__check{opacity:.35}.bdt-format-card.is-active{border-color:var(--bdt-accent);box-shadow:0 0 0 1px #3db89a59,0 10px 28px #00000047;background:linear-gradient(160deg,rgba(61,184,154,.14),transparent 50%),var(--bdt-bg-elevated)}.bdt-format-card__icon{display:grid;place-items:center;width:2.6rem;height:2.6rem;border-radius:12px;background:#ffffff0d;color:var(--bdt-muted);font-size:1.05rem;flex:0 0 auto}.bdt-format-card.is-active .bdt-format-card__icon{background:#3db89a2e;color:var(--bdt-accent)}.bdt-format-card__body{display:grid;gap:.35rem;min-width:0}.bdt-format-card__top{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem .55rem}.bdt-format-card__title{font:700 .98rem/1.2 var(--bdt-font)}.bdt-format-card__badge{padding:.15rem .45rem;border-radius:999px;font-size:.68rem;font-weight:700;letter-spacing:.02em;text-transform:uppercase}.bdt-format-card__badge--ready{background:#3db89a2e;color:var(--bdt-accent)}.bdt-format-card__badge--soon{background:#ffb74d29;color:var(--bdt-warn)}.bdt-format-card__hint{color:var(--bdt-muted);font-size:.8rem;line-height:1.4}.bdt-format-card__ext{justify-self:start;margin-top:.15rem;padding:.12rem .45rem;border-radius:6px;background:#00000047;color:var(--bdt-muted);font-family:ui-monospace,Cascadia Code,Consolas,monospace;font-size:.72rem;font-weight:600}.bdt-format-card.is-active .bdt-format-card__ext{color:var(--bdt-accent);background:#3db89a1f}.bdt-format-card__check{width:1.15rem;height:1.15rem;margin-top:.15rem;border-radius:999px;border:1.5px solid rgba(255,255,255,.18);background:transparent;flex:0 0 auto;position:relative}.bdt-format-card.is-active .bdt-format-card__check{border-color:var(--bdt-accent);background:var(--bdt-accent);box-shadow:inset 0 0 0 3px #0b1210}@media(max-width:720px){.bdt-format-cards{grid-template-columns:1fr}}.bdt-dropzone{position:relative;display:grid;gap:.75rem;padding:1.1rem 1rem;border:1.5px dashed rgba(61,184,154,.35);border-radius:12px;background:linear-gradient(180deg,rgba(61,184,154,.06),transparent 55%),var(--bdt-bg-elevated);transition:border-color .15s ease,background-color .15s ease,box-shadow .15s ease}.bdt-dropzone:hover,.bdt-dropzone.is-dragover{border-color:var(--bdt-accent);box-shadow:inset 0 0 0 1px #3db89a33}.bdt-dropzone.has-file{border-style:solid;border-color:#3db89a73}.bdt-dropzone__input{position:absolute;inset:0;opacity:0;cursor:pointer;z-index:1}.bdt-dropzone__empty{display:grid;justify-items:center;gap:.35rem;text-align:center;pointer-events:none}.bdt-dropzone__icon{display:grid;place-items:center;width:2.4rem;height:2.4rem;margin-bottom:.2rem;border-radius:999px;background:#3db89a24;color:var(--bdt-accent);font-size:1rem}.bdt-dropzone__title{margin:0;font-size:.92rem;font-weight:600}.bdt-dropzone__meta{margin:0;color:var(--bdt-muted);font-size:.78rem}.bdt-dropzone__browse{margin-top:.35rem;padding:.35rem .75rem;border-radius:999px;background:#3db89a29;color:var(--bdt-accent);font-size:.78rem;font-weight:700}.bdt-dropzone__filled{position:relative;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:.75rem}.bdt-dropzone__file{display:grid;gap:.2rem;min-width:0}.bdt-dropzone__badge{color:var(--bdt-muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.03em}.bdt-dropzone__name{font-size:.9rem;font-weight:650;word-break:break-all}.bdt-btn{justify-self:start;border:0;border-radius:8px;padding:.55rem .95rem;font:600 .88rem/1.2 var(--bdt-font);cursor:pointer}.bdt-btn--sm{padding:.4rem .7rem;font-size:.78rem}.bdt-btn:disabled{opacity:.45;cursor:not-allowed}.bdt-actions{display:flex;flex-wrap:wrap;gap:.5rem}.bdt-btn--primary{background:var(--bdt-accent);color:#0f1419}a.bdt-btn--primary,a.bdt-btn--primary:link,a.bdt-btn--primary:visited,a.bdt-btn--primary:hover,a.bdt-btn--primary:active,a.bdt-btn--primary:focus-visible{color:#0f1419;text-decoration:none}.bdt-btn--primary:hover:not(:disabled){background:var(--bdt-accent-hover);color:#0f1419}.bdt-btn--ghost{background:transparent;color:var(--bdt-text);border:1px solid var(--bdt-border)}a.bdt-btn--ghost,a.bdt-btn--ghost:link,a.bdt-btn--ghost:visited,a.bdt-btn--ghost:hover,a.bdt-btn--ghost:active,a.bdt-btn--ghost:focus-visible{color:var(--bdt-text);text-decoration:none}.bdt-btn--ghost:hover:not(:disabled){border-color:var(--bdt-accent);color:var(--bdt-accent)}a.bdt-btn--ghost:hover{color:var(--bdt-accent)}.bdt-btn--danger{background:#e573732e;color:#f0a8a8;border:1px solid rgba(229,115,115,.4)}.bdt-btn--danger:hover:not(:disabled){background:#e5737347;color:#ffc9c9}.bdt-summary{display:grid;gap:.95rem;padding:1rem 1.05rem;background:linear-gradient(165deg,rgba(61,184,154,.08),transparent 42%),var(--bdt-bg-elevated);border:1px solid var(--bdt-border);border-radius:12px}.bdt-summary__head{display:grid;gap:.55rem}.bdt-summary__title{margin:0;font-size:.98rem;font-weight:700}.bdt-summary__meta{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:.4rem}.bdt-summary__meta li{display:inline-flex;align-items:baseline;gap:.35rem;max-width:100%;padding:.28rem .55rem;border-radius:999px;background:#ffffff0a;border:1px solid var(--bdt-border);font-size:.78rem}.bdt-summary__meta span{color:var(--bdt-muted)}.bdt-summary__meta strong{font-weight:650;word-break:break-word}.bdt-summary__metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.55rem}.bdt-summary__metric{display:grid;gap:.2rem;padding:.7rem .75rem;border-radius:10px;background:#0000002e;border:1px solid var(--bdt-border);min-width:0}.bdt-summary__metric--ok{border-color:#81c78459;background:#81c78414}.bdt-summary__metric--warn{border-color:#ffb74d59;background:#ffb74d14}.bdt-summary__metric--pct{border-color:#3db89a59;background:#3db89a14}.bdt-summary__metric-value{font-size:1.35rem;font-weight:750;font-variant-numeric:tabular-nums;line-height:1.1;letter-spacing:-.02em}.bdt-summary__metric--ok .bdt-summary__metric-value{color:var(--bdt-ok)}.bdt-summary__metric--warn .bdt-summary__metric-value{color:var(--bdt-warn)}.bdt-summary__metric--pct .bdt-summary__metric-value{color:var(--bdt-accent)}.bdt-summary__metric-label{color:var(--bdt-muted);font-size:.72rem;line-height:1.25}.bdt-summary__section{display:grid;gap:.45rem}.bdt-summary__section-title{margin:0;color:var(--bdt-muted);font-size:.72rem;font-weight:650;text-transform:uppercase;letter-spacing:.04em}.bdt-summary__details{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(9.5rem,1fr));gap:.4rem}.bdt-summary__detail{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.4rem .55rem;border-radius:8px;background:#ffffff08;border:1px solid rgba(255,255,255,.06);font-size:.8rem}.bdt-summary__detail span{color:var(--bdt-muted)}.bdt-summary__detail strong{font-variant-numeric:tabular-nums;font-weight:700}.bdt-summary__detail.is-warn{border-color:#ffb74d66;background:#ffb74d14}.bdt-summary__detail.is-warn strong{color:var(--bdt-warn)}.bdt-summary__statuses{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:.4rem}.bdt-summary__chip{display:inline-flex;align-items:center;gap:.4rem;padding:.35rem .55rem .35rem .65rem;border-radius:999px;background:#ffffff0a;border:1px solid var(--bdt-border);font-size:.8rem}.bdt-summary__chip-label{color:var(--bdt-text)}.bdt-summary__chip-value{min-width:1.35rem;padding:.1rem .4rem;border-radius:999px;background:#3db89a29;color:var(--bdt-accent);font-size:.72rem;font-weight:750;font-variant-numeric:tabular-nums;text-align:center}.bdt-summary__chip[data-status=completed] .bdt-summary__chip-value,.bdt-summary__chip[data-status=played] .bdt-summary__chip-value{background:#81c7842e;color:var(--bdt-ok)}.bdt-summary__chip[data-status=playing] .bdt-summary__chip-value{background:#3db89a2e;color:var(--bdt-accent)}.bdt-summary__chip[data-status=abandoned] .bdt-summary__chip-value,.bdt-summary__chip[data-status=none] .bdt-summary__chip-value{background:#ffb74d29;color:var(--bdt-warn)}@media(max-width:720px){.bdt-summary__metrics{grid-template-columns:repeat(2,minmax(0,1fr))}}.bdt-errors{border:1px solid rgba(255,183,77,.35);border-radius:12px;background:linear-gradient(165deg,rgba(255,183,77,.08),transparent 50%),var(--bdt-bg-elevated);overflow:hidden}.bdt-errors__details{margin:0}.bdt-errors__summary{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.75rem .95rem;cursor:pointer;list-style:none;user-select:none}.bdt-errors__summary::-webkit-details-marker{display:none}.bdt-errors__summary-main{display:inline-flex;align-items:center;gap:.5rem;min-width:0}.bdt-errors__title{font-size:.92rem;font-weight:700}.bdt-errors__count{display:inline-flex;align-items:center;justify-content:center;min-width:1.4rem;padding:.1rem .4rem;border-radius:999px;background:#ffb74d33;color:var(--bdt-warn);font-size:.72rem;font-weight:750;font-variant-numeric:tabular-nums}.bdt-errors__chevron{width:.45rem;height:.45rem;border-right:2px solid var(--bdt-muted);border-bottom:2px solid var(--bdt-muted);transform:rotate(45deg);transition:transform .15s ease;flex:0 0 auto}.bdt-errors__details[open] .bdt-errors__chevron{transform:rotate(225deg);margin-top:.25rem}.bdt-errors__body{display:grid;gap:.55rem;padding:0 .95rem .85rem;border-top:1px solid rgba(255,183,77,.2)}.bdt-errors__toolbar{display:flex;justify-content:flex-end;padding-top:.65rem}.bdt-errors__list{list-style:none;margin:0;padding:0;display:grid;gap:.35rem;max-height:min(28vh,240px);overflow:auto}.bdt-errors__item{padding:.45rem .6rem;border-radius:8px;background:#0000002e;border:1px solid rgba(255,255,255,.06);font-size:.8rem;line-height:1.35;word-break:break-word}.bdt-errors__item--error{border-color:#e5737359}.bdt-errors__item--not_found{border-color:#ffb74d47}.bdt-errors__item--library{border-color:#e5737347}.bdt-errors__item--duplicate{border-color:#ffb74d59;background:#ffb74d0f}.bdt-debug-library{border:1px solid rgba(120,170,255,.35);border-radius:12px;background:linear-gradient(165deg,rgba(120,170,255,.08),transparent 50%),var(--bdt-bg-elevated);overflow:hidden}.bdt-debug-library__details{margin:0}.bdt-debug-library__summary{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.75rem .95rem;cursor:pointer;list-style:none;user-select:none}.bdt-debug-library__summary::-webkit-details-marker{display:none}.bdt-debug-library__summary-main{display:inline-flex;align-items:center;flex-wrap:wrap;gap:.45rem .65rem;min-width:0}.bdt-debug-library__badge{display:inline-flex;align-items:center;padding:.12rem .4rem;border-radius:5px;background:#78aaff38;color:#9ebfff;font-size:.65rem;font-weight:800;letter-spacing:.04em}.bdt-debug-library__title-text{font-size:.92rem;font-weight:700}.bdt-debug-library__count{color:var(--bdt-muted);font-size:.78rem;font-variant-numeric:tabular-nums}.bdt-debug-library__chevron{width:.45rem;height:.45rem;border-right:2px solid var(--bdt-muted);border-bottom:2px solid var(--bdt-muted);transform:rotate(45deg);transition:transform .15s ease;flex:0 0 auto}.bdt-debug-library__details[open] .bdt-debug-library__chevron{transform:rotate(225deg);margin-top:.25rem}.bdt-debug-library__body{display:grid;gap:.55rem;padding:0 .95rem .85rem;border-top:1px solid rgba(120,170,255,.2)}.bdt-debug-library__lead{margin:0;color:var(--bdt-muted);font-size:.78rem}.bdt-debug-library__scroll{max-height:16rem;overflow:auto;border:1px solid var(--bdt-border);border-radius:8px;background:#0000002e}.bdt-debug-library__table{width:100%;border-collapse:collapse;font-size:.78rem}.bdt-debug-library__table th,.bdt-debug-library__table td{padding:.4rem .55rem;text-align:left;border-bottom:1px solid rgba(255,255,255,.06);vertical-align:top}.bdt-debug-library__table th{position:sticky;top:0;background:#161a22;color:var(--bdt-muted);font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em;z-index:1}.bdt-debug-library__table tr:last-child td{border-bottom:0}.bdt-debug-library__id,.bdt-debug-library__slug{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.74rem;color:var(--bdt-muted);white-space:nowrap}.bdt-debug-library__source{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.7rem;color:var(--bdt-muted);max-width:18rem;word-break:break-all}.bdt-debug-library__source a{color:#9ebfff;text-decoration:none}.bdt-debug-library__source a:hover{text-decoration:underline}.bdt-debug-library__title a{color:var(--bdt-accent);text-decoration:none}.bdt-debug-library__title a:hover{text-decoration:underline}.bdt-progress{display:grid;gap:.55rem;padding:.9rem 1rem;border:1px solid var(--bdt-border);border-radius:12px;background:linear-gradient(160deg,rgba(61,184,154,.1),transparent 55%),var(--bdt-bg-elevated)}.bdt-progress__head{display:flex;align-items:center;gap:.65rem}.bdt-progress__spinner{width:1rem;height:1rem;border-radius:999px;border:2px solid rgba(61,184,154,.25);border-top-color:var(--bdt-accent);animation:bdt-spin .7s linear infinite;flex:0 0 auto}@keyframes bdt-spin{to{transform:rotate(360deg)}}.bdt-progress__label{flex:1 1 auto;min-width:0;color:var(--bdt-text);font-size:.85rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bdt-progress__pct{font-variant-numeric:tabular-nums;color:var(--bdt-accent);font-size:.85rem}.bdt-progress__track{height:.45rem;border-radius:999px;background:#ffffff14;overflow:hidden}.bdt-progress__fill{height:100%;width:0%;border-radius:inherit;background:linear-gradient(90deg,#2f9e84,var(--bdt-accent));transition:width .45s cubic-bezier(.22,1,.36,1);will-change:width}.bdt-progress__active{display:flex;flex-wrap:wrap;gap:.35rem;min-height:0}.bdt-progress__active[hidden]{display:none}.bdt-progress__chip{max-width:11rem;padding:.18rem .5rem;border-radius:999px;border:1px solid rgba(61,184,154,.28);background:#3db89a1f;color:var(--bdt-text);font-size:.72rem;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;animation:bdt-chip-in .28s ease-out}@keyframes bdt-chip-in{0%{opacity:0;transform:translateY(3px)}to{opacity:1;transform:none}}.bdt-match-wrap{display:grid;gap:.65rem}.bdt-match-head{display:flex;align-items:flex-start;justify-content:space-between;gap:.85rem;flex-wrap:wrap}.bdt-match-head__titles{display:grid;gap:.2rem;min-width:0}.bdt-match-selected{margin:0;color:var(--bdt-muted);font-size:.78rem}.bdt-match-filters{display:flex;flex-wrap:wrap;gap:.55rem .75rem;align-items:flex-end}.bdt-match-search{display:flex;align-items:center;gap:.45rem;flex:1 1 14rem;min-width:12rem;padding:.4rem .7rem;border-radius:8px;border:1px solid var(--bdt-border);background:#00000038;color:var(--bdt-muted)}.bdt-match-search input{flex:1 1 auto;min-width:0;border:0;outline:none;background:transparent;color:var(--bdt-text);font:inherit;font-size:.78rem}.bdt-match-search input::placeholder{color:var(--bdt-muted)}.bdt-match-filter{display:grid;gap:.2rem;min-width:7.5rem}.bdt-match-filter__label{color:var(--bdt-muted);font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em}.bdt-match-filter__select{appearance:none;width:100%;padding:.4rem 1.75rem .4rem .55rem;border-radius:8px;border:1px solid var(--bdt-border);background:linear-gradient(45deg,transparent 50%,var(--bdt-muted) 50%) calc(100% - 14px) calc(50% - 2px) / 5px 5px no-repeat,linear-gradient(135deg,var(--bdt-muted) 50%,transparent 50%) calc(100% - 9px) calc(50% - 2px) / 5px 5px no-repeat,#161a22;color:var(--bdt-text);font:inherit;font-size:.78rem;cursor:pointer}.bdt-match-filter__select:focus{outline:none;border-color:#3db89a8c;box-shadow:0 0 0 2px #3db89a2e}.bdt-toggle{display:inline-flex;align-items:center;gap:.55rem;cursor:pointer;user-select:none;font-size:.8rem;color:var(--bdt-text)}.bdt-toggle input{position:absolute;opacity:0;pointer-events:none}.bdt-toggle__track{position:relative;width:2.2rem;height:1.2rem;flex:0 0 auto;border-radius:999px;background:#ffffff1f;border:1px solid var(--bdt-border);transition:background-color .2s ease,border-color .2s ease}.bdt-toggle__track:after{content:"";position:absolute;top:1px;left:1px;width:.95rem;height:.95rem;border-radius:999px;background:#e8eaed;transition:transform .2s ease}.bdt-toggle input:checked+.bdt-toggle__track{background:#3db89a59;border-color:#3db89a8c}.bdt-toggle input:checked+.bdt-toggle__track:after{transform:translate(1rem);background:var(--bdt-accent)}.bdt-toggle__label{line-height:1.25;max-width:16rem}.bdt-match-scroll{max-height:min(42vh,420px);overflow:auto;border:1px solid var(--bdt-border);border-radius:12px;background:#12151b}.bdt-match-table{width:100%;border-collapse:separate;border-spacing:0;font-size:.78rem}.bdt-match-table th,.bdt-match-table td{padding:.55rem .65rem;border-bottom:1px solid var(--bdt-border);text-align:left;vertical-align:top;white-space:nowrap}.bdt-match-table th{position:sticky;top:0;z-index:1;background:#1a1f2a;color:var(--bdt-muted);font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em}.bdt-match-col-check{width:2rem;padding-left:.7rem!important;padding-right:.35rem!important;text-align:center;vertical-align:middle!important}.bdt-match-check{width:1rem;height:1rem;margin:0;accent-color:var(--bdt-accent);cursor:pointer;vertical-align:middle}.bdt-match-col-title,.bdt-match-col-site{white-space:normal;min-width:10rem;max-width:16rem}.bdt-match-col-num,.bdt-match-col-id{font-variant-numeric:tabular-nums;color:var(--bdt-muted)}.bdt-match-id-edit{display:grid;gap:.25rem;min-width:7.5rem}.bdt-match-id-input{width:100%;min-width:7rem;padding:.35rem .45rem;border-radius:7px;border:1px solid var(--bdt-border);background:#161a22;color:var(--bdt-text);font:inherit;font-size:.78rem}.bdt-match-id-input:focus{outline:none;border-color:#3db89a8c;box-shadow:0 0 0 2px #3db89a2e}.bdt-match-id-input:disabled{opacity:.65;cursor:wait}.bdt-match-id-status{font-size:.68rem;color:var(--bdt-muted);white-space:normal;line-height:1.25}.bdt-match-id-status--error{color:#f0a0a0}.bdt-match-pill{display:inline-flex;align-items:center;padding:.15rem .45rem;border-radius:999px;font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.02em}.bdt-match-pill--found,.bdt-match-pill--preset{background:#3db89a29;color:var(--bdt-accent)}.bdt-match-pill--not_found{background:#ffb74d29;color:var(--bdt-warn)}.bdt-match-pill--error{background:#e5737329;color:var(--bdt-danger)}.bdt-match-pill--existing{background:#ffb74d29;color:var(--bdt-warn)}.bdt-match-pill--new{background:#81c78424;color:var(--bdt-ok)}.bdt-match-pill--cached{background:#64b5f629;color:#90caf9}.bdt-match-pill--live{background:#ffffff0f;color:var(--bdt-muted)}.bdt-match-row--not_found,.bdt-match-row--error{background:#ffffff04}.bdt-match-row--blocked{opacity:.72}.bdt-match-row--blocked .bdt-match-check{cursor:not-allowed}.bdt-match-row--existing{background:#ffb74d0a}.bdt-match-table a{color:var(--bdt-accent)}.bdt-import-log{display:grid;gap:.85rem;margin-top:.35rem;padding:.95rem 1rem;border-radius:12px;border:1px solid var(--bdt-border);background:linear-gradient(165deg,rgba(61,184,154,.07),transparent 55%),var(--bdt-bg-elevated)}.bdt-import-log__now{display:grid;gap:.25rem;padding:.75rem .85rem;border-radius:10px;border:1px solid var(--bdt-border);background:#0000002e}.bdt-import-log__now.is-active{border-color:#3db89a73;box-shadow:inset 3px 0 0 var(--bdt-accent)}.bdt-import-log__now.is-done{border-color:#81c78473;box-shadow:inset 3px 0 0 var(--bdt-ok)}.bdt-import-log__now.is-warn{border-color:#ffb74d73;box-shadow:inset 3px 0 0 var(--bdt-warn)}.bdt-import-log__now.is-fail{border-color:#e5737380;box-shadow:inset 3px 0 0 var(--bdt-danger)}.bdt-import-log__now-top{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.bdt-import-log__eyebrow{font-size:.7rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--bdt-muted)}.bdt-import-log__counter{font-variant-numeric:tabular-nums;font-size:.78rem;font-weight:700;color:var(--bdt-text)}.bdt-import-log__title{margin:0;font-size:1.05rem;font-weight:750;line-height:1.3;color:var(--bdt-text)}.bdt-import-log__hint{margin:0;font-size:.8rem;color:var(--bdt-muted)}.bdt-import-log__active{display:flex;flex-wrap:wrap;gap:.35rem;margin-top:.15rem}.bdt-import-log__active[hidden]{display:none}.bdt-import-log__chip{max-width:12rem;padding:.2rem .55rem;border-radius:999px;border:1px solid rgba(61,184,154,.3);background:#3db89a24;color:var(--bdt-text);font-size:.72rem;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;animation:bdt-chip-in .28s ease-out}.bdt-import-log__progress{display:grid;grid-template-columns:1fr auto;align-items:center;gap:.65rem}.bdt-import-log__progress-track{height:.55rem;border-radius:999px;background:#ffffff14;overflow:hidden}.bdt-import-log__progress-fill{height:100%;width:0;border-radius:inherit;background:linear-gradient(90deg,#2f9e8a,var(--bdt-accent));transition:width .35s ease}.bdt-import-log__pct{font-variant-numeric:tabular-nums;font-size:.8rem;color:var(--bdt-muted)}.bdt-import-log__stats{display:flex;flex-wrap:wrap;gap:.4rem}.bdt-import-log__elapsed{margin:0;padding:.45rem .65rem;border-radius:8px;border:1px solid rgba(61,184,154,.35);background:#3db89a14;color:var(--bdt-accent);font-size:.82rem;font-weight:700;font-variant-numeric:tabular-nums}.bdt-import-log__stat{display:inline-flex;align-items:baseline;gap:.3rem;padding:.28rem .55rem;border-radius:999px;border:1px solid var(--bdt-border);background:var(--bdt-bg);font-size:.72rem;color:var(--bdt-muted)}.bdt-import-log__stat strong{font-variant-numeric:tabular-nums;font-size:.86rem;color:var(--bdt-text)}.bdt-import-log__stat--ok{border-color:#81c78466}.bdt-import-log__stat--fail{border-color:#e5737373}.bdt-import-log__stat--skip{border-color:#ffb74d73}.bdt-import-log__list{list-style:none;margin:0;padding:0;max-height:min(32vh,280px);overflow:auto;border-radius:10px;border:1px solid var(--bdt-border);background:#0003}.bdt-import-log__item{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:.55rem .75rem;align-items:center;padding:.55rem .75rem;border-bottom:1px solid rgba(255,255,255,.06);font-size:.8rem}.bdt-import-log__item:last-child{border-bottom:0}.bdt-import-log__item-index{font-variant-numeric:tabular-nums;color:var(--bdt-muted)}.bdt-import-log__item-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--bdt-text)}.bdt-import-log__item-status{justify-self:end;padding:.15rem .45rem;border-radius:999px;font-size:.7rem;font-weight:700;white-space:nowrap;max-width:14rem;overflow:hidden;text-overflow:ellipsis}.bdt-import-log__item.is-ok .bdt-import-log__item-status{background:#81c7842e;color:#b7e0b9}.bdt-import-log__item.is-fail .bdt-import-log__item-status{background:#e573732e;color:#f0a8a8}.bdt-import-log__item.is-skip .bdt-import-log__item-status{background:#ffb74d29;color:#ffd29a}.bdt-panel a{color:var(--bdt-accent)}.bdt-toast-host{position:fixed;top:18px;right:18px;z-index:2147483002;display:flex;flex-direction:column;gap:.55rem;pointer-events:none;max-width:min(380px,calc(100vw - 36px))}.bdt-toast{pointer-events:auto;display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:.7rem;padding:.85rem .85rem .85rem .9rem;border-radius:12px;background:linear-gradient(135deg,rgba(255,255,255,.04),transparent 42%),var(--bdt-bg-elevated);color:var(--bdt-text);border:1px solid var(--bdt-border);border-left-width:3px;box-shadow:var(--bdt-shadow);opacity:0;transform:translateY(-10px) scale(.98);transition:opacity .22s ease,transform .22s ease;font-family:var(--bdt-font);cursor:pointer}.bdt-toast.is-in{opacity:1;transform:translateY(0) scale(1)}.bdt-toast.is-leaving{opacity:0;transform:translateY(-8px) scale(.98)}.bdt-toast__icon{display:grid;place-items:center;width:1.7rem;height:1.7rem;margin-top:.05rem;border-radius:999px;font-size:.85rem;flex:0 0 auto}.bdt-toast__body{display:grid;gap:.2rem;min-width:0;padding-top:.05rem}.bdt-toast__title{margin:0;font-size:.84rem;font-weight:700;line-height:1.25;letter-spacing:.01em}.bdt-toast__text{margin:0;color:var(--bdt-muted);font-size:.8rem;font-weight:500;line-height:1.4;word-break:break-word}.bdt-toast__close{margin:-.15rem -.2rem 0 0;border:0;background:transparent;color:var(--bdt-muted);font-size:1.1rem;line-height:1;cursor:pointer;padding:.15rem .35rem;border-radius:6px}.bdt-toast__close:hover{color:var(--bdt-text);background:#ffffff0f}.bdt-toast--info{border-left-color:#3db89ad9}.bdt-toast--info .bdt-toast__icon{background:#3db89a29;color:var(--bdt-accent)}.bdt-toast--success{border-left-color:#81c784e6}.bdt-toast--success .bdt-toast__icon{background:#81c78429;color:var(--bdt-ok)}.bdt-toast--warning{border-left-color:#ffb74df2}.bdt-toast--warning .bdt-toast__icon{background:#ffb74d29;color:var(--bdt-warn)}.bdt-toast--error{border-left-color:#e57373f2}.bdt-toast--error .bdt-toast__icon{background:#e5737329;color:var(--bdt-danger)}.bdt-history{display:grid;gap:.85rem}.bdt-history__head{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.bdt-history__title{margin:0;font-size:1.02rem;font-weight:700}.bdt-history__lead{margin:.25rem 0 0;color:var(--bdt-muted);font-size:.82rem;line-height:1.4}.bdt-history__filters{display:flex;flex-wrap:wrap;gap:.4rem}.bdt-history__chip{display:inline-flex;align-items:center;gap:.4rem;border:1px solid var(--bdt-border);background:var(--bdt-bg-elevated);color:var(--bdt-muted);padding:.35rem .65rem;border-radius:999px;cursor:pointer;font:600 .76rem/1.2 var(--bdt-font);transition:background-color .15s ease,border-color .15s ease,color .15s ease}.bdt-history__chip:hover{color:var(--bdt-text);border-color:#3db89a73}.bdt-history__chip.is-active{color:#0b1210;background:var(--bdt-accent);border-color:var(--bdt-accent)}.bdt-history__chip-count{display:inline-grid;place-items:center;min-width:1.25rem;height:1.25rem;padding:0 .3rem;border-radius:999px;background:#00000038;font-size:.7rem;font-variant-numeric:tabular-nums}.bdt-history__chip.is-active .bdt-history__chip-count{background:#0b12102e}.bdt-history__list{display:grid;gap:.55rem}.bdt-history__empty{display:grid;justify-items:center;gap:.4rem;text-align:center;padding:2rem 1rem;border:1px dashed var(--bdt-border);border-radius:12px;background:linear-gradient(165deg,rgba(61,184,154,.06),transparent 55%),var(--bdt-bg-elevated)}.bdt-history__empty-icon{display:grid;place-items:center;width:2.6rem;height:2.6rem;margin-bottom:.2rem;border-radius:999px;background:#3db89a1f;color:var(--bdt-accent);font-size:1.05rem}.bdt-history__empty-title{margin:0;font-size:.98rem;font-weight:700}.bdt-history__empty-text{margin:0;max-width:26rem;color:var(--bdt-muted);font-size:.82rem;line-height:1.45}.bdt-history-card{border:1px solid var(--bdt-border);border-radius:12px;background:var(--bdt-bg-elevated);overflow:hidden}.bdt-history-card__summary{display:grid;grid-template-columns:auto 1fr auto;gap:.75rem;align-items:center;padding:.75rem .85rem;cursor:pointer;list-style:none}.bdt-history-card__summary::-webkit-details-marker{display:none}.bdt-history-card__kind{display:grid;place-items:center;width:2.2rem;height:2.2rem;border-radius:10px;font-size:.9rem;flex-shrink:0}.bdt-history-card__svg{display:block;flex-shrink:0}.bdt-history-card__kind--import{background:#2a6b5c;color:#dff7f0}.bdt-history-card__kind--export{background:#4a5d78;color:#e4ecf8}.bdt-history-card__main{display:grid;gap:.2rem;min-width:0}.bdt-history-card__top{display:flex;align-items:center;gap:.5rem;min-width:0}.bdt-history-card__file{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:700;font-size:.9rem}.bdt-history-card__status{flex:0 0 auto;padding:.15rem .45rem;border-radius:999px;font-size:.68rem;font-weight:700;letter-spacing:.02em;text-transform:uppercase}.bdt-history-card__status--success{background:#5a9e5e;color:#0b1210}.bdt-history-card__status--partial{background:#c48a3a;color:#0b1210}.bdt-history-card__status--failed{background:#c45a5a;color:#0b1210}.bdt-history-card__meta{display:flex;flex-wrap:wrap;gap:.3rem;color:var(--bdt-muted);font-size:.75rem}.bdt-history-card__preview{color:var(--bdt-text);font-size:.78rem;line-height:1.35;opacity:.85;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bdt-history-card__chevron{color:var(--bdt-muted);font-size:.75rem;transition:transform .18s ease}.bdt-history-card[open] .bdt-history-card__chevron{transform:rotate(180deg)}.bdt-history-card__body{display:grid;gap:.75rem;padding:.75rem .85rem .85rem;border-top:1px solid var(--bdt-border)}.bdt-history-card__facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(8.5rem,1fr));gap:.55rem;margin:0}.bdt-history-card__facts>div{display:grid;gap:.15rem;padding:.45rem .55rem;border-radius:8px;background:var(--bdt-bg);border:1px solid var(--bdt-border)}.bdt-history-card__facts dt{margin:0;color:var(--bdt-muted);font-size:.68rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em}.bdt-history-card__facts dd{margin:0;font-size:.82rem;font-weight:600;word-break:break-word}.bdt-history-games{display:grid;gap:.4rem}.bdt-history-games__head{font-size:.78rem;font-weight:700;color:var(--bdt-muted)}.bdt-history-games__list{list-style:none;margin:0;padding:0;display:grid;gap:.35rem;max-height:14rem;overflow:auto}.bdt-history-game{display:grid;grid-template-columns:auto 1fr;gap:.55rem;align-items:start;padding:.45rem .55rem;border-radius:8px;background:var(--bdt-bg);border:1px solid var(--bdt-border)}.bdt-history-game__icon{display:grid;place-items:center;width:1.45rem;height:1.45rem;border-radius:999px;font-size:.7rem;margin-top:.05rem}.bdt-history-game.is-ok .bdt-history-game__icon{background:#5a9e5e;color:#0b1210}.bdt-history-game.is-fail .bdt-history-game__icon{background:#c45a5a;color:#0b1210}.bdt-history-game__body{display:grid;gap:.15rem;min-width:0}.bdt-history-game__title{font-size:.84rem;font-weight:600}.bdt-history-game__title a{color:inherit;text-decoration:none}.bdt-history-game__title a:hover{color:var(--bdt-accent);text-decoration:underline}.bdt-history-game__meta{display:flex;flex-wrap:wrap;gap:.35rem .55rem;color:var(--bdt-muted);font-size:.72rem}.bdt-history-game__error{color:var(--bdt-danger)}.bdt-history-card__actions{display:flex;justify-content:flex-end}.bdt-csv-map-host{min-width:0}.bdt-csv-map{display:grid;gap:.85rem}.bdt-csv-map__head{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:.75rem}.bdt-csv-map__title{margin:0;font-size:1.02rem;font-weight:700}.bdt-csv-map__lead{margin:.3rem 0 0;color:var(--bdt-muted);font-size:.84rem;line-height:1.4;max-width:34rem}.bdt-csv-map__stats{display:flex;flex-wrap:wrap;gap:.4rem;justify-content:flex-end}.bdt-csv-map__stat{padding:.28rem .55rem;border-radius:999px;background:var(--bdt-bg);border:1px solid var(--bdt-border);color:var(--bdt-muted);font-size:.72rem;font-weight:650}.bdt-csv-map__stat.is-ok{background:#5a9e5e;border-color:#5a9e5e;color:#0b1210}.bdt-csv-map__stat.is-warn{background:#c48a3a;border-color:#c48a3a;color:#0b1210}.bdt-csv-map__auto{padding:.7rem .85rem;border-radius:10px;border:1px solid rgba(61,184,154,.28);background:#3db89a14}.bdt-csv-map__auto-label{display:block;margin-bottom:.2rem;color:var(--bdt-accent);font-size:.7rem;font-weight:750;letter-spacing:.05em;text-transform:uppercase}.bdt-csv-map__auto-text{margin:0;font-size:.84rem;line-height:1.4}.bdt-csv-map__grid{display:grid;gap:.55rem}.bdt-csv-map__row{display:grid;grid-template-columns:minmax(8rem,.9fr) minmax(10rem,1.1fr) minmax(0,1.2fr);gap:.65rem;align-items:start;padding:.75rem .8rem;border-radius:12px;border:1px solid var(--bdt-border);background:var(--bdt-bg-elevated)}.bdt-csv-map__row.is-mapped{border-color:#3db89a59}.bdt-csv-map__row.is-missing{border-color:#e5737373;background:linear-gradient(165deg,rgba(229,115,115,.08),transparent 55%),var(--bdt-bg-elevated)}.bdt-csv-map__field{display:grid;gap:.35rem}.bdt-csv-map__field-name{font-size:.9rem;font-weight:700}.bdt-csv-map__pill{justify-self:start;padding:.12rem .42rem;border-radius:999px;background:#ffffff0f;color:var(--bdt-muted);font-size:.66rem;font-weight:700;letter-spacing:.03em;text-transform:uppercase}.bdt-csv-map__pill.is-mapped{background:#5a9e5e;color:#0b1210}.bdt-csv-map__pill.is-required{background:#c45a5a;color:#0b1210}.bdt-csv-map__select-wrap{display:grid;gap:.3rem}.bdt-csv-map__select-label{color:var(--bdt-muted);font-size:.7rem;font-weight:650}.bdt-csv-map__select{width:100%;box-sizing:border-box;padding:.5rem .65rem;border-radius:8px;border:1px solid var(--bdt-border);background:var(--bdt-bg);color:var(--bdt-text);font:inherit;font-size:.84rem}.bdt-csv-map__select:focus{outline:none;border-color:#3db89aa6;box-shadow:0 0 0 2px #3db89a2e}.bdt-csv-map__samples{display:flex;flex-wrap:wrap;gap:.35rem;align-content:flex-start;min-width:0}.bdt-csv-map__sample{max-width:100%;padding:.28rem .5rem;border-radius:8px;background:var(--bdt-bg);border:1px solid var(--bdt-border);color:var(--bdt-muted);font-size:.72rem;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bdt-csv-map__sample.is-empty{border-style:dashed}@media(max-width:820px){.bdt-csv-map__row{grid-template-columns:1fr}}.bdt-csv-values{display:grid;gap:.85rem}.bdt-csv-vmap{border-radius:12px;border:1px solid var(--bdt-border);background:var(--bdt-bg-elevated);overflow:hidden}.bdt-csv-vmap.is-ok{border-color:#3db89a59}.bdt-csv-vmap.is-warn{border-color:#ffb74d73}.bdt-csv-vmap__summary{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:.65rem;padding:.85rem .9rem .7rem;cursor:pointer;list-style:none;background:linear-gradient(165deg,rgba(61,184,154,.08),transparent 60%),var(--bdt-bg)}.bdt-csv-vmap__summary::-webkit-details-marker{display:none}.bdt-csv-vmap__summary::marker{content:""}.bdt-csv-vmap.is-warn .bdt-csv-vmap__summary{background:linear-gradient(165deg,rgba(255,183,77,.1),transparent 60%),var(--bdt-bg)}.bdt-csv-vmap__summary-main{display:flex;align-items:flex-start;gap:.65rem;min-width:0;flex:1 1 14rem}.bdt-csv-vmap__chevron{flex:0 0 auto;width:.55rem;height:.55rem;margin-top:.4rem;border-right:2px solid var(--bdt-muted);border-bottom:2px solid var(--bdt-muted);transform:rotate(-45deg);transition:transform .18s ease}.bdt-csv-vmap[open] .bdt-csv-vmap__chevron{margin-top:.25rem;transform:rotate(45deg)}.bdt-csv-vmap[open] .bdt-csv-vmap__summary{border-bottom:1px solid var(--bdt-border)}.bdt-csv-vmap__title{margin:0;font-size:.95rem;font-weight:750}.bdt-csv-vmap__lead{margin:.3rem 0 0;max-width:36rem;color:var(--bdt-muted);font-size:.8rem;line-height:1.4}.bdt-csv-vmap__badges{display:flex;flex-wrap:wrap;gap:.35rem}.bdt-csv-vmap__badge{padding:.22rem .5rem;border-radius:999px;background:var(--bdt-bg-elevated);border:1px solid var(--bdt-border);color:var(--bdt-muted);font-size:.7rem;font-weight:700}.bdt-csv-vmap__badge.is-ok{background:#5a9e5e;border-color:#5a9e5e;color:#0b1210}.bdt-csv-vmap__badge.is-warn{background:#c48a3a;border-color:#c48a3a;color:#0b1210}.bdt-csv-vmap__table-wrap{overflow:auto;max-height:min(42vh,360px)}.bdt-csv-vmap__table{width:100%;border-collapse:collapse;font-size:.82rem}.bdt-csv-vmap__table th,.bdt-csv-vmap__table td{padding:.55rem .75rem;text-align:left;border-bottom:1px solid var(--bdt-border);vertical-align:middle}.bdt-csv-vmap__table th{position:sticky;top:0;z-index:1;background:var(--bdt-bg);color:var(--bdt-muted);font-size:.7rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.bdt-csv-vmap__table tr.is-native{opacity:.72}.bdt-csv-vmap__table tr.is-unmapped{background:#e573730f}.bdt-csv-vmap__table tr.is-mapped td:first-child{box-shadow:inset 3px 0 0 var(--bdt-accent)}.bdt-csv-vmap__raw{font-family:ui-monospace,Cascadia Code,Consolas,monospace;font-size:.8rem;color:var(--bdt-text)}.bdt-csv-vmap__native{display:inline-block;margin-left:.4rem;padding:.08rem .35rem;border-radius:999px;background:#ffffff0f;color:var(--bdt-muted);font-size:.64rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em}.bdt-csv-vmap__origin{display:inline-block;margin-left:.4rem;padding:.08rem .35rem;border-radius:999px;font-size:.64rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em}.bdt-csv-vmap__origin--auto{background:#ffffff0f;color:var(--bdt-muted)}.bdt-csv-vmap__origin--manual{background:#e8b0582e;color:#e8b058}.bdt-csv-vmap__badge.is-manual{background:#e8b05829;color:#e8b058}.bdt-csv-vmap__toolbar{display:flex;justify-content:flex-end;padding:.55rem .85rem 0}.bdt-csv-vmap__reset{font-size:.75rem;padding:.35rem .7rem}.bdt-csv-vmap__table tr.is-manual td:first-child{box-shadow:inset 2px 0 #e8b058a6}.bdt-csv-vmap__count{font-variant-numeric:tabular-nums;color:var(--bdt-muted);white-space:nowrap}.bdt-csv-vmap__select{min-width:11rem}.bdt-csv-vmap__preview{display:inline-block;padding:.2rem .45rem;border-radius:999px;background:#3db89a24;color:var(--bdt-accent);font-size:.75rem;font-weight:650}.bdt-csv-vmap__preview.is-empty{background:#ffffff0a;color:var(--bdt-muted)}.bdt-export-locked{display:grid;justify-items:center;gap:.55rem;text-align:center;padding:2.2rem 1.2rem;border-radius:14px;border:1px dashed var(--bdt-border);background:radial-gradient(ellipse 70% 60% at 50% 0%,rgba(74,93,120,.22),transparent 60%),var(--bdt-bg-elevated)}.bdt-export-locked__icon{display:grid;place-items:center;width:3rem;height:3rem;margin-bottom:.15rem;border-radius:12px;background:#4a5d78;color:#e4ecf8}.bdt-export-locked__title{margin:0;font-size:1.1rem;font-weight:750}.bdt-export-locked__text{margin:0;max-width:28rem;color:var(--bdt-muted);font-size:.86rem;line-height:1.45}.bdt-export-locked__badge{margin-top:.25rem;padding:.28rem .65rem;border-radius:999px;background:#c48a3a;color:#0b1210;font-size:.72rem;font-weight:750;letter-spacing:.04em;text-transform:uppercase}.bdt-about{display:grid;gap:1rem}.bdt-about__hero{position:relative;display:grid;gap:.65rem;padding:1.15rem 1.15rem 1.2rem;border-radius:14px;border:1px solid var(--bdt-border);background:radial-gradient(ellipse 80% 70% at 100% 0%,rgba(61,184,154,.18),transparent 55%),linear-gradient(165deg,#232833,#1a1d24);overflow:hidden}.bdt-about__eyebrow{margin:0;color:var(--bdt-accent);font-size:.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.bdt-about__title{margin:0;font-size:1.25rem;font-weight:750;letter-spacing:-.02em}.bdt-about__body{margin:0;max-width:36rem;color:var(--bdt-muted);font-size:.88rem;line-height:1.5}.bdt-about__version{position:absolute;top:.9rem;right:.9rem;padding:.28rem .55rem;border-radius:999px;background:var(--bdt-accent);color:#0b1210;font-size:.72rem;font-weight:750;font-variant-numeric:tabular-nums}.bdt-about__points{list-style:none;margin:0;padding:0;display:grid;gap:.45rem}.bdt-about__points li{position:relative;padding:.65rem .8rem .65rem 2.1rem;border-radius:10px;border:1px solid var(--bdt-border);background:var(--bdt-bg-elevated);color:var(--bdt-text);font-size:.84rem;line-height:1.4}.bdt-about__points li:before{content:"";position:absolute;left:.8rem;top:50%;width:.55rem;height:.55rem;border-radius:999px;background:var(--bdt-accent);transform:translateY(-50%)}.bdt-about__links{display:flex;flex-wrap:wrap;gap:.45rem}.bdt-about__link{display:inline-flex;align-items:center;padding:.45rem .75rem;border-radius:999px;border:1px solid var(--bdt-border);background:var(--bdt-bg-elevated);color:var(--bdt-text)!important;text-decoration:none!important;font-size:.78rem;font-weight:650;transition:border-color .15s ease,background-color .15s ease}.bdt-about__link:hover{border-color:#3db89a8c;background:#3db89a1f}.bdt-author{display:grid;grid-template-columns:auto 1fr;gap:1rem;align-items:center;padding:1rem;border-radius:14px;border:1px solid var(--bdt-border);background:linear-gradient(135deg,rgba(61,184,154,.08),transparent 42%),var(--bdt-bg-elevated)}.bdt-author__avatar{width:4.5rem;height:4.5rem;border-radius:999px;object-fit:cover;border:2px solid rgba(61,184,154,.45);background:var(--bdt-bg);box-shadow:0 8px 24px #00000047}.bdt-author__body{display:grid;gap:.18rem;min-width:0}.bdt-author__label{margin:0;color:var(--bdt-muted);font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.bdt-author__name{margin:0;font-size:1.15rem;font-weight:750;letter-spacing:-.02em}.bdt-author__handle{margin:0;color:var(--bdt-muted);font-size:.84rem}.bdt-author__email{margin-top:.15rem;color:var(--bdt-accent)!important;text-decoration:none!important;font-size:.86rem;font-weight:600;word-break:break-all}.bdt-author__email:hover{text-decoration:underline!important}.bdt-author__links{display:flex;flex-wrap:wrap;gap:.55rem .85rem;margin-top:.45rem}.bdt-author__links a{color:var(--bdt-text)!important;text-decoration:none!important;font-size:.78rem;font-weight:650;opacity:.85}.bdt-author__links a:hover{color:var(--bdt-accent)!important;opacity:1}@media(max-width:560px){.bdt-author{grid-template-columns:1fr;justify-items:center;text-align:center}.bdt-author__links{justify-content:center}.bdt-about__version{position:static;justify-self:start}}.bdt-cache{display:grid;gap:1rem}.bdt-cache__head{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:.85rem 1rem}.bdt-cache__title{margin:0;font-size:1.05rem;font-weight:750}.bdt-cache__lead{margin:.35rem 0 0;max-width:36rem;color:var(--bdt-muted);font-size:.84rem;line-height:1.45}.bdt-cache__actions{display:flex;flex-wrap:wrap;gap:.45rem}.bdt-cache-meter{padding:.95rem 1rem;border-radius:12px;border:1px solid var(--bdt-border);background:linear-gradient(165deg,rgba(61,184,154,.07),transparent 55%),var(--bdt-bg-elevated)}.bdt-cache-meter__head{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:.65rem 1.25rem;margin-bottom:.65rem}.bdt-cache-meter__titles{display:grid;gap:.2rem;min-width:0}.bdt-cache-meter__label{font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--bdt-muted)}.bdt-cache-meter__used{font-size:.9rem;font-variant-numeric:tabular-nums;color:var(--bdt-text)}.bdt-cache-meter__pct-wrap{display:grid;justify-items:end;gap:.05rem;text-align:right}.bdt-cache-meter__pct{font-size:1.55rem;font-weight:800;font-variant-numeric:tabular-nums;line-height:1;color:var(--bdt-accent);letter-spacing:-.02em}.bdt-cache-meter__pct.is-mid{color:var(--bdt-warn)}.bdt-cache-meter__pct.is-high{color:var(--bdt-danger)}.bdt-cache-meter__pct-label{font-size:.7rem;font-weight:650;letter-spacing:.03em;text-transform:uppercase;color:var(--bdt-muted)}.bdt-cache-meter__bar{display:flex;height:.7rem;border-radius:999px;overflow:hidden;background:#ffffff0f;border:1px solid var(--bdt-border)}.bdt-cache-meter__seg{display:block;height:100%;min-width:0;transition:width .28s ease}.bdt-cache-meter__seg--found{background:linear-gradient(90deg,#2f9e8a,var(--bdt-accent))}.bdt-cache-meter__seg--miss{background:#c48a3a}.bdt-cache-meter__seg--history{background:#64b5f6}.bdt-cache-meter__seg--maps{background:#ba68c8}.bdt-cache-meter__seg--settings{background:#90a4ae}.bdt-cache-meter__seg--free{background:transparent}.bdt-cache-meter__legend{list-style:none;margin:.75rem 0 0;padding:0;display:grid;grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));gap:.35rem .85rem}.bdt-cache-meter__legend li{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:.4rem;font-size:.75rem;color:var(--bdt-muted)}.bdt-cache-meter__legend-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bdt-cache-meter__legend-value{font-variant-numeric:tabular-nums;color:var(--bdt-text);font-weight:650}.bdt-cache-meter__swatch{width:.65rem;height:.65rem;border-radius:3px;flex:0 0 auto}.bdt-cache-meter__swatch--found{background:var(--bdt-accent)}.bdt-cache-meter__swatch--miss{background:#c48a3a}.bdt-cache-meter__swatch--history{background:#64b5f6}.bdt-cache-meter__swatch--maps{background:#ba68c8}.bdt-cache-meter__swatch--settings{background:#90a4ae}.bdt-cache-meter__swatch--free{background:#ffffff1f;border:1px solid var(--bdt-border)}.bdt-cache-meter__hint{margin:.65rem 0 0;color:var(--bdt-muted);font-size:.76rem;line-height:1.4}.bdt-cache-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(9.5rem,1fr));gap:.65rem}.bdt-cache-card{padding:.75rem .85rem;border-radius:10px;border:1px solid var(--bdt-border);background:var(--bdt-bg-elevated)}.bdt-cache-card__label{margin:0;font-size:.7rem;font-weight:700;letter-spacing:.03em;text-transform:uppercase;color:var(--bdt-muted)}.bdt-cache-card__value{display:block;margin:.35rem 0 .15rem;font-size:1.15rem;font-weight:750;font-variant-numeric:tabular-nums;line-height:1.2}.bdt-cache-card__hint{margin:0;color:var(--bdt-muted);font-size:.72rem}.bdt-cache-list-wrap{border-radius:12px;border:1px solid var(--bdt-border);background:var(--bdt-bg-elevated);overflow:hidden}.bdt-cache-list__head{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:.4rem 1rem;padding:.75rem .9rem;border-bottom:1px solid var(--bdt-border);background:var(--bdt-bg)}.bdt-cache-list__title{margin:0;font-size:.92rem;font-weight:750}.bdt-cache-list__meta{margin:0;color:var(--bdt-muted);font-size:.76rem}.bdt-cache-list{overflow:auto;max-height:min(42vh,360px)}.bdt-cache-table{width:100%;border-collapse:collapse;font-size:.8rem}.bdt-cache-table th,.bdt-cache-table td{padding:.5rem .75rem;text-align:left;border-bottom:1px solid var(--bdt-border);vertical-align:middle}.bdt-cache-table th{position:sticky;top:0;z-index:1;background:var(--bdt-bg);color:var(--bdt-muted);font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.03em}.bdt-cache-col-query,.bdt-cache-col-match{max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bdt-cache-col-id,.bdt-cache-col-size,.bdt-cache-col-when{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--bdt-muted)}.bdt-cache-pill{display:inline-block;padding:.12rem .4rem;border-radius:999px;font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.02em}.bdt-cache-pill--hit{background:#3db89a29;color:var(--bdt-accent)}.bdt-cache-pill--miss{background:#ffb74d29;color:var(--bdt-warn)}.bdt-cache-row--miss{background:#ffb74d0a}.bdt-cache-empty{padding:1.5rem 1rem;text-align:center}.bdt-cache-empty__title{margin:0;font-size:.95rem;font-weight:750}.bdt-cache-empty__text{margin:.4rem 0 0;color:var(--bdt-muted);font-size:.82rem}.bdt-cleanup{display:grid;gap:1rem;align-content:start;min-height:100%}.bdt-cleanup__head{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;flex-wrap:wrap}.bdt-cleanup__title{margin:0;font-size:1.05rem;font-weight:750}.bdt-cleanup__lead{margin:.35rem 0 0;max-width:42rem;color:var(--bdt-muted);font-size:.84rem;line-height:1.45}.bdt-cleanup__actions{display:flex;gap:.45rem;flex-wrap:wrap}.bdt-cleanup__actions .bdt-btn i{margin-right:.35rem}.bdt-cleanup__progress-meta{margin:0;color:var(--bdt-muted);font-size:.78rem}.bdt-cleanup-idle{display:grid;gap:1rem;justify-items:center;text-align:center;padding:1.75rem 1.1rem 1.4rem;border:1px solid var(--bdt-border);border-radius:var(--bdt-radius);background:radial-gradient(ellipse 70% 55% at 50% 0%,rgba(61,184,154,.14),transparent 60%),linear-gradient(180deg,rgba(255,255,255,.03),transparent),var(--bdt-bg-elevated)}.bdt-cleanup-idle__visual{position:relative;display:grid;place-items:center;width:3.4rem;height:3.4rem;color:var(--bdt-accent);font-size:1.25rem}.bdt-cleanup-idle__orb{position:absolute;inset:0;border-radius:999px;background:#3db89a1f;border:1px solid rgba(61,184,154,.28);animation:bdt-cleanup-pulse 2.4s ease-in-out infinite}.bdt-cleanup-idle__visual i,.bdt-cleanup-idle__icon{position:relative;z-index:1;display:block}@keyframes bdt-cleanup-pulse{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.08);opacity:.7}}.bdt-cleanup-idle__copy{display:grid;gap:.35rem;max-width:28rem}.bdt-cleanup-idle__title{margin:0;font-size:1rem;font-weight:750}.bdt-cleanup-idle__text{margin:0;color:var(--bdt-muted);font-size:.84rem;line-height:1.45}.bdt-cleanup-idle__steps{display:grid;gap:.4rem;margin:0;padding:0;list-style:none;width:min(100%,22rem);text-align:left}.bdt-cleanup-idle__steps li{position:relative;padding:.45rem .7rem .45rem 2rem;border-radius:8px;background:#0000002e;border:1px solid var(--bdt-border);color:var(--bdt-muted);font-size:.8rem;line-height:1.35}.bdt-cleanup-idle__steps li:before{content:"";position:absolute;left:.65rem;top:50%;width:.45rem;height:.45rem;border-radius:999px;background:var(--bdt-accent);transform:translateY(-50%);box-shadow:0 0 0 3px #3db89a29}.bdt-cleanup-empty{display:grid;justify-items:center;gap:.45rem;text-align:center;padding:2rem 1rem}.bdt-cleanup-empty--compact{padding:1.4rem 1rem;border:1px dashed var(--bdt-border);border-radius:var(--bdt-radius)}.bdt-cleanup-empty--error{border:1px solid rgba(229,115,115,.3);border-radius:var(--bdt-radius);background:#e573730f}.bdt-cleanup-empty__icon{display:grid;place-items:center;width:2.6rem;height:2.6rem;border-radius:999px;background:#ffb74d24;color:var(--bdt-warn);font-size:1.05rem}.bdt-cleanup-empty__icon.is-ok{background:#81c78424;color:var(--bdt-ok)}.bdt-cleanup-empty--error .bdt-cleanup-empty__icon{background:#e5737324;color:var(--bdt-danger)}.bdt-cleanup-empty__title{margin:0;font-size:.98rem;font-weight:750}.bdt-cleanup-empty__text{margin:0;max-width:28rem;color:var(--bdt-muted);font-size:.84rem;line-height:1.45}.bdt-cleanup-toolbar{display:grid;gap:.75rem}.bdt-cleanup-stats{display:flex;flex-wrap:wrap;gap:.55rem .9rem;align-items:baseline}.bdt-cleanup-stat{font-size:.82rem;color:var(--bdt-text)}.bdt-cleanup-stat strong{margin-right:.25rem;color:var(--bdt-warn);font-variant-numeric:tabular-nums;font-size:1.05rem}.bdt-cleanup-stat--muted{color:var(--bdt-muted)}.bdt-cleanup-stat--warn{color:var(--bdt-warn)}.bdt-cleanup-controls{display:flex;flex-wrap:wrap;gap:.55rem;align-items:center}.bdt-cleanup-search{display:flex;align-items:center;gap:.45rem;flex:1 1 14rem;min-width:12rem;padding:.4rem .7rem;border-radius:9px;border:1px solid var(--bdt-border);background:#00000038;color:var(--bdt-muted);margin-bottom:0}.bdt-cleanup-search input{flex:1 1 auto;min-width:0;border:0;outline:none;background:transparent;color:var(--bdt-text);font:inherit;font-size:.84rem}.bdt-cleanup-search input::placeholder{color:var(--bdt-muted)}.bdt-cleanup-sort{display:inline-flex;padding:.18rem;border-radius:9px;border:1px solid var(--bdt-border);background:#0000002e}.bdt-cleanup-sort__btn{border:0;background:transparent;color:var(--bdt-muted);font:inherit;font-size:.78rem;font-weight:600;padding:.35rem .35rem .35rem .65rem;border-radius:7px;cursor:pointer}.bdt-cleanup-sort__btn:last-child{padding-right:.65rem}.bdt-cleanup-sort__btn:hover{color:var(--bdt-text)}.bdt-cleanup-sort__btn.is-active{background:#3db89a2e;color:var(--bdt-accent)}.bdt-cleanup-list{display:grid;gap:.7rem}.bdt-cleanup-card{display:grid;gap:0;border:1px solid var(--bdt-border);border-radius:12px;background:linear-gradient(135deg,rgba(255,183,77,.05),transparent 42%),var(--bdt-bg-elevated);transition:border-color .15s ease;overflow:hidden}.bdt-cleanup-card:hover,.bdt-cleanup-card.is-open{border-color:#ffb74d66}.bdt-cleanup-card__main{display:grid;grid-template-columns:auto 1fr auto;gap:.9rem;align-items:start;padding:.75rem;cursor:pointer}.bdt-cleanup-card__media{position:relative;display:block;width:4.4rem;flex:0 0 auto}.bdt-cleanup-card__cover{display:block;width:4.4rem;height:5.9rem;object-fit:cover;border-radius:8px;background:#00000059;border:1px solid var(--bdt-border)}.bdt-cleanup-card__cover--empty{display:grid;place-items:center;color:var(--bdt-muted);font-size:1.1rem}.bdt-cleanup-card__count{position:absolute;right:-.35rem;top:-.35rem;min-width:1.45rem;height:1.45rem;padding:0 .3rem;display:grid;place-items:center;border-radius:999px;background:var(--bdt-warn);color:#1a1208;font-size:.72rem;font-weight:800;font-variant-numeric:tabular-nums;box-shadow:0 2px 8px #00000059}.bdt-cleanup-card__body{display:grid;gap:.45rem;min-width:0;align-content:start}.bdt-cleanup-card__top{display:flex;align-items:flex-start;justify-content:space-between;gap:.6rem}.bdt-cleanup-card__title{margin:0;font-size:.95rem;font-weight:700;line-height:1.3}.bdt-cleanup-card__badge{flex:0 0 auto;padding:.18rem .5rem;border-radius:999px;background:#ffb74d29;color:var(--bdt-warn);font-size:.72rem;font-weight:750;white-space:nowrap}.bdt-cleanup-card__status{margin:0;color:var(--bdt-muted);font-size:.78rem}.bdt-cleanup-card__logs{display:flex;flex-wrap:wrap;gap:.35rem}.bdt-cleanup-chip{display:inline-block;max-width:100%;padding:.18rem .5rem;border-radius:999px;border:1px solid var(--bdt-border);background:#0003;color:var(--bdt-muted);font-size:.72rem;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bdt-cleanup-chip--more{border-style:dashed;color:var(--bdt-text)}.bdt-cleanup-card__actions{display:flex;flex-wrap:wrap;gap:.4rem}.bdt-cleanup-card__actions .bdt-btn i,.bdt-cleanup-card__actions .bdt-btn__icon{margin-right:.3rem;vertical-align:-.1em}.bdt-cleanup-card__chevron{display:grid;place-items:center;align-self:center;color:var(--bdt-muted);transition:transform .2s ease}.bdt-cleanup-card.is-open .bdt-cleanup-card__chevron{transform:rotate(180deg);color:var(--bdt-accent)}.bdt-cleanup-card__drawer{border-top:1px solid var(--bdt-border);padding:.85rem .85rem .95rem;background:#0000002e;animation:bdt-cleanup-drawer-in .22s ease}@keyframes bdt-cleanup-drawer-in{0%{opacity:0;transform:translateY(-.35rem)}to{opacity:1;transform:translateY(0)}}.bdt-cleanup-drawer__head{display:grid;gap:.2rem;margin-bottom:.7rem}.bdt-cleanup-drawer__title{margin:0;font-size:.84rem;font-weight:700}.bdt-cleanup-drawer__hint{margin:0;color:var(--bdt-muted);font-size:.76rem}.bdt-cleanup-loglist{display:grid;gap:.55rem}.bdt-cleanup-log{display:flex;flex-wrap:wrap;align-items:center;gap:.65rem;padding:.65rem .7rem;border:1px solid var(--bdt-border);border-radius:10px;background:#ffffff08}.bdt-cleanup-log__main{display:flex;gap:.65rem;align-items:flex-start;min-width:0;flex:1 1 14rem}.bdt-cleanup-log__index{flex:0 0 auto;width:1.5rem;height:1.5rem;display:grid;place-items:center;border-radius:999px;background:#3db89a24;color:var(--bdt-accent);font-size:.72rem;font-weight:750}.bdt-cleanup-log__body{min-width:0;display:grid;gap:.25rem}.bdt-cleanup-log__title{margin:0;font-size:.88rem;font-weight:700}.bdt-cleanup-log__meta{margin:0;color:var(--bdt-muted);font-size:.76rem;line-height:1.35}.bdt-cleanup-log__badges{display:flex;flex-wrap:wrap;gap:.3rem;margin-top:.15rem}@media(max-width:640px){.bdt-cleanup-card__main{grid-template-columns:3.6rem 1fr;gap:.7rem}.bdt-cleanup-card__chevron{display:none}.bdt-cleanup-card__media,.bdt-cleanup-card__cover{width:3.6rem}.bdt-cleanup-card__cover{height:4.8rem}}.bdt-settings{display:grid;gap:1rem}.bdt-settings__head{display:grid;gap:.25rem}.bdt-settings__title{margin:0;font-size:1.05rem;font-weight:750}.bdt-settings__lead{margin:0;color:var(--bdt-muted);font-size:.84rem;line-height:1.45}.bdt-settings__grid{display:grid;gap:.95rem}.bdt-settings__field{display:grid;gap:.35rem;padding:.85rem .95rem;border:1px solid var(--bdt-border);border-radius:12px;background:var(--bdt-bg-elevated)}.bdt-settings__field--toggle{gap:.55rem}.bdt-settings__label{color:var(--bdt-text);font-size:.84rem;font-weight:700}.bdt-settings__hint{color:var(--bdt-muted);font-size:.76rem;line-height:1.4}.bdt-settings__inline{display:flex;align-items:center;gap:.55rem}.bdt-settings__input,.bdt-settings__select{width:100%;max-width:14rem;padding:.45rem .65rem;border-radius:8px;border:1px solid var(--bdt-border);background:#161a22;color:var(--bdt-text);font:inherit;font-size:.84rem}.bdt-settings__input{max-width:7.5rem}.bdt-settings__input:focus,.bdt-settings__select:focus{outline:none;border-color:#3db89a8c;box-shadow:0 0 0 2px #3db89a2e}.bdt-settings__suffix{color:var(--bdt-muted);font-size:.78rem;white-space:nowrap} '); (function () { 'use strict'; var t=(()=>"undefined"!=typeof GM_getValue?GM_getValue:void 0)(),e=(()=>"undefined"!=typeof GM_registerMenuCommand?GM_registerMenuCommand:void 0)(),n=(()=>"undefined"!=typeof GM_setValue?GM_setValue:void 0)(),a=(()=>"undefined"!=typeof GM_xmlhttpRequest?GM_xmlhttpRequest:void 0)();const r="https://github.com/NemoKing1210/backloggd-data-transfer",i="0.7.0",s=Object.freeze({name:"NemoKing",handle:"NemoKing1210",email:"nemoking1210@gmail.com",avatarUrl:"https://avatars.githubusercontent.com/u/58397369?v=4",githubUrl:"https://github.com/NemoKing1210",profileUrl:"https://nemoking1210.github.io/profile/",backloggdUrl:"https://www.backloggd.com/u/NemoKing/"}),o="bdt_settings",l="bdt_history",d="bdt_csv_value_maps",c="bdt_game_cache_v1",u=7776e6,p=12096e5,m="data-bdt-root",g="backloggd-transfer",h=Object.freeze(["wishlist","backlog","playing","played","completed","shelved","abandoned","retired"]),b=Object.freeze({wishlist:"Wishlist",backlog:"Backlog",playing:"Playing",played:"Played",completed:"Completed",shelved:"Shelved",abandoned:"Abandoned",retired:"Retired"}),f=Object.freeze({"not started":null,planned:"wishlist",deferred:"shelved","in progress":"playing",dropped:"abandoned",tried:"retired",done:"completed",played:"played",completed:"completed",session:"played",infinity:"played",infinite:"played",endless:"played",mmorpg:"played",roguelike:"played",sandbox:"played",gacha:"played",wishlist:"wishlist",backlog:"backlog",playing:"playing",shelved:"shelved",abandoned:"abandoned",retired:"retired"}),y={uiLocale:"auto",importDelayMs:1e3,importFormat:"json",importExisting:false,matchConcurrency:4,debugMode:false};function v(){try{const e=t(d,null);return e&&"object"==typeof e?{status:C(e.status),rating:C(e.rating),platform:C(e.platform)}:{status:{},rating:{},platform:{}}}catch(e){return {status:{},rating:{},platform:{}}}}function _(t,e){const n=String(e||"").trim().toLowerCase();return !(!n||!t)&&Object.prototype.hasOwnProperty.call(t,n)}function S(t,e,n){var a;const r={...t};for(const i of n||[]){const t=null==i?void 0:i.raw;if(!t)continue;const n=String(t).trim().toLowerCase();n&&Object.prototype.hasOwnProperty.call(e,n)&&(r[t]=null!=(a=e[n])?a:"");}return r}function k(t){try{n(d,t);}catch(e){}}function C(t){if(!t||"object"!=typeof t)return {};const e={};for(const[n,a]of Object.entries(t)){const t=String(n||"").trim().toLowerCase();t&&(e[t]=null==a?"":String(a));}return e}function M(t){const e={};if(!t||"object"!=typeof t)return e;for(const[n,a]of Object.entries(t)){const t=String(n||"").trim().toLowerCase();t&&(e[t]=null==a?"":String(a));}return e}const w=Object.freeze([{id:6,name:"Windows PC",aliases:["pc","windows","win","win32","windows pc","microsoft windows","pc (microsoft windows)","pc microsoft windows","steam","steamos","steam deck","steamdeck","deck"]},{id:14,name:"Mac",aliases:["macos","mac os","osx","os x","apple","macintosh"]},{id:3,name:"Linux",aliases:["gnu/linux","ubuntu","debian"]},{id:167,name:"PlayStation 5",aliases:["ps5","ps 5","playstation5","sony playstation 5"]},{id:48,name:"PlayStation 4",aliases:["ps4","ps 4","playstation4","sony playstation 4"]},{id:9,name:"PlayStation 3",aliases:["ps3","ps 3","playstation3"]},{id:8,name:"PlayStation 2",aliases:["ps2","ps 2","playstation2"]},{id:7,name:"PlayStation",aliases:["ps1","psx","ps one","playstation 1","playstation one"]},{id:46,name:"PlayStation Vita",aliases:["ps vita","psvita","vita","psv"]},{id:38,name:"PlayStation Portable",aliases:["psp","playstation portable"]},{id:169,name:"Xbox Series X|S",aliases:["xbox series","xbox series x","xbox series s","xbox series x/s","xbox series x|s","xsx","xss","series x","series s"]},{id:49,name:"Xbox One",aliases:["xboxone","xb1","xone"]},{id:12,name:"Xbox 360",aliases:["x360","xbox360"]},{id:11,name:"Xbox",aliases:["xbox original","og xbox"]},{id:130,name:"Nintendo Switch",aliases:["switch","nsw","ns"]},{id:508,name:"Nintendo Switch 2",aliases:["switch 2","nsw2","ns2"]},{id:41,name:"Wii U",aliases:["wiiu"]},{id:5,name:"Wii",aliases:["nintendo wii"]},{id:37,name:"Nintendo 3DS",aliases:["3ds","n3ds","new 3ds"]},{id:20,name:"Nintendo DS",aliases:["nds","ds","dsi"]},{id:21,name:"Nintendo GameCube",aliases:["gamecube","gcn","ngc"]},{id:4,name:"Nintendo 64",aliases:["n64","nintendo64"]},{id:19,name:"Super Nintendo Entertainment System",aliases:["snes","super nintendo","super nes","super famicom"]},{id:18,name:"Nintendo Entertainment System",aliases:["nes","famicom"]},{id:24,name:"Game Boy Advance",aliases:["gba","gameboy advance"]},{id:22,name:"Game Boy Color",aliases:["gbc","gameboy color"]},{id:33,name:"Game Boy",aliases:["gb","gameboy"]},{id:34,name:"Android",aliases:["google play","mobile android"]},{id:39,name:"iOS",aliases:["iphone","ipad","apple ios","mobile ios"]},{id:82,name:"Web browser",aliases:["browser","web","html5","flash"]},{id:52,name:"Arcade",aliases:["arcade cabinet","coin-op"]},{id:163,name:"SteamVR",aliases:["steam vr","valve index"]},{id:162,name:"Oculus VR",aliases:["oculus","meta quest","quest","quest 2","quest 3","rift"]},{id:165,name:"PlayStation VR",aliases:["psvr","ps vr","playstation vr","psvr2","ps vr2"]},{id:170,name:"Google Stadia",aliases:["stadia"]},{id:309,name:"Amazon Luna",aliases:["luna"]},{id:386,name:"Meta Quest 2",aliases:["oculus quest 2"]},{id:471,name:"Meta Quest 3",aliases:["oculus quest 3"]}]),$=new Map(w.map(t=>[t.id,t])),L=new Map(w.map(t=>[T(t.name),t])),x=(()=>{const t=new Map;for(const e of w){t.set(T(e.name),e);for(const n of e.aliases||[]){const a=T(n);a&&!t.has(a)&&t.set(a,e);}}return t})();function T(t){return String(t||"").trim().toLowerCase().replace(/[_/|]+/g," ").replace(/[()[\]]+/g," ").replace(/\s+/g," ").trim()}function F(t){if(null==t||""===t)return null;const e=String(t).trim();if(!e)return null;if(/^\d+$/.test(e)){const t=$.get(Number(e));return t?{id:t.id,name:t.name}:null}const n=L.get(T(e));return n?{id:n.id,name:n.name}:null}function E(t){const e=F(t);if(e)return e;const n=String(t||"").trim();if(!n)return null;const a=x.get(T(n));if(a)return {id:a.id,name:a.name};const r=T(n);let i=null,s=0;for(const o of w){const t=T(o.name);let e=0;if(r===t)e=100;else if(r.includes(t)||t.includes(r))e=70;else for(const n of o.aliases||[]){const t=T(n);if(t){if(r===t){e=Math.max(e,95);break}(r.includes(t)||t.includes(r))&&(e=Math.max(e,55));}}e>s&&(s=e,i=o);}return i&&s>=70?{id:i.id,name:i.name}:null}function N(t){return null==t||""===t?null:F(t)||E(t)}function I(t){const e=String(t||"").trim();if(!e)return "";const n=e.match(/^(\d{4})-(\d{2})-(\d{2})/);if(n)return `${n[1]}-${n[2]}-${n[3]}`;const a=e.match(/^(\d{1,2})[./](\d{1,2})[./](\d{4})$/);if(a){const t=a[1].padStart(2,"0"),e=a[2].padStart(2,"0");return `${a[3]}-${e}-${t}`}const r=Date.parse(e);if(!Number.isNaN(r)){const t=new Date(r),e=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0");if(e>=1970&&e<=2100)return `${e}-${n}-${a}`}return ""}function A(t){if(null==t||""===t)return null;let e=String(t).trim().toLowerCase().replace(/\s+/g," ");return "done"===e&&(e="completed"),h.includes(e)?e:null}function B(t){if(null==t||""===t)return null;const e=Number(t);if(!Number.isFinite(e))return null;if(e>=1&&e<=10&&Number.isInteger(e))return e;if(e>0&&e<=5){const t=Math.round(2*e);return t>=1&&t<=10?t:null}return null}function q(t,e=false){if("boolean"==typeof t)return t;if(null==t||""===t)return e;const n=String(t).trim().toLowerCase();return "true"===n||"1"===n||"yes"===n||"false"!==n&&"0"!==n&&"no"!==n&&e}function R(t){if(null==t||""===t)return null;const e=Number(t);return Number.isFinite(e)?e:null}function D(t){const e=A(t);return {is_play:"playing"===e||"played"===e||"completed"===e||"shelved"===e||"abandoned"===e||"retired"===e,is_playing:"playing"===e,is_backlog:"backlog"===e,is_wishlist:"wishlist"===e}}function P(t={}){var e;const n=A(t.status),a=D(n),r=null!=t.is_play||null!=t.is_playing||null!=t.is_backlog||null!=t.is_wishlist;return {game_liked:q(t.game_liked,false),is_play:r?q(t.is_play,false):a.is_play,is_playing:r?q(t.is_playing,false):a.is_playing,is_backlog:r?q(t.is_backlog,false):a.is_backlog,is_wishlist:r?q(t.is_wishlist,false):a.is_wishlist,status:n,total_hours:R(t.total_hours),total_minutes:R(t.total_minutes),time_source:null!=(e=R(t.time_source))?e:1,override_cover_id:R(t.override_cover_id)}}function H(t={}){return {title:String(t.title||"Log").trim()||"Log",rating:B(t.rating),review:String(t.review||""),review_spoilers:q(t.review_spoilers,false),platform:R(t.platform),hours_played:R(t.hours_played),mins_played:R(t.mins_played),is_master:q(t.is_master,false),is_replay:q(t.is_replay,false),start_date:I(t.start_date),finish_date:I(t.finish_date),edition_id:R(t.edition_id),edition_type:null==t.edition_type||""===t.edition_type?null:String(t.edition_type),medium_id:R(t.medium_id),played_platform:R(t.played_platform),storefront_id:R(t.storefront_id),hours_finished:R(t.hours_finished),mins_finished:R(t.mins_finished),hours_mastered:R(t.hours_mastered),mins_mastered:R(t.mins_mastered),sync_sessions:q(t.sync_sessions,false)}}function U(t={}){return {range_start_date:I(t.range_start_date),range_end_date:I(t.range_end_date),status:R(t.status),note:String(t.note||""),hours:R(t.hours),minutes:R(t.minutes),start_date:I(t.start_date),finish_date:I(t.finish_date)}}function j(t={}){const e=function(t){var e,n,a,r,i;if(!t||"object"!=typeof t)return t;if(t.log||Array.isArray(t.playthroughs))return t;const s=A(t.status),o=D(s),l=I(t.dateStart||t.start_date),d=I(t.dateEnd||t.finish_date),c=E(t.platform);return {game_id:null!=(a=null!=(n=t.game_id)?n:null==(e=t.externalIds)?void 0:e.backloggd)?a:null,title:t.title,slug:t.slug||"",log:{game_liked:null!=(r=t.favorite)?r:t.game_liked,status:s,...o},playthroughs:[{title:(null==c?void 0:c.name)||"Log",platform:null!=(i=null==c?void 0:c.id)?i:null,rating:t.rating,review:t.review||"",start_date:l,finish_date:d}],dates:l||d?[{range_start_date:l,range_end_date:d||l,start_date:l,finish_date:d}]:[]}}(t),n=String(e.title||"").trim(),a=Array.isArray(e.playthroughs)?e.playthroughs.map(t=>H(t)):[H({})],r=a.length?a:[H({})];let i=Array.isArray(e.dates)?e.dates.map(t=>U(t)):[];if(!i.length){const t=r[0];(t.start_date||t.finish_date)&&(i=[U({range_start_date:t.start_date||t.finish_date,range_end_date:t.finish_date||t.start_date,start_date:t.start_date,finish_date:t.finish_date})]);}return {game_id:R(e.game_id),title:n,slug:String(e.slug||"").trim(),log:P(e.log&&"object"==typeof e.log?e.log:{}),playthroughs:r,dates:i}}function O({source:t,entries:e,exportedAt:n}){return {format:g,version:2,exportedAt:n||(new Date).toISOString(),source:{platform:String((null==t?void 0:t.platform)||"custom").trim()||"custom",...(null==t?void 0:t.label)?{label:String(t.label)}:{},...(null==t?void 0:t.url)?{url:String(t.url)}:{}},entries:(e||[]).map(t=>j(t)).filter(t=>t.title||null!=t.game_id)}}function V(t){return String((null==t?void 0:t.title)||"").trim()||(null!=(null==t?void 0:t.game_id)?`#${t.game_id}`:"")}function G(t){var e;return (null==(e=null==t?void 0:t.playthroughs)?void 0:e[0])||H({})}function z(){var t,e;const n=[document.querySelector('#profile-li .dropdown-menu a[href^="/u/"]'),document.querySelector('#profile-li a[href^="/u/"]'),document.querySelector('#mobile-user-nav a[href^="/u/"]'),document.querySelector('a.dropdown-item[href^="/u/"]'),document.querySelector('a.nav-link[href^="/u/"]'),document.querySelector('a[href^="/u/"][href$="/"]')];for(const r of n){const e=((null==(t=null==r?void 0:r.getAttribute)?void 0:t.call(r,"href"))||"").match(/^\/u\/([^/?#]+)/i);if((null==e?void 0:e[1])&&!["games","users","search"].includes(e[1].toLowerCase()))return decodeURIComponent(e[1])}const a=((null==(e=document.querySelector("#navbarDropdown"))?void 0:e.textContent)||"").replace(/\s+/g," ").trim().split(" ")[0];return a&&a.length>=2&&!/chevron|menu/i.test(a)?a:""}function W(){try{const e=t(l,[]);return Array.isArray(e)?e.map(Z).filter(Boolean).sort((t,e)=>String(e.at).localeCompare(String(t.at))):[]}catch(e){return []}}function J(t){n(l,t.slice(0,50));}function K(t){if(!t)return "—";if("string"==typeof t)return t.trim()||"—";const e=String(t.platform||"").trim(),n=String(t.label||"").trim();return e&&n&&n!==e?`${e} · ${n}`:e||n||"—"}function Y(){J([]);}function X(t,e){return e<=0?"success":t<=0?"failed":"partial"}function Q(){return `h_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function Z(t){if(!t||"object"!=typeof t)return null;const e=t,n="export"===e.kind?"export":"import"===e.kind?"import":null;if(!n)return null;const a=Array.isArray(e.games)?e.games.map(t=>{if(!t||"object"!=typeof t)return null;const e=t,n=String(e.title||"").trim();return n?{title:n,game_id:null!=e.game_id&&Number.isFinite(Number(e.game_id))?Number(e.game_id):null,slug:String(e.slug||""),ok:Boolean(e.ok),error:e.error?String(e.error):void 0}:null}).filter(Boolean):[],r=Number(e.okCount)||0,i=Number(e.failCount)||0,s="success"===e.status||"partial"===e.status||"failed"===e.status?e.status:X(r,i);return {id:String(e.id||Q()),kind:n,at:String(e.at||(new Date).toISOString()),filename:String(e.filename||"").trim()||"—",source:String(e.source||"").trim()||"—",formatVersion:null!=e.formatVersion&&Number.isFinite(Number(e.formatVersion))?Number(e.formatVersion):null,okCount:r,failCount:i,total:Number(e.total)||a.length||r+i,status:s,games:a,username:String(e.username||"")}}function tt(t){return String(t||"").toLowerCase().normalize("NFKD").replace(/[\u0300-\u036f]/g,"").replace(/&/g," and ").replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}function et(t,e){const n=tt(t),a=tt(e);if(!n||!a)return 0;if(n===a)return 100;if(a.startsWith(n)||n.startsWith(a))return 88;if(a.includes(n)||n.includes(a))return 72;const r=n.split(" "),i=new Set(a.split(" "));let s=0;for(const l of r)i.has(l)&&(s+=1);if(!r.length)return 0;const o=s/r.length;return o>=.8?65:o>=.5?40:0}let nt=null,at=0;function rt(){if(nt)return nt;try{const e=t(c,null);nt=e&&"object"==typeof e&&!Array.isArray(e)?e:{};}catch(e){nt={};}return nt}function it(){clearTimeout(at),at=setTimeout(()=>{at=0;try{ct(),ut(),n(c,rt());}catch(t){}},400);}function st(){clearTimeout(at),at=0;try{n(c,rt());}catch(t){}}function ot(t){return tt(t)}function lt(t){if(!(null==t?void 0:t.ts))return true;const e=Number(t.ttlMs)>0?Number(t.ttlMs):"miss"===t.kind?p:u;return !!e&&Date.now()-t.ts>e}function dt(t,e){const n=ot(t);if(!n)return;const a=Date.now(),r=e&&null!=e.id?"hit":"miss",i={ts:a,at:a,kind:r,query:String(t||"").trim()||n,match:"hit"===r?{id:Number(e.id),slug:String(e.slug||""),title:String(e.title||t).trim(),year:null!=e.year?String(e.year):"",score:Number.isFinite(e.score)?Number(e.score):void 0,url:e.url?String(e.url):""}:null,ttlMs:"miss"===r?p:u};rt()[n]=i,it();}function ct(){const t=rt();let e=0;for(const n of Object.keys(t))lt(t[n])&&(delete t[n],e+=1);return e}function ut(){const t=rt(),e=Math.floor(4194304),n=[];let a=0;for(const i of Object.keys(t)){const e=t[i],r=mt(i,e);a+=r,n.push({key:i,bytes:r,at:Number((null==e?void 0:e.at)||(null==e?void 0:e.ts))||0});}if(a<=e)return 0;n.sort((t,e)=>t.at-e.at);let r=0;for(const i of n){if(a<=e)break;delete t[i.key],a-=i.bytes,r+=1;}return r}function pt(){const t=rt(),e=Object.keys(t).length;nt={},clearTimeout(at),at=0;try{n(c,{});}catch(a){}return e}function mt(t,e){try{const n=JSON.stringify(e);if("undefined"!=typeof TextEncoder){const e=new TextEncoder;return e.encode(String(null!=t?t:"")).length+e.encode(null!=n?n:"").length}return String(null!=t?t:"").length+String(null!=n?n:"").length}catch(n){return 0}}function gt(t){const e=Math.max(0,Number(t)||0);return e<1024?`${Math.round(e)} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(2)} MB`}function ht(t,e){return e?Math.max(0,Math.min(100,t/e*100)):0}function bt(e,n=null){try{const a=t(e,n);if(null==a)return {bytes:0,count:0,raw:null};return {bytes:mt(e,a),count:Array.isArray(a)?a.length:a&&"object"==typeof a?Object.keys(a).length:1,raw:a}}catch(a){return {bytes:0,count:0,raw:null}}}function ft(){ct();const t=rt();let e=0,n=0,a=0,r=0,i=0;for(const[o,l]of Object.entries(t)){const t=mt(o,l),s=Number((null==l?void 0:l.at)||(null==l?void 0:l.ts))||0;s>i&&(i=s),"miss"===(null==l?void 0:l.kind)?(n+=t,r+=1):(e+=t,a+=1);}const s=bt(l,[]),c=bt(d,{}),u=bt(o,{}),p=s.bytes+c.bytes+u.bytes,m=e+n,g=m+p,h=5242880,b=Math.max(0,h-g);return {foundBytes:e,missBytes:n,foundCount:a,missCount:r,gamesCount:a+r,gamesBytes:m,historyBytes:s.bytes,historyCount:s.count,mapsBytes:c.bytes,settingsBytes:u.bytes,otherBytes:p,usedBytes:g,freeBytes:b,limitBytes:h,newestAt:i,buckets:[{key:"found",id:"found",label:"found",bytes:e,count:a},{key:"miss",id:"miss",label:"miss",bytes:n,count:r},{key:"history",id:"history",label:"history",bytes:s.bytes,count:s.count},{key:"maps",id:"maps",label:"maps",bytes:c.bytes,count:c.count},{key:"settings",id:"settings",label:"settings",bytes:u.bytes,count:u.count}]}}function yt(t,e){return n=function(t,e={}){const n=Math.max(0,Number(t)||0);if(n<=0)return 0;const a=Number.isFinite(e.minFactor)?e.minFactor:.7,r=Number.isFinite(e.maxFactor)?e.maxFactor:1.65,i=Math.max(0,r-a);let s=Math.round(n*(a+Math.random()*i));const o=Number.isFinite(e.pauseChance)?e.pauseChance:.12;if(Math.random()setTimeout(t,n));var n;}async function vt(t,e,n,a={}){const r=Math.max(0,Math.floor(Number(t)||0)),i=new Array(r);if(0===r)return i;let s=0;const o=Math.max(1,Math.min(Math.floor(Number(e)||1),r));return await Promise.all(Array.from({length:o},()=>async function(){for(var t;;){if(null==(t=a.shouldCancel)?void 0:t.call(a))return;const e=s;if(s+=1,e>=r)return;i[e]=await n(e);}}())),i}let _t=null;function St(){if(z())return true;if(document.querySelector('#profile-li, #add-a-game, #mobile-user-nav, a[href*="sign_out"], a[data-method="delete"][href*="sign_out"]'))return true;const t=Boolean(document.querySelector('a[href*="/users/sign_in"], a[href*="sign_in"]'));return Boolean(kt())&&!t}function kt(){var t;const e=null==(t=document.querySelector('meta[name="csrf-token"]'))?void 0:t.getAttribute("content");if(e)return e.trim();const n=document.querySelector('input[name="authenticity_token"]');return (null==n?void 0:n.value)?n.value.trim():""}function Ct(){if(null!=_t)return _t;const t=z(),e=function(){const t=document.querySelectorAll("[user_id]");for(const e of t){const t=wt(e.getAttribute("user_id"));if(null!=t)return t}return null}();if(null!=e)return $t(e,t);const n=function(t){if(!t||"undefined"==typeof sessionStorage)return null;try{return wt(sessionStorage.getItem(`bdt_uid:${t.toLowerCase()}`))}catch(e){return null}}(t);return null!=n?(_t=n,n):null}async function Mt(){const t=Ct();if(null!=t)return t;throw new Error(St()?"Could not find user_id on the page. Enter your Backloggd user id manually.":"Could not resolve Backloggd user id (are you logged in?)")}function wt(t){if(null==t||""===t)return null;const e=Number(String(t).trim());return !Number.isFinite(e)||e<=0||!Number.isInteger(e)?null:e}function $t(t,e){return _t=t,function(t,e){if(t&&"undefined"!=typeof sessionStorage)try{sessionStorage.setItem(`bdt_uid:${t.toLowerCase()}`,String(e));}catch(n){}}(e,t),t}function Lt(t){return new URL(t,`${"undefined"!=typeof location&&location.origin?location.origin:"https://www.backloggd.com"}/`).href}function xt(t){var e;const n=null==(e=N(t.platform))?void 0:e.name;if(n)return n;return String(t.title||"").trim()||"Log"}async function Tt(t,e={}){var n,a,r,i;const s=true===e.dryRun;if(!V(t)&&null==t.game_id)return {ok:false,error:"Missing title / game_id"};const o=null!=(r=null!=(a=t.game_id)?a:null==(n=e.resolved)?void 0:n.game_id)?r:null;if(null==o)return {ok:false,error:"game_id not resolved",skipped:true};const l=function(t,e){const n=function(t){const e={...t},n=String(e.status||"");if(null==e.is_play&&null==e.is_playing&&null==e.is_backlog&&null==e.is_wishlist)switch(e.is_play=false,e.is_playing=false,e.is_backlog=false,e.is_wishlist=false,n){case "playing":e.is_playing=true,e.is_play=true;break;case "backlog":e.is_backlog=true;break;case "wishlist":e.is_wishlist=true;break;case "completed":case "played":case "shelved":case "abandoned":case "retired":e.is_play=true;}return e}(t.log||{}),a=G(t),r=String(e.gameId),i=null!=e.overrideCoverId?e.overrideCoverId:n.override_cover_id,s={game_id:r,"playthroughs[0][id]":"-1","playthroughs[0][title]":xt(a),"playthroughs[0][rating]":null==a.rating?"":String(a.rating),"playthroughs[0][sync_sessions]":String(Boolean(a.sync_sessions)),"playthroughs[0][review]":a.review||"","playthroughs[0][review_spoilers]":String(Boolean(a.review_spoilers)),"playthroughs[0][platform]":null==a.platform?"":String(a.platform),"playthroughs[0][hours_played]":null==a.hours_played?"":String(a.hours_played),"playthroughs[0][mins_played]":null==a.mins_played?"":String(a.mins_played),"playthroughs[0][is_master]":String(Boolean(a.is_master)),"playthroughs[0][is_replay]":String(Boolean(a.is_replay)),"playthroughs[0][start_date]":a.start_date||"","playthroughs[0][finish_date]":a.finish_date||"","playthroughs[0][edition_id]":null==a.edition_id?"":String(a.edition_id),"playthroughs[0][edition_type]":null==a.edition_type?"":String(a.edition_type),"playthroughs[0][medium_id]":null==a.medium_id?"":String(a.medium_id),"playthroughs[0][played_platform]":null==a.played_platform?"":String(a.played_platform),"playthroughs[0][storefront_id]":null==a.storefront_id?"":String(a.storefront_id),"playthroughs[0][hours_finished]":null==a.hours_finished?"":String(a.hours_finished),"playthroughs[0][mins_finished]":null==a.mins_finished?"":String(a.mins_finished),"playthroughs[0][hours_mastered]":null==a.hours_mastered?"":String(a.hours_mastered),"playthroughs[0][mins_mastered]":null==a.mins_mastered?"":String(a.mins_mastered),"log[game_liked]":String(Boolean(n.game_liked)),"log[id]":null==n.id?"":String(n.id),"log[last_edited_at]":n.last_edited_at||"","log[override_cover_id]":null==i?"":String(i),"log[is_play]":String(Boolean(n.is_play)),"log[is_playing]":String(Boolean(n.is_playing)),"log[is_backlog]":String(Boolean(n.is_backlog)),"log[is_wishlist]":String(Boolean(n.is_wishlist)),"log[status]":n.status||"","log[total_hours]":null==n.total_hours?"":String(n.total_hours),"log[total_minutes]":null==n.total_minutes?"":String(n.total_minutes),"log[time_source]":null==n.time_source?"1":String(n.time_source),modal_type:"full"},o=function(t,e){const n=t.dates||[];if(n.length)return n;const a=e.start_date||"",r=e.finish_date||"";return a||r?[{range_start_date:a||r,range_end_date:r||a,status:null,note:"",hours:null,minutes:null,start_date:a,finish_date:r}]:[]}(t,a);return o.forEach((t,e)=>{const n=`dates[-1][${e}]`;s[`${n}[id]`]="-1",s[`${n}[range_start_date]`]=t.range_start_date||"",s[`${n}[range_end_date]`]=t.range_end_date||"",s[`${n}[edited]`]="true",s[`${n}[status]`]=null==t.status?"":String(t.status),s[`${n}[note]`]=t.note||"",s[`${n}[hours]`]=null==t.hours?"":String(t.hours),s[`${n}[minutes]`]=null==t.minutes?"":String(t.minutes),s[`${n}[start_date]`]=t.start_date||"",s[`${n}[finish_date]`]=t.finish_date||"";}),s}(t,{gameId:o});if(s)return {ok:true,dryRun:true,skipped:false};let d=e.userId;try{null==d&&(d=await Mt());}catch(h){return {ok:false,error:h instanceof Error?h.message:String(h)}}const c=e.csrfToken||kt();if(!c)return {ok:false,error:"CSRF token not found on page"};const u=Lt(`/api/user/${d}/log/${o}`),p=new URLSearchParams(l).toString(),m=t.slug||(null==(i=e.resolved)?void 0:i.slug)||"",g=Lt(m?`/games/${encodeURIComponent(m)}/`:"/");try{const t=await fetch(u,{method:"POST",credentials:"same-origin",headers:{Accept:"application/json, text/javascript, */*; q=0.01","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8","X-CSRF-Token":c,"X-Requested-With":"XMLHttpRequest"},body:p,referrer:g});if(429===t.status)return {ok:!1,error:"Rate limited (429)",status:429};if(!t.ok){const e=await async function(t){try{const n=await t.text();if(!n)return "";try{const t=JSON.parse(n);return "string"==typeof(null==t?void 0:t.error)?t.error:"string"==typeof(null==t?void 0:t.message)?t.message:n.slice(0,200)}catch(e){return n.slice(0,200)}}catch(e){return ""}}(t);return {ok:!1,error:e||`HTTP ${t.status}`,status:t.status}}return {ok:!0,status:t.status}}catch(h){return {ok:false,error:h instanceof Error?h.message:String(h)}}}function Ft(t){return new Promise((e,n)=>{const r={method:t.method||"GET",url:t.url,headers:t.headers||{},responseType:t.responseType||"json",timeout:t.timeout||2e4,onload(a){if(t.allow404&&404===a.status)e(null);else if(a.status>=200&&a.status<300){const n=t.responseType||"json";if("text"===n)e(null!=a.responseText&&""!==a.responseText?a.responseText:a.response);else if("json"===n){if(null!=a.response&&"object"==typeof a.response)return void e(a.response);const t=a.responseText;if("string"==typeof t&&t.trim())try{return void e(JSON.parse(t))}catch(r){}e(a.response);}else e(a.response);}else n(new Error(`HTTP ${a.status}`));},onerror:()=>n(new Error("Network error")),ontimeout:()=>n(new Error("Timeout"))};"boolean"==typeof t.anonymous&&(r.anonymous=t.anonymous),null!=t.data&&(r.data="string"==typeof t.data?t.data:JSON.stringify(t.data)),a(r);})}const Et=Object.freeze([{key:"played",path:"games/added/type:played"},{key:"playing",path:"games/added/type:playing"},{key:"backlog",path:"games/added/type:backlog"},{key:"wishlist",path:"games/added/type:wishlist"},{key:"shelved",path:"games/added/type:shelved"},{key:"abandoned",path:"games/added/type:abandoned"},{key:"retired",path:"games/added/type:retired"},{key:"games",path:"games"}]);async function Nt(t={}){const e=z();if(!e)throw new Error("Not logged in — cannot load library");const n=Math.max(1,Math.min(8,Math.floor(Number(t.concurrency)||4))),a=new Set,r=new Set,i=new Map;let s=0,o=0,l=false,d=null;const c=new Map,u=function(t){const e=Math.max(1,Math.floor(Number(t)||1));let n=0;const a=[];return async function(t){n>=e&&await new Promise(t=>{a.push(t);}),n+=1;try{return await t()}finally{n-=1;const t=a.shift();t&&t();}}}(n),p=(e,a,r)=>{var i;null==(i=t.onProgress)||i.call(t,{listIndex:e,listTotal:Et.length,page:a,list:r,pagesDone:o,concurrency:n,activeLists:[...c.values()]});},m=await vt(Et.length,n,async a=>{var r;if(null==(r=t.shouldCancel)?void 0:r.call(t))return null;const{key:i,path:s}=Et[a],l=new Set;try{return await async function(t){var e;const n=`/u/${encodeURIComponent(t.username)}/${t.path}`,a=[];let r=0,i=null;const s=async e=>{var a;if(null==(a=t.shouldCancel)?void 0:a.call(t))return null;try{return await t.limit(async()=>{var a,r,i;if(null==(a=t.shouldCancel)?void 0:a.call(t))return null;null==(r=t.onPageStart)||r.call(t,e);try{const t=`${n}?page=${e}`,a=function(t,e=1){const n=(new DOMParser).parseFromString(t,"text/html"),a=[],r=[],i=[],s=new Set,o=new Set,l=new Set,d=t=>{var e,n;const d=Number(t.getAttribute("game_id")),c=Number.isFinite(d)&&d>0?d:null;if(null==c)return;let u=t.closest('a[href*="/games/"]')||t.querySelector('a[href*="/games/"]');if(!u){const e=t.closest(".rating-hover, .game-cover-link, .cover-link, li, .col, .col-auto, article");u=(null==e?void 0:e.querySelector('a[href*="/games/"]'))||null;}const p=((null==(e=null==u?void 0:u.getAttribute)?void 0:e.call(u,"href"))||"").match(/\/games\/([^/?#]+)/i),m=(null==p?void 0:p[1])?decodeURIComponent(p[1]).toLowerCase():"",g=function(t){const e=String(t||"").trim().toLowerCase();return !!e&&(!e.includes(":")&&(!Ht.has(e)&&!(/^[a-z0-9]+(?:_[a-z0-9]+)+$/.test(e)&&!/-/.test(e))))}(m)?m:"";s.has(c)||(s.add(c),a.push(c)),g&&!o.has(g)&&(o.add(g),r.push(g));const h=g?`s:${g}`:`i:${c}`;if(l.has(h))return;l.add(h);const b=t.querySelector("img")||(null==(n=null==u?void 0:u.querySelector)?void 0:n.call(u,"img"))||null,f=String(t.getAttribute("aria-label")||t.getAttribute("title")||(null==b?void 0:b.getAttribute("alt"))||(null==u?void 0:u.getAttribute("title"))||(null==u?void 0:u.getAttribute("aria-label"))||(g?g.replace(/-/g," "):"")||`Game #${c}`).replace(/\s+/g," ").trim(),y=(null==b?void 0:b.getAttribute("src"))||(null==b?void 0:b.getAttribute("data-src"))||(null==b?void 0:b.getAttribute("data-lazy-src"))||null;i.push({gameId:c,slug:g,title:f,coverUrl:y?String(y):null});};n.querySelectorAll(".game-cover[game_id], [game_id].game-cover, .rating-hover .game-cover[game_id]").forEach(t=>d(t)),a.length||n.querySelectorAll("[game_id]").forEach(t=>d(t));const c=function(t,e){let n=e;for(const a of t.querySelectorAll('a[href*="page="]')){const t=(a.getAttribute("href")||"").match(/[?&]page=(\d+)/i);if(!t)continue;const e=Number(t[1]);Number.isFinite(e)&&e>n&&(n=e);}return n>e?n:null}(n,e),u=null!=c&&c>e||function(t,e){if(t.querySelector('a[rel="next"], .pagination a[rel="next"], .pagination .next:not(.disabled)'))return !0;for(const n of t.querySelectorAll('a[href*="page="]')){const t=n.getAttribute("href")||"",a=String(n.textContent||"").trim().toLowerCase();if(/^(next|›|»|→)$/i.test(a)||a.includes("next"))return !0;const r=t.match(/[?&]page=(\d+)/i);if(r&&Number(r[1])>e)return !0}return !1}(n,e);return {gameIds:a,slugs:r,games:i,hasNext:u,maxPage:c}}(await Dt(Lt(t)),e);return {page:e,sourcePath:t,parsed:a}}finally{null==(i=t.onPageDone)||i.call(t,e);}})}catch(r){return null}},o=e=>{const{page:n,sourcePath:s,parsed:o}=e;if(r+=1,!o.gameIds.length&&!o.slugs.length)return "empty";const l=o.gameIds.join(",")||o.slugs.join(",");if(l&&l===i)return "dup";i=l;for(const r of o.games)a.push({...r,sourceUrl:s,sourceList:t.listKey,sourcePage:n});return "ok"},l=await s(1);if(!l)throw new Error(`Library list failed: ${t.listKey}`);if("ok"!==o(l)||!l.parsed.hasNext)return {pageCount:r,games:a};const d=l.parsed.maxPage;if(null!=d&&d>1){const e=Math.min(d,200)-1;if(e>0){const n=await vt(e,t.concurrency,async t=>s(t+2),{shouldCancel:t.shouldCancel});for(const t of n){if(!t)continue;const e=o(t);if("empty"===e||"dup"===e)break}}return {pageCount:r,games:a}}let c=2;for(;c<=200&&!(null==(e=t.shouldCancel)?void 0:e.call(t));){const e=Math.min(t.concurrency,200-c+1),n=await vt(e,e,async t=>s(c+t),{shouldCancel:t.shouldCancel});let a=!1;for(const t of n){if(!t){a=!0;break}const e=o(t);if("empty"===e||"dup"===e){a=!0;break}if(!t.parsed.hasNext){a=!0;break}}if(a)break;c+=e,await yt(180,{minFactor:.7,maxFactor:1.5,pauseChance:.08,pauseMinMs:120,pauseMaxMs:500});}return {pageCount:r,games:a}}({username:e,listIndex:a,listKey:i,path:s,concurrency:n,limit:u,shouldCancel:t.shouldCancel,onPageStart(t){l.add(t);const e=[...l].sort((t,e)=>t-e);c.set(a,1===e.length?`${i} · p${e[0]}`:`${i} · p${e[0]}–${e[e.length-1]}`),p(a,t,i);},onPageDone(t){if(o+=1,l.delete(t),0===l.size)c.delete(a);else {const t=[...l].sort((t,e)=>t-e);c.set(a,1===t.length?`${i} · p${t[0]}`:`${i} · p${t[0]}–${t[t.length-1]}`);}p(a,t,i);}})}catch(d){return c.delete(a),{error:d instanceof Error?d.message:String(d),pageCount:0,games:[]}}},{shouldCancel:t.shouldCancel});for(const g of m)if(g)if(g.error)d=g.error;else {l=true,s+=g.pageCount;for(const t of g.games)null!=t.gameId&&a.add(t.gameId),t.slug&&r.add(t.slug),Rt(i,t);}if(!l&&d)throw new Error(d);return {username:e,gameIds:a,slugs:r,pageCount:s,games:[...i.values()].sort((t,e)=>t.title.localeCompare(e.title,void 0,{sensitivity:"base"}))}}function It(t,e,n){if(!n)return false;if(null!=t&&n.gameIds.has(Number(t)))return true;const a=String(e||"").trim().toLowerCase();return !(!a||!n.slugs.has(a))}function At(t,e){if(!t)return;null!=e.gameId&&Number.isFinite(Number(e.gameId))&&t.gameIds.add(Number(e.gameId));const n=String(e.slug||"").trim().toLowerCase();n&&t.slugs.add(n);}async function Bt(t){var e;const n=Number(t.gameId);if(!Number.isFinite(n)||n<=0)return {exists:false};const a=String(t.slug||"").trim(),r=String(t.username||z()||"").trim();if(r&&a)try{const t=await qt({gameId:n,slug:a,username:r});if(t.exists)return {exists:!0,logId:null!=(e=t.logId)?e:null}}catch(i){}if(a)try{const t=function(t,e){var n,a;const r=(new DOMParser).parseFromString(t,"text/html"),i=r.querySelector('input[name="log[id]"]')||r.querySelector("#log_id")||r.querySelector('[name="log[id]"]'),s=null!=(a=null==(n=null==i?void 0:i.getAttribute)?void 0:n.call(i,"value"))?a:null==i?void 0:i.value;if(null!=s&&""!==String(s).trim()){const t=Number(s);if(Number.isFinite(t)&&t>0)return {exists:!0,logId:t}}const o=r.querySelector("#logging-sidebar-section");if(o){if(o.querySelector([".played-btn-container.active",".playing-btn-container.active",".backlog-btn-container.active",".wishlist-btn-container.active",".btn-play.active",".btn-play.selected","[play_type].active","[play_type].selected","[play_type].filled"].join(", ")))return {exists:!0,logId:null};if(o.querySelector(".star-rating-game input.star-radio:checked, input.star-radio:checked"))return {exists:!0,logId:null};if(o.querySelector(".like-game-btn.active, .like-game-btn.liked"))return {exists:!0,logId:null}}if(null!=e){const t=r.querySelector(`.game-cover[game_id="${e}"], [game_id="${e}"].game-cover`);if(t){const e=Number(t.getAttribute("data-rating")),n=t.querySelector(".user-rating .stars-top, .stars-top"),a=((null==n?void 0:n.getAttribute("style"))||"").match(/width\s*:\s*([\d.]+)\s*%/i),r=a?Number(a[1]):0,i=t.classList.contains("user-rating")&&Number.isFinite(r)&&r>0;if(Number.isFinite(e)&&e>0||i)return {exists:!0,logId:null}}}if(r.querySelector('.star-rating-game input.star-radio:checked, #modal-rating input[name="rating_modal"]:checked'))return {exists:!0,logId:null};for(const l of r.querySelectorAll("a, button")){const t=String(l.textContent||"").replace(/\s+/g," ").trim().toLowerCase();if(/^(edit|update)\s+(your\s+)?(log|entry)\b/.test(t)||/^(изменить|редактир(овать)?)\s+(лог|запис)/.test(t)||/^your\s+log\b/.test(t)||/^мой\s+лог\b/.test(t))return {exists:!0,logId:null}}return {exists:!1}}(await Dt(Lt(`/games/${encodeURIComponent(a)}/`)),n);if(t.exists)return t}catch(i){}return {exists:false}}async function qt(t){const e=String(t.slug||"").trim().toLowerCase(),n=String(t.username||z()||"").trim(),a=Number(t.gameId),r=Number.isFinite(a)&&a>0?a:null;if(!n||!e)return {exists:false,logId:null,logCount:0,gameStatus:null,logs:[],logUrl:null};const i=Lt(`/u/${encodeURIComponent(n)}/logs/${encodeURIComponent(e)}/`),s=await Pt(i);if(!s.ok||function(t){const e=String(t||"").toLowerCase();return /page not found|couldn't find|could not find|404|doesn’t exist|doesn't exist|no logs yet/i.test(e)&&!/playthrough|log-editor|journal_entry|game-cover|log-option/i.test(e)}(s.html))return {exists:false,logId:null,logCount:0,gameStatus:null,logs:[],logUrl:i};const o=function(t,e=null){var n,a,r,i,s;const o=(new DOMParser).parseFromString(t,"text/html"),l=[],d=new Set,c=t=>{var e,n,a,r,i,s;const o=String(t.title||"").replace(/\s+/g," ").trim(),c=null!=t.id&&Number.isFinite(Number(t.id))&&Number(t.id)>0?Number(t.id):null,u=null!=c?`id:${c}`:`t:${o.toLowerCase()}`;d.has(u)||(o||null!=c)&&(d.add(u),l.push({id:c,title:o||(null!=c?`Log #${c}`:"Log"),rating:null!=(e=t.rating)?e:null,platform:null!=(n=t.platform)?n:null,badges:Array.isArray(t.badges)?t.badges:[],startDate:null!=(a=t.startDate)?a:null,finishDate:null!=(r=t.finishDate)?r:null,datesLabel:null!=(i=t.datesLabel)?i:null,gameId:null!=(s=t.gameId)?s:null}));},u=function(t){const e=t.querySelector("#log-status .current p, #log-status .col-3.current p");return String((null==e?void 0:e.textContent)||"").replace(/\s+/g," ").trim()||null}(o);if(o.querySelectorAll(".playthrough-view").forEach(t=>{c(function(t,e){var n,a,r,i;const s=t.querySelector("button.open-log[playthrough_id], button.delete-log[playthrough_id], [playthrough_id]")||null,o=Number(null==s?void 0:s.getAttribute("playthrough_id")),l=Number.isFinite(o)&&o>0?o:null,d=Number((null==s?void 0:s.getAttribute("game_id"))||(null==(n=t.querySelector("[game_id]"))?void 0:n.getAttribute("game_id"))),c=Number.isFinite(d)&&d>0?d:e,u=t.querySelector("h3.mb-1")||t.querySelector(":scope > .col-12 h3, :scope .col-12.my-auto > h3")||t.querySelector("h3"),p=String((null==u?void 0:u.textContent)||"Log").replace(/\s+/g," ").trim(),m=function(t){const e=t.querySelector(".stars-top");if(!e)return null;const n=(e.getAttribute("style")||"").match(/width\s*:\s*([\d.]+)\s*%/i);if(!n)return null;const a=Number(n[1]);return !Number.isFinite(a)||a<=0?null:Math.max(1,Math.min(10,Math.round(a/10)))}(t),g=String((null==(a=t.querySelector('a.secondary-link, a[href*="played_platform"]'))?void 0:a.textContent)||"").replace(/\s+/g," ").trim()||null,h=[];t.querySelectorAll("p.time-played").forEach(t=>{const e=String(t.textContent||"").replace(/\s+/g," ").trim();e&&(h.includes(e)||h.push(e));});const b=t.closest(".row.mb-4")||(null==(i=null==(r=t.parentElement)?void 0:r.closest)?void 0:i.call(r,".row"))||null,f=function(t){var e;if(!t)return {startDate:null,finishDate:null,datesLabel:null};const n=String(t.textContent||"").replace(/\s+/g," ").trim();if(/no play sessions logged/i.test(n)&&!t.querySelector(".playdate-view"))return {startDate:null,finishDate:null,datesLabel:"No play sessions logged"};let a=null,r=null;const i=String((null==(e=t.querySelector(".playdate-month h3"))?void 0:e.textContent)||"").replace(/\s+/g," ").trim();t.querySelectorAll(".playdate-view").forEach(t=>{var e;const n=[...t.querySelectorAll(".number-date h4")].map(t=>String(t.textContent||"").trim()).filter(t=>/^\d{1,2}$/.test(t)),s=String((null==(e=t.querySelector(".subtitle-text, p.subtitle-text"))?void 0:e.textContent)||"").replace(/\s+/g," ").trim().toLowerCase();if(!n.length)return;const o=n[n.length-1],l=i?`${i} ${o}`:o;/start/.test(s)?a=l:/finish|finished|complete/.test(s)?r=l:a?r||(r=l):a=l;});let s=null;return a&&r?s=`${a} → ${r}`:a?s=a:r?s=r:i&&(s=i),{startDate:a,finishDate:r,datesLabel:s}}((null==b?void 0:b.querySelector(".playthrough-dates"))||null);return {id:l,title:p,rating:m,platform:g,badges:h,startDate:f.startDate,finishDate:f.finishDate,datesLabel:f.datesLabel,gameId:c}}(t,e));}),l.length||o.querySelectorAll("button.open-log[playthrough_id], button.delete-log[playthrough_id]").forEach(t=>{const n=Number(t.getAttribute("game_id"));c({id:Number(t.getAttribute("playthrough_id")),title:"Log",gameId:Number.isFinite(n)&&n>0?n:e});}),l.length||o.querySelectorAll("#playthrough-container [playthrough_id], #playthrough-container button[playthrough_id], button.btn-nav[playthrough_id]").forEach(t=>{const n=t.getAttribute("playthrough_id"),a=t.querySelector(".playthrough-option-title");c({id:Number(n),title:(null==a?void 0:a.textContent)||t.textContent||"Log",gameId:e});}),l.length||o.querySelectorAll("#time-played-entries-container .time-entry-row[playthrough_id], #time-played-entries-container [playthrough_id]").forEach(t=>{const n=t.getAttribute("playthrough_id"),a=t.querySelector(".playthrough-title, .playthrough-option-title");c({id:Number(n),title:(null==a?void 0:a.textContent)||"Log",gameId:e});}),!l.length){const t=new Map;o.querySelectorAll('input[name^="playthroughs["]').forEach(e=>{var n,a;const r=(e.getAttribute("name")||"").match(/^playthroughs\[(\d+|-\d+)\]\[(id|title)\]$/i);if(!r)return;const i=r[1],s=r[2].toLowerCase(),o=t.get(i)||{id:null,title:""},l=String(null!=(a=null!=(n=e.getAttribute("value"))?n:e.value)?a:"").trim();if("id"===s){const t=Number(l);o.id=Number.isFinite(t)&&t>0?t:null;}else o.title=l;t.set(i,o);});for(const n of t.values())(null!=n.id||n.title)&&c({id:n.id,title:n.title||"Log",gameId:e});}let p=null;const m=o.querySelector('input[name="log[id]"]')||o.querySelector("#log_id")||o.querySelector('[name="log[id]"]')||o.querySelector("input#log_id"),g=null!=(a=null==(n=null==m?void 0:m.getAttribute)?void 0:n.call(m,"value"))?a:null==m?void 0:m.value;if(null!=g&&""!==String(g).trim()){const t=Number(g);Number.isFinite(t)&&t>0&&(p=t);}const h=o.querySelector('#current_playthrough, input[name="current_playthrough"]'),b=null!=(i=null==(r=null==h?void 0:h.getAttribute)?void 0:r.call(h,"value"))?i:null==h?void 0:h.value,f=Number(b);0===l.length&&Number.isFinite(f)&&f>0&&c({id:f,title:(null==(s=o.querySelector("#log-title-field"))?void 0:s.value)||"Log",gameId:e});const y=l.filter(t=>null!=t.id),v=y.length>0||null!=p,_=Math.max(y.length,v?1:0);return v&&0===y.length&&l.push({id:p,title:"Log",rating:null,platform:null,badges:[],startDate:null,finishDate:null,datesLabel:null,gameId:e}),{exists:v,logId:p,logCount:_,gameStatus:u,logs:v?y.length?y:l:y}}(s.html,r);return {exists:o.exists,logId:o.logId,logCount:o.logCount,gameStatus:o.gameStatus,logs:o.logs,logUrl:i}}function Rt(t,e){var n;const a=String(e.slug||"").trim().toLowerCase(),r=null!=e.gameId&&Number.isFinite(Number(e.gameId))?Number(e.gameId):null;if(!a&&null==r)return;let i,s=null;if(a&&t.has(`s:${a}`))s=`s:${a}`,i=t.get(s);else if(null!=r)for(const[o,l]of t)if(l.gameId===r){s=o,i=l;break}i&&s?(a&&s!==`s:${a}`&&(t.delete(s),s=`s:${a}`,t.set(s,i)),null!=r&&null==i.gameId&&(i.gameId=r),a&&!i.slug&&(i.slug=a),!e.title||i.title&&i.title!==i.slug||(i.title=e.title),e.coverUrl&&!i.coverUrl&&(i.coverUrl=e.coverUrl),!i.sourceUrl&&e.sourceUrl&&(i.sourceUrl=e.sourceUrl),!i.sourceList&&e.sourceList&&(i.sourceList=e.sourceList),null==i.sourcePage&&null!=e.sourcePage&&(i.sourcePage=e.sourcePage)):t.set(a?`s:${a}`:`i:${r}`,{gameId:r,slug:a,title:e.title||a||(null!=r?`Game #${r}`:""),coverUrl:e.coverUrl||null,sourceUrl:e.sourceUrl||null,sourceList:e.sourceList||null,sourcePage:null!=(n=e.sourcePage)?n:null});}async function Dt(t){const e=await Pt(t);if(!e.ok)throw new Error(`Library HTTP ${e.status}`);return e.html}async function Pt(t){try{const e=await fetch(t,{method:"GET",credentials:"same-origin",headers:{Accept:"text/html"},redirect:"follow"}),n=await e.text();return {ok:e.ok,status:e.status,html:n}}catch(e){try{const e=await Ft({url:t,method:"GET",responseType:"text",headers:{Accept:"text/html"},timeout:25e3});if("string"==typeof e&&e)return {ok:!0,status:200,html:e}}catch(n){}throw e instanceof Error?e:new Error(String(e))}}const Ht=new Set(["added","lib","games","search","popular","title","release","shuffle","rating","trending","time","last_played","last-played","user-rating","user_rating","avg-finish-time","avg-play-time","avg_finish_time","avg_play_time"]);async function Ut(t){var e;const n=String(t||"").trim();if(!n)return {suggestions:[],best:null};const a=Lt(`/autocomplete?query=${encodeURIComponent(n)}`),r=await async function(t){try{const e=await fetch(t,{method:"GET",credentials:"same-origin",headers:{Accept:"application/json, text/javascript, */*; q=0.01","X-Requested-With":"XMLHttpRequest"}});if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}catch(e){return Ft({url:t,method:"GET",responseType:"json",headers:{Accept:"application/json, text/javascript, */*; q=0.01","X-Requested-With":"XMLHttpRequest"},timeout:15e3})}}(a),i=(Array.isArray(null==r?void 0:r.suggestions)?r.suggestions:[]).map(t=>{const e=(null==t?void 0:t.data)||{},a=Number(e.id),r=String(e.title||(null==t?void 0:t.value)||"").trim(),i=String(e.slug||"").trim();return Number.isFinite(a)&&r?{id:a,slug:i,title:r,year:null!=e.year?String(e.year):"",score:et(n,r),url:i?Lt(`/games/${encodeURIComponent(i)}/`):""}:null}).filter(Boolean).sort((t,e)=>e.score-t.score||t.title.localeCompare(e.title)),s=i.find(t=>t.score>=72)||(100===(null==(e=i[0])?void 0:e.score)?i[0]:null);return {suggestions:i,best:s||null}}function jt(t,e={}){var n,a,r,i;const s=(null==t?void 0:t.entries)||[],o=new Set;let l=0,d=0,c=0,u=0,p=0;const m={};for(const S of s){const t=V(S).toLowerCase();t&&o.add(t);const e=G(S);null!=e.rating&&(l+=1),(null==(n=S.log)?void 0:n.game_liked)&&(d+=1),(e.start_date||e.finish_date||(S.dates||[]).some(t=>t.range_start_date||t.range_end_date))&&(c+=1),e.review&&(u+=1),null!=S.game_id&&(p+=1);const r=(null==(a=S.log)?void 0:a.status)||"none";m[r]=(m[r]||0)+1;}const g=s.length,h=o.size,b=null!=e.originalTotal?Number(e.originalTotal):g,f=null!=e.duplicatesRemoved?Number(e.duplicatesRemoved):Math.max(0,b-h),y=null!=e.foundCount?e.foundCount:p,v=null!=e.notFoundCount?e.notFoundCount:Math.max(0,g-y),_=null!=e.existingCount?e.existingCount:0;return {version:Number(t.version)||0,platform:String((null==(r=t.source)?void 0:r.platform)||"custom"),label:String((null==(i=t.source)?void 0:i.label)||""),exportedAt:String(t.exportedAt||""),total:g,originalTotal:b,uniqueTitles:h,duplicates:f,withRating:l,favorites:d,withDates:c,withReview:u,withGameId:p,foundCount:y,notFoundCount:v,existingCount:_,byStatus:m}}function Ot(t,e="—"){return t&&"none"!==t?b[t]||t:e}const Vt={en:{menuOpen:"Backloggd Data Transfer",panelTitle:"Data Transfer",panelSubtitle:"Import transfer file → Backloggd",close:"Close",tabImport:"Import",tabExport:"Export",tabCleanup:"Cleanup",tabHistory:"History",tabCache:"Cache",tabSettings:"Settings",tabAbout:"About",navButton:"Transfer",navButtonTitle:"Backloggd Data Transfer",importHint:"Choose a format, pick a file, then Read — we match titles on Backloggd and show a table before import.",importStepFile:"File",importStepMap:"Map",importStepReview:"Review",importStepImport:"Import",importStepFileLead:"Choose a format and transfer file, then continue to matching.",importStepMapLead:"We guessed the columns — adjust any mapping before matching games.",importStepReviewLead:"Check matches, pick what to import, then start the import.",importStepReadingTitle:"Reading file",importStepReadingLead:"Loading your library and matching titles on Backloggd…",importStepImportingTitle:"Importing",importStepImportingLead:"Writing {count} selected entries to Backloggd…",importAnalyzeContinue:"Read →",importAnalyzeMap:"Map columns →",importCancelRead:"Cancel",importReadCancelled:"Reading cancelled. Your file is still selected.",importBack:"Back",importBackReview:"Back to review",importRestart:"New import",importFormatLabel:"Import format",importFormatJson:"Transfer JSON",importFormatCsv:"CSV",importFormatJsonHint:"Unified backloggd-transfer format · ready to import",importFormatCsvHint:"Spreadsheet export · map columns, then import",importFormatJsonBadge:"Ready",importFormatCsvBadge:"Ready",importFormatJsonExt:".json",importFormatCsvExt:".csv",importCsvStub:"CSV import is not implemented yet. Switch to Transfer JSON for now.",importDropTitle:"Drop a file here or browse",importDropBrowse:"Browse",importDropJson:"This format expects a .json file.",importDropCsv:"This format expects a .csv file.",importDropAcceptJson:"Accepts .json",importDropAcceptCsv:"Accepts .csv",importDropSelected:"Selected",importDropClear:"Clear",importAnalyze:"Read",importAnalyzedTitle:"Read complete",importAnalyzed:"Matched {count}: {found} found, {missing} missing",importAnalyzedWithCache:"Matched {count}: {found} found, {missing} missing ({cached} from cache)",importAnalyzedWithDedupe:"Matched {count}: {found} found, {missing} missing ({cached} from cache), removed {removed} duplicates",importInvalidTitle:"Invalid file",importInvalid:"{error}",importStart:"Import",importStartSelected:"Import ({count})",importDownloadExample:"Download example",importExampleTitle:"Example downloaded",importExampleDownloaded:"Saved as {filename}",importNeedFileTitle:"No file selected",importNeedFile:"Pick a transfer file first.",importNeedAnalyzeTitle:"Not ready",importNeedAnalyze:"Read the file before importing.",importNeedSelectionTitle:"Nothing selected",importNeedSelection:"Select at least one entry to import.",importProgress:"Importing {index}/{total}: {title}",importProgressParallel:"Importing {current}/{total} · {active} in parallel",importDoneTitle:"Import finished",importFailedTitle:"Import failed",importPartialTitle:"Import finished with errors",importDone:"{ok} ok, {fail} failed",importDoneWithSkip:"{ok} ok, {fail} failed, {skip} skipped",importElapsed:"{time}",importElapsedLabel:"Took {time}",importDurationSec:"{seconds}s",importDurationSecFrac:"{seconds}s",importDurationMs:"{minutes}m {seconds}s",importDurationHms:"{hours}h {minutes}m {seconds}s",importLogOk:"Imported",importLogFail:"Error: {error}",importLogFailGeneric:"Error",importLogSkip:"Skipped",importLogSkipDetail:"Skipped — {reason}",importLogSkipExisting:"already in library",importLogNowLabel:"Now importing",importLogWaiting:"Preparing…",importLogNowHint:"{count} games queued",importLogWriting:"Writing {index} of {total}",importLogWritingParallel:"Writing {current}/{total} · {active} in parallel",importLogWritingHintParallel:"{left} left in queue",importLogFinished:"Import complete",importLogStatOk:"ok",importLogStatFail:"failed",importLogStatSkip:"skipped",importLogStatLeft:"left",importMatchBlockedHint:"Not found during read — cannot import",importNeedResolvableTitle:"Nothing to import",importNeedResolvable:"Selected games have no Backloggd match. Unmatched rows are skipped automatically.",importErrorsTitle:"Import issues",importIssueError:"#{index} {title} — {error}",importNeedLoginTitle:"Sign in required",importNeedLoginBody:"Log in to Backloggd to import games. Open this page while signed in, then try again.",importNeedCsrfBody:"CSRF token was not found on the page. Refresh Backloggd and try again.",importNeedUserIdTitle:"User id required",importNeedUserIdBody:"Could not find your Backloggd user id on this page. Enter it below to continue import.",importUserIdLabel:"Backloggd user id",importUserIdPlaceholder:"e.g. 295669",importUserIdHint:"Look for an element with a user_id attribute on the page, or check a network request to /api/user/{id}/…",importUserIdContinue:"Continue import",importUserIdInvalid:"Enter a positive numeric user id.",importSignIn:"Sign in",importLibraryFailedTitle:"Library warning",importLibraryFailed:"Could not load library: {error}",importReadFailedTitle:"Read failed",importReadErrorsCopied:"Issue list copied to clipboard.",importReadErrorsCopyFail:"Clipboard access failed.",toastTitleSuccess:"Success",toastTitleWarning:"Attention",toastTitleError:"Error",toastTitleInfo:"Notice",toastCopiedTitle:"Copied",toastCopyFailTitle:"Copy failed",toastFileTypeTitle:"Wrong file type",toastCsvSoonTitle:"Coming soon",importSummaryTitle:"File summary",importStatVersion:"Format",importStatSource:"Source",importStatExported:"Exported",importStatTotal:"Entries",importStatUnique:"Unique",importStatOriginal:"In file",importStatDuplicates:"Duplicates removed",importStatExisting:"Already logged",importStatFound:"Found",importStatNotFound:"Missing",importStatMatchRate:"Matched",importStatMatchGroup:"Match overview",importStatDetails:"File details",importStatRated:"Rated",importStatFavorites:"Favorites",importStatDates:"With dates",importStatReviews:"Reviews",importStatGameId:"Preset IDs",importStatByStatus:"By status",importStatNoStatus:"No status",importLibraryProgress:"Loading your Backloggd library…",importLibraryProgressDetail:"Library list {list}/{total}, page {page}",importExistingToggle:"Import games I already have",importMatchProgress:"Matching {current}/{total}: {title}",importMatchProgressParallel:"Matching {current}/{total} · {active} in parallel",importMatchTableTitle:"Match results",importMatchSelectAll:"Select all",importMatchSelectRow:"Import {title}",importMatchSelected:"Selected {selected} of {total}",importMatchShown:"Showing {shown} of {total}",importMatchFiltersLabel:"Table filters",importMatchSearchPlaceholder:"Search by title…",importMatchFilterAll:"All",importMatchFilterExisting:"Your log",importMatchFilterStatus:"Match",importMatchFilterSource:"Source",importMatchFilterSelected:"Selection",importMatchFilterSelectedOn:"Selected",importMatchFilterSelectedOff:"Not selected",importMatchColFileTitle:"File title",importMatchColStatus:"Status",importMatchColStart:"Start",importMatchColEnd:"End",importMatchColRating:"Rating",importMatchColPlatform:"Platform",importMatchColResult:"Match",importMatchColSource:"Source",importMatchColExisting:"Your log",importMatchColSiteTitle:"Backloggd",importMatchColGameId:"game_id",importMatchColYear:"Year",importMatchFound:"Found",importMatchPreset:"Preset ID",importMatchNotFound:"Not found",importMatchError:"Error",importMatchCached:"Cache",importMatchLive:"Live",importMatchExistingYes:"Yes",importMatchExistingNo:"No",importMatchManualIdPlaceholder:"ID or /games/slug/",importMatchManualIdHint:"Enter a Backloggd game_id or paste a /games/… URL, then press Enter",importMatchManualIdAria:"Set Backloggd id for {title}",importMatchManualIdLoading:"Looking up…",importMatchManualIdMissingRow:"Row not found",importMatchManualIdOk:"Linked {title} → #{id}",importMatchManualIdOkTitle:"Game id set",importDebugLibraryTitle:"Indexed library",importDebugLibraryCount:"{count} games · {pages} pages · @{user}",importDebugLibraryLead:"Games scraped from your Backloggd profile lists during Read (used to mark “Your log”).",importDebugLibraryEmpty:"Library index is empty.",importDebugLibraryColTitle:"Title",importDebugLibraryColId:"game_id",importDebugLibraryColSlug:"slug",importDebugLibraryColSource:"Source page",importReadErrorsTitle:"Read issues",importReadErrorsCopy:"Copy",importReadIssueNotFound:"#{index} {title} — not found on Backloggd",importReadIssueError:"#{index} {title} — {error}",importReadIssueDuplicate:"{title} — {count}× in file, kept #{kept}, dropped {dropped}",aboutEyebrow:"About",aboutBody:"Backloggd has no native import/export. Other platforms emit a unified transfer JSON; this userscript imports that file on Backloggd. Later: export from Backloggd itself.",aboutPointImport:"Match titles on Backloggd, review results, then write selected logs.",aboutPointFormat:"Uses the shared backloggd-transfer JSON format (v2).",aboutPointExport:"Cleanup finds multi-log games; full library export is planned next.",aboutFormat:"Transfer format",aboutRepo:"Repository",aboutIssues:"Issues",aboutAuthorLabel:"Author",aboutAuthorGithub:"GitHub",aboutAuthorBackloggd:"Backloggd",aboutAuthorProfile:"Profile",settingsTitle:"Settings",settingsLead:"General preferences for matching, import pacing, and diagnostics.",settingsLocale:"Language",settingsLocaleAuto:"Auto (browser)",settingsLocaleHint:"UI language for this panel.",settingsImportDelay:"Import delay",settingsImportDelayHint:"Pause after each log write (per parallel worker). Lower is faster; raise if you hit rate limits.",settingsMs:"ms",settingsMatchConcurrency:"Parallel requests",settingsMatchConcurrencyHint:"How many Backloggd requests run at once (library, matching, cleanup, and log import).",settingsMatchConcurrencyRange:"{min}–{max}",settingsDebugMode:"Debug mode",settingsDebugModeHint:"On Review, show the indexed library scraped from your profile.",settingsSaved:"Settings saved.",settingsSavedTitle:"Settings",exportSoonTitle:"Coming soon",exportSoonBody:"Export from Backloggd is not implemented yet.",exportLockedTitle:"Export",exportLockedLead:"Download your Backloggd library as a transfer JSON file. This tab will unlock in a future update.",exportLockedBadge:"Soon",csvMapTitle:"Column mapping",csvMapLead:"Auto-matched fields are marked. Change any select if a column was guessed wrong.",csvMapFileStat:"{file}",csvMapRowsStat:"{count} rows",csvMapMappedStat:"{mapped}/{total} fields",csvMapAutoLabel:"Auto-detect",csvMapAutoOk:"Required title column is mapped. Review the rest, then continue.",csvMapAutoNeedTitle:"Map a Title column to continue.",csvMapColumn:"CSV column",csvMapSkip:"— skip —",csvMapMapped:"Mapped",csvMapRequired:"Required",csvMapOptional:"Optional",csvMapNoSamples:"No sample values",csvMapContinue:"Match games →",csvMapReadyTitle:"CSV loaded",csvMapReady:"Parsed {count} rows. Confirm column mapping.",csvMapInvalidTitle:"Mapping incomplete",csvEmptyError:"CSV has no headers or data rows.",csvFieldTitle:"Title",csvFieldStatus:"Status",csvFieldRating:"Rating",csvFieldStart:"Start date",csvFieldFinish:"Finish date",csvFieldReview:"Review",csvFieldPlatform:"Platform",csvFieldFavorite:"Favorite",csvFieldHours:"Hours played",csvFieldGameId:"Backloggd game id",csvFieldSlug:"Slug",csvValueStatusTitle:"Status value mapping",csvValueStatusLead:"These status labels are not Backloggd keys. Choose how each unique value should be imported.",csvValueRatingTitle:"Rating value mapping",csvValueRatingLead:"These ratings are not Backloggd 1–10 scores. Map text labels (or other formats) to half-star scores.",csvValuePlatformTitle:"Platform value mapping",csvValuePlatformLead:"These platform labels are not Backloggd platforms. Map them to the site list (e.g. PC → Windows PC).",csvValueColSource:"In file",csvValueColCount:"Rows",csvValueColTarget:"Import as",csvValueColPreview:"Result",csvValueSkip:"— skip —",csvValueNative:"Already OK",csvValueNoRating:"No rating",csvValueAuto:"Auto",csvValueManual:"Manual",csvValueManualStat:"{count} manual",csvValueReset:"Reset manual",csvValueResetHint:"Clear saved manual mappings in this block and restore auto suggestions",csvValueUniqueStat:"{count} unique",csvValueUnmappedStat:"{count} unmapped",csvValueAllMapped:"All mapped",cacheTitle:"Game cache",cacheLead:"Resolved Backloggd titles are stored locally so the next Read skips duplicate network lookups.",cacheClearGames:"Clear game cache",cacheClearAll:"Clear all cache",cacheClearMisses:"Clear not-found",cacheClearGamesConfirm:"Clear all cached game matches?",cacheClearAllConfirm:"Clear game cache, transfer history, and CSV value maps? Settings are kept.",cacheCleared:"Removed {count} cached games",cacheAllCleared:"Cleared {games} games and {history} history entries (CSV maps reset)",cacheMissesCleared:"Removed {count} not-found entries",cacheMeterLabel:"Storage budget",cacheBarUsed:"{used} / {limit}",cacheBarPct:"{pct}%",cacheBarPctLabel:"full",cacheBarPctTitle:"Cache is {pct}% full",cacheTabBadge:"{pct}%",cacheBarAria:"Used {used} ({pct}%), free {free}",cacheBarFound:"Matched games",cacheBarMiss:"Not found",cacheBarHistory:"History",cacheBarMaps:"CSV value maps",cacheBarSettings:"Settings",cacheBarFree:"Free",cacheBarLegend:"{count} · {size}",cacheBarHint:"Soft limit ~5 MB. Oldest game lookups are evicted first. History and settings are listed for clarity.",cacheStatGames:"Cached games",cacheStatFound:"Matched",cacheStatMiss:"Not found",cacheStatUpdated:"Last activity",cacheStatUpdatedHint:"Most recent cache touch",cacheListTitle:"Recent lookups",cacheListMeta:"Showing {shown} of {total}",cacheEmptyTitle:"Cache is empty",cacheEmptyLead:"Run a Read/match step to populate title → game_id lookups.",cacheColQuery:"Query",cacheColKind:"Type",cacheColMatch:"Matched as",cacheColId:"game_id",cacheColWhen:"Updated",cacheColSize:"Size",cacheKindHit:"Match",cacheKindMiss:"Miss",historyTitle:"Transfer history",historyLead:"Recent imports and exports kept in this browser profile.",historyClear:"Clear all",historyClearConfirm:"Clear the entire transfer history?",historyFilterLabel:"Filter history",historyFilterAll:"All",historyFilterImport:"Imports",historyFilterExport:"Exports",historyEmptyTitle:"No transfers yet",historyEmptyBody:"Completed imports and exports will show up here with file names, dates, and game results.",historyEmptyFilteredTitle:"Nothing in this filter",historyEmptyFilteredBody:"Try another filter or run a transfer first.",historyKindImport:"Import",historyKindExport:"Export",historyStatusSuccess:"Success",historyStatusPartial:"Partial",historyStatusFailed:"Failed",historyCounts:"{ok} ok · {fail} failed · {total} total",historyMoreGames:" +{count} more",historyFactWhen:"When",historyFactSource:"Source",historyFactVersion:"Format",historyFactUser:"Account",historyGamesTitle:"Games ({count})",historyNoGames:"No game details were saved for this session.",historyRemove:"Remove",historyJustNow:"Just now",historyMinutesAgo:"{count}m ago",historyHoursAgo:"{count}h ago",historyDaysAgo:"{count}d ago",cleanupTitle:"Multi-log cleanup",cleanupLead:"Find games where you have more than one log — open them on Backloggd and tidy duplicates or extras.",cleanupScan:"Scan library",cleanupRescan:"Scan again",cleanupCancel:"Cancel",cleanupRetry:"Try again",cleanupNeedLoginTitle:"Sign in required",cleanupNeedLoginBody:"Log into Backloggd in this browser so we can read your library and log pages.",cleanupNeedLoginCta:"Sign in",cleanupIdleTitle:"Scan for multi-log games",cleanupIdleBody:"After imports (or intentional replays) some games end up with several logs. This scan lists only those with 2+ logs.",cleanupIdleStep1:"Loads your profile shelves",cleanupIdleStep2:"Checks each game’s log page",cleanupIdleStep3:"Opens matches so you can clean them up",cleanupScanningLibrary:"Loading your library…",cleanupScanningLibraryParallel:"Library · {done} pages · {active} in parallel",cleanupScanningShelf:"Shelf “{list}”, page {page}",cleanupScanningShelfMeta:"Shelf {index}/{total}",cleanupScanningGame:"Checking {index}/{total}: {title}",cleanupScanningGameParallel:"Checking {current}/{total} · {active} in parallel",cleanupScanningGameMeta:"{found} multi-log games so far",cleanupErrorTitle:"Scan failed",cleanupErrorBody:"Could not finish the multi-log scan. Try again in a moment.",cleanupCancelled:"Scan cancelled.",cleanupEmptyTitle:"No multi-log games",cleanupEmptyBody:"Checked {scanned} games — each has at most one log.",cleanupDoneFound:"Found {count} games with multiple logs",cleanupDoneNone:"No multi-log games in {scanned} checked titles",cleanupStatMulti:"with multiple logs",cleanupStatScanned:"{count} checked",cleanupStatHidden:"{count} hidden",cleanupStatErrors:"{count} probe errors",cleanupSearchPlaceholder:"Filter by title or log…",cleanupSortLabel:"Sort",cleanupSortCount:"By count",cleanupSortTitle:"A–Z",cleanupFilteredTitle:"Nothing matches",cleanupFilteredBody:"Try another search, or show games you hid.",cleanupUnhideAll:"Show hidden",cleanupOpenLogs:"Open on site",cleanupHide:"Hide",cleanupHiddenToast:"Hidden from this list until you rescan or show hidden.",cleanupLogCount:"{count} logs",cleanupLogCountTitle:"{count} logs on this game",cleanupMoreLogs:"+{count}",cleanupBadgeTitle:"{count} multi-log games",cleanupExpand:"Show logs",cleanupCollapse:"Hide logs",cleanupGameStatus:"Game status: {status}",cleanupDrawerTitle:"{count} logs",cleanupDrawerHint:"Review each log, then tidy extras on the site if needed.",cleanupLogRating:"{rating}/10",cleanupLogNoMeta:"No extra details on this page"},ru:{menuOpen:"Backloggd Data Transfer",panelTitle:"Перенос данных",panelSubtitle:"Импорт transfer-файла → Backloggd",close:"Закрыть",tabImport:"Импорт",tabExport:"Экспорт",tabCleanup:"Чистка",tabHistory:"История",tabCache:"Кеш",tabSettings:"Настройки",tabAbout:"О скрипте",navButton:"Transfer",navButtonTitle:"Backloggd Data Transfer",importHint:"Выберите формат и файл, нажмите «Читать» — сопоставим игры с Backloggd и покажем таблицу, затем «Импорт».",importStepFile:"Файл",importStepMap:"Поля",importStepReview:"Обзор",importStepImport:"Импорт",importStepFileLead:"Выберите формат и transfer-файл, затем перейдите к сопоставлению.",importStepMapLead:"Мы угадали колонки — поправьте сопоставление перед поиском игр.",importStepReviewLead:"Проверьте совпадения, отметьте записи и запустите импорт.",importStepReadingTitle:"Чтение файла",importStepReadingLead:"Загружаем библиотеку и сопоставляем названия с Backloggd…",importStepImportingTitle:"Импорт",importStepImportingLead:"Записываем выбранные записи ({count}) в Backloggd…",importAnalyzeContinue:"Читать →",importAnalyzeMap:"Сопоставить →",importCancelRead:"Отмена",importReadCancelled:"Чтение отменено. Файл остаётся выбранным.",importBack:"Назад",importBackReview:"К обзору",importRestart:"Новый импорт",importFormatLabel:"Формат импорта",importFormatJson:"Transfer JSON",importFormatCsv:"CSV",importFormatJsonHint:"Единый формат backloggd-transfer · готов к импорту",importFormatCsvHint:"Табличный экспорт · сопоставление колонок и импорт",importFormatJsonBadge:"Готово",importFormatCsvBadge:"Готово",importFormatJsonExt:".json",importFormatCsvExt:".csv",importCsvStub:"Импорт CSV пока не реализован. Переключитесь на Transfer JSON.",importDropTitle:"Перетащите файл сюда или выберите",importDropBrowse:"Выбрать",importDropJson:"Для этого формата нужен файл .json.",importDropCsv:"Для этого формата нужен файл .csv.",importDropAcceptJson:"Принимает .json",importDropAcceptCsv:"Принимает .csv",importDropSelected:"Выбран",importDropClear:"Очистить",importAnalyze:"Читать",importAnalyzedTitle:"Чтение завершено",importAnalyzed:"Сопоставлено {count}: найдено {found}, не найдено {missing}",importAnalyzedWithCache:"Сопоставлено {count}: найдено {found}, не найдено {missing} (из кеша: {cached})",importAnalyzedWithDedupe:"Сопоставлено {count}: найдено {found}, не найдено {missing} (из кеша: {cached}), убрано дублей: {removed}",importInvalidTitle:"Некорректный файл",importInvalid:"{error}",importStart:"Импорт",importStartSelected:"Импорт ({count})",importDownloadExample:"Скачать пример",importExampleTitle:"Пример скачан",importExampleDownloaded:"Сохранён как {filename}",importNeedFileTitle:"Файл не выбран",importNeedFile:"Сначала выберите transfer-файл.",importNeedAnalyzeTitle:"Ещё рано",importNeedAnalyze:"Сначала нажмите «Читать».",importNeedSelectionTitle:"Ничего не выбрано",importNeedSelection:"Выберите хотя бы одну запись для импорта.",importProgress:"Импорт {index}/{total}: {title}",importProgressParallel:"Импорт {current}/{total} · параллельно {active}",importDoneTitle:"Импорт завершён",importFailedTitle:"Импорт не удался",importPartialTitle:"Импорт с ошибками",importDone:"{ok} ок, {fail} ошибок",importDoneWithSkip:"{ok} ок, {fail} ошибок, {skip} пропущено",importElapsed:"{time}",importElapsedLabel:"Заняло {time}",importDurationSec:"{seconds} с",importDurationSecFrac:"{seconds} с",importDurationMs:"{minutes} м {seconds} с",importDurationHms:"{hours} ч {minutes} м {seconds} с",importLogOk:"Импортировано",importLogFail:"Ошибка: {error}",importLogFailGeneric:"Ошибка",importLogSkip:"Пропуск",importLogSkipDetail:"Пропуск — {reason}",importLogSkipExisting:"уже есть в библиотеке",importLogNowLabel:"Сейчас импортируется",importLogWaiting:"Подготовка…",importLogNowHint:"В очереди: {count}",importLogWriting:"Запись {index} из {total}",importLogWritingParallel:"Запись {current}/{total} · параллельно {active}",importLogWritingHintParallel:"В очереди осталось: {left}",importLogFinished:"Импорт завершён",importLogStatOk:"ок",importLogStatFail:"ошибки",importLogStatSkip:"пропуски",importLogStatLeft:"осталось",importMatchBlockedHint:"Не найдена при чтении — импорт недоступен",importNeedResolvableTitle:"Нечего импортировать",importNeedResolvable:"У выбранных игр нет сопоставления с Backloggd. Ненайденные строки пропускаются автоматически.",importErrorsTitle:"Проблемы при импорте",importIssueError:"#{index} {title} — {error}",importNeedLoginTitle:"Нужен вход",importNeedLoginBody:"Войдите в Backloggd, чтобы импортировать игры. Откройте сайт авторизованным и повторите.",importNeedCsrfBody:"Не найден CSRF-токен на странице. Обновите Backloggd и попробуйте снова.",importNeedUserIdTitle:"Нужен user id",importNeedUserIdBody:"Не удалось найти ваш Backloggd user id на странице. Введите его ниже, чтобы продолжить импорт.",importUserIdLabel:"Backloggd user id",importUserIdPlaceholder:"например 295669",importUserIdHint:"Ищите элемент с атрибутом user_id на странице или запрос к /api/user/{id}/… в сети.",importUserIdContinue:"Продолжить импорт",importUserIdInvalid:"Введите положительный числовой user id.",importSignIn:"Войти",importLibraryFailedTitle:"Библиотека",importLibraryFailed:"Не удалось загрузить библиотеку: {error}",importReadFailedTitle:"Ошибка чтения",importReadErrorsCopied:"Список проблем скопирован.",importReadErrorsCopyFail:"Не удалось получить доступ к буферу обмена.",toastTitleSuccess:"Готово",toastTitleWarning:"Внимание",toastTitleError:"Ошибка",toastTitleInfo:"Сведения",toastCopiedTitle:"Скопировано",toastCopyFailTitle:"Не скопировано",toastFileTypeTitle:"Неверный тип файла",toastCsvSoonTitle:"Скоро",importSummaryTitle:"Сводка файла",importStatVersion:"Формат",importStatSource:"Источник",importStatExported:"Экспорт",importStatTotal:"Записей",importStatUnique:"Уникальных",importStatOriginal:"В файле",importStatDuplicates:"Убрано дублей",importStatExisting:"Уже есть лог",importStatFound:"Найдено",importStatNotFound:"Не найдено",importStatMatchRate:"Совпало",importStatMatchGroup:"Обзор сопоставления",importStatDetails:"Детали файла",importStatRated:"С рейтингом",importStatFavorites:"Избранных",importStatDates:"С датами",importStatReviews:"С отзывом",importStatGameId:"С ID в файле",importStatByStatus:"По статусу",importStatNoStatus:"Без статуса",importLibraryProgress:"Загрузка вашей библиотеки Backloggd…",importLibraryProgressDetail:"Список {list}/{total}, страница {page}",importExistingToggle:"Импортировать игры, которые уже есть",importMatchProgress:"Сопоставление {current}/{total}: {title}",importMatchProgressParallel:"Сопоставление {current}/{total} · параллельно {active}",importMatchTableTitle:"Результаты сопоставления",importMatchSelectAll:"Выбрать все",importMatchSelectRow:"Импортировать {title}",importMatchSelected:"Выбрано {selected} из {total}",importMatchShown:"Показано {shown} из {total}",importMatchFiltersLabel:"Фильтры таблицы",importMatchSearchPlaceholder:"Поиск по названию…",importMatchFilterAll:"Все",importMatchFilterExisting:"Ваш лог",importMatchFilterStatus:"Совпадение",importMatchFilterSource:"Источник",importMatchFilterSelected:"Выбор",importMatchFilterSelectedOn:"Выбраны",importMatchFilterSelectedOff:"Не выбраны",importMatchColFileTitle:"Название в файле",importMatchColStatus:"Статус",importMatchColStart:"Начало",importMatchColEnd:"Конец",importMatchColRating:"Рейтинг",importMatchColPlatform:"Платформа",importMatchColResult:"Совпадение",importMatchColSource:"Источник",importMatchColExisting:"Ваш лог",importMatchColSiteTitle:"Backloggd",importMatchColGameId:"game_id",importMatchColYear:"Год",importMatchFound:"Найдена",importMatchPreset:"ID в файле",importMatchNotFound:"Не найдена",importMatchError:"Ошибка",importMatchCached:"Кеш",importMatchLive:"Сеть",importMatchExistingYes:"Есть",importMatchExistingNo:"Нет",importMatchManualIdPlaceholder:"ID или /games/slug/",importMatchManualIdHint:"Введите game_id Backloggd или вставьте URL /games/… и нажмите Enter",importMatchManualIdAria:"Указать id Backloggd для {title}",importMatchManualIdLoading:"Поиск…",importMatchManualIdMissingRow:"Строка не найдена",importMatchManualIdOk:"Привязано {title} → #{id}",importMatchManualIdOkTitle:"ID игры задан",importDebugLibraryTitle:"Индекс библиотеки",importDebugLibraryCount:"{count} игр · {pages} стр. · @{user}",importDebugLibraryLead:"Игры, собранные со списков профиля Backloggd при чтении (для колонки «Ваш лог»).",importDebugLibraryEmpty:"Индекс библиотеки пуст.",importDebugLibraryColTitle:"Название",importDebugLibraryColId:"game_id",importDebugLibraryColSlug:"slug",importDebugLibraryColSource:"Страница-источник",importReadErrorsTitle:"Проблемы при чтении",importReadErrorsCopy:"Копировать",importReadIssueNotFound:"#{index} {title} — не найдена на Backloggd",importReadIssueError:"#{index} {title} — {error}",importReadIssueDuplicate:"{title} — {count}× в файле, оставлена #{kept}, убраны {dropped}",aboutEyebrow:"О скрипте",aboutBody:"У Backloggd пока нет импорта/экспорта. Другие площадки отдают единый transfer JSON; этот юзерскрипт импортирует файл на Backloggd. Позже: экспорт с самого Backloggd.",aboutPointImport:"Сопоставление названий, обзор результатов и запись выбранных логов.",aboutPointFormat:"Единый формат backloggd-transfer JSON (v2).",aboutPointExport:"Чистка находит мультилоги; полный экспорт библиотеки — в планах.",aboutFormat:"Формат transfer",aboutRepo:"Репозиторий",aboutIssues:"Issues",aboutAuthorLabel:"Автор",aboutAuthorGithub:"GitHub",aboutAuthorBackloggd:"Backloggd",aboutAuthorProfile:"Профиль",settingsTitle:"Настройки",settingsLead:"Общие параметры сопоставления, темпа импорта и диагностики.",settingsLocale:"Язык",settingsLocaleAuto:"Авто (браузер)",settingsLocaleHint:"Язык интерфейса этой панели.",settingsImportDelay:"Пауза импорта",settingsImportDelayHint:"Пауза после записи каждого лога (на каждый параллельный поток). Меньше — быстрее; больше — реже лимиты.",settingsMs:"мс",settingsMatchConcurrency:"Параллельных запросов",settingsMatchConcurrencyHint:"Сколько запросов к Backloggd выполняется одновременно (библиотека, сопоставление, чистка и запись логов).",settingsMatchConcurrencyRange:"{min}–{max}",settingsDebugMode:"Режим отладки",settingsDebugModeHint:"На этапе Обзор показать проиндексированную библиотеку с вашего профиля.",settingsSaved:"Настройки сохранены.",settingsSavedTitle:"Настройки",exportSoonTitle:"Скоро",exportSoonBody:"Экспорт из Backloggd пока не реализован.",exportLockedTitle:"Экспорт",exportLockedLead:"Скачайте библиотеку Backloggd в transfer JSON. Вкладка откроется в одном из следующих обновлений.",exportLockedBadge:"Скоро",csvMapTitle:"Сопоставление колонок",csvMapLead:"Автоматически найденные поля отмечены. Исправьте селект, если колонка угадана неверно.",csvMapFileStat:"{file}",csvMapRowsStat:"{count} строк",csvMapMappedStat:"{mapped}/{total} полей",csvMapAutoLabel:"Автоопределение",csvMapAutoOk:"Колонка названия найдена. Проверьте остальное и продолжайте.",csvMapAutoNeedTitle:"Укажите колонку с названием (Title), чтобы продолжить.",csvMapColumn:"Колонка CSV",csvMapSkip:"— пропустить —",csvMapMapped:"Найдено",csvMapRequired:"Обязательно",csvMapOptional:"Опционально",csvMapNoSamples:"Нет примеров",csvMapContinue:"Сопоставить игры →",csvMapReadyTitle:"CSV загружен",csvMapReady:"Разобрано строк: {count}. Подтвердите сопоставление колонок.",csvMapInvalidTitle:"Сопоставление неполное",csvEmptyError:"В CSV нет заголовков или строк данных.",csvFieldTitle:"Название",csvFieldStatus:"Статус",csvFieldRating:"Рейтинг",csvFieldStart:"Дата начала",csvFieldFinish:"Дата окончания",csvFieldReview:"Обзор",csvFieldPlatform:"Платформа",csvFieldFavorite:"Избранное",csvFieldHours:"Часы",csvFieldGameId:"Backloggd game id",csvFieldSlug:"Slug",csvValueStatusTitle:"Маппинг статусов",csvValueStatusLead:"Эти статусы не совпадают с ключами Backloggd. Укажите, во что преобразовать каждое уникальное значение.",csvValueRatingTitle:"Маппинг рейтингов",csvValueRatingLead:"Эти рейтинги не в шкале Backloggd 1–10. Сопоставьте текстовые метки (или другой формат) с оценкой в половинах звёзд.",csvValuePlatformTitle:"Маппинг платформ",csvValuePlatformLead:"Эти платформы не совпадают со списком Backloggd. Сопоставьте их (например, PC → Windows PC).",csvValueColSource:"В файле",csvValueColCount:"Строк",csvValueColTarget:"Импортировать как",csvValueColPreview:"Результат",csvValueSkip:"— пропустить —",csvValueNative:"Уже ок",csvValueNoRating:"Без рейтинга",csvValueAuto:"Авто",csvValueManual:"Вручную",csvValueManualStat:"{count} вручную",csvValueReset:"Сбросить ручные",csvValueResetHint:"Очистить сохранённые ручные маппинги в этом блоке и вернуть автоподсказки",csvValueUniqueStat:"{count} уникальных",csvValueUnmappedStat:"{count} без маппинга",csvValueAllMapped:"Все сопоставлены",cacheTitle:"Кеш игр",cacheLead:"Найденные названия Backloggd сохраняются локально, чтобы при следующем чтении не запрашивать их снова.",cacheClearGames:"Очистить кеш игр",cacheClearAll:"Очистить весь кеш",cacheClearMisses:"Очистить «не найдено»",cacheClearGamesConfirm:"Очистить весь кеш сопоставлений игр?",cacheClearAllConfirm:"Очистить кеш игр, историю переносов и маппинги CSV? Настройки сохранятся.",cacheCleared:"Удалено записей: {count}",cacheAllCleared:"Очищено: игр {games}, истории {history} (маппинги CSV сброшены)",cacheMissesCleared:"Удалено «не найдено»: {count}",cacheMeterLabel:"Бюджет хранилища",cacheBarUsed:"{used} / {limit}",cacheBarPct:"{pct}%",cacheBarPctLabel:"заполнено",cacheBarPctTitle:"Кеш заполнен на {pct}%",cacheTabBadge:"{pct}%",cacheBarAria:"Занято {used} ({pct}%), свободно {free}",cacheBarFound:"Найденные игры",cacheBarMiss:"Не найдено",cacheBarHistory:"История",cacheBarMaps:"Маппинги CSV",cacheBarSettings:"Настройки",cacheBarFree:"Свободно",cacheBarLegend:"{count} · {size}",cacheBarHint:"Мягкий лимит ~5 МБ. Сначала вытесняются старые lookup’ы игр. История и настройки показаны для наглядности.",cacheStatGames:"Игр в кеше",cacheStatFound:"Найдено",cacheStatMiss:"Не найдено",cacheStatUpdated:"Активность",cacheStatUpdatedHint:"Последнее обращение к кешу",cacheListTitle:"Недавние запросы",cacheListMeta:"Показано {shown} из {total}",cacheEmptyTitle:"Кеш пуст",cacheEmptyLead:"Запустите этап чтения, чтобы сохранить title → game_id.",cacheColQuery:"Запрос",cacheColKind:"Тип",cacheColMatch:"Совпадение",cacheColId:"game_id",cacheColWhen:"Обновлено",cacheColSize:"Размер",cacheKindHit:"Найдена",cacheKindMiss:"Промах",historyTitle:"История переносов",historyLead:"Недавние импорты и экспорты в этом профиле браузера.",historyClear:"Очистить",historyClearConfirm:"Очистить всю историю переносов?",historyFilterLabel:"Фильтр истории",historyFilterAll:"Все",historyFilterImport:"Импорты",historyFilterExport:"Экспорты",historyEmptyTitle:"Пока пусто",historyEmptyBody:"Завершённые импорты и экспорты появятся здесь: файл, дата и результаты по играм.",historyEmptyFilteredTitle:"В этом фильтре пусто",historyEmptyFilteredBody:"Выберите другой фильтр или выполните перенос.",historyKindImport:"Импорт",historyKindExport:"Экспорт",historyStatusSuccess:"Успех",historyStatusPartial:"Частично",historyStatusFailed:"Ошибка",historyCounts:"{ok} ок · {fail} ошибок · {total} всего",historyMoreGames:" и ещё {count}",historyFactWhen:"Когда",historyFactSource:"Источник",historyFactVersion:"Формат",historyFactUser:"Аккаунт",historyGamesTitle:"Игры ({count})",historyNoGames:"Для этой сессии детали игр не сохранены.",historyRemove:"Удалить",historyJustNow:"Только что",historyMinutesAgo:"{count} мин назад",historyHoursAgo:"{count} ч назад",historyDaysAgo:"{count} дн назад",cleanupTitle:"Чистка мультилогов",cleanupLead:"Найдите игры, где больше одного лога — откройте их на Backloggd и уберите лишние или дубликаты.",cleanupScan:"Сканировать",cleanupRescan:"Сканировать снова",cleanupCancel:"Отмена",cleanupRetry:"Повторить",cleanupNeedLoginTitle:"Нужен вход",cleanupNeedLoginBody:"Войдите в Backloggd в этом браузере, чтобы прочитать библиотеку и страницы логов.",cleanupNeedLoginCta:"Войти",cleanupIdleTitle:"Поиск игр с несколькими логами",cleanupIdleBody:"После импортов (или осознанных реплеев) у части игр появляется несколько логов. Скан покажет только те, где логов 2 и больше.",cleanupIdleStep1:"Загружает полки профиля",cleanupIdleStep2:"Проверяет страницу логов каждой игры",cleanupIdleStep3:"Открывает совпадения, чтобы почистить вручную",cleanupScanningLibrary:"Загружаем библиотеку…",cleanupScanningLibraryParallel:"Библиотека · {done} стр. · параллельно {active}",cleanupScanningShelf:"Полка «{list}», страница {page}",cleanupScanningShelfMeta:"Полка {index}/{total}",cleanupScanningGame:"Проверка {index}/{total}: {title}",cleanupScanningGameParallel:"Проверка {current}/{total} · параллельно {active}",cleanupScanningGameMeta:"Найдено мультилогов: {found}",cleanupErrorTitle:"Скан не удался",cleanupErrorBody:"Не удалось завершить поиск мультилогов. Попробуйте чуть позже.",cleanupCancelled:"Скан отменён.",cleanupEmptyTitle:"Мультилогов нет",cleanupEmptyBody:"Проверено игр: {scanned} — у каждой не больше одного лога.",cleanupDoneFound:"Найдено игр с несколькими логами: {count}",cleanupDoneNone:"Мультилогов нет среди {scanned} проверенных игр",cleanupStatMulti:"с несколькими логами",cleanupStatScanned:"проверено {count}",cleanupStatHidden:"скрыто {count}",cleanupStatErrors:"ошибок проверки: {count}",cleanupSearchPlaceholder:"Фильтр по названию или логу…",cleanupSortLabel:"Сортировка",cleanupSortCount:"По числу",cleanupSortTitle:"А–Я",cleanupFilteredTitle:"Ничего не найдено",cleanupFilteredBody:"Измените поиск или покажите скрытые игры.",cleanupUnhideAll:"Показать скрытые",cleanupOpenLogs:"Открыть на сайте",cleanupHide:"Скрыть",cleanupHiddenToast:"Скрыто из списка до нового скана или «Показать скрытые».",cleanupLogCount:"{count} логов",cleanupLogCountTitle:"Логов у этой игры: {count}",cleanupMoreLogs:"+{count}",cleanupBadgeTitle:"Игр с мультилогами: {count}",cleanupExpand:"Показать логи",cleanupCollapse:"Свернуть",cleanupGameStatus:"Статус игры: {status}",cleanupDrawerTitle:"Логов: {count}",cleanupDrawerHint:"Просмотрите логи и при необходимости почистите их на сайте.",cleanupLogRating:"{rating}/10",cleanupLogNoMeta:"На странице нет доп. деталей"}},Gt=["en","ru"],zt={en:"English",ru:"Русский"};function Wt(t){const e=t||"auto";return "auto"!==e&&Gt.includes(e)?e:function(){const t=String(navigator.language||"en").toLowerCase().slice(0,2);return Gt.includes(t)?t:"en"}()}function Jt(t,e){return String(t).replace(/\{(\w+)\}/g,(t,n)=>null==e[n]?"":String(e[n]))}function Kt(t,e,n,a){const r=Math.round(Number(t));return Number.isFinite(r)?Math.min(n,Math.max(e,r)):a}function Yt(t={}){const e={...y,...t},n=String(e.uiLocale||"auto");return e.uiLocale=["auto","en","ru"].includes(n)?n:"auto",e.importFormat="csv"===e.importFormat||"json"===e.importFormat?e.importFormat:"json",e.importExisting=Boolean(e.importExisting),e.debugMode=Boolean(e.debugMode),e.importDelayMs=Kt(e.importDelayMs,0,15e3,1e3),e.matchConcurrency=Kt(e.matchConcurrency,1,8,4),e}function Xt(){try{const e=t(o,null);return e&&"object"==typeof e?Yt(e):Yt()}catch(e){return Yt()}}function Qt(t){const e=Yt(t);return n(o,e),e}let Zt=Xt(),te=Wt(Zt.uiLocale),ee=Vt[te]||Vt.en;function ne(){Zt=Xt(),te=Wt(Zt.uiLocale),ee=Vt[te]||Vt.en;}function ae(t){return String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function re(t){return ae(t)}function ie(t){const e=Math.max(0,Math.round(Number(t)||0)),n=Math.floor(e/1e3),a=Math.floor(n/3600),r=Math.floor(n%3600/60),i=n%60,s=Math.floor(e%1e3/100);return a>0?Jt(ee.importDurationHms,{hours:a,minutes:String(r).padStart(2,"0"),seconds:String(i).padStart(2,"0")}):r>0?Jt(ee.importDurationMs,{minutes:r,seconds:String(i).padStart(2,"0")}):n<10&&e>0?Jt(ee.importDurationSecFrac,{seconds:`${i}.${s}`}):Jt(ee.importDurationSec,{seconds:n})}function se(t,e){var n;const a=t.querySelector("[data-bdt-log]");if(!a||a.hidden)return;const r=a.querySelector("[data-bdt-import-now-title]"),i=a.querySelector("[data-bdt-import-now-hint]"),s=a.querySelector("[data-bdt-import-counter]"),o=a.querySelector("[data-bdt-import-active]"),l=a.querySelector("[data-bdt-import-now]"),d=Math.max(1,Number(e.total)||1),c=Math.max(0,Number(e.done)||0),u=Math.max(0,Number(e.concurrency)||0),p=Array.isArray(e.activeTitles)?e.activeTitles.filter(Boolean):[],m=u>1||p.length>1;r&&(r.textContent=m&&p.length?Jt(ee.importLogWritingParallel,{current:c,total:d,active:Math.min(u||p.length,p.length)}):e.title||p[0]||ee.importLogWaiting),i&&(i.textContent=m?Jt(ee.importLogWritingHintParallel,{left:Math.max(0,d-c)}):Jt(ee.importLogWriting,{index:Math.min(d,(null!=(n=e.index)?n:c)+1),total:d})),s&&(s.textContent=`${c} / ${d}`),o&&(p.length?(o.hidden=false,o.innerHTML=p.slice(0,8).map(t=>`${ae(t)}`).join("")):(o.hidden=true,o.innerHTML="")),null==l||l.classList.add("is-active"),null==l||l.classList.remove("is-done","is-fail","is-warn");}function oe(t,e){const n=t.querySelector("[data-bdt-log]");if(!n||n.hidden)return;const a=n.querySelector("[data-bdt-import-now-title]"),r=n.querySelector("[data-bdt-import-now-hint]"),i=n.querySelector("[data-bdt-import-active]"),s=n.querySelector("[data-bdt-import-now]"),o=(e.ok||0)+(e.fail||0)+(e.skip||0);if(a&&(a.textContent=e.doneTitle||ee.importLogFinished),r){const t=Jt(ee.importDoneWithSkip,{ok:e.ok||0,fail:e.fail||0,skip:e.skip||0});r.textContent=null!=e.elapsedMs?`${t} · ${Jt(ee.importElapsed,{time:ie(e.elapsedMs)})}`:t;}i&&(i.hidden=true,i.innerHTML="");const l=n.querySelector("[data-bdt-import-counter]");l&&(l.textContent=`${o} / ${e.total||o}`);const d=n.querySelector("[data-bdt-import-elapsed]");d&&null!=e.elapsedMs&&(d.hidden=false,d.textContent=Jt(ee.importElapsedLabel,{time:ie(e.elapsedMs)})),null==s||s.classList.remove("is-active"),(e.fail||0)>0&&0===(e.ok||0)?null==s||s.classList.add("is-fail"):(e.fail||0)>0||(e.skip||0)>0?null==s||s.classList.add("is-warn"):null==s||s.classList.add("is-done"),le(n,e),de(n,{ok:e.ok||0,fail:e.fail||0,skip:e.skip||0,total:e.total||o});}function le(t,e){const n=t.querySelector("[data-bdt-import-stats]");if(!n)return;const a=Math.max(0,(e.total||0)-(e.ok||0)-(e.fail||0)-(e.skip||0));n.innerHTML=`\n ${ce("ok",e.ok||0,ee.importLogStatOk)}\n ${ce("fail",e.fail||0,ee.importLogStatFail)}\n ${ce("skip",e.skip||0,ee.importLogStatSkip)}\n ${ce("left",a,ee.importLogStatLeft)}\n `;}function de(t,e){const n=Math.max(1,Number(e.total)||1),a=Math.min(n,(e.ok||0)+(e.fail||0)+(e.skip||0)),r=Math.round(a/n*100),i=t.querySelector("[data-bdt-import-fill]"),s=t.querySelector("[data-bdt-import-track]"),o=t.querySelector("[data-bdt-import-pct]");i&&(i.style.width=`${r}%`),s&&s.setAttribute("aria-valuenow",String(r)),o&&(o.textContent=`${r}%`);}function ce(t,e,n){return `\n \n ${ae(String(e))}\n ${ae(n)}\n \n `}function ue(t,e,n={}){var a;const r=t.querySelector("[data-bdt-match-table]");if(!r)return;if(!e.length)return r.hidden=true,void(r.innerHTML="");const i=true===n.importExisting,s=(null==(a=r.querySelector("[data-bdt-match-search]"))?void 0:a.value)||"",o=e.map(t=>{var e,n,a,r,s,o,l,d;const c=t.entry,u=G(c),p=V(c),m=(null==(e=t.match)?void 0:e.title)||"—",g=null!=(r=null!=(a=null==(n=t.match)?void 0:n.id)?a:c.game_id)?r:"",h=(null==(s=t.match)?void 0:s.year)||"—",b=(null==(o=t.match)?void 0:o.url)?`${ae(m)}`:ae(m),f="found"===t.status||"preset"===t.status,y="not_found"===t.status||"error"===t.status,v=f&&(!t.existingLog||i),_=t.existingLog?ee.importMatchExistingYes:ee.importMatchExistingNo,S=(null==(l=N(u.platform))?void 0:l.name)||"—",k=y?`
\n \n \n
`:ae(""===g?"—":String(g));return `\n \n \n \n \n ${t.index+1}\n ${ae(p)}\n ${ae(Ot(null==(d=c.log)?void 0:d.status,ee.importStatNoStatus))}\n ${ae(u.start_date||"—")}\n ${ae(u.finish_date||"—")}\n ${null==u.rating?"—":ae(String(u.rating))}\n ${ae(S)}\n ${ae(function(t){switch(t){case "found":return ee.importMatchFound;case "preset":return ee.importMatchPreset;case "not_found":return ee.importMatchNotFound;case "error":return ee.importMatchError;default:return t}}(t.status))}\n \n ${ae(t.fromCache?ee.importMatchCached:ee.importMatchLive)}\n \n \n ${ae(_)}\n \n ${b}\n ${k}\n ${ae(h)}\n \n `}).join("");r.innerHTML=`\n
\n
\n

${ae(ee.importMatchTableTitle)}

\n

\n
\n \n
\n
\n \n ${pe("existing",ee.importMatchFilterExisting,[["all",ee.importMatchFilterAll],["yes",ee.importMatchExistingYes],["no",ee.importMatchExistingNo]])}\n ${pe("status",ee.importMatchFilterStatus,[["all",ee.importMatchFilterAll],["found",ee.importMatchFound],["preset",ee.importMatchPreset],["not_found",ee.importMatchNotFound],["error",ee.importMatchError]])}\n ${pe("source",ee.importMatchFilterSource,[["all",ee.importMatchFilterAll],["cache",ee.importMatchCached],["live",ee.importMatchLive]])}\n ${pe("selected",ee.importMatchFilterSelected,[["all",ee.importMatchFilterAll],["on",ee.importMatchFilterSelectedOn],["off",ee.importMatchFilterSelectedOff]])}\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ${o}\n
\n \n #${ae(ee.importMatchColFileTitle)}${ae(ee.importMatchColStatus)}${ae(ee.importMatchColStart)}${ae(ee.importMatchColEnd)}${ae(ee.importMatchColRating)}${ae(ee.importMatchColPlatform)}${ae(ee.importMatchColResult)}${ae(ee.importMatchColSource)}${ae(ee.importMatchColExisting)}${ae(ee.importMatchColSiteTitle)}${ae(ee.importMatchColGameId)}${ae(ee.importMatchColYear)}
\n
\n `,r.hidden=false,function(t,e){const n=t.querySelector("[data-bdt-match-select-all]"),a=t.querySelector("[data-bdt-import-existing]"),r=()=>[...t.querySelectorAll("[data-bdt-match-select]")].map(t=>t),i=t=>{var e;return "1"===(null==(e=t.closest("tr"))?void 0:e.getAttribute("data-existing"))},s=t=>{var e;return "0"!==(null==(e=t.closest("tr"))?void 0:e.getAttribute("data-importable"))},o=t=>{const e=t.closest("tr");return Boolean(e)&&!e.hidden};null==n||n.addEventListener("change",()=>{const l=Boolean(n.checked),d=Boolean(null==a?void 0:a.checked);for(const t of r())o(t)&&(t.checked=!(!s(t)||t.disabled)&&!(l&&i(t)&&!d)&&l);ge(t),be(t,e.onSelectionChange);}),null==a||a.addEventListener("change",()=>{var n;const s=Boolean(a.checked);null==(n=e.onImportExistingChange)||n.call(e,s);for(const t of r())i(t)&&(t.checked=s);ge(t),be(t,e.onSelectionChange);}),t.addEventListener("change",n=>{const a=n.target;if(a instanceof HTMLInputElement||a instanceof HTMLSelectElement)return a.matches("[data-bdt-match-filter]")?(ge(t),void be(t,e.onSelectionChange)):void(a instanceof HTMLInputElement&&a.matches("[data-bdt-match-select]")&&(ge(t),be(t,e.onSelectionChange)))}),t.addEventListener("input",n=>{const a=n.target;a instanceof HTMLInputElement&&a.matches("[data-bdt-match-search]")&&(ge(t),be(t,e.onSelectionChange));});}(r,n),function(t,e){if(!e.onManualGameId)return;const n=new Map,a=async t=>{var n,a;const r=String(t.value||"").trim();if(!r)return;if(t.dataset.bdtCommitted===r||t.disabled)return;const i=Number(t.getAttribute("data-index"));if(!Number.isFinite(i))return;t.dataset.bdtCommitted=r;const s=null==(n=t.closest(".bdt-match-id-edit"))?void 0:n.querySelector("[data-bdt-match-id-status]");t.disabled=true,s&&(s.hidden=false,s.textContent=ee.importMatchManualIdLoading,s.classList.remove("bdt-match-id-status--error"));try{await(null==(a=e.onManualGameId)?void 0:a.call(e,i,r));}catch(o){delete t.dataset.bdtCommitted,t.disabled=false,s&&(s.hidden=false,s.textContent=o instanceof Error?o.message:String(o),s.classList.add("bdt-match-id-status--error"));}};t.addEventListener("keydown",t=>{const e=t.target;if(!(e instanceof HTMLInputElement))return;if(!e.matches("[data-bdt-match-manual-id]"))return;if("Enter"!==t.key)return;t.preventDefault();const r=n.get(e);r&&clearTimeout(r),a(e);}),t.addEventListener("focusout",t=>{const e=t.target;if(!(e instanceof HTMLInputElement))return;if(!e.matches("[data-bdt-match-manual-id]"))return;const r=n.get(e);r&&clearTimeout(r),a(e);}),t.addEventListener("input",t=>{const e=t.target;if(!(e instanceof HTMLInputElement))return;if(!e.matches("[data-bdt-match-manual-id]"))return;const r=n.get(e);r&&clearTimeout(r);const i=String(e.value||"").trim();(/^\d{3,}$/.test(i)||/\/games\/[^/?#]+/i.test(i)||/^https?:\/\//i.test(i))&&n.set(e,setTimeout(()=>{n.delete(e),a(e);},550));});}(r,n),ge(r),be(r,n.onSelectionChange);}function pe(t,e,n){const a=n.map(([t,e])=>``).join("");return `\n \n `}function me(t){return [...t.querySelectorAll("[data-bdt-match-select]:checked")].filter(t=>{const e=t.closest("tr");return "0"!==(null==e?void 0:e.getAttribute("data-importable"))}).map(t=>Number(t.value))}function ge(t){const e=he(t,"existing"),n=he(t,"status"),a=he(t,"source"),r=he(t,"selected"),i=function(t){const e=t.querySelector("[data-bdt-match-search]");return String((null==e?void 0:e.value)||"").trim().toLowerCase()}(t);for(const s of t.querySelectorAll("tbody tr")){const t=s,o=t.querySelector("[data-bdt-match-select]"),l="all"===e||"yes"===e&&"1"===t.getAttribute("data-existing")||"no"===e&&"1"!==t.getAttribute("data-existing"),d="all"===n||t.getAttribute("data-status")===n,c="all"===a||t.getAttribute("data-source")===a,u=Boolean(null==o?void 0:o.checked),p="all"===r||"on"===r&&u||"off"===r&&!u,m=!i||(t.getAttribute("data-title")||"").includes(i)||(t.getAttribute("data-site-title")||"").includes(i);t.hidden=!(l&&d&&c&&p&&m);}}function he(t,e){const n=t.querySelector(`[data-bdt-match-filter="${e}"]`);return (null==n?void 0:n.value)||"all"}function be(t,e){const n=[...t.querySelectorAll("[data-bdt-match-select]")].map(t=>t),a=t.querySelector("[data-bdt-import-existing]"),r=Boolean(null==a?void 0:a.checked),i=n.filter(t=>{const e=t.closest("tr");if(!e||e.hidden)return false;if(t.disabled)return false;if("0"===e.getAttribute("data-importable"))return false;const n="1"===e.getAttribute("data-existing");return r||!n}),s=n.filter(t=>t.checked&&!t.disabled).length,o=n.length,l=n.filter(t=>{const e=t.closest("tr");return Boolean(e)&&!e.hidden}).length,d=i.filter(t=>t.checked).length,c=t.querySelector("[data-bdt-match-select-all]");c&&(c.checked=i.length>0&&d===i.length,c.indeterminate=d>0&&d1||a.length>1){const n=a.length||Math.min(r,e-t);return String(ee.importMatchProgressParallel||"").replace("{current}",String(t)).replace("{total}",String(e)).replace("{active}",String(n)).replace("{concurrency}",String(r||n))}return String(ee.importMatchProgress||"").replace("{current}",String(t)).replace("{total}",String(e)).replace("{title}",n||a[0]||"…")}(r,a,e.title||"",s,o);n.hidden=false;let d=n.querySelector(".bdt-progress__fill"),c=n.querySelector(".bdt-progress__label"),u=n.querySelector(".bdt-progress__pct"),p=n.querySelector(".bdt-progress__track"),m=n.querySelector(".bdt-progress__active");if(d&&c&&u&&p&&m||(n.innerHTML='\n
\n \n \n 0%\n
\n \n
\n
\n
\n ',d=n.querySelector(".bdt-progress__fill"),c=n.querySelector(".bdt-progress__label"),u=n.querySelector(".bdt-progress__pct"),p=n.querySelector(".bdt-progress__track"),m=n.querySelector(".bdt-progress__active")),c&&(c.textContent=l),u&&(u.textContent=`${i}%`),p&&p.setAttribute("aria-valuenow",String(i)),m&&(s.length?(m.hidden=false,m.innerHTML=s.slice(0,6).map(t=>`${ae(t)}`).join("")):(m.hidden=true,m.innerHTML="")),d){const t=d;(e.reset||0===r)&&(t.style.transition="none",t.style.width="0%",t.style.transition=""),t.style.width=`${i}%`;}}function ye(t,e){const n=t.querySelector("[data-bdt-debug-library]");if(!n)return;if(!Zt.debugMode||!e)return n.hidden=true,void(n.innerHTML="");const a=Array.isArray(e.games)?e.games:[],r=a.map(t=>{const e=t.title||"—",n=t.slug||"",a=null!=t.gameId?String(t.gameId):"—",r=n?`${ae(e)}`:ae(e),i=String(t.sourceUrl||"").trim(),s=i||"—",o=i?`${ae(s)}`:ae("—");return `\n \n ${r}\n ${ae(a)}\n ${ae(n||"—")}\n ${o}\n \n `}).join("");n.hidden=false,n.innerHTML=`\n
\n \n \n DEBUG\n ${ae(ee.importDebugLibraryTitle)}\n ${ae(Jt(ee.importDebugLibraryCount,{count:a.length,pages:e.pageCount||0,user:e.username||"—"}))}\n \n \n \n
\n

${ae(ee.importDebugLibraryLead)}

\n ${a.length?`
\n \n \n \n \n \n \n \n \n \n ${r}\n
${ae(ee.importDebugLibraryColTitle)}${ae(ee.importDebugLibraryColId)}${ae(ee.importDebugLibraryColSlug)}${ae(ee.importDebugLibraryColSource)}
\n
`:`

${ae(ee.importDebugLibraryEmpty)}

`}\n
\n
\n `;}const ve="bdt-toast-host",_e=Object.freeze({success:"fa-solid fa-circle-check",warning:"fa-solid fa-triangle-exclamation",error:"fa-solid fa-circle-xmark",info:"fa-solid fa-circle-info"});function Se(t){if(!t||"1"===t.dataset.bdtLeaving)return;t.dataset.bdtLeaving="1",t.classList.add("is-leaving");const e=()=>t.remove();t.addEventListener("transitionend",e,{once:true}),setTimeout(e,320);}function ke(t){switch(t){case "success":return ee.toastTitleSuccess;case "warning":return ee.toastTitleWarning;case "error":return ee.toastTitleError;default:return ee.toastTitleInfo}}function Ce(t,e={}){var n;const a=String(t||"").trim();if(!a)return null;const r=["info","success","warning","error"].includes(e.type)?e.type:"info",i=String(e.title||ke(r)).trim()||ke(r),s=Number.isFinite(e.duration)&&e.duration>0?e.duration:"error"===r?5600:4200,o=function(){let t=document.getElementById(ve);return (null==t?void 0:t.isConnected)||(t=document.createElement("div"),t.id=ve,t.className="bdt-toast-host",t.setAttribute("aria-live","polite"),t.setAttribute("aria-relevant","additions"),(document.body||document.documentElement).appendChild(t)),t}();for(;o.children.length>=4;)Se(o.firstElementChild);const l=document.createElement("div");return l.className=`bdt-toast bdt-toast--${r}`,l.setAttribute("role","error"===r?"alert":"status"),l.innerHTML=`\n \n
\n ${ae(i)}\n

${ae(a)}

\n
\n \n `,null==(n=l.querySelector(".bdt-toast__close"))||n.addEventListener("click",t=>{t.stopPropagation(),Se(l);}),l.addEventListener("click",()=>Se(l)),o.appendChild(l),requestAnimationFrame(()=>{l.classList.add("is-in");}),s<1/0&&setTimeout(()=>Se(l),s),l}function Me(t,e=null,n=[]){const a=[];e&&a.push({kind:"library",text:Jt(ee.importLibraryFailed,{error:e}),detail:e});for(const r of n||[]){const t=(r.droppedSourceIndices||[]).map(t=>`#${t+1}`).join(", ");a.push({kind:"duplicate",index:r.keptSourceIndex,title:r.title,detail:t,text:Jt(ee.importReadIssueDuplicate,{title:r.title,count:r.count,kept:r.keptSourceIndex+1,dropped:t||"—"})});}for(const r of t||[]){const t=V(r.entry)||"—",e=r.index+1;if("not_found"!==r.status){if("error"===r.status){const n=r.error||ee.importMatchError;a.push({kind:"error",index:r.index,title:t,detail:n,text:Jt(ee.importReadIssueError,{index:e,title:t,error:n})});}}else a.push({kind:"not_found",index:r.index,title:t,text:Jt(ee.importReadIssueNotFound,{index:e,title:t})});}return a}function we(t,e){Le(t,e,{selector:"[data-bdt-errors]",title:ee.importReadErrorsTitle});}function $e(t,e){Le(t,e,{selector:"[data-bdt-import-errors]",title:ee.importErrorsTitle,open:e.length>0});}function Le(t,e,n={}){const a=t.querySelector(n.selector||"[data-bdt-errors]");if(!a)return;if(!e.length)return a.hidden=true,void(a.innerHTML="");const r=n.title||ee.importReadErrorsTitle,i=n.open?" open":"",s=e.map(t=>t.text),o=e.map(t=>`
  • ${ae(t.text)}
  • `).join("");a.hidden=false,a.innerHTML=`\n
    \n \n \n ${ae(r)}\n ${e.length}\n \n \n \n
    \n
    \n \n
    \n
      ${o}
    \n
    \n
    \n `;const l=a.querySelector("[data-bdt-errors-copy]");null==l||l.addEventListener("click",async t=>{t.preventDefault(),t.stopPropagation();try{await async function(t){var e;if(null==(e=navigator.clipboard)?void 0:e.writeText)return void(await navigator.clipboard.writeText(t));const n=document.createElement("textarea");n.value=t,n.setAttribute("readonly",""),n.style.position="fixed",n.style.left="-9999px",document.body.appendChild(n),n.select();const a=document.execCommand("copy");if(n.remove(),!a)throw new Error("copy failed")}(s.join("\n")),Ce(ee.importReadErrorsCopied,{type:"success",title:ee.toastCopiedTitle});}catch(e){Ce(ee.importReadErrorsCopyFail,{type:"error",title:ee.toastCopyFailTitle});}});}function xe(t){Te(t,"[data-bdt-import-errors]");}function Te(t,e){const n=t.querySelector(e);n&&(n.hidden=true,n.innerHTML="");}const Fe=Object.freeze({terrible:1,bad:2,mediocre:3,normal:5,good:6,great:7,excellent:8,amazing:10}),Ee=Object.freeze({1:"Terrible",2:"Bad",3:"Mediocre",4:"Mediocre",5:"Normal",6:"Good",7:"Great",8:"Excellent",9:"Excellent",10:"Amazing"});function Ne(t){const e=A(t);if(e)return e;const n=String(t||"").trim().toLowerCase().replace(/\s+/g," ");if(!n)return null;if(Object.prototype.hasOwnProperty.call(f,n))return f[n];for(const[a,r]of Object.entries(b))if(r.toLowerCase()===n)return a;return null}function Ie(t){if(null==t)return true;const e=String(t).trim();if(!e)return true;const n=e.toLowerCase();return "..."===n||"…"===n||"‥"===n||"-"===n||"–"===n||"—"===n||"−"===n||"n/a"===n||"na"===n||"none"===n||"null"===n||"nil"===n||"no rating"===n||"unrated"===n||"?"===n||"??"===n||"x"===n||"."===n||".."===n}function Ae(t){if(null==t||""===t)return null;if("number"==typeof t)return B(t);const e=String(t).trim();if(!e||Ie(e))return null;const n=Fe[e.toLowerCase()];if(null!=n)return n;const a=Number(e.replace(",","."));return Number.isFinite(a)?B(a):null}function Be(t){const e=String(null!=t?t:"").trim().toLowerCase();return !!e&&("yes"===e||"true"===e||"1"===e||"✓"===e||"checked"===e)}function qe(t,e){var n;if(!e)return [];const a=new Map;for(const r of t||[]){const t=String(null!=(n=null==r?void 0:r[e])?n:"").trim();if(!t)continue;const i=t.toLowerCase(),s=a.get(i);s?s.count+=1:a.set(i,{raw:t,count:1});}return [...a.values()].sort((t,e)=>e.count-t.count||t.raw.localeCompare(e.raw))}function Re(t,e){const n=qe(t,e).map(({raw:t,count:e})=>{const n=!function(t){return Boolean(A(t))}(t);return {raw:t,count:e,needsMap:n,suggested:n?Ne(t):A(t)}}),a=n.filter(t=>t.needsMap&&t.suggested).length,r=n.filter(t=>t.needsMap&&!t.suggested).length;return {needed:n.some(t=>t.needsMap),values:n,mappedCount:a,unmappedCount:r}}function De(t,e){const n=qe(t,e).map(({raw:t,count:e})=>{if(Ie(t))return {raw:t,count:e,needsMap:false,suggested:null};const n=!function(t){if(null==t||""===t)return false;if("number"==typeof t)return null!=B(t);const e=String(t).trim();if(!e||/[a-zа-я]/i.test(e))return false;const n=Number(e.replace(",","."));return Number.isFinite(n)&&null!=B(n)}(t);return {raw:t,count:e,needsMap:n,suggested:n?Ae(t):B(Number(String(t).replace(",",".")))}}),a=n.filter(t=>t.needsMap&&null!=t.suggested).length,r=n.filter(t=>t.needsMap&&null==t.suggested).length;return {needed:n.some(t=>t.needsMap),values:n,mappedCount:a,unmappedCount:r}}function Pe(t){const e={};for(const n of t.values||[])e[n.raw]=n.needsMap?n.suggested||"":A(n.raw)||"";return e}function He(t){const e={};for(const n of t.values||[])if(Ie(n.raw))e[n.raw]="";else {if(!n.needsMap){const t=B(Number(String(n.raw).replace(",",".")));e[n.raw]=null!=t?String(t):"";continue}e[n.raw]=null!=n.suggested?String(n.suggested):"";}return e}function Ue(t,e){const n=qe(t,e).map(({raw:t,count:e})=>{var n,a,r,i;const s=!function(t){return null!=F(t)}(t);return {raw:t,count:e,needsMap:s,suggested:s?null!=(a=null==(n=E(t))?void 0:n.id)?a:null:null!=(i=null==(r=F(t))?void 0:r.id)?i:null}}),a=n.filter(t=>t.needsMap&&null!=t.suggested).length,r=n.filter(t=>t.needsMap&&null==t.suggested).length;return {needed:n.some(t=>t.needsMap),values:n,mappedCount:a,unmappedCount:r}}function je(t){const e={};for(const n of t.values||[]){if(!n.needsMap){const t=F(n.raw);e[n.raw]=t?String(t.id):"";continue}e[n.raw]=null!=n.suggested?String(n.suggested):"";}return e}function Oe(t,e){const n=String(t||"").trim();if(!n)return null;if(e&&Object.prototype.hasOwnProperty.call(e,n)){const t=e[n];return t?A(t)||Ne(t):null}if(e){const t=Object.entries(e).find(([t])=>t.toLowerCase()===n.toLowerCase());if(t)return t[1]?A(t[1])||Ne(t[1]):null}return Ne(n)}function Ve(t,e){const n=String(t||"").trim();if(!n)return null;if(e&&Object.prototype.hasOwnProperty.call(e,n)){const t=e[n];return t?B(Number(t)):null}if(e){const t=Object.entries(e).find(([t])=>t.toLowerCase()===n.toLowerCase());if(t)return t[1]?B(Number(t[1])):null}return Ae(n)}function Ge(t,e){const n=String(t||"").trim();if(!n)return null;const a=t=>t?N(t):null;if(e&&Object.prototype.hasOwnProperty.call(e,n))return a(e[n]);if(e){const t=Object.entries(e).find(([t])=>t.toLowerCase()===n.toLowerCase());if(t)return a(t[1])}return E(n)}const ze=Object.freeze([{key:"title",required:true,aliases:["name","title","game","game name","game_title","game title"]},{key:"status",aliases:["status","state","list","shelf","progress"]},{key:"rating",aliases:["rating","score","stars","my rating","user rating"]},{key:"start_date",aliases:["date start","start date","start_date","started","date started","started at","begin"]},{key:"finish_date",aliases:["date end","end date","finish date","finish_date","completed date","date finished","finished","finished at"]},{key:"review",aliases:["review","summary","notes","comment","description","text"]},{key:"platform",aliases:["platform","platforms","system","console","device"]},{key:"favorite",aliases:["favorite","favourite","liked","heart","game_liked","fav"]},{key:"hours",aliases:["time to complete","hours","hours played","playtime","play time","hltb","total hours"]},{key:"game_id",aliases:["game_id","game id","backloggd_id","backloggd id","bg_id","bg id"]},{key:"slug",aliases:["slug","backloggd_slug","backloggd slug"]}]);function We(t){return String(t||"").trim().toLowerCase().replace(/[_/]+/g," ").replace(/\s+/g," ")}function Je(t,e){const n=We(t);if(!n)return 0;let a=0;for(const r of e.aliases){const t=We(r);t&&(n===t?a=Math.max(a,100):n.startsWith(t)||t.startsWith(n)?a=Math.max(a,78):(n.includes(t)||t.includes(n))&&(a=Math.max(a,55)));}return "game_id"!==e.key||"id"!==n&&"row id"!==n?("rating"===e.key&&n.includes("expected")&&(a=Math.min(a,20)),a):0}function Ke(t){const e={};for(const i of ze)e[i.key]="";const n=[];for(const i of ze)for(const e of t){const t=Je(e,i);t>=55&&n.push({field:i,header:e,score:t});}n.sort((t,e)=>e.score-t.score||t.field.key.localeCompare(e.field.key));const a=new Set,r=new Set;for(const i of n)r.has(i.field.key)||a.has(i.header)||(e[i.field.key]=i.header,r.add(i.field.key),a.add(i.header));return e}function Ye(t,e){return e?null==(null==t?void 0:t[e])?"":String(t[e]):""}function Xe(t){const e=String(t||"").trim();if(!e)return null;const n=Number(e.replace(",",".").replace(/[^\d.]/g,""));return Number.isFinite(n)&&n>0?n:null}function Qe(t,e){var n,a,r;const i=t.querySelector("[data-bdt-csv-map]");if(!i)return;const s=e.headers||[],o=e.rows||[],l={...Ke(s),...e.mapping||{}},d=l.status?Re(o,l.status):null,c=l.rating?De(o,l.rating):null,u=l.platform?Ue(o,l.platform):null,p=v(),m=d?Pe(d):{},g=c?He(c):{},f=u?je(u):{},y={status:{...S(m,p.status,(null==d?void 0:d.values)||[]),...(null==(n=e.valueMaps)?void 0:n.status)||{}},rating:{...S(g,p.rating,(null==c?void 0:c.values)||[]),...(null==(a=e.valueMaps)?void 0:a.rating)||{}},platform:{...S(f,p.platform,(null==u?void 0:u.values)||[]),...(null==(r=e.valueMaps)?void 0:r.platform)||{}}},_=ze.filter(t=>l[t.key]).length,C=Boolean(l.title),$=h.map(t=>({value:t,label:b[t]||t})),L=[1,2,3,4,5,6,7,8,9,10].map(t=>({value:String(t),label:`${t} · ${Ee[t]||""} · ${t/2}★`})),x=w.map(t=>({value:String(t.id),label:`${t.name} · ${t.id}`}));i.hidden=false,i.innerHTML=`\n
    \n
    \n
    \n

    ${ae(ee.csvMapTitle)}

    \n

    ${ae(ee.csvMapLead)}

    \n
    \n
    \n ${ae(nn(ee.csvMapFileStat,{file:e.filename||"file.csv"}))}\n ${ae(nn(ee.csvMapRowsStat,{count:o.length}))}\n ${ae(nn(ee.csvMapMappedStat,{mapped:_,total:ze.length}))}\n
    \n
    \n\n
    \n ${ae(ee.csvMapAutoLabel)}\n

    ${ae(C?ee.csvMapAutoOk:ee.csvMapAutoNeedTitle)}

    \n
    \n\n
    \n ${ze.map(t=>function(t,e,n,a){const r=function(t,e,n=3){var a;if(!e)return [];const r=[],i=new Set;for(const s of t){const t=String(null!=(a=null==s?void 0:s[e])?a:"").trim().replace(/\s+/g," ");if(t&&!i.has(t)&&(i.add(t),r.push(t.length>72?`${t.slice(0,69)}…`:t),r.length>=n))break}return r}(n,a),i=a?`${ae(ee.csvMapMapped)}`:t.required?`${ae(ee.csvMapRequired)}`:`${ae(ee.csvMapOptional)}`;return `\n
    \n
    \n ${ae((s=t.key,{title:ee.csvFieldTitle,status:ee.csvFieldStatus,rating:ee.csvFieldRating,start_date:ee.csvFieldStart,finish_date:ee.csvFieldFinish,review:ee.csvFieldReview,platform:ee.csvFieldPlatform,favorite:ee.csvFieldFavorite,hours:ee.csvFieldHours,game_id:ee.csvFieldGameId,slug:ee.csvFieldSlug}[s]||s))}\n ${i}\n
    \n \n
    \n ${r.length?r.map(t=>`${ae(t)}`).join(""):`${ae(ee.csvMapNoSamples)}`}\n
    \n
    \n `;var s;}(t,s,o,l[t.key]||"")).join("")}\n
    \n\n
    \n ${(null==d?void 0:d.needed)?en({kind:"status",title:ee.csvValueStatusTitle,lead:ee.csvValueStatusLead,analysis:d,valueMap:y.status,suggestedMap:m,remembered:p.status,options:$,formatTarget:t=>b[t]||t||ee.csvValueSkip}):""}\n ${(null==c?void 0:c.needed)?en({kind:"rating",title:ee.csvValueRatingTitle,lead:ee.csvValueRatingLead,analysis:c,valueMap:y.rating,suggestedMap:g,remembered:p.rating,options:L,formatTarget:t=>{if(!t)return ee.csvValueSkip;const e=Number(t);return `${e} · ${Ee[e]||""} · ${e/2}★`}}):""}\n ${(null==u?void 0:u.needed)?en({kind:"platform",title:ee.csvValuePlatformTitle,lead:ee.csvValuePlatformLead,analysis:u,valueMap:y.platform,suggestedMap:f,remembered:p.platform,options:x,formatTarget:t=>{if(!t)return ee.csvValueSkip;const e=N(t);return e?e.name:t}}):""}\n
    \n
    \n `,i.querySelectorAll("[data-bdt-csv-field]").forEach(n=>{n.addEventListener("change",()=>{var n;const a=Ze(t),r=v(),i=a.status?Re(o,a.status):null,s=a.rating?De(o,a.rating):null,l=a.platform?Ue(o,a.platform):null,d=tn(t),c={status:i?{...S(Pe(i),r.status,i.values),...d.status}:{},rating:s?{...S(He(s),r.rating,s.values),...d.rating}:{},platform:l?{...S(je(l),r.platform,l.values),...d.platform}:{}};null==(n=e.onChange)||n.call(e,{mapping:a,valueMaps:c}),Qe(t,{...e,mapping:a,valueMaps:c});});}),i.querySelectorAll("[data-bdt-csv-value]").forEach(n=>{n.addEventListener("change",()=>{const a=n.closest("tr"),r=null==a?void 0:a.querySelector(".bdt-csv-vmap__preview"),i=n.getAttribute("data-bdt-csv-value-kind"),s=n.getAttribute("data-bdt-csv-value")||"",o=n.value||"";if(r)if(r.classList.toggle("is-empty",!o),"status"===i)r.textContent=o?b[o]||o:ee.csvValueSkip;else if("rating"===i){const t=Number(o);r.textContent=o?`${t} · ${Ee[t]||""} · ${t/2}★`:ee.csvValueSkip;}else if("platform"===i){const t=o?N(o):null;r.textContent=t?t.name:ee.csvValueSkip;}if(i&&s&&function(t,e,n){(function(t){const e=v(),n={status:{...e.status,...M(null==t?void 0:t.status)},rating:{...e.rating,...M(null==t?void 0:t.rating)},platform:{...e.platform,...M(null==t?void 0:t.platform)}};k(n);})({[t]:{[e]:n}});}(i,s,o),a&&!a.classList.contains("is-native")){a.classList.toggle("is-mapped",Boolean(o)),a.classList.toggle("is-unmapped",!o),a.classList.add("is-manual");const t=a.querySelector("[data-bdt-csv-value-origin]");t&&(t.hidden=false,t.textContent=ee.csvValueManual,t.className="bdt-csv-vmap__origin bdt-csv-vmap__origin--manual");}(()=>{var n;const a=Ze(t),r=tn(t);null==(n=e.onChange)||n.call(e,{mapping:a,valueMaps:r});})();});}),i.querySelectorAll("[data-bdt-csv-value-reset]").forEach(n=>{n.addEventListener("click",a=>{var r;a.preventDefault(),a.stopPropagation();const i=n.getAttribute("data-bdt-csv-value-reset");if("status"!==i&&"rating"!==i&&"platform"!==i)return;const s=n.closest("[data-bdt-csv-vmap-kind]");!function(t,e){const n=v(),a={status:{...n.status},rating:{...n.rating},platform:{...n.platform}};for(const r of e||[]){const e=String(r||"").trim().toLowerCase();e&&delete a[t][e];}k(a);}(i,[...(null==s?void 0:s.querySelectorAll("[data-bdt-csv-value]"))||[]].map(t=>t.getAttribute("data-bdt-csv-value")||"").filter(Boolean));const o=Ze(t),l=tn(t),p={status:{...l.status},rating:{...l.rating},platform:{...l.platform}};"status"===i&&d?p.status=Pe(d):"rating"===i&&c?p.rating=He(c):"platform"===i&&u&&(p.platform=je(u)),null==(r=e.onChange)||r.call(e,{mapping:o,valueMaps:p}),Qe(t,{...e,mapping:o,valueMaps:p});});});}function Ze(t){const e={};for(const n of ze)e[n.key]="";return t.querySelectorAll("[data-bdt-csv-field]").forEach(t=>{const n=t.getAttribute("data-bdt-csv-field");n&&(e[n]=t.value||"");}),e}function tn(t){const e={status:{},rating:{},platform:{}};return t.querySelectorAll("[data-bdt-csv-value]").forEach(t=>{const n=t.getAttribute("data-bdt-csv-value-kind"),a=t.getAttribute("data-bdt-csv-value");"status"!==n&&"rating"!==n&&"platform"!==n||null==a||(e[n][a]=t.value||"");}),e}function en(t){const e=t.analysis.unmappedCount>0,n=e?nn(ee.csvValueUnmappedStat,{count:t.analysis.unmappedCount}):ee.csvValueAllMapped,a=t.analysis.values.filter(e=>_(t.remembered,e.raw)).length;return `\n
    \n \n
    \n \n
    \n

    ${ae(t.title)}

    \n

    ${ae(t.lead)}

    \n
    \n
    \n
    \n ${ae(nn(ee.csvValueUniqueStat,{count:t.analysis.values.length}))}\n ${a?`${ae(nn(ee.csvValueManualStat,{count:a}))}`:""}\n ${ae(n)}\n
    \n
    \n
    \n ${ae(ee.csvValueReset)}\n
    \n
    \n \n \n \n \n \n \n \n \n \n \n ${t.analysis.values.map(e=>{const n=function(t,e){if(Object.prototype.hasOwnProperty.call(t,e))return t[e]||"";const n=Object.entries(t).find(([t])=>t.toLowerCase()===e.toLowerCase());return n&&n[1]||""}(t.valueMap,e.raw),a=t.formatTarget(n),r=_(t.remembered,e.raw);return `\n \n \n \n \n \n \n `}).join("")}\n \n
    ${ae(ee.csvValueColSource)}${ae(ee.csvValueColCount)}${ae(ee.csvValueColTarget)}${ae(ee.csvValueColPreview)}
    \n ${ae(e.raw)}\n ${e.needsMap?`${ae(r?ee.csvValueManual:ee.csvValueAuto)}`:`${ae("rating"===t.kind&&Ie(e.raw)?ee.csvValueNoRating:ee.csvValueNative)}`}\n ${ae(String(e.count))}\n \n \n ${t.options.map(t=>`\n `).join("")}\n \n \n ${ae(a)}\n
    \n
    \n
    \n `}function nn(t,e){return String(t).replace(/\{(\w+)\}/g,(t,n)=>null==e[n]?"":String(e[n]))}let an="all";function rn(t){var e;const n=t.querySelector('[data-bdt-panel="history"]');if(!n)return;const a=W();on(t,a.length);const r="all"===an?a:a.filter(t=>t.kind===an),i=a.filter(t=>"import"===t.kind).length,s=a.filter(t=>"export"===t.kind).length;var o;n.innerHTML=`\n
    \n
    \n
    \n

    ${ae(ee.historyTitle)}

    \n

    ${ae(ee.historyLead)}

    \n
    \n ${ae(ee.historyClear)}\n
    \n\n
    \n ${sn("all",ee.historyFilterAll,a.length)}\n ${sn("import",ee.historyFilterImport,i)}\n ${sn("export",ee.historyFilterExport,s)}\n
    \n\n ${r.length?`
    \n ${r.map(t=>function(t){const e="export"===t.kind?ee.historyKindExport:ee.historyKindImport,n="success"===t.status?ee.historyStatusSuccess:"partial"===t.status?ee.historyStatusPartial:ee.historyStatusFailed,a=function(t){const e=new Date(t);if(Number.isNaN(e.getTime()))return {relative:t||"—",absolute:t||"—"};const n=e.toLocaleString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}),a=Date.now()-e.getTime(),r=6e4,i=36e5,s=24*i;let o;return o=at.title),i=Math.max(0,t.games.length-r.length);return `\n
    \n \n \n \n \n ${ae(t.filename)}\n ${ae(n)}\n \n \n ${ae(e)}\n \n \n \n ${ae(Jt(ee.historyCounts,{ok:t.okCount,fail:t.failCount,total:t.total}))}\n \n ${r.length?`${ae(r.join(", ")+(i?Jt(ee.historyMoreGames,{count:i}):""))}`:""}\n \n \n \n
    \n
    \n
    ${ae(ee.historyFactWhen)}
    ${ae(a.absolute)}
    \n
    ${ae(ee.historyFactSource)}
    ${ae(t.source)}
    \n
    ${ae(ee.historyFactVersion)}
    ${ae(null!=t.formatVersion?`v${t.formatVersion}`:"—")}
    \n ${t.username?`
    ${ae(ee.historyFactUser)}
    ${ae(t.username)}
    `:""}\n
    \n ${t.games.length?`
    \n
    \n ${ae(Jt(ee.historyGamesTitle,{count:t.games.length}))}\n
    \n
      \n ${t.games.map(t=>function(t){const e=t.slug?Lt(`/games/${encodeURIComponent(t.slug)}/`):"",n=e?`${ae(t.title)}`:ae(t.title);return `\n
    • \n \n \n ${n}\n \n ${null!=t.game_id?`ID ${ae(String(t.game_id))}`:""}\n ${!t.ok&&t.error?`${ae(t.error)}`:""}\n \n \n
    • \n `}(t)).join("")}\n
    \n
    `:`

    ${ae(ee.historyNoGames)}

    `}\n
    \n ${ae(ee.historyRemove)}\n
    \n
    \n
    \n `;var s;}(t)).join("")}\n
    `:(o=a.length>0,`\n
    \n \n

    ${ae(o?ee.historyEmptyFilteredTitle:ee.historyEmptyTitle)}

    \n

    ${ae(o?ee.historyEmptyFilteredBody:ee.historyEmptyBody)}

    \n
    \n `)}\n
    \n `,n.querySelectorAll("[data-bdt-history-filter]").forEach(e=>{e.addEventListener("click",()=>{an=e.getAttribute("data-bdt-history-filter")||"all",rn(t);});}),null==(e=n.querySelector("[data-bdt-history-clear]"))||e.addEventListener("click",()=>{a.length&&window.confirm(ee.historyClearConfirm)&&(Y(),rn(t));}),n.querySelectorAll("[data-bdt-history-remove]").forEach(e=>{e.addEventListener("click",n=>{n.preventDefault(),n.stopPropagation();const a=e.getAttribute("data-bdt-history-remove");a&&(function(t){J(W().filter(e=>e.id!==t));}(a),rn(t));});});}function sn(t,e,n){const a=an===t;return `\n \n ${ae(e)}\n ${ae(String(n))}\n \n `}function on(t,e){const n=t.querySelector("[data-bdt-history-badge]");if(!n)return;const a=Number.isFinite(e)?e:W().length;n.textContent=String(a),n.hidden=a<=0;}function ln(e){var n,a,r;const i=e.querySelector('[data-bdt-panel="cache"]');if(!i)return;const s=ft(),o=function(t=80){ct();const e=rt();return Object.entries(e).map(([t,e])=>({key:t,kind:"miss"===(null==e?void 0:e.kind)?"miss":"hit",query:(null==e?void 0:e.query)||t,match:(null==e?void 0:e.match)||null,ts:Number(null==e?void 0:e.ts)||0,at:Number((null==e?void 0:e.at)||(null==e?void 0:e.ts))||0,bytes:mt(t,e)})).sort((t,e)=>e.at-t.at).slice(0,Math.max(1,t))}(100);dn(e,s);const d=Math.max(s.usedBytes,s.limitBytes,1),c=ht(s.foundBytes,d),u=ht(s.missBytes,d),p=ht(s.historyBytes,d),m=ht(s.mapsBytes,d),g=ht(s.settingsBytes,d),h=ht(s.freeBytes,d),b=Math.round(ht(s.usedBytes,s.limitBytes));i.innerHTML=`\n
    \n
    \n
    \n

    ${ae(ee.cacheTitle)}

    \n

    ${ae(ee.cacheLead)}

    \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n
    \n
    \n ${ae(ee.cacheMeterLabel)}\n ${ae(Jt(ee.cacheBarUsed,{used:gt(s.usedBytes),limit:gt(s.limitBytes)}))}\n
    \n
    \n =70?"is-mid":""}">${ae(Jt(ee.cacheBarPct,{pct:b}))}\n ${ae(ee.cacheBarPctLabel)}\n
    \n
    \n \n \n \n \n \n \n \n
    \n
      \n ${cn("found",ee.cacheBarFound,s.foundCount,s.foundBytes)}\n ${cn("miss",ee.cacheBarMiss,s.missCount,s.missBytes)}\n ${cn("history",ee.cacheBarHistory,s.historyCount,s.historyBytes)}\n ${cn("maps",ee.cacheBarMaps,null,s.mapsBytes)}\n ${cn("settings",ee.cacheBarSettings,null,s.settingsBytes)}\n ${cn("free",ee.cacheBarFree,null,s.freeBytes)}\n
    \n

    ${ae(ee.cacheBarHint)}

    \n \n\n
    \n ${un(ee.cacheStatGames,String(s.gamesCount),gt(s.gamesBytes))}\n ${un(ee.cacheStatFound,String(s.foundCount),gt(s.foundBytes))}\n ${un(ee.cacheStatMiss,String(s.missCount),gt(s.missBytes))}\n ${un(ee.cacheStatUpdated,s.newestAt?mn(s.newestAt):"—",ee.cacheStatUpdatedHint)}\n
    \n\n
    \n
    \n

    ${ae(ee.cacheListTitle)}

    \n

    ${ae(Jt(ee.cacheListMeta,{shown:o.length,total:s.gamesCount}))}

    \n
    \n ${o.length?`
    \n \n \n \n \n \n \n \n \n \n \n \n \n ${o.map(pn).join("")}\n \n
    ${ae(ee.cacheColQuery)}${ae(ee.cacheColKind)}${ae(ee.cacheColMatch)}${ae(ee.cacheColId)}${ae(ee.cacheColWhen)}${ae(ee.cacheColSize)}
    \n
    `:`
    \n

    ${ae(ee.cacheEmptyTitle)}

    \n

    ${ae(ee.cacheEmptyLead)}

    \n
    `}\n
    \n \n `,null==(n=i.querySelector("[data-bdt-cache-clear]"))||n.addEventListener("click",()=>{if(!window.confirm(ee.cacheClearGamesConfirm))return;const t=pt();Ce(Jt(ee.cacheCleared,{count:t}),{type:"success",title:ee.cacheClearGames}),ln(e);}),null==(a=i.querySelector("[data-bdt-cache-clear-all]"))||a.addEventListener("click",()=>{if(!window.confirm(ee.cacheClearAllConfirm))return;const n=function(){const e=pt();let n=0;try{const e=t(l,[]);n=Array.isArray(e)?e.length:0;}catch(a){n=0;}return Y(),k({status:{},rating:{},platform:{}}),{games:e,history:n}}();Ce(Jt(ee.cacheAllCleared,{games:n.games,history:n.history}),{type:"success",title:ee.cacheClearAll}),on(e),ln(e);}),null==(r=i.querySelector("[data-bdt-cache-clear-misses]"))||r.addEventListener("click",()=>{const t=function(){var t;const e=rt();let n=0;for(const a of Object.keys(e))"miss"===(null==(t=e[a])?void 0:t.kind)&&(delete e[a],n+=1);return n&&st(),n}();Ce(Jt(ee.cacheMissesCleared,{count:t}),{type:"success",title:ee.cacheClearMisses}),ln(e);});}function dn(t,e){const n=t.querySelector("[data-bdt-cache-badge]");if(!n)return;let a;if("number"==typeof e&&Number.isFinite(e))a=Math.round(Math.max(0,Math.min(100,e)));else {const t=e&&"object"==typeof e?e:ft();a=Math.round(ht(t.usedBytes,t.limitBytes));}n.hidden=false,n.textContent=Jt(ee.cacheTabBadge,{pct:a}),n.title=Jt(ee.cacheBarPctTitle,{pct:a}),n.classList.toggle("is-mid",a>=70&&a<90),n.classList.toggle("is-high",a>=90);}function cn(t,e,n,a){const r=null==n?gt(a):Jt(ee.cacheBarLegend,{count:n,size:gt(a)});return `\n
  • \n \n ${ae(e)}\n ${ae(r)}\n
  • \n `}function un(t,e,n){return `\n
    \n

    ${ae(t)}

    \n ${ae(e)}\n

    ${ae(n)}

    \n
    \n `}function pn(t){var e,n,a;const r="miss"===t.kind?ee.cacheKindMiss:ee.cacheKindHit,i=(null==(e=t.match)?void 0:e.title)||"—",s=(null==(n=t.match)?void 0:n.slug)?`${ae(i)}`:ae(i),o=null!=(null==(a=t.match)?void 0:a.id)?String(t.match.id):"—";return `\n \n ${ae(t.query)}\n ${ae(r)}\n ${s}\n ${ae(o)}\n ${ae(mn(t.at))}\n ${ae(gt(t.bytes))}\n \n `}function mn(t){if(!t)return "—";try{return new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}).format(new Date(t))}catch(e){return new Date(t).toLocaleString()}}let gn="idle",hn=[],bn=new Set,fn="",yn=null,vn=null,_n=false,Sn="count",kn="",Cn=null;function Mn(t){const e=t.querySelector('[data-bdt-panel="cleanup"]');if(!e)return;const n=z()||fn;if(n&&n!==fn&&(fn=n,bn=new Set),!St())return e.innerHTML=`\n
    \n
    \n \n

    ${ae(ee.cleanupNeedLoginTitle)}

    \n

    ${ae(ee.cleanupNeedLoginBody)}

    \n \n ${ae(ee.cleanupNeedLoginCta)}\n \n
    \n
    \n `,void wn(t,0);const a=$n();wn(t,a.length),e.innerHTML=`\n
    \n
    \n
    \n

    ${ae(ee.cleanupTitle)}

    \n

    ${ae(ee.cleanupLead)}

    \n
    \n
    \n ${"scanning"===gn?``:``}\n
    \n
    \n\n ${function(t){var e,n;if("scanning"===gn)return `\n
    \n
    \n \n ${ae(ee.cleanupScanningLibrary)}\n 0%\n
    \n \n
    \n
    \n
    \n

    \n
    \n `;if("error"===gn)return `\n
    \n \n

    ${ae(ee.cleanupErrorTitle)}

    \n

    ${ae(vn||ee.cleanupErrorBody)}

    \n \n
    \n `;if("idle"===gn)return `\n
    \n \n
    \n

    ${ae(ee.cleanupIdleTitle)}

    \n

    ${ae(ee.cleanupIdleBody)}

    \n
    \n
      \n
    • ${ae(ee.cleanupIdleStep1)}
    • \n
    • ${ae(ee.cleanupIdleStep2)}
    • \n
    • ${ae(ee.cleanupIdleStep3)}
    • \n
    \n
    \n `;const a=hn.filter(t=>bn.has(t.slug)).length,r=yn;return hn.length?`\n
    \n
    \n \n ${ae(String(hn.length))}\n ${ae(ee.cleanupStatMulti)}\n \n \n ${ae(Jt(ee.cleanupStatScanned,{count:null!=(n=null==r?void 0:r.scanned)?n:0}))}\n \n ${a?`\n ${ae(Jt(ee.cleanupStatHidden,{count:a}))}\n `:""}\n ${(null==r?void 0:r.errors)?`\n ${ae(Jt(ee.cleanupStatErrors,{count:r.errors}))}\n `:""}\n
    \n
    \n \n
    \n ${ae(ee.cleanupSortCount)}\n ${ae(ee.cleanupSortTitle)}\n
    \n
    \n
    \n\n ${t.length?`
    \n ${t.map(Ln).join("")}\n
    `:`
    \n

    ${ae(ee.cleanupFilteredTitle)}

    \n

    ${ae(ee.cleanupFilteredBody)}

    \n ${a?``:""}\n
    `}\n `:`\n
    \n \n

    ${ae(ee.cleanupEmptyTitle)}

    \n

    ${ae(Jt(ee.cleanupEmptyBody,{scanned:null!=(e=null==r?void 0:r.scanned)?e:0}))}

    \n
    \n `}(a)}\n
    \n `,function(t,e){var n,a,r;null==(n=e.querySelector("[data-bdt-cleanup-scan]"))||n.addEventListener("click",()=>{!async function(t){if("scanning"!==gn)if(St()){_n=false,gn="scanning",hn=[],yn=null,vn=null,fn=z()||fn,kn="",Cn=null,Mn(t);try{const e=await async function(t={}){var e;const n=z();if(!n)throw new Error("Not logged in — cannot scan multi-log games");const a=Math.max(2,Number(t.minLogs)||2),r=Math.max(1,Math.min(8,Math.floor(Number.isFinite(t.concurrency)?Number(t.concurrency):4))),i=await Nt({concurrency:r,onProgress:e=>{var n,a;null==(a=t.onProgress)||a.call(t,{phase:"library",listIndex:e.listIndex,listTotal:e.listTotal,page:e.page,list:e.list,pagesDone:e.pagesDone,concurrency:null!=(n=e.concurrency)?n:r,activeLists:e.activeLists,multiFound:0});},shouldCancel:t.shouldCancel});if(null==(e=t.shouldCancel)?void 0:e.call(t))return {username:n,scanned:0,skippedNoSlug:0,errors:0,games:[]};const s=(i.games||[]).filter(t=>t.slug),o=Math.max(0,(i.games||[]).length-s.length),l=[];let d=0,c=0;const u=new Map;return await vt(s.length,r,async e=>{var i,o,p,m;if(null==(i=t.shouldCancel)?void 0:i.call(t))return;const g=s[e],h=g.title||g.slug;u.set(e,h||`#${e+1}`),null==(o=t.onProgress)||o.call(t,{phase:"probe",index:e,total:s.length,done:c,title:h,multiFound:l.length,concurrency:r,activeTitles:[...u.values()]});try{const t=await qt({gameId:g.gameId,slug:g.slug,username:n});t.exists&&t.logCount>=a&&l.push({gameId:g.gameId,slug:g.slug,title:g.title||g.slug,coverUrl:g.coverUrl,logCount:t.logCount,gameStatus:t.gameStatus||null,logs:t.logs,logUrl:t.logUrl});}catch(b){d+=1;}finally{u.delete(e);}c+=1,null==(p=t.onProgress)||p.call(t,{phase:"probe",index:e,total:s.length,done:c,title:h,multiFound:l.length,concurrency:r,activeTitles:[...u.values()]}),(null==(m=t.shouldCancel)?void 0:m.call(t))||await yt(196,{minFactor:.75,maxFactor:1.5,pauseChance:.06,pauseMinMs:120,pauseMaxMs:450});},{shouldCancel:t.shouldCancel}),l.sort((t,e)=>e.logCount!==t.logCount?e.logCount-t.logCount:t.title.localeCompare(e.title,void 0,{sensitivity:"base"})),{username:n,scanned:s.length,skippedNoSlug:o,errors:d,games:l}}({concurrency:Zt.matchConcurrency,shouldCancel:()=>_n,onProgress:e=>function(t,e){const n=t.querySelector("[data-bdt-cleanup-progress-label]"),a=t.querySelector("[data-bdt-cleanup-progress-pct]"),r=t.querySelector("[data-bdt-cleanup-progress-fill]"),i=t.querySelector("[data-bdt-cleanup-progress-meta]"),s=t.querySelector("[data-bdt-cleanup-progress-active]");if(!n||!a||!r)return;let o=0,l=ee.cleanupScanningLibrary,d="";const c=Math.max(0,Number(e.concurrency)||0),u=[];if("library"===e.phase){const t=Math.max(1,e.listTotal||1),n=Number(e.pagesDone)||0,a=Array.isArray(e.activeLists)?e.activeLists.length:0,r=e.listIndex||0;o=n>0||a>0?Math.min(28,Math.round((n+.35)/Math.max(n+a+1,t)*28)):Math.min(28,Math.round((r+.35)/t*28)),l=c>1?Jt(ee.cleanupScanningLibraryParallel,{done:n,active:Math.min(c,a||c)}):Jt(ee.cleanupScanningShelf,{list:e.list||"",page:e.page||1}),d=Jt(ee.cleanupScanningShelfMeta,{index:r+1,total:t}),Array.isArray(e.activeLists)&&u.push(...e.activeLists);}else {const t=Math.max(1,e.total||1),n=Number.isFinite(e.done)?Number(e.done):(e.index||0)+1;o=28+Math.round(n/t*72),l=c>1?Jt(ee.cleanupScanningGameParallel,{current:n,total:t,active:Math.min(c,Array.isArray(e.activeTitles)?e.activeTitles.length:c)}):Jt(ee.cleanupScanningGame,{title:e.title||"",index:n,total:t}),d=Jt(ee.cleanupScanningGameMeta,{found:e.multiFound||0}),Array.isArray(e.activeTitles)&&u.push(...e.activeTitles);}n.textContent=l,a.textContent=`${o}%`,r.style.width=`${o}%`,i&&(i.textContent=d),s&&(u.length?(s.hidden=!1,s.innerHTML=u.slice(0,6).map(t=>`${ae(t)}`).join("")):(s.hidden=!0,s.innerHTML=""));}(t,e)});if(_n)return gn=hn.length||e.games.length?"done":"idle",e.games.length&&(hn=e.games,yn={scanned:e.scanned,skippedNoSlug:e.skippedNoSlug,errors:e.errors},gn="done"),Ce(ee.cleanupCancelled,{type:"warning",title:ee.cleanupCancel}),void Mn(t);hn=e.games,yn={scanned:e.scanned,skippedNoSlug:e.skippedNoSlug,errors:e.errors},gn="done",Mn(t),Ce(hn.length?Jt(ee.cleanupDoneFound,{count:hn.length}):Jt(ee.cleanupDoneNone,{scanned:e.scanned}),{type:hn.length?"warning":"success",title:ee.cleanupTitle});}catch(e){vn=e instanceof Error?e.message:String(e),gn="error",Mn(t),Ce(vn,{type:"error",title:ee.cleanupErrorTitle});}}else Mn(t);}(t);}),null==(a=e.querySelector("[data-bdt-cleanup-cancel]"))||a.addEventListener("click",()=>{_n=true;}),null==(r=e.querySelector("[data-bdt-cleanup-unhide]"))||r.addEventListener("click",()=>{bn=new Set,Mn(t);}),e.querySelectorAll("[data-bdt-cleanup-sort]").forEach(e=>{e.addEventListener("click",()=>{Sn="title"===e.getAttribute("data-bdt-cleanup-sort")?"title":"count",Mn(t);});});const i=e.querySelector("[data-bdt-cleanup-search]");null==i||i.addEventListener("input",()=>{if(kn=i.value||"",!e.querySelector("[data-bdt-cleanup-list]"))return void Mn(t);const n=i.selectionStart;Mn(t);const a=t.querySelector("[data-bdt-cleanup-search]");if(a instanceof HTMLInputElement){a.focus();const t=null==n?a.value.length:n;a.setSelectionRange(t,t);}}),e.querySelectorAll("[data-bdt-cleanup-hide]").forEach(e=>{e.addEventListener("click",n=>{n.preventDefault(),n.stopPropagation();const a=e.getAttribute("data-bdt-cleanup-hide");a&&(bn.add(a),Cn===a&&(Cn=null),Mn(t),Ce(ee.cleanupHiddenToast,{type:"success",title:ee.cleanupHide}));});}),e.querySelectorAll("[data-bdt-cleanup-card]").forEach(e=>{var n;const a=e.getAttribute("data-bdt-cleanup-slug");a&&(null==(n=e.querySelector("[data-bdt-cleanup-toggle]"))||n.addEventListener("click",e=>{e.target.closest("[data-bdt-cleanup-stop]")||(e.preventDefault(),Cn=Cn===a?null:a,Mn(t));}));});}(t,e);}function wn(t,e){const n=t.querySelector("[data-bdt-cleanup-badge]");if(!n)return;const a="number"==typeof e?e:$n().length;if("done"!==gn||a<=0)return n.hidden=true,void(n.textContent="0");n.hidden=false,n.textContent=String(a),n.title=Jt(ee.cleanupBadgeTitle,{count:a});}function $n(){let t=hn.filter(t=>!bn.has(t.slug));const e=kn.trim().toLowerCase();return e&&(t=t.filter(t=>t.title.toLowerCase().includes(e)||t.slug.includes(e)||t.logs.some(t=>t.title.toLowerCase().includes(e)))),t="title"===Sn?[...t].sort((t,e)=>t.title.localeCompare(e.title,void 0,{sensitivity:"base"})):[...t].sort((t,e)=>e.logCount!==t.logCount?e.logCount-t.logCount:t.title.localeCompare(e.title,void 0,{sensitivity:"base"})),t}function Ln(t){const e=Cn===t.slug,n=t.coverUrl?``:'',a=t.logUrl||(fn&&t.slug?Lt(`/u/${encodeURIComponent(fn)}/logs/${encodeURIComponent(t.slug)}/`):t.slug?Lt(`/games/${encodeURIComponent(t.slug)}/`):"#"),r=t.logs.slice(0,6).map(t=>`${ae(t.title||"Log")}`).join(""),i=t.logs.length>6?`${ae(Jt(ee.cleanupMoreLogs,{count:t.logs.length-6}))}`:"";return `\n \n
    \n \n
    \n
    \n

    ${ae(t.title)}

    \n ${ae(Jt(ee.cleanupLogCount,{count:t.logCount}))}\n
    \n ${t.gameStatus?`

    ${ae(Jt(ee.cleanupGameStatus,{status:t.gameStatus}))}

    `:""}\n
    ${r}${i}
    \n
    \n \n ${ae(e?ee.cleanupCollapse:ee.cleanupExpand)}\n \n \n \n ${ae(ee.cleanupOpenLogs)}\n \n ${ae(ee.cleanupHide)}\n
    \n
    \n \n
    \n
    \n
    \n

    ${ae(Jt(ee.cleanupDrawerTitle,{count:t.logs.length}))}

    \n

    ${ae(ee.cleanupDrawerHint)}

    \n
    \n
    \n ${t.logs.map((t,e)=>function(t,e){const n=[];return null!=t.rating&&n.push(Jt(ee.cleanupLogRating,{rating:xn(t.rating)})),t.platform&&n.push(t.platform),t.datesLabel?n.push(t.datesLabel):(t.startDate||t.finishDate)&&n.push([t.startDate,t.finishDate].filter(Boolean).join(" → ")),`\n
    \n
    \n
    ${ae(String(e+1))}
    \n
    \n

    ${ae(t.title||"Log")}

    \n ${n.length?`

    ${ae(n.join(" · "))}

    `:`

    ${ae(ee.cleanupLogNoMeta)}

    `}\n ${(t.badges||[]).length?`
    ${t.badges.map(t=>`${ae(t)}`).join("")}
    `:""}\n
    \n
    \n
    \n `}(t,e)).join("")}\n
    \n
    \n \n `}function xn(t){const e=Number(t);return Number.isFinite(e)?Number.isInteger(e)?String(e):e.toFixed(1):String(t)}function Tn(t,e={}){const n=t.querySelector('[data-bdt-panel="settings"]');if(!n)return;const a=[``,...Gt.map(t=>{const e=zt[t]||t,n=Zt.uiLocale===t?" selected":"";return ``})].join("");n.innerHTML=`\n
    \n
    \n

    ${ae(ee.settingsTitle)}

    \n

    ${ae(ee.settingsLead)}

    \n
    \n\n
    \n \n\n \n\n \n\n
    \n \n ${ae(ee.settingsDebugModeHint)}\n
    \n
    \n
    \n `,function(t,e){var n,a,r,i;const s=t.closest(".bdt-panel-backdrop")||t,o=(t,{reloadLocale:n=false}={})=>{var a,r;Qt({...Zt,...t}),ne(),n?null==(a=e.onLocaleChange)||a.call(e):(Ce(ee.settingsSaved,{type:"success",title:ee.settingsSavedTitle}),null==(r=e.onSettingsChange)||r.call(e,Zt),Tn(s,e));};null==(n=t.querySelector('[data-bdt-setting="uiLocale"]'))||n.addEventListener("change",t=>{o({uiLocale:t.target.value||"auto"},{reloadLocale:true});}),null==(a=t.querySelector('[data-bdt-setting="importDelayMs"]'))||a.addEventListener("change",t=>{const e=Number(t.target.value);o({importDelayMs:e});}),null==(r=t.querySelector('[data-bdt-setting="matchConcurrency"]'))||r.addEventListener("change",t=>{const e=Number(t.target.value);o({matchConcurrency:e});}),null==(i=t.querySelector('[data-bdt-setting="debugMode"]'))||i.addEventListener("change",t=>{const e=Boolean(t.target.checked);o({debugMode:e});});}(n,e);}const Fn="bdt-panel-backdrop",En="bdt-nav-transfer";let Nn=null,In=null,An=null,Bn=null,qn=null,Rn={},Dn={status:{},rating:{},platform:{}},Pn="json",Hn=null,Un=0,jn="file",On=false,Vn=false,Gn=false;function zn(t){Nn=null,In=null,An=null,On=false,Vn=false,Gn=false,Un+=1,function(t){const e=t.querySelector("[data-bdt-csv-map]");e&&(e.hidden=true,e.innerHTML="");}(t);const e=t.querySelector("[data-bdt-summary]");e&&(e.hidden=true,e.innerHTML=""),function(t){Te(t,"[data-bdt-errors]");}(t),xe(t),function(t){const e=t.querySelector("[data-bdt-debug-library]");e&&(e.hidden=true,e.innerHTML="");}(t);const n=t.querySelector("[data-bdt-import-auth]");n&&(n.hidden=true);const a=t.querySelector("[data-bdt-match-table]");a&&(a.hidden=true,a.innerHTML=""),fe(t,{visible:false});const r=t.querySelector("[data-bdt-log]");r&&(r.hidden=true,r.textContent="");const i=t.querySelector("[data-bdt-import-status]");i&&(i.innerHTML="");}function Wn(t,e){var n;jn=e;const a="importing"===e||"done"===e?"import":"reading"===e?"reading":e;t.querySelectorAll("[data-bdt-stage]").forEach(t=>{const e=t.getAttribute("data-bdt-stage")===a;t.hidden=!e,t.classList.toggle("is-active",e),e&&(t.classList.remove("is-enter"),t.classList.add("is-enter"));});const r={file:"file",mapping:"mapping",reading:"review",review:"review",importing:"import",done:"import"}[e],i="csv"===Pn;t.querySelectorAll("[data-bdt-step]").forEach(t=>{var n;const a=t.getAttribute("data-bdt-step");"mapping"===a&&(null==(n=t.closest(".bdt-steps__item"))||n.toggleAttribute("hidden",!i));const s="file"===a&&"file"!==e||"mapping"===a&&("reading"===e||"review"===e||"importing"===e||"done"===e)||"review"===a&&("importing"===e||"done"===e)||"import"===a&&"done"===e,o=a===r;t.classList.toggle("is-current",o),t.classList.toggle("is-done",s&&!o),t.classList.toggle("is-busy","reading"===e&&"review"===a||"mapping"===e&&"mapping"===a);let l="file"===a;"mapping"===a&&(l=i&&(On||"mapping"===e)),"review"===a&&(l=Vn||"reading"===e||"review"===e),"import"===a&&(l=Gn||"importing"===e||"done"===e),"reading"!==e&&"importing"!==e||(l=a===r||"file"===a||"mapping"===a&&i,"importing"===e&&"review"===a&&(l=true),"importing"===e&&"mapping"===a&&i&&(l=true)),t.disabled=!l,t.setAttribute("aria-current",o?"step":"false");}),null==(n=t.querySelector("[data-bdt-steps]"))||n.classList.toggle("has-mapping",i);const s=t.querySelector('[data-bdt-step-index="review"]'),o=t.querySelector('[data-bdt-step-index="import"]');s&&(s.textContent=i?"3":"2"),o&&(o.textContent=i?"4":"3");const l=t.querySelector(".bdt-panel__body");l&&(l.scrollTop=0);}function Jn(t){qn=null,Rn={},Dn={status:{},rating:{},platform:{}},zn(t),Wn(t,"file"),ra(t);}function Kn(t){"csv"===Pn&&qn?(Nn=null,In=null,An=null,Vn=false,Gn=false,On=true,Qe(t,{headers:qn.headers,rows:qn.rows,mapping:Rn,valueMaps:Dn,filename:null==Bn?void 0:Bn.name,onChange(t){Rn=t.mapping,Dn=t.valueMaps;}}),Wn(t,"mapping")):Jn(t);}function Yn(t){Vn&&Nn?(Wn(t,"review"),ca(t)):Jn(t);}function Xn(t){Gn=true,Wn(t,"done");const e=t.querySelector("[data-bdt-import-status]");e&&(e.hidden=true,e.innerHTML=""),function(t){const e=t.querySelector("[data-bdt-log]");e&&(e.hidden=true,e.className="bdt-import-log",e.innerHTML="");}(t),xe(t);}function Qn(t,e){Xn(t);const n=t.querySelector("[data-bdt-import-auth]");n&&(n.hidden=false,n.innerHTML=`\n \n

    ${ae(e.title)}

    \n

    ${ae(e.body)}

    \n ${e.detail?`

    ${ae(e.detail)}

    `:""}\n ${ae(ee.importSignIn)}\n `),Ce(e.body,{type:"error",title:e.title});}async function Zn(t,e){var n;const a=t.querySelector("[data-bdt-import-auth]"),r=t.querySelector("[data-bdt-import-status]"),i=t.querySelector("[data-bdt-import]");i&&(i.disabled=true),Gn=true,xe(t),Wn(t,"importing"),a&&(a.hidden=true,a.innerHTML="");const s=e.entries.length;r&&(r.hidden=false,r.innerHTML=`\n \n

    ${ae(ee.importStepImportingTitle)}

    \n

    ${ae(Jt(ee.importStepImportingLead,{count:s}))}

    \n `),function(t,e){const n=t.querySelector("[data-bdt-log]");if(!n)return null;const a=Math.max(0,Number(e.total)||0);n.hidden=false,n.className="bdt-import-log",n.innerHTML=`\n
    \n
    \n ${ae(ee.importLogNowLabel)}\n 0 / ${ae(String(a))}\n
    \n ${ae(ee.importLogWaiting)}\n

    ${ae(Jt(ee.importLogNowHint,{count:a}))}

    \n \n
    \n\n
    \n
    \n
    \n
    \n 0%\n
    \n\n
    \n ${ce("ok",0,ee.importLogStatOk)}\n ${ce("fail",0,ee.importLogStatFail)}\n ${ce("skip",0,ee.importLogStatSkip)}\n ${ce("left",a,ee.importLogStatLeft)}\n
    \n\n \n\n
      \n `;}(t,{total:s});const o={ok:0,fail:0,skip:0,total:s},l=performance.now();try{const a=await async function(t,e={}){const n=(null==t?void 0:t.entries)||[],a=n.length,r=!0===e.dryRun,i=!0===e.importExisting,s=e.library||null,o=Number.isFinite(e.delayMs)?Math.max(0,e.delayMs):800,l=Math.max(1,Math.min(8,Math.floor(Number.isFinite(e.concurrency)?Number(e.concurrency):4))),d=new Array(a);let c=0;const u=new Map;let p,m;if(!r&&a>0)try{if(p=await Mt(),m=kt(),!m)return {results:[{ok:!1,error:"CSRF token not found on page — refresh and try again"}],okCount:0,failCount:1,skipCount:0,total:a,dryRun:r}}catch(y){return {results:[{ok:!1,error:y instanceof Error?y.message:String(y)}],okCount:0,failCount:1,skipCount:0,total:a,dryRun:r}}await vt(a,l,async t=>{var g,h,b,f;if(null==(g=e.shouldCancel)?void 0:g.call(e))return;const v=n[t],_=V(v)||`#${t+1}`;let S;u.set(t,_),null==(h=e.onItemStart)||h.call(e,{index:t,total:a,done:c,entry:v,activeTitles:[...u.values()],concurrency:l});try{S=await async function(t,e){if(null==t.game_id)return {ok:!1,skipped:!0,error:"no match from read step"};if(!e.importExisting&&!e.dryRun){let n=It(t.game_id,t.slug,e.library);if(!n)try{n=(await Bt({gameId:t.game_id,slug:t.slug,username:z()})).exists,n&&At(e.library,{gameId:t.game_id,slug:t.slug});}catch(r){}if(n)return {ok:!1,skipped:!0,error:"already in library"}}const n={slug:t.slug||"",title:V(t),url:"",game_id:t.game_id};let a=await Tt(t,{dryRun:e.dryRun,resolved:n,userId:e.userId,csrfToken:e.csrfToken});if(!a.ok&&429===a.status){const r=Number(e.delayMs)||800;await yt(Math.max(3*r,3500),{minFactor:.9,maxFactor:1.4,pauseChance:.25,pauseMinMs:800,pauseMaxMs:2500}),a=await Tt(t,{dryRun:e.dryRun,resolved:n,userId:e.userId,csrfToken:kt()||e.csrfToken});}return a}(v,{dryRun:r,importExisting:i,library:s,userId:p,csrfToken:m,delayMs:o}),S.ok&&At(s,{gameId:v.game_id,slug:v.slug});}catch(y){S={ok:!1,error:y instanceof Error?y.message:String(y)};}finally{u.delete(t);}d[t]=S,c+=1,null==(b=e.onProgress)||b.call(e,{index:t,total:a,done:c,entry:v,result:S,activeTitles:[...u.values()],concurrency:l}),o&&!(null==(f=e.shouldCancel)?void 0:f.call(e))&&await yt(o,{minFactor:.75,maxFactor:1.5,pauseChance:.08,pauseMinMs:Math.min(200,o),pauseMaxMs:Math.max(o,400)});},{shouldCancel:e.shouldCancel});const g=d.filter(t=>null!=t),h=g.filter(t=>t.ok).length,b=g.filter(t=>!t.ok&&t.skipped).length,f=g.filter(t=>!t.ok&&!t.skipped).length;return {results:d.map(t=>null!=t?t:{ok:!1,skipped:!0,error:"cancelled"}),okCount:h,failCount:f,skipCount:b+Math.max(0,a-g.length),total:a,dryRun:r}}(e,{dryRun:!1,delayMs:Zt.importDelayMs,concurrency:Zt.matchConcurrency,importExisting:!0===Zt.importExisting,library:In,onItemStart({index:e,total:n,done:a,entry:r,activeTitles:i,concurrency:s}){se(t,{index:e,total:n,done:a,title:V(r),activeTitles:i,concurrency:s});},onProgress({index:e,total:n,done:a,entry:r,result:i,activeTitles:s,concurrency:l}){const d=V(r);let c="fail";i.ok?(c="ok",o.ok+=1):i.skipped?(c="skip",o.skip+=1):o.fail+=1,function(t,e){var n;const a=t.querySelector("[data-bdt-log]");if(!a||a.hidden)return;const r=a.querySelector("[data-bdt-import-list]");if(r){const t=document.createElement("li");t.className=`bdt-import-log__item is-${e.kind}`,t.innerHTML=`\n #${ae(String(e.index+1))}\n ${ae(e.title||"—")}\n ${ae(function(t,e){if("ok"===t)return ee.importLogOk;if("skip"===t){const t="already in library"===e?ee.importLogSkipExisting:e||"";return t?Jt(ee.importLogSkipDetail,{reason:t}):ee.importLogSkip}return "fail"===t?e?Jt(ee.importLogFail,{error:e}):ee.importLogFailGeneric:t}(e.kind,e.detail))}\n `,r.appendChild(t),r.scrollTop=r.scrollHeight;}le(a,e.counts),de(a,e.counts),se(t,{index:e.index,total:e.total,done:null!=(n=e.done)?n:e.counts.ok+e.counts.fail+e.counts.skip,title:e.title,activeTitles:e.activeTitles,concurrency:e.concurrency});}(t,{index:e,total:n,done:a,title:d,kind:c,detail:i.error||"",counts:{...o},activeTitles:s,concurrency:l});}}),r=Math.round(performance.now()-l);o.ok=a.okCount,o.fail=a.failCount,o.skip=Number(a.skipCount)||0,o.total=null!=(n=a.total)?n:s,o.elapsedMs=r,a.elapsedMs=r,Wn(t,"done"),oe(t,o),function(t,e,n){const a=t.querySelector("[data-bdt-import-status]");if(!a)return;const r=t.querySelector("[data-bdt-import-auth]");r&&(r.hidden=!0);const i=Number(e.skipCount)||0,s=0===e.failCount&&0===i,o=0===e.okCount&&e.failCount>0,l=s?"bdt-stage__orb--done":o?"bdt-stage__orb--fail":"bdt-stage__orb--warn",d=s?ee.importDoneTitle:o?ee.importFailedTitle:ee.importPartialTitle,c=Jt(ee.importDoneWithSkip,{ok:e.okCount,fail:e.failCount,skip:i}),u=null!=e.elapsedMs?Jt(ee.importElapsedLabel,{time:ie(e.elapsedMs)}):"";a.hidden=!1,a.innerHTML=`\n \n

      ${ae(d)}

      \n

      ${ae(c)}

      \n ${u?`

      ${ae(u)}

      `:""}\n `,$e(t,function(t,e){const n=[];return (t||[]).forEach((t,a)=>{if((null==t?void 0:t.ok)||(null==t?void 0:t.skipped))return;const r=V(e[a])||`#${a+1}`,i=(null==t?void 0:t.error)||"fail";n.push({kind:"error",index:a,title:r,detail:i,text:Jt(ee.importIssueError,{index:a+1,title:r,error:i})});}),n}(e.results||[],n));}(t,a,e.entries);try{((function(t){var e,n,a,r,i;const s=Array.isArray(null==(e=t.summary)?void 0:e.results)?t.summary.results:[],o=(t.entries||[]).map((t,e)=>{var n;const a=s[e]||{};return {title:V(t)||`#${e+1}`,game_id:null!=(n=null==t?void 0:t.game_id)?n:null,slug:(null==t?void 0:t.slug)||"",ok:Boolean(a.ok),error:a.ok?void 0:String(a.error||"")}}),l=Number(null==(n=t.summary)?void 0:n.okCount)||o.filter(t=>t.ok).length,d=Number(null==(a=t.summary)?void 0:a.failCount)||o.filter(t=>!t.ok).length,c=o.length||l+d;(function(t){const e=Z({...t,id:t.id||Q(),at:t.at||(new Date).toISOString(),username:t.username||z()||""});if(!e)throw new Error("Invalid history entry");J([e,...W().filter(t=>t.id!==e.id)]);})({kind:"import",filename:String(t.filename||"").trim()||"transfer.json",source:K(null==(r=t.doc)?void 0:r.source),formatVersion:null!=(null==(i=t.doc)?void 0:i.version)?Number(t.doc.version):null,okCount:l,failCount:d,total:c,status:X(l,d),games:o});}))({filename:(null==Bn?void 0:Bn.name)||"",doc:e,summary:a,entries:e.entries}),on(t);}catch(d){}const i=0===a.failCount&&0===o.skip?"success":0===a.okCount&&a.failCount>0?"error":"warning",c=0===a.failCount&&0===o.skip?ee.importDoneTitle:0===a.okCount&&a.failCount>0?ee.importFailedTitle:ee.importPartialTitle;Ce(`${Jt(ee.importDoneWithSkip,{ok:a.okCount,fail:a.failCount,skip:o.skip})} · ${Jt(ee.importElapsed,{time:ie(r)})}`,{type:i,title:c});}catch(c){const e=Math.round(performance.now()-l);Wn(t,"done");const n=c instanceof Error?c.message:String(c);r&&(r.hidden=false,r.innerHTML=`\n \n

      ${ae(ee.importFailedTitle)}

      \n

      ${ae(n)}

      \n

      ${ae(Jt(ee.importElapsedLabel,{time:ie(e)}))}

      \n `),$e(t,[{kind:"error",text:n,detail:n}]),oe(t,{...o,elapsedMs:e,doneTitle:ee.importFailedTitle}),Ce(n,{type:"error",title:ee.importFailedTitle});}finally{ca(t);}}async function ta(t,e){const n=++Un;Nn=e,Vn=false,Gn=false,Wn(t,"reading");try{fe(t,{visible:!0,current:0,total:1,label:ee.importLibraryProgress,reset:!0});let e=null,r=null;try{e=await Nt({concurrency:Zt.matchConcurrency,shouldCancel:()=>n!==Un,onProgress({listIndex:e,listTotal:a,page:r,pagesDone:i,concurrency:s,activeLists:o}){if(n!==Un)return;const l=Number(i)||0,d=Array.isArray(o)?o.length:0;fe(t,{visible:!0,current:l,total:Math.max(l+d+1,a,1),label:Jt(ee.importLibraryProgressDetail,{list:e+1,total:a,page:r}),activeTitles:o||[],concurrency:s||1});}}),In=e;}catch(a){if(n!==Un)return;In=null,r=a instanceof Error?a.message:String(a),Ce(Jt(ee.importLibraryFailed,{error:r}),{type:"warning",title:ee.importLibraryFailedTitle});}if(n!==Un)return;const i=function(t){const e=Array.isArray(t)?t:[],n=new Map,a=[];e.forEach((t,e)=>{const r=V(t),i=tt(r);if(!i)return void a.push(t);const s=function(t){var e;const n=G(t);let a=0;return null!=t.game_id&&(a+=20),t.slug&&(a+=4),null!=n.rating&&(a+=8),n.review&&(a+=6),n.start_date&&(a+=3),n.finish_date&&(a+=3),(null!=n.platform||n.title)&&(a+=2),(null==(e=t.log)?void 0:e.game_liked)&&(a+=1),(t.dates||[]).length&&(a+=2),a}(t),o=n.get(i);o?(o.count+=1,s>o.bestScore?(o.droppedSourceIndices.push(o.keptSourceIndex),o.best=t,o.bestScore=s,o.keptSourceIndex=e,o.title=r||o.title):o.droppedSourceIndices.push(e)):n.set(i,{title:r||i,best:t,bestScore:s,keptSourceIndex:e,droppedSourceIndices:[],count:1});});const r=[],i=[];for(const o of n.values())i.push(o.best),o.count>1&&r.push({title:o.title,count:o.count,keptSourceIndex:o.keptSourceIndex,droppedSourceIndices:o.droppedSourceIndices.slice().sort((t,e)=>t-e)});r.sort((t,e)=>e.count-t.count||t.title.localeCompare(e.title));const s=[...i,...a];return {entries:s,duplicateGroups:r,originalCount:e.length,removedCount:Math.max(0,e.length-s.length)}}(Nn.entries);Nn={...Nn,entries:i.entries},fe(t,{visible:!0,current:0,total:Math.max(Nn.entries.length,1),title:"",reset:!0});const s=await async function(t,e={}){const n=(null==t?void 0:t.entries)||[],r=n.length,i=Number.isFinite(e.delayMs)?Math.max(0,e.delayMs):280,s=Math.max(1,Math.floor(Number.isFinite(e.concurrency)?Number(e.concurrency):4)),o=e.library||null,l=z();let d=0,c=0;const u=new Map,p=(await vt(r,s,async t=>{var p,m,g,h,b,f,y,v;const _=n[t],S=V(_);let k;u.set(t,S||`#${t+1}`),null==(p=e.onProgress)||p.call(e,{index:t,total:r,done:c,entry:_,activeTitles:[...u.values()],concurrency:s});let C=!1;try{if(null!=_.game_id)k=function(t,e,n){return {index:t,entry:e,status:"preset",match:{id:e.game_id,slug:e.slug||"",title:n||V(e),year:"",score:100,url:e.slug?Lt(`/games/${encodeURIComponent(e.slug)}/`):""},existingLog:!1,fromCache:!1}}(t,_,S),S&&dt(S,{id:_.game_id,slug:_.slug||"",title:S,year:"",score:100,url:(null==(m=k.match)?void 0:m.url)||""});else {const e=function(t){const e=ot(t);if(!e)return null;const n=rt(),a=n[e];return !a||lt(a)?(a&&(delete n[e],it()),null):(a.at=Date.now(),{kind:"miss"===a.kind?"miss":"hit",match:a.match?{...a.match}:null,query:a.query||t})}(S);e?(d+=1,k=function(t,e,n,a){var r,i;return "hit"===a.kind&&null!=(null==(r=a.match)?void 0:r.id)?(e.game_id=a.match.id,a.match.slug&&(e.slug=a.match.slug),{index:t,entry:e,status:"found",match:{id:a.match.id,slug:a.match.slug||"",title:a.match.title||n,year:a.match.year||"",score:null!=(i=a.match.score)?i:100,url:a.match.url||(a.match.slug?Lt(`/games/${encodeURIComponent(a.match.slug)}/`):"")},existingLog:!1,fromCache:!0}):{index:t,entry:e,status:"not_found",match:null,existingLog:!1,fromCache:!0}}(t,_,S,e)):(C=!0,k=await async function(t,e,n){try{const a=await async function(t){const{best:e}=await Ut(t);return e}(n);return dt(n,a),a?(e.game_id=a.id,a.slug&&(e.slug=a.slug),{index:t,entry:e,status:"found",match:a,existingLog:!1,fromCache:!1}):{index:t,entry:e,status:"not_found",match:null,existingLog:!1,fromCache:!1}}catch(a){return {index:t,entry:e,status:"error",match:null,existingLog:!1,fromCache:!1,error:a instanceof Error?a.message:String(a)}}}(t,_,S));}if(!("found"!==k.status&&"preset"!==k.status||null==(null==(g=k.match)?void 0:g.id)&&null==_.game_id)){const t=null!=(b=null==(h=k.match)?void 0:h.id)?b:_.game_id,e=(null==(f=k.match)?void 0:f.slug)||_.slug||"",n=await async function(t){if(It(t.gameId,t.slug,t.library))return !0;if(null==t.gameId)return !1;try{const e=await Bt({gameId:Number(t.gameId),slug:t.slug,username:t.username});return await yt(140,{minFactor:.7,maxFactor:1.5,pauseChance:.05,pauseMinMs:80,pauseMaxMs:320}),e.exists}catch(e){return !1}}({gameId:t,slug:e,library:o,username:l});k.existingLog=n,n&&o&&(null!=t&&o.gameIds.add(Number(t)),e&&o.slugs.add(String(e).toLowerCase()));}}finally{u.delete(t);}return c+=1,null==(y=e.onProgress)||y.call(e,{index:t,total:r,done:c,entry:_,result:k,activeTitles:[...u.values()],concurrency:s}),i&&C&&!(null==(v=e.shouldCancel)?void 0:v.call(e))&&await yt(i),k},{shouldCancel:e.shouldCancel})).filter(t=>null!=t).sort((t,e)=>t.index-e.index);return {results:p,foundCount:p.filter(t=>"found"===t.status||"preset"===t.status).length,notFoundCount:p.filter(t=>"not_found"===t.status).length,presetCount:p.filter(t=>"preset"===t.status).length,errorCount:p.filter(t=>"error"===t.status).length,existingCount:p.filter(t=>t.existingLog).length,cacheHitCount:d}}(Nn,{delayMs:280,concurrency:Zt.matchConcurrency,library:e,shouldCancel:()=>n!==Un,onProgress({done:e,total:a,entry:r,activeTitles:i,concurrency:s}){n===Un&&fe(t,{visible:!0,current:e,total:a,title:V(r),activeTitles:i,concurrency:s});}});if(n!==Un)return;fe(t,{visible:!1});const o=jt(Nn,{foundCount:s.foundCount,notFoundCount:s.notFoundCount+s.errorCount,existingCount:s.existingCount,originalTotal:i.originalCount,duplicatesRemoved:i.removedCount});da(t,o),ye(t,e);const l=Me(s.results,r,i.duplicateGroups);if(we(t,l),i.removedCount>0){const e=t.querySelector("[data-bdt-errors] details");e&&(e.open=!0);}Vn=!0,Wn(t,"review"),An=s.results,ea(t),ca(t),dn(t),Ce(i.removedCount>0?Jt(ee.importAnalyzedWithDedupe,{count:o.total,found:o.foundCount,missing:o.notFoundCount,cached:s.cacheHitCount||0,removed:i.removedCount}):Jt(ee.importAnalyzedWithCache,{count:o.total,found:o.foundCount,missing:o.notFoundCount,cached:s.cacheHitCount||0}),{type:o.notFoundCount||i.removedCount?"warning":"success",title:ee.importAnalyzedTitle});}catch(a){if(n!==Un)return;zn(t),"csv"===Pn&&qn?(On=true,Wn(t,"mapping")):Wn(t,"file"),Ce(a instanceof Error?a.message:String(a),{type:"error",title:ee.importReadFailedTitle});}finally{n===Un&&(fe(t,{visible:false}),ra(t));}}function ea(t){(null==An?void 0:An.length)&&ue(t,An,{importExisting:true===Zt.importExisting,onSelectionChange(e){ca(t,e);},onImportExistingChange(t){Qt({...Zt,importExisting:t}),ne();},onManualGameId:(e,n)=>async function(t,e,n){if(!Nn||!An)throw new Error(ee.importNeedAnalyze);const a=An.find(t=>t.index===e);if(!a)throw new Error(ee.importMatchManualIdMissingRow);const r=V(a.entry),i=await async function(t,e={}){const n=String(null!=t?t:"").trim();if(!n)throw new Error("Empty game id");const a=String(e.hintTitle||"").trim(),r=function(t){const e=String(t||"").trim();if(!e)return null;try{if(/^https?:\/\//i.test(e)||e.startsWith("/")){const t=(e.startsWith("/")?new URL(e,Lt("/")):new URL(e)).pathname.match(/\/games\/([^/?#]+)/i);if(null==t?void 0:t[1])return {slug:decodeURIComponent(t[1])}}}catch(a){}const n=e.match(/\/games\/([^/?#]+)/i);return (null==n?void 0:n[1])?{slug:decodeURIComponent(n[1])}:null}(n);if((null==r?void 0:r.slug)&&!/^\d+$/.test(r.slug)){const t=await async function(t){var e,n,a,r,i,s;const o=Lt(`/games/${encodeURIComponent(t)}/`),l=await async function(t){try{const e=await fetch(t,{method:"GET",credentials:"same-origin",headers:{Accept:"text/html"}});if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.text()}catch(e){try{const e=await Ft({url:t,method:"GET",responseType:"text",headers:{Accept:"text/html"},timeout:2e4});if("string"==typeof e&&e)return e}catch(n){}throw e instanceof Error?e:new Error(String(e))}}(o);if(!l||/game not found|page not found/i.test(l))return null;const d=(new DOMParser).parseFromString(l,"text/html"),c=d.querySelector(".game-cover[game_id], [game_id].game-cover, [game_id]")||null,u=Number(null==c?void 0:c.getAttribute("game_id"));if(!Number.isFinite(u)||u<=0)return null;const p=(null==(e=d.querySelector('meta[property="og:title"]'))?void 0:e.getAttribute("content"))||"",m=(null==(n=d.querySelector("h1"))?void 0:n.textContent)||"";let g=String(p||m).replace(/\s*\(\d{4}\)\s*$/,"").replace(/\s*[|·•].*$/,"").trim();g||(g=t);const h=(null==(a=String(p).match(/\((\d{4})\)/))?void 0:a[1])||"",b=(null==(s=null==(i=null==(r=d.body)?void 0:r.textContent)?void 0:i.match(/(?:Released|Release|Выход)[^\d]{0,24}(\d{4})/i))?void 0:s[1])||"";return {id:u,slug:t,title:g,year:h||b||"",score:100,url:o}}(r.slug);if(t)return t;throw new Error(`Game page not found: ${r.slug}`)}const i=Number((null==r?void 0:r.slug)||n);if(!Number.isFinite(i)||i<=0||!Number.isInteger(i))throw new Error("Invalid game id");if(a){const{suggestions:t}=await Ut(a),e=t.find(t=>t.id===i);if(e)return {...e,score:100}}return {id:i,slug:"",title:a||`#${i}`,year:"",score:100,url:""}}(n,{hintTitle:r});a.entry.game_id=i.id,i.slug&&(a.entry.slug=i.slug);let s=It(i.id,i.slug,In);if(!s&&i.slug)try{s=(await Bt({gameId:i.id,slug:i.slug,username:z()})).exists,s&&At(In,{gameId:i.id,slug:i.slug});}catch(c){}a.status="preset",a.match=i,a.existingLog=s,a.fromCache=false,delete a.error,r&&dt(r,i);const o=An.filter(t=>"found"===t.status||"preset"===t.status).length,l=An.filter(t=>"not_found"===t.status||"error"===t.status).length,d=An.filter(t=>t.existingLog).length;da(t,jt(Nn,{foundCount:o,notFoundCount:l,existingCount:d})),we(t,Me(An)),ea(t),ca(t),dn(t),Ce(Jt(ee.importMatchManualIdOk,{title:i.title||r,id:i.id}),{type:"success",title:ee.importMatchManualIdOkTitle});}(t,e,n)});}function na(t){return "csv"===t?".csv,text/csv":".json,application/json"}function aa(t){Bn=null,qn=null,Rn={},Dn={status:{},rating:{},platform:{}};const e=t.querySelector("[data-bdt-file]");e&&(e.value=""),ia(t),zn(t),Wn(t,"file"),ra(t);}function ra(t){const e=t.querySelector("[data-bdt-analyze]"),n=t.querySelector("[data-bdt-example]"),a=t.querySelector("[data-bdt-csv-stub]"),r="csv"===Pn;a&&(a.hidden=true),n&&(n.hidden=r),e&&(e.disabled=!Bn,e.textContent=r?ee.importAnalyzeMap:ee.importAnalyzeContinue);}function ia(t){const e=t.querySelector("[data-bdt-dropzone]"),n=t.querySelector("[data-bdt-drop-empty]"),a=t.querySelector("[data-bdt-drop-filled]"),r=t.querySelector("[data-bdt-file-name]"),i=t.querySelector("[data-bdt-drop-meta]");i&&(i.textContent="csv"===Pn?ee.importDropAcceptCsv:ee.importDropAcceptJson),e&&n&&a&&(Bn?(e.classList.add("has-file"),n.hidden=true,a.hidden=false,r&&(r.textContent=Bn.name)):(e.classList.remove("has-file"),n.hidden=false,a.hidden=true,r&&(r.textContent="")));}const sa=new Set(["json","csv"]);function oa(t){t.querySelectorAll("[data-bdt-format]").forEach(t=>{const e=t.getAttribute("data-bdt-format")||"",n=sa.has(e),a=n&&e===Pn;t.classList.toggle("is-active",a),t.classList.toggle("is-disabled",!n),t.disabled=!n,t.setAttribute("aria-checked",a?"true":"false"),t.setAttribute("aria-disabled",n?"false":"true"),n?t.removeAttribute("title"):t.setAttribute("title",ee.importCsvStub);});}function la(t,e){if(!e)return void aa(t);const n=String(e.name||"").toLowerCase();"json"!==Pn||n.endsWith(".json")?"csv"!==Pn||n.endsWith(".csv")?(Bn=e,zn(t),ia(t),ra(t)):Ce(ee.importDropCsv,{type:"warning",title:ee.toastFileTypeTitle}):Ce(ee.importDropJson,{type:"warning",title:ee.toastFileTypeTitle});}function da(t,e){var n;const a=t.querySelector("[data-bdt-summary]");if(!a)return;const r=e.label?`${e.platform} · ${e.label}`:e.platform,i=e.total>0?Math.round(e.foundCount/e.total*100):0,s=Object.entries(e.byStatus).sort((t,e)=>e[1]-t[1]).map(([t,e])=>{const n=Ot(t,ee.importStatNoStatus);return `
    • ${ae(n)}${e}
    • `}).join(""),o=[[ee.importStatOriginal,null!=(n=e.originalTotal)?n:e.total,false],[ee.importStatUnique,e.uniqueTitles,false],[ee.importStatDuplicates,e.duplicates,e.duplicates>0],[ee.importStatExisting,e.existingCount,false],[ee.importStatRated,e.withRating,false],[ee.importStatFavorites,e.favorites,false],[ee.importStatDates,e.withDates,false],[ee.importStatReviews,e.withReview,false],[ee.importStatGameId,e.withGameId,false]].map(([t,e,n])=>`
    • ${ae(String(t))}${ae(String(e))}
    • `).join("");a.innerHTML=`\n
      \n

      ${ae(ee.importSummaryTitle)}

      \n
        \n
      • ${ae(ee.importStatVersion)}v${ae(String(e.version))}
      • \n
      • ${ae(ee.importStatSource)}${ae(r)}
      • \n
      • ${ae(ee.importStatExported)}${ae(e.exportedAt||"—")}
      • \n
      \n
      \n\n
      \n
      \n ${e.total}\n ${ae(ee.importStatTotal)}\n
      \n
      \n ${e.foundCount}\n ${ae(ee.importStatFound)}\n
      \n
      \n ${e.notFoundCount}\n ${ae(ee.importStatNotFound)}\n
      \n
      \n ${i}%\n ${ae(ee.importStatMatchRate)}\n
      \n
      \n\n
      \n

      ${ae(ee.importStatDetails)}

      \n
        ${o}
      \n
      \n\n
      \n

      ${ae(ee.importStatByStatus)}

      \n
        ${s||'
      • —0
      • '}
      \n
      \n `,a.hidden=false;}function ca(t,e){const n=t.querySelector("[data-bdt-import]");if(!n)return;if(n.hidden=!("review"===jn&&Nn),n.hidden)return;const a=null!=e?e:me(t).length;n.textContent=Jt(ee.importStartSelected,{count:a}),n.disabled=0===a||"importing"===jn;}function ua(t="import"){var e,n,a,o,l,d,c,u,p,m;ma(),ne(),Bn=null,Nn=null,In=null,An=null,qn=null,Rn={},Dn={status:{},rating:{},platform:{}},jn="file",On=false,Vn=false,Gn=false,Pn=sa.has(Zt.importFormat)?Zt.importFormat:"json";const h=document.createElement("div");h.id=Fn,h.className="bdt-panel-backdrop",h.innerHTML=`\n \n `,document.body.appendChild(h),null===Hn&&(Hn=document.documentElement.style.overflow,document.documentElement.style.overflow="hidden"),on(h),dn(h),wn(h);const b=()=>ma();h.addEventListener("click",t=>{t.target===h&&b();}),null==(e=h.querySelector("[data-bdt-close]"))||e.addEventListener("click",b),h.querySelectorAll("[data-bdt-tab]").forEach(t=>{t.addEventListener("click",()=>pa(h,t.getAttribute("data-bdt-tab")));}),h.querySelectorAll("[data-bdt-format]").forEach(t=>{t.addEventListener("click",()=>{const e="csv"===t.getAttribute("data-bdt-format")?"csv":"json";sa.has(e)&&!t.disabled?function(t,e){const n="csv"===e?"csv":"json";if(!sa.has(n))return void Ce(ee.importCsvStub,{type:"warning",title:ee.toastCsvSoonTitle});Pn=n,Qt({...Zt,importFormat:Pn}),ne(),oa(t);const a=t.querySelector("[data-bdt-file]");a&&(a.accept=na(Pn)),aa(t);}(h,e):Ce(ee.importCsvStub,{type:"warning",title:ee.toastCsvSoonTitle});});});const f=h.querySelector("[data-bdt-file]"),y=h.querySelector("[data-bdt-dropzone]");null==f||f.addEventListener("change",()=>{var t;la(h,(null==(t=f.files)?void 0:t[0])||null);}),null==y||y.addEventListener("dragenter",t=>{t.preventDefault(),y.classList.add("is-dragover");}),null==y||y.addEventListener("dragover",t=>{t.preventDefault(),y.classList.add("is-dragover");}),null==y||y.addEventListener("dragleave",t=>{y.contains(t.relatedTarget)||y.classList.remove("is-dragover");}),null==y||y.addEventListener("drop",t=>{var e,n;t.preventDefault(),y.classList.remove("is-dragover");const a=(null==(n=null==(e=t.dataTransfer)?void 0:e.files)?void 0:n[0])||null;la(h,a);}),null==(n=h.querySelector("[data-bdt-clear]"))||n.addEventListener("click",t=>{t.preventDefault(),t.stopPropagation(),aa(h);}),h.querySelectorAll("[data-bdt-step]").forEach(t=>{t.addEventListener("click",()=>{const e=t.getAttribute("data-bdt-step");if("file"===e)return "reading"!==jn&&"importing"!==jn||(Un+=1),void("file"!==jn?Jn(h):Wn(h,"file"));"mapping"===e&&On&&"csv"===Pn?Kn(h):"review"===e&&Vn?Yn(h):"import"===e&&Gn&&Wn(h,"done");});}),null==(a=h.querySelector("[data-bdt-back-file]"))||a.addEventListener("click",()=>{"csv"===Pn&&qn?Kn(h):Jn(h);}),null==(o=h.querySelector("[data-bdt-back-file-map]"))||o.addEventListener("click",()=>{Jn(h);}),null==(l=h.querySelector("[data-bdt-back-review]"))||l.addEventListener("click",()=>{Yn(h);}),null==(d=h.querySelector("[data-bdt-restart]"))||d.addEventListener("click",()=>{aa(h);}),null==(c=h.querySelector("[data-bdt-cancel-read]"))||c.addEventListener("click",()=>{Un+=1,zn(h),"csv"===Pn&&qn?(On=true,Qe(h,{headers:qn.headers,rows:qn.rows,mapping:Rn,valueMaps:Dn,filename:null==Bn?void 0:Bn.name,onChange(t){Rn=t.mapping,Dn=t.valueMaps;}}),Wn(h,"mapping")):Wn(h,"file"),ra(h),Ce(ee.importReadCancelled,{type:"info",title:ee.importCancelRead});}),null==(u=h.querySelector("[data-bdt-csv-continue]"))||u.addEventListener("click",async()=>{if(!qn)return void Ce(ee.importNeedFile,{type:"warning",title:ee.importNeedFileTitle});Rn=Ze(h),Dn=tn(h);const t=function(t){var e,n,a,r;const i=t.mapping||{},s=function(t){return String((null==t?void 0:t.title)||"").trim()?{ok:true}:{ok:false,error:"Title column is required"}}(i);if(!s.ok)return {ok:false,error:s.error};const o=(null==(e=t.valueMaps)?void 0:e.status)||{},l=(null==(n=t.valueMaps)?void 0:n.rating)||{},d=(null==(a=t.valueMaps)?void 0:a.platform)||{},c=[];for(const u of t.rows||[]){const t=Ye(u,i.title).trim();if(!t)continue;const e=Oe(Ye(u,i.status),o),n=Ve(Ye(u,i.rating),l),a=Be(Ye(u,i.favorite)),s=Ge(Ye(u,i.platform),d),p=null!=(r=null==s?void 0:s.id)?r:null,m=(null==s?void 0:s.name)||"Log",g=Ye(u,i.start_date),h=Ye(u,i.finish_date),b=Ye(u,i.review),f=Ye(u,i.slug).trim(),y=Ye(u,i.game_id).trim(),v=/^\d+$/.test(y)?Number(y):null,_=Xe(Ye(u,i.hours)),S=null!=_?Math.floor(_):null,k=null!=_&&Math.round(60*(_-Math.floor(_)))||null;c.push({title:t,game_id:v,slug:f,log:{status:e,game_liked:a,total_hours:S,total_minutes:k},playthroughs:[{title:m,platform:p,rating:n,review:b,start_date:g,finish_date:h,hours_played:S,mins_played:k}],dates:g||h?[{range_start_date:g||h,range_end_date:h||g,start_date:g,finish_date:h}]:[]});}return c.length?{ok:true,value:O({source:{platform:"csv",label:t.filename||"CSV import"},entries:c})}:{ok:false,error:"No rows with a title were found"}}({rows:qn.rows,mapping:Rn,valueMaps:Dn,filename:null==Bn?void 0:Bn.name});t.ok?await ta(h,t.value):Ce(t.error,{type:"warning",title:ee.csvMapInvalidTitle});});const v=h.querySelector("[data-bdt-analyze]");null==v||v.addEventListener("click",async()=>{if(Bn){v.disabled=true,Vn=false,Gn=false;try{const e=await(t=Bn,new Promise((e,n)=>{const a=new FileReader;a.onload=()=>e(String(a.result||"")),a.onerror=()=>n(a.error||new Error("Failed to read file")),a.readAsText(t);}));if("csv"===Pn){const t=function(t){const e=function(t){const e=[];let n=[],a="",r=!1;for(let i=0;iString(t||"").trim()),a=[];for(let r=1;r""===String(t||"").trim()))continue;const i={};for(let e=0;e2)return {ok:!1,error:`Unsupported format version ${a} (max 2)`};if(!Array.isArray(n.entries))return {ok:!1,error:"entries must be an array"};const r=O({source:n.source||{platform:"custom"},entries:n.entries.map(t=>j(t)),exportedAt:n.exportedAt||(new Date).toISOString()});return r.version=2,{ok:!0,value:r}}(e);if(!n.ok)return zn(h),Wn(h,"file"),void Ce(Jt(ee.importInvalid,{error:n.error}),{type:"error",title:ee.importInvalidTitle});await ta(h,n.value);}catch(e){zn(h),Wn(h,"file"),Ce(e instanceof Error?e.message:String(e),{type:"error",title:ee.importReadFailedTitle});}finally{ra(h);}var t;}else Ce(ee.importNeedFile,{type:"warning",title:ee.importNeedFileTitle});}),null==(p=h.querySelector("[data-bdt-import]"))||p.addEventListener("click",async()=>{if(!Nn)return void Ce(ee.importNeedAnalyze,{type:"warning",title:ee.importNeedAnalyzeTitle});const t=new Set(me(h));if(!t.size)return void Ce(ee.importNeedSelection,{type:"warning",title:ee.importNeedSelectionTitle});const e=Nn.entries.filter((e,n)=>!!t.has(n)&&null!=e.game_id);if(!e.length)return void Ce(ee.importNeedResolvable,{type:"warning",title:ee.importNeedResolvableTitle});const n={...Nn,entries:e};if(!St()){const t=h.querySelector("[data-bdt-import]");return t&&(t.disabled=true),Qn(h,{title:ee.importNeedLoginTitle,body:ee.importNeedLoginBody}),void ca(h)}if(!kt()){const t=h.querySelector("[data-bdt-import]");return t&&(t.disabled=true),Qn(h,{title:ee.importNeedLoginTitle,body:ee.importNeedCsrfBody}),void ca(h)}if(null==Ct()){const t=h.querySelector("[data-bdt-import]");return t&&(t.disabled=true),function(t,e){Xn(t);const n=t.querySelector("[data-bdt-import-auth]");if(!n)return;n.hidden=false,n.innerHTML=`\n \n

      ${ae(ee.importNeedUserIdTitle)}

      \n

      ${ae(ee.importNeedUserIdBody)}

      \n \n

      ${ae(ee.importUserIdHint)}

      \n \n `;const a=n.querySelector("[data-bdt-user-id-input]"),r=n.querySelector("[data-bdt-user-id-continue]"),i=()=>{var n;try{!function(t){const e=Number(t);if(!Number.isFinite(e)||e<=0||!Number.isInteger(e))throw new Error("Invalid Backloggd user id");$t(e,z());}(null!=(n=null==a?void 0:a.value)?n:"");}catch(r){return Ce(ee.importUserIdInvalid,{type:"warning",title:ee.importNeedUserIdTitle}),void(null==a||a.focus())}Zn(t,e);};null==r||r.addEventListener("click",i),null==a||a.addEventListener("keydown",t=>{"Enter"===t.key&&(t.preventDefault(),i());}),null==a||a.focus(),Ce(ee.importNeedUserIdBody,{type:"warning",title:ee.importNeedUserIdTitle});}(h,n),void ca(h)}await Zn(h,n);}),null==(m=h.querySelector("[data-bdt-example]"))||m.addEventListener("click",()=>{const t=O({source:{platform:"example",label:"Sample transfer file"},exportedAt:"2026-07-18T12:00:00.000Z",entries:[{game_id:null,title:"Raft",slug:"raft",log:{game_liked:false,is_play:true,is_playing:false,is_backlog:false,is_wishlist:false,status:"completed",total_hours:null,total_minutes:null,time_source:1,override_cover_id:null},playthroughs:[{title:"Windows PC",rating:5,review:"",review_spoilers:false,platform:6,hours_played:null,mins_played:null,is_master:false,is_replay:false,start_date:"2024-08-02",finish_date:"",edition_id:null,edition_type:null,medium_id:null,played_platform:null,storefront_id:null,hours_finished:null,mins_finished:null,hours_mastered:null,mins_mastered:null,sync_sessions:false}],dates:[{range_start_date:"2024-08-02",range_end_date:"2024-08-03",status:5,note:"",hours:null,minutes:null,start_date:"2024-08-02",finish_date:""}]},{game_id:null,title:"Celeste",slug:"celeste",log:{game_liked:false,status:"backlog"},playthroughs:[{title:"Windows PC",platform:6,rating:null,review:"",start_date:"",finish_date:""}],dates:[]}]}),e=function(t="export"){const e=(new Date).toISOString().slice(0,10);return `backloggd-transfer-${String(t||"export").toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"export"}-${e}.json`}("example");!function(t,e,n="application/json;charset=utf-8"){const a=new Blob([e],{type:n}),r=URL.createObjectURL(a),i=document.createElement("a");i.href=r,i.download=t,i.rel="noopener",document.body.appendChild(i),i.click(),i.remove(),window.setTimeout(()=>URL.revokeObjectURL(r),2e3);}(e,function(t,e={}){const n=O({source:t.source,entries:t.entries,exportedAt:t.exportedAt});return `${JSON.stringify(n,null,false!==e.pretty?2:0)}\n`}(t)),Ce(Jt(ee.importExampleDownloaded,{filename:e}),{type:"success",title:ee.importExampleTitle});}),oa(h),ia(h),ra(h),Wn(h,"file"),pa(h,t);}function pa(t,e){const n=t.querySelector(`[data-bdt-tab="${e}"]`);"true"===(null==n?void 0:n.getAttribute("data-bdt-tab-locked"))||(null==n?void 0:n.classList.contains("is-locked"))?Ce(ee.exportSoonBody,{type:"warning",title:ee.exportSoonTitle}):(t.querySelectorAll("[data-bdt-tab]").forEach(t=>{t.classList.toggle("is-active",t.getAttribute("data-bdt-tab")===e);}),t.querySelectorAll("[data-bdt-panel]").forEach(t=>{t.hidden=t.getAttribute("data-bdt-panel")!==e;}),"cleanup"===e&&Mn(t),"history"===e&&rn(t),"cache"===e&&ln(t),"settings"===e&&Tn(t,{onLocaleChange(){ua("settings");},onSettingsChange(){ye(t,In);}}));}function ma(){var t;null==(t=document.getElementById(Fn))||t.remove(),null!==Hn&&(document.documentElement.style.overflow=Hn,Hn=null),Bn=null,Nn=null,In=null,An=null,qn=null,Rn={},Dn={status:{},rating:{},platform:{}},jn="file",On=false,Vn=false,Gn=false,Un+=1;}function ga(t,e){let n=0;return function(...a){n&&clearTimeout(n),n=window.setTimeout(()=>{n=0,t.apply(this,a);},e);}}function ha(){!function(){if(document.getElementById(En))return;const t=document.createElement("button");t.id=En,t.type="button",t.className="btn btn-main mb-2 my-sm-0 py-0",t.title=ee.navButtonTitle,t.innerHTML=` ${ae(ee.navButton)}`,t.addEventListener("click",t=>{t.preventDefault(),ua();});const e=document.getElementById("blp-nav-settings")||document.getElementById("add-a-game");if(null==e?void 0:e.parentElement){t.classList.add("ml-2");const n=e.getBoundingClientRect().height;return n>0&&document.documentElement.style.setProperty("--bdt-nav-btn-h",`${Math.round(n)}px`),void e.insertAdjacentElement("afterend",t)}const n=document.querySelector("#navbarSupportedContent .col.my-auto, #primary-nav .col.my-auto");if(n)return t.classList.add("ml-2"),void n.appendChild(t);const a=document.querySelector("#navbarSupportedContent > ul.navbar-nav")||document.querySelector("#primary-nav ul.navbar-nav.ml-auto");if(!a)return;const r=document.createElement("li");r.className="nav-item my-auto",r.appendChild(t),a.appendChild(r);}();}function ba(){document.documentElement.hasAttribute(m)||(document.documentElement.setAttribute(m,"1"),ne(),function(){const t=ct(),e=ut();(t>0||e>0)&&st();}(),"function"==typeof e&&e(ee.menuOpen,()=>ua()),"backloggd.com"===location.hostname.replace(/^www\./,"")&&(ha(),function(){const t=ga(ha,400),e=new MutationObserver(()=>t());document.body&&e.observe(document.body,{childList:true,subtree:true});}(),function(){const t=ga(ha,400);window.addEventListener("popstate",t),document.addEventListener("turbo:load",t),document.addEventListener("turbo:render",t);}()));}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",ba,{once:true}):ba(); })();