From c06b9cafa3886d912953cd04fa5c9d0f81bcde18 Mon Sep 17 00:00:00 2001 From: Rukario Date: Fri, 3 Jan 2025 11:36:37 -0800 Subject: [PATCH] Add files via upload --- Uninteresting stuff/public_html_dev/transmission-app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Uninteresting stuff/public_html_dev/transmission-app.js b/Uninteresting stuff/public_html_dev/transmission-app.js index b9b0fcc..56eebd0 100644 --- a/Uninteresting stuff/public_html_dev/transmission-app.js +++ b/Uninteresting stuff/public_html_dev/transmission-app.js @@ -1,10 +1,10 @@ -(()=>{var Dt=Object.create;var st=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var _t=Object.getPrototypeOf,zt=Object.prototype.hasOwnProperty;var jt=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports);var Mt=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Et(e))!zt.call(s,o)&&o!==t&&st(s,o,{get:()=>e[o],enumerable:!(r=St(e,o))||r.enumerable});return s};var Pt=(s,e,t)=>(t=s!=null?Dt(_t(s)):{},Mt(e||!s||!s.__esModule?st(t,"default",{value:s,enumerable:!0}):t,s));var Vt=jt((ee,P)=>{var Kt=200,qe="__lodash_hash_undefined__",xe=1,mt=2,It=9007199254740991,ue="[object Arguments]",Ee="[object Array]",qt="[object AsyncFunction]",ht="[object Boolean]",Ct="[object Date]",xt="[object Error]",yt="[object Function]",$t="[object GeneratorFunction]",pe="[object Map]",At="[object Number]",er="[object Null]",M="[object Object]",ot="[object Promise]",tr="[object Proxy]",ft="[object RegExp]",be="[object Set]",Xt="[object String]",rr="[object Symbol]",sr="[object Undefined]",_e="[object WeakMap]",Bt="[object ArrayBuffer]",me="[object DataView]",or="[object Float32Array]",nr="[object Float64Array]",ir="[object Int8Array]",cr="[object Int16Array]",lr="[object Int32Array]",ar="[object Uint8Array]",dr="[object Uint8ClampedArray]",gr="[object Uint16Array]",ur="[object Uint32Array]",pr=/[\\^$.*+?()[\]{}|]/g,br=/^\[object .+?Constructor\]$/,mr=/^(?:0|[1-9]\d*)$/,Z={};Z[or]=Z[nr]=Z[ir]=Z[cr]=Z[lr]=Z[ar]=Z[dr]=Z[gr]=Z[ur]=!0;Z[ue]=Z[Ee]=Z[Bt]=Z[ht]=Z[me]=Z[Ct]=Z[xt]=Z[yt]=Z[pe]=Z[At]=Z[M]=Z[ft]=Z[be]=Z[Xt]=Z[_e]=!1;var Gt=typeof global=="object"&&global&&global.Object===Object&&global,Ir=typeof self=="object"&&self&&self.Object===Object&&self,O=Gt||Ir||Function("return this")(),vt=typeof ee=="object"&&ee&&!ee.nodeType&&ee,nt=vt&&typeof P=="object"&&P&&!P.nodeType&&P,Zt=nt&&nt.exports===vt,Te=Zt&&Gt.process,it=function(){try{return Te&&Te.binding&&Te.binding("util")}catch{}}(),ct=it&&it.isTypedArray;function hr(s,e){for(var t=-1,r=s==null?0:s.length,o=0,n=[];++t-1}function zr(s,e){var t=this.__data__,r=Ae(t,s);return r<0?(++this.size,t.push([s,e])):t[r][1]=e,this}U.prototype.clear=Dr;U.prototype.delete=Sr;U.prototype.get=Er;U.prototype.has=_r;U.prototype.set=zr;function S(s){var e=-1,t=s==null?0:s.length;for(this.clear();++ea))return!1;var c=n.get(s);if(c&&n.get(e))return c==e;var g=-1,m=!0,d=t&mt?new he:void 0;for(n.set(s,e),n.set(e,s);++g-1&&s%1==0&&s-1&&s%1==0&&s<=It}function Ut(s){var e=typeof s;return s!=null&&(e=="object"||e=="function")}function se(s){return s!=null&&typeof s=="object"}var kt=ct?Ar(ct):ds;function Bs(s){return fs(s)?is(s):gs(s)}function Gs(){return[]}function vs(){return!1}P.exports=Xs});var ge=class s extends EventTarget{constructor(){super(),this.actions=Object.seal({"accent-picker":{enabled:!0,text:"Accent color"},"deselect-all":{enabled:!1,shortcut:"D",text:"Deselect all"},"disable-sequential-downloading":{enabled:!0,text:"Disable"},"enable-sequential-downloading":{enabled:!0,text:"Enable"},"move-bottom":{enabled:!1,text:"Bottom"},"move-down":{enabled:!1,text:"Down"},"move-top":{enabled:!1,text:"Top"},"move-up":{enabled:!1,text:"Up"},"open-appearance-settings":{enabled:!0,text:"Appearance settings"},"open-torrent":{enabled:!0,shortcut:"O",text:"Open torrent\u2026"},"pause-all-torrents":{enabled:!1,text:"Pause all"},"pause-selected-torrents":{enabled:!1,shortcut:"U",text:"Pause"},"reannounce-selected-torrents":{enabled:!1,text:"Ask tracker for more peers"},"remove-selected-torrents":{enabled:!1,text:"Remove selected torrents"},"resume-selected-torrents":{enabled:!1,shortcut:"R",text:"Resume"},"resume-selected-torrents-now":{enabled:!1,text:"Resume now"},"select-all":{enabled:!1,shortcut:"A",text:"Select all"},"show-about-dialog":{enabled:!0,text:"About"},"show-context-menu":{enabled:!0,shortcut:"X",text:"Context Menu (right-click / long press)"},"show-inspector":{enabled:!1,shortcut:"I",text:"Torrent Inspector (double-click)"},"show-labels-dialog":{enabled:!1,shortcut:"K",text:"Edit Labels\u2026"},"show-move-dialog":{enabled:!1,shortcut:"L",text:"Set location\u2026"},"show-overflow-menu":{enabled:!0,text:"More options\u2026"},"show-preferences-dialog":{enabled:!0,shortcut:"P",text:"Edit preferences"},"show-rename-dialog":{enabled:!1,shortcut:"N",text:"Rename\u2026"},"show-shortcuts-dialog":{enabled:!0,text:"Keyboard shortcuts"},"show-statistics-dialog":{enabled:!0,shortcut:"S",text:"Statistics"},"start-all-torrents":{enabled:!1,text:"Start all"},"toggle-compact-rows":{enabled:!0,text:"Compact rows"},"toggle-contrast":{enabled:!0,text:"High contrast"},"verify-selected-torrents":{enabled:!1,shortcut:"V",text:"Verify local data"},"verify-selected-torrents-force":{enabled:!1,text:"Verify local data (force)"}})}click(e){if(this.isEnabled(e)){let t=new Event("click");t.action=e,this.dispatchEvent(t)}}getActionForShortcut(e){for(let[t,r]of Object.entries(this.actions))if(e===r.shortcut)return t;return null}allShortcuts(){return new Map(Object.entries(this.actions).filter(([,e])=>e.shortcut).map(([e,t])=>[t.shortcut,e]))}isEnabled(e){return this._getAction(e).enabled}text(e){return this._getAction(e).text}keyshortcuts(e){return this._getAction(e).shortcut}update(e){let t=s._recount(e.selected,e.nonselected);this._updateStates(t)}_getAction(e){let t=this.actions[e];if(!t)throw new Error(`no such action: ${e}`);return t}static _recount(e,t){let r=e.length+t.length,o=e.filter(m=>m.isStopped()).length,n=e.length-o,l=t.filter(m=>m.isStopped()).length,a=t.length-l,i=o+l,c=n+a,g=e.filter(m=>m.isQueued()).length;return{active:c,nonselected_active:a,nonselected_paused:l,paused:i,selected:e.length,selected_active:n,selected_paused:o,selected_queued:g,total:r}}_updateStates(e){let t=(r,o)=>{for(let n of o)this._updateActionState(n,r)};t(e.selected_paused>0,["resume-selected-torrents"]),t(e.paused>0,["start-all-torrents"]),t(e.active>0,["pause-all-torrents"]),t(e.selected_paused>0||e.selected_queued>0,["resume-selected-torrents-now"]),t(e.selected_active>0,["pause-selected-torrents","reannounce-selected-torrents"]),t(e.selected>0,["deselect-all","move-bottom","move-down","move-top","move-up","remove-selected-torrents","show-inspector","show-labels-dialog","show-move-dialog","verify-selected-torrents","verify-selected-torrents-force"]),t(e.selected===1,["show-rename-dialog"]),t(e.selectedFs(o,m,l,c,t))}return a[0].classList.add("selected"),l.children[0].classList.remove("hidden"),{buttons:a,dismiss:n,root:r}}function J(s){let e=document.createElement("dialog");e.classList.add("dialog-container","popup",s),e.open=!0,e.setAttribute("role","dialog");let t=document.createElement("div");t.classList.add("dialog-window"),e.append(t);let r=document.createElement("div");r.classList.add("dialog-logo"),t.append(r);let o=document.createElement("div");o.classList.add("dialog-heading"),t.append(o);let n=document.createElement("div");n.classList.add("dialog-message"),t.append(n);let l=document.createElement("div");l.classList.add("dialog-workarea"),t.append(l);let a=document.createElement("div");a.classList.add("dialog-buttons"),t.append(a);let i=document.createElement("span");i.classList.add("dialog-buttons-begin"),a.append(i);let c=document.createElement("button");c.classList.add("dialog-dismiss-button"),c.textContent="Cancel",a.append(c);let g=document.createElement("button");g.textContent="OK",a.append(g);let m=document.createElement("span");return m.classList.add("dialog-buttons-end"),a.append(m),{confirm:g,dismiss:c,heading:o,message:n,root:e,workarea:l}}function F(){return typeof crypto.randomUUID=="function"?crypto.randomUUID():("10000000-1000-4000-8000"+-1e11).replaceAll(/[018]/g,s=>(s^crypto.getRandomValues(new Uint8Array(1))[0]&15>>s/4).toString(16))}function q(s,e,t){let r=t.map(o=>new Option(...o));if(e){let o=document.createElement("OPTGROUP");o.label=e,o.append(...r),s.append(o)}else s.append(...r)}var w=Object.freeze({delete:()=>_(["path",{d:"M20 7v14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V7m3 0V5a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2L22 7L4 7"}],["line",{x1:11,x2:11,y1:12,y2:18}],["line",{x1:15,x2:15,y1:12,y2:18}]),open:()=>_(["path",{d:"M23 20a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"}],["line",{x1:13,x2:13,y1:12,y2:18}],["line",{x1:10,x2:16,y1:15,y2:15}]),overflow:()=>_(["line",{x1:4,x2:22,y1:13,y2:13}],["line",{x1:4,x2:22,y1:7,y2:7}],["line",{x1:4,x2:22,y1:19,y2:19}]),pause:()=>_(["rect",{height:16,width:4,x:7,y:5}],["rect",{height:16,width:4,x:15,y:5}]),speedDown:()=>_(["polyline",{points:"7 10 13 16 19 10"}]),speedUp:()=>_(["polyline",{points:"19 16 13 10 7 16"}]),start:()=>_(["polyline",{points:"6 4 20 13 6 22 6 4"}])});function Hs(s){let e=document.createElement("fieldset");e.classList.add("section");let t=document.createElement("legend");t.classList.add("title"),t.textContent=s,e.append(t);let r=document.createElement("div");return r.classList.add("content"),e.append(r),{content:r,root:e}}function $e(s,e){let t=[],{root:r,content:o}=Hs(s);for(let n of e){let l=document.createElement("label");l.textContent=n,o.append(l);let a=document.createElement("div");a.id=F(),o.append(a),l.setAttribute("for",a.id),t.push(a)}return{children:t,root:r}}function z(s,e=100){let t=null;return(...r)=>{t||(t=setTimeout(()=>{t=null,s(...r)},e))}}function Be(s,e){return(0,Nt.default)(s,e)}function Js(s,e,t){t?s.setAttribute(e,!0):s.removeAttribute(e)}function W(s,e){Js(s,"disabled",!e)}function Ge(s,e){s.classList.toggle("checked",e)}var R=class extends EventTarget{constructor(e){super(),this.listener=t=>{e.contains(t.target)||(this.dispatchEvent(new MouseEvent(t.type,t)),t.preventDefault())},Object.seal(this),this.start()}start(){setTimeout(()=>document.addEventListener("click",this.listener),0)}stop(){document.removeEventListener("click",this.listener)}};function I(s,e){s.textContent!==e&&(s.textContent=e)}var ve=class{constructor(e){this._prefs=e,this._elements={toggle:document.querySelector("#toggle-notifications")}}_setEnabled(e){this.prefs.notifications_enabled=e,I(this._toggle,`${e?"Disable":"Enable"} Notifications`)}_requestPermission(){Notification.requestPermission().then(e=>this._setEnabled(e==="granted"))}toggle(){this._enabled?this._setEnabled(!1):Notification.permission==="granted"?this._setEnabled(!0):Notification.permission!=="denied"&&this._requestPermission()}};var u=class s extends EventTarget{constructor(){super(),this._cache={},this.dispatchPrefsChange=z((e,t,r)=>{let o=new Event("change");Object.assign(o,{key:e,old_value:t,value:r}),this.dispatchEvent(o)});for(let[e,t]of Object.entries(s._Defaults))this._set(e,s._getCookie(e,t)),Object.defineProperty(this,e.replaceAll("-","_"),{get:()=>this._get(e),set:r=>{this._set(e,r)}});Object.seal(this)}entries(){return Object.entries(this._cache)}keys(){return Object.keys(this._cache)}_get(e){let{_cache:t}=this;if(!Object.prototype.hasOwnProperty.call(t,e))throw new Error(e);return t[e]}_set(e,t){let{_cache:r}=this,o=r[e];o!==t&&(r[e]=t,s._setCookie(e,t),this.dispatchPrefsChange(e,o,t))}static _setCookie(e,t){let r=new Date;r.setFullYear(r.getFullYear()+1),document.cookie=`${e}=${t}; SameSite=Strict; expires=${r.toGMTString()}`}static _getCookie(e,t){let r=s._readCookie(e);if(r===null)return t;let o=typeof t;if(o==="boolean")return r==="true"?!0:r==="false"?!1:t;if(o==="number"){let n=Number.parseFloat(r);return Number.isNaN(n)?t:n}return r}static _readCookie(e){let r=`; ${document.cookie}`.split(`; ${e}=`);return r.length===2?r.pop().split(";").shift():null}};u.AltSpeedEnabled="alt-speed-enabled";u.DisplayCompact="compact";u.DisplayFull="full";u.DisplayMode="display-mode";u.ColorForStatus="color-for-status";u.ContrastLess="less";u.ContrastMore="more";u.ContrastMode="contrast-mode";u.ContrastRemainders="contrast-remainders";u.FilterActive="active";u.FilterAll="all";u.FilterDownloading="downloading";u.FilterError="error";u.FilterFinished="finished";u.FilterLogicalSwap="filter-logical-swap";u.FilterMode="filter-mode";u.FilterOps={label:["labels:","label:","kw:"],name:["name:"],status:["status:","is:"],tracker:["tracker:","tr:"]};u.FilterPaused="paused";u.FilterPrivate="private";u.FilterPublic="public";u.FilterSeeding="seeding";u.HighlightColor="highlight-color";u.LimitWidth="limit-width";u.NotificationsEnabled="notifications-enabled";u.ProgressBarrel="progress-barrel";u.RefreshRate="refresh-rate-sec";u.SortAscending="ascending";u.SortByActivity="activity";u.SortByAge="age";u.SortByName="name";u.SortByProgress="progress";u.SortByQueue="queue";u.SortByRatio="ratio";u.SortBySize="size";u.SortByState="state";u.SortDescending="descending";u.SortDirection="sort-direction";u.SortMode="sort-mode";u._Defaults={[u.AltSpeedEnabled]:!1,[u.DisplayMode]:u.DisplayFull,[u.ColorForStatus]:!0,[u.ContrastMode]:window.matchMedia("(prefers-contrast: more)").matches?u.ContrastMore:u.ContrastLess,[u.ContrastRemainders]:!1,[u.FilterLogicalSwap]:!1,[u.FilterMode]:u.FilterAll,[u.HighlightColor]:"AccentColor",[u.LimitWidth]:!1,[u.NotificationsEnabled]:!1,[u.ProgressBarrel]:null,[u.RefreshRate]:5,[u.SortDirection]:u.SortAscending,[u.SortMode]:u.SortByName};var Ze=class s extends EventTarget{constructor(e){super(),this.elements=s._create(e),this.elements.dismiss.addEventListener("click",()=>this.close()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}static _create(e){let t=J("about-dialog");t.root.setAttribute("aria-label","About transmission"),t.heading.textContent="Transmission",t.dismiss.textContent="Close";let r=document.createElement("div");return r.classList.add("about-dialog-version-number"),r.textContent=e.version,t.heading.append(r),r=document.createElement("div"),r.classList.add("about-dialog-version-checksum"),r.textContent=e.checksum,t.heading.append(r),r=document.createElement("div"),r.textContent="A fast and easy bitTorrent client",t.workarea.append(r),r=document.createElement("div"),r.textContent="Copyright \xA9 The Transmission Project",t.workarea.append(r),r=document.createElement("a"),r.href="https://transmissionbt.com/",r.target="_blank",r.textContent="https://transmissionbt.com/",t.workarea.append(r),t.confirm.remove(),delete t.confirm,t}};var ie=class extends EventTarget{constructor(e,t){super(),this.action_manager=t,this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=e,this.prefs.addEventListener("change",this.prefs_listener),this.elements=this._create(),this.elements.dismiss.addEventListener("click",()=>this.close()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onPrefsChange(e){switch(e.key){case u.SortDirection:case u.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value;break;default:break}}_create(){let e=J("dis-appearance"),{dismiss:t,heading:r,message:o}=e;r.textContent="Appearance",t.textContent="Close";let n=document.createElement("h4");o.append(n),n.textContent="Theme";let l=document.createElement("div");l.classList.add("table-row"),o.append(l);let a=(d,b)=>{let p=document.createElement("input");p.id=F(),p.type="checkbox";let h=document.createElement("label");h.htmlFor=p.id,h.textContent=d,b(p),l.append(p,h,document.createElement("BR"))},i=(d,b,p,h,C)=>{let y=document.createElement("input");y.id=F(),y.name=d,y.type="radio",y.value=h;let x=document.createElement("label");x.htmlFor=y.id,x.textContent=b,C(y,p),l.append(y,x,document.createElement("BR"))},c=d=>{d.checked=this.prefs.contrast_mode===u.ContrastMore,d.addEventListener("change",b=>{let{checked:p}=b.target;this.prefs.contrast_mode=p?u.ContrastMore:u.ContrastLess})};a(this.action_manager.text("toggle-contrast"),c),n=document.createElement("h4"),o.append(n),n.textContent="Highlight color",l=document.createElement("div"),l.classList.add("table-row"),o.append(l),c=(d,b)=>{d.checked=!b||document.body.classList.contains(b),d.addEventListener("change",p=>{let{value:h}=p.target;this.prefs.highlight_color=h})},i("highlight-color","Accent color from system",null,"AccentColor",c),i("highlight-color","Highlight color from system","highlight","Highlight",c),i("highlight-color","Legacy","highlight-legacy",null,c),n=document.createElement("h4"),o.append(n),n.textContent="Progress bar",l=document.createElement("div"),l.classList.add("table-row"),o.append(l),n=document.createElement("h5"),o.append(n),n.textContent="appearance",l=document.createElement("div"),l.classList.add("table-row"),o.append(l),c=d=>{d.checked=document.querySelector("#torrent-list").classList.contains("color-for-status"),d.addEventListener("change",b=>{let{checked:p}=b.target;this.prefs.color_for_status=p})},a("Color for status",c),c=d=>{d.checked=document.querySelector("#torrent-list").classList.contains("contrast-remainders"),d.addEventListener("change",b=>{let{checked:p}=b.target;this.prefs.contrast_remainders=p})},a("Contrast remainders",c),c=d=>{d.checked=document.querySelector("#torrent-list").classList.contains("limit-width"),d.addEventListener("change",b=>{let{checked:p}=b.target;this.prefs.limit_width=p})},a("Limit width to 640px",c),n=document.createElement("h5"),o.append(n),n.textContent="style",l=document.createElement("div"),l.classList.add("table-row"),o.append(l),c=(d,b)=>{d.checked=!b||document.querySelector("#torrent-list").classList.contains(b),d.addEventListener("change",p=>{let{value:h}=p.target;this.prefs.progress_barrel=h})},i("progress-barrel","Flat",null,null,c),i("progress-barrel","Barrel not in selection","barrel-partial","partial",c),i("progress-barrel","Barrel","barrel-full","full",c),n=document.createElement("h4"),o.append(n),n.textContent="Refresh interval",l=document.createElement("div"),l.classList.add("table-row"),o.append(l);let g=d=>{let b=this.prefs.refresh_rate_sec===1?5:1;this.prefs.refresh_rate_sec=b,document.querySelector("#refresh-rate").textContent=`${b}s`,d.target.textContent=`${b}s`},m=document.createElement("BUTTON");return m.addEventListener("click",g.bind(this)),m.textContent=`${this.prefs.refresh_rate_sec}s`,l.append(m),e.confirm.remove(),delete e.confirm,e}};var ce=class extends EventTarget{constructor(e){super(),this.action_listener=this._update.bind(this),this.action_manager=e,this.action_manager.addEventListener("change",this.action_listener),Object.assign(this,this._create()),this.outside=new R(this.root),this.outside.addEventListener("click",()=>this.close()),this.show()}show(){for(let[e,t]of Object.entries(this.actions))W(t,this.action_manager.isEnabled(e));document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.action_manager.removeEventListener("change",this.action_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_update(e){let t=this.actions[e.action];t&&W(t,e.enabled)}_create(){let e=document.createElement("div");e.role="menu",e.classList.add("context-menu","popup"),e.addEventListener("contextmenu",l=>{l.preventDefault()}),e.style.pointerEvents="none";let t={},r=l=>{let a=document.createElement("div"),i=this.action_manager.text(l);a.role="menuitem",a.classList.add("context-menuitem"),a.dataset.action=l,a.textContent=i;let c=this.action_manager.keyshortcuts(l);return c&&a.setAttribute("aria-keyshortcuts",c),a.addEventListener("click",()=>{this.action_manager.click(l),this.close()}),t[l]=a,a},o=()=>{let l=document.createElement("div");return l.classList.add("context-menu-separator"),l},n=(l,...a)=>{let i=document.createElement("DIV");i.textContent=l,i.classList.add("context-menuitem");let c=document.createElement("DIV");c.classList="arrow",i.append(c);let g=document.createElement("DIV");g.classList="submenu",c.append(g);let m=document.createElement("DIV");return m.classList="open right",g.append(m),m.append(...a.map(d=>r(d))),i.addEventListener("click",d=>{let b=i.lastChild.lastChild;if(!d.target.classList.contains("right")&&!d.target.parentNode.classList.contains("right")&&!d.target.classList.contains("left")&&!d.target.parentNode.classList.contains("left")&&b.style.display==="block"){b.style.display="none";return}for(let x of document.querySelectorAll(".submenu"))x.style.display="none";b.style.display="block";let p=i.getBoundingClientRect(),h=b.lastChild.getBoundingClientRect(),C=Math.min(0,document.documentElement.clientHeight-window.visualViewport.offsetTop-p.top-b.clientHeight+5),y=Math.min(0,document.documentElement.clientWidth-window.visualViewport.offsetLeft-p.right-b.clientWidth);b.style.top=`${C}px`,y?(b.lastChild.classList="open left",b.style.left=`${-p.width-h.width}px`):(b.lastChild.classList="open right",b.style.left=`${y}px`)}),i};return e.append(r("resume-selected-torrents"),r("resume-selected-torrents-now"),r("pause-selected-torrents"),o(),n("Move in the queue","move-top","move-up","move-down","move-bottom"),n("Sequential download","enable-sequential-downloading","disable-sequential-downloading"),o(),r("verify-selected-torrents"),r("remove-selected-torrents"),o(),r("show-move-dialog"),r("show-rename-dialog"),r("show-labels-dialog"),o(),r("reannounce-selected-torrents"),o(),n("Select operation","select-all","deselect-all")),{actions:t,root:e}}};var Yt=new Intl.PluralRules,Q=Yt.resolvedOptions().locale,Ws=new Intl.NumberFormat(Q),et=1e3,ws=[new Intl.NumberFormat(Q,{maximumFractionDigits:0,style:"unit",unit:"byte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:0,style:"unit",unit:"kilobyte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:0,style:"unit",unit:"megabyte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"gigabyte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"terabyte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"petabyte"})],Ls=new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"kilobyte-per-second"}),Qs=new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"megabyte-per-second"}),Os=new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"gigabyte-per-second"}),B={_toTruncFixed(s,e){return(Math.floor(s*10**e)/10**e).toFixed(e)},countString(s,e,t){return`${this.number(t)} ${this.ngettext(s,e,t)}`},mem(s){if(s<0)return"Unknown";if(s===0)return"None";let e=s;for(let t of ws){if(es.includes(e))?"\u2026":s},timeInterval(s,e=3){let t=Math.floor(s/86400),r=[];t&&r.push(this.countString("day","days",t));let o=Math.floor(s%86400/3600);(t||o)&&r.push(this.countString("hour","hours",o));let n=Math.floor(s%3600/60);return t||o||n?(r.push(this.countString("minute","minutes",n)),r=r.slice(0,e),r.length>1?`${r.slice(0,-1).join(", ")} and ${r.slice(-1)}`:r[0]):this.countString("second","seconds",Math.floor(s%60))},timestamp(s){if(!s)return"N/A";let e=new Date(s*1e3),t=new Date,r="",o="",n=t.getFullYear()===e.getFullYear(),l=t.getMonth()===e.getMonth(),a=t.getDate()-e.getDate();n&&l&&Math.abs(a)<=1?a===0?r="Today":a===1?r="Yesterday":r="Tomorrow":r=e.toDateString();let i=e.getHours(),c="AM";i>12&&(i=i-12,c="PM"),i===0&&(i=12),i<10&&(i=`0${i}`);let g=e.getMinutes();return g<10&&(g=`0${g}`),s=e.getSeconds(),s<10&&(s=`0${s}`),o=[i,g,s].join(":"),[r,o,c].join(" ")},toKBps(s){return Math.floor(s/et)}};var Fe=class extends EventTarget{isDone(){return this.fields.have>=this.fields.size}isEditable(){return this.fields.torrent.getFileCount()>1&&!this.isDone()}refreshWantedHTML(){let e=this.elements.root;e.classList.toggle("skip",!this.fields.isWanted),e.classList.toggle("complete",this.isDone()),W(e.checkbox,this.isEditable()),e.checkbox.checked=this.fields.isWanted}refreshProgressHTML(){let{size:e,have:t}=this.fields,r=100*(e?t/e:1),o=B,n=`${o.size(t)} of ${o.size(e)} (${o.percentString(r)}%)`;I(this.elements.progress,n)}refresh(){let e=0,t=!1,r=!1,o=!1,n=0,l=!1,a=this.fields.torrent.getFiles();for(let i of this.fields.indices){let c=a[i];switch(e+=c.bytesCompleted,n+=c.length,l|=c.wanted,c.priority.toString()){case"-1":r=!0;break;case"1":t=!0;break;default:o=!0;break}}Ge(this.elements.priority_low_button,r),Ge(this.elements.priority_normal_button,o),Ge(this.elements.priority_high_button,t),(this.fields.have!==e||this.fields.size!==n)&&(this.fields.have=e,this.fields.size=n,this.refreshProgressHTML()),this.fields.isWanted!==l&&(this.fields.isWanted=l,this.refreshWantedHTML())}fireWantedChanged(e){let t=new Event("wantedToggled");t.indices=[...this.fields.indices],t.wanted=e,this.dispatchEvent(t)}firePriorityChanged(e){let t=new Event("priorityToggled");t.indices=[...this.fields.indices],t.priority=e,this.dispatchEvent(t)}createRow(e,t,r){let o=document.createElement("li");o.classList.add("inspector-torrent-file-list-entry"),this.elements.root=o;let n=document.createElement("input"),l=F();n.type="checkbox",n.className="file-wanted-control",n.title="Download file",n.id=l,n.addEventListener("change",c=>this.fireWantedChanged(c.target.checked)),o.checkbox=n,o.append(n),n=document.createElement("label"),n.className="inspector-torrent-file-list-entry-name",n.setAttribute("for",l),I(n,r),o.append(n),n=document.createElement("div"),n.className="inspector-torrent-file-list-entry-progress",o.append(n),this.elements.progress=n,n=document.createElement("div"),n.className="file-priority-radiobox";let a=n,i=c=>this.firePriorityChanged(c.target.value);n=document.createElement("input"),n.type="radio",n.value="-1",n.className="low",n.title="Low Priority",n.addEventListener("click",i),this.elements.priority_low_button=n,a.append(n),n=document.createElement("input"),n.type="radio",n.value="0",n.className="normal",n.title="Normal Priority",n.addEventListener("click",i),this.elements.priority_normal_button=n,a.append(n),n=document.createElement("input"),n.type="radio",n.value="1",n.title="High Priority",n.className="high",n.addEventListener("click",i),this.elements.priority_high_button=n,a.append(n),o.append(a),o.style.paddingLeft=`${t*20}px`,this.refresh()}getElement(){return this.elements.root}constructor(e,t,r,o){super(),this.fields={have:0,indices:o,isWanted:!0,size:0,torrent:e},this.elements={priority_high_button:null,priority_low_button:null,priority_normal_button:null,progress:null,root:null},this.createRow(e,t,r)}};var A=class s extends EventTarget{constructor(e){super(),this.fieldObservers={},this.fields={},this.refresh(e)}notifyOnFieldChange(e,t){this.fieldObservers[e]=this.fieldObservers[e]||[],this.fieldObservers[e].push(t)}setField(e,t,r){let o=e[t];if(Be(o,r))return!1;let n=this.fieldObservers[t];if(e===this.fields&&n&&n.length>0)for(let l of n)l.call(this,r,o,t);return e[t]=r,!0}updateFiles(e){let t=!1,r=this.fields.files||[],o=["length","name","bytesCompleted","wanted","priority"];for(let[n,l]of e.entries()){let a=r[n]||{};for(let i of o)i in l&&(t|=this.setField(a,i,l[i]));r[n]=a}return this.fields.files=r,t}static collateTrackers(e){return e.map(t=>t.announce.toLowerCase()).join(" ")}refreshFields(e){let t=!1;for(let[r,o]of Object.entries(e))switch(r){case"files":case"fileStats":t|=this.updateFiles(o);break;case"trackerStats":t|=this.setField(this.fields,"trackers",o);break;case"trackers":r in this.fields||(t|=this.setField(this.fields,r,o));break;case"name":this.setField(this.fields,r,e[r])&&(this.fields.collatedName="",t=!0);break;default:t|=this.setField(this.fields,r,o)}return t}refresh(e){this.refreshFields(e)&&this.dispatchEvent(new Event("dataChanged"))}getComment(){return this.fields.comment}getCreator(){return this.fields.creator}getDateAdded(){return this.fields.addedDate}getDateCreated(){return this.fields.dateCreated}getDesiredAvailable(){return this.fields.desiredAvailable}getDownloadDir(){return this.fields.downloadDir}getDownloadSpeed(){return this.fields.rateDownload}getDownloadedEver(){return this.fields.downloadedEver}getError(){return this.fields.error}getErrorString(){return this.fields.errorString}getETA(){return this.fields.eta}getFailedEver(){return this.fields.corruptEver}getFiles(){return this.fields.files||[]}getFile(e){return this.fields.files[e]}getFileCount(){return this.fields["file-count"]}getHashString(){return this.fields.hashString}getHave(){return this.getHaveValid()+this.getHaveUnchecked()}getHaveUnchecked(){return this.fields.haveUnchecked}getHaveValid(){return this.fields.haveValid}getId(){return this.fields.id}getLabels(){return this.fields.labels.sort()}getLastActivity(){return this.fields.activityDate}getLeftUntilDone(){return this.fields.leftUntilDone}getMagnetLink(){return this.fields.magnetLink}getMetadataPercentComplete(){return this.fields.metadataPercentComplete}getName(){return this.fields.name||"Unknown"}getPeers(){return this.fields.peers||[]}getPeersConnected(){return this.fields.peersConnected}getPeersGettingFromUs(){return this.fields.peersGettingFromUs}getPeersSendingToUs(){return this.fields.peersSendingToUs}getPieceCount(){return this.fields.pieceCount}getPieceSize(){return this.fields.pieceSize}getPrimaryMimeType(){return this.fields["primary-mime-type"]||"application/octet-stream"}getPrivateFlag(){return this.fields.isPrivate}getQueuePosition(){return this.fields.queuePosition}getRecheckProgress(){return this.fields.recheckProgress}getSeedRatioLimit(){return this.fields.seedRatioLimit}getSeedRatioMode(){return this.fields.seedRatioMode}getSizeWhenDone(){return this.fields.sizeWhenDone}getStartDate(){return this.fields.startDate}getStatus(){return this.fields.status}getTotalSize(){return this.fields.totalSize}getTrackers(){return this.fields.trackers||[]}getUploadSpeed(){return this.fields.rateUpload}getUploadRatio(){return this.fields.uploadRatio}getUploadedEver(){return this.fields.uploadedEver}getWebseedsSendingToUs(){return this.fields.webseedsSendingToUs}isFinished(){return this.fields.isFinished}hasExtraInfo(){return"hashString"in this.fields}isSeeding(){return this.getStatus()===s._StatusSeed}isSequentialDownload(){return this.fields.sequentialDownload}isStopped(){return this.getStatus()===s._StatusStopped}isChecking(){return this.getStatus()===s._StatusCheck}isDownloading(){return this.getStatus()===s._StatusDownload}isQueued(){return this.getStatus()===s._StatusDownloadWait||this.getStatus()===s._StatusSeedWait}isDone(){return this.getLeftUntilDone()<1}needsMetaData(){return this.getMetadataPercentComplete()<1}getActivity(){return this.getDownloadSpeed()+this.getUploadSpeed()}getPercentDoneStr(){return B.percentString(100*this.getPercentDone(),1)}getPercentDone(){return this.fields.percentDone}getStateString(){switch(this.getStatus()){case s._StatusStopped:return this.isFinished()?"Seeding complete":"Paused";case s._StatusCheckWait:return"Queued for verification";case s._StatusCheck:return"Verifying local data";case s._StatusDownloadWait:return"Queued for download";case s._StatusDownload:return"Downloading";case s._StatusSeedWait:return"Queued for seeding";case s._StatusSeed:return"Seeding";case null:return"Unknown";default:return"Error"}}seedRatioLimit(e){switch(this.getSeedRatioMode()){case s._RatioUseGlobal:return e.seedRatioLimit();case s._RatioUseLocal:return this.getSeedRatioLimit();default:return-1}}getErrorMessage(){let e=this.getErrorString();switch(this.getError()){case s._ErrTrackerWarning:return`Tracker returned a warning: ${e}`;case s._ErrTrackerError:return`Tracker returned an error: ${e}`;case s._ErrLocalError:return`Error: ${e}`;default:return null}}getCollatedName(){let e=this.fields;return!e.collatedName&&e.name&&(e.collatedName=e.name.toLowerCase()),e.collatedName||""}getCollatedTrackers(){let e=this.fields;return!e.collatedTrackers&&e.trackers&&(e.collatedTrackers=s.collateTrackers(e.trackers)),e.collatedTrackers||""}testState(e,t){switch(t){case u.FilterActive:return this.getPeersGettingFromUs()>0||this.getPeersSendingToUs()>0||this.getWebseedsSendingToUs()>0||this.isChecking();case u.FilterSeeding:return e===s._StatusSeed||e===s._StatusSeedWait;case u.FilterDownloading:return e===s._StatusDownload||e===s._StatusDownloadWait;case u.FilterPaused:return this.isStopped();case u.FilterFinished:return this.isFinished();default:return!0}}test(e){let t=null,r=(o,n,l)=>o.length===0?!0:(t=n(),o.some(a=>a.every(i=>l(i))));return r(e.search,()=>this.getCollatedName(),o=>t.includes(o))&&r(e.labels,()=>this.getLabels(),o=>t.some(n=>n.includes(o)))&&r(e.states,()=>this.getStatus(),o=>this.testState(t,o))&&r(e.trackers,()=>this.getCollatedTrackers(),o=>t.includes(o))}static compareById(e,t){return e.getId()-t.getId()}static compareByName(e,t){return e.getCollatedName().localeCompare(t.getCollatedName())||s.compareById(e,t)}static compareByQueue(e,t){return e.getQueuePosition()-t.getQueuePosition()}static compareByAge(e,t){let r=e.getDateAdded();return t.getDateAdded()-r||s.compareByQueue(e,t)}static compareByState(e,t){let r=e.getStatus();return t.getStatus()-r||s.compareByQueue(e,t)}static compareByActivity(e,t){let r=e.getActivity();return t.getActivity()-r||s.compareByState(e,t)}static compareByRatio(e,t){let r=e.getUploadRatio(),o=t.getUploadRatio();return ro?-1:s.compareByState(e,t)}static compareByProgress(e,t){let r=e.getPercentDone(),o=t.getPercentDone();return r-o||s.compareByRatio(e,t)}static compareBySize(e,t){let r=e.getTotalSize(),o=t.getTotalSize();return r-o||s.compareByName(e,t)}static compareTorrents(e,t,r,o){let n=0;switch(r){case u.SortByActivity:n=s.compareByActivity(e,t);break;case u.SortByAge:n=s.compareByAge(e,t);break;case u.SortByQueue:n=s.compareByQueue(e,t);break;case u.SortByProgress:n=s.compareByProgress(e,t);break;case u.SortBySize:n=s.compareBySize(e,t);break;case u.SortByState:n=s.compareByState(e,t);break;case u.SortByRatio:n=s.compareByRatio(e,t);break;case u.SortByName:n=s.compareByName(e,t);break;default:console.log(`Unrecognized sort mode: ${r}`),n=s.compareByName(e,t);break}return o===u.SortDescending&&(n=-n),n}static sortTorrents(e,t,r){switch(t){case u.SortByActivity:e.sort(this.compareByActivity);break;case u.SortByAge:e.sort(this.compareByAge);break;case u.SortByName:e.sort(this.compareByName);break;case u.SortByProgress:e.sort(this.compareByProgress);break;case u.SortByQueue:e.sort(this.compareByQueue);break;case u.SortByRatio:e.sort(this.compareByRatio);break;case u.SortBySize:e.sort(this.compareBySize);break;case u.SortByState:e.sort(this.compareByState);break;default:console.log(`Unrecognized sort mode: ${t}`),e.sort(this.compareByName);break}return r===u.SortDescending&&e.reverse(),e}};A._StatusStopped=0;A._StatusCheckWait=1;A._StatusCheck=2;A._StatusDownloadWait=3;A._StatusDownload=4;A._StatusSeedWait=5;A._StatusSeed=6;A._RatioUseGlobal=0;A._RatioUseLocal=1;A._RatioUnlimited=2;A._ErrNone=0;A._ErrTrackerWarning=1;A._ErrTrackerError=2;A._ErrLocalError=3;A._TrackerInactive=0;A._TrackerWaiting=1;A._TrackerQueued=2;A._TrackerActive=3;A.Fields={};A.Fields.Metadata=["addedDate","file-count","name","primary-mime-type","totalSize"];A.Fields.Stats=["error","errorString","eta","isFinished","isStalled","labels","leftUntilDone","metadataPercentComplete","peersConnected","peersGettingFromUs","peersSendingToUs","percentDone","queuePosition","rateDownload","rateUpload","recheckProgress","seedRatioMode","seedRatioLimit","sequentialDownload","sizeWhenDone","status","trackers","downloadDir","uploadedEver","uploadRatio","webseedsSendingToUs"];A.Fields.InfoExtra=["comment","creator","dateCreated","files","hashString","isPrivate","magnetLink","pieceCount","pieceSize"];A.Fields.StatsExtra=["activityDate","corruptEver","desiredAvailable","downloadedEver","fileStats","haveUnchecked","haveValid","peers","startDate","trackerStats"];var Tt=["encryption","speed-up","speed-down","percent-done","status","peer-address","peer-app-name"],le=class s extends EventTarget{constructor(e){super(),this.canvas=null,this.context=null,this.closed=!1,this.controller=e,this.elements=this._create(),this.current_page=this.elements.info.root,this.interval=setInterval(this._refreshTorrents.bind(this),3e3),this.name="inspector",this.selection_listener=t=>this._setTorrents(t.selected),this.torrent_listener=()=>this._updateCurrentPage(),this.torrents=[],this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null,this.elements.dismiss.addEventListener("click",()=>this.close()),Object.seal(this),e.addEventListener("torrent-selection-changed",this.selection_listener),this._setTorrents(this.controller.getSelectedTorrents()),document.querySelector("#mainwin-workarea").append(this.elements.root)}close(){if(!this.closed){clearInterval(this.interval),this._setTorrents([]),this.elements.root.remove(),this.controller.removeEventListener("torrent-selection-changed",this.selection_listener),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}static _createInfoPage(e){let t=document.createElement("div");t.classList.add("inspector-info-page");let r={root:t},o=c=>{let g=document.createElement("div");g.textContent=c,g.classList.add("section-label"),t.append(g)},n=c=>{let g=document.createElement("label");I(g,c),t.append(g);let m=document.createElement("span");return t.append(m),m},l=document.createElement("button");l.innerHTML="⋮",l.className="tabs-container-menu",l.addEventListener("click",()=>{e.action_manager.click("show-context-menu")});let a=e.pointer_device;a.is_touch_device?(l.addEventListener("touchmove",()=>{a.x=event_.touches[0].pageX,a.y=event_.touches[0].pageY}),l.addEventListener("touchend",()=>{setTimeout(()=>{let c=e.popup[1];c&&(c.root.style.pointerEvents="auto")},1)})):(l.addEventListener("mousemove",c=>{a.x=c.pageX,a.y=c.pageY}),l.addEventListener("mouseup",()=>{setTimeout(()=>{let c=e.popup[1];c&&(c.root.style.pointerEvents="auto")},1)})),t.append(l),o("Activity");let i=[["have","Have:"],["availability","Availability:"],["uploaded","Uploaded:"],["downloaded","Downloaded:"],["sequential_download","Sequential download:"],["state","State:"],["running_time","Running time:"],["remaining_time","Remaining:"],["last_activity","Last activity:"],["error","Error:"]];for(let[c,g]of i)r[c]=n(g);o("Details"),i=[["name","Name:"],["size","Size:"],["location","Location:"],["hash","Hash:"],["privacy","Privacy:"],["origin","Origin:"],["dateAdded","Date added:"],["magnetLink","Magnet:"],["comment","Comment:"],["labels","Labels:"]];for(let[c,g]of i)r[c]=n(g);return r}static _createListPage(e,t){let r=document.createElement("div"),o=document.createElement(e);return o.id=t,r.append(o),{list:o,root:r}}static _createTiersPage(){return s._createListPage("div","inspector-tiers-list")}static _createFilesPage(){return s._createListPage("ul","inspector-file-list")}static _createPeersPage(){let e=document.createElement("table");e.classList.add("peer-list");let t=document.createElement("thead"),r=document.createElement("tr"),o=["","Up","Down","Done","Status","Address","Client"];for(let[l,a]of o.entries()){let i=document.createElement("th"),c=Tt[l];c==="encryption"&&(i.dataset.encrypted=!0),i.classList.add(c),I(i,a),r.append(i)}let n=document.createElement("tbody");return t.append(r),e.append(t),e.append(n),{root:e,tbody:n}}static _createPiecesPage(){let e=document.createElement("div");return e.style.lineHeight=0,{root:e,count:0}}_create(){let e={files:s._createFilesPage(),info:s._createInfoPage(this.controller),peers:s._createPeersPage(),pieces:s._createPiecesPage(),tiers:s._createTiersPage()},t=o=>{this.current_page=o,this._updateCurrentPage()};return{...Xe("inspector",[["inspector-tab-info",e.info.root,"Info"],["inspector-tab-pieces",e.pieces.root,"Pieces"],["inspector-tab-peers",e.peers.root,"Peers"],["inspector-tab-tiers",e.tiers.root,"Tiers"],["inspector-tab-files",e.files.root,"Files"]],t.bind(this)),...e}}_setTorrents(e){let t="dataChanged",r=this.torrent_listener;for(let o of this.torrents)o.removeEventListener(t,r);this.torrents=[...e];for(let o of this.torrents)o.addEventListener(t,r);this._refreshTorrents(),this._updateCurrentPage()}static _needsExtraInfo(e){return e.some(t=>!t.hasExtraInfo())}_refreshTorrents(){let{controller:e,torrents:t}=this,r=t.map(o=>o.getId());if(r&&r.length>0){let o=["id",...A.Fields.StatsExtra];s._needsExtraInfo(t)&&o.push(...A.Fields.InfoExtra),e.updateTorrents(r,o)}}_updateCurrentPage(){let{current_page:e,elements:t}=this;switch(e){case t.files.root:this._updateFiles();break;case t.info.root:this._updateInfo();break;case t.pieces.root:this._updatePiecesDIV();break;case t.peers.root:this._updatePeers();break;case t.tiers.root:this._updateTiers();break;default:console.warn("unexpected page"),console.log(e)}}_updateInfo(){let e="None",t="Mixed",r="Unknown",o=B,n=Date.now(),{elements:l,torrents:a}=this,i=a.reduce((d,b)=>d+b.getSizeWhenDone(),0),c=null;if(a.length===0)c=e;else if(a.every(d=>d.isFinished()))c="Finished";else if(a.every(d=>d.isStopped()))c="Paused";else{let d=p=>p.getStateString(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}I(l.info.state,c);let g=c;if(a.length===0)c=e;else{let d=a.reduce((C,y)=>C+y.getHaveValid(),0),b=a.reduce((C,y)=>C+y.getHaveUnchecked(),0),p=a.reduce((C,y)=>C+y.getLeftUntilDone(),0),h=100*(i?(i-p)/i:1);c=o.percentString(h),b?c=`${o.size(d)} of ${o.size(i)} (${c}%), ${o.size(b)} Unverified`:p?c=`${o.size(d)} of ${o.size(i)} (${c}%)`:c=`${o.size(d)} (100%)`}if(I(l.info.have,o.stringSanitizer(c)),a.length===0)c=e;else if(i===0)c=e;else{let d=a.reduce((b,p)=>p.getHave()+p.getDesiredAvailable(),0);c=`${o.percentString(100*d/i)}%`}if(I(l.info.availability,o.stringSanitizer(c)),a.length===0)c=e;else{let d=a.reduce((p,h)=>p+h.getDownloadedEver(),0),b=a.reduce((p,h)=>p+h.getFailedEver(),0);c=b?`${o.size(d)} (+${o.size(b)} discarded after failed checksum)`:o.size(d)}if(I(l.info.downloaded,o.stringSanitizer(c)),a.length===0)c=e;else{let d=a.reduce((p,h)=>p+h.getUploadedEver(),0),b=a.reduce((p,h)=>p+h.getSizeWhenDone(),0)||a.reduce((p,h)=>p+h.getHaveValid(),0);c=`${o.size(d)} (Ratio: ${o.ratioString(ne.ratio(d,b))})`}if(I(l.info.uploaded,c),a.length===0)c=e;else if(a.every(d=>d.isStopped()))c=g;else{let d=p=>p.getStartDate(),b=d(a[0]);c=a.every(p=>d(p)===b)?o.timeInterval(n/1e3-b):t}if(I(l.info.running_time,c),a.length===0)c=e;else{let d=p=>p.getETA(),b=d(a[0]);a.every(p=>d(p)===b)?b<0?c=r:c=o.timeInterval(b):c=t}if(I(l.info.remaining_time,c),a.length===0)c=e;else{let d=a.reduce((p,h)=>Math.max(p,h.getLastActivity()),-1),b=Math.floor(n/1e3);if(0p.getErrorString(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}if(I(l.info.error,c||e),a.length===1?c=a[0].getName():c=a.length>0?t:e,I(l.info.name,c),a.length===0)c=e;else{let d=a.reduce((b,p)=>b+p.getTotalSize(),0);if(d){let b=y=>y.getPieceSize(),p=a.reduce((y,x)=>y+x.getPieceCount(),0),h=o.number(p),C=b(a[0]);c=a.every(y=>b(y)===C)?`${o.size(d)} (${h} pieces @ ${o.mem(C)})`:`${o.size(d)} (${h} pieces)`}else c="None"}if(I(l.info.size,o.stringSanitizer(c)),a.length===0)c=e;else{let d=p=>p.getHashString(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}if(I(l.info.hash,c),a.length===0)c=e;else{let d=p=>p.getPrivateFlag(),b=d(a[0]);a.every(p=>d(p)===b)?b?c="Private to this tracker -- DHT and PEX disabled":c="Public torrent":c=t}if(I(l.info.privacy,c),a.length===0)c=e;else{let d=p=>p.getComment(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}if(c=c||e,c.startsWith("https://")||c.startsWith("http://")?(c=encodeURI(c),l.info.comment.innerHTML=`${c}`):I(l.info.comment,c),c=a.length===0?e:a[0].getLabels().join(", "),I(l.info.labels,c),a.length===0)c=e;else{let d=f=>f.getCreator(),b=d(a[0]),p=!a.every(f=>d(f)===b);d=f=>f.getDateCreated();let h=d(a[0]),C=!a.every(f=>d(f)===h),y=!b||b.length===0,x=!h;p||C?c=t:y&&x?c=r:x&&!y?c=`Created by ${b}`:y&&!x?c=`Created on ${new Date(h*1e3).toDateString()}`:c=`Created by ${b} on ${new Date(h*1e3).toDateString()}`}if(I(l.info.origin,c),a.length===0)c=e;else{let d=p=>p.getDownloadDir(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}if(I(l.info.location,c),a.length===0)c=e;else{let d=p=>p.getDateAdded(),b=d(a[0]);c=a.every(p=>d(p)===b)?new Date(b*1e3).toLocaleString(navigator.language,{day:"2-digit",hour:"2-digit",hour12:!1,minute:"2-digit",month:"short",second:"2-digit",timeZoneName:"short",weekday:"short",year:"numeric"}):t}if(I(l.info.dateAdded,c),a.length===0)I(l.info.magnetLink,e);else if(a.length>1)I(l.info.magnetLink,t);else{let d=a[0].getMagnetLink();l.info.magnetLink.innerHTML=``}let m=a.reduce((d,b)=>(b=b.isSequentialDownload()?"Yes":"No",d!==e&&d!==b?t:b),e);I(l.info.sequential_download,m)}_updatePieces(){let{pieces:e}=this.elements,{torrents:t}=this,r=8,o=r*4;this.canvas||(console.log("PieceView page standby"),this.canvas=document.createElement("canvas"),e.root.append(this.canvas));let n=this.canvas.getContext("2d");if(t.length>0){let b=t[0].getTotalSize();if(b){let p=t[0].getPieceCount(),h=t[0].getPieceSize();if(!e.count||e.count!==p){e.count=p,console.log("Total MB",b/1048576),console.log("Pieces",p),console.log("MB per piece",h/1048576);let C=Math.ceil(p/o),y=p%o;this.canvas.width=o*r+3,this.canvas.height=C*r+3,n.fillStyle="rgba(128, 128, 144, 0.5)",n.fillRect(0,0,this.canvas.width,this.canvas.height),n.fillStyle="rgba(255, 255, 255, 1)";for(let x of Array(C).keys()){let f=x*r;for(let H of Array(x===C-1?y:o).keys()){let X=H*r;n.fillRect(X+2,f+2,r-1,r-1)}}}e.root.style.display="block"}else console.log("no size"),e.root.style.display="none"}else console.log("no torrent selected"),e.root.style.display="none";let l="rgba(255, 168, 16, 0.75)",a="rgba(56, 136, 255, 0.75)",i="rgba(128, 192, 255, 0.75)",c=parseInt(Date.now()/100),g=c%o*r,m=parseInt(c/o)%16*r,d=[g+2,m+2,r-1,r-1];n.clearRect(...d),n.fillStyle=i,n.fillRect(...d)}_updatePiecesDIV(){let{pieces:e}=this.elements,{torrents:t}=this;if(t.length>0)if(t[0].getTotalSize()){let n=t[0].getPieceCount(),l=t[0].getPieceSize();if(!e.count||e.count!==n){e.count=n;for(let a of Array(n).keys()){let i=document.createElement("DIV");i.classList="piece",e.root.append(i)}}e.root.style.display="block"}else console.log("no size"),e.root.style.display="none";else console.log("no torrent selected"),e.root.style.display="none";let r=parseInt(Date.now()/100);e.root.children[r%1024].classList="piece active",e.root.children[r%1024+1].classList="piece weak",e.root.children[r%1024+2].classList="piece med",e.root.children[r%1024+3].classList="piece strong"}static _peerStatusTitle(e){let t=Object.seal({"?":"We unchoked this peer, but they're not interested",D:"Downloading from this peer",E:"Encrypted Connection",H:"Peer was discovered through Distributed Hash Table (DHT)",I:"Peer is an incoming connection",K:"Peer has unchoked us, but we're not interested",O:"Optimistic unchoke",T:"Peer is connected via uTP",U:"Uploading to peer",X:"Peer was discovered through Peer Exchange (PEX)",d:"We would download from this peer if they'd let us",u:"We would upload to this peer if they'd ask"});return[...e].filter(r=>t[r]).map(r=>`${r}: ${t[r]}`).join(` -`)}_updatePeers(){let e=B,{elements:t,torrents:r}=this,{tbody:o}=t.peers,n=[(a,i)=>{i.dataset.encrypted=a.isEncrypted},(a,i)=>I(i,a.rateToPeer?e.speedBps(a.rateToPeer):""),(a,i)=>I(i,a.rateToClient?e.speedBps(a.rateToClient):""),(a,i)=>I(i,`${Math.floor(a.progress*100)}%`),(a,i)=>{I(i,a.flagStr),i.setAttribute("title",s._peerStatusTitle(a.flagStr))},(a,i)=>I(i,a.address),(a,i)=>I(i,a.clientName)],l=[];for(let a of r){let i=document.createElement("tr");i.classList.add("torrent-row");let c=document.createElement("td");c.setAttribute("colspan",n.length),I(c,a.getName()),i.append(c),l.push(i);for(let g of a.getPeers()){let m=document.createElement("tr");m.classList.add("peer-row");for(let[d,b]of n.entries()){let p=document.createElement("td");p.classList.add(Tt[d]),b(g,p),m.append(p)}l.push(m)}for(;o.firstChild;)o.firstChild.remove();o.append(...l)}}static getAnnounceState(e){switch(e.announceState){case A._TrackerActive:return"Announce in progress";case A._TrackerWaiting:{let t=Math.max(0,e.nextAnnounceTime-Date.now()/1e3);return`Next announce in ${B.timeInterval(t)}`}case A._TrackerQueued:return"Announce is queued";case A._TrackerInactive:return e.isBackup?"Tracker will be used as a backup":"Announce not scheduled";default:return`unknown announce state: ${e.announceState}`}}static lastAnnounceStatus(e){let t="Last Announce",r=["N/A"];if(e.hasAnnounced){let o=B.timestamp(e.lastAnnounceTime);e.lastAnnounceSucceeded?r=[o," (got ",B.countString("peer","peers",e.lastAnnouncePeerCount),")"]:(t="Announce error",r=[e.lastAnnounceResult?`${e.lastAnnounceResult} - `:"",o])}return{label:t,value:r.join("")}}static lastScrapeStatus(e){let t="Last Scrape",r="N/A";if(e.hasScraped){let o=B.timestamp(e.lastScrapeTime);e.lastScrapeSucceeded?r=o:(t="Scrape error",r=(e.lastScrapeResult?`${e.lastScrapeResult} - `:"")+o)}return{label:t,value:r}}static _getOrigin(e){try{let t="udp://";if(e.announce.startsWith(t)){let o="http://",n=e.announce.replace(t,o);return new URL(n).origin.replace(o,t)}return new URL(e.announce).origin}catch{return[e.sitename||e.host||e.announce]}}_updateTiers(){let e="N/A",{list:t}=this.elements.tiers,{torrents:r}=this,o=[];for(let n of r){if(r.length>1){let l=document.createElement("div");l.classList.add("tier-list-torrent"),I(l,n.getName()),o.push(l)}for(let l of n.getTrackers()){let a=s.getAnnounceState(l),i=s.lastAnnounceStatus(l),c=s.lastScrapeStatus(l),g=document.createElement("div");g.classList.add("tier-list-row");let m=document.createElement("div"),d=s._getOrigin(l);m.classList.add("tier-list-tracker"),I(m,`${d} - tier ${l.tier+1}`),m.setAttribute("title",l.announce),g.append(m),m=document.createElement("div"),m.classList.add("tier-announce"),I(m,`${i.label}: ${i.value}`),g.append(m),m=document.createElement("div"),m.classList.add("tier-seeders"),I(m,`Seeders: ${l.seederCount>-1?l.seederCount:e}`),g.append(m),m=document.createElement("div"),m.classList.add("tier-state"),I(m,a),g.append(m),m=document.createElement("div"),m.classList.add("tier-leechers"),I(m,`Leechers: ${l.leecherCount>-1?l.leecherCount:e}`),g.append(m),m=document.createElement("div"),m.classList.add("tier-scrape"),I(m,`${c.label}: ${c.value}`),g.append(m),m=document.createElement("div"),m.classList.add("tier-downloads"),I(m,`Downloads: ${l.downloadCount>-1?l.downloadCount:e}`),g.append(m),o.push(g)}}for(;t.firstChild;)t.firstChild.remove();t.append(...o)}_changeFileCommand(e,t){let{controller:r,file_torrent:o}=this,n=o.getId();r.changeFileCommand(n,e,t)}_onFileWantedToggled(e){let{indices:t,wanted:r}=e;this._changeFileCommand(t,r?"files-wanted":"files-unwanted")}_onFilePriorityToggled(e){let{indices:t,priority:r}=e,o=null;switch(r.toString()){case"-1":o="priority-low";break;case"1":o="priority-high";break;default:o="priority-normal";break}this._changeFileCommand(t,o)}_clearFileList(){let{list:e}=this.elements.files;for(;e.firstChild;)e.firstChild.remove();this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null}static createFileTreeModel(e){let t=[],r={children:{},file_indices:[]};for(let[o,n]of e.getFiles().entries()){let{name:l}=n,a=l.split("/"),i=r;for(let[c,g]of a.entries()){let m=i.children[g];m||(i.children[g]=m={children:{},depth:c,file_indices:[],name:g,parent:i}),i=m}i.file_index=o,delete i.children,t.push(i)}for(let o of t){let{file_index:n}=o,l=o;do l.file_indices.push(n),l=l.parent;while(l)}return r}addNodeToView(e,t,r){let o=new Fe(e,r.depth,r.name,r.file_indices);o.addEventListener("wantedToggled",this._onFileWantedToggled.bind(this)),o.addEventListener("priorityToggled",this._onFilePriorityToggled.bind(this)),this.file_rows.push(o),t.append(o.getElement())}addSubtreeToView(e,t,r){if(r.parent&&this.addNodeToView(e,t,r),r.children)for(let o of Object.values(r.children))this.addSubtreeToView(e,t,o)}_updateFiles(){let{list:e}=this.elements.files,{file_rows:t,file_torrent:r,file_torrent_n:o,torrents:n}=this;if(n.length!==1){this._clearFileList();return}let[l]=n,a=l.getFiles().length;if(l!==r||a!==o){this._clearFileList(),this.file_torrent=l,this.file_torrent_n=a,this.file_rows=[];let i=document.createDocumentFragment(),c=s.createFileTreeModel(l);this.addSubtreeToView(l,i,c),e.append(i)}else for(let i of t)i.refresh()}};var He="",Je=class s extends EventTarget{constructor(e,t,r){super(),this.controller=e,this.remote=t,this.action_input_value=r,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();e.length!==0&&(He=He||e[0].getDownloadDir(),this.torrents=e,this.elements=s._create(this.action_input_value===null?"Apply":"Confirm"),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.entry.value=this.action_input_value===null?He:this.action_input_value,document.body.append(this.elements.root),this.elements.entry.focus())}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.action_input_value===null?this.close():this.controller.action_manager.click("show-inspector")}_onConfirm(){let e=this.torrents.map(r=>r.getId()),t=this.elements.entry.value.trim();He=t,this.remote.moveTorrents(e,t),this._onDismiss()}static _create(e){let t=J("move-dialog");t.root.setAttribute("aria-label","Move Torrent"),t.heading.textContent="Set Torrent Location",t.confirm.textContent=e;let r=document.createElement("label");r.setAttribute("for","torrent-path"),r.textContent="Location:",t.workarea.append(r);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-path",t.entry=o,t.workarea.append(o),t}};var j=class s extends EventTarget{constructor(e){super(),this.elements=s._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.options=e,document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}static _create(e){let{heading:t,message:r}=e,o=J("confirm-dialog");return o.confirm.remove(),delete o.confirm,o.heading.textContent=t,o.workarea.textContent=r,o}};var $=class extends EventTarget{constructor(e,t,r="",o=[]){super(),this.controller=e,this.remote=t,this.elements=this._create(r),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),o.length>0&&(this.elements.file_input.files=o),this._updateFreeSpaceInAddDialog(),this.elements.url_input.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_updateFreeSpaceInAddDialog(){let e=this.elements.folder_input.value;this.remote.getFreeSpace(e,(t,r)=>{if(!this.closed){let o=r>0?`${B.size(r)} Free`:"";this.elements.freespace.textContent=o}})}_onConfirm(){let{controller:e,elements:t,remote:r}=this,{file_input:o,folder_input:n,start_input:l,url_input:a}=t,i=!l.checked,c=n.value.trim();for(let m of o.files){let d=new FileReader;d.addEventListener("load",b=>{let p=b.target.result,h="base64,",C=p.indexOf(h);if(C===-1)return;let y={arguments:{"download-dir":c,metainfo:p.slice(Math.max(0,C+h.length)),paused:i},method:"torrent-add"};r.sendRequest(y,x=>{x.result!=="success"&&(alert(`Error adding "${m.name}": ${x.result}`),e.setCurrentPopup(new j({heading:`Error adding "${m.name}"`,message:x.result})))})}),d.readAsDataURL(m)}let g=a.value.trim();if(g.length>0){/^[\da-f]{40}$/i.test(g)&&(g=`magnet:?xt=urn:btih:${g}`);let m={arguments:{"download-dir":c,filename:g,paused:i},method:"torrent-add"};r.sendRequest(m,d=>{d.result!=="success"&&e.setCurrentPopup(new j({heading:`Error adding "${g}"`,message:d.result}))})}this._onDismiss()}_create(e){let t=J(),{confirm:r,root:o,heading:n,workarea:l}=t;o.classList.add("open-torrent"),n.textContent="Add Torrents",r.textContent="Add";let a=F(),i=document.createElement("label");i.setAttribute("for",a),i.textContent="Please select torrent files to add:",l.append(i);let c=document.createElement("input");c.type="file",c.name="torrent-files[]",c.id=a,c.multiple="multiple",l.append(c),t.file_input=c,a=F(),i=document.createElement("label"),i.setAttribute("for",a),i.textContent="Or enter a URL:",l.append(i),c=document.createElement("input"),c.type="url",c.id=a,c.value=e,l.append(c),t.url_input=c,c.addEventListener("keyup",({key:b})=>{b==="Enter"&&r.click()}),a=F(),i=document.createElement("label"),i.id="add-dialog-folder-label",i.for=a,i.textContent="Destination folder: ",l.append(i);let g=document.createElement("span");g.id="free-space-text",i.append(g),l.append(i),t.freespace=g,c=document.createElement("input"),c.type="text",c.id="add-dialog-folder-input",c.addEventListener("change",()=>this._updateFreeSpaceInAddDialog()),c.value=this.controller.session_properties["download-dir"],l.append(c),t.folder_input=c;let m=document.createElement("div");l.append(m);let d=document.createElement("input");return d.type="checkbox",d.id="auto-start-check",d.checked=this.controller.shouldAddedTorrentsStart(),m.append(d),t.start_input=d,i=document.createElement("label"),i.id="auto-start-label",i.setAttribute("for",d.id),i.textContent="Start when added",m.append(i),t}};var tt=[0],G={_DaemonVersion:"version",_DownSpeedLimit:"speed-limit-down",_DownSpeedLimited:"speed-limit-down-enabled",_QueueMoveBottom:"queue-move-bottom",_QueueMoveDown:"queue-move-down",_QueueMoveTop:"queue-move-top",_QueueMoveUp:"queue-move-up",_Root:"../rpc/",_TurtleDownSpeedLimit:"alt-speed-down",_TurtleState:"alt-speed-enabled",_TurtleUpSpeedLimit:"alt-speed-up",_UpSpeedLimit:"speed-limit-up",_UpSpeedLimited:"speed-limit-up-enabled"},ae=class s{constructor(e){this._connection_alert=null,this._controller=e,this._session_id=""}sendRequest(e,t,r){let o=new Headers;o.append("cache-control","no-cache"),o.append("content-type","application/json"),o.append("pragma","no-cache"),this._session_id&&o.append(s._SessionHeader,this._session_id);let n=null,l=G._Root;fetch(l,{body:JSON.stringify(e),headers:o,method:"POST"}).then(a=>{if(n=a,a.status===409){let i=new Error(s._SessionHeader);throw i.header=a.headers.get(s._SessionHeader),i}return a.json()}).then(a=>{t&&t.call(r,a,n),this._connection_alert&&(this._connection_alert.close(),this._connection_alert=null)}).catch(a=>{if(a.message===s._SessionHeader){this._session_id=a.header,this.sendRequest(e,t,r);return}console.trace(a),this._controller.togglePeriodicSessionRefresh(!1),this._controller.setCurrentPopup(new j({heading:"Connection failed",message:"Could not connect to the server. You may need to reload the page to reconnect."}))})}loadDaemonPrefs(e,t){let r={method:"session-get"};this.sendRequest(r,e,t)}checkPort(e,t,r){let o={arguments:{ipProtocol:e},method:"port-test"};this.sendRequest(o,t,r)}renameTorrent(e,t,r,o,n){let l={arguments:{ids:e,name:r,path:t},method:"torrent-rename-path"};this.sendRequest(l,o,n)}setLabels(e,t,r){let o={ids:e,labels:t};this.sendRequest({arguments:o,method:"torrent-set"},r)}loadDaemonStats(e,t){let r={method:"session-stats"};this.sendRequest(r,e,t)}updateTorrents(e,t,r,o,n){let l={arguments:{fields:t,format:"table"},method:"torrent-get"};e&&(l.arguments.ids=e),this.sendRequest(l,a=>{let i;if(!n){i=a.arguments,r.call(o,i.torrents,i.removed);return}i={removed:[],torrents:[]},i.torrents=[["id","addedDate","file-count","name","primary-mime-type","totalSize","error","errorString","eta","isFinished","isStalled","labels","leftUntilDone","metadataPercentComplete","peersConnected","peersGettingFromUs","peersSendingToUs","percentDone","queuePosition","rateDownload","rateUpload","recheckProgress","seedRatioMode","seedRatioLimit","sizeWhenDone","status","trackers","downloadDir","uploadedEver","uploadRatio","webseedsSendingToUs"]],tt[0]+=256e6;for(let[c,g]of[9993,9994,9995,9996,9997,9998,9999].entries()){let m=[g,1680120820,16,`Demo torrent ${String(g).padStart(2,"0")}`,"application/octet-stream",64e9,0,"",-1,!0,!1,["demo",`state ${c}`],[9996,9997].includes(g)?4096:0,1,64,8,16,.4864,0,tt[0],tt[0],.4864,[9996,9997].includes(g)?0:1,1,0,c,[],"Z:/Discovery/Transmission",2048e8,.4864,0];i.torrents.push(m),i.torrents[i.torrents.length-1][i.torrents[0].indexOf("trackers")]=[{announce:"udp://torrent.net:3333",id:0,scrape:"udp://torrent.net:3333",sitename:"torrent",tier:0},{announce:"udp://torrent.org:6666",id:1,scrape:"udp://torrent.org:6666",sitename:"torrent",tier:1},{announce:"udp://transmission.me:1111/announce",id:2,scrape:"udp://transmission.me:1111/scrape",sitename:"transmission",tier:2},{announce:"udp://transmission.me:2222/announce",id:3,scrape:"udp://transmission.me:2222/scrape",sitename:"transmission",tier:2},{announce:"udp://transmission.to:3333/announce",id:4,scrape:"udp://transmission.to:3333/scrape",sitename:"transmission",tier:4},{announce:"udp://transmission.to:5555/announce",id:5,scrape:"udp://transmission.to:5555/scrape",sitename:"transmission",tier:4}]}r.call(o,i.torrents,i.removed)})}getFreeSpace(e,t,r){let o={arguments:{path:e},method:"free-space"};this.sendRequest(o,n=>{let l=n.arguments;t.call(r,l.path,l["size-bytes"])})}changeFileCommand(e,t,r){let o={ids:[e]};o[r]=t,this.sendRequest({arguments:o,method:"torrent-set"},()=>{this._controller.refreshTorrents([e])})}sendTorrentSetRequests(e,t,r,o,n){r||(r={}),r.ids=t;let l={arguments:r,method:e};this.sendRequest(l,o,n)}sendTorrentActionRequests(e,t,r,o){this.sendTorrentSetRequests(e,t,null,r,o)}startTorrents(e,t,r,o){let n=t?"torrent-start-now":"torrent-start";this.sendTorrentActionRequests(n,e,r,o)}stopTorrents(e,t,r){this.sendTorrentActionRequests("torrent-stop",e,t,r)}moveTorrents(e,t,r,o){this.sendTorrentSetRequests("torrent-set-location",e,{location:t,move:!0},r,o)}removeTorrents(e,t){let r={arguments:{"delete-local-data":t,ids:[]},method:"torrent-remove"};if(e)for(let o=0,n=e.length;o{this._controller.refreshTorrents()})}verifyTorrents(e,t,r){this.sendTorrentActionRequests("torrent-verify",e,t,r)}reannounceTorrents(e,t,r){this.sendTorrentActionRequests("torrent-reannounce",e,t,r)}addTorrentByUrl(e,t){/^[\da-f]{40}$/i.test(e)&&(e=`magnet:?xt=urn:btih:${e}`);let r={arguments:{filename:e,paused:t.paused},method:"torrent-add"};this.sendRequest(r,()=>{this._controller.refreshTorrents()})}savePrefs(e){let t={arguments:e,method:"session-set"};this.sendRequest(t,()=>{this._controller.loadDaemonPrefs()})}updateBlocklist(){let e={method:"blocklist-update"};this.sendRequest(e,()=>{this._controller.loadDaemonPrefs()})}_setSequentialDownload(e,t,r){let o={ids:e,sequentialDownload:t};this.sendRequest({arguments:o,method:"torrent-set"},r)}disableSequentialDownload(e,t){this._setSequentialDownload(e,!1,t)}enableSequentialDownload(e,t){this._setSequentialDownload(e,!0,t)}moveTorrentsToTop(e,t,r){this.sendTorrentActionRequests(G._QueueMoveTop,e,t,r)}moveTorrentsToBottom(e,t,r){this.sendTorrentActionRequests(G._QueueMoveBottom,e,t,r)}moveTorrentsUp(e,t,r){this.sendTorrentActionRequests(G._QueueMoveUp,e,t,r)}moveTorrentsDown(e,t,r){this.sendTorrentActionRequests(G._QueueMoveDown,e,t,r)}};ae._SessionHeader="X-Transmission-Session-Id";function We(s,e){let t=document.createElement("fieldset");t.classList.add("section",s);let r=document.createElement("legend");return r.classList.add("title"),r.textContent=e,t.append(r),t}function rt(s,e,t,r){let o=document.createElement("button");return o.textContent=e,o.addEventListener("click",r),s.append(o),o.dataset.action=t,o}var de=class extends EventTarget{constructor(e,t,r,o){super(),this.action_listener=this._onActionChange.bind(this),this.action_manager=o,this.action_manager.addEventListener("change",this.action_listener),this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=t,this.prefs.addEventListener("change",this.prefs_listener),this.closed=!1,this.remote=r,this.name="overflow-menu",this.session_listener=this._onSessionChange.bind(this),this.session_manager=e,this.session_manager.addEventListener("session-change",this.session_listener);let{session_properties:n}=e;Object.assign(this,this._create(n)),this.outside=new R(this.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this),this.show()}show(){document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.session_listener),this.action_manager.removeEventListener("change",this.action_listener),this.prefs.removeEventListener("change",this.prefs_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}_onSessionChange(e){let{alt_speed_check:t}=this.elements,{session_properties:r}=e;t.checked=r[G._TurtleState]}_onPrefsChange(e){switch(e.key){case u.SortDirection:case u.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value;break;default:break}}_onActionChange(e){let t=this.actions[e.action];t&&this._updateElement(t)}_updateElement(e){if(e.dataset.action){let{action:t}=e.dataset,r=this.action_manager.keyshortcuts(t);r&&e.setAttribute("aria-keyshortcuts",r),W(e,this.action_manager.isEnabled(t))}}_onClick(e){let{action:t,pref:r}=e.target.dataset;if(t){this.action_manager.click(t);return}if(r){this.prefs[r]=e.target.value;return}console.log("unhandled"),console.log(e),console.trace()}_create(e){let t={},r={},o=this._onClick.bind(this),n=document.createElement("div");n.classList.add("overflow-menu","popup");let l=We("display","Display");n.append(l);let a=document.createElement("div");a.id="display-options",l.append(a);let i=document.createElement("div");i.classList.add("table-row"),a.append(i);let c=document.createElement("label");c.id="display-sort-mode-label",c.textContent="Sort by",i.append(c);let g=document.createElement("select");g.id="display-sort-mode-select",g.dataset.pref=u.SortMode,i.append(g);let m=[[u.SortByActivity,"Activity"],[u.SortByAge,"Age"],[u.SortByName,"Name"],[u.SortByProgress,"Progress"],[u.SortByQueue,"Queue order"],[u.SortByRatio,"Ratio"],[u.SortBySize,"Size"],[u.SortByState,"State"]];for(let[X,v]of m){let Y=document.createElement("option");Y.value=X,Y.textContent=v,g.append(Y)}c.setAttribute("for",g.id),g.value=this.prefs.sort_mode,g.addEventListener("change",X=>{this.prefs.sort_mode=X.target.value}),i=document.createElement("div"),i.classList.add("table-row"),a.append(i);let d=document.createElement("input");d.id="display-sort-reverse-check",d.dataset.pref=u.SortDirection,d.type="checkbox",i.append(d),c=document.createElement("label"),c.id="display-sort-reverse-label",c.setAttribute("for",d.id),c.textContent="Reverse sort",i.append(c),d.checked=this.prefs.sort_direction!==u.SortAscending,d.addEventListener("input",X=>{this.prefs.sort_direction=X.target.checked?u.SortDescending:u.SortAscending}),i=document.createElement("div"),i.classList.add("table-row"),a.append(i);let b="toggle-compact-rows";d=document.createElement("input"),d.id="display-compact-check",d.dataset.action=b,d.type="checkbox",i.append(d),c=document.createElement("label"),c.id="display-compact-label",c.for=d.id,c.setAttribute("for",d.id),c.textContent=this.action_manager.text(b),d.checked=this.prefs.display_mode===u.DisplayCompact,i.append(c),d.addEventListener("input",X=>{let{checked:v}=X.target;this.prefs.display_mode=v?u.DisplayCompact:u.DisplayFull}),i=document.createElement("div"),i.classList.add("table-row","display-fullscreen-row"),a.append(i),d=document.createElement("input"),d.id="display-fullscreen-check",d.type="checkbox";let p=()=>document.fullscreenElement!==null;d.checked=p(),d.addEventListener("input",()=>{p()?document.exitFullscreen():document.body.requestFullscreen()}),document.addEventListener("fullscreenchange",()=>{d.checked=p()}),i.append(d),c=document.createElement("label"),c.id="display-fullscreen-label",c.for=d.id,c.setAttribute("for",d.id),c.textContent="Fullscreen",i.append(c);let h=this.action_manager.text("open-appearance-settings");i=rt(l,h,"open-appearance-settings",o),a.append(i),l=We("speed","Speed Limit"),n.append(l),a=document.createElement("div"),a.id="speed-options",l.append(a),i=document.createElement("div"),i.classList.add("speed-up"),a.append(i),c=document.createElement("label"),c.id="speed-up-label",c.textContent="Upload:",i.append(c);let C="Unlimited";g=document.createElement("select"),g.id="speed-up-select",i.append(g);let y=["50","100","250","500","1000","2500","5000","10000",C];for(let X of[...new Set(y).add(`${e[G._UpSpeedLimit]}`).values()].sort((v,Y)=>v-Y)){let v=document.createElement("option");v.value=X,v.textContent=X===C?C:B.speed(X),g.append(v)}c.setAttribute("for",g.id),g.value=e[G._UpSpeedLimited]?`${e[G._UpSpeedLimit]}`:C,g.addEventListener("change",X=>{let{value:v}=X.target;console.log(X),v===C?this.remote.savePrefs({[G._UpSpeedLimited]:!1}):this.remote.savePrefs({[G._UpSpeedLimited]:!0,[G._UpSpeedLimit]:Number.parseInt(v,10)})}),i=document.createElement("div"),i.classList.add("speed-down"),a.append(i),c=document.createElement("label"),c.id="speed-down-label",c.textContent="Download:",i.append(c),g=document.createElement("select"),g.id="speed-down-select",i.append(g);for(let X of[...new Set(y).add(`${e[G._DownSpeedLimit]}`).values()].sort((v,Y)=>v-Y)){let v=document.createElement("option");v.value=X,v.textContent=X===C?C:B.speed(X),g.append(v)}c.setAttribute("for",g.id),g.value=e[G._DownSpeedLimited]?`${e[G._DownSpeedLimit]}`:C,g.addEventListener("change",X=>{let{value:v}=X.target;console.log(X),v===C?this.remote.savePrefs({[G._DownSpeedLimited]:!1}):this.remote.savePrefs({[G._DownSpeedLimited]:!0,[G._DownSpeedLimit]:Number.parseInt(v,10)})}),i=document.createElement("div"),i.classList.add("alt-speed"),a.append(i),d=document.createElement("input"),d.id="alt-speed-check",d.type="checkbox",d.checked=e[G._TurtleState],d.addEventListener("change",X=>{this.remote.savePrefs({[G._TurtleState]:X.target.checked})}),i.append(d),r.alt_speed_check=d,c=document.createElement("label"),c.id="alt-speed-icon",c.setAttribute("for",d.id),i.append(c),c=document.createElement("label"),c.id="alt-speed-label",c.setAttribute("for",d.id),c.textContent="Use Temp limits",i.append(c),c=document.createElement("label"),c.id="alt-speed-values-label",c.setAttribute("for",d.id);let x=B.speed(e[G._TurtleUpSpeedLimit]),f=B.speed(e[G._TurtleDownSpeedLimit]);c.textContent=`(${x} up, ${f} down)`,i.append(c),l=We("actions","Actions"),n.append(l),i=document.createElement("div"),i.classList.add("table-row"),l.append(i);for(let X of["show-preferences-dialog","show-shortcuts-dialog","pause-all-torrents","start-all-torrents"]){let v=this.action_manager.text(X);t[X]=rt(l,v,X,o)}l=We("help","Help"),n.append(l),a=document.createElement("div"),l.append(a);for(let X of["show-statistics-dialog","show-about-dialog"]){let v=this.action_manager.text(X);t[X]=rt(a,v,X,o)}let H=document.createElement("a");return H.href="https://transmissionbt.com/donate.html",H.target="_blank",H.textContent="Donate",a.append(H),this._updateElement=this._updateElement.bind(this),{actions:t,elements:r,root:n}}};var we=class s extends EventTarget{static _initTimeDropDown(e){for(let t=0;t<24*4;++t){let r=t/4,o=t%4*15,n=t*15,l=`${r}:${o||"00"}`;e.options[t]=new Option(l,n)}}static _initDayDropDown(e){let t=[["Everyday","127"],["Weekdays","62"],["Weekends","65"],["Sunday","1"],["Monday","2"],["Tuesday","4"],["Wednesday","8"],["Thursday","16"],["Friday","32"],["Saturday","64"]];for(let r=0;t[r];++r){let[o,n]=t[r];e.options[r]=new Option(o,n)}}_checkPort(){for(let[e,t]of Object.entries(this.elements.network.port_status_label))delete t.dataset.open,I(t,"Checking..."),this.remote.checkPort(e,r=>this._onPortChecked(e,r),this)}_onPortChecked(e,t){if(this.closed)return;let r=this.elements.network.port_status_label[e],o=t.arguments["port-is-open"]||!1;r.dataset.open=o,"port-is-open"in t.arguments?I(r,o?"Open":"Closed"):I(r,"Error")}_setBlocklistButtonEnabled(e){let t=this.elements.peers.blocklist_update_button;W(t,e),t.value=e?"Update":"Updating..."}static _getValue(e){if(e.tagName==="TEXTAREA")return e.value;switch(e.type){case"checkbox":case"radio":return e.checked;case"number":case"select-one":case"text":case"url":{let t=e.value;return Number.parseInt(t,10).toString()===t?Number.parseInt(t,10):Number.parseFloat(t).toString()===t?Number.parseFloat(t):t}default:return null}}_onMaybePortChanged(e){(e==="peer-port"||e==="port-forwarding-enabled")&&this._checkPort()}_onControlChanged(e){let{key:t}=e.target.dataset;this.remote.savePrefs({[t]:s._getValue(e.target)}),this._onMaybePortChanged(t)}_onDialogClosed(){this.dispatchEvent(new Event("closed"))}_update(){this._setBlocklistButtonEnabled(!0);for(let[e,t]of Object.entries(this.session_manager.session_properties))for(let r of this.elements.root.querySelectorAll(`[data-key="${e}"]`)){if(e==="blocklist-size"){let o=B.number(t);r.innerHTML=`Blocklist has ${o} rules`,I(this.elements.peers.blocklist_update_button,"Update")}else switch(r.type){case"checkbox":case"radio":r.checked=t;break;case"text":case"textarea":case"url":case"email":case"number":case"search":r!==document.activeElement&&(r.value!=t&&this._onMaybePortChanged(e),r.value=t);break;case"select-one":r.value=t;break;default:console.log(r.type);break}r.dispatchEvent(new Event("change-from-remote"))}}shouldAddedTorrentsStart(){return this.data.elements.root.find("#start-added-torrents")[0].checked}static _createCheckAndLabel(e,t){let r=document.createElement("div");r.id=e;let o=document.createElement("input");o.id=F(),o.type="checkbox",r.append(o);let n=document.createElement("label");return n.textContent=t,n.setAttribute("for",o.id),r.append(n),{check:o,label:n,root:r}}static _enableIfChecked(e,t){let r=()=>{e.tagName==="INPUT"?W(e,t.checked):e.classList.toggle("disabled",!t.checked)};t.addEventListener("change-from-remote",r),r()}static _getProtocolHandlerRegistered(){return localStorage.getItem("protocol-handler-registered")==="true"}static _updateProtocolHandlerButton(e){e.removeAttribute("disabled"),e.removeAttribute("title"),s._getProtocolHandlerRegistered()?(e.textContent="Remove Browser Handler","unregisterProtocolHandler"in navigator||e.setAttribute("title","Your browser does not support removing protocol handlers. This button only allows you to re-register a handler.")):(e.textContent="Add Browser Handler",e.removeAttribute("title"),"registerProtocolHandler"in navigator||(e.setAttribute("disabled",!0),e.setAttribute("title","Your browser does not support protocol handlers")))}static _toggleProtocolHandler(e){let t=new URL(window.location.href);t.search="addtorrent=%s",this._getProtocolHandlerRegistered()?(navigator.unregisterProtocolHandler?.("magnet",t.toString()),localStorage.removeItem("protocol-handler-registered"),s._updateProtocolHandlerButton(e)):(navigator.registerProtocolHandler("magnet",t.toString(),"Transmission Web"),localStorage.setItem("protocol-handler-registered","true"),s._updateProtocolHandlerButton(e))}static _createTorrentsPage(){let e=document.createElement("div");e.classList.add("prefs-torrents-page");let t=document.createElement("div");t.textContent="Downloading",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Download to:",e.append(t);let r=document.createElement("input");r.type="text",r.id=F(),r.dataset.key="download-dir",t.setAttribute("for",r.id),e.append(r);let o=r,n=s._createCheckAndLabel("incomplete-dir-div","Use temporary folder:");n.check.title="Separate folder to temporarily store downloads until they are complete.",n.check.dataset.key="incomplete-dir-enabled",n.label.title=n.check.title,e.append(n.root);let l=n.check;r=document.createElement("input"),r.type="text",r.dataset.key="incomplete-dir",e.append(r),s._enableIfChecked(r,n.check);let a=r;n=s._createCheckAndLabel("autostart-div","Start when added"),n.check.dataset.key="start-added-torrents",e.append(n.root);let i=n.check;n=s._createCheckAndLabel("suffix-div",`Append "part" to incomplete files' names`),n.check.dataset.key="rename-partial-files",e.append(n.root);let c=n.check;n=s._createCheckAndLabel("download-queue-div","Download queue size:"),n.check.dataset.key="download-queue-enabled",e.append(n.root);let g=n.check;r=document.createElement("input"),r.type="number",r.dataset.key="download-queue-size",e.append(r),s._enableIfChecked(r,n.check);let m=r;t=document.createElement("div"),t.textContent="Seeding",t.classList.add("section-label"),e.append(t),n=s._createCheckAndLabel("stop-ratio-div","Stop seeding at ratio:"),n.check.dataset.key="seedRatioLimited",e.append(n.root);let d=n.check;r=document.createElement("input"),r.type="number",r.min="0.1",r.step="any",r.dataset.key="seedRatioLimit",e.append(r),s._enableIfChecked(r,n.check);let b=r;n=s._createCheckAndLabel("stop-idle-div","Stop seeding if idle for N mins:"),n.check.dataset.key="idle-seeding-limit-enabled",e.append(n.root);let p=n.check;r=document.createElement("input"),r.type="number",r.min="0.1",r.step="any",r.dataset.key="idle-seeding-limit",e.append(r),s._enableIfChecked(r,n.check);let h=r;t=document.createElement("div"),t.textContent="Magnet Protocol Handler",t.classList.add("section-label"),e.append(t);let C=document.createElement("button");return C.classList.add("register-handler-button"),s._updateProtocolHandlerButton(C),e.append(C),{autostart_check:i,download_dir:o,download_queue_check:g,download_queue_input:m,incomplete_dir_check:l,incomplete_dir_input:a,register_handler_button:C,root:e,stop_idle_check:p,stop_idle_input:h,stop_ratio_check:d,stop_ratio_input:b,suffix_check:c}}static _createSpeedPage(){let e=document.createElement("div");e.classList.add("prefs-speed-page");let t=document.createElement("div");t.textContent="Speed Limits",t.classList.add("section-label"),e.append(t);let r=s._createCheckAndLabel("upload-speed-div","Upload (kB/s):");r.check.dataset.key="speed-limit-up-enabled",e.append(r.root);let o=r.check,n=document.createElement("input");n.type="number",n.dataset.key="speed-limit-up",e.append(n),s._enableIfChecked(n,r.check);let l=n;r=s._createCheckAndLabel("download-speed-div","Download (kB/s):"),r.check.dataset.key="speed-limit-down-enabled",e.append(r.root);let a=r.check;n=document.createElement("input"),n.type="number",n.dataset.key="speed-limit-down",e.append(n),s._enableIfChecked(n,r.check);let i=n;t=document.createElement("div"),t.textContent="Alternative Speed Limits",t.classList.add("section-label","alt-speed-section-label"),e.append(t),t=document.createElement("div"),t.textContent="Override normal speed limits manually or at scheduled times",t.classList.add("alt-speed-label"),e.append(t),t=document.createElement("label"),t.textContent="Upload (kB/s):",e.append(t),n=document.createElement("input"),n.type="number",n.dataset.key="alt-speed-up",n.id=F(),t.setAttribute("for",n.id),e.append(n);let c=n;t=document.createElement("label"),t.textContent="Download (kB/s):",e.append(t),n=document.createElement("input"),n.type="number",n.dataset.key="alt-speed-down",n.id=F(),t.setAttribute("for",n.id),e.append(n);let g=n;r=s._createCheckAndLabel("alt-times-div","Scheduled times"),r.check.dataset.key="alt-speed-time-enabled",e.append(r.root);let m=r.check;t=document.createElement("label"),t.textContent="From:",s._enableIfChecked(t,r.check),e.append(t);let d=document.createElement("select");d.id=F(),d.dataset.key="alt-speed-time-begin",s._initTimeDropDown(d),t.setAttribute("for",d.id),e.append(d),s._enableIfChecked(d,r.check);let b=d;t=document.createElement("label"),t.textContent="To:",s._enableIfChecked(t,r.check),e.append(t),d=document.createElement("select"),d.id=F(),d.dataset.key="alt-speed-time-end",s._initTimeDropDown(d),t.setAttribute("for",d.id),e.append(d),s._enableIfChecked(d,r.check);let p=d;return t=document.createElement("label"),t.textContent="On days:",s._enableIfChecked(t,r.check),e.append(t),d=document.createElement("select"),d.id=F(),d.dataset.key="alt-speed-time-day",s._initDayDropDown(d),t.setAttribute("for",d.id),e.append(d),s._enableIfChecked(d,r.check),{alt_days_select:d,alt_download_speed_input:g,alt_from_select:b,alt_times_check:m,alt_to_select:p,alt_upload_speed_input:c,download_speed_check:a,download_speed_input:i,root:e,upload_speed_check:o,upload_speed_input:l}}static _createPeersPage(){let e=document.createElement("div");e.classList.add("prefs-peers-page");let t=document.createElement("div");t.textContent="Connections",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Max peers per torrent:",e.append(t);let r=document.createElement("input");r.type="number",r.dataset.key="peer-limit-per-torrent",r.id=F(),t.setAttribute("for",r.id),e.append(r);let o=r;t=document.createElement("label"),t.textContent="Max peers overall:",e.append(t),r=document.createElement("input"),r.type="number",r.dataset.key="peer-limit-global",r.id=F(),t.setAttribute("for",r.id),e.append(r);let n=r;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Encryption mode:",e.append(t);let l=document.createElement("select");l.id=F(),l.dataset.key="encryption",l.options[0]=new Option("Prefer encryption","preferred"),l.options[1]=new Option("Allow encryption","tolerated"),l.options[2]=new Option("Require encryption","required"),e.append(l);let a=l,i=s._createCheckAndLabel("use-pex-div","Use PEX to find more peers");i.check.title="PEX is a tool for exchanging peer lists with the peers you're connected to.",i.check.dataset.key="pex-enabled",i.label.title=i.check.title,e.append(i.root);let c=i.check;i=s._createCheckAndLabel("use-dht-div","Use DHT to find more peers"),i.check.title="DHT is a tool for finding peers without a tracker.",i.check.dataset.key="dht-enabled",i.label.title=i.check.title,e.append(i.root);let g=i.check;i=s._createCheckAndLabel("use-lpd-div","Use LPD to find more peers"),i.check.title="LPD is a tool for finding peers on your local network.",i.check.dataset.key="lpd-enabled",i.label.title=i.check.title,e.append(i.root);let m=i.check;t=document.createElement("div"),t.textContent="Blocklist",t.classList.add("section-label"),e.append(t),i=s._createCheckAndLabel("blocklist-enabled-div","Enable blocklist:"),i.check.dataset.key="blocklist-enabled",e.append(i.root);let d=i.check;r=document.createElement("input"),r.type="url",r.value="http://www.example.com/blocklist",r.dataset.key="blocklist-url",e.append(r),s._enableIfChecked(r,i.check);let b=r;t=document.createElement("label"),t.textContent="Blocklist has {n} rules",t.dataset.key="blocklist-size",t.classList.add("blocklist-size-label"),s._enableIfChecked(t,i.check),e.append(t);let p=document.createElement("button");return p.classList.add("blocklist-update-button"),p.textContent="Update",e.append(p),s._enableIfChecked(p,i.check),{blocklist_enabled_check:d,blocklist_update_button:p,blocklist_url_input:b,dht_check:g,encryption_select:a,lpd_check:m,max_peers_overall_input:n,max_peers_per_torrent_input:o,pex_check:c,root:e}}static _createNetworkPage(){let e=document.createElement("div");e.classList.add("prefs-network-page");let t=document.createElement("div");t.textContent="Listening Port",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Peer listening port:",e.append(t);let r=document.createElement("input");r.type="number",r.dataset.key="peer-port",r.id=F(),t.setAttribute("for",r.id),e.append(r);let o=r,n=document.createElement("div");n.classList.add("port-status"),t=document.createElement("label"),t.textContent="IPv4 port is",n.append(t);let l=document.createElement("label");l.textContent="?",l.classList.add("port-status-label"),n.append(l),n.append(document.createElement("br")),t=document.createElement("label"),t.textContent="IPv6 port is",n.append(t);let a=document.createElement("label");a.textContent="?",a.classList.add("port-status-label"),n.append(a),e.append(n);let i=s._createCheckAndLabel("randomize-port","Randomize port on launch");i.check.dataset.key="peer-port-random-on-start",e.append(i.root);let c=i.check;i=s._createCheckAndLabel("port-forwarding","Use port forwarding from my router"),i.check.dataset.key="port-forwarding-enabled",e.append(i.root);let g=i.check;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),i=s._createCheckAndLabel("utp-enabled","Enable uTP for peer communication"),i.check.dataset.key="utp-enabled",e.append(i.root);let m=i.check;t=document.createElement("div"),t.textContent="Default Public Trackers",t.classList.add("section-label"),e.append(t);let d=["Trackers to use on all public torrents.","To add a backup URL, add it on the next line after a primary URL.","To add a new primary URL, add it after a blank line."];for(let h of d)t=document.createElement("label"),t.classList.add("default-trackers-label"),t.textContent=h,t.setAttribute("for","default-trackers"),e.append(t);let b=document.createElement("textarea");return b.dataset.key="default-trackers",b.id="default-trackers",e.append(b),{default_trackers_textarea:b,port_forwarding_check:g,port_input:o,port_status_label:{ipv4:l,ipv6:a},random_port_check:c,root:e,utp_check:m}}static _create(){let e={network:s._createNetworkPage(),peers:s._createPeersPage(),speed:s._createSpeedPage(),torrents:s._createTorrentsPage()};return{...Xe("prefs-dialog",[["prefs-tab-torrent",e.torrents.root,"Torrents"],["prefs-tab-speed",e.speed.root,"Speed"],["prefs-tab-peers",e.peers.root,"Peers"],["prefs-tab-network",e.network.root,"Network"]]),...e}}constructor(e,t){super(),this.closed=!1,this.session_manager=e,this.remote=t,this.update_from_session=()=>this._update(),this.elements=s._create(),this.elements.peers.blocklist_update_button.addEventListener("click",n=>{I(n.target,"Updating blocklist..."),this.remote.updateBlocklist(),this._setBlocklistButtonEnabled(!1)}),this.elements.torrents.register_handler_button.addEventListener("click",n=>{s._toggleProtocolHandler(n.currentTarget)}),this.elements.dismiss.addEventListener("click",()=>this.close()),this.outside=new R(this.elements.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this);let r=this._onControlChanged.bind(this),o=n=>{for(let l of Object.values(n))if(l.tagName==="INPUT")switch(l.type){case"checkbox":case"radio":l.addEventListener("click",a=>{a.preventDefault(),r(a)});break;case"number":case"text":case"url":l.addEventListener("change",r);break;default:console.trace(`unhandled input: ${l.type}`);break}else(l.tagName==="TEXTAREA"||l.tagName==="SELECT")&&l.addEventListener("change",r)};o(this.elements.network),o(this.elements.peers),o(this.elements.speed),o(this.elements.torrents),this.session_manager.addEventListener("session-change",this.update_from_session),this.update_from_session(),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.update_from_session),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}};var Le=class s extends EventTarget{constructor(e){super(),this.options=e,this.options.trash=!1,this.elements=s._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_onConfirm(){let{remote:e,torrents:t,trash:r}=this.options;t.length>0&&e.removeTorrents(t,r),this.close()}static _create(e){let{torrents:t}=e,r=J("remove-dialog"),{confirm:o,heading:n,message:l,workarea:a}=r;n.textContent=t.length===1?`Remove ${t[0].getName()}?`:`Remove ${t.length} transfers?`;let i=document.createElement("input");i.id="delete-local-data-check",i.type="checkbox",i.checked=!1,l.append(i);let c=document.createElement("label");c.id="delete-local-data-label",c.setAttribute("for",i.id),c.textContent="Delete downloaded data",l.append(c);let g=document.createElement("div"),m=d=>{d&&t.length===1?g.textContent="All data downloaded for this torrent will be deleted. Are you sure you want to remove it?":d?g.textContent="All data downloaded for these torrents will be deleted. Are you sure you want to remove them?":t.length===1?g.textContent="Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?":g.textContent="Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?",o.textContent=d?"Delete":"Remove"};return m(i.checked),i.addEventListener("click",()=>{e.trash=i.checked,m(i.checked)}),a.append(g),r}};var Qe=class s extends EventTarget{constructor(e,t,r){super(),this.controller=e,this.remote=t,this.action_input_value=r,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length!==1){console.trace();return}this.torrents=e,this.elements=s._create(this.action_input_value===null?"Rename":"Confirm"),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=this.action_input_value===null?e[0].getName():this.action_input_value,document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.action_input_value===null?this.close():this.controller.action_manager.click("show-inspector")}_onConfirm(){let[e]=this.torrents,t=e.getName(),r=this.elements.entry.value;this.remote.renameTorrent([e.getId()],t,r,o=>{o.result==="success"&&e.refresh(o.arguments)}),this._onDismiss()}static _create(e){let t=J("rename-dialog");t.root.setAttribute("aria-label","Rename Torrent"),t.heading.textContent="Enter new name:",t.confirm.textContent=e;let r=document.createElement("label");r.setAttribute("for","torrent-rename-name"),r.textContent="Enter new name:",t.workarea.append(r);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-rename-name",t.entry=o,t.workarea.append(o),t}};var Oe=class s extends EventTarget{constructor(e,t,r){super(),this.controller=e,this.remote=t,this.action_input_value=r,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length===0){console.error("At least one selected torrent expected.");return}let[t]=e;this.torrents=e,this.elements=s._create(this.action_input_value===null?"Save":"Confirm"),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=this.action_input_value===null?t.getLabels().join(", "):this.action_input_value,document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements,delete this.torrents}_onDismiss(){this.action_input_value===null?this.close():this.controller.action_manager.click("show-inspector")}_onConfirm(){let{torrents:e}=this,{remote:t}=this,r=e.map(i=>i.getId()),{elements:o}=this,{entry:n}=o,{value:l}=n,a=l.split(/ *, */).filter(i=>i.length>0);t.setLabels(r,a,i=>{if(i.result==="success")for(let c of e)c.refresh({labels:a})}),this._onDismiss()}static _create(e){let t=J("labels-dialog");t.root.setAttribute("aria-label","Edit Labels"),t.heading.textContent="Edit Labels:",t.confirm.textContent=e;let r=document.createElement("label");r.setAttribute("for","torrent-labels"),r.textContent="Labels:",t.workarea.append(r);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-labels",t.entry=o,t.workarea.append(o),t}};var Ue=class s extends EventTarget{constructor(e){super(),this.elements=s._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){let t=J("shortcuts-dialog");t.root.setAttribute("aria-label","Keyboard Shortcuts");let r=document.createElement("table"),o=document.createElement("thead");r.append(o);let n=document.createElement("tr");o.append(n);let l=document.createElement("th");l.textContent="Key",n.append(l),l=document.createElement("th"),l.textContent="Action",n.append(l);let a=document.createElement("tbody");r.append(a);let i={};for(let[c,g]of e.allShortcuts().entries()){let m=c.split("+"),d=[m.pop(),...m].join("+");i[d]={name:g,shortcut:c}}for(let[,c]of Object.entries(i).sort()){let{name:g,shortcut:m}=c;n=document.createElement("tr"),a.append(n);let d=document.createElement("td");d.textContent=m.replaceAll("+"," + "),n.append(d),d=document.createElement("td"),d.textContent=e.text(g),n.append(d)}return t.heading.textContent="Transmission",t.dismiss.textContent="Close",t.heading.textContent="Keyboard shortcuts",t.message.append(r),t.confirm.remove(),delete t.confirm,t}};var ke=class s extends EventTarget{constructor(e){super(),this.remote=e;let t=()=>this.remote.loadDaemonStats(o=>this._update(o.arguments)),r=5e3;this.interval=setInterval(t,r),t(),this.elements=s._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_update(e){console.log(e);let t=B,r=e["current-stats"],o=ne.ratio(r.uploadedBytes,r.downloadedBytes);I(this.elements.session.up,t.size(r.uploadedBytes)),I(this.elements.session.down,t.size(r.downloadedBytes)),this.elements.session.ratio.innerHTML=t.ratioString(o),I(this.elements.session.time,t.timeInterval(r.secondsActive)),r=e["cumulative-stats"],o=ne.ratio(r.uploadedBytes,r.downloadedBytes),I(this.elements.total.up,t.size(r.uploadedBytes)),I(this.elements.total.down,t.size(r.downloadedBytes)),I(this.elements.total.ratio,t.ratioString(o)),I(this.elements.total.time,t.timeInterval(r.secondsActive))}static _create(){let e=J("statistics-dialog"),{confirm:t,dismiss:r,heading:o,root:n,workarea:l}=e;t.remove(),r.textContent="Close",delete e.confirm;let a="Statistics";n.setAttribute("aria-label",a),o.textContent=a;let i=["Uploaded:","Downloaded:","Ratio:","Running time:"],c=$e("Current session",i),[g,m,d,b]=c.children,p=e.session={};p.up=g,p.down=m,p.ratio=d,p.time=b,l.append(c.root),c=$e("Total",i);let[h,C,y,x]=c.children,f=e.total={};return f.up=h,f.down=C,f.ratio=y,f.time=x,l.append(c.root),e}};var N={createIcon:s=>{let e=document.createElement("div");return e.className="icon",e.dataset.iconMimeType=s.getPrimaryMimeType().split("/",1).pop(),e.dataset.iconMultifile=s.getFileCount()>1?"true":"false",e},createRow:s=>{let e=document.createElement("li");e.className="torrent";let t=[["select","select"],["name","torrent-name"],["labels","torrent-labels"],["progress_details","torrent-progress-details"],["barrel","barrel"],["peer_details","torrent-peer-details"]];for(let[n,l]of t){let a=document.createElement("div");a.className=l,e.append(a),e[n]=a}let r=document.createElement("input");r.type="checkbox",r.checked=!0,e.select.append(r,N.createIcon(s));let o=document.createElement("div");return o.className="torrent-progress-bar",e.barrel.append(o),e.progressbar=o,e},formatETA:s=>{let e=s.getETA();return e<0||e>=999*60*60?"":`ETA: ${B.timeInterval(e,1)}`},formatLabels:(s,e)=>{let t=s.getLabels();for(;e.firstChild;)e.lastChild.remove();for(let r of t){let o=document.createElement("span");o.classList.add("torrent-label"),o.textContent=r,e.append(o)}},getProgressInfo:(s,e)=>{let t=e.getStatus(),r=["barrel"],o=100,n=null;if(t===A._StatusStopped&&r.push("paused"),e.needsMetaData())r.push("magnet"),o=e.getMetadataPercentComplete()*100;else if(t===A._StatusCheck)r.push("verify"),o=e.getRecheckProgress()*100;else if(e.getLeftUntilDone()>0)r.push("leech"),o=e.getPercentDone()*100;else{r.push("seed");let l=e.seedRatioLimit(s);n=l>0?e.getUploadRatio()*100/l:100}return e.isQueued()&&r.push("queued"),{classList:r,percent:o,ratio:n}},renderProgressbar:(s,e,t,r)=>{let o=N.getProgressInfo(s,e),n=Math.min(o.ratio||o.percent,100),l=`${B.percentString(n,2)}%`;t.style.setProperty("--progress",l),r.className=o.classList.join(" "),r.style.setProperty("--progress",l),r.dataset.progress=o.ratio?"100%":l},symbol:{down:"\u25BC",up:"\u25B2"}},Ve=class s{static renderPeerDetails(e,t){let r=B,o=e.getError()!==A._ErrNone;t.classList.toggle("error",o);let n=e.getErrorMessage();if(n)I(t,n);else if(e.isDownloading()){if(t.childNodes.length!==4){for(;t.firstChild;)t.lastChild.remove();t.append("",w.speedDown(),"",w.speedUp())}let l=e.getPeersConnected(),a=e.getWebseedsSendingToUs(),i=["Downloading from"];l&&(i.push(e.getPeersSendingToUs(),"of",r.countString("peer","peers",l)),a&&i.push("and")),a&&i.push(r.countString("web seed","web seeds",a)),i.push("-",r.speedBps(e.getDownloadSpeed())),I(t.childNodes[0],i.join(" ")),I(t.childNodes[2],` ${r.speedBps(e.getUploadSpeed())}`)}else if(e.isSeeding()){if(t.childNodes.length!==2){for(;t.firstChild;)t.lastChild.remove();t.append("",w.speedUp())}let l=["Seeding to",e.getPeersGettingFromUs(),"of",r.countString("peer","peers",e.getPeersConnected()),"-",r.speedBps(e.getUploadSpeed())].join(" ");I(t.childNodes[0],l)}else if(e.isChecking()){let l=["Verifying local data (",r.percentString(100*e.getRecheckProgress(),1),"% tested)"].join("");I(t,l)}else I(t,e.getStateString())}static renderProgressDetails(e,t,r){let o=B;if(t.needsMetaData()){let c="retrieving";t.isStopped()&&(c="needs");let g=100*t.getMetadataPercentComplete(),m=["Magnetized transfer - ",c," metadata (",o.percentString(g,1),"%)"].join("");I(r,m);return}let n=t.getSizeWhenDone(),l=t.getTotalSize(),a=t.isDone()||t.isSeeding(),i=[];if(a?(l===n?i.push(o.size(l)):i.push(o.size(n)," of ",o.size(t.getTotalSize())," (",t.getPercentDoneStr(),"%)"),i.push(", uploaded ",o.size(t.getUploadedEver())," (Ratio: ",o.ratioString(t.getUploadRatio()),")")):i.push(o.size(n-t.getLeftUntilDone())," of ",o.size(n)," (",t.getPercentDoneStr(),"%)"),!t.isStopped()&&(!a||t.seedRatioLimit(e)>0)){i.push(" - ");let c=t.getETA();c<0||c>=999*60*60?i.push("remaining time unknown"):i.push(o.timeInterval(t.getETA(),1)," remaining")}I(r,i.join(""))}render(e,t,r){r.classList.toggle("paused",t.isStopped());let{barrel:o,labels:n,name:l,progressbar:a,peer_details:i,progress_details:c}=r;I(l,t.getName()),N.formatLabels(t,n),s.renderProgressDetails(e,t,c),N.renderProgressbar(e,t,a,o),s.renderPeerDetails(t,i)}},Re=class s{static renderPeerDetails(e,t){let r=B,o=e.getError()!==A._ErrNone;t.classList.toggle("error",o);let n=e.getErrorMessage();if(n)I(t,n);else if(e.isDownloading()){let l=e.getDownloadSpeed()>0,a=e.getUploadSpeed()>0;if(!a&&!l)I(t,"Idle");else{let i=[N.formatETA(e)];for(l&&i.push(" ",r.speedBps(e.getDownloadSpeed()),w.speedDown()),a&&i.push(" ",r.speedBps(e.getUploadSpeed()),w.speedUp());t.firstChild;)t.lastChild.remove();t.append(...i)}}else if(e.isSeeding()){if(t.childNodes.length!==2){for(;t.firstChild;)t.lastChild.remove();t.append("",w.speedUp())}let l=["Ratio:",r.ratioString(e.getUploadRatio()),"-",r.speedBps(e.getUploadSpeed())].join(" ");I(t.childNodes[0],l)}else I(t,e.getStateString())}render(e,t,r){r.classList.toggle("paused",t.isStopped());let{barrel:o,labels:n,name:l,peer_details:a,progressbar:i}=r;I(l,t.getName()),N.formatLabels(t,n),s.renderPeerDetails(t,a),N.renderProgressbar(e,t,i,o)}},Ne=class{constructor(e,t){this._torrent=t,this._element=N.createRow(t);let r=()=>this.updateRow(e);this._torrent.addEventListener("dataChanged",r),r()}getElement(){return this._element}updateRow(e){let t=this.getTorrent();t&&e.torrentRenderer.render(e,t,this.getElement())}isSelected(){return this.getElement().classList.contains("selected")}getTorrent(){return this._torrent}getTorrentId(){return this.getTorrent().getId()}};var Ye=class s extends EventTarget{constructor(e,t,r){super(),this.action_manager=e,this.action_input_value=null,this.notifications=t,this.prefs=r,this.remote=new ae(this),this.speed={down:document.querySelector("#speed-down"),up:document.querySelector("#speed-up")};for(let[i,c]of[["#toolbar-open","open"],["#toolbar-delete","delete"],["#toolbar-start","start"],["#toolbar-pause","pause"]])document.querySelector(i).prepend(w[c](),document.createElement("BR"));document.querySelector("#toolbar-inspector").prepend(document.createElement("BR")),document.querySelector("#toolbar-overflow").append(w.overflow()),document.querySelector(".speed-container").append(w.speedDown()),document.querySelector(".speed-container + .speed-container").append(w.speedUp()),this.addEventListener("torrent-selection-changed",i=>this.action_manager.update(i)),this.filterText="",this.searchOperators=[[u.FilterOps.name,"search"],[u.FilterOps.label,"labels"],[u.FilterOps.status,"states",[u.FilterActive,u.FilterDownloading,u.FilterSeeding,u.FilterPaused,u.FilterFinished,u.FilterPrivate,u.FilterPublic,u.FilterError]],[u.FilterOps.tracker,"trackers"],[]],this._filter={},this._torrents={},this._rows=[],this.demo=!1,this.rapidfire=!1,this.oldTrackers=[],this.dirtyTorrents=new Set,this.changeStatus=!1,this.refilterSoon=z(()=>this._refilter(!1)),this.refilterAllSoon=z(()=>this._refilter(!0)),this.popup=Array.from({length:s.max_popups}).fill(null),this.pointer_device=Object.seal({is_touch_device:"ontouchstart"in window,long_press_callback:null,x:0,y:0}),this.busytyping=!1;for(let i of document.querySelectorAll("button[data-action]")){let{action:c}=i.dataset;W(i,this.action_manager.isEnabled(c)),i.addEventListener("click",()=>{this.action_manager.click(c)})}document.querySelector("#filter-tracker").addEventListener("change",i=>{this.setFilterTracker(i.target.value)}),this.action_manager.addEventListener("change",i=>{for(let c of document.querySelectorAll(`[data-action="${i.action}"]`))W(c,i.enabled)}),this.action_manager.addEventListener("click",i=>{switch(i.action){case"deselect-all":this._deselectAll();break;case"disable-sequential-downloading":this._disableSequentialDownload(this.getSelectedTorrents());break;case"enable-sequential-downloading":this._enableSequentialDownload(this.getSelectedTorrents());break;case"move-bottom":this._moveBottom();break;case"move-down":this._moveDown();break;case"move-top":this._moveTop();break;case"move-up":this._moveUp();break;case"open-appearance-settings":this.popup[s.default_popup_level]instanceof ie?this.popup[s.default_popup_level].close():this.setCurrentPopup(new ie(this.prefs,this.action_manager));break;case"open-torrent":this.setCurrentPopup(new $(this,this.remote));break;case"pause-all-torrents":this._stopTorrents(this._getAllTorrents());break;case"pause-selected-torrents":this._stopTorrents(this.getSelectedTorrents());break;case"reannounce-selected-torrents":this._reannounceTorrents(this.getSelectedTorrents());break;case"remove-selected-torrents":this._removeSelectedTorrents();break;case"resume-selected-torrents":this._startSelectedTorrents(!1);break;case"resume-selected-torrents-now":this._startSelectedTorrents(!0);break;case"select-all":this._selectAll();break;case"show-about-dialog":this.setCurrentPopup(new Ze(this.version_info));break;case"show-context-menu":this.popup[s.default_popup_level]instanceof ce?this.popup[s.default_popup_level].close():this._getSelectedRows().length>0&&l();break;case"show-inspector":this.popup[0]instanceof le?this.popup[0].close():this.setCurrentPopup(new le(this),0);break;case"show-move-dialog":this.setCurrentPopup(new Je(this,this.remote,this.action_input_value));break;case"show-overflow-menu":this.popup[s.default_popup_level]instanceof de?this.popup[s.default_popup_level].close():this.setCurrentPopup(new de(this,this.prefs,this.remote,this.action_manager));break;case"show-preferences-dialog":this.setCurrentPopup(new we(this,this.remote),1);break;case"show-shortcuts-dialog":this.setCurrentPopup(new Ue(this.action_manager));break;case"show-statistics-dialog":this.setCurrentPopup(new ke(this.remote));break;case"show-rename-dialog":this.setCurrentPopup(new Qe(this,this.remote,this.action_input_value));break;case"show-labels-dialog":this.setCurrentPopup(new Oe(this,this.remote,this.action_input_value));break;case"start-all-torrents":this._startTorrents(this._getAllTorrents());break;case"toggle-compact-rows":this.prefs.display_mode=this.prefs.display_mode===u.DisplayCompact?u.DisplayFull:u.DisplayCompact;break;case"verify-selected-torrents":this._verifyTorrents(this.getSelectedTorrents());break;default:console.warn(`unhandled action: ${i.action}`)}this.action_input_value=null});let o=document.querySelector("#filter-mode");q(o,null,[["All",u.FilterAll]]),q(o,"status",[["Active",u.FilterActive],["Downloading",u.FilterDownloading],["Seeding",u.FilterSeeding],["Paused",u.FilterPaused],["Finished",u.FilterFinished],["Error",u.FilterError]]),q(o,"list",[["Private torrents",u.FilterPrivate],["Public torrents",u.FilterPublic]]),o.value=this.prefs.filter_mode,o.addEventListener("change",i=>{this.prefs.filter_mode=i.target.value,this.refilterAllSoon()}),o=document.querySelector("#filter-tracker"),q(o,null,[["All",u.FilterAll]]);let n=document.querySelector("#torrent-search");o=document.querySelector("#reset"),o.addEventListener("click",()=>{n.value="",this._setFilterText(n.value),this.refilterAllSoon()}),n.value.trim()&&(this.filterText=n.value,o.style.display="block",this.refilterAllSoon()),o=document.querySelector("#turtle"),o.addEventListener("click",i=>{this.remote.savePrefs({[G._TurtleState]:!i.target.classList.contains("alt-speed-enabled")})}),document.addEventListener("keydown",this._keyDown.bind(this)),document.addEventListener("keyup",this._keyUp.bind(this)),o=document.querySelector("#torrent-container"),o.addEventListener("click",i=>{this.popup[s.default_popup_level]&&this.setCurrentPopup(null),i.target===i.currentTarget&&this._deselectAll()}),o.addEventListener("dblclick",i=>{!i.target.classList.contains("select")&&(!this.popup[0]||this.popup[0].name!=="inspector")&&this.action_manager.click("show-inspector")}),o.addEventListener("dragenter",s._dragenter),o.addEventListener("dragover",s._dragenter),o.addEventListener("drop",this._drop.bind(this)),this._setupSearchBox(),this.elements={torrent_list:document.querySelector("#torrent-list")};let l=()=>{let i=new ce(this.action_manager);this.setCurrentPopup(i);let g=document.querySelector("#torrent-container").getBoundingClientRect(),m=Math.min(this.pointer_device.x,g.right+window.scrollX-i.root.clientWidth),d=Math.min(this.pointer_device.y,g.bottom+window.scrollX-i.root.clientHeight);i.root.style.left=`${Math.max(m,0)}px`,i.root.style.top=`${Math.max(d,0)}px`},a=i=>{if(this.pointer_device.is_touch_device&&i.touches.length>1)return;let c=i.target;for(;c&&!c.classList.contains("torrent");)c=c.parentNode;let g=this._rows.find(m=>m.getElement()===c);g&&!g.isSelected()&&this._setSelectedRow(g),l(),i.preventDefault()};if(this.pointer_device.is_touch_device){let i=this.pointer_device;this.elements.torrent_list.addEventListener("touchstart",c=>{i.x=c.touches[0].pageX,i.y=c.touches[0].pageY,i.long_press_callback?(clearTimeout(i.long_press_callback),i.long_press_callback=null):i.long_press_callback=setTimeout(a.bind(this),500,c)}),this.elements.torrent_list.addEventListener("touchend",()=>{clearTimeout(i.long_press_callback),i.long_press_callback=null,setTimeout(()=>{let c=this.popup[s.default_popup_level];c&&(c.root.style.pointerEvents="auto")},1)}),this.elements.torrent_list.addEventListener("touchmove",c=>{i.x=c.touches[0].pageX,i.y=c.touches[0].pageY,clearTimeout(i.long_press_callback),i.long_press_callback=null}),this.elements.torrent_list.addEventListener("contextmenu",c=>{c.preventDefault()})}else this.elements.torrent_list.addEventListener("mousemove",i=>{this.pointer_device.x=i.pageX,this.pointer_device.y=i.pageY}),this.elements.torrent_list.addEventListener("contextmenu",i=>{a(i);let c=this.popup[s.default_popup_level];c&&(c.root.style.pointerEvents="auto")});this.loadDaemonPrefs(),this._initializeTorrents(),this.refreshTorrents(),this.togglePeriodicSessionRefresh(!0),this.prefs.addEventListener("change",({key:i,value:c})=>this._onPrefChanged(i,c));for(let[i,c]of this.prefs.entries())this._onPrefChanged(i,c)}_openTorrentFromUrl(){setTimeout(()=>{let e=new URLSearchParams(window.location.search).get("addtorrent");if(e){this.setCurrentPopup(new $(this,this.remote,e));let t=new URL(window.location);t.search="",window.history.pushState("","",t.toString())}},0)}loadDaemonPrefs(){this.remote.loadDaemonPrefs(e=>{this.session_properties=e.arguments,this._openTorrentFromUrl()})}get session_properties(){return this._session_properties}set session_properties(e){if(Be(this._session_properties,e))return;this._session_properties=Object.seal(e);let t=new Event("session-change");t.session_properties=e,this.dispatchEvent(t),this._updateGuiFromSession(e)}_setupSearchBox(){let e=document.querySelector("#torrent-search"),t="blur";e.classList.add(t),e.addEventListener("blur",()=>e.classList.add(t)),e.addEventListener("focus",()=>e.classList.remove(t)),e.addEventListener("input",()=>{e.value.trim()!==this.filterText&&this._setFilterText(e.value)})}_onPrefChanged(e,t){switch(e){case u.DisplayMode:{this.elements.torrent_list.classList.remove("compact"),t==="compact"?(this.elements.torrent_list.classList.add(t),this.torrentRenderer=new Re):this.torrentRenderer=new Ve;for(let r of this._rows){let{progress_details:o}=r._element;for(;o.firstChild;)o.lastChild.remove();r._torrent.dispatchEvent(new Event("dataChanged"))}break}case u.ContrastMode:{document.body.classList.remove("contrast-more"),document.body.classList.remove("contrast-less"),document.body.classList.add(`contrast-${t}`);break}case u.HighlightColor:{if(document.body.classList.remove("highlight"),document.body.classList.remove("highlight-apply"),document.body.classList.remove("highlight-legacy"),!t)document.body.classList.add("highlight-legacy");else if(t==="Highlight")document.body.classList.add("highlight");else if(t!=="AccentColor"){document.body.classList.add("highlight-apply");let r=a=>{let[i,c,g]=[parseInt(a.substring(1,3),16),parseInt(a.substring(3,5),16),parseInt(a.substring(5,7),16)],m=Math.floor(i/64)*4*4+Math.floor(c/64)*4+Math.floor(g/64),d="#000";return[m,["#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff",d,"#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff",d,"#fff","#fff","#fff","#fff","#fff","#fff","#fff",d,"#fff","#fff",d,d,"#fff",d,d,d,"#fff","#fff","#fff",d,"#fff","#fff",d,d,"#fff",d,d,d,d,d,d,d][m]]},[o,n]=r(t);console.log(o,n);let l=document.createElement("style");l.innerHTML=` +(()=>{var Dt=Object.create;var st=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var _t=Object.getPrototypeOf,zt=Object.prototype.hasOwnProperty;var jt=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports);var Mt=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Et(e))!zt.call(s,o)&&o!==t&&st(s,o,{get:()=>e[o],enumerable:!(r=St(e,o))||r.enumerable});return s};var Pt=(s,e,t)=>(t=s!=null?Dt(_t(s)):{},Mt(e||!s||!s.__esModule?st(t,"default",{value:s,enumerable:!0}):t,s));var Vt=jt((ee,P)=>{var Kt=200,qe="__lodash_hash_undefined__",xe=1,mt=2,It=9007199254740991,ue="[object Arguments]",Ee="[object Array]",qt="[object AsyncFunction]",ht="[object Boolean]",Ct="[object Date]",xt="[object Error]",yt="[object Function]",$t="[object GeneratorFunction]",pe="[object Map]",At="[object Number]",er="[object Null]",M="[object Object]",ot="[object Promise]",tr="[object Proxy]",ft="[object RegExp]",be="[object Set]",Xt="[object String]",rr="[object Symbol]",sr="[object Undefined]",_e="[object WeakMap]",Bt="[object ArrayBuffer]",me="[object DataView]",or="[object Float32Array]",nr="[object Float64Array]",ir="[object Int8Array]",cr="[object Int16Array]",lr="[object Int32Array]",ar="[object Uint8Array]",dr="[object Uint8ClampedArray]",gr="[object Uint16Array]",ur="[object Uint32Array]",pr=/[\\^$.*+?()[\]{}|]/g,br=/^\[object .+?Constructor\]$/,mr=/^(?:0|[1-9]\d*)$/,v={};v[or]=v[nr]=v[ir]=v[cr]=v[lr]=v[ar]=v[dr]=v[gr]=v[ur]=!0;v[ue]=v[Ee]=v[Bt]=v[ht]=v[me]=v[Ct]=v[xt]=v[yt]=v[pe]=v[At]=v[M]=v[ft]=v[be]=v[Xt]=v[_e]=!1;var Gt=typeof global=="object"&&global&&global.Object===Object&&global,Ir=typeof self=="object"&&self&&self.Object===Object&&self,O=Gt||Ir||Function("return this")(),vt=typeof ee=="object"&&ee&&!ee.nodeType&&ee,nt=vt&&typeof P=="object"&&P&&!P.nodeType&&P,Zt=nt&&nt.exports===vt,Te=Zt&&Gt.process,it=function(){try{return Te&&Te.binding&&Te.binding("util")}catch{}}(),ct=it&&it.isTypedArray;function hr(s,e){for(var t=-1,r=s==null?0:s.length,o=0,n=[];++t-1}function zr(s,e){var t=this.__data__,r=Ae(t,s);return r<0?(++this.size,t.push([s,e])):t[r][1]=e,this}U.prototype.clear=Dr;U.prototype.delete=Sr;U.prototype.get=Er;U.prototype.has=_r;U.prototype.set=zr;function S(s){var e=-1,t=s==null?0:s.length;for(this.clear();++ea))return!1;var c=n.get(s);if(c&&n.get(e))return c==e;var g=-1,m=!0,d=t&mt?new he:void 0;for(n.set(s,e),n.set(e,s);++g-1&&s%1==0&&s-1&&s%1==0&&s<=It}function Ut(s){var e=typeof s;return s!=null&&(e=="object"||e=="function")}function se(s){return s!=null&&typeof s=="object"}var kt=ct?Ar(ct):ds;function Bs(s){return fs(s)?is(s):gs(s)}function Gs(){return[]}function vs(){return!1}P.exports=Xs});var ge=class s extends EventTarget{constructor(){super(),this.actions=Object.seal({"accent-picker":{enabled:!0,text:"Accent color"},"deselect-all":{enabled:!1,shortcut:"D",text:"Deselect all"},"disable-sequential-downloading":{enabled:!0,text:"Disable"},"enable-sequential-downloading":{enabled:!0,text:"Enable"},"move-bottom":{enabled:!1,text:"Bottom"},"move-down":{enabled:!1,text:"Down"},"move-top":{enabled:!1,text:"Top"},"move-up":{enabled:!1,text:"Up"},"open-appearance-settings":{enabled:!0,text:"Appearance settings"},"open-torrent":{enabled:!0,shortcut:"O",text:"Open torrent\u2026"},"pause-all-torrents":{enabled:!1,text:"Pause all"},"pause-selected-torrents":{enabled:!1,shortcut:"U",text:"Pause"},"reannounce-selected-torrents":{enabled:!1,text:"Ask tracker for more peers"},"remove-selected-torrents":{enabled:!1,text:"Remove selected torrents"},"resume-selected-torrents":{enabled:!1,shortcut:"R",text:"Resume"},"resume-selected-torrents-now":{enabled:!1,text:"Resume now"},"select-all":{enabled:!1,shortcut:"A",text:"Select all"},"show-about-dialog":{enabled:!0,text:"About"},"show-context-menu":{enabled:!0,shortcut:"X",text:"Context Menu (right-click / long press)"},"show-inspector":{enabled:!1,shortcut:"I",text:"Torrent Inspector (double-click)"},"show-labels-dialog":{enabled:!1,shortcut:"K",text:"Edit Labels\u2026"},"show-move-dialog":{enabled:!1,shortcut:"L",text:"Set location\u2026"},"show-overflow-menu":{enabled:!0,text:"More options\u2026"},"show-preferences-dialog":{enabled:!0,shortcut:"P",text:"Edit preferences"},"show-rename-dialog":{enabled:!1,shortcut:"N",text:"Rename\u2026"},"show-shortcuts-dialog":{enabled:!0,text:"Keyboard shortcuts"},"show-statistics-dialog":{enabled:!0,shortcut:"S",text:"Statistics"},"start-all-torrents":{enabled:!1,text:"Start all"},"toggle-compact-rows":{enabled:!0,text:"Compact rows"},"toggle-contrast":{enabled:!0,text:"High contrast"},"verify-selected-torrents":{enabled:!1,shortcut:"V",text:"Verify local data"},"verify-selected-torrents-force":{enabled:!1,text:"Verify local data (force)"}})}click(e){if(this.isEnabled(e)){let t=new Event("click");t.action=e,this.dispatchEvent(t)}}getActionForShortcut(e){for(let[t,r]of Object.entries(this.actions))if(e===r.shortcut)return t;return null}allShortcuts(){return new Map(Object.entries(this.actions).filter(([,e])=>e.shortcut).map(([e,t])=>[t.shortcut,e]))}isEnabled(e){return this._getAction(e).enabled}text(e){return this._getAction(e).text}keyshortcuts(e){return this._getAction(e).shortcut}update(e){let t=s._recount(e.selected,e.nonselected);this._updateStates(t)}_getAction(e){let t=this.actions[e];if(!t)throw new Error(`no such action: ${e}`);return t}static _recount(e,t){let r=e.length+t.length,o=e.filter(m=>m.isStopped()).length,n=e.length-o,l=t.filter(m=>m.isStopped()).length,a=t.length-l,i=o+l,c=n+a,g=e.filter(m=>m.isQueued()).length;return{active:c,nonselected_active:a,nonselected_paused:l,paused:i,selected:e.length,selected_active:n,selected_paused:o,selected_queued:g,total:r}}_updateStates(e){let t=(r,o)=>{for(let n of o)this._updateActionState(n,r)};t(e.selected_paused>0,["resume-selected-torrents"]),t(e.paused>0,["start-all-torrents"]),t(e.active>0,["pause-all-torrents"]),t(e.selected_paused>0||e.selected_queued>0,["resume-selected-torrents-now"]),t(e.selected_active>0,["pause-selected-torrents","reannounce-selected-torrents"]),t(e.selected>0,["deselect-all","move-bottom","move-down","move-top","move-up","remove-selected-torrents","show-inspector","show-labels-dialog","show-move-dialog","verify-selected-torrents","verify-selected-torrents-force"]),t(e.selected===1,["show-rename-dialog"]),t(e.selectedFs(o,m,l,c,t))}return a[0].classList.add("selected"),l.children[0].classList.remove("hidden"),{buttons:a,dismiss:n,root:r}}function J(s){let e=document.createElement("dialog");e.classList.add("dialog-container","popup",s),e.open=!0,e.setAttribute("role","dialog");let t=document.createElement("div");t.classList.add("dialog-window"),e.append(t);let r=document.createElement("div");r.classList.add("dialog-logo"),t.append(r);let o=document.createElement("div");o.classList.add("dialog-heading"),t.append(o);let n=document.createElement("div");n.classList.add("dialog-message"),t.append(n);let l=document.createElement("div");l.classList.add("dialog-workarea"),t.append(l);let a=document.createElement("div");a.classList.add("dialog-buttons"),t.append(a);let i=document.createElement("span");i.classList.add("dialog-buttons-begin"),a.append(i);let c=document.createElement("button");c.classList.add("dialog-dismiss-button"),c.textContent="Cancel",a.append(c);let g=document.createElement("button");g.textContent="OK",a.append(g);let m=document.createElement("span");return m.classList.add("dialog-buttons-end"),a.append(m),{confirm:g,dismiss:c,heading:o,message:n,root:e,workarea:l}}function F(){return typeof crypto.randomUUID=="function"?crypto.randomUUID():("10000000-1000-4000-8000"+-1e11).replaceAll(/[018]/g,s=>(s^crypto.getRandomValues(new Uint8Array(1))[0]&15>>s/4).toString(16))}function q(s,e,t){let r=t.map(o=>new Option(...o));if(e){let o=document.createElement("OPTGROUP");o.label=e,o.append(...r),s.append(o)}else s.append(...r)}var w=Object.freeze({delete:()=>_(["path",{d:"M20 7v14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V7m3 0V5a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2L22 7L4 7"}],["line",{x1:11,x2:11,y1:12,y2:18}],["line",{x1:15,x2:15,y1:12,y2:18}]),open:()=>_(["path",{d:"M23 20a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"}],["line",{x1:13,x2:13,y1:12,y2:18}],["line",{x1:10,x2:16,y1:15,y2:15}]),overflow:()=>_(["line",{x1:4,x2:22,y1:13,y2:13}],["line",{x1:4,x2:22,y1:7,y2:7}],["line",{x1:4,x2:22,y1:19,y2:19}]),pause:()=>_(["rect",{height:16,width:4,x:7,y:5}],["rect",{height:16,width:4,x:15,y:5}]),speedDown:()=>_(["polyline",{points:"7 10 13 16 19 10"}]),speedUp:()=>_(["polyline",{points:"19 16 13 10 7 16"}]),start:()=>_(["polyline",{points:"6 4 20 13 6 22 6 4"}])});function Hs(s){let e=document.createElement("fieldset");e.classList.add("section");let t=document.createElement("legend");t.classList.add("title"),t.textContent=s,e.append(t);let r=document.createElement("div");return r.classList.add("content"),e.append(r),{content:r,root:e}}function $e(s,e){let t=[],{root:r,content:o}=Hs(s);for(let n of e){let l=document.createElement("label");l.textContent=n,o.append(l);let a=document.createElement("div");a.id=F(),o.append(a),l.setAttribute("for",a.id),t.push(a)}return{children:t,root:r}}function z(s,e=100){let t=null;return(...r)=>{t||(t=setTimeout(()=>{t=null,s(...r)},e))}}function Be(s,e){return(0,Nt.default)(s,e)}function Js(s,e,t){t?s.setAttribute(e,!0):s.removeAttribute(e)}function W(s,e){Js(s,"disabled",!e)}function Ge(s,e){s.classList.toggle("checked",e)}var R=class extends EventTarget{constructor(e){super(),this.listener=t=>{e.contains(t.target)||(this.dispatchEvent(new MouseEvent(t.type,t)),t.preventDefault())},Object.seal(this),this.start()}start(){setTimeout(()=>document.addEventListener("click",this.listener),0)}stop(){document.removeEventListener("click",this.listener)}};function I(s,e){s.textContent!==e&&(s.textContent=e)}var ve=class{constructor(e){this._prefs=e,this._elements={toggle:document.querySelector("#toggle-notifications")}}_setEnabled(e){this.prefs.notifications_enabled=e,I(this._toggle,`${e?"Disable":"Enable"} Notifications`)}_requestPermission(){Notification.requestPermission().then(e=>this._setEnabled(e==="granted"))}toggle(){this._enabled?this._setEnabled(!1):Notification.permission==="granted"?this._setEnabled(!0):Notification.permission!=="denied"&&this._requestPermission()}};var u=class s extends EventTarget{constructor(){super(),this._cache={},this.dispatchPrefsChange=z((e,t,r)=>{let o=new Event("change");Object.assign(o,{key:e,old_value:t,value:r}),this.dispatchEvent(o)});for(let[e,t]of Object.entries(s._Defaults))this._set(e,s._getCookie(e,t)),Object.defineProperty(this,e.replaceAll("-","_"),{get:()=>this._get(e),set:r=>{this._set(e,r)}});Object.seal(this)}entries(){return Object.entries(this._cache)}keys(){return Object.keys(this._cache)}_get(e){let{_cache:t}=this;if(!Object.prototype.hasOwnProperty.call(t,e))throw new Error(e);return t[e]}_set(e,t){let{_cache:r}=this,o=r[e];o!==t&&(r[e]=t,s._setCookie(e,t),this.dispatchPrefsChange(e,o,t))}static _setCookie(e,t){let r=new Date;r.setFullYear(r.getFullYear()+1),document.cookie=`${e}=${t}; SameSite=Strict; expires=${r.toGMTString()}`}static _getCookie(e,t){let r=s._readCookie(e);if(r===null)return t;let o=typeof t;if(o==="boolean")return r==="true"?!0:r==="false"?!1:t;if(o==="number"){let n=Number.parseFloat(r);return Number.isNaN(n)?t:n}return r}static _readCookie(e){let r=`; ${document.cookie}`.split(`; ${e}=`);return r.length===2?r.pop().split(";").shift():null}};u.AltSpeedEnabled="alt-speed-enabled";u.DisplayCompact="compact";u.DisplayFull="full";u.DisplayMode="display-mode";u.ColorForStatus="color-for-status";u.ContrastLess="less";u.ContrastMore="more";u.ContrastMode="contrast-mode";u.ContrastRemainders="contrast-remainders";u.FilterActive="active";u.FilterAll="all";u.FilterDownloading="downloading";u.FilterError="error";u.FilterFinished="finished";u.FilterLogicalSwap="filter-logical-swap";u.FilterMode="filter-mode";u.FilterOps={label:["labels:","label:","kw:"],name:["name:"],status:["status:","is:"],tracker:["tracker:","tr:"]};u.FilterPaused="paused";u.FilterPrivate="private";u.FilterPublic="public";u.FilterSeeding="seeding";u.HighlightColor="highlight-color";u.LimitWidth="limit-width";u.NotificationsEnabled="notifications-enabled";u.ProgressBarrel="progress-barrel";u.RefreshRate="refresh-rate-sec";u.SortAscending="ascending";u.SortByActivity="activity";u.SortByAge="age";u.SortByName="name";u.SortByProgress="progress";u.SortByQueue="queue";u.SortByRatio="ratio";u.SortBySize="size";u.SortByState="state";u.SortDescending="descending";u.SortDirection="sort-direction";u.SortMode="sort-mode";u._Defaults={[u.AltSpeedEnabled]:!1,[u.DisplayMode]:u.DisplayFull,[u.ColorForStatus]:!0,[u.ContrastMode]:window.matchMedia("(prefers-contrast: more)").matches?u.ContrastMore:u.ContrastLess,[u.ContrastRemainders]:!1,[u.FilterLogicalSwap]:!1,[u.FilterMode]:u.FilterAll,[u.HighlightColor]:"AccentColor",[u.LimitWidth]:!1,[u.NotificationsEnabled]:!1,[u.ProgressBarrel]:null,[u.RefreshRate]:5,[u.SortDirection]:u.SortAscending,[u.SortMode]:u.SortByName};var Ze=class s extends EventTarget{constructor(e){super(),this.elements=s._create(e),this.elements.dismiss.addEventListener("click",()=>this.close()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}static _create(e){let t=J("about-dialog");t.root.setAttribute("aria-label","About transmission"),t.heading.textContent="Transmission",t.dismiss.textContent="Close";let r=document.createElement("div");return r.classList.add("about-dialog-version-number"),r.textContent=e.version,t.heading.append(r),r=document.createElement("div"),r.classList.add("about-dialog-version-checksum"),r.textContent=e.checksum,t.heading.append(r),r=document.createElement("div"),r.textContent="A fast and easy bitTorrent client",t.workarea.append(r),r=document.createElement("div"),r.textContent="Copyright \xA9 The Transmission Project",t.workarea.append(r),r=document.createElement("a"),r.href="https://transmissionbt.com/",r.target="_blank",r.textContent="https://transmissionbt.com/",t.workarea.append(r),t.confirm.remove(),delete t.confirm,t}};var ie=class extends EventTarget{constructor(e,t){super(),this.action_manager=t,this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=e,this.prefs.addEventListener("change",this.prefs_listener),this.elements=this._create(),this.elements.dismiss.addEventListener("click",()=>this.close()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onPrefsChange(e){switch(e.key){case u.SortDirection:case u.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value;break;default:break}}_create(){let e=J("dis-appearance"),{dismiss:t,heading:r,message:o}=e;r.textContent="Appearance",t.textContent="Close";let n=document.createElement("h4");o.append(n),n.textContent="Theme";let l=document.createElement("div");l.classList.add("table-row"),o.append(l);let a=(d,b)=>{let p=document.createElement("input");p.id=F(),p.type="checkbox";let h=document.createElement("label");h.htmlFor=p.id,h.textContent=d,b(p),l.append(p,h,document.createElement("BR"))},i=(d,b,p,h,C)=>{let y=document.createElement("input");y.id=F(),y.name=d,y.type="radio",y.value=h;let x=document.createElement("label");x.htmlFor=y.id,x.textContent=b,C(y,p),l.append(y,x,document.createElement("BR"))},c=d=>{d.checked=this.prefs.contrast_mode===u.ContrastMore,d.addEventListener("change",b=>{let{checked:p}=b.target;this.prefs.contrast_mode=p?u.ContrastMore:u.ContrastLess})};a(this.action_manager.text("toggle-contrast"),c),n=document.createElement("h4"),o.append(n),n.textContent="Highlight color",l=document.createElement("div"),l.classList.add("table-row"),o.append(l),c=(d,b)=>{d.checked=!b||document.body.classList.contains(b),d.addEventListener("change",p=>{let{value:h}=p.target;this.prefs.highlight_color=h})},i("highlight-color","Accent color from system",null,"AccentColor",c),i("highlight-color","Highlight color from system","highlight","Highlight",c),i("highlight-color","Legacy","highlight-legacy",null,c),n=document.createElement("h4"),o.append(n),n.textContent="Progress bar",l=document.createElement("div"),l.classList.add("table-row"),o.append(l),n=document.createElement("h5"),o.append(n),n.textContent="appearance",l=document.createElement("div"),l.classList.add("table-row"),o.append(l),c=d=>{d.checked=document.querySelector("#torrent-list").classList.contains("color-for-status"),d.addEventListener("change",b=>{let{checked:p}=b.target;this.prefs.color_for_status=p})},a("Color for status",c),c=d=>{d.checked=document.querySelector("#torrent-list").classList.contains("contrast-remainders"),d.addEventListener("change",b=>{let{checked:p}=b.target;this.prefs.contrast_remainders=p})},a("Contrast remainders",c),c=d=>{d.checked=document.querySelector("#torrent-list").classList.contains("limit-width"),d.addEventListener("change",b=>{let{checked:p}=b.target;this.prefs.limit_width=p})},a("Limit width to 640px",c),n=document.createElement("h5"),o.append(n),n.textContent="style",l=document.createElement("div"),l.classList.add("table-row"),o.append(l),c=(d,b)=>{d.checked=!b||document.querySelector("#torrent-list").classList.contains(b),d.addEventListener("change",p=>{let{value:h}=p.target;this.prefs.progress_barrel=h})},i("progress-barrel","Flat",null,null,c),i("progress-barrel","Barrel not in selection","barrel-partial","partial",c),i("progress-barrel","Barrel","barrel-full","full",c),n=document.createElement("h4"),o.append(n),n.textContent="Refresh interval",l=document.createElement("div"),l.classList.add("table-row"),o.append(l);let g=d=>{let b=this.prefs.refresh_rate_sec===1?5:1;this.prefs.refresh_rate_sec=b,document.querySelector("#refresh-rate").textContent=`${b}s`,d.target.textContent=`${b}s`},m=document.createElement("BUTTON");return m.addEventListener("click",g.bind(this)),m.textContent=`${this.prefs.refresh_rate_sec}s`,l.append(m),e.confirm.remove(),delete e.confirm,e}};var ce=class extends EventTarget{constructor(e){super(),this.action_listener=this._update.bind(this),this.action_manager=e,this.action_manager.addEventListener("change",this.action_listener),Object.assign(this,this._create()),this.outside=new R(this.root),this.outside.addEventListener("click",()=>this.close()),this.show()}show(){for(let[e,t]of Object.entries(this.actions))W(t,this.action_manager.isEnabled(e));document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.action_manager.removeEventListener("change",this.action_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_update(e){let t=this.actions[e.action];t&&W(t,e.enabled)}_create(){let e=document.createElement("div");e.role="menu",e.classList.add("context-menu","popup"),e.addEventListener("contextmenu",l=>{l.preventDefault()}),e.style.pointerEvents="none";let t={},r=l=>{let a=document.createElement("div"),i=this.action_manager.text(l);a.role="menuitem",a.classList.add("context-menuitem"),a.dataset.action=l,a.textContent=i;let c=this.action_manager.keyshortcuts(l);return c&&a.setAttribute("aria-keyshortcuts",c),a.addEventListener("click",()=>{this.action_manager.click(l),this.close()}),t[l]=a,a},o=()=>{let l=document.createElement("div");return l.classList.add("context-menu-separator"),l},n=(l,...a)=>{let i=document.createElement("DIV");i.textContent=l,i.classList.add("context-menuitem");let c=document.createElement("DIV");c.classList="arrow",i.append(c);let g=document.createElement("DIV");g.classList="submenu",c.append(g);let m=document.createElement("DIV");return m.classList="open right",g.append(m),m.append(...a.map(d=>r(d))),i.addEventListener("click",d=>{let b=i.lastChild.lastChild;if(!d.target.classList.contains("right")&&!d.target.parentNode.classList.contains("right")&&!d.target.classList.contains("left")&&!d.target.parentNode.classList.contains("left")&&b.style.display==="block"){b.style.display="none";return}for(let x of document.querySelectorAll(".submenu"))x.style.display="none";b.style.display="block";let p=i.getBoundingClientRect(),h=b.lastChild.getBoundingClientRect(),C=Math.min(0,document.documentElement.clientHeight-window.visualViewport.offsetTop-p.top-b.clientHeight+5),y=Math.min(0,document.documentElement.clientWidth-window.visualViewport.offsetLeft-p.right-b.clientWidth);b.style.top=`${C}px`,y?(b.lastChild.classList="open left",b.style.left=`${-p.width-h.width}px`):(b.lastChild.classList="open right",b.style.left=`${y}px`)}),i};return e.append(r("resume-selected-torrents"),r("resume-selected-torrents-now"),r("pause-selected-torrents"),o(),n("Move in the queue","move-top","move-up","move-down","move-bottom"),n("Sequential download","enable-sequential-downloading","disable-sequential-downloading"),o(),r("verify-selected-torrents"),r("remove-selected-torrents"),o(),r("show-move-dialog"),r("show-rename-dialog"),r("show-labels-dialog"),o(),r("reannounce-selected-torrents"),o(),n("Select operation","select-all","deselect-all")),{actions:t,root:e}}};var Yt=new Intl.PluralRules,Q=Yt.resolvedOptions().locale,Ws=new Intl.NumberFormat(Q),et=1e3,ws=[new Intl.NumberFormat(Q,{maximumFractionDigits:0,style:"unit",unit:"byte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:0,style:"unit",unit:"kilobyte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:0,style:"unit",unit:"megabyte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"gigabyte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"terabyte"}),new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"petabyte"})],Ls=new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"kilobyte-per-second"}),Qs=new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"megabyte-per-second"}),Os=new Intl.NumberFormat(Q,{maximumFractionDigits:2,style:"unit",unit:"gigabyte-per-second"}),B={_toTruncFixed(s,e){return(Math.floor(s*10**e)/10**e).toFixed(e)},countString(s,e,t){return`${this.number(t)} ${this.ngettext(s,e,t)}`},mem(s){if(s<0)return"Unknown";if(s===0)return"None";let e=s;for(let t of ws){if(es.includes(e))?"\u2026":s},timeInterval(s,e=3){let t=Math.floor(s/86400),r=[];t&&r.push(this.countString("day","days",t));let o=Math.floor(s%86400/3600);(t||o)&&r.push(this.countString("hour","hours",o));let n=Math.floor(s%3600/60);return t||o||n?(r.push(this.countString("minute","minutes",n)),r=r.slice(0,e),r.length>1?`${r.slice(0,-1).join(", ")} and ${r.slice(-1)}`:r[0]):this.countString("second","seconds",Math.floor(s%60))},timestamp(s){if(!s)return"N/A";let e=new Date(s*1e3),t=new Date,r="",o="",n=t.getFullYear()===e.getFullYear(),l=t.getMonth()===e.getMonth(),a=t.getDate()-e.getDate();n&&l&&Math.abs(a)<=1?a===0?r="Today":a===1?r="Yesterday":r="Tomorrow":r=e.toDateString();let i=e.getHours(),c="AM";i>12&&(i=i-12,c="PM"),i===0&&(i=12),i<10&&(i=`0${i}`);let g=e.getMinutes();return g<10&&(g=`0${g}`),s=e.getSeconds(),s<10&&(s=`0${s}`),o=[i,g,s].join(":"),[r,o,c].join(" ")},toKBps(s){return Math.floor(s/et)}};var Fe=class extends EventTarget{isDone(){return this.fields.have>=this.fields.size}isEditable(){return this.fields.torrent.getFileCount()>1&&!this.isDone()}refreshWantedHTML(){let e=this.elements.root;e.classList.toggle("skip",!this.fields.isWanted),e.classList.toggle("complete",this.isDone()),W(e.checkbox,this.isEditable()),e.checkbox.checked=this.fields.isWanted}refreshProgressHTML(){let{size:e,have:t}=this.fields,r=100*(e?t/e:1),o=B,n=`${o.size(t)} of ${o.size(e)} (${o.percentString(r)}%)`;I(this.elements.progress,n)}refresh(){let e=0,t=!1,r=!1,o=!1,n=0,l=!1,a=this.fields.torrent.getFiles();for(let i of this.fields.indices){let c=a[i];switch(e+=c.bytesCompleted,n+=c.length,l|=c.wanted,c.priority.toString()){case"-1":r=!0;break;case"1":t=!0;break;default:o=!0;break}}Ge(this.elements.priority_low_button,r),Ge(this.elements.priority_normal_button,o),Ge(this.elements.priority_high_button,t),(this.fields.have!==e||this.fields.size!==n)&&(this.fields.have=e,this.fields.size=n,this.refreshProgressHTML()),this.fields.isWanted!==l&&(this.fields.isWanted=l,this.refreshWantedHTML())}fireWantedChanged(e){let t=new Event("wantedToggled");t.indices=[...this.fields.indices],t.wanted=e,this.dispatchEvent(t)}firePriorityChanged(e){let t=new Event("priorityToggled");t.indices=[...this.fields.indices],t.priority=e,this.dispatchEvent(t)}createRow(e,t,r){let o=document.createElement("li");o.classList.add("inspector-torrent-file-list-entry"),this.elements.root=o;let n=document.createElement("input"),l=F();n.type="checkbox",n.className="file-wanted-control",n.title="Download file",n.id=l,n.addEventListener("change",c=>this.fireWantedChanged(c.target.checked)),o.checkbox=n,o.append(n),n=document.createElement("label"),n.className="inspector-torrent-file-list-entry-name",n.setAttribute("for",l),I(n,r),o.append(n),n=document.createElement("div"),n.className="inspector-torrent-file-list-entry-progress",o.append(n),this.elements.progress=n,n=document.createElement("div"),n.className="file-priority-radiobox";let a=n,i=c=>this.firePriorityChanged(c.target.value);n=document.createElement("input"),n.type="radio",n.value="-1",n.className="low",n.title="Low Priority",n.addEventListener("click",i),this.elements.priority_low_button=n,a.append(n),n=document.createElement("input"),n.type="radio",n.value="0",n.className="normal",n.title="Normal Priority",n.addEventListener("click",i),this.elements.priority_normal_button=n,a.append(n),n=document.createElement("input"),n.type="radio",n.value="1",n.title="High Priority",n.className="high",n.addEventListener("click",i),this.elements.priority_high_button=n,a.append(n),o.append(a),o.style.paddingLeft=`${t*20}px`,this.refresh()}getElement(){return this.elements.root}constructor(e,t,r,o){super(),this.fields={have:0,indices:o,isWanted:!0,size:0,torrent:e},this.elements={priority_high_button:null,priority_low_button:null,priority_normal_button:null,progress:null,root:null},this.createRow(e,t,r)}};var A=class s extends EventTarget{constructor(e){super(),this.fieldObservers={},this.fields={},this.refresh(e)}notifyOnFieldChange(e,t){this.fieldObservers[e]=this.fieldObservers[e]||[],this.fieldObservers[e].push(t)}setField(e,t,r){let o=e[t];if(Be(o,r))return!1;let n=this.fieldObservers[t];if(e===this.fields&&n&&n.length>0)for(let l of n)l.call(this,r,o,t);return e[t]=r,!0}updateFiles(e){let t=!1,r=this.fields.files||[],o=["length","name","bytesCompleted","wanted","priority"];for(let[n,l]of e.entries()){let a=r[n]||{};for(let i of o)i in l&&(t|=this.setField(a,i,l[i]));r[n]=a}return this.fields.files=r,t}static collateTrackers(e){return e.map(t=>t.announce.toLowerCase()).join(" ")}refreshFields(e){let t=!1;for(let[r,o]of Object.entries(e))switch(r){case"files":case"fileStats":t|=this.updateFiles(o);break;case"trackerStats":t|=this.setField(this.fields,"trackers",o);break;case"trackers":r in this.fields||(t|=this.setField(this.fields,r,o));break;case"name":this.setField(this.fields,r,e[r])&&(this.fields.collatedName="",t=!0);break;default:t|=this.setField(this.fields,r,o)}return t}refresh(e){this.refreshFields(e)&&this.dispatchEvent(new Event("dataChanged"))}getComment(){return this.fields.comment}getCreator(){return this.fields.creator}getDateAdded(){return this.fields.addedDate}getDateCreated(){return this.fields.dateCreated}getDesiredAvailable(){return this.fields.desiredAvailable}getDownloadDir(){return this.fields.downloadDir}getDownloadSpeed(){return this.fields.rateDownload}getDownloadedEver(){return this.fields.downloadedEver}getError(){return this.fields.error}getErrorString(){return this.fields.errorString}getETA(){return this.fields.eta}getFailedEver(){return this.fields.corruptEver}getFiles(){return this.fields.files||[]}getFile(e){return this.fields.files[e]}getFileCount(){return this.fields["file-count"]}getHashString(){return this.fields.hashString}getHave(){return this.getHaveValid()+this.getHaveUnchecked()}getHaveUnchecked(){return this.fields.haveUnchecked}getHaveValid(){return this.fields.haveValid}getId(){return this.fields.id}getLabels(){return this.fields.labels.sort()}getLastActivity(){return this.fields.activityDate}getLeftUntilDone(){return this.fields.leftUntilDone}getMagnetLink(){return this.fields.magnetLink}getMetadataPercentComplete(){return this.fields.metadataPercentComplete}getName(){return this.fields.name||"Unknown"}getPeers(){return this.fields.peers||[]}getPeersConnected(){return this.fields.peersConnected}getPeersGettingFromUs(){return this.fields.peersGettingFromUs}getPeersSendingToUs(){return this.fields.peersSendingToUs}getPieceCount(){return this.fields.pieceCount}getPieceSize(){return this.fields.pieceSize}getPrimaryMimeType(){return this.fields["primary-mime-type"]||"application/octet-stream"}getPrivateFlag(){return this.fields.isPrivate}getQueuePosition(){return this.fields.queuePosition}getRecheckProgress(){return this.fields.recheckProgress}getSeedRatioLimit(){return this.fields.seedRatioLimit}getSeedRatioMode(){return this.fields.seedRatioMode}getSizeWhenDone(){return this.fields.sizeWhenDone}getStartDate(){return this.fields.startDate}getStatus(){return this.fields.status}getTotalSize(){return this.fields.totalSize}getTrackers(){return this.fields.trackers||[]}getUploadSpeed(){return this.fields.rateUpload}getUploadRatio(){return this.fields.uploadRatio}getUploadedEver(){return this.fields.uploadedEver}getWebseedsSendingToUs(){return this.fields.webseedsSendingToUs}isFinished(){return this.fields.isFinished}hasExtraInfo(){return"hashString"in this.fields}isSeeding(){return this.getStatus()===s._StatusSeed}isSequentialDownload(){return this.fields.sequentialDownload}isStopped(){return this.getStatus()===s._StatusStopped}isChecking(){return this.getStatus()===s._StatusCheck}isDownloading(){return this.getStatus()===s._StatusDownload}isQueued(){return this.getStatus()===s._StatusDownloadWait||this.getStatus()===s._StatusSeedWait}isDone(){return this.getLeftUntilDone()<1}needsMetaData(){return this.getMetadataPercentComplete()<1}getActivity(){return this.getDownloadSpeed()+this.getUploadSpeed()}getPercentDoneStr(){return B.percentString(100*this.getPercentDone(),1)}getPercentDone(){return this.fields.percentDone}getStateString(){switch(this.getStatus()){case s._StatusStopped:return this.isFinished()?"Seeding complete":"Paused";case s._StatusCheckWait:return"Queued for verification";case s._StatusCheck:return"Verifying local data";case s._StatusDownloadWait:return"Queued for download";case s._StatusDownload:return"Downloading";case s._StatusSeedWait:return"Queued for seeding";case s._StatusSeed:return"Seeding";case null:return"Unknown";default:return"Error"}}seedRatioLimit(e){switch(this.getSeedRatioMode()){case s._RatioUseGlobal:return e.seedRatioLimit();case s._RatioUseLocal:return this.getSeedRatioLimit();default:return-1}}getErrorMessage(){let e=this.getErrorString();switch(this.getError()){case s._ErrTrackerWarning:return`Tracker returned a warning: ${e}`;case s._ErrTrackerError:return`Tracker returned an error: ${e}`;case s._ErrLocalError:return`Error: ${e}`;default:return null}}getCollatedName(){let e=this.fields;return!e.collatedName&&e.name&&(e.collatedName=e.name.toLowerCase()),e.collatedName||""}getCollatedTrackers(){let e=this.fields;return!e.collatedTrackers&&e.trackers&&(e.collatedTrackers=s.collateTrackers(e.trackers)),e.collatedTrackers||""}testState(e,t){switch(t){case u.FilterActive:return this.getPeersGettingFromUs()>0||this.getPeersSendingToUs()>0||this.getWebseedsSendingToUs()>0||this.isChecking();case u.FilterSeeding:return e===s._StatusSeed||e===s._StatusSeedWait;case u.FilterDownloading:return e===s._StatusDownload||e===s._StatusDownloadWait;case u.FilterPaused:return this.isStopped();case u.FilterFinished:return this.isFinished();default:return!0}}test(e){let t=null,r=(o,n,l)=>o.length===0?!0:(t=n(),o.some(a=>a.every(i=>l(i))));return r(e.search,()=>this.getCollatedName(),o=>t.includes(o))&&r(e.labels,()=>this.getLabels(),o=>t.some(n=>n.includes(o)))&&r(e.states,()=>this.getStatus(),o=>this.testState(t,o))&&r(e.trackers,()=>this.getCollatedTrackers(),o=>t.includes(o))}static compareById(e,t){return e.getId()-t.getId()}static compareByName(e,t){return e.getCollatedName().localeCompare(t.getCollatedName())||s.compareById(e,t)}static compareByQueue(e,t){return e.getQueuePosition()-t.getQueuePosition()}static compareByAge(e,t){let r=e.getDateAdded();return t.getDateAdded()-r||s.compareByQueue(e,t)}static compareByState(e,t){let r=e.getStatus();return t.getStatus()-r||s.compareByQueue(e,t)}static compareByActivity(e,t){let r=e.getActivity();return t.getActivity()-r||s.compareByState(e,t)}static compareByRatio(e,t){let r=e.getUploadRatio(),o=t.getUploadRatio();return ro?-1:s.compareByState(e,t)}static compareByProgress(e,t){let r=e.getPercentDone(),o=t.getPercentDone();return r-o||s.compareByRatio(e,t)}static compareBySize(e,t){let r=e.getTotalSize(),o=t.getTotalSize();return r-o||s.compareByName(e,t)}static compareTorrents(e,t,r,o){let n=0;switch(r){case u.SortByActivity:n=s.compareByActivity(e,t);break;case u.SortByAge:n=s.compareByAge(e,t);break;case u.SortByQueue:n=s.compareByQueue(e,t);break;case u.SortByProgress:n=s.compareByProgress(e,t);break;case u.SortBySize:n=s.compareBySize(e,t);break;case u.SortByState:n=s.compareByState(e,t);break;case u.SortByRatio:n=s.compareByRatio(e,t);break;case u.SortByName:n=s.compareByName(e,t);break;default:console.log(`Unrecognized sort mode: ${r}`),n=s.compareByName(e,t);break}return o===u.SortDescending&&(n=-n),n}static sortTorrents(e,t,r){switch(t){case u.SortByActivity:e.sort(this.compareByActivity);break;case u.SortByAge:e.sort(this.compareByAge);break;case u.SortByName:e.sort(this.compareByName);break;case u.SortByProgress:e.sort(this.compareByProgress);break;case u.SortByQueue:e.sort(this.compareByQueue);break;case u.SortByRatio:e.sort(this.compareByRatio);break;case u.SortBySize:e.sort(this.compareBySize);break;case u.SortByState:e.sort(this.compareByState);break;default:console.log(`Unrecognized sort mode: ${t}`),e.sort(this.compareByName);break}return r===u.SortDescending&&e.reverse(),e}};A._StatusStopped=0;A._StatusCheckWait=1;A._StatusCheck=2;A._StatusDownloadWait=3;A._StatusDownload=4;A._StatusSeedWait=5;A._StatusSeed=6;A._RatioUseGlobal=0;A._RatioUseLocal=1;A._RatioUnlimited=2;A._ErrNone=0;A._ErrTrackerWarning=1;A._ErrTrackerError=2;A._ErrLocalError=3;A._TrackerInactive=0;A._TrackerWaiting=1;A._TrackerQueued=2;A._TrackerActive=3;A.Fields={};A.Fields.Metadata=["addedDate","file-count","name","primary-mime-type","totalSize"];A.Fields.Stats=["error","errorString","eta","isFinished","isStalled","labels","leftUntilDone","metadataPercentComplete","peersConnected","peersGettingFromUs","peersSendingToUs","percentDone","queuePosition","rateDownload","rateUpload","recheckProgress","seedRatioMode","seedRatioLimit","sequentialDownload","sizeWhenDone","status","trackers","downloadDir","uploadedEver","uploadRatio","webseedsSendingToUs"];A.Fields.InfoExtra=["comment","creator","dateCreated","files","hashString","isPrivate","magnetLink","pieceCount","pieceSize"];A.Fields.StatsExtra=["activityDate","corruptEver","desiredAvailable","downloadedEver","fileStats","haveUnchecked","haveValid","peers","startDate","trackerStats"];var Tt=["encryption","speed-up","speed-down","percent-done","status","peer-address","peer-app-name"],le=class s extends EventTarget{constructor(e){super(),this.canvas=null,this.context=null,this.closed=!1,this.controller=e,this.elements=this._create(),this.current_page=this.elements.info.root,this.interval=setInterval(this._refreshTorrents.bind(this),3e3),this.name="inspector",this.selection_listener=t=>this._setTorrents(t.selected),this.torrent_listener=()=>this._updateCurrentPage(),this.torrents=[],this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null,this.elements.dismiss.addEventListener("click",()=>this.close()),Object.seal(this),e.addEventListener("torrent-selection-changed",this.selection_listener),this._setTorrents(this.controller.getSelectedTorrents()),document.querySelector("#mainwin-workarea").append(this.elements.root)}close(){if(!this.closed){clearInterval(this.interval),this._setTorrents([]),this.elements.root.remove(),this.controller.removeEventListener("torrent-selection-changed",this.selection_listener),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}static _createInfoPage(e){let t=document.createElement("div");t.classList.add("inspector-info-page");let r={root:t},o=c=>{let g=document.createElement("div");g.textContent=c,g.classList.add("section-label"),t.append(g)},n=c=>{let g=document.createElement("label");I(g,c),t.append(g);let m=document.createElement("span");return t.append(m),m},l=document.createElement("button");l.innerHTML="⋮",l.className="tabs-container-menu",l.addEventListener("click",()=>{e.action_manager.click("show-context-menu")});let a=e.pointer_device;a.is_touch_device?(l.addEventListener("touchmove",()=>{a.x=event_.touches[0].pageX,a.y=event_.touches[0].pageY}),l.addEventListener("touchend",()=>{setTimeout(()=>{let c=e.popup[1];c&&(c.root.style.pointerEvents="auto")},1)})):(l.addEventListener("mousemove",c=>{a.x=c.pageX,a.y=c.pageY}),l.addEventListener("mouseup",()=>{setTimeout(()=>{let c=e.popup[1];c&&(c.root.style.pointerEvents="auto")},1)})),t.append(l),o("Activity");let i=[["have","Have:"],["availability","Availability:"],["uploaded","Uploaded:"],["downloaded","Downloaded:"],["sequential_download","Sequential download:"],["state","State:"],["running_time","Running time:"],["remaining_time","Remaining:"],["last_activity","Last activity:"],["error","Error:"]];for(let[c,g]of i)r[c]=n(g);o("Details"),i=[["name","Name:"],["size","Size:"],["location","Location:"],["hash","Hash:"],["privacy","Privacy:"],["origin","Origin:"],["dateAdded","Date added:"],["magnetLink","Magnet:"],["comment","Comment:"],["labels","Labels:"]];for(let[c,g]of i)r[c]=n(g);return r}static _createListPage(e,t){let r=document.createElement("div"),o=document.createElement(e);return o.id=t,r.append(o),{list:o,root:r}}static _createTiersPage(){return s._createListPage("div","inspector-tiers-list")}static _createFilesPage(){return s._createListPage("ul","inspector-file-list")}static _createPeersPage(){let e=document.createElement("table");e.classList.add("peer-list");let t=document.createElement("thead"),r=document.createElement("tr"),o=["","Up","Down","Done","Status","Address","Client"];for(let[l,a]of o.entries()){let i=document.createElement("th"),c=Tt[l];c==="encryption"&&(i.dataset.encrypted=!0),i.classList.add(c),I(i,a),r.append(i)}let n=document.createElement("tbody");return t.append(r),e.append(t),e.append(n),{root:e,tbody:n}}static _createPiecesPage(){let e=document.createElement("div");return e.style.lineHeight=0,{root:e,count:0}}_create(){let e={files:s._createFilesPage(),info:s._createInfoPage(this.controller),peers:s._createPeersPage(),pieces:s._createPiecesPage(),tiers:s._createTiersPage()},t=o=>{this.current_page=o,this._updateCurrentPage()};return{...Xe("inspector",[["inspector-tab-info",e.info.root,"Info"],["inspector-tab-pieces",e.pieces.root,"Pieces"],["inspector-tab-peers",e.peers.root,"Peers"],["inspector-tab-tiers",e.tiers.root,"Tiers"],["inspector-tab-files",e.files.root,"Files"]],t.bind(this)),...e}}_setTorrents(e){let t="dataChanged",r=this.torrent_listener;for(let o of this.torrents)o.removeEventListener(t,r);this.torrents=[...e];for(let o of this.torrents)o.addEventListener(t,r);this._refreshTorrents(),this._updateCurrentPage()}static _needsExtraInfo(e){return e.some(t=>!t.hasExtraInfo())}_refreshTorrents(){let{controller:e,torrents:t}=this,r=t.map(o=>o.getId());if(r&&r.length>0){let o=["id",...A.Fields.StatsExtra];s._needsExtraInfo(t)&&o.push(...A.Fields.InfoExtra),e.updateTorrents(r,o)}}_updateCurrentPage(){let{current_page:e,elements:t}=this;switch(e){case t.files.root:this._updateFiles();break;case t.info.root:this._updateInfo();break;case t.pieces.root:this._updatePiecesDIV();break;case t.peers.root:this._updatePeers();break;case t.tiers.root:this._updateTiers();break;default:console.warn("unexpected page"),console.log(e)}}_updateInfo(){let e="None",t="Mixed",r="Unknown",o=B,n=Date.now(),{elements:l,torrents:a}=this,i=a.reduce((d,b)=>d+b.getSizeWhenDone(),0),c=null;if(a.length===0)c=e;else if(a.every(d=>d.isFinished()))c="Finished";else if(a.every(d=>d.isStopped()))c="Paused";else{let d=p=>p.getStateString(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}I(l.info.state,c);let g=c;if(a.length===0)c=e;else{let d=a.reduce((C,y)=>C+y.getHaveValid(),0),b=a.reduce((C,y)=>C+y.getHaveUnchecked(),0),p=a.reduce((C,y)=>C+y.getLeftUntilDone(),0),h=100*(i?(i-p)/i:1);c=o.percentString(h),b?c=`${o.size(d)} of ${o.size(i)} (${c}%), ${o.size(b)} Unverified`:p?c=`${o.size(d)} of ${o.size(i)} (${c}%)`:c=`${o.size(d)} (100%)`}if(I(l.info.have,o.stringSanitizer(c)),a.length===0)c=e;else if(i===0)c=e;else{let d=a.reduce((b,p)=>p.getHave()+p.getDesiredAvailable(),0);c=`${o.percentString(100*d/i)}%`}if(I(l.info.availability,o.stringSanitizer(c)),a.length===0)c=e;else{let d=a.reduce((p,h)=>p+h.getDownloadedEver(),0),b=a.reduce((p,h)=>p+h.getFailedEver(),0);c=b?`${o.size(d)} (+${o.size(b)} discarded after failed checksum)`:o.size(d)}if(I(l.info.downloaded,o.stringSanitizer(c)),a.length===0)c=e;else{let d=a.reduce((p,h)=>p+h.getUploadedEver(),0),b=a.reduce((p,h)=>p+h.getSizeWhenDone(),0)||a.reduce((p,h)=>p+h.getHaveValid(),0);c=`${o.size(d)} (Ratio: ${o.ratioString(ne.ratio(d,b))})`}if(I(l.info.uploaded,c),a.length===0)c=e;else if(a.every(d=>d.isStopped()))c=g;else{let d=p=>p.getStartDate(),b=d(a[0]);c=a.every(p=>d(p)===b)?o.timeInterval(n/1e3-b):t}if(I(l.info.running_time,c),a.length===0)c=e;else{let d=p=>p.getETA(),b=d(a[0]);a.every(p=>d(p)===b)?b<0?c=r:c=o.timeInterval(b):c=t}if(I(l.info.remaining_time,c),a.length===0)c=e;else{let d=a.reduce((p,h)=>Math.max(p,h.getLastActivity()),-1),b=Math.floor(n/1e3);if(0p.getErrorString(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}if(I(l.info.error,c||e),a.length===1?c=a[0].getName():c=a.length>0?t:e,I(l.info.name,c),a.length===0)c=e;else{let d=a.reduce((b,p)=>b+p.getTotalSize(),0);if(d){let b=y=>y.getPieceSize(),p=a.reduce((y,x)=>y+x.getPieceCount(),0),h=o.number(p),C=b(a[0]);c=a.every(y=>b(y)===C)?`${o.size(d)} (${h} pieces @ ${o.mem(C)})`:`${o.size(d)} (${h} pieces)`}else c="None"}if(I(l.info.size,o.stringSanitizer(c)),a.length===0)c=e;else{let d=p=>p.getHashString(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}if(I(l.info.hash,c),a.length===0)c=e;else{let d=p=>p.getPrivateFlag(),b=d(a[0]);a.every(p=>d(p)===b)?b?c="Private to this tracker -- DHT and PEX disabled":c="Public torrent":c=t}if(I(l.info.privacy,c),a.length===0)c=e;else{let d=p=>p.getComment(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}if(c=c||e,c.startsWith("https://")||c.startsWith("http://")?(c=encodeURI(c),l.info.comment.innerHTML=`${c}`):I(l.info.comment,c),c=a.length===0?e:a[0].getLabels().join(", "),I(l.info.labels,c),a.length===0)c=e;else{let d=f=>f.getCreator(),b=d(a[0]),p=!a.every(f=>d(f)===b);d=f=>f.getDateCreated();let h=d(a[0]),C=!a.every(f=>d(f)===h),y=!b||b.length===0,x=!h;p||C?c=t:y&&x?c=r:x&&!y?c=`Created by ${b}`:y&&!x?c=`Created on ${new Date(h*1e3).toDateString()}`:c=`Created by ${b} on ${new Date(h*1e3).toDateString()}`}if(I(l.info.origin,c),a.length===0)c=e;else{let d=p=>p.getDownloadDir(),b=d(a[0]);c=a.every(p=>d(p)===b)?b:t}if(I(l.info.location,c),a.length===0)c=e;else{let d=p=>p.getDateAdded(),b=d(a[0]);c=a.every(p=>d(p)===b)?new Date(b*1e3).toLocaleString(navigator.language,{day:"2-digit",hour:"2-digit",hour12:!1,minute:"2-digit",month:"short",second:"2-digit",timeZoneName:"short",weekday:"short",year:"numeric"}):t}if(I(l.info.dateAdded,c),a.length===0)I(l.info.magnetLink,e);else if(a.length>1)I(l.info.magnetLink,t);else{let d=a[0].getMagnetLink();l.info.magnetLink.innerHTML=``}let m=a.reduce((d,b)=>(b=b.isSequentialDownload()?"Yes":"No",d!==e&&d!==b?t:b),e);I(l.info.sequential_download,m)}_updatePieces(){let{pieces:e}=this.elements,{torrents:t}=this,r=8,o=r*4;this.canvas||(console.log("PieceView page standby"),this.canvas=document.createElement("canvas"),e.root.append(this.canvas));let n=this.canvas.getContext("2d");if(t.length>0){let b=t[0].getTotalSize();if(b){let p=t[0].getPieceCount(),h=t[0].getPieceSize();if(!e.count||e.count!==p){e.count=p,console.log("Total MB",b/1048576),console.log("Pieces",p),console.log("MB per piece",h/1048576);let C=Math.ceil(p/o),y=p%o;this.canvas.width=o*r+3,this.canvas.height=C*r+3,n.fillStyle="rgba(128, 128, 144, 0.5)",n.fillRect(0,0,this.canvas.width,this.canvas.height),n.fillStyle="rgba(255, 255, 255, 1)";for(let x of Array(C).keys()){let f=x*r;for(let H of Array(x===C-1?y:o).keys()){let X=H*r;n.fillRect(X+2,f+2,r-1,r-1)}}}e.root.style.display="block"}else console.log("no size"),e.root.style.display="none"}else console.log("no torrent selected"),e.root.style.display="none";let l="rgba(255, 168, 16, 0.75)",a="rgba(56, 136, 255, 0.75)",i="rgba(128, 192, 255, 0.75)",c=parseInt(Date.now()/100),g=c%o*r,m=parseInt(c/o)%16*r,d=[g+2,m+2,r-1,r-1];n.clearRect(...d),n.fillStyle=i,n.fillRect(...d)}_updatePiecesDIV(){let{pieces:e}=this.elements,{torrents:t}=this;if(t.length>0)if(t[0].getTotalSize()){let n=t[0].getPieceCount(),l=t[0].getPieceSize();if(!e.count||e.count!==n){e.count=n;for(let a of Array(n).keys()){let i=document.createElement("DIV");i.classList="piece",e.root.append(i)}}e.root.style.display="block"}else console.log("no size"),e.root.style.display="none";else console.log("no torrent selected"),e.root.style.display="none";let r=parseInt(Date.now()/100);e.root.children[r%1024].classList="piece active",e.root.children[r%1024+1].classList="piece weak",e.root.children[r%1024+2].classList="piece med",e.root.children[r%1024+3].classList="piece strong"}static _peerStatusTitle(e){let t=Object.seal({"?":"We unchoked this peer, but they're not interested",D:"Downloading from this peer",E:"Encrypted Connection",H:"Peer was discovered through Distributed Hash Table (DHT)",I:"Peer is an incoming connection",K:"Peer has unchoked us, but we're not interested",O:"Optimistic unchoke",T:"Peer is connected via uTP",U:"Uploading to peer",X:"Peer was discovered through Peer Exchange (PEX)",d:"We would download from this peer if they'd let us",u:"We would upload to this peer if they'd ask"});return[...e].filter(r=>t[r]).map(r=>`${r}: ${t[r]}`).join(` +`)}_updatePeers(){let e=B,{elements:t,torrents:r}=this,{tbody:o}=t.peers,n=[(a,i)=>{i.dataset.encrypted=a.isEncrypted},(a,i)=>I(i,a.rateToPeer?e.speedBps(a.rateToPeer):""),(a,i)=>I(i,a.rateToClient?e.speedBps(a.rateToClient):""),(a,i)=>I(i,`${Math.floor(a.progress*100)}%`),(a,i)=>{I(i,a.flagStr),i.setAttribute("title",s._peerStatusTitle(a.flagStr))},(a,i)=>I(i,a.address),(a,i)=>I(i,a.clientName)],l=[];for(let a of r){let i=document.createElement("tr");i.classList.add("torrent-row");let c=document.createElement("td");c.setAttribute("colspan",n.length),I(c,a.getName()),i.append(c),l.push(i);for(let g of a.getPeers()){let m=document.createElement("tr");m.classList.add("peer-row");for(let[d,b]of n.entries()){let p=document.createElement("td");p.classList.add(Tt[d]),b(g,p),m.append(p)}l.push(m)}for(;o.firstChild;)o.firstChild.remove();o.append(...l)}}static getAnnounceState(e){switch(e.announceState){case A._TrackerActive:return"Announce in progress";case A._TrackerWaiting:{let t=Math.max(0,e.nextAnnounceTime-Date.now()/1e3);return`Next announce in ${B.timeInterval(t)}`}case A._TrackerQueued:return"Announce is queued";case A._TrackerInactive:return e.isBackup?"Tracker will be used as a backup":"Announce not scheduled";default:return`unknown announce state: ${e.announceState}`}}static lastAnnounceStatus(e){let t="Last Announce",r=["N/A"];if(e.hasAnnounced){let o=B.timestamp(e.lastAnnounceTime);e.lastAnnounceSucceeded?r=[o," (got ",B.countString("peer","peers",e.lastAnnouncePeerCount),")"]:(t="Announce error",r=[e.lastAnnounceResult?`${e.lastAnnounceResult} - `:"",o])}return{label:t,value:r.join("")}}static lastScrapeStatus(e){let t="Last Scrape",r="N/A";if(e.hasScraped){let o=B.timestamp(e.lastScrapeTime);e.lastScrapeSucceeded?r=o:(t="Scrape error",r=(e.lastScrapeResult?`${e.lastScrapeResult} - `:"")+o)}return{label:t,value:r}}static _getOrigin(e){try{let t="udp://";if(e.announce.startsWith(t)){let o="http://",n=e.announce.replace(t,o);return new URL(n).origin.replace(o,t)}return new URL(e.announce).origin}catch{return[e.sitename||e.host||e.announce]}}_updateTiers(){let e="N/A",{list:t}=this.elements.tiers,{torrents:r}=this,o=[];for(let n of r){if(r.length>1){let l=document.createElement("div");l.classList.add("tier-list-torrent"),I(l,n.getName()),o.push(l)}for(let l of n.getTrackers()){let a=s.getAnnounceState(l),i=s.lastAnnounceStatus(l),c=s.lastScrapeStatus(l),g=document.createElement("div");g.classList.add("tier-list-row");let m=document.createElement("div"),d=s._getOrigin(l);m.classList.add("tier-list-tracker"),I(m,`${d} - tier ${l.tier+1}`),m.setAttribute("title",l.announce),g.append(m),m=document.createElement("div"),m.classList.add("tier-announce"),I(m,`${i.label}: ${i.value}`),g.append(m),m=document.createElement("div"),m.classList.add("tier-seeders"),I(m,`Seeders: ${l.seederCount>-1?l.seederCount:e}`),g.append(m),m=document.createElement("div"),m.classList.add("tier-state"),I(m,a),g.append(m),m=document.createElement("div"),m.classList.add("tier-leechers"),I(m,`Leechers: ${l.leecherCount>-1?l.leecherCount:e}`),g.append(m),m=document.createElement("div"),m.classList.add("tier-scrape"),I(m,`${c.label}: ${c.value}`),g.append(m),m=document.createElement("div"),m.classList.add("tier-downloads"),I(m,`Downloads: ${l.downloadCount>-1?l.downloadCount:e}`),g.append(m),o.push(g)}}for(;t.firstChild;)t.firstChild.remove();t.append(...o)}_changeFileCommand(e,t){let{controller:r,file_torrent:o}=this,n=o.getId();r.changeFileCommand(n,e,t)}_onFileWantedToggled(e){let{indices:t,wanted:r}=e;this._changeFileCommand(t,r?"files-wanted":"files-unwanted")}_onFilePriorityToggled(e){let{indices:t,priority:r}=e,o=null;switch(r.toString()){case"-1":o="priority-low";break;case"1":o="priority-high";break;default:o="priority-normal";break}this._changeFileCommand(t,o)}_clearFileList(){let{list:e}=this.elements.files;for(;e.firstChild;)e.firstChild.remove();this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null}static createFileTreeModel(e){let t=[],r={children:{},file_indices:[]};for(let[o,n]of e.getFiles().entries()){let{name:l}=n,a=l.split("/"),i=r;for(let[c,g]of a.entries()){let m=i.children[g];m||(i.children[g]=m={children:{},depth:c,file_indices:[],name:g,parent:i}),i=m}i.file_index=o,delete i.children,t.push(i)}for(let o of t){let{file_index:n}=o,l=o;do l.file_indices.push(n),l=l.parent;while(l)}return r}addNodeToView(e,t,r){let o=new Fe(e,r.depth,r.name,r.file_indices);o.addEventListener("wantedToggled",this._onFileWantedToggled.bind(this)),o.addEventListener("priorityToggled",this._onFilePriorityToggled.bind(this)),this.file_rows.push(o),t.append(o.getElement())}addSubtreeToView(e,t,r){if(r.parent&&this.addNodeToView(e,t,r),r.children)for(let o of Object.values(r.children))this.addSubtreeToView(e,t,o)}_updateFiles(){let{list:e}=this.elements.files,{file_rows:t,file_torrent:r,file_torrent_n:o,torrents:n}=this;if(n.length!==1){this._clearFileList();return}let[l]=n,a=l.getFiles().length;if(l!==r||a!==o){this._clearFileList(),this.file_torrent=l,this.file_torrent_n=a,this.file_rows=[];let i=document.createDocumentFragment(),c=s.createFileTreeModel(l);this.addSubtreeToView(l,i,c),e.append(i)}else for(let i of t)i.refresh()}};var He="",Je=class s extends EventTarget{constructor(e,t,r){super(),this.controller=e,this.remote=t,this.action_input_value=r,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();e.length!==0&&(He=He||e[0].getDownloadDir(),this.torrents=e,this.elements=s._create(this.action_input_value===null?"Apply":"Confirm"),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.entry.value=this.action_input_value===null?He:this.action_input_value,document.body.append(this.elements.root),this.elements.entry.focus())}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.action_input_value===null?this.close():this.controller.action_manager.click("show-inspector")}_onConfirm(){let e=this.torrents.map(r=>r.getId()),t=this.elements.entry.value.trim();He=t,this.remote.moveTorrents(e,t),this._onDismiss()}static _create(e){let t=J("move-dialog");t.root.setAttribute("aria-label","Move Torrent"),t.heading.textContent="Set Torrent Location",t.confirm.textContent=e;let r=document.createElement("label");r.setAttribute("for","torrent-path"),r.textContent="Location:",t.workarea.append(r);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-path",t.entry=o,t.workarea.append(o),t}};var j=class s extends EventTarget{constructor(e){super(),this.elements=s._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.options=e,document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}static _create(e){let{heading:t,message:r}=e,o=J("confirm-dialog");return o.confirm.remove(),delete o.confirm,o.heading.textContent=t,o.workarea.textContent=r,o}};var $=class extends EventTarget{constructor(e,t,r="",o=[]){super(),this.controller=e,this.remote=t,this.elements=this._create(r),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),o.length>0&&(this.elements.file_input.files=o),this._updateFreeSpaceInAddDialog(),this.elements.url_input.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_updateFreeSpaceInAddDialog(){let e=this.elements.folder_input.value;this.remote.getFreeSpace(e,(t,r)=>{if(!this.closed){let o=r>0?`${B.size(r)} Free`:"";this.elements.freespace.textContent=o}})}_onConfirm(){let{controller:e,elements:t,remote:r}=this,{file_input:o,folder_input:n,start_input:l,url_input:a}=t,i=!l.checked,c=n.value.trim();for(let m of o.files){let d=new FileReader;d.addEventListener("load",b=>{let p=b.target.result,h="base64,",C=p.indexOf(h);if(C===-1)return;let y={arguments:{"download-dir":c,metainfo:p.slice(Math.max(0,C+h.length)),paused:i},method:"torrent-add"};r.sendRequest(y,x=>{x.result!=="success"&&(alert(`Error adding "${m.name}": ${x.result}`),e.setCurrentPopup(new j({heading:`Error adding "${m.name}"`,message:x.result})))})}),d.readAsDataURL(m)}let g=a.value.trim();if(g.length>0){/^[\da-f]{40}$/i.test(g)&&(g=`magnet:?xt=urn:btih:${g}`);let m={arguments:{"download-dir":c,filename:g,paused:i},method:"torrent-add"};r.sendRequest(m,d=>{d.result!=="success"&&e.setCurrentPopup(new j({heading:`Error adding "${g}"`,message:d.result}))})}this._onDismiss()}_create(e){let t=J(),{confirm:r,root:o,heading:n,workarea:l}=t;o.classList.add("open-torrent"),n.textContent="Add Torrents",r.textContent="Add";let a=F(),i=document.createElement("label");i.setAttribute("for",a),i.textContent="Please select torrent files to add:",l.append(i);let c=document.createElement("input");c.type="file",c.name="torrent-files[]",c.id=a,c.multiple="multiple",l.append(c),t.file_input=c,a=F(),i=document.createElement("label"),i.setAttribute("for",a),i.textContent="Or enter a URL:",l.append(i),c=document.createElement("input"),c.type="url",c.id=a,c.value=e,l.append(c),t.url_input=c,c.addEventListener("keyup",({key:b})=>{b==="Enter"&&r.click()}),a=F(),i=document.createElement("label"),i.id="add-dialog-folder-label",i.for=a,i.textContent="Destination folder: ",l.append(i);let g=document.createElement("span");g.id="free-space-text",i.append(g),l.append(i),t.freespace=g,c=document.createElement("input"),c.type="text",c.id="add-dialog-folder-input",c.addEventListener("change",()=>this._updateFreeSpaceInAddDialog()),c.value=this.controller.session_properties["download-dir"],l.append(c),t.folder_input=c;let m=document.createElement("div");l.append(m);let d=document.createElement("input");return d.type="checkbox",d.id="auto-start-check",d.checked=this.controller.shouldAddedTorrentsStart(),m.append(d),t.start_input=d,i=document.createElement("label"),i.id="auto-start-label",i.setAttribute("for",d.id),i.textContent="Start when added",m.append(i),t}};var tt=[0],Z={_DaemonVersion:"version",_DownSpeedLimit:"speed-limit-down",_DownSpeedLimited:"speed-limit-down-enabled",_QueueMoveBottom:"queue-move-bottom",_QueueMoveDown:"queue-move-down",_QueueMoveTop:"queue-move-top",_QueueMoveUp:"queue-move-up",_Root:"../rpc/",_TurtleDownSpeedLimit:"alt-speed-down",_TurtleState:"alt-speed-enabled",_TurtleUpSpeedLimit:"alt-speed-up",_UpSpeedLimit:"speed-limit-up",_UpSpeedLimited:"speed-limit-up-enabled"},ae=class s{constructor(e){this._connection_alert=null,this._controller=e,this._session_id=""}sendRequest(e,t,r){let o=new Headers;o.append("cache-control","no-cache"),o.append("content-type","application/json"),o.append("pragma","no-cache"),this._session_id&&o.append(s._SessionHeader,this._session_id);let n=null;fetch("http://127.0.0.1:9092/transmission/rpc/",{body:JSON.stringify(e),headers:o,method:"POST"}).then(a=>{if(n=a,a.status===409){let i=new Error(s._SessionHeader);throw i.header=a.headers.get(s._SessionHeader),i}return a.json()}).then(a=>{t&&t.call(r,a,n),this._connection_alert&&(this._connection_alert.close(),this._connection_alert=null)}).catch(a=>{if(a.message===s._SessionHeader){this._session_id=a.header,this.sendRequest(e,t,r);return}console.trace(a),this._controller.togglePeriodicSessionRefresh(!1),this._controller.setCurrentPopup(new j({heading:"Connection failed",message:"Could not connect to the server. You may need to reload the page to reconnect."}))})}loadDaemonPrefs(e,t){let r={method:"session-get"};this.sendRequest(r,e,t)}checkPort(e,t,r){let o={arguments:{ipProtocol:e},method:"port-test"};this.sendRequest(o,t,r)}renameTorrent(e,t,r,o,n){let l={arguments:{ids:e,name:r,path:t},method:"torrent-rename-path"};this.sendRequest(l,o,n)}setLabels(e,t,r){let o={ids:e,labels:t};this.sendRequest({arguments:o,method:"torrent-set"},r)}loadDaemonStats(e,t){let r={method:"session-stats"};this.sendRequest(r,e,t)}updateTorrents(e,t,r,o,n){let l={arguments:{fields:t,format:"table"},method:"torrent-get"};e&&(l.arguments.ids=e),this.sendRequest(l,a=>{let i;if(!n){i=a.arguments,r.call(o,i.torrents,i.removed);return}i={removed:[],torrents:[]},i.torrents=[["id","addedDate","file-count","name","primary-mime-type","totalSize","error","errorString","eta","isFinished","isStalled","labels","leftUntilDone","metadataPercentComplete","peersConnected","peersGettingFromUs","peersSendingToUs","percentDone","queuePosition","rateDownload","rateUpload","recheckProgress","seedRatioMode","seedRatioLimit","sizeWhenDone","status","trackers","downloadDir","uploadedEver","uploadRatio","webseedsSendingToUs"]],tt[0]+=256e6;for(let[c,g]of[9993,9994,9995,9996,9997,9998,9999].entries()){let m=[g,1680120820,16,`Demo torrent ${String(g).padStart(2,"0")}`,"application/octet-stream",64e9,0,"",-1,!0,!1,["demo",`state ${c}`],[9996,9997].includes(g)?4096:0,1,64,8,16,.4864,0,tt[0],tt[0],.4864,[9996,9997].includes(g)?0:1,1,0,c,[],"Z:/Discovery/Transmission",2048e8,.4864,0];i.torrents.push(m),i.torrents[i.torrents.length-1][i.torrents[0].indexOf("trackers")]=[{announce:"udp://torrent.net:3333",id:0,scrape:"udp://torrent.net:3333",sitename:"torrent",tier:0},{announce:"udp://torrent.org:6666",id:1,scrape:"udp://torrent.org:6666",sitename:"torrent",tier:1},{announce:"udp://transmission.me:1111/announce",id:2,scrape:"udp://transmission.me:1111/scrape",sitename:"transmission",tier:2},{announce:"udp://transmission.me:2222/announce",id:3,scrape:"udp://transmission.me:2222/scrape",sitename:"transmission",tier:2},{announce:"udp://transmission.to:3333/announce",id:4,scrape:"udp://transmission.to:3333/scrape",sitename:"transmission",tier:4},{announce:"udp://transmission.to:5555/announce",id:5,scrape:"udp://transmission.to:5555/scrape",sitename:"transmission",tier:4}]}r.call(o,i.torrents,i.removed)})}getFreeSpace(e,t,r){let o={arguments:{path:e},method:"free-space"};this.sendRequest(o,n=>{let l=n.arguments;t.call(r,l.path,l["size-bytes"])})}changeFileCommand(e,t,r){let o={ids:[e]};o[r]=t,this.sendRequest({arguments:o,method:"torrent-set"},()=>{this._controller.refreshTorrents([e])})}sendTorrentSetRequests(e,t,r,o,n){r||(r={}),r.ids=t;let l={arguments:r,method:e};this.sendRequest(l,o,n)}sendTorrentActionRequests(e,t,r,o){this.sendTorrentSetRequests(e,t,null,r,o)}startTorrents(e,t,r,o){let n=t?"torrent-start-now":"torrent-start";this.sendTorrentActionRequests(n,e,r,o)}stopTorrents(e,t,r){this.sendTorrentActionRequests("torrent-stop",e,t,r)}moveTorrents(e,t,r,o){this.sendTorrentSetRequests("torrent-set-location",e,{location:t,move:!0},r,o)}removeTorrents(e,t){let r={arguments:{"delete-local-data":t,ids:[]},method:"torrent-remove"};if(e)for(let o=0,n=e.length;o{this._controller.refreshTorrents()})}verifyTorrents(e,t,r){this.sendTorrentActionRequests("torrent-verify",e,t,r)}reannounceTorrents(e,t,r){this.sendTorrentActionRequests("torrent-reannounce",e,t,r)}addTorrentByUrl(e,t){/^[\da-f]{40}$/i.test(e)&&(e=`magnet:?xt=urn:btih:${e}`);let r={arguments:{filename:e,paused:t.paused},method:"torrent-add"};this.sendRequest(r,()=>{this._controller.refreshTorrents()})}savePrefs(e){let t={arguments:e,method:"session-set"};this.sendRequest(t,()=>{this._controller.loadDaemonPrefs()})}updateBlocklist(){let e={method:"blocklist-update"};this.sendRequest(e,()=>{this._controller.loadDaemonPrefs()})}_setSequentialDownload(e,t,r){let o={ids:e,sequentialDownload:t};this.sendRequest({arguments:o,method:"torrent-set"},r)}disableSequentialDownload(e,t){this._setSequentialDownload(e,!1,t)}enableSequentialDownload(e,t){this._setSequentialDownload(e,!0,t)}moveTorrentsToTop(e,t,r){this.sendTorrentActionRequests(Z._QueueMoveTop,e,t,r)}moveTorrentsToBottom(e,t,r){this.sendTorrentActionRequests(Z._QueueMoveBottom,e,t,r)}moveTorrentsUp(e,t,r){this.sendTorrentActionRequests(Z._QueueMoveUp,e,t,r)}moveTorrentsDown(e,t,r){this.sendTorrentActionRequests(Z._QueueMoveDown,e,t,r)}};ae._SessionHeader="X-Transmission-Session-Id";function We(s,e){let t=document.createElement("fieldset");t.classList.add("section",s);let r=document.createElement("legend");return r.classList.add("title"),r.textContent=e,t.append(r),t}function rt(s,e,t,r){let o=document.createElement("button");return o.textContent=e,o.addEventListener("click",r),s.append(o),o.dataset.action=t,o}var de=class extends EventTarget{constructor(e,t,r,o){super(),this.action_listener=this._onActionChange.bind(this),this.action_manager=o,this.action_manager.addEventListener("change",this.action_listener),this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=t,this.prefs.addEventListener("change",this.prefs_listener),this.closed=!1,this.remote=r,this.name="overflow-menu",this.session_listener=this._onSessionChange.bind(this),this.session_manager=e,this.session_manager.addEventListener("session-change",this.session_listener);let{session_properties:n}=e;Object.assign(this,this._create(n)),this.outside=new R(this.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this),this.show()}show(){document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.session_listener),this.action_manager.removeEventListener("change",this.action_listener),this.prefs.removeEventListener("change",this.prefs_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}_onSessionChange(e){let{alt_speed_check:t}=this.elements,{session_properties:r}=e;t.checked=r[Z._TurtleState]}_onPrefsChange(e){switch(e.key){case u.SortDirection:case u.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value;break;default:break}}_onActionChange(e){let t=this.actions[e.action];t&&this._updateElement(t)}_updateElement(e){if(e.dataset.action){let{action:t}=e.dataset,r=this.action_manager.keyshortcuts(t);r&&e.setAttribute("aria-keyshortcuts",r),W(e,this.action_manager.isEnabled(t))}}_onClick(e){let{action:t,pref:r}=e.target.dataset;if(t){this.action_manager.click(t);return}if(r){this.prefs[r]=e.target.value;return}console.log("unhandled"),console.log(e),console.trace()}_create(e){let t={},r={},o=this._onClick.bind(this),n=document.createElement("div");n.classList.add("overflow-menu","popup");let l=We("display","Display");n.append(l);let a=document.createElement("div");a.id="display-options",l.append(a);let i=document.createElement("div");i.classList.add("table-row"),a.append(i);let c=document.createElement("label");c.id="display-sort-mode-label",c.textContent="Sort by",i.append(c);let g=document.createElement("select");g.id="display-sort-mode-select",g.dataset.pref=u.SortMode,i.append(g);let m=[[u.SortByActivity,"Activity"],[u.SortByAge,"Age"],[u.SortByName,"Name"],[u.SortByProgress,"Progress"],[u.SortByQueue,"Queue order"],[u.SortByRatio,"Ratio"],[u.SortBySize,"Size"],[u.SortByState,"State"]];for(let[X,G]of m){let Y=document.createElement("option");Y.value=X,Y.textContent=G,g.append(Y)}c.setAttribute("for",g.id),g.value=this.prefs.sort_mode,g.addEventListener("change",X=>{this.prefs.sort_mode=X.target.value}),i=document.createElement("div"),i.classList.add("table-row"),a.append(i);let d=document.createElement("input");d.id="display-sort-reverse-check",d.dataset.pref=u.SortDirection,d.type="checkbox",i.append(d),c=document.createElement("label"),c.id="display-sort-reverse-label",c.setAttribute("for",d.id),c.textContent="Reverse sort",i.append(c),d.checked=this.prefs.sort_direction!==u.SortAscending,d.addEventListener("input",X=>{this.prefs.sort_direction=X.target.checked?u.SortDescending:u.SortAscending}),i=document.createElement("div"),i.classList.add("table-row"),a.append(i);let b="toggle-compact-rows";d=document.createElement("input"),d.id="display-compact-check",d.dataset.action=b,d.type="checkbox",i.append(d),c=document.createElement("label"),c.id="display-compact-label",c.for=d.id,c.setAttribute("for",d.id),c.textContent=this.action_manager.text(b),d.checked=this.prefs.display_mode===u.DisplayCompact,i.append(c),d.addEventListener("input",X=>{let{checked:G}=X.target;this.prefs.display_mode=G?u.DisplayCompact:u.DisplayFull}),i=document.createElement("div"),i.classList.add("table-row","display-fullscreen-row"),a.append(i),d=document.createElement("input"),d.id="display-fullscreen-check",d.type="checkbox";let p=()=>document.fullscreenElement!==null;d.checked=p(),d.addEventListener("input",()=>{p()?document.exitFullscreen():document.body.requestFullscreen()}),document.addEventListener("fullscreenchange",()=>{d.checked=p()}),i.append(d),c=document.createElement("label"),c.id="display-fullscreen-label",c.for=d.id,c.setAttribute("for",d.id),c.textContent="Fullscreen",i.append(c);let h=this.action_manager.text("open-appearance-settings");i=rt(l,h,"open-appearance-settings",o),a.append(i),l=We("speed","Speed Limit"),n.append(l),a=document.createElement("div"),a.id="speed-options",l.append(a),i=document.createElement("div"),i.classList.add("speed-up"),a.append(i),c=document.createElement("label"),c.id="speed-up-label",c.textContent="Upload:",i.append(c);let C="Unlimited";g=document.createElement("select"),g.id="speed-up-select",i.append(g);let y=["50","100","250","500","1000","2500","5000","10000",C];for(let X of[...new Set(y).add(`${e[Z._UpSpeedLimit]}`).values()].sort((G,Y)=>G-Y)){let G=document.createElement("option");G.value=X,G.textContent=X===C?C:B.speed(X),g.append(G)}c.setAttribute("for",g.id),g.value=e[Z._UpSpeedLimited]?`${e[Z._UpSpeedLimit]}`:C,g.addEventListener("change",X=>{let{value:G}=X.target;console.log(X),G===C?this.remote.savePrefs({[Z._UpSpeedLimited]:!1}):this.remote.savePrefs({[Z._UpSpeedLimited]:!0,[Z._UpSpeedLimit]:Number.parseInt(G,10)})}),i=document.createElement("div"),i.classList.add("speed-down"),a.append(i),c=document.createElement("label"),c.id="speed-down-label",c.textContent="Download:",i.append(c),g=document.createElement("select"),g.id="speed-down-select",i.append(g);for(let X of[...new Set(y).add(`${e[Z._DownSpeedLimit]}`).values()].sort((G,Y)=>G-Y)){let G=document.createElement("option");G.value=X,G.textContent=X===C?C:B.speed(X),g.append(G)}c.setAttribute("for",g.id),g.value=e[Z._DownSpeedLimited]?`${e[Z._DownSpeedLimit]}`:C,g.addEventListener("change",X=>{let{value:G}=X.target;console.log(X),G===C?this.remote.savePrefs({[Z._DownSpeedLimited]:!1}):this.remote.savePrefs({[Z._DownSpeedLimited]:!0,[Z._DownSpeedLimit]:Number.parseInt(G,10)})}),i=document.createElement("div"),i.classList.add("alt-speed"),a.append(i),d=document.createElement("input"),d.id="alt-speed-check",d.type="checkbox",d.checked=e[Z._TurtleState],d.addEventListener("change",X=>{this.remote.savePrefs({[Z._TurtleState]:X.target.checked})}),i.append(d),r.alt_speed_check=d,c=document.createElement("label"),c.id="alt-speed-icon",c.setAttribute("for",d.id),i.append(c),c=document.createElement("label"),c.id="alt-speed-label",c.setAttribute("for",d.id),c.textContent="Use Temp limits",i.append(c),c=document.createElement("label"),c.id="alt-speed-values-label",c.setAttribute("for",d.id);let x=B.speed(e[Z._TurtleUpSpeedLimit]),f=B.speed(e[Z._TurtleDownSpeedLimit]);c.textContent=`(${x} up, ${f} down)`,i.append(c),l=We("actions","Actions"),n.append(l),i=document.createElement("div"),i.classList.add("table-row"),l.append(i);for(let X of["show-preferences-dialog","show-shortcuts-dialog","pause-all-torrents","start-all-torrents"]){let G=this.action_manager.text(X);t[X]=rt(l,G,X,o)}l=We("help","Help"),n.append(l),a=document.createElement("div"),l.append(a);for(let X of["show-statistics-dialog","show-about-dialog"]){let G=this.action_manager.text(X);t[X]=rt(a,G,X,o)}let H=document.createElement("a");return H.href="https://transmissionbt.com/donate.html",H.target="_blank",H.textContent="Donate",a.append(H),this._updateElement=this._updateElement.bind(this),{actions:t,elements:r,root:n}}};var we=class s extends EventTarget{static _initTimeDropDown(e){for(let t=0;t<24*4;++t){let r=t/4,o=t%4*15,n=t*15,l=`${r}:${o||"00"}`;e.options[t]=new Option(l,n)}}static _initDayDropDown(e){let t=[["Everyday","127"],["Weekdays","62"],["Weekends","65"],["Sunday","1"],["Monday","2"],["Tuesday","4"],["Wednesday","8"],["Thursday","16"],["Friday","32"],["Saturday","64"]];for(let r=0;t[r];++r){let[o,n]=t[r];e.options[r]=new Option(o,n)}}_checkPort(){for(let[e,t]of Object.entries(this.elements.network.port_status_label))delete t.dataset.open,I(t,"Checking..."),this.remote.checkPort(e,r=>this._onPortChecked(e,r),this)}_onPortChecked(e,t){if(this.closed)return;let r=this.elements.network.port_status_label[e],o=t.arguments["port-is-open"]||!1;r.dataset.open=o,"port-is-open"in t.arguments?I(r,o?"Open":"Closed"):I(r,"Error")}_setBlocklistButtonEnabled(e){let t=this.elements.peers.blocklist_update_button;W(t,e),t.value=e?"Update":"Updating..."}static _getValue(e){if(e.tagName==="TEXTAREA")return e.value;switch(e.type){case"checkbox":case"radio":return e.checked;case"number":case"select-one":case"text":case"url":{let t=e.value;return Number.parseInt(t,10).toString()===t?Number.parseInt(t,10):Number.parseFloat(t).toString()===t?Number.parseFloat(t):t}default:return null}}_onMaybePortChanged(e){(e==="peer-port"||e==="port-forwarding-enabled")&&this._checkPort()}_onControlChanged(e){let{key:t}=e.target.dataset;this.remote.savePrefs({[t]:s._getValue(e.target)}),this._onMaybePortChanged(t)}_onDialogClosed(){this.dispatchEvent(new Event("closed"))}_update(){this._setBlocklistButtonEnabled(!0);for(let[e,t]of Object.entries(this.session_manager.session_properties))for(let r of this.elements.root.querySelectorAll(`[data-key="${e}"]`)){if(e==="blocklist-size"){let o=B.number(t);r.innerHTML=`Blocklist has ${o} rules`,I(this.elements.peers.blocklist_update_button,"Update")}else switch(r.type){case"checkbox":case"radio":r.checked=t;break;case"text":case"textarea":case"url":case"email":case"number":case"search":r!==document.activeElement&&(r.value!=t&&this._onMaybePortChanged(e),r.value=t);break;case"select-one":r.value=t;break;default:console.log(r.type);break}r.dispatchEvent(new Event("change-from-remote"))}}shouldAddedTorrentsStart(){return this.data.elements.root.find("#start-added-torrents")[0].checked}static _createCheckAndLabel(e,t){let r=document.createElement("div");r.id=e;let o=document.createElement("input");o.id=F(),o.type="checkbox",r.append(o);let n=document.createElement("label");return n.textContent=t,n.setAttribute("for",o.id),r.append(n),{check:o,label:n,root:r}}static _enableIfChecked(e,t){let r=()=>{e.tagName==="INPUT"?W(e,t.checked):e.classList.toggle("disabled",!t.checked)};t.addEventListener("change-from-remote",r),r()}static _getProtocolHandlerRegistered(){return localStorage.getItem("protocol-handler-registered")==="true"}static _updateProtocolHandlerButton(e){e.removeAttribute("disabled"),e.removeAttribute("title"),s._getProtocolHandlerRegistered()?(e.textContent="Remove Browser Handler","unregisterProtocolHandler"in navigator||e.setAttribute("title","Your browser does not support removing protocol handlers. This button only allows you to re-register a handler.")):(e.textContent="Add Browser Handler",e.removeAttribute("title"),"registerProtocolHandler"in navigator||(e.setAttribute("disabled",!0),e.setAttribute("title","Your browser does not support protocol handlers")))}static _toggleProtocolHandler(e){let t=new URL(window.location.href);t.search="addtorrent=%s",this._getProtocolHandlerRegistered()?(navigator.unregisterProtocolHandler?.("magnet",t.toString()),localStorage.removeItem("protocol-handler-registered"),s._updateProtocolHandlerButton(e)):(navigator.registerProtocolHandler("magnet",t.toString(),"Transmission Web"),localStorage.setItem("protocol-handler-registered","true"),s._updateProtocolHandlerButton(e))}static _createTorrentsPage(){let e=document.createElement("div");e.classList.add("prefs-torrents-page");let t=document.createElement("div");t.textContent="Downloading",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Download to:",e.append(t);let r=document.createElement("input");r.type="text",r.id=F(),r.dataset.key="download-dir",t.setAttribute("for",r.id),e.append(r);let o=r,n=s._createCheckAndLabel("incomplete-dir-div","Use temporary folder:");n.check.title="Separate folder to temporarily store downloads until they are complete.",n.check.dataset.key="incomplete-dir-enabled",n.label.title=n.check.title,e.append(n.root);let l=n.check;r=document.createElement("input"),r.type="text",r.dataset.key="incomplete-dir",e.append(r),s._enableIfChecked(r,n.check);let a=r;n=s._createCheckAndLabel("autostart-div","Start when added"),n.check.dataset.key="start-added-torrents",e.append(n.root);let i=n.check;n=s._createCheckAndLabel("suffix-div",`Append "part" to incomplete files' names`),n.check.dataset.key="rename-partial-files",e.append(n.root);let c=n.check;n=s._createCheckAndLabel("download-queue-div","Download queue size:"),n.check.dataset.key="download-queue-enabled",e.append(n.root);let g=n.check;r=document.createElement("input"),r.type="number",r.dataset.key="download-queue-size",e.append(r),s._enableIfChecked(r,n.check);let m=r;t=document.createElement("div"),t.textContent="Seeding",t.classList.add("section-label"),e.append(t),n=s._createCheckAndLabel("stop-ratio-div","Stop seeding at ratio:"),n.check.dataset.key="seedRatioLimited",e.append(n.root);let d=n.check;r=document.createElement("input"),r.type="number",r.min="0.1",r.step="any",r.dataset.key="seedRatioLimit",e.append(r),s._enableIfChecked(r,n.check);let b=r;n=s._createCheckAndLabel("stop-idle-div","Stop seeding if idle for N mins:"),n.check.dataset.key="idle-seeding-limit-enabled",e.append(n.root);let p=n.check;r=document.createElement("input"),r.type="number",r.min="0.1",r.step="any",r.dataset.key="idle-seeding-limit",e.append(r),s._enableIfChecked(r,n.check);let h=r;t=document.createElement("div"),t.textContent="Magnet Protocol Handler",t.classList.add("section-label"),e.append(t);let C=document.createElement("button");return C.classList.add("register-handler-button"),s._updateProtocolHandlerButton(C),e.append(C),{autostart_check:i,download_dir:o,download_queue_check:g,download_queue_input:m,incomplete_dir_check:l,incomplete_dir_input:a,register_handler_button:C,root:e,stop_idle_check:p,stop_idle_input:h,stop_ratio_check:d,stop_ratio_input:b,suffix_check:c}}static _createSpeedPage(){let e=document.createElement("div");e.classList.add("prefs-speed-page");let t=document.createElement("div");t.textContent="Speed Limits",t.classList.add("section-label"),e.append(t);let r=s._createCheckAndLabel("upload-speed-div","Upload (kB/s):");r.check.dataset.key="speed-limit-up-enabled",e.append(r.root);let o=r.check,n=document.createElement("input");n.type="number",n.dataset.key="speed-limit-up",e.append(n),s._enableIfChecked(n,r.check);let l=n;r=s._createCheckAndLabel("download-speed-div","Download (kB/s):"),r.check.dataset.key="speed-limit-down-enabled",e.append(r.root);let a=r.check;n=document.createElement("input"),n.type="number",n.dataset.key="speed-limit-down",e.append(n),s._enableIfChecked(n,r.check);let i=n;t=document.createElement("div"),t.textContent="Alternative Speed Limits",t.classList.add("section-label","alt-speed-section-label"),e.append(t),t=document.createElement("div"),t.textContent="Override normal speed limits manually or at scheduled times",t.classList.add("alt-speed-label"),e.append(t),t=document.createElement("label"),t.textContent="Upload (kB/s):",e.append(t),n=document.createElement("input"),n.type="number",n.dataset.key="alt-speed-up",n.id=F(),t.setAttribute("for",n.id),e.append(n);let c=n;t=document.createElement("label"),t.textContent="Download (kB/s):",e.append(t),n=document.createElement("input"),n.type="number",n.dataset.key="alt-speed-down",n.id=F(),t.setAttribute("for",n.id),e.append(n);let g=n;r=s._createCheckAndLabel("alt-times-div","Scheduled times"),r.check.dataset.key="alt-speed-time-enabled",e.append(r.root);let m=r.check;t=document.createElement("label"),t.textContent="From:",s._enableIfChecked(t,r.check),e.append(t);let d=document.createElement("select");d.id=F(),d.dataset.key="alt-speed-time-begin",s._initTimeDropDown(d),t.setAttribute("for",d.id),e.append(d),s._enableIfChecked(d,r.check);let b=d;t=document.createElement("label"),t.textContent="To:",s._enableIfChecked(t,r.check),e.append(t),d=document.createElement("select"),d.id=F(),d.dataset.key="alt-speed-time-end",s._initTimeDropDown(d),t.setAttribute("for",d.id),e.append(d),s._enableIfChecked(d,r.check);let p=d;return t=document.createElement("label"),t.textContent="On days:",s._enableIfChecked(t,r.check),e.append(t),d=document.createElement("select"),d.id=F(),d.dataset.key="alt-speed-time-day",s._initDayDropDown(d),t.setAttribute("for",d.id),e.append(d),s._enableIfChecked(d,r.check),{alt_days_select:d,alt_download_speed_input:g,alt_from_select:b,alt_times_check:m,alt_to_select:p,alt_upload_speed_input:c,download_speed_check:a,download_speed_input:i,root:e,upload_speed_check:o,upload_speed_input:l}}static _createPeersPage(){let e=document.createElement("div");e.classList.add("prefs-peers-page");let t=document.createElement("div");t.textContent="Connections",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Max peers per torrent:",e.append(t);let r=document.createElement("input");r.type="number",r.dataset.key="peer-limit-per-torrent",r.id=F(),t.setAttribute("for",r.id),e.append(r);let o=r;t=document.createElement("label"),t.textContent="Max peers overall:",e.append(t),r=document.createElement("input"),r.type="number",r.dataset.key="peer-limit-global",r.id=F(),t.setAttribute("for",r.id),e.append(r);let n=r;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Encryption mode:",e.append(t);let l=document.createElement("select");l.id=F(),l.dataset.key="encryption",l.options[0]=new Option("Prefer encryption","preferred"),l.options[1]=new Option("Allow encryption","tolerated"),l.options[2]=new Option("Require encryption","required"),e.append(l);let a=l,i=s._createCheckAndLabel("use-pex-div","Use PEX to find more peers");i.check.title="PEX is a tool for exchanging peer lists with the peers you're connected to.",i.check.dataset.key="pex-enabled",i.label.title=i.check.title,e.append(i.root);let c=i.check;i=s._createCheckAndLabel("use-dht-div","Use DHT to find more peers"),i.check.title="DHT is a tool for finding peers without a tracker.",i.check.dataset.key="dht-enabled",i.label.title=i.check.title,e.append(i.root);let g=i.check;i=s._createCheckAndLabel("use-lpd-div","Use LPD to find more peers"),i.check.title="LPD is a tool for finding peers on your local network.",i.check.dataset.key="lpd-enabled",i.label.title=i.check.title,e.append(i.root);let m=i.check;t=document.createElement("div"),t.textContent="Blocklist",t.classList.add("section-label"),e.append(t),i=s._createCheckAndLabel("blocklist-enabled-div","Enable blocklist:"),i.check.dataset.key="blocklist-enabled",e.append(i.root);let d=i.check;r=document.createElement("input"),r.type="url",r.value="http://www.example.com/blocklist",r.dataset.key="blocklist-url",e.append(r),s._enableIfChecked(r,i.check);let b=r;t=document.createElement("label"),t.textContent="Blocklist has {n} rules",t.dataset.key="blocklist-size",t.classList.add("blocklist-size-label"),s._enableIfChecked(t,i.check),e.append(t);let p=document.createElement("button");return p.classList.add("blocklist-update-button"),p.textContent="Update",e.append(p),s._enableIfChecked(p,i.check),{blocklist_enabled_check:d,blocklist_update_button:p,blocklist_url_input:b,dht_check:g,encryption_select:a,lpd_check:m,max_peers_overall_input:n,max_peers_per_torrent_input:o,pex_check:c,root:e}}static _createNetworkPage(){let e=document.createElement("div");e.classList.add("prefs-network-page");let t=document.createElement("div");t.textContent="Listening Port",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Peer listening port:",e.append(t);let r=document.createElement("input");r.type="number",r.dataset.key="peer-port",r.id=F(),t.setAttribute("for",r.id),e.append(r);let o=r,n=document.createElement("div");n.classList.add("port-status"),t=document.createElement("label"),t.textContent="IPv4 port is",n.append(t);let l=document.createElement("label");l.textContent="?",l.classList.add("port-status-label"),n.append(l),n.append(document.createElement("br")),t=document.createElement("label"),t.textContent="IPv6 port is",n.append(t);let a=document.createElement("label");a.textContent="?",a.classList.add("port-status-label"),n.append(a),e.append(n);let i=s._createCheckAndLabel("randomize-port","Randomize port on launch");i.check.dataset.key="peer-port-random-on-start",e.append(i.root);let c=i.check;i=s._createCheckAndLabel("port-forwarding","Use port forwarding from my router"),i.check.dataset.key="port-forwarding-enabled",e.append(i.root);let g=i.check;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),i=s._createCheckAndLabel("utp-enabled","Enable uTP for peer communication"),i.check.dataset.key="utp-enabled",e.append(i.root);let m=i.check;t=document.createElement("div"),t.textContent="Default Public Trackers",t.classList.add("section-label"),e.append(t);let d=["Trackers to use on all public torrents.","To add a backup URL, add it on the next line after a primary URL.","To add a new primary URL, add it after a blank line."];for(let h of d)t=document.createElement("label"),t.classList.add("default-trackers-label"),t.textContent=h,t.setAttribute("for","default-trackers"),e.append(t);let b=document.createElement("textarea");return b.dataset.key="default-trackers",b.id="default-trackers",e.append(b),{default_trackers_textarea:b,port_forwarding_check:g,port_input:o,port_status_label:{ipv4:l,ipv6:a},random_port_check:c,root:e,utp_check:m}}static _create(){let e={network:s._createNetworkPage(),peers:s._createPeersPage(),speed:s._createSpeedPage(),torrents:s._createTorrentsPage()};return{...Xe("prefs-dialog",[["prefs-tab-torrent",e.torrents.root,"Torrents"],["prefs-tab-speed",e.speed.root,"Speed"],["prefs-tab-peers",e.peers.root,"Peers"],["prefs-tab-network",e.network.root,"Network"]]),...e}}constructor(e,t){super(),this.closed=!1,this.session_manager=e,this.remote=t,this.update_from_session=()=>this._update(),this.elements=s._create(),this.elements.peers.blocklist_update_button.addEventListener("click",n=>{I(n.target,"Updating blocklist..."),this.remote.updateBlocklist(),this._setBlocklistButtonEnabled(!1)}),this.elements.torrents.register_handler_button.addEventListener("click",n=>{s._toggleProtocolHandler(n.currentTarget)}),this.elements.dismiss.addEventListener("click",()=>this.close()),this.outside=new R(this.elements.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this);let r=this._onControlChanged.bind(this),o=n=>{for(let l of Object.values(n))if(l.tagName==="INPUT")switch(l.type){case"checkbox":case"radio":l.addEventListener("click",a=>{a.preventDefault(),r(a)});break;case"number":case"text":case"url":l.addEventListener("change",r);break;default:console.trace(`unhandled input: ${l.type}`);break}else(l.tagName==="TEXTAREA"||l.tagName==="SELECT")&&l.addEventListener("change",r)};o(this.elements.network),o(this.elements.peers),o(this.elements.speed),o(this.elements.torrents),this.session_manager.addEventListener("session-change",this.update_from_session),this.update_from_session(),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.update_from_session),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}};var Le=class s extends EventTarget{constructor(e){super(),this.options=e,this.options.trash=!1,this.elements=s._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_onConfirm(){let{remote:e,torrents:t,trash:r}=this.options;t.length>0&&e.removeTorrents(t,r),this.close()}static _create(e){let{torrents:t}=e,r=J("remove-dialog"),{confirm:o,heading:n,message:l,workarea:a}=r;n.textContent=t.length===1?`Remove ${t[0].getName()}?`:`Remove ${t.length} transfers?`;let i=document.createElement("input");i.id="delete-local-data-check",i.type="checkbox",i.checked=!1,l.append(i);let c=document.createElement("label");c.id="delete-local-data-label",c.setAttribute("for",i.id),c.textContent="Delete downloaded data",l.append(c);let g=document.createElement("div"),m=d=>{d&&t.length===1?g.textContent="All data downloaded for this torrent will be deleted. Are you sure you want to remove it?":d?g.textContent="All data downloaded for these torrents will be deleted. Are you sure you want to remove them?":t.length===1?g.textContent="Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?":g.textContent="Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?",o.textContent=d?"Delete":"Remove"};return m(i.checked),i.addEventListener("click",()=>{e.trash=i.checked,m(i.checked)}),a.append(g),r}};var Qe=class s extends EventTarget{constructor(e,t,r){super(),this.controller=e,this.remote=t,this.action_input_value=r,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length!==1){console.trace();return}this.torrents=e,this.elements=s._create(this.action_input_value===null?"Rename":"Confirm"),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=this.action_input_value===null?e[0].getName():this.action_input_value,document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.action_input_value===null?this.close():this.controller.action_manager.click("show-inspector")}_onConfirm(){let[e]=this.torrents,t=e.getName(),r=this.elements.entry.value;this.remote.renameTorrent([e.getId()],t,r,o=>{o.result==="success"&&e.refresh(o.arguments)}),this._onDismiss()}static _create(e){let t=J("rename-dialog");t.root.setAttribute("aria-label","Rename Torrent"),t.heading.textContent="Enter new name:",t.confirm.textContent=e;let r=document.createElement("label");r.setAttribute("for","torrent-rename-name"),r.textContent="Enter new name:",t.workarea.append(r);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-rename-name",t.entry=o,t.workarea.append(o),t}};var Oe=class s extends EventTarget{constructor(e,t,r){super(),this.controller=e,this.remote=t,this.action_input_value=r,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length===0){console.error("At least one selected torrent expected.");return}let[t]=e;this.torrents=e,this.elements=s._create(this.action_input_value===null?"Save":"Confirm"),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=this.action_input_value===null?t.getLabels().join(", "):this.action_input_value,document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements,delete this.torrents}_onDismiss(){this.action_input_value===null?this.close():this.controller.action_manager.click("show-inspector")}_onConfirm(){let{torrents:e}=this,{remote:t}=this,r=e.map(i=>i.getId()),{elements:o}=this,{entry:n}=o,{value:l}=n,a=l.split(/ *, */).filter(i=>i.length>0);t.setLabels(r,a,i=>{if(i.result==="success")for(let c of e)c.refresh({labels:a})}),this._onDismiss()}static _create(e){let t=J("labels-dialog");t.root.setAttribute("aria-label","Edit Labels"),t.heading.textContent="Edit Labels:",t.confirm.textContent=e;let r=document.createElement("label");r.setAttribute("for","torrent-labels"),r.textContent="Labels:",t.workarea.append(r);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-labels",t.entry=o,t.workarea.append(o),t}};var Ue=class s extends EventTarget{constructor(e){super(),this.elements=s._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){let t=J("shortcuts-dialog");t.root.setAttribute("aria-label","Keyboard Shortcuts");let r=document.createElement("table"),o=document.createElement("thead");r.append(o);let n=document.createElement("tr");o.append(n);let l=document.createElement("th");l.textContent="Key",n.append(l),l=document.createElement("th"),l.textContent="Action",n.append(l);let a=document.createElement("tbody");r.append(a);let i={};for(let[c,g]of e.allShortcuts().entries()){let m=c.split("+"),d=[m.pop(),...m].join("+");i[d]={name:g,shortcut:c}}for(let[,c]of Object.entries(i).sort()){let{name:g,shortcut:m}=c;n=document.createElement("tr"),a.append(n);let d=document.createElement("td");d.textContent=m.replaceAll("+"," + "),n.append(d),d=document.createElement("td"),d.textContent=e.text(g),n.append(d)}return t.heading.textContent="Transmission",t.dismiss.textContent="Close",t.heading.textContent="Keyboard shortcuts",t.message.append(r),t.confirm.remove(),delete t.confirm,t}};var ke=class s extends EventTarget{constructor(e){super(),this.remote=e;let t=()=>this.remote.loadDaemonStats(o=>this._update(o.arguments)),r=5e3;this.interval=setInterval(t,r),t(),this.elements=s._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_update(e){console.log(e);let t=B,r=e["current-stats"],o=ne.ratio(r.uploadedBytes,r.downloadedBytes);I(this.elements.session.up,t.size(r.uploadedBytes)),I(this.elements.session.down,t.size(r.downloadedBytes)),this.elements.session.ratio.innerHTML=t.ratioString(o),I(this.elements.session.time,t.timeInterval(r.secondsActive)),r=e["cumulative-stats"],o=ne.ratio(r.uploadedBytes,r.downloadedBytes),I(this.elements.total.up,t.size(r.uploadedBytes)),I(this.elements.total.down,t.size(r.downloadedBytes)),I(this.elements.total.ratio,t.ratioString(o)),I(this.elements.total.time,t.timeInterval(r.secondsActive))}static _create(){let e=J("statistics-dialog"),{confirm:t,dismiss:r,heading:o,root:n,workarea:l}=e;t.remove(),r.textContent="Close",delete e.confirm;let a="Statistics";n.setAttribute("aria-label",a),o.textContent=a;let i=["Uploaded:","Downloaded:","Ratio:","Running time:"],c=$e("Current session",i),[g,m,d,b]=c.children,p=e.session={};p.up=g,p.down=m,p.ratio=d,p.time=b,l.append(c.root),c=$e("Total",i);let[h,C,y,x]=c.children,f=e.total={};return f.up=h,f.down=C,f.ratio=y,f.time=x,l.append(c.root),e}};var N={createIcon:s=>{let e=document.createElement("div");return e.className="icon",e.dataset.iconMimeType=s.getPrimaryMimeType().split("/",1).pop(),e.dataset.iconMultifile=s.getFileCount()>1?"true":"false",e},createRow:s=>{let e=document.createElement("li");e.className="torrent";let t=[["select","select"],["name","torrent-name"],["labels","torrent-labels"],["progress_details","torrent-progress-details"],["barrel","barrel"],["peer_details","torrent-peer-details"]];for(let[n,l]of t){let a=document.createElement("div");a.className=l,e.append(a),e[n]=a}let r=document.createElement("input");r.type="checkbox",r.checked=!0,e.select.append(r,N.createIcon(s));let o=document.createElement("div");return o.className="torrent-progress-bar",e.barrel.append(o),e.progressbar=o,e},formatETA:s=>{let e=s.getETA();return e<0||e>=999*60*60?"":`ETA: ${B.timeInterval(e,1)}`},formatLabels:(s,e)=>{let t=s.getLabels();for(;e.firstChild;)e.lastChild.remove();for(let r of t){let o=document.createElement("span");o.classList.add("torrent-label"),o.textContent=r,e.append(o)}},getProgressInfo:(s,e)=>{let t=e.getStatus(),r=["barrel"],o=100,n=null;if(t===A._StatusStopped&&r.push("paused"),e.needsMetaData())r.push("magnet"),o=e.getMetadataPercentComplete()*100;else if(t===A._StatusCheck)r.push("verify"),o=e.getRecheckProgress()*100;else if(e.getLeftUntilDone()>0)r.push("leech"),o=e.getPercentDone()*100;else{r.push("seed");let l=e.seedRatioLimit(s);n=l>0?e.getUploadRatio()*100/l:100}return e.isQueued()&&r.push("queued"),{classList:r,percent:o,ratio:n}},renderProgressbar:(s,e,t,r)=>{let o=N.getProgressInfo(s,e),n=Math.min(o.ratio||o.percent,100),l=`${B.percentString(n,2)}%`;t.style.setProperty("--progress",l),r.className=o.classList.join(" "),r.style.setProperty("--progress",l),r.dataset.progress=o.ratio?"100%":l},symbol:{down:"\u25BC",up:"\u25B2"}},Ve=class s{static renderPeerDetails(e,t){let r=B,o=e.getError()!==A._ErrNone;t.classList.toggle("error",o);let n=e.getErrorMessage();if(n)I(t,n);else if(e.isDownloading()){if(t.childNodes.length!==4){for(;t.firstChild;)t.lastChild.remove();t.append("",w.speedDown(),"",w.speedUp())}let l=e.getPeersConnected(),a=e.getWebseedsSendingToUs(),i=["Downloading from"];l&&(i.push(e.getPeersSendingToUs(),"of",r.countString("peer","peers",l)),a&&i.push("and")),a&&i.push(r.countString("web seed","web seeds",a)),i.push("-",r.speedBps(e.getDownloadSpeed())),I(t.childNodes[0],i.join(" ")),I(t.childNodes[2],` ${r.speedBps(e.getUploadSpeed())}`)}else if(e.isSeeding()){if(t.childNodes.length!==2){for(;t.firstChild;)t.lastChild.remove();t.append("",w.speedUp())}let l=["Seeding to",e.getPeersGettingFromUs(),"of",r.countString("peer","peers",e.getPeersConnected()),"-",r.speedBps(e.getUploadSpeed())].join(" ");I(t.childNodes[0],l)}else if(e.isChecking()){let l=["Verifying local data (",r.percentString(100*e.getRecheckProgress(),1),"% tested)"].join("");I(t,l)}else I(t,e.getStateString())}static renderProgressDetails(e,t,r){let o=B;if(t.needsMetaData()){let c="retrieving";t.isStopped()&&(c="needs");let g=100*t.getMetadataPercentComplete(),m=["Magnetized transfer - ",c," metadata (",o.percentString(g,1),"%)"].join("");I(r,m);return}let n=t.getSizeWhenDone(),l=t.getTotalSize(),a=t.isDone()||t.isSeeding(),i=[];if(a?(l===n?i.push(o.size(l)):i.push(o.size(n)," of ",o.size(t.getTotalSize())," (",t.getPercentDoneStr(),"%)"),i.push(", uploaded ",o.size(t.getUploadedEver())," (Ratio: ",o.ratioString(t.getUploadRatio()),")")):i.push(o.size(n-t.getLeftUntilDone())," of ",o.size(n)," (",t.getPercentDoneStr(),"%)"),!t.isStopped()&&(!a||t.seedRatioLimit(e)>0)){i.push(" - ");let c=t.getETA();c<0||c>=999*60*60?i.push("remaining time unknown"):i.push(o.timeInterval(t.getETA(),1)," remaining")}I(r,i.join(""))}render(e,t,r){r.classList.toggle("paused",t.isStopped());let{barrel:o,labels:n,name:l,progressbar:a,peer_details:i,progress_details:c}=r;I(l,t.getName()),N.formatLabels(t,n),s.renderProgressDetails(e,t,c),N.renderProgressbar(e,t,a,o),s.renderPeerDetails(t,i)}},Re=class s{static renderPeerDetails(e,t){let r=B,o=e.getError()!==A._ErrNone;t.classList.toggle("error",o);let n=e.getErrorMessage();if(n)I(t,n);else if(e.isDownloading()){let l=e.getDownloadSpeed()>0,a=e.getUploadSpeed()>0;if(!a&&!l)I(t,"Idle");else{let i=[N.formatETA(e)];for(l&&i.push(" ",r.speedBps(e.getDownloadSpeed()),w.speedDown()),a&&i.push(" ",r.speedBps(e.getUploadSpeed()),w.speedUp());t.firstChild;)t.lastChild.remove();t.append(...i)}}else if(e.isSeeding()){if(t.childNodes.length!==2){for(;t.firstChild;)t.lastChild.remove();t.append("",w.speedUp())}let l=["Ratio:",r.ratioString(e.getUploadRatio()),"-",r.speedBps(e.getUploadSpeed())].join(" ");I(t.childNodes[0],l)}else I(t,e.getStateString())}render(e,t,r){r.classList.toggle("paused",t.isStopped());let{barrel:o,labels:n,name:l,peer_details:a,progressbar:i}=r;I(l,t.getName()),N.formatLabels(t,n),s.renderPeerDetails(t,a),N.renderProgressbar(e,t,i,o)}},Ne=class{constructor(e,t){this._torrent=t,this._element=N.createRow(t);let r=()=>this.updateRow(e);this._torrent.addEventListener("dataChanged",r),r()}getElement(){return this._element}updateRow(e){let t=this.getTorrent();t&&e.torrentRenderer.render(e,t,this.getElement())}isSelected(){return this.getElement().classList.contains("selected")}getTorrent(){return this._torrent}getTorrentId(){return this.getTorrent().getId()}};var Ye=class s extends EventTarget{constructor(e,t,r){super(),this.action_manager=e,this.action_input_value=null,this.notifications=t,this.prefs=r,this.remote=new ae(this),this.speed={down:document.querySelector("#speed-down"),up:document.querySelector("#speed-up")};for(let[i,c]of[["#toolbar-open","open"],["#toolbar-delete","delete"],["#toolbar-start","start"],["#toolbar-pause","pause"]])document.querySelector(i).prepend(w[c](),document.createElement("BR"));document.querySelector("#toolbar-inspector").prepend(document.createElement("BR")),document.querySelector("#toolbar-overflow").append(w.overflow()),document.querySelector(".speed-container").append(w.speedDown()),document.querySelector(".speed-container + .speed-container").append(w.speedUp()),this.addEventListener("torrent-selection-changed",i=>this.action_manager.update(i)),this.filterText="",this.searchOperators=[[u.FilterOps.name,"search"],[u.FilterOps.label,"labels"],[u.FilterOps.status,"states",[u.FilterActive,u.FilterDownloading,u.FilterSeeding,u.FilterPaused,u.FilterFinished,u.FilterPrivate,u.FilterPublic,u.FilterError]],[u.FilterOps.tracker,"trackers"],[]],this._filter={},this._torrents={},this._rows=[],this.demo=!1,this.rapidfire=!1,this.oldTrackers=[],this.dirtyTorrents=new Set,this.changeStatus=!1,this.refilterSoon=z(()=>this._refilter(!1)),this.refilterAllSoon=z(()=>this._refilter(!0)),this.popup=Array.from({length:s.max_popups}).fill(null),this.pointer_device=Object.seal({is_touch_device:"ontouchstart"in window,long_press_callback:null,x:0,y:0}),this.busytyping=!1;for(let i of document.querySelectorAll("button[data-action]")){let{action:c}=i.dataset;W(i,this.action_manager.isEnabled(c)),i.addEventListener("click",()=>{this.action_manager.click(c)})}document.querySelector("#filter-tracker").addEventListener("change",i=>{this.setFilterTracker(i.target.value)}),this.action_manager.addEventListener("change",i=>{for(let c of document.querySelectorAll(`[data-action="${i.action}"]`))W(c,i.enabled)}),this.action_manager.addEventListener("click",i=>{switch(i.action){case"deselect-all":this._deselectAll();break;case"disable-sequential-downloading":this._disableSequentialDownload(this.getSelectedTorrents());break;case"enable-sequential-downloading":this._enableSequentialDownload(this.getSelectedTorrents());break;case"move-bottom":this._moveBottom();break;case"move-down":this._moveDown();break;case"move-top":this._moveTop();break;case"move-up":this._moveUp();break;case"open-appearance-settings":this.popup[s.default_popup_level]instanceof ie?this.popup[s.default_popup_level].close():this.setCurrentPopup(new ie(this.prefs,this.action_manager));break;case"open-torrent":this.setCurrentPopup(new $(this,this.remote));break;case"pause-all-torrents":this._stopTorrents(this._getAllTorrents());break;case"pause-selected-torrents":this._stopTorrents(this.getSelectedTorrents());break;case"reannounce-selected-torrents":this._reannounceTorrents(this.getSelectedTorrents());break;case"remove-selected-torrents":this._removeSelectedTorrents();break;case"resume-selected-torrents":this._startSelectedTorrents(!1);break;case"resume-selected-torrents-now":this._startSelectedTorrents(!0);break;case"select-all":this._selectAll();break;case"show-about-dialog":this.setCurrentPopup(new Ze(this.version_info));break;case"show-context-menu":this.popup[s.default_popup_level]instanceof ce?this.popup[s.default_popup_level].close():this._getSelectedRows().length>0&&l();break;case"show-inspector":this.popup[0]instanceof le?this.popup[0].close():this.setCurrentPopup(new le(this),0);break;case"show-move-dialog":this.setCurrentPopup(new Je(this,this.remote,this.action_input_value));break;case"show-overflow-menu":this.popup[s.default_popup_level]instanceof de?this.popup[s.default_popup_level].close():this.setCurrentPopup(new de(this,this.prefs,this.remote,this.action_manager));break;case"show-preferences-dialog":this.setCurrentPopup(new we(this,this.remote),1);break;case"show-shortcuts-dialog":this.setCurrentPopup(new Ue(this.action_manager));break;case"show-statistics-dialog":this.setCurrentPopup(new ke(this.remote));break;case"show-rename-dialog":this.setCurrentPopup(new Qe(this,this.remote,this.action_input_value));break;case"show-labels-dialog":this.setCurrentPopup(new Oe(this,this.remote,this.action_input_value));break;case"start-all-torrents":this._startTorrents(this._getAllTorrents());break;case"toggle-compact-rows":this.prefs.display_mode=this.prefs.display_mode===u.DisplayCompact?u.DisplayFull:u.DisplayCompact;break;case"verify-selected-torrents":this._verifyTorrents(this.getSelectedTorrents());break;default:console.warn(`unhandled action: ${i.action}`)}this.action_input_value=null});let o=document.querySelector("#filter-mode");q(o,null,[["All",u.FilterAll]]),q(o,"status",[["Active",u.FilterActive],["Downloading",u.FilterDownloading],["Seeding",u.FilterSeeding],["Paused",u.FilterPaused],["Finished",u.FilterFinished],["Error",u.FilterError]]),q(o,"list",[["Private torrents",u.FilterPrivate],["Public torrents",u.FilterPublic]]),o.value=this.prefs.filter_mode,o.addEventListener("change",i=>{this.prefs.filter_mode=i.target.value,this.refilterAllSoon()}),o=document.querySelector("#filter-tracker"),q(o,null,[["All",u.FilterAll]]);let n=document.querySelector("#torrent-search");o=document.querySelector("#reset"),o.addEventListener("click",()=>{n.value="",this._setFilterText(n.value),this.refilterAllSoon()}),n.value.trim()&&(this.filterText=n.value,o.style.display="block",this.refilterAllSoon()),o=document.querySelector("#turtle"),o.addEventListener("click",i=>{this.remote.savePrefs({[Z._TurtleState]:!i.target.classList.contains("alt-speed-enabled")})}),document.addEventListener("keydown",this._keyDown.bind(this)),document.addEventListener("keyup",this._keyUp.bind(this)),o=document.querySelector("#torrent-container"),o.addEventListener("click",i=>{this.popup[s.default_popup_level]&&this.setCurrentPopup(null),i.target===i.currentTarget&&this._deselectAll()}),o.addEventListener("dblclick",i=>{!i.target.classList.contains("select")&&(!this.popup[0]||this.popup[0].name!=="inspector")&&this.action_manager.click("show-inspector")}),o.addEventListener("dragenter",s._dragenter),o.addEventListener("dragover",s._dragenter),o.addEventListener("drop",this._drop.bind(this)),this._setupSearchBox(),this.elements={torrent_list:document.querySelector("#torrent-list")};let l=()=>{let i=new ce(this.action_manager);this.setCurrentPopup(i);let g=document.querySelector("#torrent-container").getBoundingClientRect(),m=Math.min(this.pointer_device.x,g.right+window.scrollX-i.root.clientWidth),d=Math.min(this.pointer_device.y,g.bottom+window.scrollX-i.root.clientHeight);i.root.style.left=`${Math.max(m,0)}px`,i.root.style.top=`${Math.max(d,0)}px`},a=i=>{if(this.pointer_device.is_touch_device&&i.touches.length>1)return;let c=i.target;for(;c&&!c.classList.contains("torrent");)c=c.parentNode;let g=this._rows.find(m=>m.getElement()===c);g&&!g.isSelected()&&this._setSelectedRow(g),l(),i.preventDefault()};if(this.pointer_device.is_touch_device){let i=this.pointer_device;this.elements.torrent_list.addEventListener("touchstart",c=>{i.x=c.touches[0].pageX,i.y=c.touches[0].pageY,i.long_press_callback?(clearTimeout(i.long_press_callback),i.long_press_callback=null):i.long_press_callback=setTimeout(a.bind(this),500,c)}),this.elements.torrent_list.addEventListener("touchend",()=>{clearTimeout(i.long_press_callback),i.long_press_callback=null,setTimeout(()=>{let c=this.popup[s.default_popup_level];c&&(c.root.style.pointerEvents="auto")},1)}),this.elements.torrent_list.addEventListener("touchmove",c=>{i.x=c.touches[0].pageX,i.y=c.touches[0].pageY,clearTimeout(i.long_press_callback),i.long_press_callback=null}),this.elements.torrent_list.addEventListener("contextmenu",c=>{c.preventDefault()})}else this.elements.torrent_list.addEventListener("mousemove",i=>{this.pointer_device.x=i.pageX,this.pointer_device.y=i.pageY}),this.elements.torrent_list.addEventListener("contextmenu",i=>{a(i);let c=this.popup[s.default_popup_level];c&&(c.root.style.pointerEvents="auto")});this.loadDaemonPrefs(),this._initializeTorrents(),this.refreshTorrents(),this.togglePeriodicSessionRefresh(!0),this.prefs.addEventListener("change",({key:i,value:c})=>this._onPrefChanged(i,c));for(let[i,c]of this.prefs.entries())this._onPrefChanged(i,c)}_openTorrentFromUrl(){setTimeout(()=>{let e=new URLSearchParams(window.location.search).get("addtorrent");if(e){this.setCurrentPopup(new $(this,this.remote,e));let t=new URL(window.location);t.search="",window.history.pushState("","",t.toString())}},0)}loadDaemonPrefs(){this.remote.loadDaemonPrefs(e=>{this.session_properties=e.arguments,this._openTorrentFromUrl()})}get session_properties(){return this._session_properties}set session_properties(e){if(Be(this._session_properties,e))return;this._session_properties=Object.seal(e);let t=new Event("session-change");t.session_properties=e,this.dispatchEvent(t),this._updateGuiFromSession(e)}_setupSearchBox(){let e=document.querySelector("#torrent-search"),t="blur";e.classList.add(t),e.addEventListener("blur",()=>e.classList.add(t)),e.addEventListener("focus",()=>e.classList.remove(t)),e.addEventListener("input",()=>{e.value.trim()!==this.filterText&&this._setFilterText(e.value)})}_onPrefChanged(e,t){switch(e){case u.DisplayMode:{this.elements.torrent_list.classList.remove("compact"),t==="compact"?(this.elements.torrent_list.classList.add(t),this.torrentRenderer=new Re):this.torrentRenderer=new Ve;for(let r of this._rows){let{progress_details:o}=r._element;for(;o.firstChild;)o.lastChild.remove();r._torrent.dispatchEvent(new Event("dataChanged"))}break}case u.ContrastMode:{document.body.classList.remove("contrast-more"),document.body.classList.remove("contrast-less"),document.body.classList.add(`contrast-${t}`);break}case u.HighlightColor:{if(document.body.classList.remove("highlight"),document.body.classList.remove("highlight-apply"),document.body.classList.remove("highlight-legacy"),!t)document.body.classList.add("highlight-legacy");else if(t==="Highlight")document.body.classList.add("highlight");else if(t!=="AccentColor"){document.body.classList.add("highlight-apply");let r=a=>{let[i,c,g]=[parseInt(a.substring(1,3),16),parseInt(a.substring(3,5),16),parseInt(a.substring(5,7),16)],m=Math.floor(i/64)*4*4+Math.floor(c/64)*4+Math.floor(g/64),d="#000";return[m,["#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff",d,"#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff","#fff",d,"#fff","#fff","#fff","#fff","#fff","#fff","#fff",d,"#fff","#fff",d,d,"#fff",d,d,d,"#fff","#fff","#fff",d,"#fff","#fff",d,d,"#fff",d,d,d,d,d,d,d][m]]},[o,n]=r(t);console.log(o,n);let l=document.createElement("style");l.innerHTML=` :root { .highlight-apply { --color-bg-selected: ${t}; --color-fg-selected: ${n}; } }`,document.getElementsByTagName("head")[0].append(l)}break}case u.ProgressBarrel:{this.elements.torrent_list.classList.remove("barrel-full"),this.elements.torrent_list.classList.remove("barrel-partial"),t&&this.elements.torrent_list.classList.add(`barrel-${t}`);break}case u.ColorForStatus:{this.elements.torrent_list.classList.remove("color-for-status"),t&&this.elements.torrent_list.classList.add("color-for-status");break}case u.ContrastRemainders:{this.elements.torrent_list.classList.remove("contrast-remainders"),t&&this.elements.torrent_list.classList.add("contrast-remainders");break}case u.LimitWidth:{this.elements.torrent_list.classList.remove("limit-width"),t&&this.elements.torrent_list.classList.add("limit-width");break}case u.FilterMode:case u.SortDirection:case u.SortMode:this.refilterAllSoon();break;case u.RefreshRate:{clearTimeout(this.refreshTimeoutId);let r=this.refreshTorrents.bind(this),o=this.prefs.refresh_rate_sec*1e3,n=()=>{this.rapidfire||r(),this.refreshTimeoutId=setTimeout(()=>{this.refreshTimeoutId=null,requestAnimationFrame(()=>{this.refreshTimeoutId||n()})},o)};n();break}default:break}}static get max_popups(){return 2}static get default_popup_level(){return s.max_popups-1}_getAllTorrents(){return Object.values(this._torrents)}static _getTorrentIds(e){return e.map(t=>t.getId())}seedRatioLimit(){let e=this.session_properties;return e&&e.seedRatioLimited?e.seedRatioLimit:-1}_getSelectedRows(){return this._rows.filter(e=>e.isSelected())}getSelectedTorrents(){return this._getSelectedRows().map(e=>e.getTorrent())}_getSelectedTorrentIds(){return s._getTorrentIds(this.getSelectedTorrents())}_setSelectedRow(e){let t=e?e.getElement():null;for(let r of this.elements.torrent_list.children)r.classList.toggle("selected",r===t);this._dispatchSelectionChanged()}_selectRow(e){e.getElement().classList.add("selected"),this._dispatchSelectionChanged()}_deselectRow(e){e.getElement().classList.remove("selected"),this._dispatchSelectionChanged()}_selectAll(){for(let e of this.elements.torrent_list.children)e.classList.add("selected");this._dispatchSelectionChanged()}_deselectAll(){for(let e of this.elements.torrent_list.children)e.classList.remove("selected");this._dispatchSelectionChanged(),delete this._last_torrent_clicked}_indexOfLastTorrent(){return this._rows.findIndex(e=>e.getTorrentId()===this._last_torrent_clicked)}_selectRange(e){let t=this._indexOfLastTorrent();if(t===-1)this._selectRow(e);else{let r=this._rows.indexOf(e),o=Math.min(t,r),n=Math.max(t,r);for(let l=o;l<=n;++l)this._selectRow(this._rows[l])}this._dispatchSelectionChanged()}_dispatchSelectionChanged(){let e=[],t=[];for(let o of this._rows)(o.isSelected()?t:e).push(o.getTorrent());let r=new Event("torrent-selection-changed");r.nonselected=e,r.selected=t,this.dispatchEvent(r)}static _createKeyShortcutFromKeyboardEvent(e){let t=[];return e.ctrlKey&&t.push("Control"),e.altKey&&t.push("Alt"),e.metaKey&&t.push("Meta"),e.shitKey&&t.push("Shift"),t.push(e.key.length===1?e.key.toUpperCase():e.key),t.join("+")}_keyDown(e){let{ctrlKey:t,keyCode:r,metaKey:o,shiftKey:n,target:l}=e,a=["INPUT","TEXTAREA"].includes(l.tagName);if(!a){let m=s._createKeyShortcutFromKeyboardEvent(e),d=this.action_manager.getActionForShortcut(m);if(d){e.preventDefault(),this.action_manager.click(d);return}}if(r===27&&this.popup.some(m=>m)){this.setCurrentPopup(null,0),e.preventDefault();return}let c=document.querySelector(".popup:not(.hidden)"),g=this._rows;if(!a&&!c&&!o&&!t){let m=r===16,d=r===38,b=r===40;if((d||b)&&g.length>0){let p=this._indexOfLastTorrent(),h=this._shift_index,C=0,y=g.length-1,x=p;b&&x+1<=y?++x:d&&x-1>=C&&--x;let f=g[x];h>=0?h<=p&&p=p&&p>x?this._selectRow(f):(h>=p&&x>p||h<=p&&p>x)&&this._deselectRow(g[p]):n?this._selectRange(f):this._setSelectedRow(f),f&&(this._last_torrent_clicked=f.getTorrentId(),f.getElement().scrollIntoView(),e.preventDefault())}else m&&(this._shift_index=this._indexOfLastTorrent())}}_keyUp(e){e.keyCode===16&&delete this._shift_index}static _dragenter(e){if(e.dataTransfer&&e.dataTransfer.types){let t=new Set(["text/uri-list","text/plain"]);if(e.dataTransfer.types.some(r=>t.has(r))||e.dataTransfer.types.includes("Files"))return e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy",!1}else e.dataTransfer&&(e.dataTransfer.dropEffect="none");return!0}static _isValidURL(e){try{return!!new URL(e)}catch{return!1}}shouldAddedTorrentsStart(){return this.session_properties["start-added-torrents"]}_drop(e){let t=!this.shouldAddedTorrentsStart();if(!e.dataTransfer||!e.dataTransfer.types)return!0;let r=e.dataTransfer.types.filter(n=>["text/uri-list","text/plain"].includes(n)).pop();for(let n of e.dataTransfer.getData(r).split(` -`).map(l=>l.trim()).filter(l=>s._isValidURL(l)))this.remote.addTorrentByUrl(n,t);let{files:o}=e.dataTransfer;return o.length>0&&(this.openDialog=new $(this,this.remote,"",o)),e.preventDefault(),!1}togglePeriodicSessionRefresh(e){!e&&this.sessionInterval&&(clearInterval(this.sessionInterval),delete this.sessionInterval),e&&(this.loadDaemonPrefs(),this.sessionInterval||(this.sessionInterval=setInterval(this.loadDaemonPrefs.bind(this),8e3)))}_setFilterText(e){clearTimeout(this.busytyping),this.busytyping=setTimeout(()=>{this.busytyping=!1,this.filterText=e.trim(),this.refilterAllSoon()},e?250:0)}_onTorrentChanged(e){this.changeStatus&&(this._dispatchSelectionChanged(),this.changeStatus=!1);let t=e.currentTarget;this.dirtyTorrents.add(t.getId()),this.refilterSoon()}updateTorrents(e,t){this.remote.updateTorrents(e,t,(r,o)=>{let n=[],l=r.shift(),a={};for(let i of r){for(let[m,d]of l.entries())a[d]=i[m];let{id:c}=a,g=this._torrents[c];if(g){let m=g.needsMetaData();g.refresh(a),m&&!g.needsMetaData()&&n.push(c)}else g=this._torrents[c]=new A(a),g.addEventListener("dataChanged",this._onTorrentChanged.bind(this)),this.dirtyTorrents.add(c),(!("name"in g.fields)||!("status"in g.fields))&&n.push(c)}if(n.length>0){let i=["id",...A.Fields.Metadata,...A.Fields.Stats];this.updateTorrents(n,i),this.refilterSoon()}o&&o.length>0&&(this._deleteTorrents(o),this.refilterSoon())},!1,this.demo)}_enableSequentialDownload(e){this.remote.enableSequentialDownload(s._getTorrentIds(e))}_disableSequentialDownload(e){this.remote.disableSequentialDownload(s._getTorrentIds(e))}refreshTorrents(){let e=["id",...A.Fields.Stats];this.updateTorrents("recently-active",e)}_initializeTorrents(){let e=["id",...A.Fields.Metadata,...A.Fields.Stats];this.updateTorrents(null,e)}_onRowClicked(e){let t=e.metaKey||e.ctrlKey,{row:r}=e.currentTarget;this.setCurrentPopup(null),e.stopPropagation(),e.shiftKey?(this._selectRange(r),window.focus()):!r.isSelected()&&(e.target.classList.contains("select")||t)?this._selectRow(r):r.isSelected()?r.isSelected()&&(e.target.classList.contains("select")||t)?this._deselectRow(r):r.isSelected()&&this._setSelectedRow(r):this._setSelectedRow(r),this._last_torrent_clicked=r.getTorrentId()}_deleteTorrents(e){if(e&&e.length>0){for(let t of e)this.dirtyTorrents.add(t),delete this._torrents[t];this.refilterSoon()}}_removeSelectedTorrents(){let e=this.getSelectedTorrents();e.length>0&&this.setCurrentPopup(new Le({remote:this.remote,torrents:e}))}_startSelectedTorrents(e){this._startTorrents(this.getSelectedTorrents(),e)}_startTorrents(e,t){this.remote.startTorrents(s._getTorrentIds(e),t,this.refreshTorrents,this)}_verifyTorrents(e){this.remote.verifyTorrents(s._getTorrentIds(e),this.refreshTorrents,this)}_reannounceTorrents(e){this.remote.reannounceTorrents(s._getTorrentIds(e),this.refreshTorrents,this)}_stopTorrents(e){this.remote.stopTorrents(s._getTorrentIds(e),()=>{setTimeout(()=>{this.refreshTorrents()},500)},this)}changeFileCommand(e,t,r){this.remote.changeFileCommand(e,t,r)}_moveTop(){this.remote.moveTorrentsToTop(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveUp(){this.remote.moveTorrentsUp(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveDown(){this.remote.moveTorrentsDown(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveBottom(){this.remote.moveTorrentsToBottom(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_updateGuiFromSession(e){let[,t,r]=e.version.match(/(.*)\s\(([\da-f]+)\)/);this.version_info={checksum:r,version:t},document.querySelector("#turtle").classList.toggle("alt-speed-enabled",e[G._TurtleState])}_updateStatusbar(){let e=B,t=this._getAllTorrents(),r=t.reduce((l,a)=>l+a.getUploadSpeed(),0),o=t.reduce((l,a)=>l+a.getDownloadSpeed(),0),n=e.countString("Transfer","Transfers",this._rows.length);I(this.speed.up,e.speedBps(r)),I(this.speed.down,e.speedBps(o)),I(document.querySelector("#filter-count"),n)}static _displayName(e){let t=e;return t.length>0&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}_updateFilterSelect(){let e=this._getTrackerCounts(),t=Object.keys(e).sort();if(t.length!==this.oldTrackers.length||t.some((r,o)=>r!==this.oldTrackers[o])){this.oldTrackers=t;let r=[["All",u.FilterAll,!this.filterTracker],...t.map(n=>[s._displayName(n),n,n===this.filterTracker])],o=document.querySelector("#filter-tracker");for(;o.firstChild;)o.lastChild.remove();q(o,null,r)}}sortRows(e){let t=e.map(o=>o.getTorrent()),r=e.reduce((o,n)=>(o[n.getTorrent().getId()]=n,o),{});A.sortTorrents(t,this.prefs.sort_mode,this.prefs.sort_direction);for(let[o,n]of t.entries())e[o]=r[n.getId()]}_autoComplete(e,t){let r=t.find(o=>o.startsWith(e));return r||e}_textArray(e,t){let r=e.split(/,+/);if(t){let o=[];for(let n of r)n&&o.push(this._autoComplete(n,t));return o}else return r}_registerFilter(e){let t=e;for(let[r,o,n]of this.searchOperators){if(r){if(r=r.find(l=>e.startsWith(l)),!r)continue;if(t=e.slice(r.length),o==="states"&&t==="demo"){this.demo=!0;return}this._filter.autocomplete=n,this._filter.controller=this._filter[o]}if(o=this._filter.controller,r||o){let l=t.split(/,+/);if(n=this._filter.autocomplete,n){let a=[];for(let i of l)i&&a.push(n.find(c=>c.startsWith(i)));l=a}r?o.push(l):o.at(-1).push(...l),t&&!t.endsWith(",")&&(this._filter.autocomplete=null,this._filter.controller=null);return}}this._filter.opless.push(t)}_rebuildFilter(){let{filter_mode:e}=this.prefs;if(this._filter.search=[],this._filter.labels=[],this._filter.states=e===u.FilterAll?[]:[[e]],this._filter.trackers=this.filterTracker?[[this.filterTracker]]:[],document.querySelector("#reset").style.display=this.filterText.length>0?"block":"none",this.filterText.length===0){this.demo&&(this.demo=!1,this._deleteTorrents([9999,9998,9997,9996,9995,9994,9993]));return}if(this.filterText){this._filter.autocomplete=null,this._filter.controller=null,this._filter.opless=[];let t=this.filterText.match(/(?:\\.|[^"])+|^/g);for(let[r,o]of t.entries()){let n=o.replaceAll(/\\(.)/g,"$1");if(r%2){let l=this._filter.controller;if(l){let a=this._filter.autocomplete;l.at(-1).push(a?a.find(i=>i.startsWith(n)):n)}else this._filter.opless.push(n)}else for(let l of n.trimEnd().toLowerCase().split(/ +/))l?this._registerFilter(l):(this._filter.autocomplete=null,this._filter.controller=null)}this._filter.opless.length>0&&this._filter.search.push(this._filter.opless)}}_refilter(e){let{sort_mode:t,sort_direction:r}=this.prefs,o=this.elements.torrent_list,n=()=>[...o.children].length,l=()=>[...o.children].reduce((x,f)=>x+f.classList.contains("selected")?1:0,0),a=n(),i=l();if(this._updateFilterSelect(),this._filter.swap=this.prefs.filter_logical_swap,e){for(this._rebuildFilter();o.firstChild;)o.lastChild.remove();this._rows=[],this.dirtyTorrents=new Set(Object.keys(this._torrents))}let c=[],g=[];for(let x of this._rows)this.dirtyTorrents.has(x.getTorrentId())?g.push(x):c.push(x);for(let x of g)x.getElement().remove();let m=[];for(let x of g){let f=x.getTorrentId(),H=this._torrents[f];H&&H.test(this._filter)&&m.push(x),this.dirtyTorrents.delete(f)}g=m;for(let x of this.dirtyTorrents.values()){let f=this._torrents[x];if(f&&f.test(this._filter)){let H=new Ne(this,f),X=H.getElement();X.row=H,g.push(H),X.addEventListener("click",this._onRowClicked.bind(this))}}this.sortRows(g);let d=[],b=c.length,p=g.length,h=document.createDocumentFragment(),C=0,y=0;for(;C!==b||y!==p;){let x=null;if(C===b?x=!1:y===p?x=!0:x=A.compareTorrents(c[C].getTorrent(),g[y].getTorrent(),t,r)<0,x)d.push(c[C++]);else{let f=g[y++],H=f.getElement();C===b?h.append(H):o.insertBefore(H,c[C].getElement()),d.push(f)}}o.append(h),this._rows=d,this.dirtyTorrents.clear(),this._updateStatusbar(),(i!==l()||a!==n())&&this._dispatchSelectionChanged()}setFilterTracker(e){let t=document.querySelector("#filter-tracker");t.value=e,this.filterTracker=e===u.FilterAll?"":e,this.refilterAllSoon()}_getTrackerCounts(){let e={};for(let t of this._getAllTorrents())for(let r of t.getTrackers()){let{sitename:o}=r;e[o]=(e[o]||0)+1}return e}setCurrentPopup(e,t=s.default_popup_level){for(let r=t;r{this.popup[t]&&(this.popup[t].removeEventListener("close",r),this.popup[t]=null)};this.popup[t].addEventListener("close",r)}}};function Us(){let s=new ge,e=new u,t=new ve(e),r=new Ye(s,t,e),o=z(()=>r.elements.torrent_list.scrollTo(0,1));window.addEventListener("load",o),window.addEventListener("orientationchange",o)}document.addEventListener("DOMContentLoaded",Us);})(); +`).map(l=>l.trim()).filter(l=>s._isValidURL(l)))this.remote.addTorrentByUrl(n,t);let{files:o}=e.dataTransfer;return o.length>0&&(this.openDialog=new $(this,this.remote,"",o)),e.preventDefault(),!1}togglePeriodicSessionRefresh(e){!e&&this.sessionInterval&&(clearInterval(this.sessionInterval),delete this.sessionInterval),e&&(this.loadDaemonPrefs(),this.sessionInterval||(this.sessionInterval=setInterval(this.loadDaemonPrefs.bind(this),8e3)))}_setFilterText(e){clearTimeout(this.busytyping),this.busytyping=setTimeout(()=>{this.busytyping=!1,this.filterText=e.trim(),this.refilterAllSoon()},e?250:0)}_onTorrentChanged(e){this.changeStatus&&(this._dispatchSelectionChanged(),this.changeStatus=!1);let t=e.currentTarget;this.dirtyTorrents.add(t.getId()),this.refilterSoon()}updateTorrents(e,t){this.remote.updateTorrents(e,t,(r,o)=>{let n=[],l=r.shift(),a={};for(let i of r){for(let[m,d]of l.entries())a[d]=i[m];let{id:c}=a,g=this._torrents[c];if(g){let m=g.needsMetaData();g.refresh(a),m&&!g.needsMetaData()&&n.push(c)}else g=this._torrents[c]=new A(a),g.addEventListener("dataChanged",this._onTorrentChanged.bind(this)),this.dirtyTorrents.add(c),(!("name"in g.fields)||!("status"in g.fields))&&n.push(c)}if(n.length>0){let i=["id",...A.Fields.Metadata,...A.Fields.Stats];this.updateTorrents(n,i),this.refilterSoon()}o&&o.length>0&&(this._deleteTorrents(o),this.refilterSoon())},!1,this.demo)}_enableSequentialDownload(e){this.remote.enableSequentialDownload(s._getTorrentIds(e))}_disableSequentialDownload(e){this.remote.disableSequentialDownload(s._getTorrentIds(e))}refreshTorrents(){let e=["id",...A.Fields.Stats];this.updateTorrents("recently-active",e)}_initializeTorrents(){let e=["id",...A.Fields.Metadata,...A.Fields.Stats];this.updateTorrents(null,e)}_onRowClicked(e){let t=e.metaKey||e.ctrlKey,{row:r}=e.currentTarget;this.setCurrentPopup(null),e.stopPropagation(),e.shiftKey?(this._selectRange(r),window.focus()):!r.isSelected()&&(e.target.classList.contains("select")||t)?this._selectRow(r):r.isSelected()?r.isSelected()&&(e.target.classList.contains("select")||t)?this._deselectRow(r):r.isSelected()&&this._setSelectedRow(r):this._setSelectedRow(r),this._last_torrent_clicked=r.getTorrentId()}_deleteTorrents(e){if(e&&e.length>0){for(let t of e)this.dirtyTorrents.add(t),delete this._torrents[t];this.refilterSoon()}}_removeSelectedTorrents(){let e=this.getSelectedTorrents();e.length>0&&this.setCurrentPopup(new Le({remote:this.remote,torrents:e}))}_startSelectedTorrents(e){this._startTorrents(this.getSelectedTorrents(),e)}_startTorrents(e,t){this.remote.startTorrents(s._getTorrentIds(e),t,this.refreshTorrents,this)}_verifyTorrents(e){this.remote.verifyTorrents(s._getTorrentIds(e),this.refreshTorrents,this)}_reannounceTorrents(e){this.remote.reannounceTorrents(s._getTorrentIds(e),this.refreshTorrents,this)}_stopTorrents(e){this.remote.stopTorrents(s._getTorrentIds(e),()=>{setTimeout(()=>{this.refreshTorrents()},500)},this)}changeFileCommand(e,t,r){this.remote.changeFileCommand(e,t,r)}_moveTop(){this.remote.moveTorrentsToTop(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveUp(){this.remote.moveTorrentsUp(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveDown(){this.remote.moveTorrentsDown(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveBottom(){this.remote.moveTorrentsToBottom(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_updateGuiFromSession(e){let[,t,r]=e.version.match(/(.*)\s\(([\da-f]+)\)/);this.version_info={checksum:r,version:t},document.querySelector("#turtle").classList.toggle("alt-speed-enabled",e[Z._TurtleState])}_updateStatusbar(){let e=B,t=this._getAllTorrents(),r=t.reduce((l,a)=>l+a.getUploadSpeed(),0),o=t.reduce((l,a)=>l+a.getDownloadSpeed(),0),n=e.countString("Transfer","Transfers",this._rows.length);I(this.speed.up,e.speedBps(r)),I(this.speed.down,e.speedBps(o)),I(document.querySelector("#filter-count"),n)}static _displayName(e){let t=e;return t.length>0&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}_updateFilterSelect(){let e=this._getTrackerCounts(),t=Object.keys(e).sort();if(t.length!==this.oldTrackers.length||t.some((r,o)=>r!==this.oldTrackers[o])){this.oldTrackers=t;let r=[["All",u.FilterAll,!this.filterTracker],...t.map(n=>[s._displayName(n),n,n===this.filterTracker])],o=document.querySelector("#filter-tracker");for(;o.firstChild;)o.lastChild.remove();q(o,null,r)}}sortRows(e){let t=e.map(o=>o.getTorrent()),r=e.reduce((o,n)=>(o[n.getTorrent().getId()]=n,o),{});A.sortTorrents(t,this.prefs.sort_mode,this.prefs.sort_direction);for(let[o,n]of t.entries())e[o]=r[n.getId()]}_autoComplete(e,t){let r=t.find(o=>o.startsWith(e));return r||e}_textArray(e,t){let r=e.split(/,+/);if(t){let o=[];for(let n of r)n&&o.push(this._autoComplete(n,t));return o}else return r}_registerFilter(e){let t=e;for(let[r,o,n]of this.searchOperators){if(r){if(r=r.find(l=>e.startsWith(l)),!r)continue;if(t=e.slice(r.length),o==="states"&&t==="demo"){this.demo=!0;return}this._filter.autocomplete=n,this._filter.controller=this._filter[o]}if(o=this._filter.controller,r||o){let l=t.split(/,+/);if(n=this._filter.autocomplete,n){let a=[];for(let i of l)i&&a.push(n.find(c=>c.startsWith(i)));l=a}r?o.push(l):o.at(-1).push(...l),t&&!t.endsWith(",")&&(this._filter.autocomplete=null,this._filter.controller=null);return}}this._filter.opless.push(t)}_rebuildFilter(){let{filter_mode:e}=this.prefs;if(this._filter.search=[],this._filter.labels=[],this._filter.states=e===u.FilterAll?[]:[[e]],this._filter.trackers=this.filterTracker?[[this.filterTracker]]:[],document.querySelector("#reset").style.display=this.filterText.length>0?"block":"none",this.filterText.length===0){this.demo&&(this.demo=!1,this._deleteTorrents([9999,9998,9997,9996,9995,9994,9993]));return}if(this.filterText){this._filter.autocomplete=null,this._filter.controller=null,this._filter.opless=[];let t=this.filterText.match(/(?:\\.|[^"])+|^/g);for(let[r,o]of t.entries()){let n=o.replaceAll(/\\(.)/g,"$1");if(r%2){let l=this._filter.controller;if(l){let a=this._filter.autocomplete;l.at(-1).push(a?a.find(i=>i.startsWith(n)):n)}else this._filter.opless.push(n)}else for(let l of n.trimEnd().toLowerCase().split(/ +/))l?this._registerFilter(l):(this._filter.autocomplete=null,this._filter.controller=null)}this._filter.opless.length>0&&this._filter.search.push(this._filter.opless)}}_refilter(e){let{sort_mode:t,sort_direction:r}=this.prefs,o=this.elements.torrent_list,n=()=>[...o.children].length,l=()=>[...o.children].reduce((x,f)=>x+f.classList.contains("selected")?1:0,0),a=n(),i=l();if(this._updateFilterSelect(),this._filter.swap=this.prefs.filter_logical_swap,e){for(this._rebuildFilter();o.firstChild;)o.lastChild.remove();this._rows=[],this.dirtyTorrents=new Set(Object.keys(this._torrents))}let c=[],g=[];for(let x of this._rows)this.dirtyTorrents.has(x.getTorrentId())?g.push(x):c.push(x);for(let x of g)x.getElement().remove();let m=[];for(let x of g){let f=x.getTorrentId(),H=this._torrents[f];H&&H.test(this._filter)&&m.push(x),this.dirtyTorrents.delete(f)}g=m;for(let x of this.dirtyTorrents.values()){let f=this._torrents[x];if(f&&f.test(this._filter)){let H=new Ne(this,f),X=H.getElement();X.row=H,g.push(H),X.addEventListener("click",this._onRowClicked.bind(this))}}this.sortRows(g);let d=[],b=c.length,p=g.length,h=document.createDocumentFragment(),C=0,y=0;for(;C!==b||y!==p;){let x=null;if(C===b?x=!1:y===p?x=!0:x=A.compareTorrents(c[C].getTorrent(),g[y].getTorrent(),t,r)<0,x)d.push(c[C++]);else{let f=g[y++],H=f.getElement();C===b?h.append(H):o.insertBefore(H,c[C].getElement()),d.push(f)}}o.append(h),this._rows=d,this.dirtyTorrents.clear(),this._updateStatusbar(),(i!==l()||a!==n())&&this._dispatchSelectionChanged()}setFilterTracker(e){let t=document.querySelector("#filter-tracker");t.value=e,this.filterTracker=e===u.FilterAll?"":e,this.refilterAllSoon()}_getTrackerCounts(){let e={};for(let t of this._getAllTorrents())for(let r of t.getTrackers()){let{sitename:o}=r;e[o]=(e[o]||0)+1}return e}setCurrentPopup(e,t=s.default_popup_level){for(let r=t;r{this.popup[t]&&(this.popup[t].removeEventListener("close",r),this.popup[t]=null)};this.popup[t].addEventListener("close",r)}}};function Us(){let s=new ge,e=new u,t=new ve(e),r=new Ye(s,t,e),o=z(()=>r.elements.torrent_list.scrollTo(0,1));window.addEventListener("load",o),window.addEventListener("orientationchange",o)}document.addEventListener("DOMContentLoaded",Us);})(); //# sourceMappingURL=transmission-app.js.map