{
  "version": 3,
  "sources": ["../../javascript/appos/application.js", "../../javascript/appos/component_loader.js", "../../javascript/appos/component.js", "../../javascript/appos/namespaced_console.js", "../../javascript/appos/simple_events.js", "../../javascript/appos/debugger.js", "../../javascript/appos/util.js", "../../javascript/appos/appos.js", "../../javascript/appos/component/jquery/easings.js", "../../javascript/appos/component/turbo_bridge.js", "../../javascript/appos/component/toggle_inline_list.js", "../../javascript/appos/component/anim/threed_carousel.js", "../../javascript/appos/lib/scroll_queue.js", "../../javascript/sot_profile_viewer/find_a_thing_renderer.js", "../../javascript/appos/lib/trigram_index.js", "../../javascript/sot_profile_viewer/entitlement_mapper.js", "../../javascript/sot_profile_viewer/entitlement_search.js", "../../javascript/sot_profile_viewer/goto_anywhere.js", "../../javascript/appos/bootstrap5/modal.js", "../../javascript/sot_profile_viewer/graph_anything.js", "../../javascript/sot_profile_viewer/tracer_ui.js", "../../javascript/sot_profile_viewer/net_worth_ui.js", "../../javascript/sot_profile_viewer/emote_loadout_ui.js", "../../javascript/sot_profile_viewer/twitch_drops.js", "../../javascript/sot_profile_viewer/insider_timer.js", "../../javascript/sot_profile_viewer/key_modal.js", "../../javascript/sot_profile_viewer/fav_modal.js", "../../javascript/sot_profile_viewer/fat_help_modal.js", "../../../../../shared/node_modules/canvas-confetti/dist/confetti.module.mjs", "../../javascript/sot_profile_viewer/confetti_class.js", "../../javascript/sot_profile_viewer/inline_compare.js", "../../javascript/appos/lib/external_promise.js", "../../javascript/sot_profile_viewer/missing_entitlements.js", "../../javascript/sot_profile_viewer.js"],
  "sourcesContent": ["import * as AppOS from \"./appos\"\n\nclass Application {\n  static availableComponents = []\n\n  static boot(opts) {\n    return AppOS.boot(new this(opts))\n  }\n\n  static DEFAULT_EVENTS = [\n    \"init\",\n    \"boot\",\n    \"documentLoad\",\n    \"pageLoad\",\n  ]\n\n  static DEFAULT_OPTIONS = {\n    instance: null,\n    init: null,\n    debug: false,\n    data: {},\n    turbolinks: false,\n    turbo: false,\n    defaultBoot: app => {\n      if (window.Turbo || window.Turbolinks) {\n        document.addEventListener('DOMContentLoaded', _ => app.fire(\"documentLoad\", app), { once: true })\n        if(window.Turbo) {\n          app.debug(\"detected Turbo\")\n          document.addEventListener('turbo:load', _ => app.fire(\"pageLoad\", app), false)\n        }\n        if(window.Turbolinks) {\n          app.debug(\"detected Turbolinks\")\n          document.addEventListener('turbolinks:load', _ => app.fire(\"pageLoad\", app), false)\n        }\n      } else {\n        document.addEventListener('DOMContentLoaded', _ => {\n          app.fire(\"documentLoad\", app)\n          app.fire(\"pageLoad\", app)\n        }, false)\n      }\n    }\n  }\n\n  constructor(opts = {}) {\n    this.app = this\n    this.loadedComponents = []\n    this.opts = Object.assign({}, this.constructor.DEFAULT_OPTIONS, opts)\n\n    // namespaced console\n    AppOS.NamespacedConsole.applyOn(this, {\n      debugConfig: this.opts,\n      namespaces: [\"AppOS\", [this, \"instance\"]],\n    })\n\n    // debugger\n    this.dev = new AppOS.Debugger(this).getProxy()\n\n    // register events\n    AppOS.SimpleEvents.applyOn(this, this.constructor.DEFAULT_EVENTS, this.opts)\n\n    this.constructor.DEFAULT_EVENTS.forEach(efn => {\n      if(typeof this[efn] == \"function\") this.on(efn, this[efn])\n    })\n  }\n\n  use(imp, opts) {\n    const ins = new imp(this, opts ?? this.opts[imp.id])\n    this.debug(\"using component \", ins.name)\n    this.loadedComponents.push(ins)\n    ins.init?.()\n    return ins\n  }\n\n  get components() {\n    const res = {}\n    this.loadedComponents.forEach(cins => {\n      res[cins.name] = cins\n    })\n    return res\n  }\n\n  get componentLoader() {\n    return window.__appos_core_component_loader\n  }\n\n  // ===============\n  // = API methods =\n  // ===============\n  // init() {}\n  // boot() {}\n  // documentLoad() {}\n  // pageLoad() {}\n}\n\nexport { Application }\n", "export class ComponentLoader {\n  constructor(app) {\n    this.app = app\n    this.promises = new Map()\n    this.sourceMap = new Map()\n    this.exports = new Map()\n  }\n\n  destroy() {\n    delete this.promises\n    delete this.sourceMap\n    delete this.exports\n  }\n\n  refreshSources() {\n    this.sourceMap = new Map()\n    if(document.body?.dataset.apposComponentMap) {\n      this.sourceMap = new Map(Object.entries(JSON.parse(document.body.dataset.apposComponentMap)))\n    }\n    return this\n  }\n\n  signal(comp, exps = {}, use = []) {\n    if(!this.exports.has(comp)) this.exports.set(comp, new Map())\n    const emap = this.exports.get(comp)\n    Object.entries(exps).forEach(([name, exp]) => emap.set(name, exp))\n\n    document.body.dispatchEvent(\n      new CustomEvent(\"appos:component:loaded\", {\n        bubbles: true,\n        detail: { component: comp, exports: exps },\n      }),\n    )\n\n    use.forEach(exp => {\n      const ins = this.app?.use(exp)\n      ins.boot?.()\n      ins.documentLoad?.()\n      ins.pageLoad?.()\n    })\n  }\n\n  ensure() {\n    this.refreshSources()\n    const promises = new Map()\n    document.querySelectorAll(`[data-appos-require-component]`).forEach(el => {\n      if(!el.dataset.apposRequireComponent) return undefined\n      el.dataset.apposRequireComponent.split(\" \").forEach(comp => {\n        if(comp && !promises.has(comp)) promises.set(comp, this.load(comp))\n      })\n    })\n    return Promise.all(promises.values())\n  }\n\n  load(component) {\n    if(!this.promises.has(component)) {\n      if(this.sourceMap.has(component)) {\n        this.promises.set(component, this.loadComponentWithScriptTag(component, this.sourceMap.get(component)))\n      } else {\n        console.warn(`[AppOS] failed to load component, not in map:`, component)\n      }\n    }\n    return this.promises.get(component)\n  }\n\n  loadComponentWithScriptTag(component, src) {\n    return new Promise((resolve, reject) => {\n      const script = document.createElement(\"script\")\n      script.type = \"text/javascript\"\n      script.src = src\n      script.defer = true\n      script.setAttribute(\"data-appos-component\", component)\n      // script.setAttribute(\"data-turbo-track\", \"reload\")\n      script.onload = ev => resolve([component, this.exports.get(component), src, script, ev])\n      document.head.append(script)\n    })\n  }\n}\n", "import * as AppOS from \"./appos\"\n\nclass Component {\n  static DEFAULT_OPTIONS = {\n    debug: false,\n  }\n\n  static DEFAULT_EVENTS = [\n    \"init\",\n    \"boot\",\n    \"documentLoad\",\n    \"pageLoad\",\n  ]\n\n  constructor(app, opts = {}) {\n    this.app = app\n    this.opts = Object.assign({}, this.constructor.DEFAULT_OPTIONS, opts)\n    if(app.opts) this.opts.debug = this.app.opts.debug\n\n    // namespaced console\n    AppOS.NamespacedConsole.applyOn(this, { base: this.app, namespace: [this, \"name\"] })\n\n    // register events\n    this.constructor.DEFAULT_EVENTS.forEach(efn => {\n      if(typeof this[efn] == \"function\") this.app.on(efn, this[efn].bind(this))\n    })\n  }\n\n  get name() {\n    return this.constructor.id\n  }\n\n  get componentLoader() {\n    return window.__appos_core_component_loader\n  }\n\n  visitPage(...args) {\n    AppOS.Util.visitPage(...args)\n  }\n\n  reloadPage (...args) {\n    AppOS.Util.reloadPage(...args)\n  }\n}\n\nexport { Component }\n", "class NamespacedConsole {\n  static applyOn(target, opts = {}) {\n    const bconfig = opts.base?.__namespaced_console_opts\n    if (bconfig) {\n      opts.namespaces = bconfig.namespaces.slice(0)\n      opts.nsFallback = bconfig.nsFallback\n      opts.debug = bconfig.debug\n      opts.debugConfig = bconfig.debugConfig\n      opts.debugConfigKey = bconfig.debugConfigKey\n    }\n\n    opts.debug ??= false\n    opts.debugConfigKey ??= \"debug\"\n    opts.nsFallback ??= \"?\"\n    opts.namespaces ??= []\n    if (opts.namespace) opts.namespaces.push(opts.namespace)\n\n    opts.doDebugProc = _ => {\n      return opts.debugConfig ? opts.debugConfig[opts.debugConfigKey] : opts.debug\n    }\n\n    const nsStrProc = _ => {\n      if(!opts.namespaces) return false\n      let nsStr = \"\"\n      opts.namespaces.forEach(el => {\n        nsStr += `[${(Array.isArray(el) ? el[0][el[1]] : (typeof el == \"function\" ? el() : el)) ?? opts.nsFallback}]`\n      })\n      return nsStr\n    }\n\n    target.__namespaced_console_opts = opts\n\n    target.debug = (function (...msg) {\n      if(!opts.doDebugProc()) return\n      msg.unshift(nsStrProc())\n      if(!msg[0]) msg.shift()\n      console.debug.apply(console, msg)\n    }).bind(target)\n\n    target.info = (function (...msg) {\n      msg.unshift(nsStrProc())\n      if(!msg[0]) msg.shift()\n      console.info.apply(console, msg)\n    }).bind(target)\n\n    target.warning = (function (...msg) {\n      msg.unshift(nsStrProc())\n      if(!msg[0]) msg.shift()\n      console.warn.apply(console, msg)\n    }).bind(target)\n\n    target.error = (function (...msg) {\n      msg.unshift(nsStrProc())\n      if(!msg[0]) msg.shift()\n      console.error.apply(console, msg)\n    }).bind(target)\n  }\n}\n\nexport { NamespacedConsole }\n", "class SimpleEvents {\n  static applyOn(target, events = [], opts) {\n    if(!Array.isArray(target)) target = Array(target)\n    if(target.length == 1) target.push(\"events\")\n    if(!target[0][target[1]]) target[0][target[1]] = new SimpleEvents.Events(target[0])\n\n    const tev = target[0][target[1]]\n    target[0].on = tev.on.bind(tev)\n    target[0].off = tev.off.bind(tev)\n    target[0].fire = tev.fire.bind(tev)\n\n    events.forEach(evn => target[0][target[1]].register(evn, opts))\n  }\n}\n\nSimpleEvents.Events = class {\n  constructor(target) {\n    this.target = target\n    this.callbacks = {}\n  }\n\n  on(evn, cb) {\n    if(!this.callbacks[evn]) throw(`no such event ${evn}`)\n    this.callbacks[evn].push(cb)\n    cb.detach = _ => this.off(evn, cb)\n    return this.target\n  }\n\n  off(evn, cb) {\n    if(!this.callbacks[evn]) throw(`no such event ${evn}`)\n    const index = this.callbacks[evn].indexOf(cb)\n    if(index < 0) throw(`no such handler on ${evn}`)\n    this.callbacks[evn].splice(index, 1)\n    return this.target\n  }\n\n  fire(evn, ...args) {\n    if(!this.callbacks[evn]) throw(`no such event ${evn}`)\n    this.callbacks[evn].forEach(fn => fn.apply(this.target, args))\n    return this.target\n  }\n\n  register(evn, opts) {\n    if(!this.callbacks[evn]) this.callbacks[evn] = []\n    if(opts) {\n      const capitalized = `${evn[0].toUpperCase()}${evn.slice(1)}`\n      if(opts[`on${capitalized}`]) this.on(evn, opts[`on${capitalized}`])\n    }\n  }\n\n  // bindSub(bindOn, ...args) {\n  //   let prefix = false\n  //   let events = args[0]\n  //   if(args.length == 2) {\n  //     prefix = args[0]\n  //     events = args[1]\n  //   }\n  //   Object.keys(this.callbacks).forEach(evn => {\n  //     if (prefix) {\n  //       this.target.on(evn, bindOn[`${prefix}${evn[0].toUpperCase()}${evn.slice(1)}`].bind(bindOn))\n  //     } else {\n  //       this.target.on(evn, bindOn[evn].bind(bindOn))\n  //     }\n  //   })\n  //   return target\n  // }\n}\n\nexport { SimpleEvents }\n", "import * as AppOS from \"./appos\"\n\nclass Debugger {\n  constructor(app) {\n    this.app = app\n    this.namespaces = {}\n    AppOS.NamespacedConsole.applyOn(this, { base: this.app, namespace: \"Debugger\" })\n  }\n\n  getProxy() {\n    this.proxy = new Proxy(this, {\n      get(target, name, receiver) {\n        if(typeof target[name] == \"function\") return target[name].bind(target)\n        if(name == \"__parent\") return target\n        let rv = Reflect.get(target.namespaces, name, receiver)\n        return rv ? rv.getProxy() : rv\n      }\n    })\n\n    return this.proxy\n  }\n\n  _register(ns, attr, vklass) {\n    if(!this.namespaces[ns]) {\n      this.namespaces[ns] = new Debugger.Namespace(ns, this)\n    }\n    this.namespaces[ns]._registerValue(attr, vklass)\n  }\n\n  enable() {\n    Object.entries(this.namespaces).forEach(([name, ns]) => {\n      Object.entries(ns.values).forEach(([name, v]) => v.set(true))\n    })\n  }\n\n  disable() {\n    Object.entries(this.namespaces).forEach(([name, ns]) => {\n      Object.entries(ns.values).forEach(([name, v]) => v.set(false))\n    })\n  }\n}\n\nDebugger.Namespace = class {\n  constructor(name, deb) {\n    this.app = deb.app\n    this.name = name\n    this.deb = deb\n    this.values = {}\n  }\n\n  getProxy() {\n    return this.proxy = new Proxy(this, {\n      get(target, name, receiver) {\n        return Reflect.get(target.values, name, receiver)\n      },\n      set(target, name, val) {\n        let rv = Reflect.get(target.values, name)\n        rv ? rv.set(val) : console.error(\"invalid value name\", name, \"for NS\", target)\n      }\n    })\n  }\n\n  _registerValue(attr, vklass) {\n    const inst = new vklass(this, attr)\n    this.values[attr] = inst\n    inst.init?.()\n  }\n}\n\nDebugger.Value = class {\n  constructor(ns, name) {\n    this.app = ns.app\n    this.ns = ns\n    this.name = name\n    this.value = false\n    AppOS.SimpleEvents.applyOn(this, [\"change\"])\n    AppOS.NamespacedConsole.applyOn(this, { base: this.ns.deb, namespace: _ => [this.ns.name, this.name].join(\".\") })\n  }\n\n  set(v) {\n    if (this.value != v) {\n      this.events.fire(\"change\", this, v, this.value)\n      this.change?.(v, this.value)\n      this.value = v\n    }\n  }\n\n  true() { this.set(true) }\n  yes() { this.set(true) }\n  false() { this.set(false) }\n  no() { this.set(false) }\n}\n\nexport { Debugger }\n", "class Util {\n  static isPlainObject(v) {\n    return (\n      v !== null &&\n      typeof v === 'object' &&\n      v.constructor === Object\n    )\n  }\n\n  static visitPage(url, force_turbolinks = null) {\n    if(window.Turbo && !(force_turbolinks != null && !force_turbolinks)) {\n      Turbo.visit(url)\n    } else if (window.Turbolinks && !(force_turbolinks != null && !force_turbolinks)) {\n      Turbolinks.visit(url)\n    } else {\n      window.location.href = url\n    }\n  }\n\n  static reloadPage() {\n    AppOS.Util.visitPage(...args)\n    this.visitPage(window.location)\n  }\n\n  static upperFirst (str) {\n    return str.charAt(0).toUpperCase() + str.slice(1)\n  }\n\n  static strbool(v, defVal) {\n    if([true, \"true\", \"t\", \"1\", \"y\", \"yes\", \"on\"].includes(v)) {\n      return true\n    } else if([false, \"false\", \"f\", \"0\", \"n\", \"no\", \"off\"].includes(v)) {\n      return false\n    } else {\n      if(defVal != null) return defVal\n      throw(`Can't convert \\`${v}' to boolean, expression invalid!`)\n    }\n  }\n\n  static formatNumber(s, decimals = 0) {\n    if (decimals) {\n      return s.toFixed(decimals).replace(/\\d(?=(\\d{3})+\\.)/g, '$&,')\n    } else {\n      return s.toFixed(1).replace(/\\d(?=(\\d{3})+\\.)/g, '$&,').replace(/\\.\\d+/, \"\")\n    }\n  }\n\n  static getHashParams(urlDecode = true, source = window.location) {\n    const result = {}\n    if (!source.hash) return result\n\n    let hsh = source.hash.substr(1)\n    if(urlDecode) hsh = decodeURIComponent(hsh)\n    const parts = hsh.split(\"&\")\n    parts.forEach(kv => {\n      const kvp = kv.split(\"=\")\n      const key = kvp.shift()\n      result[key] = kvp.join(\"=\")\n    })\n    return result\n  }\n\n  static updateHashParams(toMerge = {}, opts) {\n    this.setHashParams(Object.assign({}, this.getHashParams(), toMerge), opts)\n  }\n\n  static serializeHashParams(hparams = {}, opts = {}) {\n    const hsh = []\n    for (const [k, v] of Object.entries(hparams)) {\n      if(v === undefined) continue\n      if(v === \"\" && opts.clearBlanks) continue\n      if(v === null)\n        hsh.push(`${k}`)\n      else\n        hsh.push(`${k}=${v}`)\n    }\n    return hsh.join(\"&\")\n  }\n\n  static setHashParams(hparams = {}, opts = {}) {\n    // window.location.hash = `#${this.serializeHashParams(hparams)}`\n    history.replaceState(undefined, undefined, `#${this.serializeHashParams(hparams)}`)\n  }\n\n  static observeVisibility(el, opts = {}, callback) {\n    if(!IntersectionObserver) {\n      console.warn(\"IntersectionObserver not available\")\n      return false\n    }\n\n    if (typeof opts == \"function\") {\n      callback = opts\n      opts = {}\n    }\n\n    el = $(el).get(0)\n    opts.root ??= document.documentElement\n\n    const observer = new IntersectionObserver(((entries, observer) => {\n      entries.forEach(entry => callback?.(entry.intersectionRatio > 0, observer))\n    }), opts)\n\n    observer.observe(el)\n    return observer\n  }\n\n  static debounce(func, timeout = 300) {\n    let timer\n    return (...args) => {\n      clearTimeout(timer)\n      timer = setTimeout(() => { func.apply(this, args) }, timeout)\n    }\n  }\n\n  static debounce_leading(func, timeout = 300) {\n    let timer\n    return (...args) => {\n      if (!timer) {\n        func.apply(this, args)\n      }\n      clearTimeout(timer)\n      timer = setTimeout(() => {\n        timer = undefined\n      }, timeout)\n    }\n  }\n\n  static throttle(func, timeout = 300) {\n    let timer\n\n    return (...args) => {\n      if(timer) return\n\n      timer = setTimeout(() => {\n        func.apply(this, args)\n        timer = undefined\n      }, timeout)\n    }\n  }\n\n  static throttle_leading(func, timeout = 300) {\n    let timer\n\n    return (...args) => {\n      if(timer) return\n\n      func.apply(this, args)\n      timer = setTimeout(() => {\n        timer = undefined\n      }, timeout)\n    }\n  }\n\n  static throttle_debounce(func, timeout = 300) {\n    let timer\n    let timer2\n\n    return (...args) => {\n      clearTimeout(timer2)\n      timer2 = setTimeout(() => { func.apply(this, args) }, timeout)\n\n      if(timer) return\n\n      func.apply(this, args)\n      timer = setTimeout(() => {\n        timer = undefined\n      }, timeout)\n    }\n  }\n\n  static throttle_leading_debounce(func, timeout = 300) {\n    let timer\n    let timer2\n\n    return (...args) => {\n      if(!timer2) func.apply(this, args)\n      clearTimeout(timer2)\n      timer2 = setTimeout(() => { func.apply(this, args) }, timeout)\n\n      if(timer) return\n\n      func.apply(this, args)\n      timer = setTimeout(() => {\n        timer = undefined\n      }, timeout)\n    }\n  }\n\n  static scrollParent(el, includeHidden) {\n    const position = $(el).css( \"position\" )\n    const excludeStaticParent = position === \"absolute\"\n    const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/\n    const scrollParent = $(el).parents().filter(function() {\n      const parent = $( this )\n      if (excludeStaticParent && parent.css( \"position\" ) === \"static\") {\n        return false\n      }\n      return overflowRegex.test(parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) + parent.css( \"overflow-x\" ))\n    }).eq(0)\n\n    return position === \"fixed\" || !scrollParent.length ?\n      $( $(el)[0].ownerDocument || document ) :\n      scrollParent;\n  }\n\n  static scrollIntoViewIfNeeded(target, opts = {}) {\n    target = $(target)\n    opts.centerX ??= true\n    opts.parent ??= target.parent()\n    opts.sparent ??= this.scrollParent(target)\n    opts.behavior ??= \"auto\"\n\n    const toff = target.offset()\n    const soff = opts.sparent.offset()\n    const stop = opts.sparent.scrollTop()\n\n    let x = 0, y = 0\n    let usableHeight = opts.sparent.innerHeight() - target.outerHeight()\n    x = toff.top - soff.top //+ stop\n\n    if (opts.excludeHeight && !Array.isArray(opts.excludeHeight)) {\n      opts.excludeHeight = [opts.excludeHeight]\n    }\n    if (opts.excludeHeight) {\n      opts.excludeHeight.forEach(el => {\n        const oh = $(el).outerHeight()\n        x -= oh\n        usableHeight -= oh\n      })\n    }\n\n    if(x < 0) {\n      let starget = x + stop\n      if (opts.centerX) {\n        starget -= Math.floor(usableHeight / 2) //- Math.floor(target.outerHeight() / 2)\n      }\n      opts.sparent.get(0).scrollTo({ top: starget, left: y, behavior: opts.behavior })\n    } else if (x > 0) {\n      let starget = stop\n      if(x - usableHeight > 0) {\n        starget += (x - usableHeight)\n        if (opts.centerX) {\n          starget += Math.floor(usableHeight / 2) //- Math.floor(target.outerHeight() / 2)\n        }\n        opts.sparent.get(0).scrollTo({ top: starget, left: y, behavior: opts.behavior })\n      }\n    }\n  }\n\n  static scanBeep(play = true, volume = 1) {\n    const snd = new Audio(\"data:audio/wav;base64,//uQRAAAAWMSLwUIYAAsYkXgoQwAEaYLWfkWgAI0wWs/ItAAAGDgYtAgAyN+QWaAAihwMWm4G8QQRDiMcCBcH3Cc+CDv/7xA4Tvh9Rz/y8QADBwMWgQAZG/ILNAARQ4GLTcDeIIIhxGOBAuD7hOfBB3/94gcJ3w+o5/5eIAIAAAVwWgQAVQ2ORaIQwEMAJiDg95G4nQL7mQVWI6GwRcfsZAcsKkJvxgxEjzFUgfHoSQ9Qq7KNwqHwuB13MA4a1q/DmBrHgPcmjiGoh//EwC5nGPEmS4RcfkVKOhJf+WOgoxJclFz3kgn//dBA+ya1GhurNn8zb//9NNutNuhz31f////9vt///z+IdAEAAAK4LQIAKobHItEIYCGAExBwe8jcToF9zIKrEdDYIuP2MgOWFSE34wYiR5iqQPj0JIeoVdlG4VD4XA67mAcNa1fhzA1jwHuTRxDUQ//iYBczjHiTJcIuPyKlHQkv/LHQUYkuSi57yQT//uggfZNajQ3Vmz+Zt//+mm3Wm3Q576v////+32///5/EOgAAADVghQAAAAA//uQZAUAB1WI0PZugAAAAAoQwAAAEk3nRd2qAAAAACiDgAAAAAAABCqEEQRLCgwpBGMlJkIz8jKhGvj4k6jzRnqasNKIeoh5gI7BJaC1A1AoNBjJgbyApVS4IDlZgDU5WUAxEKDNmmALHzZp0Fkz1FMTmGFl1FMEyodIavcCAUHDWrKAIA4aa2oCgILEBupZgHvAhEBcZ6joQBxS76AgccrFlczBvKLC0QI2cBoCFvfTDAo7eoOQInqDPBtvrDEZBNYN5xwNwxQRfw8ZQ5wQVLvO8OYU+mHvFLlDh05Mdg7BT6YrRPpCBznMB2r//xKJjyyOh+cImr2/4doscwD6neZjuZR4AgAABYAAAABy1xcdQtxYBYYZdifkUDgzzXaXn98Z0oi9ILU5mBjFANmRwlVJ3/6jYDAmxaiDG3/6xjQQCCKkRb/6kg/wW+kSJ5//rLobkLSiKmqP/0ikJuDaSaSf/6JiLYLEYnW/+kXg1WRVJL/9EmQ1YZIsv/6Qzwy5qk7/+tEU0nkls3/zIUMPKNX/6yZLf+kFgAfgGyLFAUwY//uQZAUABcd5UiNPVXAAAApAAAAAE0VZQKw9ISAAACgAAAAAVQIygIElVrFkBS+Jhi+EAuu+lKAkYUEIsmEAEoMeDmCETMvfSHTGkF5RWH7kz/ESHWPAq/kcCRhqBtMdokPdM7vil7RG98A2sc7zO6ZvTdM7pmOUAZTnJW+NXxqmd41dqJ6mLTXxrPpnV8avaIf5SvL7pndPvPpndJR9Kuu8fePvuiuhorgWjp7Mf/PRjxcFCPDkW31srioCExivv9lcwKEaHsf/7ow2Fl1T/9RkXgEhYElAoCLFtMArxwivDJJ+bR1HTKJdlEoTELCIqgEwVGSQ+hIm0NbK8WXcTEI0UPoa2NbG4y2K00JEWbZavJXkYaqo9CRHS55FcZTjKEk3NKoCYUnSQ0rWxrZbFKbKIhOKPZe1cJKzZSaQrIyULHDZmV5K4xySsDRKWOruanGtjLJXFEmwaIbDLX0hIPBUQPVFVkQkDoUNfSoDgQGKPekoxeGzA4DUvnn4bxzcZrtJyipKfPNy5w+9lnXwgqsiyHNeSVpemw4bWb9psYeq//uQZBoABQt4yMVxYAIAAAkQoAAAHvYpL5m6AAgAACXDAAAAD59jblTirQe9upFsmZbpMudy7Lz1X1DYsxOOSWpfPqNX2WqktK0DMvuGwlbNj44TleLPQ+Gsfb+GOWOKJoIrWb3cIMeeON6lz2umTqMXV8Mj30yWPpjoSa9ujK8SyeJP5y5mOW1D6hvLepeveEAEDo0mgCRClOEgANv3B9a6fikgUSu/DmAMATrGx7nng5p5iimPNZsfQLYB2sDLIkzRKZOHGAaUyDcpFBSLG9MCQALgAIgQs2YunOszLSAyQYPVC2YdGGeHD2dTdJk1pAHGAWDjnkcLKFymS3RQZTInzySoBwMG0QueC3gMsCEYxUqlrcxK6k1LQQcsmyYeQPdC2YfuGPASCBkcVMQQqpVJshui1tkXQJQV0OXGAZMXSOEEBRirXbVRQW7ugq7IM7rPWSZyDlM3IuNEkxzCOJ0ny2ThNkyRai1b6ev//3dzNGzNb//4uAvHT5sURcZCFcuKLhOFs8mLAAEAt4UWAAIABAAAAAB4qbHo0tIjVkUU//uQZAwABfSFz3ZqQAAAAAngwAAAE1HjMp2qAAAAACZDgAAAD5UkTE1UgZEUExqYynN1qZvqIOREEFmBcJQkwdxiFtw0qEOkGYfRDifBui9MQg4QAHAqWtAWHoCxu1Yf4VfWLPIM2mHDFsbQEVGwyqQoQcwnfHeIkNt9YnkiaS1oizycqJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=\")\n    snd.volume = volume\n    if(play) snd.play()\n    return snd\n  }\n\n  static beepStart(freq, volume, onStop) {\n    return new Promise((resolve, reject) => {\n      try {\n        const context = new AudioContext()\n        const oscillator = context.createOscillator()\n        const gainNode = context.createGain()\n\n        oscillator.type = \"sine\"\n        oscillator.frequency.value = freq\n        gainNode.gain.value = Math.max(0, Math.min(volume, 1))\n\n        oscillator.connect(gainNode)\n        gainNode.connect(context.destination)\n\n        oscillator.start()\n\n        const stopFunc = cb => {\n          oscillator.stop()\n          context.close()\n          onStop?.()\n          cb?.()\n        }\n\n        resolve({ oscillator: oscillator, stop: stopFunc, gainNode: gainNode, gain: gainNode.gain, context: context })\n      } catch(err) {\n        reject(err)\n      }\n    })\n  }\n\n  static beep(freq = 1000, duration = 100, volume = 1) {\n    return new Promise((resolve, reject) => {\n      this.beepStart(freq, volume).then(beep => {\n        if(duration == null) {\n          resolve(beep)\n        } else {\n          setTimeout(_ => { beep.stop(resolve) }, duration)\n        }\n      })\n    })\n  }\n\n  static beepSeq(seq, opts = {}) {\n    opts.volume ??= 1\n    opts.duration ??= 100\n    opts.wait ??= 0\n    opts.form ??= \"sine\"\n\n    let dur = opts.duration\n    let vol = opts.volume\n    let wait = opts.wait\n    let form = opts.form\n    let beep = null\n    let ptr = this.beepStart(0, vol)\n    ptr.then(b => {\n      beep = b\n      beep.gain.value = vol\n    })\n\n    seq.split(\" \").forEach(el => {\n      const chunks = el.split(\":\")\n\n      ptr = ptr.then(_ => {\n        if(chunks[0] == \"wait\") {\n          wait = parseInt(chunks[1])\n          return Promise.resolve()\n        } else if(chunks[0] == \"dur\") {\n          dur = parseInt(chunks[1])\n          return Promise.resolve()\n        } else if(chunks[0] == \"vol\") {\n          vol = parseFloat(chunks[1])\n          if(beep) beep.gain.value = vol\n          return Promise.resolve()\n        } else if(chunks[0] == \"form\") {\n          form = chunks[1]\n          if(beep) beep.oscillator.type = form\n          return Promise.resolve()\n        } else if(chunks[0] == \"w\") {\n          const freqWas = beep.oscillator.frequency.value\n          beep.oscillator.frequency.value = 0\n          const wptr = this.wait(parseInt(chunks[1] ?? dur))\n          wptr.then(_ => beep.oscillator.frequency.value = freqWas)\n          return wptr\n        } else {\n          let wptr = Promise.resolve()\n          let [freq, repeats] = chunks[0].split(\"*\")\n          repeats ??= 1\n          const setFreq = (_wait) => {\n            beep.oscillator.frequency.value = parseInt(freq)\n            return this.wait(_wait)\n          }\n\n          for (var i = 0; i < repeats; i++) {\n            if(wait) {\n              wptr = wptr.then(_ => {\n                const freqWas = beep.oscillator.frequency.value\n                beep.oscillator.frequency.value = 0\n                return this.wait(wait).then(_ => setFreq(parseInt(chunks[1] ?? dur)))\n              })\n            } else {\n              wptr = wptr.then(_ => setFreq(parseInt(chunks[1] ?? dur)))\n            }\n          }\n\n          return wptr\n        }\n      })\n    })\n\n    ptr = ptr.then(_ => beep.stop())\n\n    return ptr\n  }\n\n  static wait(ms) {\n    return new Promise((resolve, reject) => setTimeout(resolve, ms))\n  }\n\n  static parameterize(str) {\n    return str\n      .toLowerCase()\n      .trim()\n      .replace(/[^a-z0-9]+/g, \"-\") // Replace non-alphanumeric characters with a dash\n      .replace(/^-+|-+$/g, \"\")     // Remove leading/trailing dashes\n  }\n}\n\nexport { Util }\n", "import {Application} from \"./application\"\n// import {DomObserver} from \"./dom_observer\"\nimport {ComponentLoader} from \"./component_loader\"\nimport {Component} from \"./component\"\nimport {NamespacedConsole} from \"./namespaced_console\"\nimport {SimpleEvents} from \"./simple_events\"\nimport {Debugger} from \"./debugger\"\nimport {Util} from \"./util\"\n\nclass AppOS {\n  static boot(app) {\n    app.events.fire(\"init\", this)\n    app.opts.defaultBoot?.apply(app, [app])\n\n    AppOS.setupTemplateHooksSingleton(app)\n    // AppOS.setupDomObserverSingleton(app)\n    AppOS.setupComponentLoaderSingleton(app)\n\n    app.events.fire(\"boot\", app)\n    return app\n  }\n\n  static setupTemplateHooksSingleton(app) {\n    if(!window.__appos_core_template_hooks_registered) {\n      this.setupTemplateHooks(app)\n      window.__appos_core_template_hooks_registered = true\n    }\n  }\n\n  static setupTemplateHooks(app) {\n    app.events.on(\"boot\", _ => { AppOS.runTemplateHooks(\"app-boot\", { app: app }) })\n    app.events.on(\"documentLoad\", _ => { AppOS.runTemplateHooks(\"document-load\", { app: app }) })\n    app.events.on(\"pageLoad\", _ => { AppOS.runTemplateHooks(\"page-load\", { app: app }) })\n  }\n\n  static setupComponentLoaderSingleton(app) {\n    if(!window.__appos_core_component_loader) {\n      this.setupComponentLoader(app)\n    }\n  }\n\n  static setupComponentLoader(app) {\n    window.__appos_core_component_loader?.destroy()\n    window.__appos_core_component_loader = new ComponentLoader(app)\n    window.__appos_component_loaded = window.__appos_core_component_loader.signal.bind(window.__appos_core_component_loader)\n    app?.events.on(\"pageLoad\", _ => { window.__appos_core_component_loader.ensure() })\n  }\n\n  // static setupDomObserverSingleton(app) {\n  //   if(!window.__appos_core_dom_observer) {\n  //     this.setupDomObserver(app)\n  //   }\n  // }\n\n  // static setupDomObserver(app) {\n  //   window.__appos_core_dom_observer?.destroy()\n  //   window.__appos_core_dom_observer = new DomObserver(document.documentElement)\n  //   app.events.on(\"documentLoad\", _ => window.__appos_core_dom_observer?.start())\n  //   return window.__appos_core_dom_observer\n  // }\n\n  static runTemplateHooks(type, env = {}) {\n    document.querySelectorAll(`template[appos-${type}]`).forEach(tpl => {\n      const f = new Function('env', tpl.content.firstElementChild.textContent)\n      if(typeof env?.app?.debug == \"function\") env.app.debug(\"running tpl-hook\", type, tpl)\n      f(env)\n      tpl.remove()\n    })\n  }\n\n  static mergeClasses(...bases) {\n    class Bases {\n      constructor() {\n        bases.forEach(base => Object.assign(this, new base()));\n      }\n    }\n    bases.forEach(base => {\n      Object.getOwnPropertyNames(base.prototype)\n      .filter(prop => prop != 'constructor')\n      .forEach(prop => Bases.prototype[prop] = base.prototype[prop])\n    })\n    return Bases;\n  }\n\n  static mergeClassesAsModule(...bases) {\n    class Bases {}\n    bases.forEach(base => {\n      Object.getOwnPropertyNames(base.prototype)\n      .filter(prop => prop != 'constructor')\n      .forEach(prop => Bases.prototype[prop] = base.prototype[prop])\n    })\n    return Bases;\n  }\n\n  static html(str) {\n    const template = document.createElement(\"template\")\n    template.innerHTML = str\n    return template.content.firstElementChild\n  }\n\n  static htmlAll(str) {\n    const template = document.createElement(\"template\")\n    template.innerHTML = str\n    return template.content.childNodes\n  }\n}\n\nconst bootFunction = AppOS.boot\nconst mergeClassesFunction = AppOS.mergeClasses\nconst mergeClassesAsModuleFunction = AppOS.mergeClassesAsModule\n\nexport {\n  bootFunction as boot,\n  mergeClassesFunction as mergeClasses,\n  mergeClassesAsModuleFunction as mergeClassesAsModule,\n  AppOS,\n  Debugger,\n  Application,\n  Component,\n  SimpleEvents,\n  NamespacedConsole,\n  Util,\n}\n", "// t: current time, b: begInnIng value, c: change In value, d: duration\njQuery.easing['jswing'] = jQuery.easing['swing'];\n\njQuery.extend( jQuery.easing,\n{\n  def: 'easeOutQuad',\n  swing: function (x, t, b, c, d) {\n    //alert(jQuery.easing.default);\n    return jQuery.easing[jQuery.easing.def](x, t, b, c, d);\n  },\n  easeInQuad: function (x, t, b, c, d) {\n    return c*(t/=d)*t + b;\n  },\n  easeOutQuad: function (x, t, b, c, d) {\n    return -c *(t/=d)*(t-2) + b;\n  },\n  easeInOutQuad: function (x, t, b, c, d) {\n    if ((t/=d/2) < 1) return c/2*t*t + b;\n    return -c/2 * ((--t)*(t-2) - 1) + b;\n  },\n  easeInCubic: function (x, t, b, c, d) {\n    return c*(t/=d)*t*t + b;\n  },\n  easeOutCubic: function (x, t, b, c, d) {\n    return c*((t=t/d-1)*t*t + 1) + b;\n  },\n  easeInOutCubic: function (x, t, b, c, d) {\n    if ((t/=d/2) < 1) return c/2*t*t*t + b;\n    return c/2*((t-=2)*t*t + 2) + b;\n  },\n  easeInQuart: function (x, t, b, c, d) {\n    return c*(t/=d)*t*t*t + b;\n  },\n  easeOutQuart: function (x, t, b, c, d) {\n    return -c * ((t=t/d-1)*t*t*t - 1) + b;\n  },\n  easeInOutQuart: function (x, t, b, c, d) {\n    if ((t/=d/2) < 1) return c/2*t*t*t*t + b;\n    return -c/2 * ((t-=2)*t*t*t - 2) + b;\n  },\n  easeInQuint: function (x, t, b, c, d) {\n    return c*(t/=d)*t*t*t*t + b;\n  },\n  easeOutQuint: function (x, t, b, c, d) {\n    return c*((t=t/d-1)*t*t*t*t + 1) + b;\n  },\n  easeInOutQuint: function (x, t, b, c, d) {\n    if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;\n    return c/2*((t-=2)*t*t*t*t + 2) + b;\n  },\n  easeInSine: function (x, t, b, c, d) {\n    return -c * Math.cos(t/d * (Math.PI/2)) + c + b;\n  },\n  easeOutSine: function (x, t, b, c, d) {\n    return c * Math.sin(t/d * (Math.PI/2)) + b;\n  },\n  easeInOutSine: function (x, t, b, c, d) {\n    return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;\n  },\n  easeInExpo: function (x, t, b, c, d) {\n    return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n  },\n  easeOutExpo: function (x, t, b, c, d) {\n    return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n  },\n  slowEaseOutExpo: function (x, t, b, c, d) {\n    var expo = -Math.pow(2, -10 * t/d) + 1;\n    var slowExpo = 1 - Math.pow(1 - expo, 3);\n    return b + c * slowExpo;\n  },\n  easeInOutExpo: function (x, t, b, c, d) {\n    if (t==0) return b;\n    if (t==d) return b+c;\n    if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;\n    return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;\n  },\n  easeInCirc: function (x, t, b, c, d) {\n    return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;\n  },\n  easeOutCirc: function (x, t, b, c, d) {\n    return c * Math.sqrt(1 - (t=t/d-1)*t) + b;\n  },\n  easeInOutCirc: function (x, t, b, c, d) {\n    if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;\n    return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;\n  },\n  easeInElastic: function (x, t, b, c, d) {\n    var s=1.70158;var p=0;var a=c;\n    if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\n    if (a < Math.abs(c)) { a=c; var s=p/4; }\n    else var s = p/(2*Math.PI) * Math.asin (c/a);\n    return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\n  },\n  easeOutElastic: function (x, t, b, c, d) {\n    var s=1.70158;var p=0;var a=c;\n    if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;\n    if (a < Math.abs(c)) { a=c; var s=p/4; }\n    else var s = p/(2*Math.PI) * Math.asin (c/a);\n    return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;\n  },\n  easeInOutElastic: function (x, t, b, c, d) {\n    var s=1.70158;var p=0;var a=c;\n    if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);\n    if (a < Math.abs(c)) { a=c; var s=p/4; }\n    else var s = p/(2*Math.PI) * Math.asin (c/a);\n    if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\n    return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;\n  },\n  easeInBack: function (x, t, b, c, d, s) {\n    if (s == undefined) s = 1.70158;\n    return c*(t/=d)*t*((s+1)*t - s) + b;\n  },\n  easeOutBack: function (x, t, b, c, d, s) {\n    if (s == undefined) s = 1.70158;\n    return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\n  },\n  easeInOutBack: function (x, t, b, c, d, s) {\n    if (s == undefined) s = 1.70158;\n    if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;\n    return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\n  },\n  easeInBounce: function (x, t, b, c, d) {\n    return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;\n  },\n  easeOutBounce: function (x, t, b, c, d) {\n    if ((t/=d) < (1/2.75)) {\n      return c*(7.5625*t*t) + b;\n    } else if (t < (2/2.75)) {\n      return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;\n    } else if (t < (2.5/2.75)) {\n      return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;\n    } else {\n      return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;\n    }\n  },\n  easeInOutBounce: function (x, t, b, c, d) {\n    if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;\n    return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;\n  }\n});\n", "import * as AppOS from \"../appos\"\n\nconst Component = class extends AppOS.Component {\n  static id = \"TurboBridge\"\n\n  init() {\n    this.active = false\n    this.detached = []\n  }\n\n  documentLoad() {\n    if (window.Turbo) {\n      this.active = true\n      document.addEventListener('turbo:before-render', this.turboBeforeRender)\n    } else if (window.Turbolinks) {\n      this.active = true\n\n    }\n  }\n\n  pageLoad() {\n  }\n\n  turboBeforeRender(ev) {\n    ev.target.querySelectorAll(\"[data-ao-permanent]\").forEach(el => {\n      const pe = el.parentElement\n      const nb = ev.detail.newBody\n      const node = el.parentElement.removeChild(el)\n      if (pe.tagName == \"BODY\") {\n        nb.appendChild(node)\n      } else if (pe.id) {\n        nb.querySelector(`#${pe.id}`).appendChild(node)\n      } else {\n        nb.appendChild(node)\n        this.warn(\"cannot determine parent, will reinsert to body\", el)\n      }\n    })\n  }\n}\n\nAppOS.Application?.availableComponents?.push?.(Component)\nexport { Component }\n", "import * as AppOS from \"../appos\"\n\nconst Component = class extends AppOS.Component {\n  static id = \"ToggleInlineList\"\n\n  documentLoad() {\n    $(document).on(\"click\", `[data-toggle=\"inline-list\"]`, ev => {\n      $(ev.currentTarget).closest(\"ul.toggle-inline-list\").toggleClass(\"expanded\")\n      setTimeout(_ => {\n        $(ev.currentTarget).blur()\n      }, 150)\n      return false\n    })\n  }\n}\n\nAppOS.Application?.availableComponents?.push?.(Component)\nexport { Component }\n", "import * as AppOS from \"../../appos\"\n\nclass ElementRevolver {\n  constructor(elements, opts = {}) {\n    this.elements = elements\n    this.positions = []\n    this.interval = null\n    this.opts = Object.assign({}, {\n      // radius and center coordinates\n      radius: 80,\n      centerX: 150,\n      centerY: 150,\n\n      // time in milliseconds for one revolution (i.e. speed)\n      interval: 60000,\n\n      // direction = 1 for clockwise, -1 for counterclockwise\n      direction: 1,\n\n      // startPosition can be a degree angle\n      // (0 = right, 90 = top, 180 = left, 270 = bottom)\n      startPositionDeg: 270,\n\n      updateInterval: 100,\n      scaleFactor: 0.4,\n      opacityFactor: 0.5,\n\n      // how many degrees to put items apart, null = auto-detect based on items\n      degStep: null,\n\n      // 0 = left\n      // 1 = bottom-left\n      // 2 = bottom\n      // 3 = bottom-right\n      // 4 = right\n      // 5 = top-right\n      // 6 = top\n      // 7 = top-left\n      // let nrad = this.normalizeRad(pos.angle + (Math.PI / 2)) // top-oriented\n      //let nrad = this.normalizeRad(pos.angle + Math.PI + (Math.PI / 2)) // bottom-oriented\n      orientation: 6,\n    }, opts)\n  }\n\n  setOpts(opts = {}) {\n    Object.assign(this.opts, opts)\n    return this\n  }\n\n  start() {\n    this.startTime = Date.now()\n    if(this.interval !== null) this.stop()\n\n    if(this.opts.degStep === null) {\n      this.opts.degStep = 360 / this.elements.length\n      this.opts.radStep = this.opts.degStep / 180 * Math.PI\n    }\n\n    this.elements.each((i, el) => {\n      el.style.position = this.opts.cssPosition || 'absolute'\n      this.positions[i] = { deg: this.opts.startPositionDeg + (i * this.opts.degStep) }\n      this.positions[i].rad = this.positions[i].deg / 180 * Math.PI\n      // if(!this.opts.startPositionRad) this.opts.startPositionRad = this.opts.startPositionDeg / 180 * Math.PI\n    })\n\n    // update twice (first run sets scales)\n    this.update()\n    this.update()\n    setTimeout(_ => {\n      this.elements.parent().addClass(\"transition\")\n      this.interval = setInterval(_ => this.update(), this.opts.updateInterval)\n    }, 1)\n\n    return this\n  }\n\n  stop() {\n    if(this.interval === null) return\n    clearInterval(this.interval)\n    this.observer?.disconnect()\n    this.interval = null\n    return this\n  }\n\n  ease(scale) {\n    return this.easeInOutSine(scale)\n  }\n\n  easeInQuint(x) { return x * x * x * x * x }\n  easeInOutSine(x) { return -(Math.cos(Math.PI * x) - 1) / 2 }\n\n  update() {\n    let firstAngle = null\n    this.elements.each((i, el) => {\n      var pos = this.getPosition(i, el, Date.now() - this.startTime, firstAngle)\n      if(firstAngle === null) firstAngle = pos.angle\n\n      // let nrad = this.normalizeRad(pos.angle + (Math.PI / 2)) // top-oriented\n      let nrad = this.normalizeRad(pos.angle + (Math.PI / 4 * this.opts.orientation))\n      let scale = nrad / (Math.PI)\n      if (scale > 1) scale = 2 - scale\n      let scaleFactor = this.opts.scaleFactor * this.ease(1 - scale)\n      let opacityFactor = this.opts.opacityFactor * (1 - scale)\n\n      el.style.setProperty(\"--scale\", 1 - scaleFactor)\n      el.style.setProperty(\"opacity\", 1 - opacityFactor)\n      el.style.zIndex = Math.round(scale * 100)\n      const rect = el.getBoundingClientRect()\n      el.style.left = (pos.x - el.offsetWidth / 2) + (el.width / 2) + 'px';\n      el.style.top = (pos.y - el.offsetHeight / 2) + (el.height / 2) + 'px';\n\n      firstAngle += this.opts.radStep\n    })\n    // this.stop()\n  }\n\n  getPosition(i, el, ellapsedTime, angle = null) {\n    if(angle === null) { angle = this.getAngle(i, ellapsedTime) }\n\n    let radius = this.opts.radius\n    const rect = el.getBoundingClientRect()\n    radius -= (rect.width / 2) * 1.2\n\n    return {\n      angle: angle,\n      x: this.opts.centerX + radius * Math.cos(angle),\n      y: this.opts.centerY + radius * Math.sin(angle),\n    }\n  }\n\n  getAngle(i, ellapsedTime) {\n    return this.normalizeRad(ellapsedTime / this.opts.interval * 2 * Math.PI * this.opts.direction - this.positions[i].rad)\n  }\n\n  normalizeRad(rad) {\n    while(rad < 0 ) rad += 2 * Math.PI\n    return rad % (Math.PI * 2)\n  }\n}\n\n\n\nclass ThreeD_Carousel {\n  constructor(ctn) {\n    this.ctn = $(ctn)\n    this.vp = this.ctn.find(\".tdc-viewport\")\n    this.imgCtn = this.ctn.find(\".tdc-images\")\n    this.widthCtn = this.ctn.find(\".tdc-width\")\n\n    this.init().start()\n  }\n\n  get imageElements() {\n    return this.ctn.find(\".tdc-images img\")\n  }\n\n  init() {\n    this.initImages()\n    this.updateDimensions()\n    return this\n  }\n\n  initImages() {\n    this.observer = new ResizeObserver((e, o) => this.handleChange(e, o))\n    this.observer.observe(this.widthCtn.get(0), { attributes: true })\n\n    this.revolver?.stop()\n    this.revolver = new ElementRevolver(this.imageElements)\n  }\n\n  async handleChange(entries, observer) {\n    entries.forEach(m => {\n      this.vp.css({ minWidth: `1px`, minHeight: `1px` })\n      this.updateDimensions()\n      // if(m.type != \"attributes\") return\n      // if(m.attributeName != \"open\") return\n      // this.toggle(m.target.dataset.visibilityMarker, m.target.attributes.getNamedItem(\"open\") !== null)\n    })\n  }\n\n  updateDimensions() {\n    const width = this.ctn.width()\n    const height = this.ctn.height()\n    const edge = Math.max(width, height) //Math.floor(width > height ? height : width)\n    const center = edge / 2\n    // const radius = Math.floor(center * 0.9)\n    const radius = center //- ((this.imageElements[0].width / 2) * 1.1)\n\n    this.vp.css({ minWidth: `${edge}px`, minHeight: `${edge}px` })\n    this.revolver.setOpts({ radius: radius, centerX: center, centerY: center })\n\n    return this\n  }\n\n  start() {\n    this.imgCtn.removeClass(\"invisible\")\n    this.revolver.start()\n\n    return this\n  }\n\n  stop() {\n    this.revolver?.stop()\n\n    return this\n  }\n}\n\nconst Component = class extends AppOS.Component {\n  static id = \"ThreeD.Carousel\"\n\n  init() {\n  }\n\n  documentLoad() {\n  }\n\n  pageLoad() {\n    $(\".threed-carousel\").each((i, el) => {\n      if(!$(el).data(\"appos-3d-carousel\")) {\n        $(el).data(\"appos-3d-carousel\", new ThreeD_Carousel(el))\n      }\n    })\n  }\n}\n\nAppOS.Application?.availableComponents?.push?.(Component)\nexport { Component }\n", "import * as AppOS from \"../appos\"\n\nclass ScrollQueue {\n  constructor(opts = {}) {\n    this.opts = Object.assign({}, {\n      tickRate: 200,\n      considerDoneAfter: 300,\n    }, opts)\n    this.lastScroll = Date.now()\n    this.queue = []\n  }\n\n  get timeSinceLastScroll() {\n    return Date.now() - this.lastScroll\n  }\n\n  hook() {\n    if(!this.hooked) {\n      this.hooked = true\n      $(document).on(\"scroll\", ev => { this.lastScroll = Date.now() })\n    }\n    return this\n  }\n\n  start() {\n    if(!this.clock) {\n      this.clock = setInterval(_ => { this.tick() }, this.opts.tickRate)\n    }\n    return this\n  }\n\n  stop() {\n    if(this.clock) {\n      clearInterval(this.clock)\n      delete this.clock\n    }\n    return this\n  }\n\n  tick() {\n    if(!this.queue.length) return\n    if(this.timeSinceLastScroll < this.opts.considerDoneAfter) return\n    this.dequeue()\n  }\n\n  dequeue() {\n    const item = this.queue.shift()\n\n    if(item.opts.ifNeeded) {\n      item.element.scrollIntoViewIfNeeded(true)\n    } else {\n      item.element.scrollIntoView(item.scrollOpts)\n    }\n  }\n\n  enqueue(element, opts = {}, scrollOpts = { behavior: \"smooth\" }) {\n    if(opts.delay) {\n      setTimeout(_ => {\n        this.enqueue(element, Object.assign({}, opts, { delay: false }), scrollOpts)\n      }, opts.delay)\n      return\n    }\n\n    this.queue.push({ element, opts, scrollOpts })\n  }\n}\n\nexport { ScrollQueue }\n", "import * as AppOS from \"../appos/appos\"\n\nconst Component = class extends AppOS.Component {\n  static id = \"FindAThingRenderer\"\n\n  documentLoad() {\n    this.opts.rows ??= 4\n    this.opts.perRow ??= 6\n    this.opts.perPage ??= this.opts.rows * this.opts.perRow\n    // $(document).on(\"click\", `[data-toggle=\"inline-list\"]`, ev => {\n    //   $(ev.currentTarget).closest(\"ul.toggle-inline-list\").toggleClass(\"expanded\")\n    //   setTimeout(_ => {\n    //     $(ev.currentTarget).blur()\n    //   }, 150)\n    //   return false\n    // })\n  }\n\n  pageLoad() {\n    $(`[data-fat-index]`).each((i, _el) => {\n      this.indexOne(_el)\n    })\n    // <div class=\"mb-1\" data-flist-entry data-fat-index=\"<%= hit %>\" data-fat-offset=\"<%= @fat_offset %>\">\n    // <span class=\"text-muted text-smaller\" data-fat-render>\n  }\n\n  async indexOne(_el) {\n    const el = $(_el)\n    const index = el.data(\"fatIndex\")\n    if(index === null || index === undefined) return\n    const offset = el.data(\"fatOffset\") ?? 0\n    const render = el.find(`[data-fat-render]`)\n    const r = $(\"<span>\")\n\n    if (index < 0) {\n      if(render.data(\"fatRender\") == \"compact\") {\n        r.html(` LOOKUP-ERR`).addClass(\"text-danger\")\n      } else {\n        r.html(` LOOKUP-ERROR`).addClass(\"text-danger\")\n      }\n    } else {\n      const a_index = index + offset\n      const page = Math.floor(a_index / this.opts.perPage) + 1\n      const row = Math.floor((a_index % this.opts.perPage) / this.opts.perRow) + 1\n      const col = Math.floor(((a_index % this.opts.perPage) % this.opts.perRow)) + 1\n      if(render.data(\"fatRender\") == \"compact\") {\n        r.html(` P${page} R${row} C${col}`)\n      } else {\n        r.html(` Page ${page} / Row ${row} / Column ${col}`)\n      }\n    }\n\n    const ico = $(\"<i>\").addClass(\"bi bi-geo\").prependTo(r)\n    render.html(\"\")\n    render.append(r)\n  }\n}\n\nAppOS.Application?.availableComponents?.push?.(Component)\nexport { Component }\n", "class TrigramIndex {\n  constructor(inputPhrases = []) {\n    this.ids = []\n    this.phrases = []\n    this.trigramIndex = []\n    this.allowDuplicatePhrases = true\n    inputPhrases.forEach(phrase => { this.index(...phrase) })\n  }\n\n  normalize(string) {\n    return string\n      .toLowerCase()\n      .replace(/[^\\x00-\\x7F]/g, \"\")\n      .replace(/[^a-z\\d]/g, \" \")\n      .replace(/\\s+/g, \"*\")\n      .replace(/^/g, \"**\")\n      .replace(/$/g, \"*\")\n  }\n\n  asTrigrams(phrase, callback) {\n    const rawData = this.normalize(phrase)\n\n    for( let i = rawData.length - 3; i >= 0; i = i - 1 ) {\n      callback(rawData.slice(i, i + 3))\n    }\n  }\n\n  index(phrase, id) {\n    if(Array.isArray(phrase)) {\n      [phrase, id] = phrase\n    }\n    phrase = phrase.toLowerCase()\n\n    if(!phrase || phrase === \"\" || (!this.allowDuplicatePhrases && this.phrases.indexOf(phrase) >= 0)) return\n    const phraseIndex = this.phrases.push(phrase) - 1\n    this.ids.push(id)\n\n    this.asTrigrams(phrase, trigram => {\n      let phrasesForTrigram = this.trigramIndex[`t_${trigram}`]\n      if(!phrasesForTrigram) phrasesForTrigram = []\n      if(phrasesForTrigram.indexOf(phraseIndex) < 0) phrasesForTrigram.push(phraseIndex)\n      this.trigramIndex[`t_${trigram}`] = phrasesForTrigram\n    })\n  }\n\n  find(phrase) {\n    const phraseMatches = []\n    let trigramsInPhrase = 0\n    // const start = Date.now()\n\n    this.asTrigrams(this.normalize(phrase), trigram => {\n      const phrasesForTrigram = this.trigramIndex[`t_${trigram}`]\n      trigramsInPhrase += 1\n      if(phrasesForTrigram) {\n        for(let j in phrasesForTrigram) {\n          const phraseIndex = phrasesForTrigram[j]\n          if(!phraseMatches[phraseIndex]) phraseMatches[phraseIndex] = 0\n          phraseMatches[phraseIndex] += 1\n        }\n      }\n    })\n\n    const result = []\n    for(let i in phraseMatches) {\n      result.push({ id: this.ids[i], phrase: this.phrases[i], matches: phraseMatches[i] })\n    }\n\n\n    result.sort((a, b) => {\n      const diff = b.matches - a.matches\n      return diff// == 0 ? a.phrase.localeCompare(b.phrase) : diff\n    })\n    // console.log(Date.now() - start)\n    return result\n  }\n}\n\nexport { TrigramIndex }\n", "import {TrigramIndex} from \"../appos/lib/trigram_index\"\n\nclass EntitlementMapper {\n  constructor(url, opts = {}) {\n    this.url = url\n    //this.data = data\n    this.opts = opts\n    this.itemClass = this.itemClass(EntitlementItem)\n  }\n\n  buildIndex() {\n    return new TrigramIndex(this.items.map((el, i) => [el, i]))\n  }\n\n  itemClass(base) { return base }\n\n  get populate() {\n    if(this.promise) return this.promise\n    this.promise = new Promise((resolve, reject) => {\n      fetch(this.url).then(r => r.json()).then(json => {\n        this.data = json\n        this.indexer = this.buildIndex()\n        this.loaded = true\n        resolve(this)\n      })\n    })\n    return this.promise\n  }\n\n  async do(func) {\n    return await this.populate.then(func)\n  }\n\n  async findDev(query) {\n    this.do(m => {\n      m.find(query, 10).forEach(el => {\n        console.log(el)\n      })\n    })\n  }\n\n  // Every following method should be wrapped in a do-block\n  //   e.g. mapper.do(map => { map.items[12] })\n  // Alternatively you can check for `mapper.loaded` and/or\n  // trigger data fetching with `mapper.populate`\n\n  get items() {\n    return this.data.items\n  }\n\n  get types() {\n    return this.data.types\n  }\n\n  get typemap() {\n    return this.data.type_map\n  }\n\n  rand(num = 1) {\n    const ary = []\n    for (var i = 0; i < num; i++) {\n      ary.push(this.get(this.items[Math.floor(Math.random() * this.items.length)]))\n    }\n    return ary\n  }\n\n  get(name, matches) {\n    const index = this.items.indexOf(name)\n    if (index < 0) return false\n\n    return new this.itemClass(this, index, matches)\n  }\n\n  levenshteinDistance(s, t) {\n    const d = Array.from({ length: t.length + 1 }, (_, i) => i)\n\n    for (let i = 1; i <= s.length; i++) {\n      let prev = i - 1\n      let current = i\n\n      for (let j = 1; j <= t.length; j++) {\n        const insert = current + 1\n        const deleteScore = d[j] + 1\n        const replaceScore = s[i - 1] === t[j - 1] ? prev : prev + 1\n        current = Math.min(insert, deleteScore, replaceScore)\n        prev = d[j]\n        d[j] = current\n      }\n    }\n\n    return d[t.length]\n  }\n\n  find(query, limit = null, log = false) {\n    const filteredArray = this.indexer.find(query).map(r => {\n      if(log) console.log(r)\n      return this.get(this.items[r.id], r.matches)\n    })\n    // const filteredArray = this.items\n    //   .map(item => {\n    //     const itemLower = item.toLowerCase()\n    //     const queryLower = query.toLowerCase()\n    //     const distance = this.levenshteinDistance(itemLower, queryLower)\n    //     const score = itemLower.indexOf(queryLower) === 0 ? -distance : distance\n    //     return { item, score }\n    //   })\n    //   .filter(({ score }) => score <= query.length)\n    //   .sort((a, b) => a.score - b.score)\n    //   .map(({ item }) => item)\n\n    if(limit !== null) {\n      return filteredArray.slice(0, limit)\n    }\n    return filteredArray\n  }\n\n  findFirst(...args) {\n    return find(...args)?.[0]\n  }\n}\n\nclass EntitlementItem {\n  constructor(mapper, index, matches = null) {\n    this.index = index\n    this.matches = matches\n    this.name = mapper.items[this.index]\n    this.types = mapper.typemap?.[this.index].map(id => mapper.types[id])\n    this.pvBase = mapper.opts.pvBase\n  }\n\n  get profilePath() {\n    return `${this.types[0]}?tab=${this.types[1]}`\n  }\n\n  get profileUrl() {\n    if(this.pvBase) {\n      return `${this.pvBase}/${this.profilePath}`\n    } else {\n      return this.profilePath\n    }\n  }\n\n  toData() {\n    return {\n      index: this.index,\n      name: this.name,\n      types: this.types,\n      profileUrl: this.profileUrl,\n    }\n  }\n}\n\nexport { EntitlementMapper }\n", "import * as AppOS from \"../appos/appos\"\n\nclass EntitlementSearch {\n  static hookClicks(selector) {\n    $(document).on(\"click\", async ev => {\n      if(!$(ev.target).closest(`[data-role=\"searchContainer\"]`).length) {\n        $(selector).each((i, el) => {\n          $(el).data(\"entitlementSearch\")?.hide?.()\n        })\n      }\n    })\n  }\n\n  constructor(app, ctn, mapper) {\n    this.app = app\n    this.ctn = ctn\n    this.mapper = mapper\n    this.ctn.data(\"entitlementSearch\", this)\n\n    this.b_toggle = this.ctn.find(`[data-action=\"toggleSearch\"]`)\n    this.i_query = this.ctn.find(`[data-role=\"query\"]`)\n    this.c_wrapper = this.ctn.find(`[data-role=\"searchContainer\"]`)\n    this.c_empty = this.ctn.find(`[data-role=\"emptySet\"]`)\n    this.c_searching = this.ctn.find(`[data-role=\"searching\"]`)\n    this.c_noquery = this.ctn.find(`[data-role=\"emptyQuery\"]`)\n    this.c_results = this.ctn.find(`[data-role=\"results\"]`)\n\n    this.b_toggle.on(\"click\", ev => {\n      ev.preventDefault()\n      ev.stopPropagation()\n      this.b_toggle.blur()\n      this.toggle()\n      return false\n    })\n\n    this.i_query.on(\"keydown\", ev => {\n      if(ev.keyCode == 27) { // escape\n        this.hide()\n        return false\n      } else if(ev.keyCode == 13) { // enter\n        this.confirmSelection()\n        return false\n      } else if(ev.keyCode == 38) { // arrow up\n        this.selectPreviousResult(ev.shiftKey)\n        return false\n      } else if(ev.keyCode == 40) { // arrow down\n        this.selectNextResult(ev.shiftKey)\n        return false\n      }\n\n      clearTimeout(this.searchTimeout)\n      this.searchTimeout = window.setTimeout(_ => {\n        if(this.open) this.applySearch()\n      }, 150)\n    })\n  }\n\n  get open() {\n    return !this.c_wrapper.hasClass(\"d-none\")\n  }\n\n  get selected() {\n    return this.c_results.find(`.active`)\n  }\n\n  toggle() {\n    return this.open ? this.hide() : this.show()\n  }\n\n  show() {\n    this.c_wrapper.removeClass(\"d-none\")\n    this.c_noquery.removeClass(\"d-none\")\n    let offset = 0\n\n    if(this.ctn.closest(\".is-sticky\").length) {\n      this.ctn.closest(\".is-sticky\").css({\"position\": \"static\"})\n      offset = this.b_toggle.offset().top\n      this.ctn.closest(\".is-sticky\").css({\"position\": \"\"})\n    } else {\n      offset = this.b_toggle.offset().top\n    }\n\n    this.i_query.focus()\n    if(offset < window.pageYOffset) {\n      window.scrollTo({ top: offset, behavior: \"smooth\" })\n    }\n  }\n\n  hide() {\n    this.clearResults()\n    this.i_query.val(\"\")\n    this.c_wrapper.addClass(\"d-none\")\n    this.c_searching.addClass(\"d-none\")\n  }\n\n  clearResults() {\n    this.c_results.find(`[data-role=\"result\"]`).remove()\n    this.c_noquery.toggleClass(\"d-none\", !!this.i_query.val())\n    this.c_empty.addClass(\"d-none\")\n  }\n\n  confirmSelection() {\n    const target = this.selected.attr(\"href\")\n    this.hide()\n    AppOS.Util.visitPage(target)\n  }\n\n  selectPreviousResult(selectFirst = false) {\n    const current = this.selected\n    if(selectFirst) {\n      current.removeClass(\"active\")\n      current.siblings(\":first\").addClass(\"active\")\n    } else if(current.prev().length) {\n      current.removeClass(\"active\")\n      current.prev().addClass(\"active\")\n    }\n  }\n\n  selectNextResult(selectLast = false) {\n    const current = this.selected\n    if(selectLast) {\n      current.removeClass(\"active\")\n      current.siblings(\":last\").addClass(\"active\")\n    } else if(current.next().length) {\n      current.removeClass(\"active\")\n      current.next().addClass(\"active\")\n    }\n  }\n\n  async applySearch() {\n    const query = this.i_query.val()\n    if(query == this.lastQuery) {\n      // probably meta key or rapid undo\n      return\n    }\n    this.lastQuery = query\n\n    if(!query) {\n      this.c_searching.addClass(\"d-none\")\n      this.clearResults()\n      return\n    }\n    this.c_searching.removeClass(\"d-none\")\n    this.c_noquery.addClass(\"d-none\")\n    this.c_empty.addClass(\"d-none\")\n\n    this.mapper.do(map => {\n      let results = []\n      if(query.startsWith(\"%%rand%%\")) {\n        results = map.rand(5)\n      } else {\n        results = map.find(query, 15)\n      }\n      this.c_searching.addClass(\"d-none\")\n      this.clearResults()\n      if(results.length) {\n        results.forEach((el, i) => {\n          //console.log(el.matches, el.name)\n          const l = $(\"<a>\")\n            .addClass(\"list-group-item list-group-item-action d-flex justify-content-between align-items-center text-nowrap\")\n            .attr(\"href\", el.profileUrl + `#jump=${encodeURIComponent(el.name).replace(/'/g, \"%27\")}&forceJumpOnce=true`)\n            .attr(\"data-role\", \"result\")\n            .text(el.name)\n            .appendTo(this.c_results)\n\n          if(i == 0) {\n            l.addClass(\"active\")\n          }\n\n          let bgColor = \"bg-secondary\"\n          if(el.types[0] == \"vanity\") {\n            bgColor = \"bg-info\"\n          } else if(el.types[0] == \"clothing\") {\n            bgColor = \"bg-primary\"\n          } else if(el.types[0] == \"ship\" || el.types[0] == \"ship_decorations\" || el.types[0] == \"ship_trinkets\") {\n            bgColor = \"bg-warning text-black\"\n          } else if(el.types[0] == \"armory\") {\n            bgColor = \"bg-danger text-black\"\n          } else if(el.types[0] == \"pets\") {\n            bgColor = \"bg-success text-black\"\n          }\n\n          $(\"<span>\")\n            .addClass(`badge ${bgColor} badge-pill d-none d-lg-block`)\n            .text(`${el.types.slice(-1)}`)\n            .appendTo(l)\n        })\n      } else {\n        this.c_empty.removeClass(\"d-none\")\n      }\n    })\n  }\n}\n\nexport { EntitlementSearch }\n", "import * as AppOS from \"../appos/appos\"\nimport {TrigramIndex} from \"../appos/lib/trigram_index\"\nimport {EntitlementMapper} from \"./entitlement_mapper\"\n\nclass AchievementMapper extends EntitlementMapper {\n  buildIndex() {\n    return new TrigramIndex(this.items.map((el, i) => [el[0], i]))\n  }\n}\n\nclass PagesMapper extends EntitlementMapper {\n  buildIndex() {\n    return new TrigramIndex(this.items.map((el, i) => [el.name, i]))\n  }\n\n  itemClass(base) {\n    return class extends base {\n      get pageUrl() {\n        let url = this.name.url\n        if(this.pvBase) url = url.replace(\"%profile%\", this.pvBase)\n        return url\n      }\n    }\n  }\n}\n\nclass GotoAnywhere {\n  static hookClicks(selector) {\n    $(document).on(\"click\", async ev => {\n      if(!$(ev.target).closest(`[data-role=\"searchContainer\"]`).length) {\n        $(selector).each((i, el) => {\n          $(el).data(\"gotoAnywhere\")?.hide?.()\n        })\n      }\n    })\n  }\n\n  constructor(app, ctn, mapper) {\n    this.app = app\n    this.ctn = ctn\n    this.container = $(\"#pv-main\")\n    this.mapperEnts = mapper\n    this.mapperAchievements = (this.app.__achievementMapper ||= new AchievementMapper(this.container.data(\"pvBase\") + \"/goto_anywhere?d=achievements\", { pvBase: this.container.data(\"pvBase\") }))\n    this.mapperPages = (this.app.__pagesMapper ||= new PagesMapper(this.container.data(\"pvBase\") + \"/goto_anywhere?d=pages\", { pvBase: this.container.data(\"pvBase\") }))\n    this.ctn.data(\"gotoAnywhere\", this)\n    this.moreResultsModifier = 0\n\n    this.b_toggle = this.container.find(`[data-action=\"gotoAnywhere\"]`)\n    this.i_query = this.ctn.find(`[data-role=\"query\"]`)\n    this.c_wrapper = this.ctn//.find(`[data-role=\"searchContainer\"]`)\n    this.c_empty = this.ctn.find(`[data-role=\"emptySet\"]`)\n    this.c_searching = this.ctn.find(`[data-role=\"searching\"]`)\n    this.c_noquery = this.ctn.find(`[data-role=\"emptyQuery\"]`)\n    this.c_results = this.ctn.find(`[data-role=\"results\"]`)\n    this.c_resultsPages = this.ctn.find(`[data-role=\"resultsPages\"]`)\n    this.c_resultsAchievements = this.ctn.find(`[data-role=\"resultsAchievements\"]`)\n    this.c_resultsEnts = this.ctn.find(`[data-role=\"resultsEnts\"]`)\n  }\n\n  hook() {\n    this.b_toggle.on(\"click\", ev => {\n      ev.preventDefault()\n      ev.stopPropagation()\n      this.b_toggle.blur()\n      this.toggle()\n      return false\n    })\n\n    this.i_query.on(\"keydown\", ev => {\n      if(ev.keyCode == 27) { // escape\n        this.hide()\n        return false\n      } else if(ev.keyCode == 9) { // tab\n        ev.preventDefault()\n        this.moreResultsModifier = Math.max(0, this.moreResultsModifier + (ev.shiftKey ? -1 : 1))\n        this.applySearch(true)\n        return false\n      } else if(ev.keyCode == 13) { // enter\n        this.confirmSelection(ev.shiftKey)\n        return false\n      } else if(ev.keyCode == 38) { // arrow up\n        this.selectPreviousResult(ev.shiftKey)\n        return false\n      } else if(ev.keyCode == 40) { // arrow down\n        this.selectNextResult(ev.shiftKey)\n        return false\n      }// else { console.log(ev.keyCode, ev.code) }\n\n      clearTimeout(this.searchTimeout)\n      this.searchTimeout = window.setTimeout(_ => {\n        if(this.open) this.applySearch()\n      }, 150)\n    })\n\n    const triggerBind = this.container.data(\"kbBind-GotoAnywhere\")\n    if(triggerBind) {\n      this.app.input?.hotkeyThisPage(triggerBind, { global: true }, ev => {\n        ev.preventDefault()\n        this.toggle()\n      })\n    }\n  }\n\n  get open() {\n    return !this.c_wrapper.hasClass(\"d-none\")\n  }\n\n  get selected() {\n    return this.c_results.find(`.active`)\n  }\n\n  toggle() {\n    return this.open ? this.hide() : this.show()\n  }\n\n  show() {\n    this.c_wrapper.removeClass(\"d-none\")\n    this.c_noquery.removeClass(\"d-none\")\n    this.i_query.focus()\n  }\n\n  hide() {\n    delete this.lastQuery\n    this.moreResultsModifier = 0\n    this.clearResults()\n    this.i_query.val(\"\")\n    this.c_wrapper.addClass(\"d-none\")\n    this.c_searching.addClass(\"d-none\")\n    this.c_results.addClass(\"d-none\")\n  }\n\n  clearResults(clearFor = \"results\") {\n    this[`c_${clearFor}`].find(`[data-role=\"result\"]`).remove()\n    this.c_noquery.toggleClass(\"d-none\", !!this.i_query.val())\n    this.c_empty.addClass(\"d-none\")\n  }\n\n  confirmSelection(popup = false) {\n    const target = this.selected.attr(\"href\")\n    if(!target) {\n      return false\n    } else if(target.startsWith(\"jsproc:\")) {\n      const exps = new Map()\n      exps.set(\"gaRef\", this)\n      exps.set(\"gaHide\", _ => this.hide())\n      exps.set(\"popup\", popup)\n      return (new Function(\"env\", ...exps.keys(), target.slice(7)))(exps, ...exps.values())\n    } else {\n      if(this.selected.attr(\"target\") == \"_blank\" ? !popup : popup) {\n        window.open(target, \"_blank\", this.selected.data(\"popopts\") || \"noopener,noreferrer\")\n        this.hide()\n      } else {\n        this.hide()\n        AppOS.Util.visitPage(target)\n      }\n    }\n  }\n\n  selectPreviousResult(selectFirst = false) {\n    const current = this.selected\n    if(current.prevAll(`[data-role=\"result\"]`).length) {\n      current.removeClass(\"active\")\n      if(selectFirst) {\n        current.siblings(`[data-role=\"result\"]:first`).addClass(\"active\")\n      } else {\n        current.prevAll(`[data-role=\"result\"]`).first().addClass(\"active\")\n      }\n    } else {\n      const fuckyoujs = current.parent().prevAll(`[data-is=\"resultSet\"]:not(\".d-none\")`).first().find(`[data-role=\"result\"]:last`)\n      if(fuckyoujs.length) {\n        current.removeClass(\"active\")\n        fuckyoujs.addClass(\"active\")\n      }\n    }\n  }\n\n  selectNextResult(selectLast = false) {\n    const current = this.selected\n    if(current.nextAll(`[data-role=\"result\"]`).length) {\n      current.removeClass(\"active\")\n      if(selectLast) {\n        current.siblings(`[data-role=\"result\"]:last`).addClass(\"active\")\n      } else {\n        current.nextAll(`[data-role=\"result\"]`).first().addClass(\"active\")\n      }\n    } else {\n      const fuckyoujs = current.parent().nextAll(`[data-is=\"resultSet\"]:not(\".d-none\")`).first().find(`[data-role=\"result\"]:first`)\n      if(fuckyoujs.length) {\n        current.removeClass(\"active\")\n        fuckyoujs.addClass(\"active\")\n      }\n    }\n  }\n\n  searchEntitlements(query, maxResults = 6, thresholdRatio = 4) {\n    maxResults += this.moreResultsModifier\n\n    return new Promise((resolve, reject) => { this.mapperEnts.do(map => {\n      let results = []\n      if(query.startsWith(\"%%rand%%\")) {\n        results = map.rand(5)\n      } else {\n        results = map.find(query, maxResults * 3).filter((a) => a.matches > query.length / thresholdRatio).slice(0, maxResults)\n      }\n      this.clearResults(\"resultsEnts\")\n      if(results.length) results.forEach((el, i) => {\n        // console.log(\"ent\", el)\n        const l = $(\"<a>\")\n          .addClass(\"list-group-item list-group-item-action d-flex justify-content-between align-items-center text-nowrap\")\n          .attr(\"href\", el.profileUrl + `#jump=${encodeURIComponent(el.name).replace(/'/g, \"%27\")}&forceJumpOnce=true`)\n          .attr(\"data-role\", \"result\")\n          .appendTo(this.c_resultsEnts)\n\n        const nameCtn = $(`<span class=\"position-relative\">`).appendTo(l)\n\n        // popup icon\n        $(\"<span>\")\n          .addClass(\"position-absolute\")\n          .html(`<i class=\"bi bi-box-arrow-up-right text-warning kb-mod-shift-visible\" title=\"opens in new tab\"></i>`)\n          .appendTo(nameCtn)\n\n        // name\n        $(\"<span>\").addClass(\"ms-4\").text(el.name).appendTo(nameCtn)\n\n        // badge\n        let bgColor = \"bg-secondary\"\n        if(el.types[0] == \"vanity\") {\n          bgColor = \"bg-info\"\n        } else if(el.types[0] == \"clothing\") {\n          bgColor = \"bg-primary\"\n        } else if(el.types[0] == \"ship\" || el.types[0] == \"ship_decorations\" || el.types[0] == \"ship_trinkets\") {\n          bgColor = \"bg-warning text-black\"\n        } else if(el.types[0] == \"armory\") {\n          bgColor = \"bg-danger text-black\"\n        } else if(el.types[0] == \"pets\") {\n          bgColor = \"bg-success text-black\"\n        }\n\n        $(\"<span>\")\n          .addClass(`badge ${bgColor} badge-pill d-none d-lg-block`)\n          .text(`${el.types.slice(-1)}`)\n          .appendTo(l)\n      })\n      resolve(results)\n    })})\n  }\n\n  searchPages(query, maxResults = 5, thresholdRatio = 3) {\n    maxResults += this.moreResultsModifier\n\n    return new Promise((resolve, reject) => { this.mapperPages.do(map => {\n      let results = []\n      if(query.startsWith(\"%%rand%%\")) {\n        results = map.rand(5)\n      } else {\n        results = map.find(query, maxResults * 3).filter((a) => a.matches > query.length / thresholdRatio).slice(0, maxResults)\n      }\n      this.clearResults(\"resultsPages\")\n      this.c_resultsPages.removeClass(\"d-none\")\n      if(results.length) results.forEach((el, i) => {\n        // console.log(\"pag\", el)\n        const l = $(\"<a>\")\n          .addClass(\"list-group-item list-group-item-action d-flex justify-content-between align-items-center text-nowrap\")\n          .attr(\"href\", el.pageUrl)\n          .attr(\"data-role\", \"result\")\n          .appendTo(this.c_resultsPages)\n        if(el.name.popup) l.attr(\"target\", \"_blank\")\n        if(el.name.popopts) l.attr(\"data-popopts\", el.name.popopts)\n\n        const nameCtn = $(`<span class=\"position-relative\">`).appendTo(l)\n\n        // popup icon\n        if(el.name.popup) {\n          $(\"<span>\")\n            .addClass(\"position-absolute\")\n            .html(`<i class=\"bi bi-box-arrow-up-right text-warning kb-mod-shift-hidden\" title=\"opens in new tab\"></i>`)\n            .appendTo(nameCtn)\n        } else {\n          $(\"<span>\")\n            .addClass(\"position-absolute\")\n            .html(`<i class=\"bi bi-box-arrow-up-right text-warning kb-mod-shift-visible\" title=\"opens in new tab\"></i>`)\n            .appendTo(nameCtn)\n        }\n\n        // name\n        $(\"<span>\").addClass(\"ms-4\").text(el.name.name).appendTo(nameCtn)\n\n        // desc\n        if(el.name.desc) {\n          $(\"<span>\").addClass(\"text-muted text-smaller text-truncate ms-2\").text(el.name.desc).appendTo(nameCtn)\n        }\n      })\n      else this.c_resultsPages.addClass(\"d-none\")\n      resolve(results)\n    })})\n  }\n\n  searchAchievements(query, maxResults = 6, thresholdRatio = 4) {\n    maxResults += this.moreResultsModifier\n\n    return new Promise((resolve, reject) => { this.mapperAchievements.do(map => {\n      let results = []\n      if(query.startsWith(\"%%rand%%\")) {\n        results = map.rand(5)\n      } else {\n        results = map.find(query, maxResults * 3).filter((a) => a.matches > query.length / thresholdRatio).slice(0, maxResults)\n      }\n      this.clearResults(\"resultsAchievements\")\n      this.c_resultsAchievements.removeClass(\"d-none\")\n      if(results.length) results.forEach((el, i) => {\n        const l = $(\"<a>\")\n          .addClass(\"list-group-item list-group-item-action d-flex justify-content-between align-items-center text-nowrap\")\n          // .attr(\"href\", el.pageUrl)\n          .attr(\"href\", el.profileUrl + `#jump=${encodeURIComponent(el.name[0]).replace(/'/g, \"%27\")}&forceJumpOnce=true`)\n          .attr(\"data-role\", \"result\")\n          .appendTo(this.c_resultsAchievements)\n\n        const nameCtn = $(\"<span>\").addClass(\"position-relative d-flex mw-100 align-items-baseline\").css({ minWidth: 0 }).appendTo(l)\n\n        // name\n        $(\"<span>\").addClass(\"ms-4\").text(el.name[0]).appendTo(nameCtn)\n\n        // popup icon\n        $(\"<span>\")\n          .addClass(\"position-absolute\")\n          .html(`<i class=\"bi bi-box-arrow-up-right text-warning kb-mod-shift-visible\" title=\"opens in new tab\"></i>`)\n          .appendTo(nameCtn)\n\n        // description\n        if(el.name[1]) {\n          $(\"<span>\").addClass(\"text-muted text-smaller text-truncate ms-2\").text(el.name[1]).appendTo(nameCtn)\n        }\n\n        // badge\n        let bgColor = {\n          BilgeRats: \"--bilgerat-color\",\n          AthenasFortune: \"--athena-color\",\n          ReapersBones: \"--reaper-color\",\n          GoldHoarders: \"--hoarder-color\",\n          MerchantAlliance: \"--merchant-color\",\n          OrderOfSouls: \"--souls-color\",\n          HuntersCall: \"--hunter-color\",\n          PirateLord: \"--guardian-color\",\n          Flameheart: \"--servant-color\",\n          TallTales: \"--talltale-color\",\n          Achievement: \"--achievement-color\",\n        }[el.types[1]] || \"--bs-secondary\"\n        // if(bgColor == \"--bs-secondary\") console.log(\"type?\", el.types[1], bgColor)\n\n        $(\"<span>\")\n          .addClass(`badge badge-pill d-none d-lg-block`)\n          .css({ background: `var(${bgColor})`, color: `var(${bgColor}-contrast)` })\n          .text(`${el.types[2]}`)\n          .appendTo(l)\n      })\n      else this.c_resultsAchievements.addClass(\"d-none\")\n      resolve(results)\n    })})\n  }\n\n  async applySearch(force = false) {\n    const query = this.i_query.val()\n    if(!force && query == this.lastQuery) {\n      // probably meta key or rapid undo\n      return\n    }\n    this.lastQuery = query\n\n    if(!query) {\n      this.c_searching.addClass(\"d-none\")\n      this.c_results.addClass(\"d-none\")\n      this.clearResults()\n      return\n    }\n    this.c_searching.removeClass(\"d-none\")\n    this.c_noquery.addClass(\"d-none\")\n    this.c_empty.addClass(\"d-none\")\n    this.c_results.removeClass(\"d-none\")\n\n    let resultCount = 0\n\n    Promise.all([\n      this.searchPages(query).then(r => { resultCount += r.length }),\n      this.searchAchievements(query).then(r => { resultCount += r.length }),\n      this.searchEntitlements(query).then(r => { resultCount += r.length }),\n    ]).then(_ => {\n      this.c_searching.addClass(\"d-none\")\n      if(resultCount > 0) {\n        this.c_results.find(`[data-role=\"result\"]`).first().addClass(\"active\")\n        this.c_empty.addClass(\"d-none\")\n        this.c_results.removeClass(\"d-none\")\n      } else {\n        this.c_results.addClass(\"d-none\")\n        this.c_empty.removeClass(\"d-none\")\n      }\n    })\n  }\n}\n\nexport { GotoAnywhere }\n", "import * as AppOS from \"../appos\"\n\nexport class Modal {\n  static DEFAULT_EVENTS = [\n    \"hide\",\n    \"hidden\",\n    \"show\",\n    \"shown\",\n    \"destroy\",\n  ]\n\n  evlist() {\n    return this.constructor.DEFAULT_EVENTS\n  }\n\n  constructor(opts = {}) {\n    const evlist = this.evlist()\n\n    AppOS.SimpleEvents.applyOn(this, evlist, opts)\n    evlist.forEach(efn => {\n      const capitalized = `on${efn[0].toUpperCase()}${efn.slice(1)}`\n      if(typeof this[capitalized] == \"function\") this.on(efn, this[capitalized].bind(this))\n    })\n\n    this.dom = this.createDom()\n    this.setupDom()\n\n    this.size = opts.size ?? false\n    this.title = opts.title ?? \"Modal\"\n    this.fade = opts.fade ?? true\n\n    this.init(opts)\n  }\n\n  init(opts) {}\n\n  destroy() {\n    this.destroyed = true\n    this.modal?.dispose()\n    this.dom?.remove()\n    this.fire(\"destroy\", this)\n  }\n\n  get modal() { return bootstrap.Modal.getOrCreateInstance(this.dom) }\n\n  set size(v) {\n    this.dom_dialog.classList.remove(\"modal-sm\", \"modal-lg\", \"modal-xl\")\n    if(v) this.dom_dialog.classList.add(`modal-${v}`)\n  }\n\n  set title(v) {\n    if(!this.dom_title) return false\n    this.dom_title.innerHTML = v\n  }\n\n  set titleText(v) {\n    if(!this.dom_title) return false\n    this.dom_title.innerText = v\n  }\n\n  set fade(v) {\n    this.dom.classList.toggle(\"fade\", v)\n  }\n\n  set backdrop(v) {\n    if(v == \"static\") {\n      this.dom.setAttribute(\"data-bs-backdrop\", \"static\")\n    } else if(v) {\n      this.dom.removeAttribute(\"data-bs-backdrop\")\n    } else {\n      this.dom.setAttribute(\"data-bs-backdrop\", \"false\")\n    }\n  }\n\n  singleUse() {\n    this.on(\"hidden\", _ => this.destroy())\n    return this\n  }\n\n  show() {\n    this.modal.show()\n    return this\n  }\n\n  hide() {\n    this.modal.hide()\n    return this\n  }\n\n  createDom() {\n    const div = document.createElement(\"div\")\n    div.classList.add(\"modal\")\n\n    div.innerHTML = this.domContainer()\n\n    return div\n  }\n\n  setupDom() {\n    this.dom_dialog = this.dom.querySelector(\".modal-dialog\")\n    this.dom_content = this.dom.querySelector(\".modal-content\")\n    this.dom_header = this.dom.querySelector(\".modal-header\")\n    this.dom_title = this.dom.querySelector(\".modal-title\")\n    this.dom_body = this.dom.querySelector(\".modal-body\")\n    this.dom_footer = this.dom.querySelector(\".modal-footer\")\n    this.dom.addEventListener(\"hide.bs.modal\", ev => this.fire(\"hide\", this, ev))\n    this.dom.addEventListener(\"hidden.bs.modal\", ev => this.fire(\"hidden\", this, ev))\n    this.dom.addEventListener(\"show.bs.modal\", ev => this.fire(\"show\", this, ev))\n    this.dom.addEventListener(\"shown.bs.modal\", ev => this.fire(\"shown\", this, ev))\n  }\n\n  domContainer() {\n    return `\n      <div class=\"modal-dialog${this.size ? ` modal-${this.size}` : \"\"}\">\n        <div class=\"modal-content\">${this.domContent()}</div>\n      </div>\n    `\n  }\n\n  domContent() {\n    return `\n      ${this.domHeader()}\n      ${this.domBody()}\n      ${this.domFooter()}\n    `\n  }\n\n  domHeader() {\n    return `<div class=\"modal-header\">${this.headerContent()}</div>`\n  }\n\n  headerContent() {\n    return `\n      <h5 class=\"modal-title\"></h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n    `\n  }\n\n  domBody() {\n    return ` <div class=\"modal-body\">${this.bodyContent()}</div> `\n  }\n\n  bodyContent() { return `` }\n\n  domFooter() {\n    return `<div class=\"modal-footer\">${this.footerContent()}</div>`\n  }\n\n  footerContent() {\n    return `\n      <div class=\"d-flex gap-2 justify-content-between flex-grow-1\">\n        <div>${this.footerLeftContent()}</div>\n        <div>${this.footerRightContent()}</div>\n      </div>\n    `\n  }\n\n  footerLeftContent() {\n    return ``\n  }\n\n  footerRightContent() {\n    return this.btnClose()\n  }\n\n  // ------------\n\n  btnClose(opts = {}) {\n    opts.btn ??= \"secondary\"\n    opts.label ??= \"Close\"\n    return `\n      <button type=\"button\" class=\"btn btn-${opts.btn}\" data-bs-dismiss=\"modal\">${opts.label}</button>\n    `\n  }\n\n  btnSubmit(opts = {}) {\n    opts.btn ??= \"primary\"\n    opts.value ??= \"submit\"\n    opts.label ??= \"Save changes\"\n    return `\n      <button type=\"submit\" class=\"btn btn-${opts.btn}\" value=\"${opts.value}\">${opts.label}</button>\n    `\n  }\n}\n\nexport class FormModal extends Modal {\n  evlist() {\n    return super.evlist().concat([\"submit\"])\n  }\n\n  domContent() {\n    return `<form action=\"\" class=\"modal-form\">${super.domContent()}</form>`\n  }\n\n  setupDom(dom = this.dom) {\n    super.setupDom(dom)\n    this.dom_form = dom.querySelector(\"form.modal-form\")\n    this.dom_form.addEventListener(\"submit\", ev => this.fire(\"submit\", this, ev))\n  }\n\n  footerRightContent() {\n    return super.footerRightContent() + this.btnSubmit()\n  }\n}\n\nexport class YesNoModal extends FormModal {\n  init(opts = {}) {\n    super.init(opts)\n    this.on(\"submit\", (m, ev) => {\n      ev.preventDefault()\n\n      if(ev.submitter.value == \"yes\") {\n        this.fire(\"yes\", this, ev)\n        this.hide()\n      } else if (ev.submitter.value == \"no\") {\n        this.fire(\"no\", this, ev)\n        this.hide()\n      } else {\n        this.hide()\n      }\n    })\n  }\n\n  evlist() {\n    return super.evlist().concat([\"no\", \"yes\"])\n  }\n\n  btnNo(opts = {}) {\n    opts.btn ??= \"danger\"\n    opts.label ??= \"No\"\n    opts.value ??= \"no\"\n    return super.btnSubmit(opts)\n  }\n\n  btnYes(opts = {}) {\n    opts.btn ??= \"success\"\n    opts.label ??= \"Yes\"\n    opts.value ??= \"yes\"\n    return super.btnSubmit(opts)\n  }\n\n  footerRightContent() {\n    return this.btnNo() + this.btnYes()\n  }\n}\n\nexport class EditModal extends FormModal {}\n", "import * as AppOS from \"../appos/appos\"\nimport { YesNoModal } from \"../appos/bootstrap5/modal\"\n\nconst DEV = false\n\nexport class GraphAnything {\n  constructor(app, el, opts = {}) {\n    this.app = app\n    this.el = el\n    this.opts = opts\n    this.fmt = new Intl.NumberFormat('en-US')\n\n    this.lastFetch = Date.now()\n    this.fetchEvery = 3000\n  }\n\n  setStatus(msg, spinner, textColor, sIcon) {\n    this.v_status.html(msg)\n    this.v_status.removeClass((i, c) => (c.match(/(^|\\s)text-\\S+/g) || []).join(' '))\n    if(textColor) this.v_status.addClass(\"text-\" + textColor)\n    if(spinner) this.setSpinner(spinner, sIcon)\n    return this\n  }\n\n  setSpinner(color, sIcon) {\n    this.v_spinner.removeClass(\"animation-paused\")\n    this.v_spinner.removeClass((i, c) => (c.match(/(^|\\s)text-\\S+/g) || []).join(' '))\n    this.v_spinner.addClass(\"text-\" + color)\n    if(sIcon) {\n      this.v_spinner.replaceWith($(`<i class=\"bi bi-${sIcon}\"></i>`))\n    }\n  }\n\n  showData() {\n    if(this.shown) return\n    this.shown = true\n    this.setupGraph()\n    this.v_data.fadeIn(1000, _ => { this.shownReady = true })\n  }\n\n  fetchUpdates(jid, jri) {\n    if(jid != null) {\n      this.job_id = jid\n      this.job_mc = 0\n      this.job_buf = []\n      this.job_started = false\n      this.job_done = false\n      this.job_failed = false\n      if(jri != null) this.job_ri = jri\n      if(!this.shown) this.showData()\n    }\n\n    fetch(this.el.data(\"gatFetch\") + '?' + new URLSearchParams({\n      j: this.job_id,\n      jri: this.job_ri,\n    }), this.postOpts()).then(r => r.json()).then(json => {\n      json.res.forEach(row => {\n        this.job_ri++\n\n        if(row == \"%JOB_STARTED%\") {\n          // console.log(\"job started\")\n          this.job_started = true\n          this.setStatus(\"job started, waiting for data...\", \"warning\", \"info\")\n        } else if (row == \"%JOB_FAILED%\") {\n          // console.log(\"job failed\")\n          this.job_failed = true\n          this.setStatus(\"job failed :( sorry, try again later\", \"danger\", \"danger\", \"x-lg text-danger\")\n        } else if (row == \"%JOB_DONE%\") {\n          this.job_done = true\n        } else if (Array.isArray(row) && row[0] == \"limit_reached\") {\n          this.limit_reached = {\n            limit: row[1],\n            processed: row[2],\n            remaining: row[3],\n            sid: row[4],\n          }\n          this.job_buf.push(row)\n        } else if (Array.isArray(row) && row[0] == \"prog\") {\n          // console.log(\"progress\", row)\n          // this.job_mc = parseFloat(row[1])\n          this.job_mt = parseFloat(row[2])\n          this.setStatus(`processing... ${this.job_mc}/${this.job_mt}`, \"warning\", \"warning\")\n        } else {\n          // console.log(\"row\", row)\n          this.job_buf.push(row)\n        }\n      })\n      this.lastFetch = Date.now()\n      this.bufferOff()\n      // this.v_table.html(JSON.stringify(json.res))\n      if(!this.job_done && !this.job_failed) setTimeout(_ => { this.fetchUpdates() }, this.fetchEvery)\n    }).catch(err => {\n      this.setStatus(\"failed to gather data :( sorry, try again later\", \"danger\", \"danger\", \"x-lg text-danger\")\n      console.error(err)\n    })\n  }\n\n  continueModal() {\n    return new ContinueModal({ ga: this })\n      .show()\n      .on(\"hidden\", m => {\n        if(m.result == \"yesAll\") {\n          this.continueJob(true)\n        } else if (m.result == \"yes\") {\n          this.continueJob()\n        } else {\n          this.finalizeJob()\n        }\n      })\n  }\n\n  continueJob(all = false) {\n    if(!this.limit_reached) return false\n    const lr = this.limit_reached\n    this.limit_reached = false\n\n    const eopts = { continueAt: lr.sid }\n    if(all) eopts.limit = 0\n\n    this.job_done = false\n    this.enqueue(eopts)\n  }\n\n  finalizeJob() {\n    this.limit_reached = false\n    this.job_buf.push([\"noop\"])\n    this.bufferOff()\n    this.enqueue({ cancel: true })\n  }\n\n  bufferOff(internal = false) {\n    if(this.job_bufoff_timer && !internal) {\n      console.log(\"already in loop\")\n      return\n    }\n    let continueBuffering = this.job_buf.length\n\n    while(continueBuffering && this.job_buf.length) {\n      const item = this.job_buf.shift()\n      if (item[0] == \"limit_reached\") {\n        this.setStatus(`PAUSED ${this.job_mc}/${this.job_mt}`, \"warning\", \"warning\")\n        this.continueModal()\n      } else if (item[0] == \"row\") {\n        this.job_mc++\n        this.addRowToGraph(item[1])\n        this.addRowToTable(item[1])\n        continueBuffering = false\n      }\n\n      if(!this.job_failed) {\n        if (this.job_mc >= this.job_mt || (!this.job_buf.length && this.job_done && !this.limit_reached)) {\n          this.setStatus(\"job done :)\", \"success animation-paused\", \"success\", \"check-lg text-success\")\n          this.enableChartZoom()\n          this.setChartMarkers()\n        } else if (!this.limit_reached?.updateBlock) {\n          this.setStatus(`processing... ${this.job_mc}/${this.job_mt}`, \"warning\", \"warning\")\n        }\n      } else {\n        this.enableChartZoom()\n      }\n    }\n\n    // reschedule\n    if(!this.job_buf.length) {\n      delete this.job_bufoff_timer\n      return\n    }\n\n    const tdelta = this.fetchEvery - (Date.now() - this.lastFetch)\n    let timeout = 10\n    if (tdelta > 10) {\n      timeout = Math.max(10, parseInt(tdelta / this.job_buf.length))\n    }\n\n    if(this.job_buf.length > 10)  this.timer = Math.max(this.timer - (this.job_buf.length), 10)\n    if(this.job_buf.length <= 10) this.timer = Math.min(this.timer + (this.job_buf.length), 500)\n    // console.log(\"wait\", timeout, this.job_buf.length, tdelta)\n    // let nextTimer = 300\n    // nextTimer -= this.job_buf.length * 10\n    // nextTimer = Math.max(20, nextTimer)\n    // console.log(\"wait\", nextTimer)\n    // if(this.job_buf.length > 100) nextTimer = 10\n    // if(this.job_buf.length > 10) nextTimer = 100\n    this.job_bufoff_timer = setTimeout(_ => { this.bufferOff(true) }, timeout)\n  }\n\n  postOpts() {\n    return {\n      method: \"POST\",\n      headers: {\n        \"X-CSRF-Token\": document.head.querySelector(\"meta[name=csrf-token]\")?.content,\n        Accept: \"application/json\",\n      },\n    }\n  }\n\n  enqueue(opts = {}) {\n    opts.limit ??= null\n    opts.continueAt ??= null\n\n    const urlparams = {\n      k: this.el.data(\"gatKeys\"),\n      e: 1,\n    }\n\n    if(opts.limit != null) {\n      urlparams.limit = opts.limit\n    }\n\n    if(opts.continueAt != null) {\n      urlparams.lsi = opts.continueAt\n      urlparams.j = this.job_id\n      urlparams.e = 2\n    }\n\n    if(opts.cancel) {\n      urlparams.j = this.job_id\n      urlparams.e = 666\n    } else {\n      this.setStatus(\"enqueuing job, please wait...\", \"info\", \"info\")\n    }\n\n    fetch(this.el.data(\"gatFetch\") + '?' + new URLSearchParams(urlparams), this.postOpts()).then(r => r.json()).then(json => {\n      if(json.jid) {\n        if(json.stopped) return false\n        // console.log(\"got job \" + json.jid)\n        this.setStatus(\"job enqueued, waiting for response...\", \"info\", \"info\")\n        if(json.jid == this.job_id) {\n          this.fetchUpdates()\n        } else {\n          this.fetchUpdates(json.jid, 0)\n\n          // update URL\n          const loc = URL.parse(location.href)\n          loc.searchParams.set(\"j\", json.jid)\n          window.history.replaceState(null, \"\", loc.href)\n\n          // update share links\n          document.querySelectorAll(`[data-target=\"pv-pageShareLink\"]`).forEach(el => {\n            const url = URL.parse(el.href)\n            url.searchParams.set(\"j\", json.jid)\n            el.href = url.href\n          })\n        }\n      } else {\n        this.setStatus(\"failed to enqueue job :( sorry, try again later\", \"danger\", \"danger\", \"x-lg text-danger\")\n      }\n    }).catch(err => {\n      this.setStatus(\"failed to enqueue job :( sorry, try again later\", \"danger\", \"danger\", \"x-lg text-danger\")\n      console.error(err)\n    })\n  }\n\n  hook() {\n    if (\"Chartkick\" in window) {\n      this.chartClass = window.Chartkick\n      this.hookRaw()\n    } else {\n      this.app.componentLoader.load(\"charts\").then(([c, exps]) => {\n        this.chartClass = exps.get(\"Chart\")\n        this.hookRaw()\n      })\n    }\n  }\n\n  hookRaw() {\n    this.v_loading = this.find(`[data-view=\"loading\"]`)\n    this.v_spinner = this.find(`[data-view=\"loading-spinner\"]`)\n    this.v_status = this.find(`[data-view=\"status\"]`)\n    this.v_zoomDisabled = this.find(`[data-view=\"zoomDisabled\"]`)\n    this.v_zoomEnabled = this.find(`[data-view=\"zoomEnabled\"]`)\n    this.v_data = this.find(`[data-view=\"data\"]`)\n    this.v_graph = this.find(`[data-view=\"graph\"]`)\n    this.v_table = this.find(`[data-view=\"table\"]`)\n    this.c_graph = this.v_graph.find(`canvas[data-graph]`)\n    this.c_tbody = this.v_table.find(`table tbody`)\n    this.b_resetZoom = this.find(`[data-action=\"resetGraphZoom\"]`)\n    this.b_removeConsecutives = this.find(`[data-action=\"removeConsecutiveValues\"]`)\n\n    this.b_resetZoom.click(ev => {\n      this.chart.resetZoom()\n      ev.currentTarget.blur()\n      ev.preventDefault()\n      return false\n    })\n\n    this.b_removeConsecutives.click(ev => {\n      this.removeConsecutiveValues()\n      ev.currentTarget.remove()\n      ev.preventDefault()\n      return false\n    })\n\n    if(this.el.data(\"gatJid\")) {\n      this.fetchUpdates(this.el.data(\"gatJid\"), 0)\n    } else {\n      this.enqueue()\n    }\n\n    // this.el.on(\"click\", `[data-option]`, ev => {\n    //   this.toggleOpt($(ev.currentTarget).blur())\n    //   ev.stopImmediatePropagation()\n    //   ev.preventDefault()\n    // })\n\n    // this.find(\"turbo-frame\").on(\"turbo:fetch-request-error\", ev => { this.ls.errorOccured(ev) })\n\n    // this.ls.setup()\n\n    return this\n  }\n\n  find(selector) { return this.el.find(selector) }\n\n\n  // ===============\n  // = Graph/Table =\n  // ===============\n\n  addRowToTable(row) {\n    Object.entries(row).forEach(([key, value]) => {\n      const tr = $(\"<tr>\").attr(\"data-gold\", value[0])\n      $(\"<td>\").addClass(\"text-end\").text(value[2]).appendTo(tr) // snap id\n      $(\"<td>\").addClass(\"text-nowrap\").append(\n        $(\"<span>\").addClass(\"local-time\").html(new Date(Date.parse(value[1])).toLocaleString({}, { timeZoneName: \"short\" })).attr(\"title\", value[1])\n      ).appendTo(tr) // date\n      $(\"<td>\").text(key).appendTo(tr) // value (name)\n      $(\"<td>\").addClass(\"text-nowrap text-end\").text(this.fmt.format(value[0])).attr(\"data-sotpf-bdiff\", \"gold\").appendTo(tr) // value\n      this.c_tbody.append(tr)\n\n      if(tr.prev().length) {\n        this.app.diffBalanceAb(tr.prev().get(0), tr.get(0))\n      }\n    })\n  }\n\n  setupGraph() {\n    const datasets = []\n\n    this.el.data(\"gatKeys\").split(\"|\").forEach(gkey => {\n      datasets.push({ label: gkey, data: [] })\n    })\n\n    this.chart = new this.chartClass(this.c_graph.get(0), {\n      type: 'line',\n      data: { datasets: datasets },\n      options: {\n        interaction: {\n          mode: \"nearest\",\n          axis: \"x\",\n          intersect: false,\n          position: \"nearest\",\n        },\n        scales: {\n          x: {\n            type: \"time\",\n            display: true,\n            time: { tooltipFormat: \"yyyy-MM-dd HH:mm X\" },\n          },\n          y: {\n            beginAtZero: true,\n          },\n        },\n        plugins: {\n          annotation: {\n            common: {\n              drawTime: 'beforeDatasetsDraw',\n            },\n            annotations: {\n          //     box1: {\n          //       type: 'box',\n          //       xMin: Date.parse(\"2024-02-24T11:00:00Z\"),\n          //       xMax: Date.parse(\"2024-02-26T11:00:00Z\"),\n          //       backgroundColor: 'rgba(255, 99, 132, 0.25)',\n          //       label: {\n          //         content: \"hi\",\n          //         display: true,\n          //       },\n          //     }\n            },\n          },\n          zoom: {\n            pan: {\n              enabled: true,\n              mode: \"x\",\n              onPanStart: () => { if(!this.chartHasLoaded) return false },\n            },\n            zoom: {\n              mode: \"x\",\n              // zoom options and/or events\n              drag: {\n                enabled: false,\n              },\n              wheel: {\n                enabled: false,\n              },\n            },\n            limits: {\n              x: {min: \"original\", max: \"original\"},\n              y: {min: \"original\", max: \"original\"},\n            },\n          },\n        }\n      },\n    })\n  }\n\n  removeConsecutiveValues() {\n    this.chart.data.datasets.forEach((dset, i) => {\n      const nd = []\n      dset.data.forEach(d => {\n        if (nd.length && nd[nd.length - 1].y == d.y) return\n        nd.push(d)\n      })\n      // dset.data.push({ x: value[1], y: value[0] })\n      dset.data = nd\n      this.updateChartMarkers()\n    })\n\n    this.c_tbody.find(\"tr\").each((i, el) => {\n      if(el.nextElementSibling && el.dataset.gold == el.nextElementSibling.dataset.gold) {\n        el.remove()\n      }\n    })\n  }\n\n  addRowToGraph(row) {\n    let index = 0\n    Object.entries(row).forEach(([key, value]) => {\n      // console.log(index, \"set\", key, \"v\", value[0], \"d\", value[1])\n      this.chart.data.datasets[index].data.push({ x: value[1], y: value[0] })\n      index++\n    })\n    if(index > 0) this.chart.update()\n  }\n\n  enableChartZoom() {\n    this.chartHasLoaded = true\n    this.chart.options.plugins.zoom.zoom.wheel.enabled = true\n    this.chart.update()\n    this.v_zoomDisabled.hide()\n    this.v_zoomEnabled.show()\n  }\n\n  setChartMarkers() {\n    const markers = this.el.data(\"gatMarkers\")\n    if(!markers) return\n\n    let d1 = null\n    let d2 = null\n\n    this.chart.data.datasets.forEach(dset => {\n      const fd = Date.parse(dset.data[0].x)\n      const sd = Date.parse(dset.data[dset.data.length - 1].x)\n\n      if (fd > sd) {\n        if(!d2 || fd > d2) d2 = fd\n        if(!d1 || sd < d1) d1 = sd\n      } else {\n        if(!d2 || sd > d2) d2 = sd\n        if(!d1 || fd < d1) d1 = fd\n      }\n    })\n\n    markers.forEach((marker, mi) => {\n      if(marker[0] == \"game_version\") {\n        const m_date = Date.parse(marker[2])\n        if(m_date < d1 || m_date > d2) {\n          console.log(\"out of bounds\", marker)\n          return\n        }\n\n        const anno = {\n          type: \"line\",\n          scaleID: \"x\",\n          borderWidth: 2,\n          value: m_date,\n        }\n\n        if(marker[1] == \"major\") {\n          anno.borderColor = 'rgba(255, 99, 99, 0.9)'\n        } else if (marker[1] == \"minor\") {\n          anno.borderColor = 'rgba(255, 200, 99, 0.9)'\n        } else if (marker[1] == \"patch\") {\n          anno.borderColor = 'rgba(99, 160, 99, 0.9)'\n        } else {\n          anno.borderColor = 'rgba(99, 99, 99, 0.9)'\n        }\n\n        const label = []\n\n        if(marker[3]) {\n          label.push(marker[3])\n        }\n\n        if(marker[4]) {\n          label.push(marker[4])\n        }\n\n        if(label.length) {\n          anno.label = {\n            display: (ctx) => ctx.hovered,\n            content: label.join(\"\\n\"),\n            drawTime: 'afterDatasetsDraw',\n            position: (ctx) => ctx.hoverPosition,\n          }\n          anno.label.color = anno.borderColor\n          anno.enter = (ctx, event) => {\n            ctx.hovered = true\n            ctx.hoverPosition = (event.y / ctx.chart.chartArea.height * 100) + '%'\n            ctx.chart.update()\n          }\n          anno.leave = (ctx, event) => {\n            ctx.hovered = false\n            ctx.chart.update()\n          }\n        }\n\n        this.chart.options.plugins.annotation.annotations[`marker_${mi}`] = anno\n        // [:game_version, :patch, Tue, 12 Dec 2023 14:43:50.000000000 UTC +00:00, \"2.9.2.1\", \"hotpatch\", {:game=>2, :major=>9, :minor=>2, :patch=>1}]\n        //  0              1       2                                               3          4            5\n      } else {\n        console.warning(\"unknown marker\", marker)\n      }\n    })\n\n    this.chart.update()\n  }\n\n  updateChartMarkers(updateChart = true) {\n    let d1, d2 = null\n    this.chart.data.datasets.forEach(dset => {\n      const fd = Date.parse(dset.data[0].x)\n      const sd = Date.parse(dset.data[dset.data.length - 1].x)\n\n      if (fd > sd) {\n        if(!d2 || fd > d2) d2 = fd\n        if(!d1 || sd < d1) d1 = sd\n      } else {\n        if(!d2 || sd > d2) d2 = sd\n        if(!d1 || fd < d1) d1 = fd\n      }\n    })\n\n    Object.entries(this.chart.options.plugins.annotation.annotations).forEach(([key, marker]) => {\n      if(marker.value < d1 || marker.value > d2) {\n        // console.log(\"out of bounds\", marker)\n        marker.display = false\n      }\n    })\n\n    if(updateChart) this.chart.update()\n  }\n}\n\nexport class ContinueModal extends YesNoModal {\n  init(opts = {}) {\n    super.init(opts)\n    this.singleUse()\n    this.ga = opts.ga\n    this.title = \"Continue processing?\"\n    this.dom_dialog.classList.add(\"pt-4\")\n    // this.size = \"lg\"\n    this.backdrop = \"static\"\n\n    this.result = \"no\"\n    this.setBodyContent()\n\n    this.on(\"submit\", (m, ev) => {\n      ev.preventDefault()\n      this.result = ev.submitter.value\n      this.hide()\n    })\n  }\n\n  setBodyContent() {\n    const l = this.ga.limit_reached\n    this.dom_body.innerHTML = `\n      <div class=\"text-big\">\n        <strong>${l.processed}&thinsp;/&thinsp;${l.processed + l.remaining}</strong> snapshots processed\n        (${l.remaining} remaining)\n      </div>\n      Do you want to continue processing?\n    `\n  }\n\n  btnNo(opts = {}) {\n    opts.btn = \"success\"\n    opts.label = \"I'm good\"\n    return super.btnNo(opts)\n  }\n\n  btnYes(opts = {}) {\n    opts.btn = \"primary\"\n    opts.label = \"Continue\"\n    return super.btnYes(opts)\n  }\n\n  btnYesAll(opts = {}) {\n    opts.btn ??= \"outline-primary\"\n    opts.label ??= \"Continue all\"\n    opts.value ??= \"yesAll\"\n    return super.btnYes(opts)\n  }\n\n  footerLeftContent() {\n    return this.btnYes() + this.btnYesAll()\n  }\n\n  footerRightContent() {\n    return this.btnNo()\n  }\n}\n", "import * as AppOS from \"../appos/appos\"\n\nconst DEV = false\n\nclass TracerUI {\n  constructor(app, el, opts = {}) {\n    this.app = app\n    this.el = el\n    this.opts = opts\n    this.fmt = new Intl.NumberFormat('en-US')\n\n    this.lastFetch = Date.now()\n    this.fetchEvery = 3000\n  }\n\n  setStatus(msg, spinner, textColor, sIcon) {\n    this.v_status.html(msg)\n    this.v_status.removeClass((i, c) => (c.match(/(^|\\s)text-\\S+/g) || []).join(' '))\n    if(textColor) this.v_status.addClass(\"text-\" + textColor)\n    if(spinner) this.setSpinner(spinner, sIcon)\n    return this\n  }\n\n  setSpinner(color, sIcon) {\n    this.v_spinner.removeClass(\"animation-paused\")\n    this.v_spinner.removeClass((i, c) => (c.match(/(^|\\s)text-\\S+/g) || []).join(' '))\n    this.v_spinner.addClass(\"text-\" + color)\n    if(sIcon) {\n      this.v_spinner.replaceWith($(`<i class=\"bi bi-${sIcon}\"></i>`))\n    }\n  }\n\n  showData() {\n    if(this.shown) return\n    this.shown = true\n    this.v_data.fadeIn(1000, _ => { this.shownReady = true })\n  }\n\n  fetchUpdates(jid, jri) {\n    if(jid != null) {\n      this.job_id = jid\n      this.job_buf = []\n      this.job_started = false\n      this.job_done = false\n      this.job_failed = false\n      if(jri != null) this.job_ri = jri\n      if(!this.shown) this.showData()\n    }\n\n    fetch(this.el.data(\"tracerFetch\") + '?' + new URLSearchParams({\n      j: this.job_id,\n      jri: this.job_ri,\n    }), this.postOpts()).then(r => r.json()).then(json => {\n      json.res.forEach(row => {\n        this.job_ri++\n\n        if(row == \"%JOB_STARTED%\") {\n          // console.log(\"job started\")\n          this.job_started = true\n          this.setStatus(\"job started, waiting for data...\", \"warning\", \"info\")\n        } else if (row == \"%JOB_FAILED%\") {\n          // console.log(\"job failed\")\n          this.job_failed = true\n          this.setStatus(`job failed :( sorry, try again later`, \"danger\", \"danger\", \"x-lg me-1 text-danger\")\n        } else if (row == \"%JOB_DONE%\") {\n          // console.log(\"job done\")\n          this.job_done = true\n          // if (!this.job_failed) {\n          //   this.setStatus(\"job done :)\", \"success animation-paused\", \"success\", \"check-lg text-success\")\n          // }\n        } else if (Array.isArray(row) && row[0] == \"prog\") {\n          // console.log(\"progress\", row)\n          this.job_mc = parseFloat(row[1])\n          this.job_mt = parseFloat(row[2])\n          this.setStatus(`processing... ${this.job_mc}/${this.job_mt}`, \"warning\", \"warning\")\n        } else {\n          // console.log(\"row\", row)\n          this.job_buf.push(row)\n        }\n      })\n      this.lastFetch = Date.now()\n      this.bufferOff()\n      if(!this.job_done && !this.job_failed) setTimeout(_ => { this.fetchUpdates() }, this.fetchEvery)\n    }).catch(err => {\n      this.setStatus(\"failed to gather data :( sorry, try again later\", \"danger\", \"danger\", \"x-lg me-1 text-danger\")\n      console.error(err)\n    })\n  }\n\n  bufferOff(internal = false) {\n    if(this.job_bufoff_timer && !internal) {\n      console.log(\"already in loop\")\n      return\n    }\n    let continueBuffering = this.job_buf.length\n\n    while(continueBuffering && this.job_buf.length) {\n      const item = this.job_buf.shift()\n      if (item[0] == \"row\") {\n        Object.entries(item[1]).forEach(([event, evdata]) => {\n          const tr = $(\"<tr>\")\n          const ev_date = Date.parse(evdata[0])\n          const ev_snapid = evdata[1]\n          const ev_before = evdata[2]\n          const ev_after = evdata[3]\n\n          $(\"<td>\").addClass(\"text-end\").text(ev_snapid).appendTo(tr) // snap id\n          $(\"<td>\").addClass(\"text-nowrap\").append(\n            $(\"<span>\").addClass(\"local-time\").html(new Date(ev_date).toLocaleString({}, { timeZoneName: \"short\" })).attr(\"title\", ev_date)\n          ).appendTo(tr) // date\n          $(\"<td>\").addClass(\"text-end text-info fw-bold\").text(event).appendTo(tr) // snap id\n\n          const why = [ev_before, ev_after]\n          why.forEach(sub => {\n            const ul = $(\"<ul>\").addClass(\"mb-0 text-monospace\")\n            sub.forEach(el => {\n              $(\"<li>\").html(el).appendTo(ul)\n            })\n            $(\"<td>\").append(ul).appendTo(tr) // snap id\n          })\n\n\n          this.v_out.append(tr)\n        })\n        // if(Object.keys(item[1]).length) console.log(item[1])\n        // console.log(item[1])\n        this.job_mc++\n        // this.addRowToGraph(item[1])\n        // this.addRowToTable(item[1])\n        continueBuffering = false\n        if(!this.job_failed) {\n          if (this.job_mc >= this.job_mt || (!this.job_buf.length && this.job_done)) {\n            this.setStatus(`job done :) -- ${this.job_mc}/${this.job_mt} processed`, \"success animation-paused\", \"success\", \"check-lg text-success\")\n          } else {\n            this.setStatus(`processing... ${this.job_mc}/${this.job_mt}`, \"warning\", \"warning\")\n          }\n        }\n      } else if (item[0] == \"tparams\") {\n        const tr = $(\"<tr>\").addClass(\"text-smaller\")\n        $(\"<td>\").addClass(\"text-end text-muted\").appendTo(tr)\n        $(\"<td>\").addClass(\"text-nowrap text-muted\").append(\n          $(\"<span>\").addClass(\"local-time\").html(new Date().toLocaleString({}, { timeZoneName: \"short\" }))\n        ).appendTo(tr) // date\n        $(\"<td>\").addClass(\"text-end text-info fw-bold\").text(\"tparams\").appendTo(tr) // snap id\n\n        let json = JSON.stringify(item[1], null, 2).split(\"\\n\")\n        if(json[0] == \"{\") json.shift()\n        if(json[json.length - 1] == \"}\") json.pop()\n        json = json.map(l => {\n          let ll = l.slice(2)\n          if (ll.endsWith(\",\")) ll = ll.slice(0, -1)\n          return ll\n        }).join(\"\\n\")\n\n        $(\"<td>\").attr(\"colspan\", 2).append($(\"<pre>\").addClass(\"mb-0\").append($(\"<code>\").addClass(\"text-muted\").text(json))).appendTo(tr)\n        this.v_out.append(tr)\n      } else if (item[0] == \"error\") {\n        const tr = $(\"<tr>\").addClass(\"text-small\")\n        $(\"<td>\").addClass(\"text-end text-muted\").text(item[1]).appendTo(tr)\n        $(\"<td>\").addClass(\"text-nowrap text-muted\").append(\n          $(\"<span>\").addClass(\"local-time\").html(new Date(item[2]).toLocaleString({}, { timeZoneName: \"short\" }))\n        ).appendTo(tr) // date\n        $(\"<td>\").addClass(\"text-end text-danger fw-bold\").text(\"error\").appendTo(tr) // snap id\n        $(\"<td>\").addClass(\"text-danger\").attr(\"colspan\", 2).append(`${item[3]}: ${item[4]}`).appendTo(tr)\n        this.v_out.append(tr)\n      } else {\n        console.warn(\"what is this?\", item)\n      }\n    }\n\n    // reschedule\n    if(!this.job_buf.length) {\n      delete this.job_bufoff_timer\n      return\n    }\n\n    const tdelta = this.fetchEvery - (Date.now() - this.lastFetch)\n    let timeout = 10\n    if (tdelta > 10) {\n      timeout = Math.max(10, parseInt(tdelta / this.job_buf.length))\n    }\n    if (timeout == 10 && this.job_done) timeout = 1\n    this.job_bufoff_timer = setTimeout(_ => { this.bufferOff(true) }, timeout)\n  }\n\n  postOpts() {\n    return {\n      method: \"POST\",\n      headers: {\n        \"X-CSRF-Token\": document.head.querySelector(\"meta[name=csrf-token]\")?.content,\n        Accept: \"application/json\",\n      },\n    }\n  }\n\n  hook() {\n    this.v_loading = this.find(`[data-view=\"loading\"]`)\n    this.v_spinner = this.find(`[data-view=\"loading-spinner\"]`)\n    this.v_status = this.find(`[data-view=\"status\"]`)\n    this.v_data = this.find(`[data-view=\"data\"]`)\n    this.v_out = this.find(`[data-view=\"out\"]`)\n\n    this.fetchUpdates(this.el.data(\"tracerJid\"), 0)\n\n    return this\n  }\n\n  find(selector) { return this.el.find(selector) }\n}\n\nexport { TracerUI }\n", "import * as AppOS from \"../appos/appos\"\n\nconst DEV = false\n\nconst CURRENCIES = {\n  gold: 0,\n  doubloons: 1,\n  ancient_coins: 2,\n}\nconst DELAYS = {\n  loadingFadeIn: 1600,\n  hideOlivia: 4500,\n  hideOliviaIn: 800,\n  showOlivia: 200,\n  showOliviaIn: 800,\n\n  replaceBubbleOut: 600,\n  replaceBubbleWait: 200,\n  replaceBubbleIn: 600,\n}\n\nif(DEV) {\n  Object.entries(DELAYS).forEach(([key, value]) => {\n    DELAYS[key] = 10\n  })\n}\n\nclass LoadingScreen {\n  constructor(ui) {\n    this.ui = ui\n    this.screen = this.ui.find(`[data-role=\"loading_screen\"]`)\n    this.bubble = this.ui.find(`[data-role=\"bubble-text\"]`)\n    this.c_gold = this.ui.find(`[data-displays=\"goldTotal\"]`)\n    this.c_doubloon = this.ui.find(`[data-displays=\"doubloonTotal\"]`)\n    this.c_ancient = this.ui.find(`[data-displays=\"ancientTotal\"]`)\n    this.img = this.screen.find(\"img\")\n  }\n\n  setup() {\n    this.img.on(\"load\", _ => { this.imageLoaded() })\n    this.img.on(\"error\", _ => { this.imageLoaded() })\n    this.img.attr(\"src\", this.img.data(\"src\"))\n\n    return this\n  }\n\n  imageLoaded() {\n    this.screen.fadeIn({ duration: DELAYS.loadingFadeIn, easing: \"easeOutCubic\" })\n    this.ui.loadData()\n  }\n\n  replaceSpinner(currency, error = false) {\n    const spinner = currency.find(\".spinner-grow\")\n    return new Promise((resolve, reject) => {\n      const replaceWith = error ? `<i class=\"bi bi-exclamation-triangle text-danger\"></i>` : \"0\"\n      if(spinner.length) {\n        // spinner.on(\"animationiteration\", _ => { // safari can't handle?\n          resolve(currency.css({ opacity: 0 }).html(replaceWith).fadeTo(600, 1).promise())\n        // })\n      } else {\n        resolve(currency.html(replaceWith).promise())\n      }\n    })\n  }\n\n  dataLoaded(result, settings) {\n    if(this.viewportShown) return\n    this.viewportShown = true\n    $(document).trigger(\"appos:bs5:responsiveDetails:openDefault\")\n\n    const replacedSpinners = []\n\n    this.bubble\n      .fadeTo(DELAYS.replaceBubbleOut, 0, \"easeInOutCirc\").promise()\n      .then(el => {\n        el.html(`The beyond! I can see it! ...it's all numbers?!`)\n        replacedSpinners.push(this.replaceSpinner(this.c_gold))\n        replacedSpinners.push(this.replaceSpinner(this.c_doubloon))\n        replacedSpinners.push(this.replaceSpinner(this.c_ancient))\n        return el.delay(DELAYS.replaceBubbleWait).fadeTo(DELAYS.replaceBubbleIn, 1, \"easeInOutCirc\").promise()\n      })\n      .then(el => Promise.all(replacedSpinners))\n      .then(currencies => {\n        this.ui.find(`[data-role=\"viewport\"]`).show()\n\n        return Promise.all([\n          this.ui.countValueUp(currencies[0], result.all[0] + this.ui.balance[0] + this.ui.ships[0], 3000).promise(),\n          this.ui.countValueUp(currencies[1], result.all[1] + this.ui.balance[1] + this.ui.ships[1], 3500).promise(),\n          this.ui.countValueUp(currencies[2], result.all[2] + this.ui.balance[2] + this.ui.ships[2], 4000).promise(),\n\n          // fade out olivia\n          this.screen\n            .delay(DELAYS.hideOlivia)\n            .fadeOut(DELAYS.hideOliviaIn, \"easeInOutQuad\").promise()\n            .then(el => {\n              this.ui.fixTableWidths()\n              return this.ui.find(`[data-role=\"breakdown\"]`).delay(DELAYS.showOlivia).fadeTo(DELAYS.showOliviaIn, 1, \"easeInOutQuad\").promise()\n            })\n        ])\n      })\n      // .then(currencies => {\n      //   console.log(\"all done\")\n      // })\n  }\n\n  errorOccured(ev) {\n    this.ui.find(`[data-role=\"viewport\"]`).hide()\n    this.screen.show()\n\n    this.replaceSpinner(this.c_gold, true)\n    this.replaceSpinner(this.c_doubloon, true)\n    this.replaceSpinner(this.c_ancient, true)\n\n    this.bubble\n      .fadeTo(600, 0, \"easeInOutCirc\").promise()\n      .then(el => {\n        el.addClass(\"text-danger\").html(`Oh no! This skull is mute! <small>Error occured, please come back and try again later.</small>`)\n        return el.delay(200).fadeTo(600, 1, \"easeInOutCirc\").promise()\n      })\n  }\n}\n\nclass NetWorthUI {\n  constructor(app, el, opts = {}) {\n    this.app = app\n    this.el = el\n    this.opts = opts\n    this.fmt = new Intl.NumberFormat('en-US')\n    this.sortByCurrency = 0\n    this.sortByDir = -1\n    this._throttledCalculate = AppOS.Util.debounce(async _ => await this.calculate(), 500)\n    this.ls = new LoadingScreen(this)\n  }\n\n  hook() {\n    this.el.on(\"click\", `[data-option]`, ev => {\n      this.toggleOpt($(ev.currentTarget).blur())\n      ev.stopImmediatePropagation()\n      ev.preventDefault()\n    })\n\n    this.el.on(\"click\", `[data-role=\"ul-group\"]`, ev => {\n      const t = $(ev.currentTarget)\n      const ct = $(ev.target)\n\n      if(ct.hasClass(\"bi\")) {\n        ev.preventDefault()\n        if (ct.hasClass(\"bi-check-square\")) {\n          t.next().find(`[data-option]`).each((i, el) => {\n            this.toggleOpt($(el), false)\n          })\n          this.updateGroupIndicator(t.next().find(`[data-option]`).first())\n        } else { // bi-square or bi-slash-square\n          t.next().find(`[data-option]`).each((i, el) => {\n            this.toggleOpt($(el), true)\n          })\n          this.updateGroupIndicator(t.next().find(`[data-option]`).first())\n        }\n        t.toggleClass(\"text-muted\", ct.hasClass(\"bi-square\"))\n      } else {\n\n      }\n      ev.stopImmediatePropagation()\n    })\n\n    this.el.on(\"click\", `[data-role=\"sortByColumn\"]`, ev => {\n      ev.stopImmediatePropagation()\n      ev.preventDefault()\n      const t = $(ev.currentTarget)\n      const i1 = t.find(`.bi-sort-numeric-up, .bi-sort-alpha-up`)\n      const i2 = t.find(`.bi-sort-numeric-down-alt, .bi-sort-alpha-down-alt`)\n\n      if(i1.hasClass(\"text-warning\") || i2.hasClass(\"text-warning\")) {\n        this.changeSortOrder(t.data(\"column\"), i1.hasClass(\"text-warning\") ? -1 : 1)\n      } else {\n        this.changeSortOrder(t.data(\"column\"), t.data(\"column\") == -1 ? 1 : -1)\n      }\n    })\n\n    this.find(\"turbo-frame\").on(\"turbo:fetch-request-error\", ev => { this.ls.errorOccured(ev) })\n    this.find(\"turbo-frame\").on(\"turbo:frame-missing\", ev => { this.ls.errorOccured(ev) })\n    this.find(\"turbo-frame\").on(\"turbo:frame-load\", ev => {\n      this.map = this.find(`[data-role=\"data\"]`).data(\"map\")\n      this.types = this.find(`[data-role=\"data\"]`).data(\"types\")\n      this.balance = this.find(`[data-role=\"data\"]`).data(\"balance\")\n      this.ships = this.find(`[data-role=\"data\"]`).data(\"ships\")\n      this.spinner = this.find(`[data-indicates=\"loading\"]`)\n      this.currencyIcons = this.find(`[data-role=\"data\"]`).data(\"currencyIcons\")\n      this.refreshTypesCount()\n      this.throttledCalculate()\n    })\n\n    this.ls.setup()\n\n    return this\n  }\n\n  find(selector) { return this.el.find(selector) }\n\n  // ================\n  // = Utils / Data =\n  // ================\n\n  loadData() {\n    this.find(\"turbo-frame\").removeAttr(\"loading\")\n  }\n\n  sortBy(hsh, currency, dir = -1) {\n    if (currency < 0) {\n      return Object.entries(hsh).sort((a, b) => dir < 0 ? b[1].localeCompare(a[1]) : a[1].localeCompare(b[1]))\n    } else {\n      return Object.entries(hsh).sort((a, b) => dir < 0 ? b[1][currency] - a[1][currency] : a[1][currency] - b[1][currency])\n    }\n  }\n\n\n\n  // ======================\n  // = Settings / Options =\n  // ======================\n\n  get settings() {\n    const settings = {}\n    this.find(`[data-option]`).each((i, el) => {\n      const t = $(el)\n      let key = `${t.data(\"option\")}`\n      const sub = t.data(\"tindex\")\n      if(sub !== undefined) { key += `_${sub}` }\n      settings[key] = t.find(\".bi\").hasClass(\"bi-check-square\")\n    })\n    return settings\n  }\n\n  toggleOpt(t, toggle = null) {\n    const ico = t.find(\".bi\")\n    const toggleWasNull = toggle === null\n    if(toggleWasNull) {\n      toggle = !ico.hasClass(\"bi-check-square\")\n    }\n    if (toggle) {\n      ico.removeClass(\"bi-square\").addClass(\"bi-check-square\")\n    } else {\n      ico.removeClass(\"bi-check-square\").addClass(\"bi-square\")\n    }\n    t.toggleClass(\"text-muted\", !ico.hasClass(\"bi-check-square\"))\n\n    if(t.data(\"option\") == \"includebalance\") {\n      if(ico.hasClass(\"bi-check-square\")) {\n        this.find(`[data-role=\"balance\"]`).removeClass(\"text-muted text-strike\")\n      } else {\n        this.find(`[data-role=\"balance\"]`).addClass(\"text-muted text-strike\")\n      }\n    }\n\n    if(t.data(\"option\") == \"includeships\") {\n      if(ico.hasClass(\"bi-check-square\")) {\n        this.find(`[data-role=\"ships\"]`).removeClass(\"text-muted text-strike\")\n      } else {\n        this.find(`[data-role=\"ships\"]`).addClass(\"text-muted text-strike\")\n      }\n    }\n\n    // show or hide net worth\n    if ($(`[data-option=\"includeships\"] .bi`).hasClass(\"bi-check-square\") || $(`[data-option=\"includebalance\"] .bi`).hasClass(\"bi-check-square\")) {\n      this.find(`[data-role=\"net-worth\"]`).fadeIn(500)\n    } else {\n      this.find(`[data-role=\"net-worth\"]`).fadeOut(500)\n    }\n\n    this.refreshTypesCount()\n    this.throttledCalculate()\n    if(toggleWasNull) { this.updateGroupIndicator(t) }\n  }\n\n\n\n  // ===============\n  // = Calculation =\n  // ===============\n\n  throttledCalculate() {\n    this.spinner?.css({ opacity: 1 })\n    this._throttledCalculate()\n  }\n\n  async calculate() {\n    const timeStart = Date.now()\n    const result = {\n      all: [0, 0, 0],\n      chest: {},\n      type: {},\n    }\n    const settings = this.settings\n\n    let i = 0\n    this.map.forEach(item => {\n      const [i_currency, cost, timelimited, seasonitem, i_type, i_chest] = item\n      if(!timelimited && !(settings.seasonitem && seasonitem) && !settings.obtainable) return\n      if(seasonitem && !settings.seasonitem) return\n      if(timelimited && !settings.timelimited && !(settings.seasonitem && seasonitem)) return\n\n      if(!settings[`type_${i_type}`]) return\n      result.type[this.types[i_type]] ||= [0, 0, 0]\n      result.type[this.types[i_type]][i_currency] += cost\n      const chest_name = i_chest === null ? \"No chest / Unknown\" : this.types[i_chest]\n      result.chest[chest_name] ||= [0, 0, 0]\n      result.chest[chest_name][i_currency] += cost\n      result.all[i_currency] += cost\n      i += 1\n    })\n    // console.log(\"calced\", i, \"in\", Date.now() - timeStart, result)\n\n    await this.updateUI(result, settings)\n    this.spinner?.css({ opacity: 0 })\n    // console.log(\"ui\", Date.now() - timeStart)\n  }\n\n\n\n  // ======\n  // = UI =\n  // ======\n\n  async updateUI(result, settings) {\n    this.updateCurrencyRow(this.find(`[data-role=\"balance\"]`), this.balance)\n    this.updateCurrencyRow(this.find(`[data-role=\"ships\"]`), this.ships)\n    this.updateCurrencyRow(this.find(`[data-role=\"item-worth\"]`), result.all)\n\n    const net_worth = [result.all[0], result.all[1], result.all[2]]\n    if(settings.includebalance) {\n      net_worth[0] += this.balance[0]\n      net_worth[1] += this.balance[1]\n      net_worth[2] += this.balance[2]\n    }\n    if(settings.includeships) {\n      net_worth[0] += this.ships[0]\n      net_worth[1] += this.ships[1]\n      net_worth[2] += this.ships[2]\n    }\n    this.updateCurrencyRow(this.find(`[data-role=\"net-worth\"]`), net_worth)\n    this.updateCurrencyRow(this.find(`[data-role=\"doubloon-conversion\"]`), [net_worth[1] * 200, net_worth[1], net_worth[2]])\n\n    const total_worth = [net_worth[0] + net_worth[1] * 200, 0, net_worth[2]]\n    this.updateCurrencyRow(this.find(`[data-role=\"total-worth\"]`), total_worth)\n\n    const chestTable = this.find(`[data-role=\"chest-table\"] tbody`).html(\"\")\n    this.sortBy(result.chest, this.sortByCurrency, this.sortByDir).forEach(([key, value]) => {\n      const tr = $(\"<tr>\").appendTo(chestTable)\n      $(\"<td>\").addClass(\"ps-2\").attr(\"data-currency\", \"-1\").html(key).appendTo(tr)\n      $(\"<td>\").addClass(\"px-2\").attr(\"data-currency\", \"0\").appendTo(tr)\n      $(\"<td>\").addClass(\"px-2\").attr(\"data-currency\", \"1\").appendTo(tr)\n      $(\"<td>\").addClass(\"px-2\").attr(\"data-currency\", \"2\").appendTo(tr)\n      this.updateCurrencyRow(tr, value)\n    })\n\n    const typeTable = this.find(`[data-role=\"type-table\"] tbody`).html(\"\")\n    this.sortBy(result.type, this.sortByCurrency, this.sortByDir).forEach(([key, value]) => {\n      const tr = $(\"<tr>\").appendTo(typeTable)\n      $(\"<td>\").addClass(\"ps-2\").attr(\"data-currency\", \"-1\").html(key).appendTo(tr)\n      $(\"<td>\").addClass(\"px-2\").attr(\"data-currency\", \"0\").appendTo(tr)\n      $(\"<td>\").addClass(\"px-2\").attr(\"data-currency\", \"1\").appendTo(tr)\n      $(\"<td>\").addClass(\"px-2\").attr(\"data-currency\", \"2\").appendTo(tr)\n      this.updateCurrencyRow(tr, value)\n    })\n\n    this.fixTableWidths()\n    this.ls.dataLoaded(result, settings)\n  }\n\n  fixTableWidths() {\n    const w_c0 = this.find(`[data-role=\"main-table\"] [data-currency=\"0\"]`).outerWidth()\n    const w_c1 = this.find(`[data-role=\"main-table\"] [data-ctn=\"currency-1\"]`).outerWidth()\n    const w_c2 = this.find(`[data-role=\"main-table\"] [data-currency=\"2\"]`).outerWidth()\n    this.find(`[data-currency]`).css({ minWidth: `auto` })\n    if(w_c0 > 0) {\n      this.find(`[data-currency=\"0\"]`).css({ minWidth: `${Math.ceil(w_c0)}px` })\n    }\n    if(w_c1 > 0) {\n      this.find(`[data-currency=\"1\"]`).css({ minWidth: `${Math.ceil(w_c1)}px` })\n    }\n    if(w_c2 > 0) {\n      this.find(`[data-currency=\"2\"]`).css({ minWidth: `${Math.ceil(w_c2)}px` })\n    }\n\n\n    const maxWidth = Math.max.apply(null, this.find('[data-currency=\"-1\"]').map((i, el) => $(el).outerWidth()).get())\n    this.find('[data-currency=\"-1\"]').css({ minWidth: `${Math.ceil(maxWidth)}px` })\n    // console.log(w_c1)\n    // this.find(`[data-role=\"chest-table\"] tbody`)\n  }\n\n  updateCurrencyRow(row, values, size = 20) {\n    const r0 = row.find(`[data-currency=\"0\"]`)\n    const r1 = row.find(`[data-currency=\"1\"]`)\n    const r2 = row.find(`[data-currency=\"2\"]`)\n    r0.attr(\"data-value\", values[0]).html(`<div class=\"d-inline-flex align-items-center font-monospace\">${this.fmt.format(values[0])} <img src=\"${this.currencyIcons[0]}\" class=\"p-0 ms-1\" width=\"${r0.data(\"size\") || size}\" height=\"${r0.data(\"size\") || size}\"></div>`)\n    r1.attr(\"data-value\", values[1]).html(`<div class=\"d-inline-flex align-items-center font-monospace\">${this.fmt.format(values[1])} <img src=\"${this.currencyIcons[1]}\" class=\"p-0 ms-1\" width=\"${r1.data(\"size\") || size}\" height=\"${r1.data(\"size\") || size}\"></div>`)\n    r2.attr(\"data-value\", values[2]).html(`<div class=\"d-inline-flex align-items-center font-monospace\">${this.fmt.format(values[2])} <img src=\"${this.currencyIcons[2]}\" class=\"p-0 ms-1\" width=\"${r2.data(\"size\") || size}\" height=\"${r2.data(\"size\") || size}\"></div>`)\n  }\n\n  refreshTypesCount() {\n    let total = 0\n    let active = 0\n    this.find(`[data-tindex]`).each((i, el) => {\n      total += 1\n      if ($(el).find(\".bi\").hasClass(\"bi-check-square\")) active += 1\n    })\n    this.find(`[data-indicates=\"total_types\"]`).html(total)\n    this.find(`[data-indicates=\"active_types\"]`).html(active)\n  }\n\n  updateGroupIndicator(t) {\n    const grp_indicator = t.closest(`details[data-role=\"ul-group-ctn\"]`).find(`[data-role=\"ul-group\"]`)\n    if(grp_indicator.length) {\n      const grp_ico = grp_indicator.find(`.bi`)\n      const total = grp_indicator.next().find(`[data-option] .bi`).length\n      const active = grp_indicator.next().find(`[data-option] .bi-check-square`).length\n\n      if(active == 0) {\n        grp_ico.removeClass(\"bi-slash-square bi-check-square\").addClass(\"bi-square\")\n        grp_indicator.addClass(\"text-muted\")\n      } else if (active < total) {\n        grp_ico.removeClass(\"bi-square bi-check-square\").addClass(\"bi-slash-square\")\n        grp_indicator.removeClass(\"text-muted\")\n      } else {\n        grp_ico.removeClass(\"bi-square bi-slash-square\").addClass(\"bi-check-square\")\n        grp_indicator.removeClass(\"text-muted\")\n      }\n    }\n  }\n\n  countValueUp(el, value, duration = 2000) {\n    return $({ counter: 0 }).delay(1000).animate({ counter: 100 }, {\n      duration: duration,\n      easing: 'slowEaseOutExpo',\n      step: n => {\n        el.text(this.fmt.format(Math.ceil((value / 100) * n)))\n        // el.text(n)\n      }\n    })\n  }\n\n  changeSortOrder(col, dir = -1) {\n    const [c1, c2] = dir < 0 ? [\"text-warning\", \"text-muted\"] : [\"text-muted\", \"text-warning\"]\n    this.find(`[data-role=\"sortByColumn\"][data-column] .bi`).removeClass(\"text-warning\").addClass(\"text-muted\")\n    const rowCol = this.find(`[data-role=\"sortByColumn\"][data-column=\"${col}\"]`)\n    rowCol.find(`.bi-sort-numeric-up, .bi-sort-alpha-up`).removeClass(c1).addClass(c2)\n    rowCol.find(`.bi-sort-numeric-down-alt, .bi-sort-alpha-down-alt`).removeClass(c2).addClass(c1)\n    this.sortByCurrency = col\n    this.sortByDir = dir\n\n    $(`tbody[data-sortable-target]`).each((i, el) => {\n      const tbody = $(el)\n      let items = tbody.find(\"tr\").get()\n      items.sort((a, b) => {\n        const [c, d] = [$(a).find(`td[data-currency=\"${col}\"]`), $(b).find(`td[data-currency=\"${col}\"]`)]\n        if(col < 0) {\n          return dir < 0 ? d.text().localeCompare(c.text()) : c.text().localeCompare(d.text())\n        } else {\n          return dir < 0 ? d.data(\"value\") - c.data(\"value\") : c.data(\"value\") - d.data(\"value\")\n        }\n      })\n\n      items.forEach(item => { tbody.append(item) })\n    })\n  }\n}\n\nexport { NetWorthUI }\n", "import * as AppOS from \"../appos/appos\"\n\nclass EmoteLoadoutUI {\n  constructor(app, el, opts = {}) {\n    this.app = app\n    this.el = el\n    this.opts = opts\n    this.fmt = new Intl.NumberFormat('en-US')\n  }\n\n  hook() {\n    this.v_pagenav = this.find(`[data-role=\"page-selector\"]`)\n    this.v_pages = this.find(`[data-role=\"pages\"]`)\n    this.v_wheel_currentPage = this.find(`[data-role=\"wheelCurrentPage\"]`)\n    this.v_emote_ctn = this.find(`[data-role=\"emotes\"]`)\n    this.v_emote_search = this.find(`[data-role=\"emotes-search\"]`)\n    this.v_emote_search_q = this.find(`[data-flist-q=\"emote\"]`)\n    this.v_emote_list = this.find(`[data-role=\"emotes-list\"]`)\n    this.i_toggle_hideEquipped = this.find(`[data-input=\"toggleHideEquipped\"]`)\n\n    this.v_keyhelp = this.find(`[data-role=\"keyHelp\"]`)\n    this.v_help_modal = this.find(`[data-role=\"loadout:helpModal\"]`)\n    this.v_io_modal = this.find(`[data-role=\"loadout:ioModal\"]`)\n    this.v_io_modal_interface = this.find(`[data-role=\"loadout:io:interface\"]`)\n    this.v_io_modal_apply = this.find(`[data-role=\"loadout:io:apply\"]`)\n\n    this.b_loadout_save = this.find(`[data-ld-act=\"loadout:save\"]`)\n    this.b_loadout_save_msg = this.find(`[data-ld-act=\"loadout:save\"] span`)\n    this.b_loadout_import_export = this.find(`[data-ld-act=\"loadout:import_export\"]`)\n    this.b_loadout_help = this.find(`[data-ld-act=\"loadout:help\"]`)\n    this.form = this.find(`[data-role=\"loadout:updateForm\"]`)\n    this.form_input = this.form.find(`[data-role=\"loadout:updateFormValue\"]`)\n\n    this.loadout = this.el.data(\"emoteLoadout\")\n    this.emotes = this.el.data(\"emoteList\")\n\n    this.b_loadout_import_export.click(ev => {\n      ev.currentTarget.blur()\n      bootstrap.Modal.getOrCreateInstance(this.v_io_modal).show()\n      this.v_io_modal_interface.val(JSON.stringify(this.loadout))\n      return false\n    })\n\n    this.b_loadout_help.click(ev => {\n      ev.currentTarget.blur()\n      bootstrap.Modal.getOrCreateInstance(this.v_help_modal).show()\n      return false\n    })\n\n    this.v_io_modal_apply.click(ev => {\n      let newLD = null\n      try {\n        newLD = JSON.parse(this.v_io_modal_interface.val())\n      } catch(e) {\n        console.error(e)\n        alert(\"FAILED: \" + e.message)\n        return\n      }\n      this.loadout = newLD\n      this.unsavedChanges()\n      this.updateEmotesInTable()\n      this.selectPage(0)\n      this.showKeyHelp()\n      bootstrap.Modal.getOrCreateInstance(this.v_io_modal).hide()\n    })\n\n    this.find(`[data-role=\"loadout:io:ahk:enable\"`).click(ev => {\n      this.find(`[data-role=\"loadout:io:ahk:disabled\"`).addClass(\"d-none\")\n      this.find(`[data-role=\"loadout:io:ahk:enabled\"`).removeClass(\"d-none\")\n    })\n    this.find(`[data-role=\"loadout:io:ahk:equip\"`).click(ev => {\n      this.downloadAhk(this.toEquipAHK().join(\"\\n\"), \"sot_equip_emotes_READ_CONTENTS_BEFORE_RUNNING.ahk\")\n    })\n    this.find(`[data-role=\"loadout:io:ahk:hotstrings\"`).click(ev => {\n      this.downloadAhk(this.toHotstringAHK().join(\"\\n\"), \"sot_emote_hotstrings_READ_CONTENTS_BEFORE_RUNNING.ahk\")\n    })\n    this.find(`[data-role=\"loadout:io:ahk:hotstringsPlugin\"`).click(ev => {\n      this.downloadAhk(this.toHotstringAHK(true).join(\"\\n\"), \"emote_hotstrings_PLUGIN_READ_CONTENTS_BEFORE_RUNNING.ahk\")\n    })\n\n    this.find(`[data-action=\"loadout:selectPage\"]`).click(ev => {\n      ev.currentTarget.blur()\n      this.selectPage(ev.currentTarget.dataset.page)\n      ev.preventDefault()\n    })\n\n    this.v_emote_list.on(\"flist:postFilter\", ev => {\n      if(this.activeSlot.length) {\n        this.v_emote_list.find(`.last-clicked[data-flist-entry]`).each((i, el) => {\n          $(el).removeClass(\"last-clicked\").trigger(\"srec:unclicked\")\n        })\n        this.v_emote_list.find(`[data-flist-entry]:visible`).first().addClass(\"last-clicked\").trigger(\"srec:clicked\")\n      }\n    })\n\n    this.b_loadout_save.click(ev => {\n      ev.currentTarget.blur()\n      this.saveLoadout()\n      return false\n    })\n\n    this.i_toggle_hideEquipped.click(ev => {\n      const t = $(ev.currentTarget)\n      const ico = t.find(\"i\")\n      this.v_emote_list.toggleClass(\"hide-equipped\")\n      t.toggleClass(\"text-warning\")\n      ico.toggleClass(\"bi-eye bi-eye-slash\")\n      t.blur()\n      return false\n    })\n\n    this.v_emote_search_q.on(\"blur\", ev => {\n      const activeWheelSlot = this.activeSlot\n      if(activeWheelSlot.length) this.deactivateWheelSlot(activeWheelSlot)\n    })\n\n    this.v_pages.on(\"srec:clicked\", \"[data-sotid]\", ev => { this.slotSelected(ev.currentTarget) })\n    this.v_pages.on(\"srec:unclicked\", \"[data-sotid]\", ev => { this.slotDeselected(ev.currentTarget) })\n\n    this.app.input?.onKeydownThisPage(ev => this.keyboardEvent(ev))\n\n    this.buildEmoteList()\n    this.selectPage(0)\n    this.showKeyHelp()\n\n    return this\n  }\n\n  toHotstringAHK(scriptPlugin = false, buf = []) {\n    if(scriptPlugin) {\n      buf.push(`; THIS IS SUPPOSED TO BE REQUIRED IN YOUR custom.ahk LIKE THIS (copy to your custom folder):`)\n      buf.push(`;    #Include custom/emote_hotstrings.ahk`)\n      buf.push(`; IF YOU DON'T KNOW WHAT custom MEANS THEN YOU DON'T NEED THE PLUGIN VERSION`)\n    } else {\n      buf.push(`; IMPORTANT: CHECK YOUR KEYBINDS AND CHANGE IF NEEDED!`)\n      buf.push(``)\n      buf.push(`IGB_Emote_Wheel    := \"z\"`)\n      buf.push(`IGB_Emote_NextPage := \"f\"`)\n      buf.push(``)\n      buf.push(``)\n      buf.push(`; End of config`)\n      buf.push(`Menu, Tray, Tip, SoT Emote Hotstrings`)\n      buf.push(`Return`)\n      buf.push(``)\n      buf.push(`; Emote helper`)\n      buf.push(`DoEmote(Page, Slot, Delay = 175) {`)\n      buf.push(`  global`)\n      buf.push(`  sleep Delay`)\n      buf.push(`  Send {%IGB_Emote_Wheel% down}`)\n      buf.push(`  sleep 200`)\n      buf.push(`  Page := Page - 1`)\n      buf.push(`  Loop, %Page% {`)\n      buf.push(`    Send {%IGB_Emote_NextPage%}`)\n      buf.push(`  }`)\n      buf.push(`  Send {%Slot%}`)\n      buf.push(`  Send {%IGB_Emote_Wheel% up}`)\n      buf.push(`}`)\n      buf.push(``)\n      buf.push(`; Hotstrings`)\n    }\n    buf.push(``)\n\n    this.loadout.pages.forEach((page, pi) => {\n      page.forEach((row, ri) => {\n        if(!row) return\n        let name = row\n        if(Array.isArray(row)) name = row[0]\n\n        const [p, r, c] = this.fati2prc(this.emotes[name][2])\n        const hstrings = this.loadout.hotstrings[name]\n\n        if(hstrings?.length) {\n          hstrings.forEach(hstring => {\n            buf.push(`; [${pi + 1}/${ri + 1}] ${name} (ingame location: P${p} R${r} C${c})`)\n            buf.push(`:Zb0*?:${hstring}::`)\n            buf.push(`  DoEmote(${pi + 1}, ${ri + 1})`)\n            buf.push(`  return`)\n            buf.push(``)\n          })\n        } else {\n          buf.push(`; [${pi + 1}/${ri + 1}] ${name} (ingame location: P${p} R${r} C${c})`)\n          buf.push(``)\n        }\n      })\n    })\n\n    return buf\n  }\n\n  toEquipAHK(scriptPlugin = false, buf = []) {\n    // collect emotes\n    let toEquip = []\n    this.loadout.pages.forEach((page, pi) => {\n      page.forEach((row, ri) => {\n        if(!row) return\n        let name = row\n        if(Array.isArray(row)) name = row[0]\n\n        toEquip.push([this.emotes[name][2], name, pi + 1, ri + 1])\n      })\n    })\n    toEquip = toEquip.sort((a, b) => a[0] - b[0])\n\n    // script header\n    buf.push(`; This script is to equip your emotes (from scratch)`)\n    buf.push(`;   1. Check your bindings, then start script`)\n    buf.push(`;   2. Open vanity chest, go to emote tab (first page)`)\n    buf.push(`;   3. Start by pressing F5`)\n    buf.push(`;   4. Wait (hold F5 to cancel), profit`)\n    // show message to go to emote tab (first page)\n\n    buf.push(``)\n    buf.push(`; Key Bindings`)\n    buf.push(`IGB_Slot_Equip          := \"Enter\"`)\n    buf.push(`IGB_Slot_Unequip        := \"1\"`)\n    buf.push(`IGB_Slot_EquipNextPage  := \"1\"`)\n    buf.push(`IGB_InvPagePrev         := \"PgUp\"`)\n    buf.push(`IGB_InvPageNext         := \"PgDn\"`)\n    buf.push(`IGB_Left                := \"Left\"`)\n    buf.push(`IGB_Up                  := \"Up\"`)\n    buf.push(`IGB_Right               := \"Right\"`)\n    buf.push(`IGB_Down                := \"Down\"`)\n    buf.push(``)\n\n    buf.push(``)\n    buf.push(`; End of config`)\n    buf.push(`#MaxThreadsPerHotkey, 1`)\n    buf.push(`#SingleInstance Force`)\n    buf.push(`#NoEnv`)\n    buf.push(`setkeydelay, 200`)\n    buf.push(`SetWorkingDir A_ScriptDir`)\n    buf.push(`Menu, Tray, Tip, SoT Emote Equip`)\n    buf.push(`MsgBox, 0, , 1. Go to your vanity chest\\`n2. Navigate to the emote tab\\`n3. Close this box and press F5 and wait\\`n(hold F5 to cancel), 30`)\n    buf.push(`Return`)\n\n\n    buf.push(``)\n    buf.push(`; bind equip routine`)\n    // buf.push(`F5::`)\n    // buf.push(`  EquipEmote(3, 6)`)\n    // buf.push(`  return`)\n    buf.push(`F5::`)\n    buf.push(`  SplashTextOn, 400, 20, please wait, no touchy!`)\n    buf.push(`  Sleep 500`)\n    buf.push(`  GoSub EquipEmoteRoutine`)\n    buf.push(`  return`)\n    buf.push(``)\n    buf.push(``)\n    buf.push(`; Emote Equip helper`)\n    buf.push(`EquipEmote(Page, Slot) {`)\n    buf.push(`  global`)\n    buf.push(`  sleep 200`)\n    buf.push(`  ; Unequip & equip`)\n    buf.push(`  Send {%IGB_Slot_Unequip%}`)\n    buf.push(`  Send {%IGB_Slot_Equip%}`)\n    buf.push(`  sleep 200`)\n    buf.push(`  `)\n    buf.push(`  ; go to page`)\n    buf.push(`  Page := Page - 1`)\n    buf.push(`  Loop, %Page% {`)\n    buf.push(`    Send {%IGB_Slot_EquipNextPage%}`)\n    buf.push(`  }`)\n    buf.push(`  `)\n    buf.push(`  ; equip to slot`)\n    // buf.push(`  Send {%Slot%}`)\n    buf.push(`  if (Slot = 1)`)\n    buf.push(`    Send {%IGB_Up%}`)\n    buf.push(`  if (Slot = 2)`)\n    buf.push(`    Send {%IGB_Up%}{%IGB_Right%}`)\n    buf.push(`  if (Slot = 3)`)\n    buf.push(`    Send {%IGB_Right%}`)\n    buf.push(`  if (Slot = 4)`)\n    buf.push(`    Send {%IGB_Right%}{%IGB_Down%}`)\n    buf.push(`  if (Slot = 5)`)\n    buf.push(`    Send {%IGB_Down%}`)\n    buf.push(`  if (Slot = 6)`)\n    buf.push(`    Send {%IGB_Down%}{%IGB_Left%}`)\n    buf.push(`  if (Slot = 7)`)\n    buf.push(`    Send {%IGB_Left%}`)\n    buf.push(`  if (Slot = 8)`)\n    buf.push(`    Send {%IGB_Left%}{%IGB_Up%}`)\n    buf.push(`  Send {%IGB_Slot_Equip%}`)\n    buf.push(`  sleep 200`)\n    buf.push(`}`)\n\n    // stop routine check\n    buf.push(``)\n    buf.push(`; Stop routine`)\n    buf.push(`RoutineBreakpoint(ptr) {`)\n    buf.push(`  if !GetKeyState(\"F5\", \"P\")`)\n    buf.push(`    return`)\n    buf.push(`  SplashTextOff`)\n    buf.push(`  MsgBox, 0, , Execution stopped (%ptr%). Script will exit, 10`)\n    buf.push(`  ExitApp`)\n    buf.push(`  return`)\n    buf.push(`}`)\n\n\n    // equip routine\n    let ptr = [1, 1, 1]\n    let delta = 0\n    let imax = toEquip.length\n    buf.push(``)\n    buf.push(`; Equip routine`)\n    buf.push(`EquipEmoteRoutine:`)\n    buf.push(`  ; ensure top left`)\n    buf.push(`  Send {Left 6}{Up 6}`)\n    buf.push(`  sleep 300`)\n    buf.push(`  `)\n\n\n\n    toEquip.forEach(([idx, name, px, sx], i) => {\n      const [p, r, c] = this.fati2prc(idx)\n      buf.push(`  ; (idx ${idx} p ${ptr[0]}/${p} r ${ptr[1]}/${r} c ${ptr[2]}/${c}) ~[${i+1}/${imax}] @[${px}/${sx}] ${name}`)\n      buf.push(`  SplashTextOn, 400, 20, Equipping ${i+1}/${imax}, [${px}/${sx}] ${name.replaceAll(/[^a-z0-9\\s]+/gi, \"\")}`)\n\n      // move pointer\n\n      // page\n      if(ptr[0] > p) {\n        buf.push(`  Send {%IGB_InvPagePrev% ${ptr[1] - r}}`)\n        ptr[0] = p\n      } else if(ptr[0] < p) {\n        // move pointer back to top left or it breaks when next page isn't full\n        if(ptr[1] > 1) {\n          buf.push(`  Send {%IGB_Up% ${ptr[1] - 1}}`)\n          ptr[1] = 1\n        }\n        if(ptr[2] > 1) {\n          buf.push(`  Send {%IGB_Left% ${ptr[2] - 1}}`)\n          ptr[2] = 1\n        }\n\n        buf.push(`  Send {%IGB_InvPageNext% ${p - ptr[0]}}`)\n        ptr[0] = p\n      }\n\n      // col\n      if(ptr[2] > c) {\n        buf.push(`  Send {%IGB_Left% ${ptr[2] - c}}`)\n        ptr[2] = c\n      } else if(ptr[2] < c) {\n        buf.push(`  Send {%IGB_Right% ${c - ptr[2]}}`)\n        ptr[2] = c\n      }\n\n      // row\n      if(ptr[1] > r) {\n        buf.push(`  Send {%IGB_Up% ${ptr[1] - r}}`)\n        ptr[1] = r\n      } else if(ptr[1] < r) {\n        buf.push(`  Send {%IGB_Down% ${r - ptr[1]}}`)\n        ptr[1] = r\n      }\n\n      // equip\n      buf.push(`  EquipEmote(${px}, ${sx})`)\n      buf.push(`  RoutineBreakpoint(\"${i+1}/${imax}\")`)\n    })\n\n    buf.push(`  SplashTextOff`)\n    buf.push(`  MsgBox, 0, , All done (hopefully). Script will exit and you may delete it`)\n    buf.push(`  ExitApp`)\n    buf.push(`  return`)\n    return buf\n  }\n\n  get currentPage() {\n    return this.v_pagenav.find(`.nav-link.active`).data(\"page\")\n  }\n\n  get slots() {\n    return this.v_pages.find(`[data-slot]`)\n  }\n\n  get selectedSlot() {\n    return this.v_pages.find(`.last-clicked[data-slot]`)\n  }\n\n  get activeSlot() {\n    return this.v_pages.find(`.emote-select-active[data-slot]`)\n  }\n\n  saveLoadout() {\n    this.b_loadout_save_msg.text(\"saving\")\n    this.b_loadout_save.removeClass((i, c) => (c.match(/(^|\\s)btn-\\S+/g) || []).join(' ')).addClass(\"btn-info\")\n    this.form_input.val(JSON.stringify(this.loadout))\n    this.form.submit()\n  }\n\n  unsavedChanges() {\n    this.b_loadout_save_msg.text(\"unsaved changes\")\n    this.b_loadout_save.removeClass((i, c) => (c.match(/(^|\\s)btn-\\S+/g) || []).join(' ')).addClass(\"btn-warning\")\n  }\n\n  slot(num) {\n    return this.v_pages.find(`[data-slot=${num}]`)\n  }\n\n  showKeyHelp(scope = \"default\") {\n    this.v_keyhelp.find(\"[data-key-help]\").hide()\n    this.v_keyhelp.find(`[data-key-help=\"${scope}\"]`).show()\n  }\n\n  slotFor(qname) {\n    let res = false\n    this.loadout.pages.forEach((page, pi) => {\n      if(res) return\n      page.forEach((row, ri) => {\n        let name = row\n        if(Array.isArray(row)) name = row[0]\n        if(name == qname) return res = [pi, ri]\n      })\n    })\n    return res\n  }\n\n  static arrowMap = { // left,up,right,down\n    \"default\": [6, 0, 2, 4],\n    \"0\": [7, null, 1, 1],\n    \"1\": [7, 0, 2, 2],\n    \"2\": [6, 1, 3, 3],\n    \"3\": [5, 2, 4, 4],\n    \"4\": [5, 5, 3, null],\n    \"5\": [6, 6, 3, 4],\n    \"6\": [7, 7, 2, 5],\n    \"7\": [0, 0, 1, 6],\n  }\n\n  keyboardEvent(ev) {\n    console.log(ev.keyCode, ev.code, ev.key, ev.keyCode - 37)\n    if(ev.target.tagName == \"TEXTAREA\") return\n\n    if(ev.target.classList.contains(\"hstring-edit\")) {\n      if (ev.code == \"Enter\") {\n        const inp = $(ev.target)\n        const slot = inp.closest(`[data-slot]`)\n        const newHstrings = inp.val().split(/\\s+/).filter(e => e)\n        const targetEmote = slot.data(\"selectedEmote\")\n        if(newHstrings.length) {\n          this.loadout.hotstrings[targetEmote] = newHstrings\n        } else {\n          delete this.loadout.hotstrings[targetEmote]\n        }\n        this.unsavedChanges()\n        ev.target.blur()\n        this.renderSlot(slot, targetEmote)\n        this.updateEmoteInTable(targetEmote)\n        ev.preventDefault()\n        return false\n      }\n      return\n    }\n\n    if(ev.keyCode >= 37 && ev.keyCode <= 40) { // arrow keys\n      const dir = ev.keyCode - 37\n      const activeWheelSlot = this.activeSlot\n      if(activeWheelSlot.length) { // emote list (in select)\n        const selectedEmoteEntry = this.v_emote_list.find(`.last-clicked[data-flist-entry]`)\n        if(!selectedEmoteEntry.length) return\n        if(ev.keyCode == 38) { // up\n          const prev = selectedEmoteEntry.prevAll(\":visible\").first()\n          if(prev.length) {\n            selectedEmoteEntry.click()\n            prev.click()\n            prev.get(0).scrollIntoView({block: \"nearest\", inline: \"nearest\"})\n          }\n          ev.preventDefault()\n          return false\n        } else if(ev.keyCode == 40) { // down\n          const prev = selectedEmoteEntry.nextAll(\":visible\").first()\n          if(prev.length) {\n            selectedEmoteEntry.click()\n            prev.click()\n            prev.get(0).scrollIntoView({block: \"nearest\", inline: \"nearest\"})\n          }\n          ev.preventDefault()\n          return false\n        }\n        return\n      } else if (ev.target.tagName == \"INPUT\") {\n        return\n      } else { // wheel\n        const ss = this.selectedSlot\n        if(ss.length) {\n          const si = ss.data(\"slot\")\n          const amap = this.constructor.arrowMap[si]?.[dir]\n          if(amap != null) { this.slot(amap).click() }\n        } else {\n          this.slot(this.constructor.arrowMap.default[dir]).click()\n        }\n      }\n      ev.preventDefault()\n      return false\n    } else if (ev.code == \"PageUp\") {\n      const cp = this.currentPage\n      if(ev.shiftKey) {\n        if(cp != 0) this.selectPage(0)\n      } else {\n        if(cp > 0) { this.selectPage(cp - 1) }\n      }\n      ev.preventDefault()\n      return false\n    } else if (ev.code == \"PageDown\") {\n      const cp = this.currentPage\n      if(ev.shiftKey) {\n        const mp = this.loadout.pages.length - 1\n        if(cp != mp) this.selectPage(mp)\n      } else {\n        if(cp < 9) { this.selectPage(cp + 1) }\n      }\n      ev.preventDefault()\n      return false\n    } else if (ev.target.tagName != \"INPUT\" && (ev.code == \"Delete\" || ev.code == \"Backspace\")) {\n      if(ev.shiftKey) {\n        this.slots.each((i, slot) => {\n          this.unequipSlot($(slot))\n        })\n      } else {\n        const sels = this.selectedSlot\n        if(sels.length) this.unequipSlot(sels)\n      }\n      ev.preventDefault()\n    } else if (ev.code == \"KeyH\" && ev.target.tagName != \"INPUT\" && this.selectedSlot.length) {\n      const selectedWheelSlot = this.selectedSlot\n      if(!selectedWheelSlot.data(\"selectedEmote\")) return\n      const outer = selectedWheelSlot.find(`[data-slot-v=\"hstringEditOuter\"]`)\n      const inp = $(\"<input>\").attr(\"type\", \"text\").addClass(\"position-absolute form-control text-smaller hstring-edit\")\n      const hstrings = this.loadout.hotstrings[selectedWheelSlot.data(\"selectedEmote\")]\n      outer.removeClass(\"d-none\")\n      inp.blur(ev => {\n        if(!selectedWheelSlot.hasClass(\"last-clicked\")) selectedWheelSlot.click()\n        this.showKeyHelp(selectedWheelSlot.data(\"selectedEmote\") ? \"wheelSlot\" : \"wheelSlotEmpty\")\n        inp.remove()\n        outer.addClass(\"d-none\")\n      })\n      this.showKeyHelp(\"hstringsEdit\")\n      inp.appendTo(outer)\n      inp.val(hstrings ? hstrings.join(\" \") : \"\").focus()\n      ev.preventDefault()\n      return false\n    } else if (ev.code == \"Enter\") {\n      const selectedWheelSlot = this.selectedSlot\n      const activeWheelSlot = this.activeSlot\n      if(selectedWheelSlot.length && !activeWheelSlot.length) {\n        this.activateWheelSlot(selectedWheelSlot)\n        return false\n      } else if (activeWheelSlot.length) {\n        const selectedEmoteEntry = this.v_emote_list.find(`.last-clicked[data-flist-entry]`)\n        if(selectedEmoteEntry.length) {\n          this.equipSlot(activeWheelSlot, selectedEmoteEntry.data(\"emote\"))\n          this.deactivateWheelSlot(activeWheelSlot)\n        } else {\n          console.log(\"???? no emote selected but enter pressed\")\n          this.deactivateWheelSlot(activeWheelSlot)\n        }\n      }\n    } else if(ev.code.match(/^Digit[0-9]$/) && ev.target.tagName != \"INPUT\") {\n      if(ev.ctrlKey || ev.metaKey) return\n      let num = parseInt(ev.code.match(/^Digit([0-9])$/)[1])\n      if(num == 0) num = 10\n\n      const activeWheelSlot = this.activeSlot\n      if(activeWheelSlot.length) { // emote list (in select)\n\n      } else { // wheel\n        if(ev.shiftKey) {\n          this.selectPage(num - 1)\n        } else if (num <= 8) {\n          this.slot(num - 1).click()\n        }\n      }\n      ev.preventDefault()\n      return false\n    }\n  }\n\n  getSlotForName(name) {\n    let coord = false\n    this.loadout.pages.forEach((page, pi) => {\n      page.forEach((emote, si) => {\n        if(Array.isArray(emote)) {\n          if(emote[0] == name) return coord = [pi, si]\n        } else {\n          if(emote == name) return coord = [pi, si]\n        }\n      })\n    })\n    return coord\n  }\n\n  equipSlot(slot, name) {\n    const pnum = this.currentPage\n    const snum = slot.data(\"slot\")\n    const page = this.loadout.pages[this.currentPage]\n\n    const currentPos = this.getSlotForName(name)\n    if(currentPos) {\n      if(currentPos[0] == this.currentPage) {\n        this.unequipSlot(this.slot(currentPos[1]))\n      } else {\n        this.loadout.pages[currentPos[0]][currentPos[1]] = null\n      }\n    }\n\n    if(page[snum]) this.unequipSlot(slot)\n\n    page[snum] = name\n    this.renderSlot(slot, name)\n    this.updateEmoteInTable(name)\n    this.unsavedChanges()\n  }\n\n  unequipSlot(slot) {\n    const name = slot.data(\"selectedEmote\")\n    const page = this.loadout.pages[this.currentPage]\n    const snum = slot.data(\"slot\")\n    page[snum] = null\n    this.renderSlot(slot, null)\n    this.updateEmoteInTable(name)\n    this.unsavedChanges()\n  }\n\n  activateWheelSlot(slot) {\n    this.showKeyHelp(\"wheelSlotActive\")\n    slot.addClass(\"emote-select-active\")\n    this.v_emote_list.trigger(\"flist:postFilter\")\n    this.v_emote_search_q.focus().select()\n  }\n\n  deactivateWheelSlot(slot) {\n    this.v_emote_search_q.get(0).blur()\n    this.v_emote_list.find(`.last-clicked[data-flist-entry]`).click()\n    slot.removeClass(\"emote-select-active\")\n    if(!slot.hasClass(\"last-clicked\")) slot.click()\n    this.showKeyHelp(slot.data(\"selectedEmote\") ? \"wheelSlot\" : \"wheelSlotEmpty\")\n  }\n\n  slotSelected(slot) {\n    console.log(\"selected\", slot)\n    this.showKeyHelp($(slot).data(\"selectedEmote\") ? \"wheelSlot\" : \"wheelSlotEmpty\")\n  }\n\n  slotDeselected(t) {\n    if(!this.activeSlot.length) this.showKeyHelp()\n    //disable buttons\n    console.log(\"deselected\", t)\n  }\n\n  updateEmoteInTable(name) {\n    const em = this.v_emote_list.find(`[data-emote=\"${name}\"]`)\n    const sf = this.slotFor(name)\n    if(sf) {\n      em.addClass(\"emote-equipped\")\n      em.find(`[data-slot-v=\"equippedSlot\"]`).html(`${sf[0] + 1}&thinsp;/&thinsp;${sf[1] + 1}`)\n    } else {\n      em.removeClass(\"emote-equipped\")\n      em.find(`[data-slot-v=\"equippedSlot\"]`).html(\"\")\n    }\n\n    const hstrings = this.loadout.hotstrings[name]\n    if(hstrings) {\n      const slot_hstrings = em.find(`[data-slot-v=\"hotstrings\"]`).html(\"\")\n      hstrings.forEach(hs => {\n        const span = $(\"<span>\").addClass(\"me-1 badge bg-dark\").text(hs)\n        slot_hstrings.append(span)\n      })\n    }\n  }\n\n  downloadAhk(payload, filename = \"download.ahk\") {\n    var element = document.createElement('a')\n    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(payload))\n    element.setAttribute('download', filename)\n    element.style.display = 'none'\n    document.body.appendChild(element)\n    element.click()\n    document.body.removeChild(element)\n  }\n\n  updateEmotesInTable() {\n    Object.entries(this.emotes).forEach(([name, data]) => {\n      this.updateEmoteInTable(name)\n    })\n  }\n\n  buildEmoteList() {\n    const tpl = $(`template[data-tpl=\"emote-list-entry\"]`)\n    Object.entries(this.emotes).forEach(([name, data]) => {\n      const _clone = tpl.get(0).content.cloneNode(true)\n      const clone = $(_clone.children[0])\n      clone.attr(\"data-emote\", name).attr(\"data-fat-index\", data[2])\n      clone.find(`[data-slot-v=\"name\"]`).text(name).attr(\"title\", name)\n      clone.find(`[data-slot-v=\"description\"]`).text(data[0]).attr(\"title\", data[0])\n      const [p,r,c] = this.fati2prc(data[2])\n      clone.find(`[data-slot-v=\"image\"]`).attr(\"title\", `${p} Page\\n${r} Row\\n${c} Col\\n(ingame location)`).removeAttr(\"src\").attr(\"src\", data[1])//.parent().attr(\"href\", data[1])\n\n      this.v_emote_list.append(clone)\n      this.updateEmoteInTable(name)\n    })\n  }\n\n  fati2prc(fati) {\n    const prc = []\n    const c_rows = 4\n    const c_perRow = 6\n    const c_perPage = c_rows * c_perRow\n    prc[0] = Math.floor(fati / c_perPage) + 1\n    prc[1] = Math.floor((fati % c_perPage) / c_perRow) + 1\n    prc[2] = Math.floor(((fati % c_perPage) % c_perRow)) + 1\n    return prc\n  }\n\n  selectPage(pnum) {\n    this.v_pagenav.find(`.nav-link.active`).removeClass(\"active\")\n    this.v_pagenav.find(`.nav-link[data-page=${pnum}]`).addClass(\"active\")\n\n    this.renderCurrentPage()\n  }\n\n  renderCurrentPage() {\n    const cp = this.currentPage\n    const rows = this.loadout.pages[cp]\n    this.v_wheel_currentPage.text(cp + 1)\n\n    rows.forEach((row, i) => {\n      let name = null\n      if(Array.isArray(row)) {\n        name = row[0]\n      } else {\n        name = row\n        row = []\n      }\n\n      const slot = this.slot(i)\n      this.renderSlot(slot, name)\n    })\n  }\n\n  renderSlot(slot, name) {\n    const slot_name = slot.find(`[data-slot-v=\"name\"]`)\n    const slot_desc = slot.find(`[data-slot-v=\"description\"]`)\n    const slot_img = slot.find(`[data-slot-v=\"image\"]`)\n    const slot_hstrings = slot.find(`[data-slot-v=\"hotstrings\"]`)\n    slot.removeClass(\"empty-slot\").removeClass(\"failed-slot\")\n    slot.removeData(\"selectedEmote\")\n    slot_hstrings.html(\"\")\n\n    if(!name) {\n      slot.addClass(\"empty-slot\")\n      slot_name.text(\"empty slot\").attr(\"title\", \"\")\n      slot_desc.html(\"\").attr(\"title\", \"\")\n      slot_img.removeAttr(\"title\").removeAttr(\"src\")//.attr(\"src\", emote[1])\n      return\n    }\n\n    const emote = this.emotes[name]\n    if(emote) {\n      slot.data(\"selectedEmote\", name)\n      slot_name.text(name).attr(\"title\", name)\n      slot_desc.text(emote[0]).attr(\"title\", emote[0])\n      const [p,r,c] = this.fati2prc(emote[2])\n      slot_img.removeAttr(\"src\").attr(\"src\", emote[1]).attr(\"title\", `${p} Page\\n${r} Row\\n${c} Col\\n(ingame location)`)\n\n      const hstrings = this.loadout.hotstrings[name]\n      if(hstrings) {\n        hstrings.forEach(hs => {\n          const span = $(\"<span>\").addClass(\"me-1 badge bg-dark\").text(hs)\n          slot_hstrings.append(span)\n        })\n      }\n    } else {\n      slot.addClass(\"failed-slot\")\n      slot_name.text(name).attr(\"title\", name)\n      const emsg = `Could not find this emote for some reason`\n      slot_desc.text(emsg).attr(\"title\", emsg)\n      slot_img.removeAttr(\"title\").removeAttr(\"src\")\n      console.error(\"failed to find emote: \" + name)\n    }\n  }\n\n  find(selector) { return this.el.find(selector) }\n}\n\nexport { EmoteLoadoutUI }\n", "import * as AppOS from \"../appos/appos\"\n\nconst DEV = false\n\nclass TwitchDrops {\n  constructor(app, el, mapper, opts = {}) {\n    this.opts = Object.assign({}, { is: \"ui\" }, opts)\n    this.app = app\n    this.el = el\n    this.mapper = mapper\n  }\n\n  hook() {\n    if (this.opts.is == \"ui\") {\n\n    } else if (this.opts.is == \"overview\") {\n      this.el.find(`[data-drop]`).each((i, el) => {\n        const dropEl = $(el)\n        const drop = dropEl.data(\"drop\")\n        const tip = bootstrap.Tooltip.getInstance(dropEl)\n        const indicator = dropEl.find(`.spinner-grow`)\n        const vOwned = dropEl.find(`[data-v=\"owned\"]`)\n        const vOwnedPercent = dropEl.find(`[data-v=\"ownedPercent\"]`)\n\n        indicator.removeClass(\"spinner-grow spinner-grow-sm\").addClass(\"spinner-border spinner-border-sm\")\n        this.mapper.do(map => {\n          indicator.remove()\n          const owned = drop.items.filter(i => map.items.includes(i))\n          const perc = owned.length / drop.items.length * 100\n          const startsIn = new Date(drop.start_at) - new Date()\n          const timeRemaining = new Date(drop.end_at) - new Date()\n          let percStr = `${perc.toFixed(0)}%`\n          if(percStr == \"100%\" && owned.length < drop.items.length) percStr = \"99%\"\n\n          vOwned.text(owned.length)\n          vOwnedPercent.text(`(${percStr})`)\n\n          if (owned.length == drop.items.length) {\n            dropEl.addClass(\"text-success\")\n            dropEl.attr(\"data-bs-original-title\", `you own all items<br>\u2013 click for info \u2013`)\n          } else if (startsIn > 0) {\n            const lessThan12Hours = startsIn < (12 * 60 * 60 * 1000)\n            dropEl.addClass(`text-${lessThan12Hours ? \"info\" : \"muted\"} fw-bold`)\n            dropEl.attr(\"data-bs-original-title\", `UPCOMING DROP<br>starts in ${this.humanizeSeconds(startsIn /  1000)}<br>\u2013 click for info \u2013`)\n          } else {\n            const lessThan12Hours = timeRemaining < (12 * 60 * 60 * 1000)\n            dropEl.addClass(`text-${lessThan12Hours ? \"danger\" : \"warning\"} fw-bold`)\n            dropEl.attr(\"data-bs-original-title\", `ends in ${this.humanizeSeconds(timeRemaining /  1000)}<br>\u2013 click for info \u2013`)\n          }\n        })\n      })\n    }\n\n    return this\n  }\n\n  humanizeSeconds(seconds) {\n    let res = []\n\n    res.push(Math.floor(seconds / (86400 * 365)))\n    seconds -= res[res.length - 1] * (86400 * 365)\n\n    res.push(Math.floor(seconds / 86400))\n    seconds -= res[res.length - 1] * 86400\n\n    res.push(Math.floor(seconds / 3600))\n    seconds -= res[res.length - 1] * 3600\n\n    res.push(Math.floor(seconds / 60))\n    seconds -= res[res.length - 1] * 60\n\n    res.push(Math.floor(seconds))\n    while(res[0] == 0) { res.shift() }\n\n    const stra = []\n    res.reverse().forEach((el, i) => {\n      switch (i) {\n        case 0: // seconds\n          if(res.length < 2) stra.push(`${el}s`)\n          break;\n        case 1: // minutes\n          stra.push(`${el}m`)\n          break;\n        case 2: // hours\n          stra.push(`${el}h`)\n          break;\n        case 3: // days\n          stra.push(`${el}d`)\n          break;\n        case 4: // years?\n          stra.push(`${el}y`)\n          break;\n      }\n    })\n\n    return stra.reverse().join(\" \")\n  }\n}\n\nexport { TwitchDrops }\n", "import * as AppOS from \"../appos/appos\"\n\nconst DEV = false\n\nclass InsiderTimer {\n  constructor(app, el, opts = {}) {\n    this.app = app\n    this.el = el\n    this.opts = opts\n    this.fmt = new Intl.NumberFormat('en-US')\n\n    this.countdownMillis = 60 * 60 * 1000\n    this.tickRate = 250\n    this.saveRate = 10 * 1000\n  }\n\n  hook() {\n    this.b_start = this.find(`[data-sotpf-act=\"timer:start\"]`)\n    this.b_pause = this.find(`[data-sotpf-act=\"timer:pause\"]`)\n    this.b_reset = this.find(`[data-sotpf-act=\"timer:reset\"]`)\n    this.p_timing = this.find(`.progress-bar[data-timer-progress-timing]`).get(0)\n    this.p_done = this.find(`.progress-bar[data-timer-progress-done]`).get(0)\n    this.v_elapsed = this.find(`[data-timer-elapsed]`)\n    this.v_remain = this.find(`[data-timer-remain]`)\n    this.v_percent = this.find(`[data-timer-percent]`)\n    this.i_save = this.find(`[data-timer-save-indicator]`)\n    this.i_autosave = this.find(`[data-timer-autosave-indicator]`)\n    this.i_load = this.find(`[data-timer-load-indicator]`)\n    this.i_destroy = this.find(`[data-timer-destroy-indicator]`)\n\n    this.b_start.click(ev => {\n      ev.preventDefault()\n      ev.currentTarget.blur()\n      this.start()\n    })\n    this.b_pause.click(ev => {\n      ev.preventDefault()\n      ev.currentTarget.blur()\n      this.pause()\n    })\n    this.b_reset.click(ev => {\n      ev.preventDefault()\n      ev.currentTarget.blur()\n      this.reset()\n    })\n\n    if(!this.restoreState()) this.reset()\n\n    return this\n  }\n\n  LSsave(key, value) {\n    localStorage.setItem(`sotpv_${key}`, JSON.stringify(value))\n    return localStorage.setItem(`sotpv_${key}`, JSON.stringify(value))\n  }\n\n  LSload(key, defVal) {\n    try {\n      return JSON.parse(localStorage.getItem(`sotpv_${key}`)) ?? defVal\n    } catch(e) {\n      console.error(e)\n      return defVal\n    }\n  }\n\n  LSdestroy(key) {\n    return localStorage.removeItem(`sotpv_${key}`)\n  }\n\n  stopIndicators() {\n    this.i_destroy.stop(true, true).hide()\n    this.i_load.stop(true, true).hide()\n    this.i_save.stop(true, true).hide()\n    this.i_autosave.stop(true, true).hide()\n  }\n\n  saveState(fakePause = false) {\n    if(!this._t_state) return false\n    let data = this._t_state\n    if (fakePause) {\n      data = Object.assign({}, data, { paused_at: Date.now() })\n    }\n    this.lastSaved = Date.now()\n    this.stopIndicators()\n    if(fakePause) {\n      this.i_autosave.fadeIn(300).delay(1250).fadeOut(300)\n    } else {\n      this.i_save.fadeIn(300).delay(1250).fadeOut(300)\n    }\n    return this.LSsave(\"insider_timer.state\", data)\n  }\n\n  getState() {\n    return this.LSload(\"insider_timer.state\")\n  }\n\n  deleteState() {\n    if(!this.getState()) return false\n    this.stopIndicators()\n    this.i_destroy.fadeIn(300).delay(1250).fadeOut(300)\n    return this.LSdestroy(\"insider_timer.state\")\n  }\n\n  restoreState() {\n    const state = this.getState()\n    if(!state) return false\n\n    this.stopIndicators()\n    this.i_load.fadeIn(300).delay(1250).fadeOut(300)\n\n    clearTimeout(this._t_tick)\n    this._t_state = state\n    this.tick()\n    return true\n  }\n\n  initCountdown() {\n    // this.countdownTarget\n    clearTimeout(this._t_tick)\n    this._t_state = {\n      done: false,\n      elapsed: 0,\n      target: this.countdownMillis,\n      remain: this.countdownMillis,\n      paused_for: 0,\n      paused_at: 0,\n    }\n  }\n\n  get running() {\n    return (this._t_state?.elapsed ?? 0) > 0\n  }\n\n  get paused() {\n    return !!this._t_state?.paused_at\n  }\n\n  get done() {\n    return !!this._t_state?.done\n  }\n\n  start() {\n    this.b_pause.show()\n    this.b_start.hide()\n    this.b_reset.hide()\n    this.lastSaved = Date.now()\n\n    if(this.paused) {\n      this._t_state.paused_for += Date.now() - this._t_state.paused_at\n      delete this._t_state.paused_at\n    } else {\n      this._t_state.started_at = Date.now()\n      this.tick()\n    }\n  }\n\n  pause() {\n    this._t_state.paused_at = Date.now()\n    this.saveState()\n    this.b_pause.hide()\n    this.b_start.show()\n    this.b_reset.show()\n  }\n\n  reset() {\n    this.deleteState()\n    this.initCountdown()\n    this.render()\n  }\n\n  tick(reschedule = true) {\n    this.update()\n    this.render()\n\n    if(!this.paused && Date.now() - this.lastSaved > this.saveRate) {\n      this.saveState(true)\n    }\n\n    if(reschedule) this._t_tick = setTimeout(_ => this.tick(), this.tickRate)\n  }\n\n  update() {\n    let t_delta = Date.now() - this._t_state.started_at\n    t_delta -= this._t_state.paused_for\n    if(this.paused) {\n      t_delta -= Date.now() - this._t_state.paused_at\n    }\n\n    this._t_state.elapsed = t_delta\n    this._t_state.remain = this._t_state.target - t_delta\n    this._t_state.done = this._t_state.remain < 0\n  }\n\n  render() {\n    if(this.running) {\n      if(this.done) {\n        if(this.p_timing.style.display != \"none\") this.p_timing.style.display = \"none\"\n        if(this.p_done.style.display != \"block\") this.p_done.style.display = \"block\"\n      } else {\n        if(this.p_timing.style.display != \"block\") this.p_timing.style.display = \"block\"\n        if(this.p_done.style.display != \"none\") this.p_done.style.display = \"none\"\n      }\n    } else {\n      if(this.p_timing.style.display != \"none\") this.p_timing.style.display = \"none\"\n      if(this.p_done.style.display != \"none\") this.p_done.style.display = \"none\"\n    }\n\n    const perc = this._t_state.elapsed / this._t_state.target * 100.0\n    this.v_elapsed.html(this.formatMillis(this._t_state.elapsed))\n    this.v_remain.html(this.formatMillis(this._t_state.remain))\n    this.v_percent.html(this.formatPercent(perc))\n    this.p_timing.style.width = `${perc.toFixed(6)}%`\n  }\n\n  formatMillis(ms) {\n    let neg = ms < 0\n    let fms = Math.abs(Math.round(ms / 1000))\n    let h = false\n    if(this._t_state.done) {\n      h = fms / (60 * 60)\n      fms = fms % (60 * 60)\n    }\n    const m = fms / (60)\n    fms = fms % (60)\n    const s = fms // (1000)\n    // fms = fms % (1000)\n    let f_h = Math.floor(h).toFixed(0)\n    let f_m = Math.floor(m).toFixed(0)\n    if(f_m.length < 2) f_m = \"0\" + f_m\n    let f_s = Math.floor(s).toFixed(0)\n    if(f_s.length < 2) f_s = \"0\" + f_s\n    return `${neg ? \"-\" : \"\"}${f_h && f_h != \"0\" ? `${f_h}:` : \"\"}${f_m}:${f_s}`\n  }\n\n  formatPercent(rat) {\n    return rat.toFixed(2) + \"%\"\n  }\n\n  find(selector) { return this.el.find(selector) }\n}\n\nexport { InsiderTimer }\n", "\nclass KeyModal {\n  constructor(parent, opts = {}) {\n    this.opts = opts\n  }\n\n  modal() {\n    return bootstrap.Modal.getOrCreateInstance(this.div, this.opts)\n  }\n\n  open(d) {\n    this.build(d)\n    this.modal().show()\n    return this\n  }\n\n  close(d) {\n    this.build(d)\n    this.modal().hide()\n    return this\n  }\n\n  destroy() {\n    this.modal().dispose()\n    delete this._modal\n    this.div.remove()\n    delete this.div\n  }\n\n  build(d) {\n    if (this.div) return this\n    this.div = this._buildDOM()\n\n    this.submitBtn = this.div.find('[type=\"submit\"]') //.attr(\"disabled\", \"disabled\")\n    this.iToken = this.div.find('input[name=authenticity_token]').val($(\"meta[name=csrf-token]\").attr(\"content\"))\n    this.iReturnUrl = this.div.find('input[name=return_url]').val(window.location.href)\n    this.iRefresh = this.div.find('select[name=refresh_interval]').val(d.refresh_interval)\n    this.iKey = this.div.find('input[name=refresh_token]').val(d.refresh_token)\n    this.iPollBalance = this.div.find('input[name=poll_balance]')\n    if(d.poll_balance) this.iPollBalance.attr(\"checked\", d.poll_balance)\n\n    if(d.refresh_error) {\n      this.div.find('.api-error code').text(d.refresh_error)\n      this.div.find('.api-error').show()\n    }\n\n    // this.div.on \"show.bs.modal\", (ev) => this.cmenu?.close()\n    // this.div.on \"shown.bs.modal\", (ev) => this.initMedia()\n    this.div.on(\"hidden.bs.modal\", ev => this.destroy())\n    this.div.find(\"form\").attr(\"action\", d.update_url)\n\n    this.div.appendTo($(\"body\"))\n    return this\n  }\n\n  _buildDOM() {\n    return $(`\n      <div class=\"modal fade\" tabindex=\"-1\" role=\"dialog\">\n        <div class=\"modal-dialog modal-lg\" role=\"document\">\n          <div class=\"modal-content\">\n            <form action=\"\" method=\"post\" class=\"form-horizontal m-0\" data-turbo=\"false\">\n              <input type=\"hidden\" name=\"authenticity_token\" value=\"\" />\n              <div class=\"modal-header\">\n                <h5 class=\"modal-title\">Refresh token</h5>\n                <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n              </div>\n              <div class=\"modal-body pb-0\">\n                <p>\n                  You can optionally provide us with your rat-cookie which allows us to automatically update\n                  your data\n                </p>\n                <p class=\"text-center\">\n                  <small class=\"form-text text-warning fw-bold\">\n                    <i class=\"bi bi-exclamation-triangle\"></i> You should generally not do this, I don't even know what I <em>could</em> do with this cookie. I know that I trust myself but do you? For security reasons (like sharing your non-sharing link) the cookie will not be displayed again. To remove it clear the pseudo-key and save it empty.\n                  </small>\n                </p>\n\n                <div class=\"api-error text-center\" style=\"display: none\">\n                  <hr>\n                  <span class=\"form-text text-danger fw-bold\">\n                    <i class=\"bi bi-exclamation-triangle bi-large\"></i> <big>Failed to query API!</big>\n                    <br><code></code>\n                  </span>\n                </div>\n\n                <div class=\"modal-footer mt-3 py-0 justify-content-center\">\n                </div>\n\n                <div class=\"mt-3 row\">\n                  <label class=\"col-4 col-lg-3 col-form-label text-right\" for=\"spf_key\">rat-cookie</label>\n                  <div class=\"col-8 col-lg-9\">\n                    <input class=\"form-control\" type=\"text\" name=\"refresh_token\" id=\"spf_key\" placeholder=\"<rat cookie value>\">\n                    <small class=\"form-text text-muted\">\n                      leave empty to remove and disable this feature\n                    </small>\n                  </div>\n                </div>\n\n                <div class=\"mt-3 row\">\n                  <label class=\"col-4 col-lg-3 col-form-label text-right\" for=\"spf_refresh\">auto-refresh</label>\n                  <div class=\"col-8 col-lg-9\">\n                    <select class=\"form-select\" name=\"refresh_interval\" id=\"spf_refresh\">\n                      <option value=\"\">disabled</option>\n                      <option value=\"1440\">once a day</option>\n                      <option value=\"10080\">once a week</option>\n                      <option value=\"43800\">once a month</option>\n                    </select>\n                    <small class=\"form-text text-info\">\n                      <i class=\"bi bi-info-circle\"></i> you can trigger manual refreshes on demand\n                    </small>\n                  </div>\n                </div>\n\n                <div class=\"mt-3 row\">\n                  <div class=\"col-4 col-lg-3 text-right\">Poll currencies</div>\n                  <div class=\"col-8 col-lg-9\">\n                    <div class=\"form-check\">\n                      <input class=\"form-check-input\" type=\"checkbox\" value=\"1\" name=\"poll_balance\" id=\"spf_poll_balance\">\n                      <label class=\"form-check-label\" for=\"spf_poll_balance\">\n                        periodically query your ingame currencies\n                      </label>\n                    </div>\n                    <small class=\"form-text text-muted\">\n                      (for the purpose of graphing)\n                    </small>\n                  </div>\n                </div>\n\n                <div class=\"modal-footer mt-3 py-2 justify-content-center\">\n                  <small class=\"form-text text-danger text-center\">\n                    <i class=\"bi bi-exclamation-circle\"></i> Token used to be valid for 14 days but Rare changed it to <strong>3 days</strong> which makes this rather annoying :(\n                  </small>\n\n                  <small class=\"form-text text-info text-center\">\n                    <i class=\"bi bi-info-circle\"></i> The token is valid for <strike>14 days</strike> <strong class=\"text-warning\">3 days</strong>, starting from the moment you log in to the SoT website.<br>Check frequently (key button will turn red) and update when needed!\n                  </small>\n                </div>\n\n              <div class=\"modal-footer d-flex justify-content-between\">\n                <span></span>\n                <div>\n                  <button type=\"submit\" class=\"btn btn-primary\">Apply</button>\n                  <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\n                </div>\n              </div>\n            </form>\n         </div>\n        </div>\n      </div>\n    `)\n  }\n}\n\nexport { KeyModal }\n", "\nclass FavModal {\n  constructor(parent, opts = {}) {\n    this.opts = opts\n  }\n\n  modal() {\n    return bootstrap.Modal.getOrCreateInstance(this.div, this.opts)\n  }\n\n  open(d) {\n    this.build(d)\n    this.modal().show()\n    return this\n  }\n\n  close(d) {\n    this.build(d)\n    this.modal().hide()\n    return this\n  }\n\n  destroy() {\n    this.modal().dispose()\n    delete this._modal\n    this.div.remove()\n    delete this.div\n  }\n\n  build(d) {\n    if (this.div) return this\n    this.div = this._buildDOM()\n\n    console.log(d)\n    this.submitBtn = this.div.find('[type=\"submit\"]') //.attr(\"disabled\", \"disabled\")\n    this.iToken = this.div.find('input[name=authenticity_token]').val($(\"meta[name=csrf-token]\").attr(\"content\"))\n    this.iReturnUrl = this.div.find('input[name=return_url]').val(window.location.href)\n    this.iFavs = this.div.find('textarea[name=favs]').val(d.favorites.join(\"\\n\"))\n\n    // this.div.on \"show.bs.modal\", (ev) => this.cmenu?.close()\n    // this.div.on \"shown.bs.modal\", (ev) => this.initMedia()\n    this.div.on(\"hidden.bs.modal\", ev => this.destroy())\n    this.div.find(\"form\").attr(\"action\", d.update_url)\n\n    this.div.appendTo($(\"body\"))\n    return this\n  }\n\n  _buildDOM() {\n    return $(`\n      <div class=\"modal fade\" tabindex=\"-1\" role=\"dialog\">\n        <div class=\"modal-dialog modal-lg\" role=\"document\">\n          <div class=\"modal-content\">\n            <form action=\"\" method=\"post\" class=\"form-horizontal m-0\" data-turbo=\"false\">\n              <input type=\"hidden\" name=\"authenticity_token\" value=\"\" />\n              <input type=\"hidden\" name=\"push\" value=\"true\" />\n              <div class=\"modal-header\">\n                <h5 class=\"modal-title\">Edit Favorites</h5>\n                <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n              </div>\n              <div class=\"modal-body\">\n                <div class=\"row\">\n                  <div class=\"col-12\">\n                    <textarea class=\"form-control text-nowrap\" type=\"text\" name=\"favs\" id=\"spf_favs\" style=\"height: 300px\"></textarea>\n                  </div>\n\n                  <div class=\"mt-2 text-small\">\n                    <details>\n                      <summary>advanced formatting</summary>\n                      <div class=\"text-muted\">\n                        You can use markdown or simple HTML to create headings or whatever you fancy. Start a line with a <kbd>~</kbd> (tilde) and remember that only one-liners work!\n                        Try these examples:\n                        <pre class=\"mb-0 mt-2\"><code>~# this is a big heading (h1)<br>~### it goes down<br>~###### all the way down to a h6<br>~*italic* **bold** _underline_ ~~strike~~ ==highlight==</code><br>~&lt;div class=\"alert alert-danger\"&gt;pretty lenient HTML support, don't make me take it away :)&lt;/div&gt;<br>~&lt;span class=\"badge bg-primary text-large\"&gt;Commendations&lt;/span&gt;<br>~&lt;a href=\"%profile%/reputation?tab=BilgeRats&hideCompleted=1\" class=\"btn btn-info\"&gt;Missing Bilge Rats commendations&lt;/a&gt;<br>*~ hidden in shared view, * works for other favorites too</pre>\n                        <p class=\"mb-0 mt-1 text-small\">\n                          Only within a-href you can use <code>%profile%</code> to replace with your profile base URL (which is either your private or share token or \"<span class=\"text-nowrap\">my-profile</span>\" depending on view context). You can use <a href=\"https://getbootstrap.com/docs/5.3/utilities/text/\" target=\"_blank\" rel=\"noreferrer noopener\">all of bootstrap</a>!\n                        </p>\n                      </div>\n                    </details>\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"modal-footer d-flex justify-content-between\">\n                <span class=\"text-info\">\n                  <i class=\"bi bi-info-circle\"></i>\n                  <span class=\"text-small\"> reorder or remove lines, empty lines will be ignored</span>\n                </span>\n                <div>\n                  <button type=\"submit\" class=\"btn btn-primary\">Apply</button>\n                  <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\n                </div>\n              </div>\n            </form>\n         </div>\n        </div>\n      </div>\n    `)\n  }\n}\n\nexport { FavModal }\n", "\nclass FatHelpModal {\n  constructor(parent, opts = {}) {\n    this.opts = opts\n  }\n\n  modal() {\n    return bootstrap.Modal.getOrCreateInstance(this.div, this.opts)\n  }\n\n  open(d) {\n    this.build(d)\n    this.modal().show()\n    return this\n  }\n\n  close(d) {\n    this.build(d)\n    this.modal().hide()\n    return this\n  }\n\n  destroy() {\n    this.modal().dispose()\n    delete this._modal\n    this.div.remove()\n    delete this.div\n  }\n\n  build(d) {\n    if (this.div) return this\n    this.div = this._buildDOM()\n    this.div.appendTo($(\"body\"))\n    return this\n  }\n\n  _buildDOM() {\n    return $(`\n      <div class=\"modal fade\" tabindex=\"-1\" role=\"dialog\">\n        <div class=\"modal-dialog modal-lg\" role=\"document\">\n          <div class=\"modal-content\">\n            <div class=\"modal-header\">\n              <h3 class=\"modal-title\">Find-A-Thing\u2122</h4>\n              <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n            </div>\n            <div class=\"modal-body\">\n              <div class=\"row\">\n                <div class=\"col-12 text-big\">\n                  <p>If we have mapped a given category you might find something like this:</p>\n                  <p class=\"text-big\"><code><i class=\"bi bi-geo pe-1\" style=\"white-space: nowrap\"></i> P3 R2 C1</code></p>\n                  <p>This tells you where you will find a given item ingame, for the example above:</p>\n                  <ul>\n                    <li><code>P</code>age <code>3</code></li>\n                    <li><code>R</code>ow <code>2</code></li>\n                    <li><code>C</code>olumn <code>1</code></li>\n                  </ul>\n                  <p>Please note that these \"coordinates\" are relative! That means a coordinate on an <code>all</code>-tab is different to a filtered sub-tab like <code>banjos</code>.</p>\n                  <p class=\"text-danger\">\n                    Important: This relies on your profile data being up to date!\n                  </p>\n                  <p class=\"text-small m-0\">\n                    If a category is mapped it will also tell you how many items exist in that\n                    category (obtainable or not) and how much (in %) you own. You may also sort\n                    after game order.\n                  </p>\n                </div>\n                <div class=\"col-12 text-muted text-small\">\n                  <hr>\n                  <p>\n                    Please note that these mappings will become outdated with a game content update. This should however\n                    only result in missing \"coordinates\" as new items are typically appended to the lists.\n                    <span class=\"text-warning\">So if you are missing a coordinate look at the last page(s) ingame!</span>\n                  </p>\n                  <p>\n                    Sometimes the SoT website returns strange data (translation errors probably) that temporarily break\n                    the mapping and lookup process. You must update your data once Rare fixed their site to get it back\n                    to working. Remember that you can also view older snapshots.\n                  </p>\n                  <p class=\"m-0\">\n                    If something isn't right, please let me know (see footer)\n                  </p>\n                </div>\n              </div>\n            </div>\n\n            <div class=\"modal-footer d-flex justify-content-between\">\n              <span></span>\n              <div>\n                <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n              </div>\n            </div>\n         </div>\n        </div>\n      </div>\n    `)\n  }\n}\n\nexport { FatHelpModal }\n", "// canvas-confetti v1.9.4 built on 2025-10-25T05:14:56.640Z\nvar module = {};\n\n// source content\n/* globals Map */\n\n(function main(global, module, isWorker, workerSize) {\n  var canUseWorker = !!(\n    global.Worker &&\n    global.Blob &&\n    global.Promise &&\n    global.OffscreenCanvas &&\n    global.OffscreenCanvasRenderingContext2D &&\n    global.HTMLCanvasElement &&\n    global.HTMLCanvasElement.prototype.transferControlToOffscreen &&\n    global.URL &&\n    global.URL.createObjectURL);\n\n  var canUsePaths = typeof Path2D === 'function' && typeof DOMMatrix === 'function';\n  var canDrawBitmap = (function () {\n    // this mostly supports ssr\n    if (!global.OffscreenCanvas) {\n      return false;\n    }\n\n    try {\n      var canvas = new OffscreenCanvas(1, 1);\n      var ctx = canvas.getContext('2d');\n      ctx.fillRect(0, 0, 1, 1);\n      var bitmap = canvas.transferToImageBitmap();\n      ctx.createPattern(bitmap, 'no-repeat');\n    } catch (e) {\n      return false;\n    }\n\n    return true;\n  })();\n\n  function noop() {}\n\n  // create a promise if it exists, otherwise, just\n  // call the function directly\n  function promise(func) {\n    var ModulePromise = module.exports.Promise;\n    var Prom = ModulePromise !== void 0 ? ModulePromise : global.Promise;\n\n    if (typeof Prom === 'function') {\n      return new Prom(func);\n    }\n\n    func(noop, noop);\n\n    return null;\n  }\n\n  var bitmapMapper = (function (skipTransform, map) {\n    // see https://github.com/catdad/canvas-confetti/issues/209\n    // creating canvases is actually pretty expensive, so we should create a\n    // 1:1 map for bitmap:canvas, so that we can animate the confetti in\n    // a performant manner, but also not store them forever so that we don't\n    // have a memory leak\n    return {\n      transform: function(bitmap) {\n        if (skipTransform) {\n          return bitmap;\n        }\n\n        if (map.has(bitmap)) {\n          return map.get(bitmap);\n        }\n\n        var canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n        var ctx = canvas.getContext('2d');\n        ctx.drawImage(bitmap, 0, 0);\n\n        map.set(bitmap, canvas);\n\n        return canvas;\n      },\n      clear: function () {\n        map.clear();\n      }\n    };\n  })(canDrawBitmap, new Map());\n\n  var raf = (function () {\n    var TIME = Math.floor(1000 / 60);\n    var frame, cancel;\n    var frames = {};\n    var lastFrameTime = 0;\n\n    if (typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function') {\n      frame = function (cb) {\n        var id = Math.random();\n\n        frames[id] = requestAnimationFrame(function onFrame(time) {\n          if (lastFrameTime === time || lastFrameTime + TIME - 1 < time) {\n            lastFrameTime = time;\n            delete frames[id];\n\n            cb();\n          } else {\n            frames[id] = requestAnimationFrame(onFrame);\n          }\n        });\n\n        return id;\n      };\n      cancel = function (id) {\n        if (frames[id]) {\n          cancelAnimationFrame(frames[id]);\n        }\n      };\n    } else {\n      frame = function (cb) {\n        return setTimeout(cb, TIME);\n      };\n      cancel = function (timer) {\n        return clearTimeout(timer);\n      };\n    }\n\n    return { frame: frame, cancel: cancel };\n  }());\n\n  var getWorker = (function () {\n    var worker;\n    var prom;\n    var resolves = {};\n\n    function decorate(worker) {\n      function execute(options, callback) {\n        worker.postMessage({ options: options || {}, callback: callback });\n      }\n      worker.init = function initWorker(canvas) {\n        var offscreen = canvas.transferControlToOffscreen();\n        worker.postMessage({ canvas: offscreen }, [offscreen]);\n      };\n\n      worker.fire = function fireWorker(options, size, done) {\n        if (prom) {\n          execute(options, null);\n          return prom;\n        }\n\n        var id = Math.random().toString(36).slice(2);\n\n        prom = promise(function (resolve) {\n          function workerDone(msg) {\n            if (msg.data.callback !== id) {\n              return;\n            }\n\n            delete resolves[id];\n            worker.removeEventListener('message', workerDone);\n\n            prom = null;\n\n            bitmapMapper.clear();\n\n            done();\n            resolve();\n          }\n\n          worker.addEventListener('message', workerDone);\n          execute(options, id);\n\n          resolves[id] = workerDone.bind(null, { data: { callback: id }});\n        });\n\n        return prom;\n      };\n\n      worker.reset = function resetWorker() {\n        worker.postMessage({ reset: true });\n\n        for (var id in resolves) {\n          resolves[id]();\n          delete resolves[id];\n        }\n      };\n    }\n\n    return function () {\n      if (worker) {\n        return worker;\n      }\n\n      if (!isWorker && canUseWorker) {\n        var code = [\n          'var CONFETTI, SIZE = {}, module = {};',\n          '(' + main.toString() + ')(this, module, true, SIZE);',\n          'onmessage = function(msg) {',\n          '  if (msg.data.options) {',\n          '    CONFETTI(msg.data.options).then(function () {',\n          '      if (msg.data.callback) {',\n          '        postMessage({ callback: msg.data.callback });',\n          '      }',\n          '    });',\n          '  } else if (msg.data.reset) {',\n          '    CONFETTI && CONFETTI.reset();',\n          '  } else if (msg.data.resize) {',\n          '    SIZE.width = msg.data.resize.width;',\n          '    SIZE.height = msg.data.resize.height;',\n          '  } else if (msg.data.canvas) {',\n          '    SIZE.width = msg.data.canvas.width;',\n          '    SIZE.height = msg.data.canvas.height;',\n          '    CONFETTI = module.exports.create(msg.data.canvas);',\n          '  }',\n          '}',\n        ].join('\\n');\n        try {\n          worker = new Worker(URL.createObjectURL(new Blob([code])));\n        } catch (e) {\n          // eslint-disable-next-line no-console\n          typeof console !== 'undefined' && typeof console.warn === 'function' ? console.warn('\uD83C\uDF8A Could not load worker', e) : null;\n\n          return null;\n        }\n\n        decorate(worker);\n      }\n\n      return worker;\n    };\n  })();\n\n  var defaults = {\n    particleCount: 50,\n    angle: 90,\n    spread: 45,\n    startVelocity: 45,\n    decay: 0.9,\n    gravity: 1,\n    drift: 0,\n    ticks: 200,\n    x: 0.5,\n    y: 0.5,\n    shapes: ['square', 'circle'],\n    zIndex: 100,\n    colors: [\n      '#26ccff',\n      '#a25afd',\n      '#ff5e7e',\n      '#88ff5a',\n      '#fcff42',\n      '#ffa62d',\n      '#ff36ff'\n    ],\n    // probably should be true, but back-compat\n    disableForReducedMotion: false,\n    scalar: 1\n  };\n\n  function convert(val, transform) {\n    return transform ? transform(val) : val;\n  }\n\n  function isOk(val) {\n    return !(val === null || val === undefined);\n  }\n\n  function prop(options, name, transform) {\n    return convert(\n      options && isOk(options[name]) ? options[name] : defaults[name],\n      transform\n    );\n  }\n\n  function onlyPositiveInt(number){\n    return number < 0 ? 0 : Math.floor(number);\n  }\n\n  function randomInt(min, max) {\n    // [min, max)\n    return Math.floor(Math.random() * (max - min)) + min;\n  }\n\n  function toDecimal(str) {\n    return parseInt(str, 16);\n  }\n\n  function colorsToRgb(colors) {\n    return colors.map(hexToRgb);\n  }\n\n  function hexToRgb(str) {\n    var val = String(str).replace(/[^0-9a-f]/gi, '');\n\n    if (val.length < 6) {\n        val = val[0]+val[0]+val[1]+val[1]+val[2]+val[2];\n    }\n\n    return {\n      r: toDecimal(val.substring(0,2)),\n      g: toDecimal(val.substring(2,4)),\n      b: toDecimal(val.substring(4,6))\n    };\n  }\n\n  function getOrigin(options) {\n    var origin = prop(options, 'origin', Object);\n    origin.x = prop(origin, 'x', Number);\n    origin.y = prop(origin, 'y', Number);\n\n    return origin;\n  }\n\n  function setCanvasWindowSize(canvas) {\n    canvas.width = document.documentElement.clientWidth;\n    canvas.height = document.documentElement.clientHeight;\n  }\n\n  function setCanvasRectSize(canvas) {\n    var rect = canvas.getBoundingClientRect();\n    canvas.width = rect.width;\n    canvas.height = rect.height;\n  }\n\n  function getCanvas(zIndex) {\n    var canvas = document.createElement('canvas');\n\n    canvas.style.position = 'fixed';\n    canvas.style.top = '0px';\n    canvas.style.left = '0px';\n    canvas.style.pointerEvents = 'none';\n    canvas.style.zIndex = zIndex;\n\n    return canvas;\n  }\n\n  function ellipse(context, x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise) {\n    context.save();\n    context.translate(x, y);\n    context.rotate(rotation);\n    context.scale(radiusX, radiusY);\n    context.arc(0, 0, 1, startAngle, endAngle, antiClockwise);\n    context.restore();\n  }\n\n  function randomPhysics(opts) {\n    var radAngle = opts.angle * (Math.PI / 180);\n    var radSpread = opts.spread * (Math.PI / 180);\n\n    return {\n      x: opts.x,\n      y: opts.y,\n      wobble: Math.random() * 10,\n      wobbleSpeed: Math.min(0.11, Math.random() * 0.1 + 0.05),\n      velocity: (opts.startVelocity * 0.5) + (Math.random() * opts.startVelocity),\n      angle2D: -radAngle + ((0.5 * radSpread) - (Math.random() * radSpread)),\n      tiltAngle: (Math.random() * (0.75 - 0.25) + 0.25) * Math.PI,\n      color: opts.color,\n      shape: opts.shape,\n      tick: 0,\n      totalTicks: opts.ticks,\n      decay: opts.decay,\n      drift: opts.drift,\n      random: Math.random() + 2,\n      tiltSin: 0,\n      tiltCos: 0,\n      wobbleX: 0,\n      wobbleY: 0,\n      gravity: opts.gravity * 3,\n      ovalScalar: 0.6,\n      scalar: opts.scalar,\n      flat: opts.flat\n    };\n  }\n\n  function updateFetti(context, fetti) {\n    fetti.x += Math.cos(fetti.angle2D) * fetti.velocity + fetti.drift;\n    fetti.y += Math.sin(fetti.angle2D) * fetti.velocity + fetti.gravity;\n    fetti.velocity *= fetti.decay;\n\n    if (fetti.flat) {\n      fetti.wobble = 0;\n      fetti.wobbleX = fetti.x + (10 * fetti.scalar);\n      fetti.wobbleY = fetti.y + (10 * fetti.scalar);\n\n      fetti.tiltSin = 0;\n      fetti.tiltCos = 0;\n      fetti.random = 1;\n    } else {\n      fetti.wobble += fetti.wobbleSpeed;\n      fetti.wobbleX = fetti.x + ((10 * fetti.scalar) * Math.cos(fetti.wobble));\n      fetti.wobbleY = fetti.y + ((10 * fetti.scalar) * Math.sin(fetti.wobble));\n\n      fetti.tiltAngle += 0.1;\n      fetti.tiltSin = Math.sin(fetti.tiltAngle);\n      fetti.tiltCos = Math.cos(fetti.tiltAngle);\n      fetti.random = Math.random() + 2;\n    }\n\n    var progress = (fetti.tick++) / fetti.totalTicks;\n\n    var x1 = fetti.x + (fetti.random * fetti.tiltCos);\n    var y1 = fetti.y + (fetti.random * fetti.tiltSin);\n    var x2 = fetti.wobbleX + (fetti.random * fetti.tiltCos);\n    var y2 = fetti.wobbleY + (fetti.random * fetti.tiltSin);\n\n    context.fillStyle = 'rgba(' + fetti.color.r + ', ' + fetti.color.g + ', ' + fetti.color.b + ', ' + (1 - progress) + ')';\n\n    context.beginPath();\n\n    if (canUsePaths && fetti.shape.type === 'path' && typeof fetti.shape.path === 'string' && Array.isArray(fetti.shape.matrix)) {\n      context.fill(transformPath2D(\n        fetti.shape.path,\n        fetti.shape.matrix,\n        fetti.x,\n        fetti.y,\n        Math.abs(x2 - x1) * 0.1,\n        Math.abs(y2 - y1) * 0.1,\n        Math.PI / 10 * fetti.wobble\n      ));\n    } else if (fetti.shape.type === 'bitmap') {\n      var rotation = Math.PI / 10 * fetti.wobble;\n      var scaleX = Math.abs(x2 - x1) * 0.1;\n      var scaleY = Math.abs(y2 - y1) * 0.1;\n      var width = fetti.shape.bitmap.width * fetti.scalar;\n      var height = fetti.shape.bitmap.height * fetti.scalar;\n\n      var matrix = new DOMMatrix([\n        Math.cos(rotation) * scaleX,\n        Math.sin(rotation) * scaleX,\n        -Math.sin(rotation) * scaleY,\n        Math.cos(rotation) * scaleY,\n        fetti.x,\n        fetti.y\n      ]);\n\n      // apply the transform matrix from the confetti shape\n      matrix.multiplySelf(new DOMMatrix(fetti.shape.matrix));\n\n      var pattern = context.createPattern(bitmapMapper.transform(fetti.shape.bitmap), 'no-repeat');\n      pattern.setTransform(matrix);\n\n      context.globalAlpha = (1 - progress);\n      context.fillStyle = pattern;\n      context.fillRect(\n        fetti.x - (width / 2),\n        fetti.y - (height / 2),\n        width,\n        height\n      );\n      context.globalAlpha = 1;\n    } else if (fetti.shape === 'circle') {\n      context.ellipse ?\n        context.ellipse(fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI) :\n        ellipse(context, fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI);\n    } else if (fetti.shape === 'star') {\n      var rot = Math.PI / 2 * 3;\n      var innerRadius = 4 * fetti.scalar;\n      var outerRadius = 8 * fetti.scalar;\n      var x = fetti.x;\n      var y = fetti.y;\n      var spikes = 5;\n      var step = Math.PI / spikes;\n\n      while (spikes--) {\n        x = fetti.x + Math.cos(rot) * outerRadius;\n        y = fetti.y + Math.sin(rot) * outerRadius;\n        context.lineTo(x, y);\n        rot += step;\n\n        x = fetti.x + Math.cos(rot) * innerRadius;\n        y = fetti.y + Math.sin(rot) * innerRadius;\n        context.lineTo(x, y);\n        rot += step;\n      }\n    } else {\n      context.moveTo(Math.floor(fetti.x), Math.floor(fetti.y));\n      context.lineTo(Math.floor(fetti.wobbleX), Math.floor(y1));\n      context.lineTo(Math.floor(x2), Math.floor(y2));\n      context.lineTo(Math.floor(x1), Math.floor(fetti.wobbleY));\n    }\n\n    context.closePath();\n    context.fill();\n\n    return fetti.tick < fetti.totalTicks;\n  }\n\n  function animate(canvas, fettis, resizer, size, done) {\n    var animatingFettis = fettis.slice();\n    var context = canvas.getContext('2d');\n    var animationFrame;\n    var destroy;\n\n    var prom = promise(function (resolve) {\n      function onDone() {\n        animationFrame = destroy = null;\n\n        context.clearRect(0, 0, size.width, size.height);\n        bitmapMapper.clear();\n\n        done();\n        resolve();\n      }\n\n      function update() {\n        if (isWorker && !(size.width === workerSize.width && size.height === workerSize.height)) {\n          size.width = canvas.width = workerSize.width;\n          size.height = canvas.height = workerSize.height;\n        }\n\n        if (!size.width && !size.height) {\n          resizer(canvas);\n          size.width = canvas.width;\n          size.height = canvas.height;\n        }\n\n        context.clearRect(0, 0, size.width, size.height);\n\n        animatingFettis = animatingFettis.filter(function (fetti) {\n          return updateFetti(context, fetti);\n        });\n\n        if (animatingFettis.length) {\n          animationFrame = raf.frame(update);\n        } else {\n          onDone();\n        }\n      }\n\n      animationFrame = raf.frame(update);\n      destroy = onDone;\n    });\n\n    return {\n      addFettis: function (fettis) {\n        animatingFettis = animatingFettis.concat(fettis);\n\n        return prom;\n      },\n      canvas: canvas,\n      promise: prom,\n      reset: function () {\n        if (animationFrame) {\n          raf.cancel(animationFrame);\n        }\n\n        if (destroy) {\n          destroy();\n        }\n      }\n    };\n  }\n\n  function confettiCannon(canvas, globalOpts) {\n    var isLibCanvas = !canvas;\n    var allowResize = !!prop(globalOpts || {}, 'resize');\n    var hasResizeEventRegistered = false;\n    var globalDisableForReducedMotion = prop(globalOpts, 'disableForReducedMotion', Boolean);\n    var shouldUseWorker = canUseWorker && !!prop(globalOpts || {}, 'useWorker');\n    var worker = shouldUseWorker ? getWorker() : null;\n    var resizer = isLibCanvas ? setCanvasWindowSize : setCanvasRectSize;\n    var initialized = (canvas && worker) ? !!canvas.__confetti_initialized : false;\n    var preferLessMotion = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion)').matches;\n    var animationObj;\n\n    function fireLocal(options, size, done) {\n      var particleCount = prop(options, 'particleCount', onlyPositiveInt);\n      var angle = prop(options, 'angle', Number);\n      var spread = prop(options, 'spread', Number);\n      var startVelocity = prop(options, 'startVelocity', Number);\n      var decay = prop(options, 'decay', Number);\n      var gravity = prop(options, 'gravity', Number);\n      var drift = prop(options, 'drift', Number);\n      var colors = prop(options, 'colors', colorsToRgb);\n      var ticks = prop(options, 'ticks', Number);\n      var shapes = prop(options, 'shapes');\n      var scalar = prop(options, 'scalar');\n      var flat = !!prop(options, 'flat');\n      var origin = getOrigin(options);\n\n      var temp = particleCount;\n      var fettis = [];\n\n      var startX = canvas.width * origin.x;\n      var startY = canvas.height * origin.y;\n\n      while (temp--) {\n        fettis.push(\n          randomPhysics({\n            x: startX,\n            y: startY,\n            angle: angle,\n            spread: spread,\n            startVelocity: startVelocity,\n            color: colors[temp % colors.length],\n            shape: shapes[randomInt(0, shapes.length)],\n            ticks: ticks,\n            decay: decay,\n            gravity: gravity,\n            drift: drift,\n            scalar: scalar,\n            flat: flat\n          })\n        );\n      }\n\n      // if we have a previous canvas already animating,\n      // add to it\n      if (animationObj) {\n        return animationObj.addFettis(fettis);\n      }\n\n      animationObj = animate(canvas, fettis, resizer, size , done);\n\n      return animationObj.promise;\n    }\n\n    function fire(options) {\n      var disableForReducedMotion = globalDisableForReducedMotion || prop(options, 'disableForReducedMotion', Boolean);\n      var zIndex = prop(options, 'zIndex', Number);\n\n      if (disableForReducedMotion && preferLessMotion) {\n        return promise(function (resolve) {\n          resolve();\n        });\n      }\n\n      if (isLibCanvas && animationObj) {\n        // use existing canvas from in-progress animation\n        canvas = animationObj.canvas;\n      } else if (isLibCanvas && !canvas) {\n        // create and initialize a new canvas\n        canvas = getCanvas(zIndex);\n        document.body.appendChild(canvas);\n      }\n\n      if (allowResize && !initialized) {\n        // initialize the size of a user-supplied canvas\n        resizer(canvas);\n      }\n\n      var size = {\n        width: canvas.width,\n        height: canvas.height\n      };\n\n      if (worker && !initialized) {\n        worker.init(canvas);\n      }\n\n      initialized = true;\n\n      if (worker) {\n        canvas.__confetti_initialized = true;\n      }\n\n      function onResize() {\n        if (worker) {\n          // TODO this really shouldn't be immediate, because it is expensive\n          var obj = {\n            getBoundingClientRect: function () {\n              if (!isLibCanvas) {\n                return canvas.getBoundingClientRect();\n              }\n            }\n          };\n\n          resizer(obj);\n\n          worker.postMessage({\n            resize: {\n              width: obj.width,\n              height: obj.height\n            }\n          });\n          return;\n        }\n\n        // don't actually query the size here, since this\n        // can execute frequently and rapidly\n        size.width = size.height = null;\n      }\n\n      function done() {\n        animationObj = null;\n\n        if (allowResize) {\n          hasResizeEventRegistered = false;\n          global.removeEventListener('resize', onResize);\n        }\n\n        if (isLibCanvas && canvas) {\n          if (document.body.contains(canvas)) {\n            document.body.removeChild(canvas);\n          }\n          canvas = null;\n          initialized = false;\n        }\n      }\n\n      if (allowResize && !hasResizeEventRegistered) {\n        hasResizeEventRegistered = true;\n        global.addEventListener('resize', onResize, false);\n      }\n\n      if (worker) {\n        return worker.fire(options, size, done);\n      }\n\n      return fireLocal(options, size, done);\n    }\n\n    fire.reset = function () {\n      if (worker) {\n        worker.reset();\n      }\n\n      if (animationObj) {\n        animationObj.reset();\n      }\n    };\n\n    return fire;\n  }\n\n  // Make default export lazy to defer worker creation until called.\n  var defaultFire;\n  function getDefaultFire() {\n    if (!defaultFire) {\n      defaultFire = confettiCannon(null, { useWorker: true, resize: true });\n    }\n    return defaultFire;\n  }\n\n  function transformPath2D(pathString, pathMatrix, x, y, scaleX, scaleY, rotation) {\n    var path2d = new Path2D(pathString);\n\n    var t1 = new Path2D();\n    t1.addPath(path2d, new DOMMatrix(pathMatrix));\n\n    var t2 = new Path2D();\n    // see https://developer.mozilla.org/en-US/docs/Web/API/DOMMatrix/DOMMatrix\n    t2.addPath(t1, new DOMMatrix([\n      Math.cos(rotation) * scaleX,\n      Math.sin(rotation) * scaleX,\n      -Math.sin(rotation) * scaleY,\n      Math.cos(rotation) * scaleY,\n      x,\n      y\n    ]));\n\n    return t2;\n  }\n\n  function shapeFromPath(pathData) {\n    if (!canUsePaths) {\n      throw new Error('path confetti are not supported in this browser');\n    }\n\n    var path, matrix;\n\n    if (typeof pathData === 'string') {\n      path = pathData;\n    } else {\n      path = pathData.path;\n      matrix = pathData.matrix;\n    }\n\n    var path2d = new Path2D(path);\n    var tempCanvas = document.createElement('canvas');\n    var tempCtx = tempCanvas.getContext('2d');\n\n    if (!matrix) {\n      // attempt to figure out the width of the path, up to 1000x1000\n      var maxSize = 1000;\n      var minX = maxSize;\n      var minY = maxSize;\n      var maxX = 0;\n      var maxY = 0;\n      var width, height;\n\n      // do some line skipping... this is faster than checking\n      // every pixel and will be mostly still correct\n      for (var x = 0; x < maxSize; x += 2) {\n        for (var y = 0; y < maxSize; y += 2) {\n          if (tempCtx.isPointInPath(path2d, x, y, 'nonzero')) {\n            minX = Math.min(minX, x);\n            minY = Math.min(minY, y);\n            maxX = Math.max(maxX, x);\n            maxY = Math.max(maxY, y);\n          }\n        }\n      }\n\n      width = maxX - minX;\n      height = maxY - minY;\n\n      var maxDesiredSize = 10;\n      var scale = Math.min(maxDesiredSize/width, maxDesiredSize/height);\n\n      matrix = [\n        scale, 0, 0, scale,\n        -Math.round((width/2) + minX) * scale,\n        -Math.round((height/2) + minY) * scale\n      ];\n    }\n\n    return {\n      type: 'path',\n      path: path,\n      matrix: matrix\n    };\n  }\n\n  function shapeFromText(textData) {\n    var text,\n        scalar = 1,\n        color = '#000000',\n        // see https://nolanlawson.com/2022/04/08/the-struggle-of-using-native-emoji-on-the-web/\n        fontFamily = '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\", \"EmojiOne Color\", \"Android Emoji\", \"Twemoji Mozilla\", \"system emoji\", sans-serif';\n\n    if (typeof textData === 'string') {\n      text = textData;\n    } else {\n      text = textData.text;\n      scalar = 'scalar' in textData ? textData.scalar : scalar;\n      fontFamily = 'fontFamily' in textData ? textData.fontFamily : fontFamily;\n      color = 'color' in textData ? textData.color : color;\n    }\n\n    // all other confetti are 10 pixels,\n    // so this pixel size is the de-facto 100% scale confetti\n    var fontSize = 10 * scalar;\n    var font = '' + fontSize + 'px ' + fontFamily;\n\n    var canvas = new OffscreenCanvas(fontSize, fontSize);\n    var ctx = canvas.getContext('2d');\n\n    ctx.font = font;\n    var size = ctx.measureText(text);\n    var width = Math.ceil(size.actualBoundingBoxRight + size.actualBoundingBoxLeft);\n    var height = Math.ceil(size.actualBoundingBoxAscent + size.actualBoundingBoxDescent);\n\n    var padding = 2;\n    var x = size.actualBoundingBoxLeft + padding;\n    var y = size.actualBoundingBoxAscent + padding;\n    width += padding + padding;\n    height += padding + padding;\n\n    canvas = new OffscreenCanvas(width, height);\n    ctx = canvas.getContext('2d');\n    ctx.font = font;\n    ctx.fillStyle = color;\n\n    ctx.fillText(text, x, y);\n\n    var scale = 1 / scalar;\n\n    return {\n      type: 'bitmap',\n      // TODO these probably need to be transfered for workers\n      bitmap: canvas.transferToImageBitmap(),\n      matrix: [scale, 0, 0, scale, -width * scale / 2, -height * scale / 2]\n    };\n  }\n\n  module.exports = function() {\n    return getDefaultFire().apply(this, arguments);\n  };\n  module.exports.reset = function() {\n    getDefaultFire().reset();\n  };\n  module.exports.create = confettiCannon;\n  module.exports.shapeFromPath = shapeFromPath;\n  module.exports.shapeFromText = shapeFromText;\n}((function () {\n  if (typeof window !== 'undefined') {\n    return window;\n  }\n\n  if (typeof self !== 'undefined') {\n    return self;\n  }\n\n  return this || {};\n})(), module, false));\n\n// end source content\n\nexport default module.exports;\nexport var create = module.exports.create;\n", "// const confetti1 = new Confetti({emoji: \"\uD83C\uDF89\"})\n// confetti1.start()\n// const confetti2 = new Confetti()\n// confetti2.start()\nexport class Confetti {\n  constructor(options = {}) {\n    this.maxCount = options.maxCount || 150\n    this.speed = options.speed || 2\n    this.frameInterval = options.frameInterval || 15\n    this.alpha = options.alpha || 1.0\n    this.gradient = options.gradient || false\n    this.emoji = options.emoji || null // set to \"\uD83C\uDF89\" or [\"\uD83C\uDF89\",\"\u2728\"] to use emojis\n\n    this.particles = []\n    this.running = false\n    this.paused = false\n    this.waveAngle = 0\n    this.lastFrameTime = Date.now()\n    this.animationTimer = null\n\n    this.colors = [\n      \"rgba(30,144,255,\", \"rgba(107,142,35,\", \"rgba(255,215,0,\",\n      \"rgba(255,192,203,\", \"rgba(106,90,205,\", \"rgba(173,216,230,\",\n      \"rgba(238,130,238,\", \"rgba(152,251,152,\", \"rgba(70,130,180,\",\n      \"rgba(244,164,96,\", \"rgba(210,105,30,\", \"rgba(220,20,60,\"\n    ]\n\n    this._createCanvas(options.canvas)\n    if(options.start) this.start()\n  }\n\n  _createCanvas(existingCanvas) {\n    if (existingCanvas instanceof HTMLCanvasElement) {\n      this.canvas = existingCanvas\n    } else {\n      this.canvas = document.createElement(\"canvas\")\n      this.canvas.style.display = \"block\"\n      this.canvas.style.zIndex = 999999\n      this.canvas.style.pointerEvents = \"none\"\n      this.canvas.style.position = \"fixed\"\n      this.canvas.style.top = 0\n      document.body.prepend(this.canvas)\n    }\n\n    this.ctx = this.canvas.getContext(\"2d\")\n\n    this._resize()\n    window.addEventListener(\"resize\", () => this._resize())\n  }\n\n  _resize() {\n    this.width = window.innerWidth\n    this.height = window.innerHeight\n    this.canvas.width = this.width\n    this.canvas.height = this.height\n  }\n\n  _resetParticle(p) {\n    p.color = this.colors[(Math.random() * this.colors.length) | 0] + this.alpha + \")\"\n    p.color2 = this.colors[(Math.random() * this.colors.length) | 0] + this.alpha + \")\"\n    p.x = Math.random() * this.width\n    p.y = Math.random() * this.height - this.height\n    p.diameter = Math.random() * 10 + 5\n    p.tilt = Math.random() * 10 - 10\n    p.tiltAngleIncrement = Math.random() * 0.07 + 0.05\n    p.tiltAngle = Math.random() * Math.PI\n    if (this.emoji) {\n      const emojis = Array.isArray(this.emoji) ? this.emoji : [this.emoji]\n      p.emoji = emojis[(Math.random() * emojis.length) | 0]\n      p.fontSize = p.diameter * 2\n    }\n    return p\n  }\n\n  emitAt(x, y, count = 10) {\n    for (let i = 0; i < count; i++) {\n      const p = this._resetParticle({})\n      p.x = x\n      p.y = y\n      this.particles.push(p)\n    }\n    if (!this.animationTimer) this._runAnimation()\n  }\n\n  start(timeout, min, max) {\n    let count = this.maxCount\n    if (min !== undefined) count = min\n    if (max !== undefined) count = Math.max(min || 0, max)\n\n    while (this.particles.length < count) {\n      this.particles.push(this._resetParticle({}))\n    }\n\n    this.running = true\n    this.paused = false\n    this._runAnimation()\n\n    if (timeout) setTimeout(() => this.stop(), timeout)\n\n    return this\n  }\n\n  stop() {\n    this.running = false\n    return this\n  }\n\n  remove() {\n    this.stop()\n    this.paused = false\n    this.particles = []\n    this.ctx.clearRect(0, 0, this.width, this.height)\n    return this\n  }\n\n  pause() {\n    this.paused = true\n    return this\n  }\n\n  resume() {\n    if (!this.paused) return\n    this.paused = false\n    this._runAnimation()\n    return this\n  }\n\n  togglePause() {\n    return this.paused ? this.resume() : this.pause()\n  }\n\n  _runAnimation() {\n    if (this.paused) return\n    if (this.particles.length === 0) {\n      this.ctx.clearRect(0, 0, this.width, this.height)\n      return\n    }\n\n    this.lastBodyCheck ??= new Date()\n    if(new Date() - this.lastBodyCheck > 1000) {\n      if(!document.body.contains(this.canvas)) return false\n      this.lastBodyCheck = new Date()\n    }\n\n    const now = Date.now()\n    const delta = now - this.lastFrameTime\n    if (delta > this.frameInterval) {\n      this.ctx.clearRect(0, 0, this.width, this.height)\n      this._updateParticles()\n      this._drawParticles()\n      this.lastFrameTime = now - (delta % this.frameInterval)\n    }\n\n    this.animationTimer = requestAnimationFrame(() => this._runAnimation())\n  }\n\n  _updateParticles() {\n    this.waveAngle += 0.01\n    for (let i = 0; i < this.particles.length; i++) {\n      const p = this.particles[i]\n      if (!this.running && p.y < -15) {\n        p.y = this.height + 100\n      } else {\n        p.tiltAngle += p.tiltAngleIncrement\n        p.x += Math.sin(this.waveAngle) - 0.5\n        p.y += (Math.cos(this.waveAngle) + p.diameter + this.speed) * 0.5\n        p.tilt = Math.sin(p.tiltAngle) * 15\n      }\n\n      if (p.x > this.width + 20 || p.x < -20 || p.y > this.height) {\n        if (this.running && this.particles.length <= this.maxCount) {\n          this._resetParticle(p)\n        } else {\n          this.particles.splice(i, 1)\n          i--\n        }\n      }\n    }\n  }\n\n  _drawParticles() {\n    for (const p of this.particles) {\n      if (this.emoji) {\n        this.ctx.font = `${p.fontSize}px serif`\n        this.ctx.fillText(p.emoji, p.x, p.y)\n      } else {\n        const x2 = p.x + p.tilt\n        const y2 = p.y + p.tilt + p.diameter / 2\n        this.ctx.beginPath()\n        this.ctx.lineWidth = p.diameter\n        if (this.gradient) {\n          const grad = this.ctx.createLinearGradient(p.x, p.y, x2, y2)\n          grad.addColorStop(0, p.color)\n          grad.addColorStop(1, p.color2)\n          this.ctx.strokeStyle = grad\n        } else {\n          this.ctx.strokeStyle = p.color\n        }\n        this.ctx.moveTo(p.x + p.diameter / 2 + p.tilt, p.y)\n        this.ctx.lineTo(x2, y2)\n        this.ctx.stroke()\n      }\n    }\n  }\n}\n", "import * as AppOS from \"../appos/appos\"\n\nexport class InlineCompare {\n  static hookClicks(selectors = {}) {\n    selectors.commWithFriends ??= `[data-action=\"compareCommendationWithFriends\"]`\n\n    $(document).on(\"click\", selectors.commWithFriends, ev => {\n      ev.preventDefault()\n      ev.currentTarget.blur()\n      bootstrap.Tooltip.getInstance(ev.currentTarget)?.hide()\n      this.toggleCompareOn(ev.currentTarget)\n    })\n  }\n\n  static toggleCompareOn(clicked) {\n    const parent = clicked.closest(`[data-sotid]`)\n    if(!parent) return false\n\n    const instance = $(parent).data(\"InlineCompare\")\n    if(instance) {\n      instance.destroy()\n    } else {\n      const inst = new this(parent).load()\n      $(parent).data(\"InlineCompare\", inst)\n    }\n  }\n\n  constructor(dom) {\n    this.pvBase = document.getElementById(\"pv-main\").dataset.pvBase\n    this.dom = dom\n    this.dom_toggle = dom.querySelector(`[data-action=\"compareCommendationWithFriends\"]`)\n    this.dom_compare = this.createCompare()\n    this.dom_loading = this.dom_compare.querySelector(`[data-target=\"loading\"]`)\n    this.dom_error = this.dom_compare.querySelector(`[data-target=\"error\"]`)\n    this.dom_result = this.dom_compare.querySelector(`[data-target=\"result\"]`)\n    this.dom_table = this.dom_result.querySelector(`table`)\n\n    this.dom_toggle.classList.add(\"text-warning\")\n  }\n\n  destroy() {\n    $(this.dom).removeData(\"InlineCompare\")\n    this.dom_toggle.classList.remove(\"text-warning\")\n    this.dom_compare.remove()\n  }\n\n  createCompare() {\n    const div = document.createElement(\"div\")\n    div.classList.add(\"inline-compare-container\", \"d-flex\", \"align-items-center\", \"mb-1\")\n    div.innerHTML = `\n      <div class=\"text-info mx-auto fw-bold d-flex align-items-center gap-2 my-2 d-none\" data-target=\"loading\">\n        <div class=\"spinner-grow spinner-grow-sm text-info\"></div>\n        loading data of your friends...\n      </div>\n      <div class=\"text-danger mx-auto fw-bold d-flex align-items-center gap-2 my-2 d-none\" data-target=\"error\">\n        <i class=\"bi bi-exclamation-triangle-fill\"></i>\n        something went wrong :/\n      </div>\n      <div class=\"d-none flex-grow-1\" data-target=\"result\">\n        <table class=\"table table-sm mb-0\"></table>\n      </div>\n    `\n    this.dom.after(div)\n    return div\n  }\n\n  loadData() {\n    const favkey = this.dom.querySelector(\"[data-sotpv-togglefav]\").dataset.sotpvTogglefav\n    const params = {\n      favkey: favkey,\n    }\n    return fetch(`${this.pvBase}/favv_data?${new URLSearchParams(params)}`).then(r => r.json())\n  }\n\n  load() {\n    this.setLoading()\n    this.loadData().then(j => {\n      this.buildTable(j)\n      this.setResult()\n    }).catch(err => {\n      console.error(err)\n      this.setError(err)\n    })\n    return this\n  }\n\n  setLoading() {\n    this.dom_result.classList.add(\"d-none\")\n    this.dom_error.classList.add(\"d-none\")\n    this.dom_loading.classList.remove(\"d-none\")\n    return this\n  }\n\n  setError() {\n    this.dom_result.classList.add(\"d-none\")\n    this.dom_loading.classList.add(\"d-none\")\n    this.dom_error.classList.remove(\"d-none\")\n    return this\n  }\n\n  setResult() {\n    this.dom_loading.classList.add(\"d-none\")\n    this.dom_error.classList.add(\"d-none\")\n    this.dom_result.classList.remove(\"d-none\")\n    return this\n  }\n\n  buildTable(j) {\n    j.friends.forEach((friend, fi) => {\n      this.addRowToTable(friend, j.values.at(fi).at(0), j.meta.at(0))\n    })\n  }\n\n  addRowToTable(friend, value, meta = {}) {\n    const tr = document.createElement(\"tr\")\n    if(friend.destroyed) tr.classList.add(\"opacity-25\")\n\n    const td_gt = document.createElement(\"td\"); tr.append(td_gt)\n    td_gt.classList.add(\"text-end\")\n    // last_snapshot_at: \"2025-09-09T20:39:42.536Z\"\n    if(friend.favorite) {\n      const favico = document.createElement(\"span\"); td_gt.append(favico)\n      favico.classList.add(\"text-gold\")\n      favico.innerHTML = `\u2605`\n    }\n    const gt_a = document.createElement(\"a\"); td_gt.append(gt_a)\n    if(friend.favorite) gt_a.classList.add(\"text-gold\")\n    if(friend.destroyed) gt_a.classList.add(\"text-strike\", \"text-muted\", \"disabled\")\n    gt_a.href = `/games/sot/profile-viewer/${friend.share_token}`\n    gt_a.target = \"_blank\"\n    gt_a.innerText = `${friend.gamertag}`\n\n    const td_img = document.createElement(\"td\"); tr.append(td_img)\n    if(friend.image_url) {\n      const td_img_el = document.createElement(\"img\"); td_img.append(td_img_el)\n      td_img_el.width = \"32\"\n      td_img_el.height = \"32\"\n      td_img_el.src = `https://ip.geekya.com/32x32/${friend.image_url}`\n    }\n\n    const td_prog = document.createElement(\"td\"); tr.append(td_prog)\n    td_prog.classList.add(\"w-100\")\n    const prog = document.createElement(\"div\"); td_prog.append(prog)\n    prog.setAttribute(\"data-controller\", \"games--sot--progress\")\n    prog.setAttribute(\"data-games--sot--progress-current-value\", value)\n    prog.setAttribute(\"data-games--sot--progress-thresholds-value\", JSON.stringify(meta.thrs))\n    prog.setAttribute(\"data-games--sot--progress-graded-value\", meta.graded)\n    prog.setAttribute(\"data-games--sot--progress-boolish-value\", meta.boolish)\n    prog.setAttribute(\"data-games--sot--progress-format-value\", JSON.stringify([\"compactBarStatus\"]))\n\n    this.dom_table.append(tr)\n  }\n}\n", "export class ExternalPromise {\n  constructor() {\n    this.resolved = false\n    this.raw = new Promise((resolve, reject) => {\n      this.resolve = resolve\n      this.reject = reject\n    })\n    this.raw.finally(_ => { this.resolved = true })\n  }\n\n  get promise() { return this.raw }\n  then(...args) { return this.raw.then(...args) }\n  catch(...args) { return this.raw.catch(...args) }\n  finally(...args) { return this.raw.finally(...args) }\n}\n", "import * as AppOS from \"../appos/appos\"\nimport { ExternalPromise } from \"../appos/lib/external_promise\"\n\nclass Util {\n  static normalizeName(str) {\n    return str?.toLowerCase().trim()\n  }\n\n  static utf8ToBase64(str) {\n    const encoder = new TextEncoder()\n    const data = encoder.encode(str)\n\n    const binaryString = String.fromCharCode.apply(null, data)\n    return btoa(binaryString)\n  }\n\n  static base64ToUtf8(b64) {\n    const binaryString = atob(b64)\n    const bytes = new Uint8Array(binaryString.length)\n    for (let i = 0; i < binaryString.length; i++) {\n      bytes[i] = binaryString.charCodeAt(i)\n    }\n    const decoder = new TextDecoder()\n    return decoder.decode(bytes)\n  }\n\n  static nameToNumber(str) {\n    const q = str.toLowerCase()\n    if(q.match(/^\\d+$/)) return parseInt(q)\n    if(q == \"one\") return 1\n    if(q == \"two\") return 2\n    if(q == \"three\") return 3\n    if(q == \"four\") return 4\n    if(q == \"five\") return 5\n    if(q == \"six\") return 6\n    if(q == \"seven\") return 7\n    if(q == \"eight\") return 8\n    if(q == \"nine\") return 9\n    if(q == \"ten\") return 10\n    if(q == \"eleven\") return 11\n    return q\n  }\n\n  static parameterize(\n    string,\n    {\n      separator = \"-\",\n      preserveCase = false,\n      locale = null // kept for API parity, unused\n    } = {}\n  ) {\n    if (string == null) return \"\"\n\n    // Transliterate accented chars \u2192 ASCII\n    let parameterized = string\n      .normalize(\"NFD\")\n      .replace(/[\\u0300-\\u036f]/g, \"\")\n\n    // Turn unwanted chars into the separator\n    parameterized = parameterized.replace(/[^a-z0-9\\-_]+/gi, separator)\n\n    if (separator) {\n      const escaped = separator === \"-\"\n        ? \"-\"\n        : separator.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n\n      const reDuplicate = new RegExp(`${escaped}{2,}`, \"g\")\n      const reTrim = new RegExp(`^${escaped}|${escaped}$`, \"g\")\n\n      // Collapse duplicate separators\n      parameterized = parameterized.replace(reDuplicate, separator)\n      // Trim leading/trailing separator\n      parameterized = parameterized.replace(reTrim, \"\")\n    }\n\n    if (!preserveCase) {\n      parameterized = parameterized.toLowerCase()\n    }\n\n    return parameterized\n  }\n\n  static ledgerTiername(company, tier) {\n    if(company == \"Athena's Fortune\") return tier == 1 ? \"Legend\" : \"Guardian\"\n    if(company == \"Merchant Alliance\") return tier == 1 ? \"Admiral\" : \"Commander\"\n    if(company == \"Gold Hoarders\") return tier == 1 ? \"Captain\" : \"Marauder\"\n    if(company == \"Order of Souls\") return tier == 1 ? \"Grandee\" : \"Chief\"\n    if(company == \"Reaper's Bones\") return tier == 1 ? \"Master\" : \"Keeper\"\n    if(company == \"Hunter's Call\") return tier == 1 ? \"Master Hunter\" : \"Deft Hunter\"\n    if(company == \"Guilds\") return tier == 1 ? \"Legendary\" : \"Esteemed\"\n  }\n\n  static ordinalize(int) {\n    if(int == 1) return \"st\"\n    if(int == 2) return \"nd\"\n    if(int == 3) return \"rd\"\n    return \"th\"\n  }\n\n  static humanize(str) {\n    return `${str}`.replace(/_/g, \" \").trimLeft().replace(/^\\w/, l => l.toUpperCase())\n  }\n}\n\nclass SerializeParams {\n  static getHashParams(...args) { return AppOS.Util.getHashParams(...args) }\n  static updateHashParams(...args) { return AppOS.Util.updateHashParams(...args) }\n  static serializeHashParams(...args) { return AppOS.Util.serializeHashParams(...args) }\n  static setHashParams(...args) { return AppOS.Util.setHashParams(...args) }\n\n  static serializeDomToParams(dom) {\n    const params = {}\n    dom.querySelectorAll(`[data-filter-key]`).forEach(el => {\n      if(el.dataset.filterKey == \"_TPL_\") return false\n      const vel = el.querySelector(`[data-selected=\"true\"]`)\n      const v = vel?.dataset.role\n      const d = el.dataset.default ?? \"nil\"\n      if(v != d) params[el.dataset.filterKey] = v\n    })\n\n    const scriptSelectors = [\n      `[data-role=\"fcode\"]`,\n      `[data-role=\"scode\"]`,\n    ]\n    scriptSelectors.forEach(ss => {\n      const t = dom.querySelector(ss)\n      if(!t) return false\n      const ta = t.querySelector(\"textarea\")\n      if(!ta?.value) return false\n      params[t.dataset.role] = Util.utf8ToBase64(ta.value)\n    })\n\n    this.setHashParams(params)\n\n    return params\n  }\n\n  static parseParamsToDom(parent) {\n    const hparams = this.getHashParams()\n    Object.entries(hparams).forEach(([key, value]) => {\n      if(key == \"fcode\" || key == \"scode\") {\n        const t = parent.dom.querySelector(`[data-role=\"${key}\"]`)\n        if(!t) return false\n        const ta = t.querySelector(\"textarea\")\n        if(!ta) return false\n        t.setAttribute(\"open\", \"open\")\n        ta.value = Util.base64ToUtf8(value)\n        $(ta).change()\n      } else {\n        parent.setYnn(key, value)\n      }\n    })\n  }\n}\n\nexport class MissingEntitlements {\n  static hookClicks(selectors = {}) {\n    // selectors.commWithFriends ??= `[data-action=\"compareCommendationWithFriends\"]`\n\n    // $(document).on(\"click\", selectors.commWithFriends, ev => {\n    //   ev.preventDefault()\n    //   ev.currentTarget.blur()\n    //   bootstrap.Tooltip.getInstance(ev.currentTarget)?.hide()\n    //   this.toggleCompareOn(ev.currentTarget)\n    // })\n  }\n\n  constructor(app, dom) {\n    this.pvBase = document.getElementById(\"pv-main\").dataset.pvBase\n    this.app = app\n    this.dom = dom\n    this.filterAgainPromises = []\n    this.fmt = new Intl.NumberFormat(\"en-US\")\n\n    this.opts = {\n      defaultTags: this.dom.dataset.optDefaultTags == \"true\",\n      postprocess: this.dom.dataset.optPostprocess == \"true\",\n    }\n\n    setTimeout(async _ => {\n      try {\n        this.setStepStatus(\"load-main\", \"loading\", \"loading\u2026\")\n        await Promise.all([\n          this.loadEntitlements(),\n          await this.loadItemDb()\n        ])\n        await this.filterMissing()\n        await this.renderItems()\n        this.setStepStatus(\"load-main\", \"success\", \"done\")\n      } catch(err) {\n        console.error(err)\n        this.setStepStatus(\"load-main\", \"error\", err?.message ?? err?.statusText ?? err)\n      }\n    }, 1000)\n  }\n\n  hook() {\n    window.lol = this\n\n    $(this.dom).on(\"click\", `[data-role=\"filters-ynn\"] [type=\"button\"][data-role]`, ev => {\n      ev.preventDefault()\n      this.setYnn(ev.currentTarget.closest(`[data-filter-key]`), ev.currentTarget.dataset.role)\n      return false\n    })\n\n    $(this.dom).find(`[data-role=\"scode\"] textarea`).on(\"change\", ev => {\n      const tarea = ev.currentTarget\n      this.resetStatFuncResult()\n      this.resetStatFuncError()\n      if(tarea.value.trim() == \"help\") {\n        const help = this.statFunctionHelp()\n        tarea.rows = help.length\n        tarea.value = help.join(\"\\n\")\n      }\n      this.setStatFunction(tarea.value, true)\n    })//.change()\n\n    $(this.dom).find(`[data-role=\"fcode\"] textarea`).on(\"change\", ev => {\n      const tarea = ev.currentTarget\n      this.resetFilterFuncError()\n      if(tarea.value.trim() == \"help\") {\n        const help = this.filterFunctionHelp()\n        tarea.rows = help.length\n        tarea.value = help.join(\"\\n\")\n      }\n      this.setFilterFunction(tarea.value, true)\n    })//.change()\n\n    return this\n  }\n\n\n\n  // ========\n  // = Data =\n  // ========\n  tagItem(dbitem) {\n    dbitem.tags = new Set()\n    dbitem.owned = this.entitlementData.qitems.indexOf(dbitem.qname) > -1 || this.entitlementData.qwiki_names.indexOf(dbitem.qname) > -1\n\n    if(this.opts.defaultTags) {\n      dbitem.vtypes_from_preload.forEach(vtype => dbitem.tags.add(`__type:${vtype}`))\n\n      if(dbitem.cost != null) dbitem.tags.add(`__cost:gold`)\n      if(dbitem.cost_d != null) dbitem.tags.add(`__cost:doubloon`)\n      if(dbitem.cost_a != null) dbitem.tags.add(`__cost:ancient_coin`)\n      if(dbitem.cost_irl != null) dbitem.tags.add(`__cost:irl`)\n      if(dbitem.owned) dbitem.tags.add(`__meta:owned`)\n      if(dbitem.season) dbitem.tags.add(`__meta:season`)\n      if(dbitem.social) dbitem.tags.add(`__meta:social`)\n      if(dbitem.event) dbitem.tags.add(`__meta:event`)\n      if(dbitem.promobundle) dbitem.tags.add(`__meta:promobundle`)\n      if(dbitem.platform) dbitem.tags.add(`__meta:platform`)\n      if(dbitem.exclusive) dbitem.tags.add(`__meta:exclusive`)\n      if(dbitem.twitch_drop) dbitem.tags.add(`__meta:twitch_drop`)\n      if(dbitem.ledger_tier) dbitem.tags.add(`__meta:ledger`)\n      if(dbitem.insider_week != null) dbitem.tags.add(`__meta:insider`)\n      if(dbitem.timelimited != null) dbitem.tags.add(`__meta:timelimited`)\n      if(dbitem.commendation != null) dbitem.tags.add(`__meta:commendation`)\n      if(dbitem.chest != null) dbitem.tags.add(`__chest:${dbitem.chest}`)\n      if(dbitem.qsource != null) dbitem.tags.add(`__source:${dbitem.qsource}`)\n      if(dbitem.shop != null) dbitem.tags.add(`__shop:${dbitem.shop}`)\n      if(dbitem.company != null) dbitem.tags.add(`__company:${dbitem.company}`)\n    }\n\n    return dbitem.tags\n  }\n\n  updateIndices() {\n    this.missing.types = this.createIndices()\n    if(!this.initialTypeCounts) {\n      this.initialTypeCounts = {}\n      Object.entries(this.missing.types).forEach(([t, i]) => this.initialTypeCounts[t] = i.length)\n      Object.entries(this.missing.filtered).forEach(([t, i]) => this.initialTypeCounts[t] = i)\n    }\n  }\n\n  createIndices() {\n    const types = {}\n\n    this.missing.items.forEach(dbitem => {\n      (dbitem.tags ?? this.tagItem(dbitem)).forEach(tag => {\n        types[tag] ??= []\n        types[tag].push(dbitem.id)\n      })\n    })\n\n    return types\n  }\n\n  sortCountFor(el) {\n    const v = el.querySelector(`[data-selected=\"true\"]`)?.dataset.role\n    if(v == \"no\") return this.initialTypeCounts[el.dataset.filterKey] ?? 0\n    return this.missing.types[el.dataset.filterKey]?.length ?? 0\n  }\n\n\n\n  // =========\n  // = Steps =\n  // =========\n  loadEntitlements() {\n    const step = this.setStepStatus(1, \"loading\")\n    const promise = new Promise((resolve, reject) => {\n      setTimeout(_ => {\n        fetch(this.dom.dataset.entitlementUrl).then(r => r.ok ? r.json() : reject(r)).then(json => {\n          this.entitlementData = json\n          this.entitlementData.qitems = this.entitlementData.items.map(s => Util.normalizeName(s))\n          this.entitlementData.qwiki_names = this.entitlementData.wiki_names.map(s => Util.normalizeName(s))\n          this.setStepStatus(step, \"success\", `(${AppOS.Util.formatNumber(this.entitlementData.items.length)})`)\n          resolve(this.entitlementData)\n        }).catch(reject)\n      }, 50)\n    })\n\n    promise.catch(err => {\n      this.setStepStatus(step, \"error\", err?.message ?? err?.statusText ?? err)\n    })\n\n    return promise\n  }\n\n  loadItemDb() {\n    const step = this.setStepStatus(2, \"loading\")\n    // const ficken = {}\n    const promise = new Promise((resolve, reject) => {\n      setTimeout(_ => {\n        fetch(this.dom.dataset.itemdbUrl).then(r => r.ok ? r.json() : reject(r)).then(json => {\n          this.itemdbData = json\n          this.itemdbData.qsocial = this.itemdbData.social.map(s => Util.normalizeName(s))\n          this.itemdbData.qplatform = this.itemdbData.platform.map(s => Util.normalizeName(s))\n          this.itemdbData.qexclusive = this.itemdbData.exclusive.map(s => Util.normalizeName(s))\n          this.itemdbData.qtwitch_drops = this.itemdbData.twitch_drops.map(s => Util.normalizeName(s))\n          this.itemdbData.knownKeys = [\"owned\", \"tags\"]\n          this.itemdbData.items.forEach(i => {\n            i.qname ??= Util.normalizeName(i.fullname)\n            // if(i.source?.match(/^[a-z0-9\\s()']+$/i)) i.qsource = i.source\n            // else if (i.source) { ficken[i.source] ??= 0; ficken[i.source]++ }\n            if(this.opts.postprocess) {\n              if(i.vrnttype == \"Title\" && i.event?.startsWith(\"img:\")) delete i.event\n              if(i.season) i.season = Util.nameToNumber(i.season)\n              if(i.cost_irl) i.cost_irl = parseFloat(i.cost_irl)\n            }\n            if(this.itemdbData.qsocial.includes(i.qname)) i.social = true\n            if(this.itemdbData.qplatform.includes(i.qname)) i.platform = true\n            if(this.itemdbData.qexclusive.includes(i.qname)) i.exclusive = true\n            if(this.itemdbData.qtwitch_drops.includes(i.qname)) i.twitch_drop = true\n            Object.entries(i).forEach(([k, v]) => {\n              if(!this.itemdbData.knownKeys.includes(k)) this.itemdbData.knownKeys.push(k)\n            })\n          })\n          this.setStepStatus(step, \"success\", `(${AppOS.Util.formatNumber(this.itemdbData.items.length)})`)\n          // console.log(ficken)\n          resolve(this.entitlementData)\n        }).catch(reject)\n      }, 50)\n    })\n\n    promise.catch(err => {\n      this.setStepStatus(step, \"error\", err?.message ?? err?.statusText ?? err)\n    })\n\n    return promise\n  }\n\n  filterMissing() {\n    const step = this.setStepStatus(3, \"loading\")\n    const promise = new Promise((resolve, reject) => {\n      setTimeout(async _ => {\n        try {\n          this.missing = {\n            done: false,\n            i: 0,\n            items: [],\n            types: {},\n            query: this.itemdbData.items.slice(),\n            filters: new Map(),\n            filtered: {},\n            stats: {},\n            renderLimit: 500,\n            filterErrors: 0,\n            statErrors: 0,\n          }\n\n          this.dom.querySelectorAll(`[data-role=\"filters-ynn\"] [data-filter-key]`).forEach(qa => {\n            const v = qa.querySelector(`[data-selected=\"true\"]`)?.dataset.role\n            if(v != \"nil\") this.missing.filters.set(qa.dataset.filterKey, v == \"yes\")\n          })\n\n          const f_total = AppOS.Util.formatNumber(this.itemdbData.items.length)\n\n          // clear temp tags\n          this.itemdbData.items.forEach(item => {\n            if(item.tags) item.tags.forEach(t => {\n              if(!(t.startsWith(\"__\") || t.startsWith(\"$\"))) {\n                item.tags.delete(t)\n              }\n            })\n          })\n\n          await new Promise((ppresolve, ppreject) => {\n            this.filterUntilDone(ppresolve, i => {\n              // this.setStepStatus(step, null, `${AppOS.Util.formatNumber(this.missing.i)}/${f_total} (-${this.itemdbData.items.length - this.missing.i}) -- ${AppOS.Util.formatNumber(this.missing.items.length + this.missing.query.length)} missing`)\n              this.setStepStatus(step, null, `(${AppOS.Util.formatNumber(this.missing.items.length + this.missing.query.length)} -- <${AppOS.Util.formatNumber(this.itemdbData.items.length - this.missing.i)})`)\n            })\n          })\n\n          this.setStepStatus(step, \"success\", `(${AppOS.Util.formatNumber(this.missing.items.length)})`)\n          resolve()\n        } catch (err) { reject(err) }\n      }, 50)\n    })\n\n    promise.catch(err => {\n      this.setStepStatus(step, \"error\", err?.message ?? err?.statusText ?? err)\n    })\n\n    return promise\n  }\n\n  renderItems() {\n    const step = this.setStepStatus(4, \"loading\")\n\n    const promise = new Promise((resolve, reject) => {\n      setTimeout(_ => {\n        try {\n          this.createFilters()\n\n          if(!this.hasEverFiltered) {\n            this.hasEverFiltered = true\n            SerializeParams.parseParamsToDom(this)\n            if(this.filterAgainTimer) return resolve()\n          }\n\n          const entTarget = this.dom.querySelector(`[data-flist=\"entitlements\"]`)\n          const tplEl = this.dom.querySelector(`[data-role=\"template+entitlement\"]`)\n\n          // clear target (unobserve existing)\n          // const observer = window.app?.components?.ImagePerformance?.performance?.imagePerformanceObserver\n          // if(observer) this.dom.querySelectorAll(`[data-sotid]`).forEach(el => observer.unobserve(el))\n          window.app?.components?.ImagePerformance?.performance?.imagePerformanceObserver.disconnect()\n          entTarget.innerHTML = \"\"\n\n          let itemsToRender = this.missing.items\n          if(this.missing.renderLimit) itemsToRender = itemsToRender.slice(0, this.missing.renderLimit)\n          let sliced = this.missing.items.length - itemsToRender.length\n\n          const ico_gold = this.dom.querySelector(`[data-role=\"icon+gold\"]`).cloneNode(); ico_gold.classList.add(\"ms-1\")\n          const ico_doubloons = this.dom.querySelector(`[data-role=\"icon+doubloons\"]`).cloneNode(); ico_doubloons.classList.add(\"ms-1\")\n          const ico_ancient_coins = this.dom.querySelector(`[data-role=\"icon+ancient_coins\"]`).cloneNode(); ico_ancient_coins.classList.add(\"ms-1\")\n          const ico_factions = {}\n          this.dom.querySelectorAll(`[data-role=\"icon+faction\"]`).forEach(el => {\n            ico_factions[el.dataset.faction] = el.cloneNode()\n            ico_factions[el.dataset.faction].classList.add(\"me-1\")\n          })\n\n          const factionMap = [\n            [\"hoarderlevel\", \"GoldHoarders\"],\n            [\"merchantlevel\", \"MerchantAlliance\"],\n            [\"soulslevel\", \"OrderOfSouls\"],\n            [\"hunterlevel\", \"HuntersCall\"],\n            [\"seadoglevel\", \"SeaDogs\"],\n            [\"reaperlevel\", \"ReapersBones\"],\n            [\"athenalevel\", \"AthenasFortune\"],\n          ]\n\n          if(this.missing.sorter) itemsToRender.sort(this.missing.sorter)\n\n          itemsToRender.forEach(item => {\n            const clone = tplEl.cloneNode(true)\n            clone.removeAttribute(\"data-role\")\n            clone.setAttribute(\"data-sotid\", `gi:${item.id}`)\n            clone.classList.remove(\"d-none\")\n\n            // generic values\n            clone.querySelectorAll(`[data-val]`).forEach(el => el.innerText = item[el.dataset.val] ?? \"\")\n            clone.querySelectorAll(`[data-vala=\"itemdb_url\"]`).forEach(el => el.href = `/games/sot/items/${item.slug}`)\n            clone.querySelectorAll(`[data-vala=\"wiki_url\"]`).forEach(el => el.href = `/games/sot/items/${item.slug}/wiki`)\n\n            // indicate owned\n            clone.querySelector(`[data-val=\"fullname\"]`).classList.toggle(\"text-success\", item.owned)\n\n            // shop + price\n            const cPrice = clone.querySelector(`[data-valc=\"price\"]`)\n            if(cPrice) {\n              if(item.shop) {\n                $(\"<span>\").html(`<i class=\"bi bi-cart4\"></i> ${item.shop}`).appendTo(cPrice)\n                if(item.cost || item.cost_d || item.cost_a || item.cost_irl) cPrice.append(\" | \")\n              }\n\n              if(item.cost) {\n                cPrice.append(AppOS.Util.formatNumber(item.cost), ico_gold.cloneNode())\n              } else if (item.cost_d) {\n                cPrice.append(AppOS.Util.formatNumber(item.cost_d), ico_doubloons.cloneNode())\n              } else if (item.cost_a) {\n                cPrice.append(AppOS.Util.formatNumber(item.cost_a), ico_ancient_coins.cloneNode())\n              } else if (item.cost_irl) {\n                cPrice.append(`${AppOS.Util.formatNumber(item.cost_irl)} $`)\n              }\n            }\n\n            // reqs\n            const cReqs = clone.querySelector(`[data-valc=\"reqs\"]`)\n            if(cReqs) {\n              if(item.bundleonly) $(\"<span>\").html(`<i class=\"bi bi-stack\"></i>`).addClass(\"ps-1 text-danger\").attr(\"title\", `bundle only: ${item.bundle}`).appendTo(cReqs)\n              if(item.bundle && !item.bundleonly) $(\"<span>\").html(`<i class=\"bi bi-stack\"></i>`).addClass(\"ps-1 text-success\").attr(\"title\", `part of bundle: ${item.bundle}`).appendTo(cReqs)\n              if(item.timelimited) $(\"<span>\").html(`<i class=\"bi bi-clock\"></i>`).addClass(\"ps-1 text-danger\").attr(\"title\", `time limited: ${item.limited_reason || \"see requirements\"}`).appendTo(cReqs)\n              if(item.insider_week) $(\"<span>\").html(`<i class=\"bi bi-eye\"></i> ${item.insider_week}`).addClass(\"ps-1 text-muted\").attr(\"title\", `insider week: ${item.insider_week}`).appendTo(cReqs)\n\n              factionMap.forEach(([key, name]) => {\n                if(item[key] == null) return false\n                $(\"<span>\")\n                  .addClass(\"d-inline-flex align-items-center ps-1 text-muted text-small\")\n                  .append(ico_factions[name]?.cloneNode(), item[key])\n                  .appendTo(cReqs)\n              })\n\n              if(item.allegiance) {\n                $(\"<span>\")\n                  .addClass(\"d-inline-flex align-items-center ps-1 text-muted text-small\")\n                  .append(ico_factions[item.faction == \"Guardians of Fortune\" ? \"PirateLord\" : \"Flameheart\"]?.cloneNode(), item.allegiance)\n                  .appendTo(cReqs)\n              }\n\n              if(item.season) {\n                $(\"<span>\")\n                  .addClass(\"ps-1 text-info\")\n                  .append(`S${item.season} @${item.season_level}`)\n                  .appendTo(cReqs)\n              }\n            }\n\n            const cDetails = clone.querySelector(`[data-valc=\"details\"]`)\n            if(cDetails) {\n              // commendation + comm_grade\n              if(item.commendation) {\n                const commLink = $(\"<a>\").attr(\"href\", `/games/sot/commendations/${Util.parameterize(item.commendation)}`).text(item.commendation)\n                if(item.comm_grade != null) {\n                  $(\"<div>\").append(`requires commendation `, commLink, ` grade ${item.comm_grade}`).appendTo(cDetails)\n                } else {\n                  $(\"<div>\").append(`requires commendation `, commLink).appendTo(cDetails)\n                }\n              }\n\n              // ledger_tier + ledger_level\n              if(item.ledger_tier) {\n                $(\"<div>\").append(`${item.company} ledger reward for reaching tier (${item.ledger_tier}) ${Util.ledgerTiername(item.company, item.ledger_tier)} for ${item.ledger_level}${Util.ordinalize(item.ledger_level)} time`).appendTo(cDetails)\n              }\n\n              // source / event / promobundle\n              if(item.source) $(\"<div>\").append($(\"<strong>\").text(\"Source: \"), `${item.source}`).appendTo(cDetails)\n              if(item.event) $(\"<div>\").append($(\"<strong>\").text(\"Event: \"), `${item.event}`).appendTo(cDetails)\n              if(item.promobundle) $(\"<div>\").append($(\"<strong>\").text(\"Promo bundle: \"), `${item.promobundle}`).appendTo(cDetails)\n\n              // requires\n              if(item.requires) {\n                const limit = 100\n                if(item.requires.length > limit) {\n                  $(\"<details>\").append(\n                    $(\"<summary>\").append($(\"<strong>\").text(\"Requires: \"), $(\"<span>\").addClass(\"visible-when-closed\").text(item.requires.slice(0, limit) + \"...\")),\n                    item.requires,\n                  ).appendTo(cDetails)\n                } else {\n                  $(\"<div>\").append($(\"<strong>\").text(\"Requires: \"), item.requires).appendTo(cDetails)\n                }\n              }\n\n              // title + title2 + legendlevel\n              if(item.legendlevel) $(\"<div>\").append(`requires title \"Pirate Legend\"`).appendTo(cDetails)\n              if(item.title) $(\"<div>\").append(`requires title \"${item.title}\"`).appendTo(cDetails)\n              if(item.title2) $(\"<div>\").append(`requires title \"${item.title2}\"`).appendTo(cDetails)\n\n              // pre-attrs\n              const pre = document.createElement(\"pre\")\n              pre.classList.add(\"mb-0\")\n              pre.innerText = JSON.stringify(item, null, 2)\n              const pre_details = document.createElement(\"details\")\n              pre_details.innerHTML = `<summary>attrs</summar>`\n              pre_details.append(pre)\n              cDetails.append(pre_details)\n            }\n\n            // ao-image\n            const aoLink = clone.querySelector(`.ao-spotlight`)\n            const aoImage = aoLink.querySelector(`.ao-spotlight-img`)\n            aoLink.setAttribute(\"href\", item.__image)\n            const observer = window.app?.components?.ImagePerformance?.performance?.imagePerformanceObserver\n\n            entTarget.append(clone)\n            if(observer) {\n              clone.classList.add(\"contains-pimage\")\n              aoImage.setAttribute(\"data-src\", `https://ip.geekya.com/96x96/${item.__image}`)\n              observer.observe(clone)\n            } else {\n              aoImage.setAttribute(\"src\", `https://ip.geekya.com/96x96/${item.__image}`)\n            }\n\n            // const div = document.createElement(\"div\")\n            // div.classList.add(\"d-flex\", \"gap-2\")\n            // const span = document.createElement(\"span\")\n            // span.classList.add(\"text-nowrap\")\n            // span.innerText = `${item.fullname}:`\n\n            // div.append(span, pre)\n            // entTarget.append(div)\n          })\n\n          if(sliced) {\n            entTarget.prepend(this.createSliceWarning(sliced))\n            entTarget.append(this.createSliceWarning(sliced))\n          }\n\n          this.setStepStatus(step, \"success\")\n          resolve()\n        } catch (err) { reject(err) }\n      }, 50)\n    })\n\n    promise.catch(err => {\n      this.setStepStatus(step, \"error\", err?.message ?? err?.statusText ?? err)\n    })\n\n    return promise\n  }\n\n\n  // ==========\n  // = Filter =\n  // ==========\n  filterAgain() {\n    if(!this.missing || !this.missing.done) return Promise.reject()\n\n    if(this.filterAgainTimer) clearTimeout(this.filterAgainTimer)\n    this.filterAgainTimer = setTimeout(async _ => {\n      delete this.filterAgainTimer\n      this.dom.querySelector(`[data-role=\"filters\"]`).classList.add(\"no-pointer-events\", \"opacity-25\")\n      this.setStepStatus(\"load-main\", \"loading\", \"loading\u2026\")\n      this.setStepStatus(3, \"loading\")\n      this.setStepStatus(4, \"waiting\")\n      await this.filterMissing()\n      await this.renderItems()\n      this.filterAgainPromises.forEach(p => p.resolve())\n      this.filterAgainPromises = []\n      this.setStepStatus(\"load-main\", \"success\", \"done\")\n    }, 10)\n\n    const promise = new ExternalPromise()\n    this.filterAgainPromises.push(promise)\n\n    return promise\n  }\n\n  filterUntilDone(resolve, progress) {\n    const filterPerFrame = 10000\n    const maxrt = 4\n    const now = performance.now()\n    let i = 0\n\n    while(this.missing.query.length && i <= filterPerFrame && (performance.now() - now <= maxrt)) {\n      const dbitem = this.missing.query.shift()\n      let filterExclusion = false\n\n      if(this.missing.filters.size && !dbitem.tags) this.tagItem(dbitem)\n\n      if(this.filterFunction) {\n        try {\n          filterExclusion = this.filterFunction(dbitem)\n        } catch (err) {\n          this.missing.filterErrors++\n          console.error(\"filterFunction failed\", err)\n          if(this.missing.filterErrors > 10) {\n            this.setFilterFuncError(err?.message ?? err?.statusText ?? err, \"FATAL 10+\")\n            this.missing.done = true\n            return resolve()\n          } else {\n            this.setFilterFuncError(err?.message ?? err?.statusText ?? err, this.missing.filterErrors)\n          }\n        }\n      }\n\n      if(!filterExclusion) {\n        this.missing.filters.forEach((v, f) => {\n          if(filterExclusion) return false\n          const tagged = dbitem.tags.has(f)\n          filterExclusion = v !== tagged\n          if(filterExclusion) {\n            this.missing.filtered[f] ??= 0\n            this.missing.filtered[f]++\n          }\n        })\n      }\n\n      if(!filterExclusion) {\n        this.missing.items.push(dbitem)\n\n        if(this.statFunction) {\n          try {\n            this.statFunction(dbitem)\n          } catch (err) {\n            this.missing.statErrors++\n            console.error(\"statFunction failed\", err)\n            if(this.missing.statErrors > 10) {\n              this.setStatFuncError(err?.message ?? err?.statusText ?? err, \"FATAL 10+\")\n              this.missing.done = true\n              return resolve()\n            } else {\n              this.setStatFuncError(err?.message ?? err?.statusText ?? err, this.missing.statErrors)\n            }\n          }\n        }\n      }\n\n      // console.log(i, dbitem.fullname, nix, wix)\n      this.missing.i++\n      i++\n    }\n    progress?.(i)\n    // console.log(\"frame\", \"i\", i, \"rt\", performance.now() - now, this.missing.query.length)\n    if(this.missing.query.length) {\n      // setTimeout(_ => {\n        requestAnimationFrame(_ => this.filterUntilDone(resolve, progress))\n      // }, 100)\n    } else {\n      this.missing.done = true\n      if(this.statFunction) this.setStatFuncResult(this.missing.stats)\n      this.updateIndices()\n      if(this.hasEverFiltered) SerializeParams.serializeDomToParams(this.dom)\n      resolve()\n    }\n  }\n\n  setFilterFunction(fbody, filterAgain = false) {\n    if(!fbody) {\n      delete this.filterFunction\n      if(filterAgain) this.filterAgain()\n      return this\n    }\n\n    this.filterFunction = item => {\n      const fenv = new Map()\n\n      fenv.set(\"_i\", this.missing.i)\n      fenv.set(\"_caller\", this)\n      fenv.set(\"_app\", this.app)\n      fenv.set(\"item\", item)\n\n      fenv.set(\"tag\", (...tags) => {\n        for (var i = 0; i < tags.length; i++) {\n          if(item.tags.has(tags[i])) return true\n        }\n        return false\n      })\n\n      fenv.set(\"tagOn\", (...fields) => {\n        const includeNull = typeof fields.at(-1) == \"boolean\" ? fields.pop() : false\n\n        for (var i = 0; i < fields.length; i++) {\n          let field = fields[i]\n          if(field[0] == \"$\") field = field.slice(1)\n          if(includeNull || item[field] != null) item.tags.add(`${fields[i]}:${item[field]}`)\n        }\n        return true\n      })\n\n      this.itemdbData.knownKeys.forEach(key => fenv.set(key, item[key]))\n      // Object.entries(item).forEach(([k, v]) => fenv.set(k, v))\n\n      return (new Function(\"env\", ...fenv.keys(), fbody))(fenv, ...fenv.values())\n    }\n\n    if(filterAgain) this.filterAgain()\n    return this\n  }\n\n  filterFunctionHelp() {\n    return [\n      `_i || console.log(env) // log env once to console, it shows you what you can access`,\n      `// console.log(_i, item) // log all items (with index) to console`,\n      `return timelimited // return true to remove from list`,\n      `return !(timelimited || exclusive) // easier to think from \"keep this\" standpoint`,\n    ]\n  }\n\n  setStatFunction(fbody, filterAgain = false) {\n    if(!fbody) {\n      delete this.statFunction\n      if(filterAgain) this.filterAgain()\n      return this\n    }\n\n    this.statFunction = item => {\n      const fenv = new Map()\n\n      fenv.set(\"_i\", this.missing.i)\n      fenv.set(\"_caller\", this)\n      fenv.set(\"_app\", this.app)\n      fenv.set(\"item\", item)\n\n      fenv.set(\"prices\", _ => fenv.get(\"sum\")(\"cost\", \"cost_d\", \"cost_a\", \"cost_irl\"))\n      fenv.set(\"formatStats\", _ => this.missing.formatStats = true)\n\n      fenv.set(\"sort\", (fn) => {\n        if(typeof fn == \"function\") this.missing.sorter = fn\n        else if (typeof fn == \"string\") {\n          let property = fn\n          let sortOrder = 1\n          if(property[0] === \"-\") {\n            sortOrder = -1\n            property = property.substr(1)\n          }\n\n          this.missing.sorter = (a, b) => (a[property] < b[property] ? -1 : a[property] > b[property] ? 1 : 0) * sortOrder\n        } else {\n          throw \"either pass field or -field or sorting function\"\n        }\n        return true\n      })\n\n      fenv.set(\"sum\", (...fields) => {\n        for (var i = 0; i < fields.length; i++) {\n          this.missing.stats.sum ??= {}\n          this.missing.stats.sum[fields[i]] ??= 0\n          if(item[fields[i]] != null) this.missing.stats.sum[fields[i]] += item[fields[i]]\n        }\n        return true\n      })\n\n      fenv.set(\"group\", (...fields) => {\n        this.missing.stats.group ??= {}\n\n        for (var i = 0; i < fields.length; i++) {\n          const v = item[fields[i]]\n          let ptr = this.missing.stats.group\n          ptr = ptr[fields[i]] ??= {}\n\n          if(Array.isArray(v)) {\n            v.forEach(vv => {\n              ptr[vv] ??= 0\n              ptr[vv]++\n            })\n          } else {//if(item[fields[i]] != null) {\n            ptr[v] ??= 0\n            ptr[v]++\n          }\n        }\n        return true\n      })\n\n      fenv.set(\"has\", (...fields) => {\n        this.missing.stats.has ??= {}\n\n        for (var i = 0; i < fields.length; i++) {\n          const v = !!item[fields[i]]\n          let ptr = this.missing.stats.has\n          ptr = ptr[fields[i]] ??= {}\n          ptr[v] ??= 0\n          ptr[v]++\n        }\n        return true\n      })\n\n      fenv.set(\"count\", (...args) => {\n        const value = args.pop()\n        let ptr = this.missing.stats.count ??= {}\n        args.forEach(arg => { ptr = ptr[arg] ??= {} })\n        ptr[value] ??= 0\n        ptr[value]++\n        return true\n      })\n\n      this.itemdbData.knownKeys.forEach(key => fenv.set(key, item[key]))\n      // Object.entries(item).forEach(([k, v]) => fenv.set(k, v))\n\n      return (new Function(\"env\", ...fenv.keys(), fbody))(fenv, ...fenv.values())\n    }\n\n    if(filterAgain) this.filterAgain()\n    return this\n  }\n\n  statFunctionHelp() {\n    return [\n      `_i || console.log(env) // log env once to console, it shows you what you can access`,\n      `has(\"insider_week\", \"commendation\") // stat on field-exists?`,\n      `group(\"shop\") // count on field-value`,\n      `if(insider_week) count(\"generic\", \"has_insider\") // generic count, used by group`,\n      `sum(\"cost\", \"cost_d\") // sum on field-value(numeric)`,\n      `prices() // shorthand to sum all costs`,\n      `formatStats() // format numbers in stats`,\n      `sort(\"cost\") || sort(\"-cost\") || sort((a, b) => { compareFunction }) // sort results`,\n    ]\n  }\n\n\n\n  // =======\n  // = DOM =\n  // =======\n  createFilters() {\n    const fCtn = this.dom.querySelector(`[data-role=\"filters\"]`)\n    const tplEl = this.dom.querySelector(`[data-role=\"template+filter+ynn\"]`)\n    const filterGroups = {}\n    fCtn.classList.remove(\"d-none\", \"no-pointer-events\", \"opacity-25\")\n\n    Object.entries(this.missing.types).forEach(([type, items]) => {\n      const [t_type, t_arg] = type.split(\":\")\n      filterGroups[t_type] ??= []\n      if(t_arg) filterGroups[t_type].push(t_arg)\n    })\n\n    // reset\n    fCtn.querySelectorAll(`[data-role=\"labelCount\"]`).forEach(el => el.innerText = \"\")\n    fCtn.querySelectorAll(`[data-filter-key]`).forEach(el => {\n      // target.classList.toggle(\"opacity-50\", subs.length == 0)\n      if(el.querySelector(`[data-selected=\"true\"]`)?.dataset.role == \"nil\") el.classList.add(\"opacity-50\")\n    })\n\n    // remove temps\n    fCtn.querySelectorAll(`[data-role=\"filters-ynn\"]`).forEach(el => {\n      const ynn = el.dataset.ynn\n      if(!(ynn.startsWith(\"__\") || ynn.startsWith(\"$\"))) el.remove()\n    })\n\n    // create or update\n    Object.entries(filterGroups).toSorted((a, b) => a[0].localeCompare(b[0])).forEach(([type, subs]) => {\n      let target = fCtn.querySelector(`[data-role=\"filters-ynn\"][data-ynn=\"${type}\"]`)\n      let listTarget = null\n      if(target) {\n        listTarget = target.querySelector(`[data-role=\"filter-ynn-list\"]`)\n      } else {\n        target = document.createElement(\"details\")\n        target.open = type != \"__type\"\n        target.setAttribute(\"data-role\", \"filters-ynn\")\n        target.setAttribute(\"data-ynn\", type)\n\n        const label = document.createElement(\"summary\")\n        label.classList.add(\"fw-bold\", \"text-muted\", \"text-small\", \"mb-1\")\n        label.innerText = Util.humanize(type[0] == \"$\" ? type.slice(1) : type)\n        target.append(label)\n\n        listTarget = document.createElement(\"div\")\n        listTarget.setAttribute(\"data-role\", \"filter-ynn-list\")\n        listTarget.classList.add(\"d-flex\", \"flex-wrap\", \"gap-2\", \"w-100\")\n        target.append(listTarget)\n\n        fCtn.append(target)\n      }\n\n      subs.forEach(sub => {\n        const skey = `${type}:${sub}`\n        let clone = listTarget.querySelector(`[data-filter-key=\"${skey}\"]`)\n        if(!clone) {\n          clone = tplEl.cloneNode(true)\n          clone.removeAttribute(\"data-role\")\n          clone.setAttribute(\"data-filter-key\", skey)\n          clone.querySelector(`[data-role=\"label\"]`).innerText = sub\n          listTarget.append(clone)\n        }\n        clone.querySelector(`[data-role=\"delLabelCount\"]`).innerText = \"\"\n        clone.querySelector(`[data-role=\"labelCount\"]`).innerText = this.missing.types[skey].length\n        clone.classList.remove(\"d-none\", \"opacity-50\")\n      })\n    })\n\n    // filtered\n    Object.entries(this.missing.filtered).forEach(([skey, c]) => {\n      const fk = fCtn.querySelector(`[data-filter-key=\"${skey}\"]`)\n      const label = fk.querySelector(`[data-role=\"delLabelCount\"]`)\n      label.innerText = `-${this.missing.filtered[skey]}`\n    })\n\n    // sort by count\n    this.dom.querySelectorAll(`[data-ynn] [data-role=\"filter-ynn-list\"]`).forEach(el => {\n      $(el).find(`[data-filter-key]`).get()\n        .sort((a, b) => this.sortCountFor(b) - this.sortCountFor(a))\n        .forEach(e => el.append(e))\n    })\n  }\n\n  createSliceWarning(sliced) {\n    const warning = document.createElement(\"div\")\n    warning.classList.add(\"alert\", \"alert-warning\")\n    warning.innerHTML = `${sliced} results truncated!`\n    // const link = document.createElement(\"a\")\n    // link.classList.add(\"ms-2\")\n    // link.innerText = \"render +100\"\n    // link.href = \"javascript:renderAll()\"\n    // link.addEventListener(\"click\", ev => {\n    //   ev.preventDefault()\n    //   this.missing.renderLimit ??= 100\n    //   this.missing.renderLimit += 100\n    //   this.renderItems()\n    // })\n    // warning.append(link)\n\n    const link2 = document.createElement(\"a\")\n    link2.classList.add(\"ms-2\")\n    link2.innerText = \"render all\"\n    link2.href = \"javascript:renderAll()\"\n    link2.addEventListener(\"click\", ev => {\n      ev.preventDefault()\n      this.missing.renderLimit = null\n      this.renderItems()\n    })\n    warning.append(link2)\n\n    return warning\n  }\n\n  setYnn(ynn, state, filter = true, requeue = 1) {\n    const ynn_Original = ynn\n    if(typeof ynn == \"string\") ynn = this.dom.querySelector(`[data-filter-key=\"${ynn}\"]`)\n    const t = $(ynn)\n    if(!t.length) {\n      if(requeue < 10) {\n        console.log(\"requeueing\", {ynn_Original, state, filter, requeue})\n        const promise = new ExternalPromise()\n        this.filterAgainPromises.push(promise)\n        return promise.then(_ => this.setYnn(ynn_Original, state, filter, requeue + 1))\n      } else {\n        console.warn(\"giving up on\", {ynn_Original, state, filter, requeue})\n      }\n    }\n    state ??= ynn.querySelector(`[data-selected=\"true\"]`)?.dataset.role\n\n    t.find(`[data-role=\"no\"]`).toggleClass(\"btn-danger\", state == \"no\").toggleClass(\"btn-outline-danger\", state != \"no\").attr(\"data-selected\", state == \"no\")\n    t.find(`[data-role=\"yes\"]`).toggleClass(\"btn-success\", state == \"yes\").toggleClass(\"btn-outline-success\", state != \"yes\").attr(\"data-selected\", state == \"yes\")\n    t.find(`[data-role=\"nil\"]`).toggleClass(\"btn-warning\", state == \"nil\").toggleClass(\"btn-outline-warning\", state != \"nil\").attr(\"data-selected\", state == \"nil\")\n\n    t.find(`[data-role=\"label\"]`).toggleClass(\"bg-danger-subtle\", state == \"no\").toggleClass(\"text-danger\", state == \"no\")\n    t.find(`[data-role=\"label\"]`).toggleClass(\"bg-success-subtle\", state == \"yes\").toggleClass(\"text-success\", state == \"yes\")\n\n    // open parent\n    if(state != \"nil\") {\n      t.closest(`[data-role=\"filters-ynn\"]`).prop(\"open\", \"open\")\n    }\n\n    if(filter) this.filterAgain()\n    return this\n  }\n\n  deepFormatStats(v) {\n    if(AppOS.Util.isPlainObject(v)) {\n      return Object.fromEntries(\n        Object.entries(v).map(([key, val]) => [key, this.deepFormatStats(val)])\n      )\n    } else if (Array.isArray(v)) {\n      return v.map(deepFormat)\n    } else if (typeof v == \"number\") {\n      return this.fmt.format(v)\n    } else {\n      return v\n    }\n  }\n\n  setStatFuncResult(obj) {\n    const outer = this.dom.querySelector(`[data-role=\"statFuncResult\"]`)\n    if(!outer) return this\n    const pre = outer.querySelector(\"pre\")\n    if(!pre) return this\n\n    if(this.missing.formatStats) obj = this.deepFormatStats(obj)\n    pre.innerText = JSON.stringify(obj, null, 2)\n    outer.classList.remove(\"d-none\")\n    return this\n  }\n\n  resetStatFuncResult() {\n    const outer = this.dom.querySelector(`[data-role=\"statFuncResult\"]`)\n    if(!outer) return this\n    const pre = outer.querySelector(\"pre\")\n    if(!pre) return this\n\n    pre.innerText = \"\"\n    outer.classList.add(\"d-none\")\n    return this\n  }\n\n  setStatFuncError(msg, ecount) {\n    const emsg = this.dom.querySelector(`[data-role=\"statFuncError\"]`)\n    if(!emsg) return this\n\n    emsg.classList.remove(\"d-none\")\n    if(ecount != null) msg = `(${ecount}) ${msg}`\n    emsg.innerText = msg\n    return this\n  }\n\n  resetStatFuncError() {\n    const emsg = this.dom.querySelector(`[data-role=\"statFuncError\"]`)\n    if(!emsg) return this\n\n    emsg.classList.add(\"d-none\")\n    emsg.innerText = \"\"\n    return this\n  }\n\n  setFilterFuncError(msg, ecount) {\n    const emsg = this.dom.querySelector(`[data-role=\"filterFuncError\"]`)\n    if(!emsg) return this\n\n    emsg.classList.remove(\"d-none\")\n    if(ecount != null) msg = `(${ecount}) ${msg}`\n    emsg.innerText = msg\n    return this\n  }\n\n  resetFilterFuncError() {\n    const emsg = this.dom.querySelector(`[data-role=\"filterFuncError\"]`)\n    if(!emsg) return this\n\n    emsg.classList.add(\"d-none\")\n    emsg.innerText = \"\"\n    return this\n  }\n\n  setStepStatus(step, status = \"loading\", text) {\n    if(typeof step == \"number\" || typeof step == \"string\") step = this.dom.querySelector(`[data-step=\"${step}\"]`)\n    const icon = step.querySelector(`[data-role=\"statusIcon\"]`)\n    const stext = step.querySelector(`[data-role=\"statusText\"]`)\n\n    if(stext && text != null) {\n      stext.innerHTML = text\n      if(status === null) return step\n    }\n\n    if(status == \"loading\") {\n      icon.innerHTML = `<div class=\"spinner spinner-border spinner-border-sm\"></div>`\n    } else if (status == \"success\") {\n      icon.innerHTML = `<i class=\"bi bi-check-lg text-success\"></i>`\n    } else if (status == \"error\") {\n      icon.innerHTML = `<i class=\"bi bi-x-lg text-danger\"></i>`\n    } else if (status == \"waiting\") {\n      icon.innerHTML = `<i class=\"bi bi-hourglass-split text-muted\"></i>`\n    } else {\n      console.error(\"unknown status\", status, \"for\", step)\n    }\n    return step\n  }\n}\n", "import * as AppOS from \"./appos/appos\"\n\nimport \"./appos/component/jquery/easings\"\nimport \"./appos/component/turbo_bridge\"\nimport \"./appos/component/toggle_inline_list\"\nimport \"./appos/component/anim/threed_carousel\"\nimport {ScrollQueue} from \"./appos/lib/scroll_queue\"\nimport \"./sot_profile_viewer/find_a_thing_renderer\"\n\nimport {EntitlementMapper} from \"./sot_profile_viewer/entitlement_mapper\"\nimport {EntitlementSearch} from \"./sot_profile_viewer/entitlement_search\"\nimport {GotoAnywhere} from \"./sot_profile_viewer/goto_anywhere\"\nimport {GraphAnything} from \"./sot_profile_viewer/graph_anything\"\nimport {TracerUI} from \"./sot_profile_viewer/tracer_ui\"\nimport {NetWorthUI} from \"./sot_profile_viewer/net_worth_ui\"\nimport {EmoteLoadoutUI} from \"./sot_profile_viewer/emote_loadout_ui\"\nimport {TwitchDrops} from \"./sot_profile_viewer/twitch_drops\"\nimport {InsiderTimer} from \"./sot_profile_viewer/insider_timer\"\nimport {KeyModal} from \"./sot_profile_viewer/key_modal\"\nimport {FavModal} from \"./sot_profile_viewer/fav_modal\"\nimport {FatHelpModal} from \"./sot_profile_viewer/fat_help_modal\"\nimport confetti from \"canvas-confetti\"\n// import {confetti} from './sot_profile_viewer/confetti'\nimport {Confetti} from './sot_profile_viewer/confetti_class'\nimport {InlineCompare} from './sot_profile_viewer/inline_compare'\nimport {MissingEntitlements} from './sot_profile_viewer/missing_entitlements'\n\nclass SotProfileViewerApp extends AppOS.Application {\n  instance = \"SotProfileViewer\"\n\n  init() {\n    this.constructor.availableComponents.forEach(c => this.use(c))\n\n    if(window.app?.page) this.page = window.app.page\n    if(window.app?.input) this.input = window.app.input\n  }\n\n  boot() {\n  }\n\n  documentLoad() {\n    this.scrollQueue = new ScrollQueue().hook().start()\n\n    $(document).on(\"click\", ev => {\n      let target = $(ev.target).closest(`[data-sotid]`)\n      if(!target.length) {\n        target = $(ev.target).closest(`[data-missing-item]`)\n      }\n      const hadClass = target.hasClass(\"last-clicked\")\n      if(!(ev.metaKey || ev.ctrlKey)) {\n        $(\".last-clicked\").each((i, el) => { $(el).removeClass(\"last-clicked\").trigger(\"srec:unclicked\") })\n      }\n      if(!hadClass) {\n        target.addClass(\"last-clicked\").trigger(\"srec:clicked\")\n      }\n      return true\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"open_changelog\"]`, ev => {\n      window.open($(ev.currentTarget).data(\"changelogUrl\"))\n      return true\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"snapdiff-select\"]`, ev => {\n      const _t = ev.currentTarget\n      const t = $(_t).blur()\n      const tip = bootstrap.Tooltip.getInstance(_t)\n      const tr = t.closest(\"tr\")\n      const table = t.closest(\"table\")\n      const selected = table.find(\"tr.snapdiff-selected\")\n\n      if(selected.length == 1) {\n        if(selected.is(tr)) {\n          // clicked same row, cancel\n          tr.removeClass(\"snapdiff-selected\")\n          t.removeClass(\"btn-warning\").addClass(\"btn-outline-secondary\")\n\n          // dispose of tooltip and show original one\n          tip.enable()\n          tr.data(\"snapdiffTooltip\")?.dispose()\n          tr.removeData(\"snapdiffTooltip\")\n        } else {\n          selected.removeClass(\"snapdiff-selected\")\n          const sbtn = selected.find(`[data-sotpf-act=\"snapdiff-select\"]`)\n          sbtn.removeClass(\"btn-warning\").addClass(\"btn-outline-secondary\")\n          bootstrap.Tooltip.getInstance(sbtn.get(0))?.enable()\n          selected.data(\"snapdiffTooltip\")?.dispose()\n          selected.removeData(\"snapdiffTooltip\")\n          window.open(t.attr(\"href\").replace(\"__i__\", selected.data(\"sid\")))\n        }\n      } else {\n        tip?.hide()\n        tip?.disable()\n        t.addClass(\"btn-warning\").removeClass(\"btn-outline-secondary\")\n        tr.addClass(\"snapdiff-selected\")\n        const tooltip = new bootstrap.Tooltip(_t.parentNode, {\n          trigger: \"manual\",\n          html: true,\n          placement: \"left\",\n          customClass: \"tooltip-fluid\",\n          title: `<strong>click the diff-button on a different snapshot</strong><br><small class=\"text-mutedx\">click this diff button again to cancel</span>`,\n        })\n        tooltip.show()\n        tr.data(\"snapdiffTooltip\", tooltip)\n      }\n      return false\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"profmerge-select\"]`, ev => {\n      const _t = ev.currentTarget\n      const t = $(_t).blur()\n      const tip = bootstrap.Tooltip.getInstance(_t)\n      const tr = t.closest(\"tr\")\n      const table = t.closest(\"table\")\n      const selected = table.find(\"tr.profmerge-selected\")\n\n      if(selected.length == 1) {\n        if(selected.is(tr)) {\n          // clicked same row, cancel\n          tr.removeClass(\"profmerge-selected\")\n          t.removeClass(\"btn-warning\").addClass(\"btn-outline-info\")\n\n          // dispose of tooltip and show original one\n          tip.enable()\n          tr.data(\"profmergeTooltip\")?.dispose()\n          tr.removeData(\"profmergeTooltip\")\n        } else {\n          selected.removeClass(\"profmerge-selected\")\n          const sbtn = selected.find(`[data-sotpf-act=\"profmerge-select\"]`)\n          sbtn.removeClass(\"btn-warning\").addClass(\"btn-outline-info\")\n          bootstrap.Tooltip.getInstance(sbtn.get(0))?.enable()\n          selected.data(\"profmergeTooltip\")?.dispose()\n          selected.removeData(\"profmergeTooltip\")\n          Turbo.visit(t.attr(\"href\").replace(\"__i__\", selected.data(\"sid\")))\n        }\n      } else {\n        tip?.hide()\n        tip?.disable()\n        t.addClass(\"btn-warning\").removeClass(\"btn-outline-info\")\n        tr.addClass(\"profmerge-selected\")\n        const tooltip = new bootstrap.Tooltip(_t.parentNode, {\n          trigger: \"manual\",\n          html: true,\n          placement: \"left\",\n          customClass: \"tooltip-fluid\",\n          title: `<strong>click the merge button on a different profile</strong><br><small class=\"text-mutedx\">click this merge button again to cancel</span>`,\n        })\n        tooltip.show()\n        tr.data(\"profmergeTooltip\", tooltip)\n      }\n      return false\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"setkey\"]`, ev => {\n      const btn = $(ev.currentTarget)\n      const furl = btn.data(\"fetchUrl\")\n      btn.attr(\"disabled\", \"disabled\")\n      fetch(furl).then(r => r.json()).then(j => {\n        new KeyModal(this).open(Object.assign({}, j, { update_url: furl }))\n        btn.removeAttr(\"disabled\")\n      })\n      return false\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"editfavs\"]`, ev => {\n      const btn = $(ev.currentTarget)\n      const furl = btn.data(\"fetchUrl\")\n      btn.attr(\"disabled\", \"disabled\")\n      fetch(furl).then(r => r.json()).then(j => {\n        new FavModal(this).open(Object.assign({}, j, { update_url: furl }))\n        btn.removeAttr(\"disabled\")\n      })\n      return false\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"fat_help_modal\"]`, ev => {\n      new FatHelpModal(this).open()\n      return false\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"ctn:jumpToMarker\"]`, ev => {\n      const l = $(ev.currentTarget).blur()\n      const m = l.closest(\".sot-data-container\").find(\".rec-marker\")\n      if(m.length) {\n        if(m.data(\"clickSotid\")) m.find(`[data-sotid]`).click()\n        m.get(0).scrollIntoView({ block: \"center\", inline: \"nearest\", behavior: \"smooth\" })\n      }\n      return false\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"ctn:toggleCompleted\"]`, ev => {\n      const l = $(ev.currentTarget).blur()\n      const s = l.find(\"span\")\n      const i = l.find(\"i\")\n      if (l.hasClass(\"btn-warning\")) {\n        l.removeClass(\"btn-warning\").addClass(\"btn-dark\")\n        i.removeClass(\"bi-eye\").addClass(\"bi-eye-slash\")\n        s.text(\"hide completed\")\n        l.closest(\".sot-data-container\").find(\".hide-completed\").show()\n      } else {\n        l.removeClass(\"btn-dark\").addClass(\"btn-warning\")\n        i.removeClass(\"bi-eye-slash\").addClass(\"bi-eye\")\n        s.text(\"show completed\")\n        l.closest(\".sot-data-container\").find(\".hide-completed\").hide()\n      }\n      return false\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"ctn:toggleCurrency\"]`, ev => {\n      const l = $(ev.currentTarget).blur()\n      const s = l.find(\"span\")\n      const i = l.find(\"i\")\n      if (l.hasClass(\"btn-warning\")) {\n        l.removeClass(\"btn-warning\").addClass(\"btn-dark\")\n        s.text(\"hide currency\")\n        l.closest(\".sot-data-container\").find(\".hide-currency\").show()\n      } else {\n        l.removeClass(\"btn-dark\").addClass(\"btn-warning\")\n        s.text(\"show currency\")\n        l.closest(\".sot-data-container\").find(\".hide-currency\").hide()\n      }\n      return false\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"ctn:toggleExpand\"]`, ev => {\n      const l = $(ev.currentTarget).blur()\n      const s = l.find(\"span\")\n      const i = l.find(\"i\")\n      if (l.hasClass(\"btn-secondary\")) {\n        l.removeClass(\"btn-secondary\").addClass(\"btn-dark\")\n        i.removeClass(\"bi-arrows-angle-contract\").addClass(\"bi-arrows-angle-expand\")\n        s.text(\"expand all\")\n        l.closest(\".sot-data-container\").find(\"details\").prop(\"open\", false)\n      } else {\n        l.removeClass(\"btn-dark\").addClass(\"btn-secondary\")\n        i.removeClass(\"bi-arrows-angle-expand\").addClass(\"bi-arrows-angle-contract\")\n        s.text(\"collapse all\")\n        l.closest(\".sot-data-container\").find(\"details\").prop(\"open\", true)\n      }\n      return false\n    })\n\n    $(document).on(\"click\", `[data-sotpf-act=\"createHotlinkPodal\"]`, ev => {\n      ev.preventDefault()\n\n      const tooltip = bootstrap.Tooltip.getOrCreateInstance(ev.currentTarget)\n      tooltip.hide()\n      tooltip.disable()\n      ev.currentTarget.parentElement.addEventListener(\"hidden.bs.dropdown\", ev => tooltip.enable(), { once: true })\n    })\n\n    $(window).on(\"hashchange\", ev => {\n      const hp = AppOS.Util.getHashParams(true, new URL(ev.originalEvent.newURL))\n      if(hp.forceJumpOnce) {\n        AppOS.Util.updateHashParams({ forceJumpOnce: undefined })\n        delete this.lastJumpedToNamedAnchor\n      }\n      if(hp.jump && hp.jump != this.lastJumpedToNamedAnchor) {\n        this.jumpToNamedAnchor(hp.jump)\n      }\n    })\n\n    EntitlementSearch.hookClicks(`[data-entitlement-search]`)\n    GotoAnywhere.hookClicks(`[data-goto-anywhere]`)\n    InlineCompare.hookClicks()\n    MissingEntitlements.hookClicks()\n  }\n\n  pageLoad() {\n    $(`[data-sotpf-act=\"ctn:toggleCompleted\"][data-sotpf-clickinitial]`).click()\n\n    if (window.location.hash == \"#api-error\") {\n      $(`[data-sotpf-act=\"setkey\"]`).click()\n      window.location.hash = \"\"\n    }\n\n    this.container = $(\"#pv-main\")\n    if(this.container.length && !this.entmapper) {\n      this.entmapper = new EntitlementMapper(this.container.data(\"pvBase\") + \"/entitlements\", {\n        pvBase: this.container.data(\"pvBase\"),\n      })\n    }\n\n    const scrollTarget = document.querySelector(`[data-scroll-to-this]`)\n    if(scrollTarget) this.scrollQueue.enqueue(scrollTarget, { delay: 200 })\n\n    this.setupConfetti()\n\n    if(document.querySelector(`[data-flist=\"encounters\"]`)) {\n      $(`[data-flist=\"encounters\"] details.sot-compactable-encounter`).on(\"toggle\", ev => {\n        const parent = $(ev.currentTarget).closest(`[data-sotid]`)\n        parent.find(\".ratio-outer\").css({ minWidth: `${ev.currentTarget.open ? 96 : 48}px` })\n      })\n    }\n\n    $(`[data-entitlement-search]`).each((i, el) => { new EntitlementSearch(this, $(el), this.entmapper) })\n    $(`[data-goto-anywhere]`).each((i, el) => { new GotoAnywhere(this, $(el), this.entmapper).hook() })\n    $(`[data-graph-anything]`).each((i, el) => { new GraphAnything(this, $(el)).hook() })\n    $(`[data-tracer-ui]`).each((i, el) => { new TracerUI(this, $(el)).hook() })\n    $(`[data-net-worth-ui]`).each((i, el) => { new NetWorthUI(this, $(el)).hook() })\n    $(`[data-emote-loadout]`).each((i, el) => { new EmoteLoadoutUI(this, $(el)).hook() })\n    // $(`[data-twitch-drops-ui]`).each((i, el) => { new TwitchDrops(this, $(el), this.entmapper, { is: \"ui\" }).hook() })\n    $(`[data-twitch-drop-overview]`).each((i, el) => { new TwitchDrops(this, $(el), this.entmapper, { is: \"overview\" }).hook() })\n    $(`[data-insider-timer]`).each((i, el) => { new InsiderTimer(this, $(el)).hook() })\n    $(`[data-missing-entitlements]`).each((i, el) => { new MissingEntitlements(this, el).hook() })\n\n    this.setupRefreshButton()\n    this.setupBalanceDiff()\n    this.setupFavoriteToggles()\n\n    const hp = AppOS.Util.getHashParams()\n    if(hp.forceJumpOnce) {\n      AppOS.Util.updateHashParams({ forceJumpOnce: undefined })\n      delete this.lastJumpedToNamedAnchor\n    }\n    this.jumpToNamedAnchor(hp.jump)\n  }\n\n  setupConfetti() {\n    const confetti_canvas = document.getElementById(\"confetti-canvas\")\n    if(confetti_canvas) new Confetti({ canvas: confetti_canvas, start: true })\n    // const confetti = new Confetti({emoji: \"\uD83C\uDF89\"})\n    // confetti.start()\n    // document.addEventListener(\"click\", e => {\n    //   confetti.emitAt(e.clientX, e.clientY, 15)\n    // })\n    // if(confetti_canvas) {\n    //   confetti_canvas.confetti ||= confetti.create(confetti_canvas, { resize: true })\n\n    //   var defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 0 }\n    //   const randomInRange = (min, max) => Math.random() * (max - min) + min\n    //   var interval = setInterval(() => {\n    //     var particleCount = 50\n    //     confetti({ ...defaults, particleCount, origin: { x: randomInRange(0.1, 0.3), y: Math.random() - 0.2 } })\n    //     confetti({ ...defaults, particleCount, origin: { x: randomInRange(0.7, 0.9), y: Math.random() - 0.2 } })\n    //   }, 250)\n    // }\n\n    this.goatConfetti()\n  }\n\n  goatConfetti() {\n    var canvas = document.getElementById(\"goat-canvas\")\n    if(!canvas) return\n    canvas.confetti ??= confetti.create(canvas, { resize: true })\n    canvas.confetti.reset()\n\n    // if(document.goatRunning) {\n    //   // return setTimeout(_ => {\n    //   //   this.goatConfetti()\n    //   //   console.log(\"retrying\")\n    //   // }, 2000)\n    // }\n    // document.goatRunning = true\n    var duration = 2 * 1000\n    var animationEnd = Date.now() + duration\n    var skew = 1\n    var scalar = 20\n    var goat = null\n    const randomInRange = (min, max) => Math.random() * (max - min) + min;\n\n\n    (function frame() {\n      var timeLeft = animationEnd - Date.now()\n      var ticks = 100//Math.max(10, 500 * (timeLeft / duration))\n      goat ??= confetti.shapeFromText({ text: `\uD83D\uDC10`, scalar })\n      skew = Math.max(0.8, skew - 0.001)\n\n      canvas.confetti({\n        particleCount: 1,\n        startVelocity: 0,\n        ticks: ticks,\n        origin: {\n          x: Math.random(),\n          // since particles fall down, skew start toward the top\n          y: (Math.random() * skew) - 0.2\n        },\n        colors: ['#ffffff'],\n        shapes: [goat],\n        gravity: randomInRange(0.3, 0.6),\n        scalar: randomInRange(3, 5),\n        drift: randomInRange(-0.1, 0.1),\n      })\n\n      if (timeLeft > 0) return requestAnimationFrame(frame)\n      // document.goatRunning = false\n    }())\n  }\n\n  jumpToNamedAnchor(name) {\n    if(!name) return\n    this.lastJumpedToNamedAnchor = name\n    let jumpTo = document.querySelector(`[data-jump=\"${name.replace(/\"/g, '\\\\\"')}\"]`)\n    if(!jumpTo) return\n\n    $(\".last-clicked[data-jump]\").removeClass(\"last-clicked\")\n    if(jumpTo.dataset.jumpTarget) {\n      if(jumpTo.dataset.jumpTarget == \"::parent\") {\n        jumpTo = jumpTo.parentElement\n      } else {\n        jumpTo = document.querySelector(jumpTo.dataset.jumpTarget)\n      }\n    }\n    jumpTo.classList.add(\"last-clicked\")\n    this.scrollQueue.enqueue(jumpTo, { delay: 200, ifNeeded: true })\n  }\n\n  async setupFavoriteToggles() {\n    $(`[data-sotpv-togglefav]`).each((i, _el) => {\n      const el = $(_el)\n      if(el.data(\"togglefavInitialized\")) return\n      el.data(\"togglefavInitialized\", true)\n      const ico = $(`<i class=\"bi bi-star text-muted\"></i>`)\n      let failInstance = null\n      el.data(\"togglefavPrepend\") ? el.prepend(ico) : el.append(ico)\n      el.css({ cursor: \"pointer\" })\n      el.attr(\"title\", \"toggle favorite\")\n      const ttinst = new bootstrap.Tooltip(_el, { delay: { show: 400, hide: 100 } })\n      this.updateFavtoggle(el, ico, el.data(\"sotpvFaved\"))\n\n      el.click(ev => {\n        const title = ttinst.tip?.querySelector(\".tooltip-inner\")\n\n        if(ev.altKey) {\n          navigator.clipboard.writeText(el.data(\"sotpvTogglefav\"))\n          .then(_ => {\n            if(title) title.textContent = \"copied to clipboard\"\n            ttinst.update()\n          })\n          .catch(err => {\n            alert(\"failed to copy to clipboard\")\n          })\n          return false\n        }\n\n        failInstance?.dispose()\n        failInstance = null\n        ttinst.enable()\n\n        if($(`.fav-disabled[data-sotpv-togglefav]`).length) {\n          failInstance = new bootstrap.Tooltip(ico.get(0), { trigger: \"manual\", html: true, title: `<strong class=\"text-danger\">too fast, try again</strong>` })\n          failInstance.show()\n          ttinst.disable()\n          this.updateFavtoggle(el, ico, \"error\")\n          return false\n        }\n\n        this.updateFavtoggle(el, ico, \"progress\")\n\n        const formData = new FormData()\n        formData.append(\"toggle\", el.data(\"sotpvTogglefav\"))\n\n        el.addClass(\"fav-disabled\")\n        if (title) {\n          title.textContent = \"please wait\"\n          ttinst.update()\n        }\n\n        fetch(el.data(\"sotpvFavep\"), {\n          method: 'POST',\n          body: formData,\n          headers: {\n            \"X-CSRF-Token\": $(\"meta[name=csrf-token]\").attr(\"content\"),\n          }\n        }).then(r => r.json()).then(j => {\n          this.updateFavtoggle(el, ico, j.toggled)\n        }).catch(err => {\n          this.updateFavtoggle(el, ico, \"error\")\n          alert(\"Request failed :( Sorry about that, maybe try again\")\n        }).finally(_ => {\n          el.removeClass(\"fav-disabled\")\n          if (title) {\n            title.textContent = \"toggle favorite\"\n            ttinst.update()\n          }\n        })\n        return false\n      })\n    })\n  }\n\n  async updateFavtoggle(el, ico, toggle) {\n    ico.removeClass(\"text-muted text-info text-warning text-success text-danger bi-star bi-star-fill bi-arrow-repeat\")\n    if(toggle == \"progress\") {\n      ico.addClass(\"text-info bi-arrow-repeat\")\n    } else if (toggle == \"error\") {\n      ico.addClass(`text-danger bi-star${el.data(\"sotpvFaved\") ? \"-fill\" : \"\"}`)\n    } else if (toggle) {\n      el.attr(\"data-sotpv-faved\", true)\n      ico.addClass(\"text-warning bi-star-fill\")\n    } else {\n      el.attr(\"data-sotpv-faved\", false)\n      ico.addClass(\"text-muted bi-star\")\n    }\n  }\n\n  async setupBalanceDiff() {\n    $(`div[data-sotpf-ctn=\"balance-diff\"] [data-sotpf-bdiff]`).html(\"\")\n    $(`div[data-sotpf-ctn=\"balance-diff\"] table tbody tr`).each((i, el) => {\n      this.diffBalanceAb(el, el.nextElementSibling)\n    })\n\n    $(`div[data-sotpf-ctn=\"balance-diff\"] table`).on(\"click\", \"tr\", ev => {\n      const tr = $(ev.currentTarget)\n      const tb = tr.closest(\"tbody\")\n      const ctn = tb.closest(`[data-sotpf-ctn=\"balance-diff\"]`)\n      let sr = tb.find(\"tr.hash-active\")\n\n      if(ctn.data(\"interactive\") === false) {\n        return true\n      }\n\n      if (sr.length == 2) {\n        const a_index = tb.find(\"tr\").index(sr.eq(0))\n        const b_index = tb.find(\"tr\").index(sr.eq(1))\n\n        tb.find(`tr`).each((i, el) => {\n          if ((i > a_index && i < b_index) || (i == a_index || i == b_index)) {\n            this.diffBalanceAb(el, el.nextElementSibling)\n            $(el).removeClass(\"text-muted\")\n          }\n        })\n\n        sr.removeClass(\"hash-active\")\n        return false\n      }\n\n      if (sr.length < 2) {\n        tr.toggleClass(\"hash-active\")\n        sr = tb.find(\"tr.hash-active\")\n      }\n\n      if (sr.length == 2) {\n        //$(`div[data-sotpf-ctn=\"balance-diff\"] [data-sotpf-bdiff] .delta`).html(\"\")\n        const a_index = tb.find(\"tr\").index(sr.eq(0))\n        const b_index = tb.find(\"tr\").index(sr.eq(1))\n\n        tb.find(`tr`).each((i, el) => {\n          if (i > a_index && i < b_index) {\n            $(el).addClass(\"text-muted\")\n            $(el).find(`[data-sotpf-bdiff] .delta`).html(\"\")\n          // } else if (i < a_index || i > b_index) {\n            //this.diffBalanceAb(el, el.nextElementSibling)\n          } else if (i == a_index) {\n            this.diffBalanceAb(sr.get(0), sr.get(1))\n          }\n        })\n      }\n      return false\n    })\n  }\n\n  async diffBalanceAb(a, b) {\n    const fmt = new Intl.NumberFormat('en-US')\n    const skipCompare = $(a).closest(`[data-sotpf-ctn=\"balance-diff\"]`).data(\"skipInitial\")\n    const prepend = $(a).closest(`[data-sotpf-ctn=\"balance-diff\"]`).data(\"prependDiff\")\n\n    const d = {\n      gold: a.dataset.gold - (b?.dataset?.gold ?? 0),\n      doubloons: a.dataset.doubloons - (b?.dataset?.doubloons ?? 0),\n      ancientCoins: a.dataset.ancientCoins - (b?.dataset?.ancientCoins ?? 0),\n    }\n\n    for (const [k, v] of Object.entries(d)) {\n      const par = $(a).find(`[data-sotpf-bdiff=\"${k}\"]`).html(\"\")\n\n      $(`<span>`)\n        .addClass(\"value\")\n        .text(fmt.format(a.dataset[k]))\n        .appendTo(par)\n\n      if(b || !skipCompare) {\n        const small = $(`<small>`)\n          .addClass(\"delta\")\n          .text((prepend ? \"\" : \" \") + (v == 0 ? \"~\" : v > 0 ? `+${fmt.format(v)}` : fmt.format(v)) + (prepend ? \" \" : \"\"))\n          .addClass(v > 0 ? \"text-success\" : v < 0 ? \"text-danger\" : \"text-muted\")\n        prepend ? small.prependTo(par) : small.appendTo(par)\n      }\n    }\n  }\n\n  refreshBtnTimeoutTick(btn, bbtn, status, throttled_for = null) {\n    if(throttled_for) {\n      btn.data(\"refreshTimeoutIntervalRemain\", throttled_for)\n    }\n    const v = btn.data(\"refreshTimeoutIntervalRemain\")\n    if (v > 60) {\n      const m = parseInt(v/60)\n      status.html(`wait ${m} minute${m == 1 ? \"\" : \"s\"}`)\n    } else if (v > 0) {\n      const s = parseInt(v)\n      status.html(`wait ${s} second${s == 1 ? \"\" : \"s\"}`)\n    } else {\n      return this.initRefreshButton(btn, bbtn)\n    }\n\n    btn.data(\"refreshTimeoutIntervalRemain\", v - 1)\n    setTimeout(_ => this.refreshBtnTimeoutTick(btn, bbtn, status), 1000)\n  }\n\n  setupRefreshButton() {\n    $(\".poll-profile-btn\").each((i, _el) => {\n      const btn = $(_el)\n      const balance_btn = btn.next(\".poll-balance-btn\")\n      const status = btn.find(`[stopf-val=\"refresh_status\"]`)\n      const icon = btn.find(\"i.bi\")\n      this.initRefreshButton(btn, balance_btn)\n\n      btn.click(ev => {\n        if(btn.prop(\"disabled\")) return false\n\n        btn.attr(\"disabled\", \"disabled\")\n        bootstrap.Tooltip.getOrCreateInstance(btn.get(0)).hide()\n        btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-warning\")\n        icon.get(0).classList = \"bi bi-cloud-arrow-down\"\n        status.html(`updating (1/${btn.data(\"endpoints\").length})...`)\n\n        this.refreshFetchLoop(btn, balance_btn, status, btn.data(\"fetchUrl\"))\n        return false\n      })\n\n      balance_btn.click(ev => {\n        if(balance_btn.prop(\"disabled\")) return false\n\n        btn.attr(\"disabled\", \"disabled\")\n        balance_btn.attr(\"disabled\", \"disabled\")\n        bootstrap.Tooltip.getOrCreateInstance(balance_btn.get(0)).hide()\n        balance_btn.find(\"i.bi\").get(0).classList = \"bi bi-cloud-arrow-down\"\n        btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-warning\")\n        status.html(`fetching balance...`)\n\n        fetch(balance_btn.data(\"fetchUrl\"), {\n          method: 'POST',\n          headers: {\n            \"X-CSRF-Token\": $(\"meta[name=csrf-token]\").attr(\"content\"),\n          }\n        }).then(r => r.json()).then(j => {\n          if (j.success) {\n            if (j.changed) {\n              btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-success\")\n              status.html(\"SUCCESS! reloading...\")\n              setTimeout(_ => window.location.reload(), 2000)\n            } else {\n              btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-info\")\n              status.html(\"balance has not changed\")\n              setTimeout(_ => this.initRefreshButton(btn, balance_btn), 5000)\n            }\n          } else {\n            status.html(j.error)\n            btn.removeAttr(\"disabled\")\n            balance_btn.removeAttr(\"disabled\")\n            btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-danger\")\n            setTimeout(_ => this.initRefreshButton(btn, balance_btn), 5000)\n          }\n        })\n        return false\n      })\n    })\n  }\n\n  refreshFetchLoop(btn, bbtn, status, furl) {\n    fetch(furl, {\n      method: 'POST',\n      headers: {\n        \"X-CSRF-Token\": $(\"meta[name=csrf-token]\").attr(\"content\"),\n      }\n    }).then(r => r.json()).then(j => {\n      if (j.fetch_url) {\n        status.html(`updating (${btn.data(\"endpoints\").length + j.status + 1}/${btn.data(\"endpoints\").length})...`)\n        setTimeout(_ => this.refreshFetchLoop(btn, bbtn, status, j.fetch_url), 500)\n      } else if (j.success) {\n        btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-success\")\n        status.html(\"SUCCESS! reloading...\")\n        setTimeout(_ => window.location.reload(), 2000)\n      } else {\n        status.html(j.error)\n        btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-danger\")\n        setTimeout(_ => this.initRefreshButton(btn), 5000)\n      }\n    })\n  }\n\n  initRefreshButton(btn, bbtn) {\n    const furl = btn.data(\"fetchUrl\")\n    const status = btn.find(`[stopf-val=\"refresh_status\"]`)\n    const icon = btn.find(\"i.bi\")\n\n    icon.get(0).classList = \"bi bi-hourglass-split\"\n    fetch(furl).then(r => r.json()).then(j => {\n      if(!j.has_key) {\n        btn.attr(\"disabled\", \"disabled\")\n        bbtn?.remove()\n        btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-secondary\")\n        icon.get(0).classList = \"bi bi-infinity\"\n        status.html(\"no key\")\n      } else if (j.api_error) {\n        btn.attr(\"disabled\", \"disabled\")\n        bbtn?.remove()\n        btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-warning\")\n        icon.get(0).classList = \"bi bi-alert-triangle\"\n        status.html(\"api error\")\n      } else if (j.throttled) {\n        btn.attr(\"disabled\", \"disabled\")\n        bbtn?.addClass(\"d-none\")\n        btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-secondary\")\n        icon.get(0).classList = \"bi bi-clock-history\"\n        this.refreshBtnTimeoutTick(btn, bbtn, status, j.throttled)\n      } else {\n        btn.removeClass(\"btn-secondary btn-primary btn-dark btn-danger btn-warning btn-success btn-info\").addClass(\"btn-primary\")\n        btn.removeClass(\"rounded-end\").css({ minWidth: \"114px\" }).removeAttr(\"disabled\")\n        bbtn?.removeClass(\"d-none\")?.removeAttr(\"disabled\")\n        icon.get(0).classList = \"bi bi-arrow-repeat\"\n        status.html(\"update data\")\n      }\n    })\n  }\n}\n\nwindow.spfapp = SotProfileViewerApp.boot({ debug: document.querySelector(\"html\")?.dataset.env == \"development\" })\n"],
  "mappings": "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",
  "names": ["Application", "opts", "bootFunction", "app", "_", "NamespacedConsole", "Debugger", "SimpleEvents", "efn", "imp", "ins", "res", "cins", "ComponentLoader", "app", "comp", "exps", "use", "emap", "name", "exp", "ins", "promises", "el", "component", "src", "resolve", "reject", "script", "ev", "Component", "app", "opts", "NamespacedConsole", "efn", "args", "Util", "NamespacedConsole", "target", "opts", "bconfig", "_", "nsStrProc", "nsStr", "el", "msg", "SimpleEvents", "_SimpleEvents", "target", "events", "opts", "tev", "evn", "cb", "_", "index", "args", "fn", "capitalized", "Debugger", "_Debugger", "app", "NamespacedConsole", "target", "name", "receiver", "rv", "ns", "attr", "vklass", "v", "deb", "val", "inst", "SimpleEvents", "_", "Util", "v", "url", "force_turbolinks", "str", "defVal", "s", "decimals", "urlDecode", "source", "result", "hsh", "kv", "kvp", "key", "toMerge", "opts", "hparams", "k", "el", "callback", "observer", "entries", "entry", "func", "timeout", "timer", "args", "timer2", "includeHidden", "position", "excludeStaticParent", "overflowRegex", "scrollParent", "parent", "target", "toff", "soff", "stop", "x", "y", "usableHeight", "oh", "starget", "play", "volume", "snd", "freq", "onStop", "resolve", "reject", "context", "oscillator", "gainNode", "cb", "err", "duration", "beep", "_", "seq", "dur", "vol", "wait", "form", "ptr", "b", "chunks", "freqWas", "wptr", "repeats", "setFreq", "_wait", "i", "ms", "AppOS", "_AppOS", "app", "_", "ComponentLoader", "type", "env", "tpl", "f", "bases", "Bases", "base", "prop", "str", "template", "bootFunction", "mergeClassesFunction", "mergeClassesAsModuleFunction", "x", "b", "c", "d", "expo", "slowExpo", "s", "p", "a", "Component", "ev", "el", "pe", "nb", "node", "Application", "Component", "ev", "_", "Application", "ElementRevolver", "elements", "opts", "i", "el", "_", "scale", "x", "firstAngle", "pos", "scaleFactor", "opacityFactor", "rect", "ellapsedTime", "angle", "radius", "rad", "ThreeD_Carousel", "ctn", "e", "o", "entries", "observer", "m", "width", "height", "edge", "center", "Component", "Application", "ScrollQueue", "opts", "ev", "_", "item", "element", "scrollOpts", "Component", "i", "_el", "el", "index", "offset", "render", "r", "a_index", "page", "row", "col", "ico", "Application", "TrigramIndex", "inputPhrases", "phrase", "string", "callback", "rawData", "i", "id", "phraseIndex", "trigram", "phrasesForTrigram", "phraseMatches", "trigramsInPhrase", "j", "result", "a", "b", "EntitlementMapper", "url", "opts", "EntitlementItem", "TrigramIndex", "el", "i", "base", "resolve", "reject", "r", "json", "func", "query", "m", "num", "ary", "name", "matches", "index", "s", "t", "d", "_", "prev", "current", "j", "insert", "deleteScore", "replaceScore", "limit", "log", "filteredArray", "args", "mapper", "id", "EntitlementSearch", "selector", "ev", "i", "el", "app", "ctn", "mapper", "_", "offset", "target", "Util", "selectFirst", "current", "selectLast", "query", "map", "results", "l", "bgColor", "AchievementMapper", "EntitlementMapper", "TrigramIndex", "el", "i", "PagesMapper", "base", "url", "GotoAnywhere", "selector", "ev", "app", "ctn", "mapper", "_", "triggerBind", "clearFor", "popup", "target", "exps", "Util", "selectFirst", "current", "fuckyoujs", "selectLast", "query", "maxResults", "thresholdRatio", "resolve", "reject", "map", "results", "a", "l", "nameCtn", "bgColor", "force", "resultCount", "r", "Modal", "opts", "evlist", "SimpleEvents", "efn", "capitalized", "v", "_", "div", "ev", "FormModal", "dom", "YesNoModal", "m", "GraphAnything", "app", "el", "opts", "msg", "spinner", "textColor", "sIcon", "c", "color", "i", "_", "jid", "jri", "r", "json", "row", "err", "ContinueModal", "m", "all", "lr", "eopts", "internal", "continueBuffering", "item", "tdelta", "timeout", "urlparams", "loc", "url", "exps", "ev", "selector", "key", "value", "tr", "datasets", "gkey", "dset", "nd", "d", "index", "markers", "d1", "d2", "fd", "sd", "marker", "mi", "m_date", "anno", "label", "ctx", "event", "updateChart", "YesNoModal", "l", "TracerUI", "app", "el", "opts", "msg", "spinner", "textColor", "sIcon", "c", "color", "i", "_", "jid", "jri", "r", "json", "row", "err", "internal", "continueBuffering", "item", "event", "evdata", "tr", "ev_date", "ev_snapid", "ev_before", "ev_after", "sub", "ul", "l", "ll", "tdelta", "timeout", "selector", "DEV", "DELAYS", "DEV", "key", "value", "LoadingScreen", "ui", "_", "currency", "error", "spinner", "resolve", "reject", "replaceWith", "result", "settings", "replacedSpinners", "el", "currencies", "ev", "NetWorthUI", "app", "opts", "Util", "t", "ct", "i", "i1", "i2", "selector", "hsh", "dir", "b", "sub", "toggle", "ico", "toggleWasNull", "timeStart", "item", "i_currency", "cost", "timelimited", "seasonitem", "i_type", "i_chest", "chest_name", "net_worth", "total_worth", "chestTable", "tr", "typeTable", "w_c0", "w_c1", "w_c2", "maxWidth", "row", "values", "size", "r0", "r1", "r2", "total", "active", "grp_indicator", "grp_ico", "duration", "n", "col", "c1", "c2", "rowCol", "tbody", "items", "a", "c", "d", "EmoteLoadoutUI", "app", "el", "opts", "ev", "newLD", "e", "i", "t", "ico", "activeWheelSlot", "scriptPlugin", "buf", "page", "pi", "row", "ri", "name", "p", "r", "c", "hstrings", "hstring", "toEquip", "a", "b", "ptr", "delta", "imax", "idx", "px", "sx", "num", "scope", "qname", "res", "inp", "slot", "newHstrings", "targetEmote", "dir", "selectedEmoteEntry", "prev", "ss", "si", "amap", "cp", "mp", "sels", "selectedWheelSlot", "outer", "coord", "emote", "pnum", "snum", "currentPos", "em", "sf", "slot_hstrings", "hs", "span", "payload", "filename", "element", "data", "tpl", "_clone", "clone", "fati", "prc", "rows", "slot_name", "slot_desc", "slot_img", "emsg", "selector", "TwitchDrops", "app", "el", "mapper", "opts", "i", "dropEl", "drop", "tip", "indicator", "vOwned", "vOwnedPercent", "map", "owned", "perc", "startsIn", "timeRemaining", "percStr", "lessThan12Hours", "seconds", "res", "stra", "InsiderTimer", "app", "el", "opts", "ev", "key", "value", "defVal", "e", "fakePause", "data", "state", "reschedule", "_", "t_delta", "perc", "ms", "neg", "fms", "h", "m", "s", "f_h", "f_m", "f_s", "rat", "selector", "KeyModal", "parent", "opts", "d", "ev", "FavModal", "parent", "opts", "d", "ev", "FatHelpModal", "parent", "opts", "d", "module", "main", "global", "isWorker", "workerSize", "canUseWorker", "canUsePaths", "canDrawBitmap", "canvas", "ctx", "bitmap", "noop", "promise", "func", "ModulePromise", "Prom", "bitmapMapper", "skipTransform", "map", "raf", "TIME", "frame", "cancel", "frames", "lastFrameTime", "cb", "id", "onFrame", "time", "timer", "getWorker", "worker", "prom", "resolves", "decorate", "execute", "options", "callback", "offscreen", "size", "done", "resolve", "workerDone", "msg", "code", "e", "defaults", "convert", "val", "transform", "isOk", "prop", "name", "onlyPositiveInt", "number", "randomInt", "min", "max", "toDecimal", "str", "colorsToRgb", "colors", "hexToRgb", "getOrigin", "origin", "setCanvasWindowSize", "setCanvasRectSize", "rect", "getCanvas", "zIndex", "ellipse", "context", "x", "y", "radiusX", "radiusY", "rotation", "startAngle", "endAngle", "antiClockwise", "randomPhysics", "opts", "radAngle", "radSpread", "updateFetti", "fetti", "progress", "x1", "y1", "x2", "y2", "transformPath2D", "scaleX", "scaleY", "width", "height", "matrix", "pattern", "rot", "innerRadius", "outerRadius", "spikes", "step", "animate", "fettis", "resizer", "animatingFettis", "animationFrame", "destroy", "onDone", "update", "confettiCannon", "globalOpts", "isLibCanvas", "allowResize", "hasResizeEventRegistered", "globalDisableForReducedMotion", "shouldUseWorker", "initialized", "preferLessMotion", "animationObj", "fireLocal", "particleCount", "angle", "spread", "startVelocity", "decay", "gravity", "drift", "ticks", "shapes", "scalar", "flat", "temp", "startX", "startY", "fire", "disableForReducedMotion", "onResize", "obj", "defaultFire", "getDefaultFire", "pathString", "pathMatrix", "path2d", "t1", "t2", "shapeFromPath", "pathData", "path", "tempCanvas", "tempCtx", "maxSize", "minX", "minY", "maxX", "maxY", "maxDesiredSize", "scale", "shapeFromText", "textData", "text", "color", "fontFamily", "fontSize", "font", "padding", "confetti_module_default", "create", "Confetti", "options", "existingCanvas", "p", "emojis", "x", "y", "count", "i", "timeout", "min", "max", "now", "delta", "x2", "y2", "grad", "InlineCompare", "selectors", "ev", "clicked", "parent", "instance", "inst", "dom", "div", "params", "r", "j", "err", "friend", "fi", "value", "meta", "tr", "td_gt", "favico", "gt_a", "td_img", "td_img_el", "td_prog", "prog", "ExternalPromise", "resolve", "reject", "_", "args", "Util", "str", "data", "binaryString", "b64", "bytes", "q", "string", "separator", "preserveCase", "locale", "parameterized", "escaped", "reDuplicate", "reTrim", "company", "tier", "int", "l", "SerializeParams", "args", "dom", "params", "el", "v", "d", "ss", "t", "ta", "parent", "hparams", "key", "value", "MissingEntitlements", "selectors", "app", "_", "err", "ev", "tarea", "help", "dbitem", "vtype", "i", "types", "tag", "step", "promise", "resolve", "reject", "r", "json", "s", "k", "qa", "f_total", "item", "ppresolve", "ppreject", "entTarget", "tplEl", "itemsToRender", "sliced", "ico_gold", "ico_doubloons", "ico_ancient_coins", "ico_factions", "factionMap", "clone", "cPrice", "cReqs", "name", "cDetails", "commLink", "pre", "pre_details", "aoLink", "aoImage", "observer", "p", "ExternalPromise", "progress", "now", "filterExclusion", "f", "tagged", "fbody", "filterAgain", "fenv", "tags", "fields", "includeNull", "field", "fn", "property", "sortOrder", "a", "b", "ptr", "vv", "arg", "fCtn", "filterGroups", "type", "items", "t_type", "t_arg", "ynn", "subs", "target", "listTarget", "label", "sub", "skey", "c", "e", "warning", "link2", "state", "filter", "requeue", "ynn_Original", "val", "obj", "outer", "msg", "ecount", "emsg", "status", "text", "icon", "stext", "SotProfileViewerApp", "Application", "c", "ScrollQueue", "ev", "target", "hadClass", "i", "el", "_t", "t", "tip", "tr", "selected", "sbtn", "tooltip", "btn", "furl", "r", "j", "KeyModal", "FavModal", "FatHelpModal", "m", "l", "hp", "Util", "EntitlementSearch", "GotoAnywhere", "InlineCompare", "MissingEntitlements", "EntitlementMapper", "scrollTarget", "GraphAnything", "TracerUI", "NetWorthUI", "EmoteLoadoutUI", "TwitchDrops", "InsiderTimer", "confetti_canvas", "Confetti", "canvas", "confetti_module_default", "duration", "animationEnd", "skew", "scalar", "goat", "randomInRange", "min", "max", "frame", "timeLeft", "ticks", "name", "jumpTo", "_el", "ico", "failInstance", "ttinst", "title", "_", "err", "formData", "toggle", "tb", "ctn", "sr", "a_index", "b_index", "a", "b", "fmt", "skipCompare", "prepend", "d", "k", "v", "par", "small", "bbtn", "status", "throttled_for", "s", "balance_btn", "icon"]
}
