bc-deeplib 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/deeplib.d.ts +54 -35
- package/dist/deeplib.js +180 -87
- package/dist/deeplib.js.map +2 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/vendored_types/utility.d.ts +3 -0
- package/package.json +1 -1
package/dist/deeplib.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../node_modules/.pnpm/bondage-club-mod-sdk@1.2.0/node_modules/bondage-club-mod-sdk/dist/bcmodsdk.js", "../src/base/base_module.ts", "../src/base/base_subscreen.ts", "../src/styles/index.scss", "../src/base/initialization.ts", "../src/base/modules.ts", "../src/migrators/base_migrator.ts", "../src/modules/gui.ts", "../src/modules/version.ts", "../src/screens/debug.ts", "../src/utilities/common.ts", "../src/utilities/elements/elements.ts", "../src/screens/main_menu.ts", "../src/screens/import_export.ts", "../src/utilities/data.ts", "../src/utilities/elements/helpers.ts", "../src/utilities/elements/layout.ts", "../src/utilities/logger.ts", "../src/utilities/messages.ts", "../src/utilities/sdk.ts", "../src/utilities/style.ts", "../src/utilities/translation.ts", "../src/utilities/event_channel.ts"],
|
|
4
|
-
"sourcesContent": ["// Bondage Club Mod Development Kit (1.2.0)\n// For more info see: https://github.com/Jomshir98/bondage-club-mod-sdk\n/** @type {ModSDKGlobalAPI} */\nvar bcModSdk=function(){\"use strict\";const o=\"1.2.0\";function e(o){alert(\"Mod ERROR:\\n\"+o);const e=new Error(o);throw console.error(e),e}const t=new TextEncoder;function n(o){return!!o&&\"object\"==typeof o&&!Array.isArray(o)}function r(o){const e=new Set;return o.filter((o=>!e.has(o)&&e.add(o)))}const i=new Map,a=new Set;function c(o){a.has(o)||(a.add(o),console.warn(o))}function s(o){const e=[],t=new Map,n=new Set;for(const r of f.values()){const i=r.patching.get(o.name);if(i){e.push(...i.hooks);for(const[e,a]of i.patches.entries())t.has(e)&&t.get(e)!==a&&c(`ModSDK: Mod '${r.name}' is patching function ${o.name} with same pattern that is already applied by different mod, but with different pattern:\\nPattern:\\n${e}\\nPatch1:\\n${t.get(e)||\"\"}\\nPatch2:\\n${a}`),t.set(e,a),n.add(r.name)}}e.sort(((o,e)=>e.priority-o.priority));const r=function(o,e){if(0===e.size)return o;let t=o.toString().replaceAll(\"\\r\\n\",\"\\n\");for(const[n,r]of e.entries())t.includes(n)||c(`ModSDK: Patching ${o.name}: Patch ${n} not applied`),t=t.replaceAll(n,r);return(0,eval)(`(${t})`)}(o.original,t);let i=function(e){var t,i;const a=null===(i=(t=m.errorReporterHooks).hookChainExit)||void 0===i?void 0:i.call(t,o.name,n),c=r.apply(this,e);return null==a||a(),c};for(let t=e.length-1;t>=0;t--){const n=e[t],r=i;i=function(e){var t,i;const a=null===(i=(t=m.errorReporterHooks).hookEnter)||void 0===i?void 0:i.call(t,o.name,n.mod),c=n.hook.apply(this,[e,o=>{if(1!==arguments.length||!Array.isArray(e))throw new Error(`Mod ${n.mod} failed to call next hook: Expected args to be array, got ${typeof o}`);return r.call(this,o)}]);return null==a||a(),c}}return{hooks:e,patches:t,patchesSources:n,enter:i,final:r}}function l(o,e=!1){let r=i.get(o);if(r)e&&(r.precomputed=s(r));else{let e=window;const a=o.split(\".\");for(let t=0;t<a.length-1;t++)if(e=e[a[t]],!n(e))throw new Error(`ModSDK: Function ${o} to be patched not found; ${a.slice(0,t+1).join(\".\")} is not object`);const c=e[a[a.length-1]];if(\"function\"!=typeof c)throw new Error(`ModSDK: Function ${o} to be patched not found`);const l=function(o){let e=-1;for(const n of t.encode(o)){let o=255&(e^n);for(let e=0;e<8;e++)o=1&o?-306674912^o>>>1:o>>>1;e=e>>>8^o}return((-1^e)>>>0).toString(16).padStart(8,\"0\").toUpperCase()}(c.toString().replaceAll(\"\\r\\n\",\"\\n\")),d={name:o,original:c,originalHash:l};r=Object.assign(Object.assign({},d),{precomputed:s(d),router:()=>{},context:e,contextProperty:a[a.length-1]}),r.router=function(o){return function(...e){return o.precomputed.enter.apply(this,[e])}}(r),i.set(o,r),e[r.contextProperty]=r.router}return r}function d(){for(const o of i.values())o.precomputed=s(o)}function p(){const o=new Map;for(const[e,t]of i)o.set(e,{name:e,original:t.original,originalHash:t.originalHash,sdkEntrypoint:t.router,currentEntrypoint:t.context[t.contextProperty],hookedByMods:r(t.precomputed.hooks.map((o=>o.mod))),patchedByMods:Array.from(t.precomputed.patchesSources)});return o}const f=new Map;function u(o){f.get(o.name)!==o&&e(`Failed to unload mod '${o.name}': Not registered`),f.delete(o.name),o.loaded=!1,d()}function g(o,t){o&&\"object\"==typeof o||e(\"Failed to register mod: Expected info object, got \"+typeof o),\"string\"==typeof o.name&&o.name||e(\"Failed to register mod: Expected name to be non-empty string, got \"+typeof o.name);let r=`'${o.name}'`;\"string\"==typeof o.fullName&&o.fullName||e(`Failed to register mod ${r}: Expected fullName to be non-empty string, got ${typeof o.fullName}`),r=`'${o.fullName} (${o.name})'`,\"string\"!=typeof o.version&&e(`Failed to register mod ${r}: Expected version to be string, got ${typeof o.version}`),o.repository||(o.repository=void 0),void 0!==o.repository&&\"string\"!=typeof o.repository&&e(`Failed to register mod ${r}: Expected repository to be undefined or string, got ${typeof o.version}`),null==t&&(t={}),t&&\"object\"==typeof t||e(`Failed to register mod ${r}: Expected options to be undefined or object, got ${typeof t}`);const i=!0===t.allowReplace,a=f.get(o.name);a&&(a.allowReplace&&i||e(`Refusing to load mod ${r}: it is already loaded and doesn't allow being replaced.\\nWas the mod loaded multiple times?`),u(a));const c=o=>{let e=g.patching.get(o.name);return e||(e={hooks:[],patches:new Map},g.patching.set(o.name,e)),e},s=(o,t)=>(...n)=>{var i,a;const c=null===(a=(i=m.errorReporterHooks).apiEndpointEnter)||void 0===a?void 0:a.call(i,o,g.name);g.loaded||e(`Mod ${r} attempted to call SDK function after being unloaded`);const s=t(...n);return null==c||c(),s},p={unload:s(\"unload\",(()=>u(g))),hookFunction:s(\"hookFunction\",((o,t,n)=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to patch a function: Expected function name string, got ${typeof o}`);const i=l(o),a=c(i);\"number\"!=typeof t&&e(`Mod ${r} failed to hook function '${o}': Expected priority number, got ${typeof t}`),\"function\"!=typeof n&&e(`Mod ${r} failed to hook function '${o}': Expected hook function, got ${typeof n}`);const s={mod:g.name,priority:t,hook:n};return a.hooks.push(s),d(),()=>{const o=a.hooks.indexOf(s);o>=0&&(a.hooks.splice(o,1),d())}})),patchFunction:s(\"patchFunction\",((o,t)=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to patch a function: Expected function name string, got ${typeof o}`);const i=l(o),a=c(i);n(t)||e(`Mod ${r} failed to patch function '${o}': Expected patches object, got ${typeof t}`);for(const[n,i]of Object.entries(t))\"string\"==typeof i?a.patches.set(n,i):null===i?a.patches.delete(n):e(`Mod ${r} failed to patch function '${o}': Invalid format of patch '${n}'`);d()})),removePatches:s(\"removePatches\",(o=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to patch a function: Expected function name string, got ${typeof o}`);const t=l(o);c(t).patches.clear(),d()})),callOriginal:s(\"callOriginal\",((o,t,n)=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to call a function: Expected function name string, got ${typeof o}`);const i=l(o);return Array.isArray(t)||e(`Mod ${r} failed to call a function: Expected args array, got ${typeof t}`),i.original.apply(null!=n?n:globalThis,t)})),getOriginalHash:s(\"getOriginalHash\",(o=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to get hash: Expected function name string, got ${typeof o}`);return l(o).originalHash}))},g={name:o.name,fullName:o.fullName,version:o.version,repository:o.repository,allowReplace:i,api:p,loaded:!0,patching:new Map};return f.set(o.name,g),Object.freeze(p)}function h(){const o=[];for(const e of f.values())o.push({name:e.name,fullName:e.fullName,version:e.version,repository:e.repository});return o}let m;const y=void 0===window.bcModSdk?window.bcModSdk=function(){const e={version:o,apiVersion:1,registerMod:g,getModsInfo:h,getPatchingInfo:p,errorReporterHooks:Object.seal({apiEndpointEnter:null,hookEnter:null,hookChainExit:null})};return m=e,Object.freeze(e)}():(n(window.bcModSdk)||e(\"Failed to init Mod SDK: Name already in use\"),1!==window.bcModSdk.apiVersion&&e(`Failed to init Mod SDK: Different version already loaded ('1.2.0' vs '${window.bcModSdk.version}')`),window.bcModSdk.version!==o&&alert(`Mod SDK warning: Loading different but compatible versions ('1.2.0' vs '${window.bcModSdk.version}')\\nOne of mods you are using is using an old version of SDK. It will work for now but please inform author to update`),window.bcModSdk);return\"undefined\"!=typeof exports&&(Object.defineProperty(exports,\"__esModule\",{value:!0}),exports.default=y),y}();\n", "import { BaseSettingsModel, SettingsModel, Subscreen, ModSdkManager, ModStorage, modStorage } from '../deeplib';\n\n/**\n * An abstract foundation for modular systems that require:\n * - Optional settings screens\n * - Persistent settings storage per module\n * - Default settings registration\n * - Lifecycle hooks for loading, running, and unloading\n *\n * ### Responsibilities\n * This class defines the base contract for all modules in the system:\n * - Provides a standardized interface for retrieving and storing settings\n * - Ensures default settings are registered if missing\n * - Integrates with the module storage system (`modStorage`)\n * - Offers overridable lifecycle methods (`init`, `load`, `run`, `unload`)\n *\n * **Subclass Requirements:**\n * - Must extend `BaseModule`\n * - Should override `defaultSettings` to define defaults for its settings, if any\n * - May override `settingsScreen` to provide a UI component\n * - May override lifecycle methods as needed\n */\nexport abstract class BaseModule {\n /**\n * An optional UI screen for configuring this module's settings.\n * Subclasses can override this getter to provide a `Subscreen` instance.\n * Modules with screens are automatically registered to the main menu.\n */\n get settingsScreen(): Subscreen | null {\n return null;\n }\n\n /**\n * The storage key under which this module's settings will be saved.\n * Defaults to the class name.\n *\n * Subclasses can override this if they require a custom storage key.\n */\n get settingsStorage(): string | null {\n return this.constructor.name;\n }\n\n /**\n * Retrieves the current settings for this module.\n * If no settings exist yet, registers default settings first.\n */\n get settings(): BaseSettingsModel {\n const modName = ModSdkManager.ModInfo.name;\n if (!this.settingsStorage) return {} as BaseSettingsModel;\n if (!modStorage.playerStorage) {\n Player[modName] = <SettingsModel>{};\n this.registerDefaultSettings();\n } else if (!modStorage.playerStorage[this.settingsStorage]) this.registerDefaultSettings();\n return modStorage.playerStorage[this.settingsStorage];\n }\n\n /**\n * Persists new settings for this module.\n * Automatically initializes storage and defaults if they don't exist.\n */\n set settings(value) {\n const modName = ModSdkManager.ModInfo.name;\n const storage = new ModStorage<SettingsModel>(modName);\n if (!this.settingsStorage) return;\n if (!storage.playerStorage) {\n Player[modName] = <SettingsModel>{};\n this.registerDefaultSettings();\n } else if (!storage.playerStorage[this.settingsStorage]) this.registerDefaultSettings();\n storage.playerStorage[this.settingsStorage] = value;\n }\n\n /**\n * Initializes the module.\n * Default implementation registers default settings immediately.\n * Subclasses can override to perform additional setup.\n */\n init() {\n this.registerDefaultSettings();\n }\n\n /**\n * Registers default settings for this module in persistent storage.\n * Only runs if a storage key and default settings are defined.\n * \n * If some settings already exist, they will be merged with defaults.\n * Existing values will NOT be overwritten.\n */\n registerDefaultSettings(): void {\n const storage = this.settingsStorage;\n const defaults = this.defaultSettings;\n if (!storage || !defaults) return;\n\n Player[ModSdkManager.ModInfo.name][storage] = Object.assign(defaults, Player[ModSdkManager.ModInfo.name][storage] ?? {});\n }\n\n /**\n * Provides default settings for this module.\n * Subclasses should override this getter to return their defaults.\n */\n get defaultSettings(): BaseSettingsModel | null {\n return null;\n }\n\n /**\n * Called when the module is loaded into the system.\n * Subclasses should override to perform data loading or initialization.\n */\n load() { }\n\n /**\n * By default doesn't get called each frame, only once when the module is loaded.\n * Subclasses can override to implement runtime logic.\n */\n run() { }\n\n /**\n * Called when the module is being removed.\n * Subclasses can override to perform cleanup or save final state.\n */\n unload() { }\n}\n", "import { BaseModule, BaseSettingsModel, GUI, advElement, ModSdkManager, domUtil, getText, layout, modules, modStorage, exportToGlobal } from '../deeplib';\nimport { SettingElement } from './elements_typings';\n\n/** Optional configuration flags for a `BaseSubscreen` instance. */\nexport type SubscreenOptions = {\n /**\n * If `true`, the subscreen will draw the player's character model\n * in the UI when `run()` is called.\n * Also shift the UI to the right to make room for the character.\n */\n drawCharacter?: boolean;\n\n /**\n * Logical name of this subscreen.\n * Used for localization key resolution in `load()`.\n * Subclasses should override this with a meaningful identifier.\n */\n name: string;\n\n /**\n * Path to or Base64 data for an icon representing this subscreen.\n * Defaults to empty string (no icon).\n */\n icon?: string;\n\n /** \n * An optional help button to open a subscreen or URL or run a function when clicked.\n */\n help?: {\n /** A URL or BaseSubscreen to open or a function to run when the help button is clicked */\n onClick: URL | string | BaseSubscreen | (() => void);\n /** A tooltip to display when the help button is hovered over */\n tooltip?: string;\n /** An icon to display on the help button */\n icon?: string;\n },\n\n /** \n * Screen to return to when exiting this subscreen. \n * If not configured, the default is the main menu for all screens, but main menu itself.\n * For main menu, the default is the Extensions menu \n */\n returnScreen?: (() => ScreenSpecifier | BaseSubscreen) | ScreenSpecifier | BaseSubscreen;\n\n /** \n * The background image for this subscreen. \n * Currently supports only images from the Club.\n */\n background?: string;\n};\n\n/**\n * Represents a constructor type for a subscreen.\n * Allows dynamic instantiation of subscreen classes with optional\n * configuration options and a parent module reference.\n */\nexport type Subscreen = new (\n module?: BaseModule\n) => BaseSubscreen;\n\n/** Switches the active subscreen in the global `GUI` instance. */\nexport async function setSubscreen(subscreen: BaseSubscreen | string | null) {\n if (!GUI.instance) {\n throw new Error('Attempt to set subscreen before init');\n }\n const screenName = typeof subscreen === 'string' ? subscreen : subscreen?.options.name;\n const screenId = `${BaseSubscreen.id}_${screenName}`;\n\n await CommonSetScreen(...['DeepLibMod', `${screenId}`] as unknown as ScreenSpecifier);\n}\n\n/**\n * Abstract base class for creating settings/configuration subscreens in a module.\n *\n * ### Responsibilities\n * This class defines the base contract for all modules in the system:\n * - Provides a standardized interface for retrieving and storing settings\n * - Ensures default settings are registered if missing\n * - Integrates with the module storage system (`modStorage`)\n * - Offers overridable lifecycle methods (`init`, `load`, `run`, `unload`)\n *\n * **Subclass Requirements:**\n * - Must extend `BaseSubscreen`\n * - Should override `name`, `icon` to define subscreen metadata\n * - May override `pageStructure` to define UI layout and controls\n * - May override lifecycle methods as needed\n */\nexport abstract class BaseSubscreen {\n /** Global registry of currently rendered elements and their definitions. */\n static currentElements: [HTMLElement, SettingElement][] = [];\n /** Tracks the currently visible page number (1-based index). */\n static currentPage: number = 1;\n /** Runtime options for this subscreen. */\n readonly options: SubscreenOptions;\n /** Reference to the module this subscreen belongs to. */\n readonly module!: BaseModule;\n /** Identifier for internal use to avoid screen name collisions. */\n static readonly id: string = CommonGenerateUniqueID();\n /** Optional configuration flags for a BaseSubscreen instance. */\n protected static readonly subscreenOptions: SubscreenOptions = {\n drawCharacter: true,\n name: 'UNKNOWN',\n icon: '',\n background: 'Sheet',\n };\n\n constructor(module?: BaseModule) {\n if (module) this.module = module;\n\n const ctor = this.constructor as typeof BaseSubscreen;\n this.options = {\n ...BaseSubscreen.subscreenOptions,\n ...ctor.subscreenOptions\n };\n\n const screenName = this.options.name;\n const screenId = `${BaseSubscreen.id}_${screenName}`;\n\n exportToGlobal(`${screenId}Load`, this.load.bind(this));\n exportToGlobal(`${screenId}Run`, this.run.bind(this));\n exportToGlobal(`${screenId}Click`, this.click.bind(this));\n exportToGlobal(`${screenId}Exit`, this.exit.bind(this));\n exportToGlobal(`${screenId}Unload`, this.unload.bind(this));\n exportToGlobal(`${screenId}Resize`, this.resize.bind(this));\n exportToGlobal(`${screenId}Background`, this.options.background);\n\n CommonCSVCache[ScreenFileGetTranslation('DeepLibMod', screenId) as string] = [];\n }\n\n /** Changes the currently active subscreen. */\n async setSubscreen(screen: BaseSubscreen | string | null) {\n return await setSubscreen(screen);\n }\n\n /** Gets this subscreen's settings object from its parent module. */\n get settings(): BaseSettingsModel {\n return this.module.settings as BaseSettingsModel;\n }\n\n /** Updates this subscreen's settings in its parent module. */\n set settings(value) {\n this.module.settings = value;\n }\n\n /**\n * Defines the paginated layout of the subscreen's settings UI.\n * Each element in the outer array is a page; each page contains `SettingElement`s.\n *\n * Subclasses should override to define their actual UI structure.\n */\n get pageStructure(): SettingElement[][] {\n return [[]];\n }\n\n /** Gets the currently visible page's settings elements. */\n get currentPage(): SettingElement[] {\n return this.pageStructure[Math.min(BaseSubscreen.currentPage - 1, this.pageStructure.length - 1)];\n }\n\n getPageLabel(): string {\n return CommonStringPartitionReplace(getText('settings.page.label'), {\n $currentPage$: `${BaseSubscreen.currentPage}`,\n $totalPages$: `${this.pageStructure.length}`,\n }).join('');\n }\n\n /**\n * Changes the visible page in a multi-page subscreen.\n * Automatically wraps around when going past the first or last page.\n */\n changePage(page: number, setLabel: (label: string) => void) {\n const totalPages = this.pageStructure.length;\n\n if (page > totalPages) page = 1;\n if (page < 1) page = totalPages;\n BaseSubscreen.currentPage = page;\n\n this.managePageElementsVisibility();\n\n setLabel(this.getPageLabel());\n }\n\n /**\n * Updates the DOM to show only elements belonging to the current page.\n * All elements on other pages are hidden.\n */\n managePageElementsVisibility() {\n this.pageStructure.forEach((item, ix) => {\n if (ix != BaseSubscreen.currentPage - 1) {\n item.forEach((setting) => {\n domUtil.hide(`${setting.id}-container`);\n });\n } else {\n item.forEach((setting) => {\n domUtil.unhide(`${setting.id}-container`);\n });\n }\n });\n }\n\n /**\n * Called when this subscreen is first displayed.\n * Builds the layout, initializes navigation, and renders all settings elements.\n *\n * Handles:\n * - Ensuring each module with a settings screen has its defaults loaded\n * - Creating navigation menus and back/next page controls\n * - Building and appending UI elements based on `pageStructure`\n * - Setting up exit button and tooltip\n * - Resetting to page 1\n */\n load() {\n for (const module of modules()) {\n if (!module.settingsScreen) continue;\n if (!module.settings || !Object.keys(module.settings).length) module.registerDefaultSettings();\n }\n\n BaseSubscreen.currentPage = 1;\n\n layout.getSubscreen();\n const settingsElement = layout.getSettingsDiv();\n layout.appendToSubscreen(settingsElement);\n\n const menu = ElementMenu.Create('deeplib-nav-menu', []);\n layout.appendToSubscreen(menu);\n\n if (this.pageStructure.length > 1) {\n const backNext = advElement.createBackNext({\n id: 'deeplib-page-back-next',\n next: ({ setLabel }) => this.changePage(BaseSubscreen.currentPage + 1, setLabel),\n initialNextTooltip: getText('settings.button.next_button_hint'),\n back: ({ setLabel }) => this.changePage(BaseSubscreen.currentPage - 1, setLabel),\n initialPrevTooltip: getText('settings.button.prev_button_hint'),\n initialLabel: this.getPageLabel()\n });\n\n ElementMenu.PrependItem(menu, backNext);\n }\n\n if (this.options.help) {\n const onClick = this.options.help.onClick;\n let action = () => { };\n if (typeof onClick === 'string' || onClick instanceof URL) {\n action = () => window.open(onClick, '_blank');\n } else if (typeof onClick === 'function') {\n action = onClick;\n } else if (onClick instanceof BaseSubscreen) {\n action = async () => await this.setSubscreen(onClick);\n }\n\n this.options.help.tooltip ??= getText('settings.button.help_button_hint');\n this.options.help.icon ??= `${PUBLIC_URL}/dl_images/bookmark.svg`;\n\n const helpButton = advElement.createButton({\n id: 'deeplib-help',\n size: [90, 90],\n onClick: action,\n options: {\n image: this.options.help.icon,\n tooltip: this.options.help.tooltip\n }\n });\n\n ElementMenu.AppendButton(menu, helpButton);\n }\n\n const subscreenTitle = advElement.createLabel({\n id: 'deeplib-subscreen-title',\n label: getText(`${this.options.name}.title`).replace('$ModVersion', ModSdkManager.ModInfo.version),\n });\n layout.appendToSubscreen(subscreenTitle);\n\n if (this.options.name !== 'mainmenu') {\n const exitButton = advElement.createButton({\n id: 'deeplib-exit',\n size: [90, 90],\n onClick: () => {\n this.exit();\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/exit.svg`,\n tooltip: getText('settings.button.back_button_hint')\n }\n });\n ElementMenu.AppendButton(menu, exitButton);\n }\n\n const tooltip = advElement.createTooltip();\n layout.appendToSubscreen(tooltip);\n\n this.pageStructure.forEach((s) =>\n s.forEach((item) => {\n let element: HTMLElement;\n switch (item.type) {\n case 'text':\n case 'number':\n case 'color':\n element = advElement.createInput(item);\n break;\n case 'checkbox':\n element = advElement.createCheckbox(item);\n break;\n case 'button':\n element = advElement.createButton(item);\n break;\n case 'label':\n element = advElement.createLabel(item);\n break;\n case 'custom':\n element = advElement.createCustom(item);\n break;\n }\n layout.appendToSettingsDiv(element);\n })\n );\n\n this.managePageElementsVisibility();\n\n CharacterAppearanceForceUpCharacter = Player.MemberNumber ?? -1;\n }\n\n\n /**\n * Called each frame while this subscreen is active.\n * Default behavior draws the player's character if `drawCharacter` is enabled.\n */\n run() {\n if (this.options.drawCharacter) DrawCharacter(Player, 50, 50, 0.9, false);\n }\n\n /**\n * Handles mouse clicks *on canvas* while the subscreen is active.\n * Default implementation is empty \u2014 subclasses may override.\n */\n click() {\n }\n\n /**\n * Exits this subscreen, returning to the main menu.\n * Also saves persistent storage changes.\n * Called after the `unload`.\n */\n exit() {\n CharacterAppearanceForceUpCharacter = -1;\n CharacterLoadCanvas(Player);\n\n const returnScreen = typeof this.options.returnScreen === 'function' ? this.options.returnScreen() : this.options.returnScreen;\n\n if (returnScreen instanceof BaseSubscreen || !returnScreen) {\n setSubscreen(returnScreen ?? 'mainmenu').then(() => {\n modStorage.save();\n });\n } else if (Array.isArray(returnScreen)) {\n CommonSetScreen(...returnScreen).then(() => {\n modStorage.save();\n });\n }\n }\n\n /**\n * Called when the window is resized.\n * Also checks for overflow in the settings div and applies styling accordingly.\n */\n resize(_onLoad: boolean = false) {\n const offset = this.options.drawCharacter ? 0 : 380;\n const subscreen = layout.getSubscreen();\n const settingsDiv = layout.getSettingsDiv();\n\n ElementSetPosition(subscreen || '', 0, 0);\n ElementSetSize(subscreen || '', 2000, 1000);\n ElementSetFontSize(subscreen || '', 'auto');\n\n if (this.options.name === 'mainmenu') {\n ElementSetPosition(settingsDiv || '', 530 - offset, 170);\n ElementSetSize(settingsDiv || '', 600 + offset, 660);\n } else {\n ElementSetPosition(settingsDiv || '', 530 - offset, 170);\n ElementSetSize(settingsDiv || '', 1000 + offset, 660);\n }\n\n ElementSetPosition('deeplib-subscreen-title', 530 - offset, 75);\n ElementSetSize('deeplib-subscreen-title', 800, 60);\n\n ElementSetPosition('deeplib-nav-menu', 1905, 75, 'top-right');\n ElementSetSize('deeplib-nav-menu', null, 90);\n\n ElementSetPosition(advElement.getTooltip() || '', 250, 850);\n ElementSetSize(advElement.getTooltip() || '', 1500, 70);\n\n BaseSubscreen.currentElements.forEach((item) => {\n const element = item[0];\n const options = item[1];\n\n domUtil.autoSetPosition(options.id ?? element.id, options.position);\n domUtil.autoSetSize(options.id ?? element.id, options.size);\n });\n\n if (settingsDiv) {\n if (domUtil.hasOverflow(settingsDiv)?.vertical) {\n settingsDiv.classList.add('deeplib-overflow-box');\n } else {\n settingsDiv.classList.remove('deeplib-overflow-box');\n }\n }\n }\n\n\n /**\n * Called when this subscreen is being removed.\n * Resets the static element registry and removes the subscreen from the layout.\n * Called before `exit`.\n */\n unload() {\n BaseSubscreen.currentElements = [];\n\n layout.removeSubscreen();\n }\n}\n\n", "export default `.deeplib-subscreen,\n.deeplib-modal {\n --deeplib-background-color: var(--tmd-main, white);\n --deeplib-element-color: var(--tmd-element, white);\n --deeplib-element-hover-color: var(--tmd-element-hover, cyan);\n --deeplib-accent-color: var(--tmd-accent, #FFFF88);\n --deeplib-blocked-color: var(--tmd-blocked, red);\n --deeplib-text-color: var(--tmd-text, black);\n --deeplib-icon-color: var(--tmd-accent, black);\n --deeplib-icon-hover-color: var(--tmd-accent-hover, black);\n --deeplib-border-color: var(--tmd-accent, black);\n --deeplib-border-width: min(0.2vh, 0.1vw);\n --deeplib-border-width: min(0.2dvh, 0.1dvw);\n --deeplib-border-radius: min(1vh, 0.5vw);\n --deeplib-border-radius: min(1dvh, 0.5dvw);\n}\n\n.deeplib-button {\n color: var(--deeplib-text-color);\n width: 100%;\n height: 100%;\n}\n\n.deeplib-button.button-styling,\n.deeplib-button.button-styling::before {\n border-radius: min(1dvh, 0.5dvw);\n}\n\n.deeplib-button img {\n position: absolute;\n top: 0%;\n left: 0%;\n width: 100%;\n height: 100%;\n background-position: left;\n background-color: var(--deeplib-icon-color);\n background-blend-mode: multiply;\n background-size: contain;\n mask-position: left;\n mask-size: contain;\n background-repeat: no-repeat;\n mask-repeat: no-repeat;\n color: transparent;\n background-image: var(--image);\n mask-image: var(--image);\n pointer-events: none;\n}\n\n.deeplib-button:hover img {\n background-color: var(--deeplib-icon-hover-color);\n}\n\n.deeplib-button .button-label {\n background-color: transparent !important;\n color: var(--deeplib-text-color);\n font-size: min(3.6dvh, 1.8dvw);\n}\n\n.deeplib-button .button-tooltip {\n border-radius: min(1dvh, 0.5dvw);\n}\n\n#deeplib-page-label {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n#deeplib-subscreen-title {\n text-align: left;\n color: var(--deeplib-text-color);\n}\n\n.deeplib-text {\n color: var(--deeplib-text-color);\n}\n\n.deeplib-subscreen {\n padding: 0;\n margin: 0;\n pointer-events: none;\n}\n\n.deeplib-subscreen * {\n box-sizing: border-box;\n pointer-events: all;\n}\n\n.deeplib-settings {\n display: grid;\n grid-auto-rows: min-content;\n padding: min(1dvh, 0.5dvw);\n gap: 0.3em;\n}\n\n.deeplib-misc {\n display: flex;\n align-items: center;\n flex-direction: column-reverse;\n gap: min(1vh, 0.5vw);\n}\n\n.deeplib-tooltip {\n background-color: var(--deeplib-element-color);\n color: var(--deeplib-text-color);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: min(1dvh, 0.5dvw);\n padding: min(1vh, 0.5vw);\n font-size: 0.8em;\n border: min(0.2vh, 0.1vw) solid var(--deeplib-border-color);\n z-index: 1;\n}\n\n.deeplib-overflow-box {\n border: var(--deeplib-border-color) solid var(--deeplib-border-width);\n}\n\n.deeplib-prev-next {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-direction: row;\n gap: min(2dvh, 1dvw);\n background-color: var(--deeplib-element-color);\n color: var(--deeplib-text-color);\n border-radius: min(1dvh, 0.5dvw);\n border: min(0.2vh, 0.1vw) solid var(--deeplib-border-color);\n}\n.deeplib-prev-next .deeplib-prev-next-button:hover {\n background-color: var(--deeplib-element-hover-color);\n border-radius: var(--deeplib-border-radius);\n}\n.deeplib-prev-next .deeplib-prev-next-button {\n height: 100%;\n aspect-ratio: 1;\n}\n.deeplib-prev-next .deeplib-prev-next-label {\n white-space: nowrap;\n}\n\n#deeplib-nav-menu {\n display: flex;\n flex-direction: row;\n gap: min(2dvh, 1dvw);\n}\n\n#deeplib-storage-meter {\n position: absolute;\n top: 0px;\n left: 0px;\n width: 100%;\n height: 100%;\n overflow: hidden;\n background-color: var(--deeplib-element-color);\n border: var(--deeplib-border-width) solid var(--deeplib-border-color);\n border-radius: var(--deeplib-border-radius);\n z-index: -1;\n}\n\n#deeplib-storage-bar {\n height: 100%;\n width: 0%;\n background: var(--deeplib-accent-color);\n}\n\n.deeplib-checkbox-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.3em;\n}\n\n.deeplib-checkbox-container input.deeplib-input {\n width: min(5vh, 2.5vw);\n height: min(5vh, 2.5vw);\n border-radius: min(1dvh, 0.5dvw);\n}\n\n.deeplib-checkbox-container input.deeplib-input[type=checkbox]:checked::before {\n width: 80%;\n height: 80%;\n}\n\n.deeplib-input-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.3em;\n}\n\n.deeplib-input-container:has(label.deeplib-text) {\n margin-top: min(1vh, 0.5vw);\n}\n\n.deeplib-input-container input.deeplib-input {\n font-size: 0.6em;\n padding: 5px 0;\n background-color: transparent;\n outline: none;\n padding-left: min(1vh, 0.5vw);\n padding-right: min(1vh, 0.5vw);\n min-height: min(5dvh, 2.5dvw);\n border-radius: min(1dvh, 0.5dvw);\n}\n\n.deeplib-input-container input.deeplib-input[type=color] {\n padding: 0px;\n width: min(5vh, 2.5vw);\n height: min(5vh, 2.5vw);\n border-radius: 0px;\n}\n\n.deeplib-input-container input.deeplib-input[type=color]:disabled {\n border: var(--deeplib-blocked-color) solid var(--deeplib-border-width);\n cursor: not-allowed;\n}\n\ninput::-webkit-outer-spin-button,\ninput::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\ninput[type=number] {\n appearance: textfield;\n -moz-appearance: textfield;\n}\n\n.deeplib-highlight-text {\n font-weight: bold;\n color: rgb(203, 185, 23);\n}\n\n#TextAreaChatLog[data-colortheme=dark] div.ChatMessage.deeplib-message,\n#TextAreaChatLog[data-colortheme=dark2] div.ChatMessage.deeplib-message {\n background-color: var(--deeplib-element-color);\n border: min(0.2dvh, 0.1dvw) solid var(--deeplib-border-color);\n color: var(--deeplib-text-color);\n}\n\n#TextAreaChatLog div.ChatMessage.deeplib-message {\n background-color: #eee;\n border: min(0.2dvh, 0.1dvw) solid #440171;\n color: #111;\n padding-left: min(0.6dvh, 0.3dvw);\n display: block;\n white-space: normal;\n}\n\n#TextAreaChatLog[data-colortheme=dark] div.ChatMessage.deeplib-message a,\n#TextAreaChatLog[data-colortheme=dark2] div.ChatMessage.deeplib-message a {\n color: var(--deeplib-text-color);\n}\n\n#TextAreaChatLog div.ChatMessage.deeplib-message a {\n cursor: pointer;\n font-weight: bold;\n color: #111;\n}\n\n.deeplib-modal {\n position: fixed;\n top: 10%;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 0.5em;\n width: max(50dvw, 25dvh);\n font-size: min(4dvh, 2dvw);\n padding: min(2dvh, 1dvw);\n background-color: var(--deeplib-element-color);\n border-radius: min(1.2dvh, 0.6dvw);\n border: min(0.2dvh, 0.1dvw) solid var(--deeplib-border-color);\n color: var(--deeplib-text-color);\n}\n.deeplib-modal .deeplib-modal-input {\n width: 100%;\n font-size: min(2.6dvh, 1.8dvw);\n border-radius: min(1dvh, 0.5dvw);\n padding: min(1dvh, 0.5dvw);\n}\n.deeplib-modal input.deeplib-modal-input {\n max-width: max(50dvh, 25dvw);\n}\n.deeplib-modal .deeplib-modal-button-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n gap: 0.5em;\n width: 100%;\n}\n.deeplib-modal .deeplib-modal-button-container .deeplib-button {\n font-size: 0.8em;\n display: flex;\n width: auto;\n padding: min(0.4vh, 0.2vw) min(2vh, 1vw);\n}\n.deeplib-modal .deeplib-modal-button-container .deeplib-button .button-label {\n display: contents;\n}\n.deeplib-modal .deeplib-modal-prompt-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}\n\n.deeplib-modal-blocker {\n z-index: 1000;\n position: fixed;\n top: 0;\n left: 0;\n width: 100dvw;\n height: 100dvh;\n background-color: rgba(0, 0, 0, 0.5);\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL21lZGlhL05WTUUvU3R1ZmYvQ29kZS9CQy9CQy1EZWVwTGliL3NyYy9zdHlsZXMiLCJzb3VyY2VzIjpbInZhcnMuc2NzcyIsImJ1dHRvbnMuc2NzcyIsImVsZW1lbnRzLnNjc3MiLCJpbnB1dHMuc2NzcyIsIm1lc3NhZ2VzLnNjc3MiLCJtb2RhbC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FDZEY7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FDM0NGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdFO0VBQ0U7RUFDQTs7QUFISjtFQU1FO0VBQ0E7O0FBR0Y7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUN6R0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQzdERjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtBQUFBO0VBRUU7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUM3QkY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUtOO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIuZGVlcGxpYi1zdWJzY3JlZW4sXG4uZGVlcGxpYi1tb2RhbCB7XG4gIC0tZGVlcGxpYi1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10bWQtbWFpbiwgd2hpdGUpO1xuICAtLWRlZXBsaWItZWxlbWVudC1jb2xvcjogdmFyKC0tdG1kLWVsZW1lbnQsIHdoaXRlKTtcbiAgLS1kZWVwbGliLWVsZW1lbnQtaG92ZXItY29sb3I6IHZhcigtLXRtZC1lbGVtZW50LWhvdmVyLCBjeWFuKTtcbiAgLS1kZWVwbGliLWFjY2VudC1jb2xvcjogdmFyKC0tdG1kLWFjY2VudCwgI0ZGRkY4OCk7XG4gIC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yOiB2YXIoLS10bWQtYmxvY2tlZCwgcmVkKTtcbiAgLS1kZWVwbGliLXRleHQtY29sb3I6IHZhcigtLXRtZC10ZXh0LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWhvdmVyLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LWhvdmVyLCBibGFjayk7XG4gIC0tZGVlcGxpYi1ib3JkZXItY29sb3I6IHZhcigtLXRtZC1hY2NlbnQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWJvcmRlci13aWR0aDogbWluKDAuMnZoLCAwLjF2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItd2lkdGg6IG1pbigwLjJkdmgsIDAuMWR2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMXZoLCAwLjV2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMWR2aCwgMC41ZHZ3KTtcbn1cbiIsIi5kZWVwbGliLWJ1dHRvbiB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmcsXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmc6OmJlZm9yZSB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMCU7XG4gIGxlZnQ6IDAlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWljb24tY29sb3IpO1xuICBiYWNrZ3JvdW5kLWJsZW5kLW1vZGU6IG11bHRpcGx5O1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gIG1hc2stcG9zaXRpb246IGxlZnQ7XG4gIG1hc2stc2l6ZTogY29udGFpbjtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLWltYWdlKTtcbiAgbWFzay1pbWFnZTogdmFyKC0taW1hZ2UpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmRlZXBsaWItYnV0dG9uOmhvdmVyIGltZyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItaWNvbi1ob3Zlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiAuYnV0dG9uLWxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGZvbnQtc2l6ZTogbWluKDMuNmR2aCwgMS44ZHZ3KTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIC5idXR0b24tdG9vbHRpcCB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG4iLCIjZGVlcGxpYi1wYWdlLWxhYmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbiNkZWVwbGliLXN1YnNjcmVlbi10aXRsZSB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4uZGVlcGxpYi10ZXh0IHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiAqIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcG9pbnRlci1ldmVudHM6IGFsbDtcbn1cblxuLmRlZXBsaWItc2V0dGluZ3Mge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLWF1dG8tcm93czogbWluLWNvbnRlbnQ7XG4gIHBhZGRpbmc6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGdhcDogMC4zZW07XG59XG5cbi5kZWVwbGliLW1pc2Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIGdhcDogbWluKDF2aCwgMC41dncpO1xufVxuXG4uZGVlcGxpYi10b29sdGlwIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xuICBwYWRkaW5nOiBtaW4oMXZoLCAwLjV2dyk7XG4gIGZvbnQtc2l6ZTogMC44ZW07XG4gIGJvcmRlcjogbWluKDAuMnZoLCAwLjF2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICB6LWluZGV4OiAxO1xufVxuXG4uZGVlcGxpYi1vdmVyZmxvdy1ib3gge1xuICBib3JkZXI6IHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCk7XG59XG5cbi5kZWVwbGliLXByZXYtbmV4dCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZ2FwOiBtaW4oMmR2aCwgMWR2dyk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1jb2xvcik7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xuICBib3JkZXI6IG1pbigwLjJ2aCwgMC4xdncpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKTtcblxuICAuZGVlcGxpYi1wcmV2LW5leHQtYnV0dG9uIHtcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1ob3Zlci1jb2xvcik7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVwbGliLWJvcmRlci1yYWRpdXMpO1xuICAgIH1cbiAgICBcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYXNwZWN0LXJhdGlvOiAxO1xuICB9XG5cbiAgLmRlZXBsaWItcHJldi1uZXh0LWxhYmVsIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG59XG5cbiNkZWVwbGliLW5hdi1tZW51IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZ2FwOiBtaW4oMmR2aCwgMWR2dyk7XG59XG5cbiNkZWVwbGliLXN0b3JhZ2UtbWV0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMHB4O1xuICBsZWZ0OiAwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1jb2xvcik7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzKTtcbiAgei1pbmRleDogLTE7XG59XG5cbiNkZWVwbGliLXN0b3JhZ2UtYmFyIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMCU7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRlZXBsaWItYWNjZW50LWNvbG9yKTtcbn1cbiIsIi5kZWVwbGliLWNoZWNrYm94LWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC4zZW07XG59XG5cbi5kZWVwbGliLWNoZWNrYm94LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0IHtcbiAgd2lkdGg6IG1pbig1dmgsIDIuNXZ3KTtcbiAgaGVpZ2h0OiBtaW4oNXZoLCAyLjV2dyk7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cbi5kZWVwbGliLWNoZWNrYm94LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkOjpiZWZvcmUge1xuICB3aWR0aDogODAlO1xuICBoZWlnaHQ6IDgwJTtcbn1cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjNlbTtcbn1cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyOmhhcyhsYWJlbC5kZWVwbGliLXRleHQpIHtcbiAgbWFyZ2luLXRvcDogbWluKDF2aCwgMC41dncpO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dCB7XG4gIGZvbnQtc2l6ZTogMC42ZW07XG4gIHBhZGRpbmc6IDVweCAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZy1sZWZ0OiBtaW4oMXZoLCAwLjV2dyk7XG4gIHBhZGRpbmctcmlnaHQ6IG1pbigxdmgsIDAuNXZ3KTtcbiAgbWluLWhlaWdodDogbWluKDVkdmgsIDIuNWR2dyk7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNvbG9yXCJdIHtcbiAgcGFkZGluZzogMHB4O1xuICB3aWR0aDogbWluKDV2aCwgMi41dncpO1xuICBoZWlnaHQ6IG1pbig1dmgsIDIuNXZ3KTtcbiAgYm9yZGVyLXJhZGl1czogMHB4O1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dFt0eXBlPVwiY29sb3JcIl06ZGlzYWJsZWQge1xuICBib3JkZXI6IHZhcigtLWRlZXBsaWItYmxvY2tlZC1jb2xvcikgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItd2lkdGgpO1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG5pbnB1dDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbixcbmlucHV0Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICBtYXJnaW46IDA7XG59XG5cbmlucHV0W3R5cGU9bnVtYmVyXSB7XG4gIGFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbiAgLW1vei1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG59XG4iLCIuZGVlcGxpYi1oaWdobGlnaHQtdGV4dCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogcmdiKDIwMywgMTg1LCAyMyk7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSxcbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrMiddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbn1cblxuI1RleHRBcmVhQ2hhdExvZyBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgYm9yZGVyOiBtaW4oMC4yZHZoLCAwLjFkdncpIHNvbGlkICM0NDAxNzE7XG4gIGNvbG9yOiAjMTExO1xuICBwYWRkaW5nLWxlZnQ6IG1pbigwLjZkdmgsIDAuM2R2dyk7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nW2RhdGEtY29sb3J0aGVtZT0nZGFyayddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSxcbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrMiddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjMTExO1xufVxuIiwiLmRlZXBsaWItbW9kYWwge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMTAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgei1pbmRleDogMTAwMTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC41ZW07XG4gIHdpZHRoOiBtYXgoNTBkdncsIDI1ZHZoKTtcbiAgZm9udC1zaXplOiBtaW4oNGR2aCwgMmR2dyk7XG4gIHBhZGRpbmc6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMmR2aCwgMC42ZHZ3KTtcbiAgYm9yZGVyOiBtaW4oMC4yZHZoLCAwLjFkdncpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG5cbiAgLmRlZXBsaWItbW9kYWwtaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZvbnQtc2l6ZTogbWluKDIuNmR2aCwgMS44ZHZ3KTtcbiAgICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xuICAgIHBhZGRpbmc6IG1pbigxZHZoLCAwLjVkdncpO1xuICB9XG5cbiAgaW5wdXQuZGVlcGxpYi1tb2RhbC1pbnB1dCB7XG4gICAgbWF4LXdpZHRoOiBtYXgoNTBkdmgsIDI1ZHZ3KTtcbiAgfVxuXG4gIC5kZWVwbGliLW1vZGFsLWJ1dHRvbi1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogMC41ZW07XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAuZGVlcGxpYi1idXR0b24ge1xuICAgICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB3aWR0aDogYXV0bztcbiAgICAgIHBhZGRpbmc6IG1pbigwLjR2aCwgMC4ydncpIG1pbigydmgsIDF2dyk7XG5cbiAgICAgIC5idXR0b24tbGFiZWwge1xuICAgICAgICBkaXNwbGF5OiBjb250ZW50cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZGVlcGxpYi1tb2RhbC1wcm9tcHQtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxufVxuXG4uZGVlcGxpYi1tb2RhbC1ibG9ja2VyIHtcbiAgei1pbmRleDogMTAwMDtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDBkdnc7XG4gIGhlaWdodDogMTAwZHZoO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG4iXX0= */`;\n", "import deeplib_style from '../styles/index.scss';\nimport { BaseModule, ModSdkManager, deepLibLogger, Localization, modules, registerModule, Style, VersionModule, hasSetter, deepMergeMatchingProperties, hasGetter, BaseMigrator, ModStorage, MainMenuOptions, MainMenu, TranslationOptions } from '../deeplib';\n\n/** Configuration object for initializing a mod via `initMod`. */\ninterface InitOptions {\n /**\n * Information about the mod being initialized.\n * - `info` \u2014 Required metadata describing the mod.\n * - `options` \u2014 Optional runtime configuration for the Mod SDK.\n */\n modInfo: {\n info: ModSDKModInfo,\n options?: ModSDKModOptions\n };\n\n /**\n * List of modules (`BaseModule` subclasses) to register with the mod system.\n * Modules are initialized, loaded, and run in order.\n */\n modules?: BaseModule[];\n\n /**\n * List of data migration handlers to register with the `VersionModule`.\n * Each `BaseMigrator` handles upgrading data from one version to another.\n */\n migrators?: BaseMigrator[];\n\n /** Configuration for customizing the main menu when the mod is active. */\n mainMenuOptions?: MainMenuOptions;\n\n /**\n * Optional hook executed *before* login when the player is not yet authenticated.\n * Useful for pre-login setup or display changes.\n */\n beforeLogin?: () => (void);\n\n /**\n * Optional async/sync function run after modules and translations are initialized.\n * Can be used to perform additional setup tasks.\n */\n initFunction?: () => (void | Promise<void>);\n\n /** Options for initializing the localization/translation system. */\n translationOptions?: TranslationOptions;\n}\n\n/**\n * Global storage handler for mod.\n * Initialized by `initMod()` and mod data loaded by `init()`.\n */\nexport let modStorage: ModStorage;\n\n/**\n * Global Mod SDK manager.\n * Initialized by `initMod()`.\n */\nexport let sdk: ModSdkManager;\n\n/**\n * Entry point for initializing a mod. Handles:\n * - Setting up the Mod SDK\n * - Preparing persistent storage\n * - Injecting required styles\n * - Delaying initialization until login (if necessary)\n */\nexport function initMod(options: InitOptions) {\n sdk = new ModSdkManager(options.modInfo.info, options.modInfo.options);\n const MOD_NAME = ModSdkManager.ModInfo.name;\n\n modStorage = new ModStorage(ModSdkManager.ModInfo.name);\n Style.injectInline('deeplib-style', deeplib_style);\n\n deepLibLogger.debug(`Init wait for ${MOD_NAME}`);\n if (CurrentScreen == null || CurrentScreen === 'Login') {\n options.beforeLogin?.();\n const removeHook = sdk.hookFunction('LoginResponse', 0, (args, next) => {\n deepLibLogger.debug(`Init for ${MOD_NAME}! LoginResponse caught: `, args);\n next(args);\n const response = args[0];\n if (response === 'InvalidNamePassword') return next(args);\n if (response && typeof response.Name === 'string' && typeof response.AccountName === 'string') {\n init(options);\n removeHook();\n }\n });\n } else {\n deepLibLogger.debug(`Already logged in, initing ${MOD_NAME}`);\n init(options);\n }\n}\n\n\n/**\n * Fully initializes the mod after login.\n * Handles:\n * - Preventing double-load\n * - Loading mod data\n * - Initializing localization\n * - Registering modules and migrators\n * - Running optional init functions\n * - Applying main menu changes\n * - Merging default settings into module settings\n *\n * @param options {InitOptions} Configuration for mod initialization.\n */\nexport async function init(options: InitOptions) {\n const MOD_NAME = ModSdkManager.ModInfo.name;\n const MOD_VERSION = ModSdkManager.ModInfo.version;\n\n if ((window as any)[MOD_NAME + 'Loaded']) return;\n\n modStorage.load();\n\n await Localization.init(options.translationOptions);\n\n if (options.modules && !initModules(options.modules)) {\n unloadMod();\n return;\n }\n\n if (options.migrators) {\n for (const m of options.migrators) {\n VersionModule.registerMigrator(m);\n }\n }\n\n await options.initFunction?.();\n\n if (options.mainMenuOptions)\n MainMenu.setOptions(options.mainMenuOptions);\n\n for (const m of modules()) {\n if (m.defaultSettings && hasGetter(m, 'defaultSettings') && m.settings && hasSetter(m, 'settings')) {\n if (Object.entries(m.defaultSettings).length === 0) continue;\n m.settings = deepMergeMatchingProperties(m.defaultSettings, m.settings);\n }\n }\n\n (window as any)[MOD_NAME + 'Loaded'] = true;\n deepLibLogger.log(`Loaded ${MOD_NAME}! Version: ${MOD_VERSION}`);\n}\n\n\n/**\n * Registers and starts all modules.\n * Runs `init()`, `load()`, and `run()` for each module in order.\n */\nfunction initModules(modulesToRegister: BaseModule[]): boolean {\n const MOD_NAME = ModSdkManager.ModInfo.name;\n\n for (const module of modulesToRegister) {\n registerModule(module);\n }\n\n for (const module of modules()) {\n module.init();\n }\n\n for (const module of modules()) {\n module.load();\n }\n\n for (const module of modules()) {\n module.run();\n }\n\n deepLibLogger.debug(`Modules Loaded for ${MOD_NAME}.`);\n return true;\n}\n\n/** \n * Cleans up and removes the mod from memory.\n * Calls `unload()` on all modules and removes the global loaded flag.\n */\nexport function unloadMod(): true {\n const MOD_NAME = ModSdkManager.ModInfo.name;\n unloadModules();\n\n delete (window as any)[MOD_NAME + 'Loaded'];\n deepLibLogger.debug(`Unloaded ${MOD_NAME}.`);\n return true;\n}\n\n/** Calls the `unload()` lifecycle method on all registered modules. */\nfunction unloadModules() {\n for (const module of modules()) {\n module.unload();\n }\n}\n", "import { BaseModule } from '../deeplib';\n\n/**\n * Global registry of all loaded modules, keyed by their class name.\n *\n * The map is populated via {@link registerModule} and accessed via {@link modules} or {@link getModule}.\n * This is the central storage for active `BaseModule` instances during the mod lifecycle.\n */\nexport const modulesMap: Map<string, BaseModule> = new Map<string, BaseModule>();\n\n/**\n * Retrieves all registered module instances.\n *\n * @returns An array containing every module currently stored in {@link modulesMap}.\n *\n * @remarks\n * The returned array is a **shallow copy** of the `Map` values, meaning that\n * changes to the array do not affect the registry itself.\n *\n * @example\n * ```ts\n * for (const mod of modules()) {\n * mod.run();\n * }\n * ```\n */\nexport function modules(): BaseModule[] {\n return [...modulesMap.values()];\n}\n\n\n/**\n * Registers a module instance in the global registry.\n * \n * @returns The same module instance passed in, for chaining or immediate use.\n *\n * @remarks\n * - If a module with the same constructor name already exists, it will be **overwritten**.\n * - Keys are based on the class name (`module.constructor.name`), so name collisions are possible\n * if two different classes share the same name.\n *\n * @example\n * ```ts\n * registerModule(new MyGlobalModule());\n * ```\n */\nexport function registerModule<T extends BaseModule>(module: T): T {\n modulesMap.set(module.constructor.name, module);\n return module;\n}\n\n\n/**\n * Retrieves a registered module by its type name.\n *\n * @returns The matching module instance cast to type `T`, or `undefined` if not found.\n *\n * @remarks\n * This function does not perform runtime type checks. If the type parameter `T`\n * does not match the actual module type, you may get runtime errors when using the result.\n *\n * @example\n * ```ts\n * const themeModule = getModule<ThemeModule>('ThemeModule');\n * themeModule?.reloadTheme();\n * ```\n */\nexport function getModule<T extends BaseModule>(moduleType: string): T {\n return modulesMap.get(moduleType) as T;\n}\n", "/**\n * Abstract base class for versioned migration handlers.\n *\n * A migrator is responsible for upgrading or transforming stored data\n * when the mod version changes. Each migrator targets a specific version\n * and executes its {@link migrate} method once when needed.\n *\n * @remarks\n * To create a new migrator:\n * 1. Extend `BaseMigrator`.\n * 2. Implement the {@link migrationVersion} getter to return the target version string.\n * 3. Implement {@link migrate} with the migration logic (e.g., data structure changes).\n */\nexport abstract class BaseMigrator {\n\n /**\n * Gets the target version string for this migration.\n *\n * @remarks\n * - This should exactly match the version format used by the mod\n * - Used by the migration system to determine if this migration should be executed.\n */\n abstract get migrationVersion(): string;\n\n /**\n * Executes the migration logic for this version.\n *\n * @remarks\n * - Called once when upgrading from a version earlier than {@link migrationVersion}.\n * - Should handle any necessary data transformations, cleanup, or initialization\n * to bring the mod's state up to date with the new version.\n * - Must be idempotent \u2014 running it multiple times should not cause data corruption.\n */\n abstract migrate(): void;\n}\n", "import { BaseModule, BaseSubscreen, MainMenu, modules, setSubscreen } from '../deeplib';\n\n/** Options for configuring a mod's main button in the extensions menu. */\ntype GuiOptions = {\n\n /**\n * Unique identifier for the mod's settings button.\n * Used internally by the preference system to track the button.\n */\n identifier: string;\n\n /**\n * The label displayed on the settings button.\n * Can be a string or a function that returns a string dynamically.\n */\n buttonText: string | (() => string);\n\n /** \n * The path to or Base64 data of the icon for the settings button.\n * Can be a string or a function that returns a string dynamically.\n */\n image: string | (() => string);\n \n /**\n * The main menu screen for the mod.\n */\n mainMenu?: typeof MainMenu;\n};\n\n/**\n * Central mod GUI controller that manages all subscreens.\n *\n * This module is responsible for:\n * - Registering the mod's settings button in the game's preferences.\n * - Managing subscreens (including settings screens for all registered modules).\n * - Routing lifecycle events (load, run, click, exit, unload) to the active subscreen.\n */\nexport class GUI extends BaseModule {\n /** The singleton instance of the GUI controller. */\n static instance: GUI | null = null;\n\n /** All subscreens managed by this GUI, including the main menu and module settings screens. */\n private _subscreens: BaseSubscreen[];\n /** The mod's main menu screen. */\n private _mainMenu: MainMenu;\n /** Options defining how the mod's settings button is displayed and behaves. */\n private _modButtonOptions: GuiOptions | null;\n\n /** Returns all registered subscreens. */\n get subscreens(): BaseSubscreen[] {\n return this._subscreens;\n }\n\n /** Returns the main menu subscreen instance. */\n get mainMenu(): MainMenu {\n return this._mainMenu;\n }\n\n /** \n * Creates the GUI instance and initializes the main menu. \n * \n * @throws If another `GUI` instance already exists.\n */\n constructor(guiOptions: GuiOptions | null = null) {\n super();\n if (GUI.instance) {\n throw new Error('Duplicate initialization');\n }\n\n for (const module of modules()) {\n if (!module.settingsScreen) continue;\n }\n\n this._mainMenu = guiOptions?.mainMenu ? new guiOptions.mainMenu(this) : new MainMenu(this);\n this._subscreens = [this._mainMenu];\n this._modButtonOptions = guiOptions;\n\n GUI.instance = this;\n }\n\n /**\n * Loads the GUI and registers the mod's settings button in the extensions menu.\n *\n * - Creates subscreens for each module's settings screen.\n * - Registers lifecycle callbacks for subscreens events.\n * - Sets up the main menu and its subscreens.\n */\n load(): void {\n if (!this._modButtonOptions) return;\n \n for (const module of modules()) {\n if (!module.settingsScreen) continue;\n\n this._subscreens.push(new module.settingsScreen(module));\n }\n\n this._mainMenu.subscreens = this._subscreens;\n\n PreferenceRegisterExtensionSetting({\n Identifier: this._modButtonOptions.identifier,\n ButtonText: this._modButtonOptions.buttonText,\n Image: this._modButtonOptions.image,\n load: async () => {\n await setSubscreen(this._mainMenu);\n },\n run: () => {},\n click: () => {},\n exit: () => {},\n });\n }\n}\n", "import { BaseMigrator, BaseModule, ModSdkManager, deepLibLogger, getText, modStorage } from '../deeplib';\n\nexport type VersionModuleOptions = {\n newVersionMessage: string;\n beforeEach?: () => void;\n afterEach?: () => void;\n beforeAll?: () => void;\n afterAll?: () => void;\n};\n\n/**\n * Handles version tracking, new version detection, and version-based migrations\n * for the mod. Also manages displaying a \"new version\" message to players and\n * executing registered migration routines when an update occurs.\n * \n * **Key Responsibilities:**\n * - Track and store the current mod version in persistent player storage.\n * - Detect if the mod has been updated since the last session.\n * - Run version-specific migrations via registered `BaseMigrator` instances.\n * - Optionally display a message to the user upon detecting a new version.\n */\nexport class VersionModule extends BaseModule {\n /** Whether the current session is running a new version compared to stored data */\n private static isItNewVersion: boolean = false;\n\n /** The current mod version (retrieved from `ModSdkManager.ModInfo.version`) */\n private static version: string;\n\n /** Message to display when a new version is detected */\n private static newVersionMessage: string = '';\n\n /** List of registered migration handlers, sorted by version */\n private static migrators: BaseMigrator[] = [];\n\n /** Optional lifecycle hook. Runs before each migration */\n private static beforeEach?: () => void;\n /** Optional lifecycle hook. Runs after each migration */\n private static afterEach?: () => void;\n /** Optional lifecycle hook. Runs before all migrations */\n private static beforeAll?: () => void;\n /** Optional lifecycle hook. Runs after all migrations */\n private static afterAll?: () => void;\n\n constructor(options: VersionModuleOptions) {\n super();\n\n VersionModule.newVersionMessage = options.newVersionMessage;\n\n VersionModule.beforeEach = options.beforeEach;\n VersionModule.afterEach = options.afterEach;\n VersionModule.beforeAll = options.beforeAll;\n VersionModule.afterAll = options.afterAll;\n }\n\n /**\n * Initializes the module on load:\n * - Stores the current mod version.\n * - Hooks into `ChatRoomSync` to show a \"new version\" message when applicable.\n */\n load(): void {\n VersionModule.version = ModSdkManager.ModInfo.version;\n\n VersionModule.checkVersionUpdate();\n\n if (modStorage.playerStorage.GlobalModule.doShowNewVersionMessage && VersionModule.isItNewVersion) {\n VersionModule.sendNewVersionMessage();\n }\n }\n\n /**\n * Checks if the stored version differs from the current version.\n * If a new version is detected:\n * - Flags the session as updated.\n * - Runs applicable migrations.\n * - Updates stored version in player data.\n * - Saves `modStorage`.\n */\n private static checkVersionUpdate() {\n const previousVersion = VersionModule.loadVersion();\n const currentVersion = VersionModule.version;\n\n if (VersionModule.isNewVersion(previousVersion, currentVersion)) {\n VersionModule.isItNewVersion = true;\n VersionModule.checkVersionMigration();\n VersionModule.saveVersion();\n }\n\n modStorage.save();\n }\n\n /**\n * Executes migrations for all registered migrators whose `MigrationVersion`\n * is newer than the previously stored version.\n */\n private static checkVersionMigration() {\n const previousVersion = VersionModule.loadVersion();\n const toMigrate = VersionModule.migrators.filter(m =>\n VersionModule.isNewVersion(previousVersion, m.migrationVersion)\n );\n\n if (!toMigrate.length) return;\n\n VersionModule.beforeAll?.();\n\n for (const migrator of toMigrate) {\n VersionModule.beforeEach?.();\n\n migrator.migrate();\n deepLibLogger.info(\n `Migrating ${ModSdkManager.ModInfo.name} from ${previousVersion} to ${migrator.migrationVersion} with ${migrator.constructor.name}`\n );\n\n VersionModule.afterEach?.();\n }\n\n VersionModule.afterAll?.();\n }\n\n /**\n * Registers a new migrator for handling version-specific changes.\n * Migrators are sorted by their `MigrationVersion` in ascending order.\n */\n static registerMigrator(migrator: BaseMigrator) {\n VersionModule.migrators.push(migrator);\n\n VersionModule.migrators.sort((a, b) => a.migrationVersion.localeCompare(b.migrationVersion));\n }\n\n /** Sends the currently configured \"new version\" message to the local player. */\n static sendNewVersionMessage() {\n const beepLogLength = FriendListBeepLog.push({\n MemberNumber: Player.MemberNumber,\n MemberName: ModSdkManager.ModInfo.name,\n ChatRoomName: getText('module.version.version_update'),\n ChatRoomSpace: 'X',\n Private: false,\n Sent: false,\n Time: new Date(),\n Message: VersionModule.newVersionMessage\n });\n\n const beepIdx = beepLogLength - 1;\n const title = CommonStringPartitionReplace(getText('module.version.new_version_toast_title'), {\n $modName$: ModSdkManager.ModInfo.name,\n $modVersion$: VersionModule.version\n }).join('');\n const data = FriendListBeepLog[beepIdx];\n\n ServerShowBeep(VersionModule.newVersionMessage, 10000, {\n memberNumber: data.MemberNumber,\n memberName: data.MemberName,\n chatRoomName: data.ChatRoomName,\n ...(data.Message && {\n onClick: () => {\n FriendListShowBeep(beepIdx);\n }\n })\n }, title);\n }\n\n /**\n * Determines if a given `candidate` version is newer than the `current` version.\n * \n * Version strings are expected in `MAJOR.MINOR.PATCH` format.\n */\n private static isNewVersion(current: string | undefined, candidate: string) {\n if (current !== undefined) {\n const CURRENT_ = current.split('.'),\n CANDIDATE_ = candidate.split('.');\n for (let i = 0; i < 3; i++) {\n if (CURRENT_[i] === CANDIDATE_[i]) {\n continue;\n }\n return CANDIDATE_[i] > CURRENT_[i];\n }\n }\n if (current === undefined || current === '' || !current) {\n return true;\n }\n return false;\n }\n\n /** Saves the current mod version into persistent player storage. */\n private static saveVersion() {\n if (modStorage.playerStorage) {\n Player[ModSdkManager.ModInfo.name].Version = VersionModule.version;\n }\n }\n\n /** Loads the stored mod version from persistent player storage. */\n private static loadVersion() {\n return modStorage.playerStorage?.Version;\n }\n}\n", "\nimport { Button, Checkbox, Input, Label, SettingElement } from '../base/elements_typings';\nimport { BaseSubscreen, deepLibLogger, SubscreenOptions } from '../deeplib';\n\nexport class GuiDebug extends BaseSubscreen {\n\n protected static override subscreenOptions: SubscreenOptions = {\n name: 'debug',\n };\n\n get pageStructure(): SettingElement[][] {\n return [[\n <Button>{\n type: 'button',\n id: 'test-deeplib-big-button',\n size: [405, 80],\n label: 'Big Button',\n tooltip: 'This is a big button',\n image: 'Icons/Exit.png',\n onClick() {\n deepLibLogger.info('Big Button Clicked');\n }\n },\n <Button>{\n type: 'button',\n id: 'test-deeplib-small-button',\n size: [90, 90],\n tooltip: 'This is a small button',\n image: 'Icons/Exit.png',\n onClick() {\n deepLibLogger.info('Small Button Clicked');\n }\n },\n <Checkbox>{\n type: 'checkbox',\n id: 'test-deeplib-checkbox',\n label: 'Checkbox',\n description: 'This is a checkbox',\n setElementValue() {\n return true;\n },\n setSettingValue(val: boolean) {\n deepLibLogger.info('Checkbox value:', val);\n },\n },\n <Input>{\n type: 'text',\n id: 'test-deeplib-text-input',\n label: 'Input',\n description: 'This is a text input',\n setElementValue() {\n return 'Input Value';\n },\n setSettingValue(val: string) {\n deepLibLogger.info('Input value:', val);\n },\n },\n <Input>{\n type: 'number',\n id: 'test-deeplib-number-input',\n label: 'Input',\n description: 'This is a number input',\n setElementValue() {\n return '123';\n },\n setSettingValue(val: string) {\n deepLibLogger.info('Input value:', val);\n },\n },\n <Label>{\n type: 'label',\n id: 'test-deeplib-label',\n label: 'Label',\n description: 'This is a label',\n }\n ],\n [\n <Button>{\n type: 'button',\n id: 'test-deeplib-big-button2',\n size: [405, 80],\n label: 'Big Button',\n tooltip: 'This is a big button',\n image: 'Icons/Prev.png',\n onClick() {\n deepLibLogger.info('Big Button Clicked');\n }\n },\n <Button>{\n type: 'button',\n id: 'test-deeplib-small-button2',\n size: [90, 90],\n tooltip: 'This is a small button',\n image: 'Icons/Next.png',\n onClick() {\n deepLibLogger.info('Small Button Clicked');\n }\n },\n <Checkbox>{\n type: 'checkbox',\n id: 'test-deeplib-checkbox2',\n label: 'Checkbox',\n description: 'This is a checkbox',\n setElementValue() {\n return true;\n },\n setSettingValue(val: boolean) {\n deepLibLogger.info('Checkbox value:', val);\n },\n },\n <Input>{\n type: 'text',\n id: 'test-deeplib-text-input2',\n label: 'Input',\n description: 'This is a text input',\n setElementValue() {\n return 'Input Value';\n },\n setSettingValue(val: string) {\n deepLibLogger.info('Input value:', val);\n },\n },\n <Input>{\n type: 'number',\n id: 'test-deeplib-number-input2',\n label: 'Input',\n description: 'This is a number input',\n setElementValue() {\n return '123';\n },\n setSettingValue(val: string) {\n deepLibLogger.info('Input value:', val);\n },\n },\n <Label>{\n type: 'label',\n id: 'test-deeplib-label2',\n label: 'Label',\n description: 'This is a label',\n }\n ]];\n }\n}\n", "/**\n * Deeply merges properties from `source` into `target`.\n * - If both target and source properties are arrays, concatenates them.\n * - If both are objects, recursively merges them.\n * - Otherwise, source overwrites target.\n */\nexport function deepMerge(target: any, source: any): any {\n if (target === undefined) return source;\n if (source === undefined) return target;\n if (typeof target !== 'object' || typeof source !== 'object') {\n return source;\n }\n\n for (const key of Object.keys(source)) {\n if (Array.isArray(source[key]) && Array.isArray(target[key])) {\n target[key] = [...target[key], ...source[key]];\n } else if (typeof source[key] === 'object' && source[key] !== null) {\n target[key] = deepMerge(target[key] || {}, source[key]);\n } else {\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\n\n/**\n * Returns a new array with elements of the input array shuffled.\n * Uses something-something shuffle algorithm by splicing from a cloned array.\n */\nexport function shuffleArray(array: string[]) {\n const temp: string[] = JSON.parse(JSON.stringify(array));\n const ret: string[] = [];\n\n while (temp.length > 0) {\n const d = Math.floor(Math.random() * temp.length);\n ret.push(temp[d]);\n temp.splice(d, 1);\n }\n\n return ret;\n}\n\n/**\n * Exports a value to the global object under a nested namespace path.\n * Creates intermediate objects if they do not exist.\n * \n * Example: `exportToGlobal('MyMod.Utils', value)` creates `globalThis.MyMod.Utils = value`.\n */\nexport function exportToGlobal(name: string, value: any): void {\n const keys = name.split('.');\n let current = globalThis as any;\n\n for (let i = 0; i < keys.length - 1; i++) {\n if (!current[keys[i]]) {\n current[keys[i]] = {};\n }\n current = current[keys[i]];\n }\n\n current[keys[keys.length - 1]] = value;\n}\n\n\n/**\n * Deeply merges only matching properties from `mergeFrom` into `mergeTo`.\n * Properties not present in `mergeTo` are ignored.\n * Objects are recursively merged, primitive properties overwritten.\n */\nexport function deepMergeMatchingProperties<T extends object>(mergeTo: T, mergeFrom: T): T {\n const mergedObject = { ...mergeTo };\n\n for (const key in mergeFrom) {\n if (mergeFrom[key] !== null && typeof mergeFrom[key] === 'object') {\n (mergedObject as any)[key] = deepMergeMatchingProperties(mergedObject[key] || {}, mergeFrom[key]);\n } else if (key in mergedObject) {\n (mergedObject as any)[key] = mergeFrom[key];\n }\n }\n\n return mergedObject;\n}\n\n/** Checks if the given property has a getter defined on the object or its prototype chain. */\nexport function hasGetter<T extends object>(obj: T, prop: keyof T | string): boolean {\n while (obj && obj !== Object.prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor?.get) return true;\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n}\n\n/** Checks if the given property has a setter defined on the object or its prototype chain. */\nexport function hasSetter<T extends object>(obj: T, prop: keyof T | string): boolean {\n while (obj && obj !== Object.prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor?.set) return true;\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n}\n\n/**\n * Converts bytes to kilobytes. \n */\nexport const byteToKB = (nByte: number) => Math.round(nByte / 100) / 10;\n", "import { Button, Checkbox, Custom, Input, Label } from '../../base/elements_typings';\nimport { BaseSubscreen, getText } from '../../deeplib';\nimport { deepMerge } from '../common';\n\n/**\n * Collection of element creation utilities.\n * Provides convenience wrappers for generating commonly used UI elements.\n */\nexport const advElement = {\n createButton: elementCreateButton,\n createCheckbox: elementCreateCheckbox,\n createInput: elementCreateInput,\n createLabel: elementCreateLabel,\n createCustom: elementCreateCustom,\n\n createTooltip: elementCreateTooltip,\n getTooltip: elementGetTooltip,\n setTooltip: elementSetTooltip,\n\n createBackNext: elementPrevNext,\n};\n\nfunction elementCreateButton(options: Omit<Button, 'type'>): HTMLButtonElement {\n options.id ??= ElementGenerateID();\n const elem = document.getElementById(options.id) as HTMLButtonElement;\n\n if (elem) return elem;\n\n (options as Button).type = 'button';\n let image = undefined;\n\n if (options.options?.image) {\n image = options.options.image;\n options.options.image = undefined;\n }\n\n const disabled = typeof options?.disabled === 'function' ? options?.disabled() : options?.disabled;\n\n const button = ElementButton.Create(\n options.id,\n options?.onClick ?? (() => { }),\n deepMerge({\n labelPosition: 'center',\n }, options.options),\n deepMerge({\n button: {\n classList: ['deeplib-button'],\n attributes: {\n disabled: disabled,\n },\n children: [\n image ? {\n tag: 'img',\n attributes: {\n id: `${options.id}-image`,\n alt: '',\n decoding: 'async',\n loading: 'lazy',\n src: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' // 1x1 transparent image to get rid of broken image\n },\n style: {\n '--image': `url(\"${image}\")`,\n },\n } : undefined,\n ],\n },\n }, options.htmlOptions ?? {}));\n\n BaseSubscreen.currentElements.push([button, options as Button]);\n\n return button;\n};\n\nfunction elementCreateCheckbox(options: Omit<Checkbox, 'type'>) {\n const elem = document.getElementById(options.id);\n\n if (elem) return elem;\n\n (options as Checkbox).type = 'checkbox';\n\n const disabled = typeof options?.disabled === 'function' ? options?.disabled() : options?.disabled;\n\n const retElem = ElementCreate({\n tag: 'div',\n classList: ['deeplib-checkbox-container'],\n attributes: {\n id: `${options.id}-container`,\n },\n children: [\n deepMerge({\n tag: 'input',\n classList: ['checkbox', 'deeplib-input'],\n attributes: {\n type: 'checkbox',\n id: options.id,\n disabled: disabled,\n checked: options?.setElementValue?.() || undefined,\n },\n }, options.htmlOptions),\n {\n tag: 'label',\n classList: ['deeplib-text'],\n attributes: {\n for: options.id,\n },\n children: [options.label]\n },\n ],\n eventListeners: {\n change: () => {\n options?.setSettingValue?.((document.getElementById(options.id) as HTMLInputElement)?.checked);\n }\n }\n });\n\n if (options.description) {\n retElem.addEventListener('mouseover', () => {\n elementSetTooltip(options.description || '');\n });\n\n retElem.addEventListener('mouseout', () => {\n elementSetTooltip('');\n });\n }\n\n BaseSubscreen.currentElements.push([retElem, options as Checkbox]);\n\n return retElem;\n}\n\nfunction elementCreateCustom(options: Omit<Custom, 'type'>) {\n const elem = document.getElementById(options.id);\n\n if (elem) return elem;\n\n (options as Custom).type = 'custom';\n\n const retElem = ElementCreate(options.htmlOptions);\n\n BaseSubscreen.currentElements.push([retElem, options as Custom]);\n\n return retElem;\n}\n\nfunction elementCreateInput(options: Input) {\n const elem = document.getElementById(options.id);\n\n if (elem) return elem;\n\n const disabled = typeof options?.disabled === 'function' ? options?.disabled() : options?.disabled;\n\n const retElem = ElementCreate({\n tag: 'div',\n classList: ['deeplib-input-container'],\n attributes: {\n id: `${options.id}-container`,\n },\n children: [\n deepMerge({\n tag: 'input',\n classList: ['deeplib-input'],\n attributes: {\n type: options.type,\n id: options.id,\n placeholder: ' ',\n disabled: disabled,\n value: options?.setElementValue?.() || undefined,\n },\n }, options.htmlOptions),\n options.label ? {\n tag: 'label',\n classList: ['deeplib-text'],\n attributes: {\n for: options.id,\n },\n children: [options.label]\n } : undefined,\n ],\n eventListeners: {\n input: () => {\n options?.setSettingValue?.((document.getElementById(options.id) as HTMLInputElement)?.value);\n }\n }\n });\n\n if (options.description) {\n retElem.addEventListener('mouseover', () => {\n elementSetTooltip(options.description || '');\n });\n\n retElem.addEventListener('mouseout', () => {\n elementSetTooltip('');\n });\n }\n\n BaseSubscreen.currentElements.push([retElem, options]);\n\n return retElem;\n}\n\nfunction elementCreateLabel(options: Omit<Label, 'type'>) {\n const elem = document.getElementById(options.id);\n\n if (elem) return elem;\n\n (options as Label).type = 'label';\n\n const retElem = ElementCreate(deepMerge({\n tag: 'span',\n classList: ['deeplib-label', 'deeplib-text'],\n attributes: {\n id: options.id\n },\n children: [\n options.label,\n ],\n }, options.htmlOptions));\n\n if (options.description) {\n retElem.addEventListener('mouseover', () => {\n elementSetTooltip(options.description || '');\n });\n\n retElem.addEventListener('mouseout', () => {\n elementSetTooltip('');\n });\n }\n\n BaseSubscreen.currentElements.push([retElem, options as Label]);\n\n return retElem;\n}\n\nfunction elementCreateTooltip() {\n const element = ElementCreate({\n tag: 'div',\n classList: ['deeplib-tooltip'],\n attributes: {\n id: 'deeplib-tooltip'\n },\n style: {\n display: 'none'\n }\n });\n\n return element;\n}\n\nfunction elementGetTooltip() {\n return document.getElementById('deeplib-tooltip') ?? undefined;\n}\n\nfunction elementSetTooltip(text: string) {\n const element = document.getElementById('deeplib-tooltip');\n\n if (!element) return false;\n\n element.innerHTML = text;\n if (text === '') element.style.display = 'none';\n else element.style.display = '';\n\n return true;\n}\n\ninterface PrevNext {\n id: string,\n initialLabel?: string\n back: (arg0: PrevNextCallbacks) => void,\n initialPrevTooltip?: string,\n next: (arg0: PrevNextCallbacks) => void,\n initialNextTooltip?: string\n};\n\ninterface PrevNextCallbacks {\n setLabel: (label: string) => void,\n setBackTooltip: (tooltip: string) => void,\n setNextTooltip: (tooltip: string) => void\n}\n\nfunction elementPrevNext(options: PrevNext) {\n const elem = document.getElementById(options.id);\n\n if (elem) return elem;\n\n const setLabel = (label: string) => {\n const elem = document.getElementById(`${options.id}-label`);\n if (!elem) return false;\n elem.textContent = label;\n };\n\n const setPrevTooltip = (tooltip: string) => {\n const elem = document.getElementById(`deeplib-prev-next-${options.id}-prev-button-tooltip`);\n if (!elem) return false;\n elem.textContent = tooltip;\n };\n\n const setNextTooltip = (tooltip: string) => {\n const elem = document.getElementById(`deeplib-prev-next-${options.id}-next-button-tooltip`);\n if (!elem) return false;\n elem.textContent = tooltip;\n };\n\n const retElem = ElementCreate({\n tag: 'div',\n classList: ['deeplib-prev-next'],\n attributes: {\n id: options.id\n },\n children: [\n advElement.createButton({\n id: `deeplib-prev-next-${options.id}-prev-button`,\n onClick: () => {\n options.back({\n setLabel: setLabel,\n setBackTooltip: setPrevTooltip,\n setNextTooltip: setNextTooltip,\n });\n },\n htmlOptions: {\n button: {\n classList: ['deeplib-prev-next-button']\n }\n },\n options: {\n noStyling: true,\n image: `${PUBLIC_URL}/dl_images/arrow_left.svg`,\n tooltip: options.initialPrevTooltip,\n }\n }),\n advElement.createLabel({\n id: `${options.id}-label`,\n label: options.initialLabel,\n htmlOptions: {\n classList: ['deeplib-prev-next-label']\n }\n }),\n advElement.createButton({\n id: `deeplib-prev-next-${options.id}-next-button`,\n onClick: () => {\n options.next({\n setLabel: setLabel,\n setBackTooltip: setPrevTooltip,\n setNextTooltip: setNextTooltip,\n });\n },\n htmlOptions: {\n button: {\n classList: ['deeplib-prev-next-button']\n }\n },\n options: {\n noStyling: true,\n image: `${PUBLIC_URL}/dl_images/arrow_right.svg`,\n tooltip: options.initialNextTooltip,\n }\n }),\n ]\n });\n\n return retElem;\n}\n\nexport type ModalButton<T extends string = string> = {\n /** Button label text. */\n text: string\n /** Action identifier returned when the button is clicked. */\n action: T\n /** Whether the button is disabled. */\n disabled?: boolean\n};\n\nexport type ModalInputOptions = {\n /** Default input value. */\n defaultValue?: string\n /** Makes the input read-only if true. */\n readOnly?: boolean\n /** Placeholder text. */\n placeholder?: string\n /** Input type. */\n type: 'input' | 'textarea'\n /** Validation callback to check if the input value is valid. */\n validate?: (value: string) => string | null\n};\n\nexport type ModalOptions<T extends string = string> = {\n /** Content or DOM node displayed in the modal header. */\n prompt: ElementButton.StaticNode\n /** Optional input configuration. */\n input?: ModalInputOptions\n /** Buttons to display in the modal. */\n buttons?: ModalButton<T>[]\n /** Whether clicking backdrop closes the modal (default: true). */\n closeOnBackdrop?: boolean\n /** Auto-close timeout in milliseconds. */\n timeoutMs?: number\n /** Action sent when Escape key is pressed. */\n escapeAction?: T\n /** Action sent when Enter key is pressed. */\n enterAction?: T\n};\n\n/**\n * Modal dialog implementation with queuing, buttons, optional input, and focus trapping.\n * Multiple modals are queued to ensure only one is visible at a time.\n */\nexport class Modal<T extends string = string> {\n private dialog: HTMLDialogElement;\n private blocker: HTMLDivElement;\n private inputEl?: HTMLInputElement | HTMLTextAreaElement;\n private timeoutId?: number;\n\n /** Static modal queue. */\n private static queue: Modal<any>[] = [];\n /** Flag to indicate if a modal is currently being shown. */\n private static processing = false;\n\n constructor(private opts: ModalOptions<T>) {\n opts ??= {} as ModalOptions<T>;\n opts.closeOnBackdrop ??= true;\n\n const promptId = `modal-prompt-${Date.now()}`;\n\n const prompt = (CommonIsArray(opts.prompt) ? opts.prompt : [opts.prompt]).filter(i => i != null) ?? [''];\n\n this.dialog = ElementCreate({\n tag: 'dialog',\n classList: ['deeplib-modal'],\n attributes: {\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': promptId\n },\n style: {\n fontFamily: CommonGetFontName()\n },\n children: [\n { \n tag: 'div',\n classList: ['deeplib-modal-prompt-container'],\n children: [\n ...prompt,\n ]\n },\n {\n tag: 'div',\n classList: ['deeplib-modal-prompt'],\n attributes: {\n id: promptId\n },\n children: [\n opts.input ? this.renderInput(opts.input) : undefined,\n ]\n },\n this.renderButtons()\n ]\n });\n\n this.blocker = this.createBlocker();\n\n this.renderButtons();\n document.body.append(this.createBlocker(), this.dialog);\n this.setupFocusTrap();\n if (opts.timeoutMs) {\n this.timeoutId = window.setTimeout(() => this.close('timeout' as T), opts.timeoutMs);\n }\n }\n\n /**\n * Displays the modal and resolves with the chosen action and input value.\n */\n show(): Promise<[T, string | null]> {\n return Modal.enqueue(this);\n }\n\n /**\n * Shows a simple alert modal with a single \"OK\" button.\n */\n static async alert(msg: ElementButton.StaticNode, timeoutMs?: number) {\n await new Modal({\n prompt: msg,\n buttons: [{ action: 'close', text: getText('modal.button.ok') }],\n timeoutMs,\n escapeAction: 'close',\n }).show();\n }\n\n /**\n * Shows a confirmation modal with \"Cancel\" and \"OK\" buttons.\n * Returns true if \"OK\" is clicked.\n */\n static async confirm(msg: ElementButton.StaticNode) {\n const [action] = await new Modal({\n prompt: msg,\n buttons: [{ text: getText('modal.button.decline'), action: 'decline' }, { text: getText('modal.button.confirm'), action: 'confirm' }],\n escapeAction: 'decline',\n enterAction: 'confirm' \n }).show();\n return action === 'confirm';\n }\n\n /**\n * Shows a prompt modal with an input field and \"Submit\"/\"Cancel\" buttons.\n * Returns the input value if submitted, otherwise null.\n */\n static async prompt(msg: ElementButton.StaticNode, defaultValue = ''): Promise<string | null> {\n const [action, value] = await new Modal({ \n prompt: msg,\n timeoutMs: 0,\n input: { type: 'input', defaultValue },\n buttons: [{ text: getText('modal.button.cancel'), action: 'cancel' }, { text: getText('modal.button.submit'), action: 'submit' }],\n escapeAction: 'cancel',\n enterAction: 'submit' \n }).show();\n return action === 'submit' ? value : null;\n }\n\n /** Creates the input element for the modal, applying configuration and validation. */\n private renderInput(cfg: ModalInputOptions) {\n const el = document.createElement(cfg.type);\n el.classList.add('deeplib-modal-input');\n if (cfg.placeholder) el.placeholder = cfg.placeholder;\n if (cfg.readOnly) el.readOnly = true;\n if (cfg.defaultValue) el.value = cfg.defaultValue;\n if (cfg.type === 'textarea') (el as HTMLTextAreaElement).rows = 5;\n el.addEventListener('input', () => {\n const err = cfg.validate?.(el.value);\n el.setCustomValidity(err || '');\n });\n this.inputEl = el;\n\n return el;\n }\n\n /** Creates modal action buttons from configuration. */\n private renderButtons() {\n const container = document.createElement('div');\n container.classList.add('deeplib-modal-button-container');\n\n const btns = this.opts.buttons ? [...this.opts.buttons] : [];\n\n btns.forEach(b => {\n const btn = advElement.createButton({\n id: `deeplib-modal-${b.action}`,\n onClick: () => this.close(b.action),\n options: {\n disabled: b.disabled,\n label: b.text,\n }\n });\n container.append(btn);\n });\n\n return container;\n }\n\n /** Creates the modal backdrop blocker with optional click-to-close behavior. */\n private createBlocker() {\n const blocker = document.createElement('div');\n blocker.classList.add('deeplib-modal-blocker');\n blocker.title = 'Click to close';\n if (this.opts.closeOnBackdrop !== false)\n blocker.addEventListener('click', () => this.close('close' as T));\n\n return blocker;\n }\n\n /** Implements a focus trap to keep keyboard navigation inside the modal. */\n private setupFocusTrap() {\n const focusable = 'button, [href], input, textarea, select, [tabindex]:not([tabindex=\"-1\"])';\n const elements = Array.from(this.dialog.querySelectorAll<HTMLElement>(focusable));\n const first = elements[0];\n const last = elements[elements.length - 1];\n this.dialog.addEventListener('keydown', e => {\n if (e.key === 'Tab') {\n if (elements.length === 0) {\n e.preventDefault();\n return;\n }\n if (e.shiftKey) {\n if (document.activeElement === first) {\n last.focus();\n e.preventDefault();\n }\n } else {\n if (document.activeElement === last) {\n first.focus();\n e.preventDefault();\n }\n }\n } else if (e.key === 'Escape') {\n e.stopPropagation();\n this.close((this.opts.escapeAction ?? 'close') as T);\n } else if (e.key === 'Enter') {\n if (elements.some(el => el === document.activeElement) && document.activeElement !== this.inputEl) return;\n e.preventDefault();\n e.stopPropagation();\n this.close((this.opts.enterAction ?? 'submit') as T);\n }\n });\n window.requestAnimationFrame(() => {\n (this.inputEl || first)?.focus();\n });\n }\n\n /** Closes the modal, cleans up DOM, resolves promise, and shows next queued modal. */\n private close(action: T) {\n if (this.timeoutId) clearTimeout(this.timeoutId);\n this.dialog.close();\n this.dialog.remove();\n this.blocker.remove();\n document.body.querySelector('.deeplib-modal-blocker')?.remove();\n const value = this.inputEl?.value ?? '';\n this.resolve([action, value]);\n Modal.dequeue();\n }\n\n /**\n * An internal function where we will save promise function.\n */\n private resolve: (result: [T, string]) => void = () => { };\n\n /** A function that adds a modal to the queue and returns a promise */\n private static enqueue(modal: Modal<any>): Promise<[any, string]> {\n Modal.queue.push(modal);\n if (!Modal.processing) Modal.dequeue();\n return new Promise(resolve => (modal.resolve = resolve));\n }\n\n /** A function that processes the queue, removing the first modal */\n private static dequeue() {\n const modal = Modal.queue.shift();\n if (modal) {\n Modal.processing = true;\n modal.dialog.show();\n } else {\n Modal.processing = false;\n }\n }\n}\n", "\nimport { BaseSubscreen, byteToKB, getText, GUI, GuiDebug, layout, ModStorage, setSubscreen, SubscreenOptions } from '../deeplib';\nimport { advElement } from '../utilities/elements/elements';\nimport { GuiImportExport } from './import_export';\n\n/**\n * Configuration options for the main menu.\n * \n * If these are defined, new button for each option will be added to the main menu.\n */\nexport type MainMenuOptions = {\n /**\n * Optional URL to the project's repository.\n * Example: \"https://github.com/user/project\"\n */\n repoLink?: string;\n\n /**\n * Optional URL to the project's wiki or documentation.\n * Example: \"https://github.com/user/project/wiki\"\n */\n wikiLink?: string;\n\n /**\n * Optional subscreen to use for the \"reset\" action.\n */\n resetSubscreen?: BaseSubscreen;\n\n /**\n * Optional subscreen for import/export functionality.\n * Provides tools to import or export data to or from the mod.\n */\n importExportSubscreen?: GuiImportExport;\n\n /**\n * Optional boolean flag to enable the mod storage fullness indicator.\n */\n storageFullnessIndicator?: boolean;\n};\n\nexport class MainMenu extends BaseSubscreen {\n subscreens: BaseSubscreen[] = [];\n\n private static options: MainMenuOptions = {};\n\n protected static override subscreenOptions: SubscreenOptions = {\n name: 'mainmenu',\n };\n\n constructor(module: GUI) {\n super(module);\n\n this.subscreens = module.subscreens;\n }\n\n load(): void {\n if (!GUI.instance || CurrentModule as string !== 'DeepLibMod') {\n this.setSubscreen(this);\n return;\n }\n\n super.load();\n\n const exitButton = advElement.createButton({\n id: 'exit',\n size: [90, 90],\n onClick: () => {\n this.exit();\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/exit.svg`,\n tooltip: getText('settings.button.back_button_hint')\n }\n });\n\n const menu = document.getElementById('deeplib-nav-menu');\n if (menu) {\n ElementMenu.AppendButton(menu, exitButton);\n }\n\n for (const screen of this.subscreens) {\n\n if (screen.options.name == 'mainmenu') continue;\n\n const button = advElement.createButton({\n id: `${screen.options.name}-button`,\n onClick: () => {\n this.setSubscreen(screen);\n },\n size: [null, 90],\n options: {\n image: screen.options.icon,\n label: getText(`mainmenu.button.${screen.options.name}`),\n }\n });\n\n layout.appendToSettingsDiv(button);\n }\n\n const miscDiv = layout.getMiscDiv();\n layout.appendToSubscreen(miscDiv);\n\n if (MainMenu.options.wikiLink) {\n const wikiButton = advElement.createButton({\n id: 'deeplib-wiki-button',\n onClick: () => {\n window.open(MainMenu.options.wikiLink, '_blank');\n },\n size: [null, 80],\n options: {\n image: `${PUBLIC_URL}/dl_images/notebook.svg`,\n label: getText('mainmenu.button.wiki'),\n }\n });\n layout.appendToMiscDiv(wikiButton);\n }\n\n if (MainMenu.options.repoLink) {\n const repoButton = advElement.createButton({\n id: 'deeplib-repo-button',\n onClick: () => {\n window.open(MainMenu.options.repoLink, '_blank');\n },\n size: [null, 80],\n options: {\n image: `${PUBLIC_URL}/dl_images/git.svg`,\n label: getText('mainmenu.button.repo'),\n }\n });\n layout.appendToMiscDiv(repoButton);\n }\n\n if (MainMenu.options.resetSubscreen) {\n const resetButton = advElement.createButton({\n id: 'deeplib-reset-button',\n onClick: () => {\n this.setSubscreen(MainMenu.options.resetSubscreen!);\n },\n size: [null, 80],\n options: {\n image: `${PUBLIC_URL}/dl_images/trash_bin.svg`,\n label: getText('mainmenu.button.reset'),\n }\n });\n layout.appendToMiscDiv(resetButton);\n }\n\n if (MainMenu.options.importExportSubscreen) {\n const importExportButton = advElement.createButton({\n id: 'deeplib-import-export-button',\n onClick: () => {\n this.setSubscreen(MainMenu.options.importExportSubscreen!);\n },\n size: [null, 80],\n options: {\n image: `${PUBLIC_URL}/dl_images/transfer.svg`,\n label: getText('mainmenu.button.import_export'),\n }\n });\n layout.appendToMiscDiv(importExportButton);\n }\n\n if (MainMenu.options.storageFullnessIndicator) {\n const maxStorageCapacityKB = 180;\n const currentStorageCapacityKB = byteToKB(ModStorage.measureSize(Player.OnlineSettings));\n const fullness = (currentStorageCapacityKB / maxStorageCapacityKB * 100).toFixed(1);\n\n const storageFullnessWrapper = advElement.createButton({\n id: CommonGenerateUniqueID(),\n size: [null, 80],\n options: {\n tooltipPosition: 'left',\n noStyling: true,\n tooltip: CommonStringPartitionReplace(getText('mainmenu.meter.storage_hint'), {\n $percentage$: `${fullness}`\n }).join(''),\n label: CommonStringPartitionReplace(getText('mainmenu.meter.storage_label'), {\n $currentCapacity$: `${currentStorageCapacityKB}`,\n $maxCapacity$: `${maxStorageCapacityKB}`,\n }).join(''),\n },\n htmlOptions: {\n button: {\n children: [\n {\n tag: 'div',\n attributes: { id: 'deeplib-storage-meter' },\n children: [\n {\n tag: 'div',\n attributes: { id: 'deeplib-storage-bar' },\n style: { width: `${fullness}%` },\n },\n ]\n }\n ]\n }\n }\n });\n layout.appendToMiscDiv(storageFullnessWrapper);\n }\n\n if (IS_DEBUG) {\n const debugButton = advElement.createButton({\n id: 'deeplib-debug-button',\n onClick: () => {\n this.setSubscreen(new GuiDebug());\n },\n size: [90, 90],\n options: {\n image: `${PUBLIC_URL}/dl_images/bug.svg`,\n }\n });\n if (menu) {\n ElementMenu.PrependItem(menu, debugButton);\n }\n }\n }\n\n run() {\n super.run();\n }\n\n click() { }\n\n exit(): void {\n CharacterAppearanceForceUpCharacter = -1;\n CharacterLoadCanvas(Player);\n\n const returnScreen = typeof this.options.returnScreen === 'function' ? this.options.returnScreen() : this.options.returnScreen;\n\n if (!returnScreen) {\n PreferenceOpenSubscreen('Extensions').then(() => {\n PreferenceSubscreenExtensionsClear();\n });\n } else if (returnScreen instanceof BaseSubscreen) {\n setSubscreen(returnScreen ?? null).then(() => {\n });\n } else if (Array.isArray(returnScreen)) {\n CommonSetScreen(...returnScreen);\n }\n }\n\n resize(): void {\n super.resize();\n ElementSetPosition('deeplib-misc', 1905, 930, 'bottom-right');\n ElementSetSize('deeplib-misc', 405, null);\n }\n\n static setOptions(mainMenuOptions: MainMenuOptions) {\n MainMenu.options = mainMenuOptions;\n }\n}\n\n/**\n * Open a specific subscreen. \n */\n// TODO - Remove after R120. \nasync function PreferenceOpenSubscreen(subscreen: PreferenceSubscreenName, page: number = 1) {\n if (CurrentModule !== 'Character' || CurrentScreen !== 'Preference') {\n await CommonSetScreen('Character', 'Preference');\n }\n PreferenceSubscreen?.unload?.();\n\n PreferenceSubscreen = PreferenceSubscreens.find(s => s.name === subscreen) ?? null;\n if (!CommonIsNonNegativeInteger(page)) page = 1;\n PreferencePageCurrent = page;\n PreferenceMessage = '';\n PreferenceSubscreen?.load?.();\n}", "\nimport { BaseSubscreen, ModSdkManager, getText, layout, SettingsModel, modStorage, deepLibLogger, SubscreenOptions } from '../deeplib';\nimport { advElement, Modal } from '../utilities/elements/elements';\n\n/**\n * Configuration options for the {@link GuiImportExport} class.\n */\nexport type ImportExportOptions = {\n /** \n * A custom save file extension (e.g., \".mydata\"). \n * If it doesn't start with a dot, it will be automatically prefixed.\n */\n customFileExtension: string;\n\n /** Optional callback invoked after data has been successfully imported. */\n onImport?: () => void;\n\n /** Optional callback invoked after data has been successfully exported. */\n onExport?: () => void;\n};\n\n/**\n * Possible data transfer methods for import/export operations.\n * - `clipboard`: Uses the system clipboard.\n * - `file`: Uses file save/load dialogs.\n */\ntype DataTransferMethod = 'clipboard' | 'file';\n\n/**\n * GUI screen for importing and exporting mod data.\n * Provides buttons to import/export data either via file or clipboard.\n */\nexport class GuiImportExport extends BaseSubscreen {\n private importExportOptions: ImportExportOptions;\n\n static override subscreenOptions: SubscreenOptions = {\n name: 'import-export',\n };\n\n constructor(importExportOptions: ImportExportOptions) {\n super();\n this.importExportOptions = importExportOptions;\n }\n\n load(): void {\n\n super.load();\n\n const importFromFileButton = advElement.createButton({\n id: 'deeplib-import-file-button',\n size: [600, 90],\n onClick: () => {\n this.dataImport('file');\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/file_import.svg`,\n label: getText('import-export.button.import_file')\n }\n });\n layout.appendToSettingsDiv(importFromFileButton);\n\n const exportToFileButton = advElement.createButton({\n id: 'deeplib-export-file-button',\n size: [600, 90],\n onClick: () => {\n this.dataExport('file');\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/file_export.svg`,\n label: getText('import-export.button.export_file')\n }\n });\n layout.appendToSettingsDiv(exportToFileButton);\n\n const importFromClipboardButton = advElement.createButton({\n id: 'deeplib-import-clipboard-button',\n size: [600, 90],\n onClick: () => {\n this.dataImport('clipboard');\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/clipboard_import.svg`,\n label: getText('import-export.button.import_clipboard')\n }\n });\n layout.appendToSettingsDiv(importFromClipboardButton);\n\n const exportToClipboardButton = advElement.createButton({\n id: 'deeplib-export-clipboard-button',\n size: [600, 90],\n onClick: () => {\n this.dataExport('clipboard');\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/clipboard_export.svg`,\n label: getText('import-export.button.export_clipboard')\n }\n });\n layout.appendToSettingsDiv(exportToClipboardButton);\n }\n\n resize(): void {\n super.resize();\n }\n\n /** Exports the mod data using the specified method. */\n async dataExport(transferMethod: DataTransferMethod) {\n try {\n const data = LZString.compressToBase64(JSON.stringify(modStorage.playerStorage));\n\n if (transferMethod === 'clipboard') {\n await this.exportToClipboard(data);\n } else if (transferMethod === 'file') {\n await this.exportToFile(data, 'themed_settings');\n }\n\n this.importExportOptions.onExport?.();\n ToastManager.success('Data exported successfully.');\n } catch (error) {\n ToastManager.error('Data export failed.');\n deepLibLogger.error(`Data export failed for ${ModSdkManager.ModInfo.name}.`, error,);\n }\n }\n\n /** Imports mod data using the specified method. */\n async dataImport(transferMethod: DataTransferMethod) {\n try {\n let importedData: string | null = '';\n\n if (transferMethod === 'clipboard') {\n importedData = await this.importFromClipboard() ?? null;\n } else if (transferMethod === 'file') {\n importedData = await this.importFromFile() ?? null;\n }\n\n if (!importedData) {\n throw new Error('No data imported.');\n }\n\n const data = JSON.parse(LZString.decompressFromBase64(importedData) ?? '') as SettingsModel;\n\n if (!data) {\n throw new Error('Invalid data.');\n }\n\n modStorage.playerStorage = data;\n this.importExportOptions.onImport?.();\n ToastManager.success('Data imported successfully.');\n } catch (error) {\n ToastManager.error('Data import failed.');\n deepLibLogger.error(`Data import failed for ${ModSdkManager.ModInfo.name}.`, error,);\n }\n }\n\n /** Saves data to a file using the browser's save dialog. */\n async exportToFile(data: string, defaultFileName: string): Promise<void> {\n const CUSTOM_EXTENSION = this.importExportOptions.customFileExtension.startsWith('.')\n ? this.importExportOptions.customFileExtension\n : '.' + this.importExportOptions.customFileExtension;\n\n const suggestedName = defaultFileName.endsWith(CUSTOM_EXTENSION)\n ? defaultFileName\n : defaultFileName + CUSTOM_EXTENSION;\n\n if ('showSaveFilePicker' in window) {\n try {\n const handle = await (window as any).showSaveFilePicker({\n suggestedName: suggestedName,\n types: [\n {\n description: 'Custom Data Files',\n accept: { 'text/plain': [CUSTOM_EXTENSION] },\n },\n ],\n });\n const writable = await handle.createWritable();\n await writable.write(data);\n await writable.close();\n } catch (error: any) {\n throw new Error('File save cancelled or failed: ' + error.message);\n }\n } else {\n const fileName = await Modal.prompt('Enter file name', suggestedName);\n\n if (fileName === null) {\n return;\n } else if (fileName === '') {\n throw new Error('File name cannot be empty.');\n }\n\n const blob = new Blob([data], { type: 'text/plain' });\n const link = ElementCreate({\n tag: 'a',\n attributes: {\n href: URL.createObjectURL(blob),\n download: fileName.endsWith(CUSTOM_EXTENSION) ? fileName : fileName + CUSTOM_EXTENSION\n },\n });\n\n link.click();\n URL.revokeObjectURL(link.href);\n }\n }\n\n /** Opens a file picker and reads the selected file's contents, importing the data. */\n async importFromFile(): Promise<string | null> {\n const CUSTOM_EXTENSION = this.importExportOptions.customFileExtension.startsWith('.')\n ? this.importExportOptions.customFileExtension\n : '.' + this.importExportOptions.customFileExtension;\n\n async function importFromFileInternal(file: File): Promise<string | null> {\n if (!file.name.endsWith(CUSTOM_EXTENSION)) {\n throw new Error(`Invalid file type. Expected a ${CUSTOM_EXTENSION} file.`);\n }\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(new Error('Failed to read file.'));\n reader.readAsText(file);\n });\n }\n\n if ('showOpenFilePicker' in window) {\n try {\n const [fileHandle] = await (window as any).showOpenFilePicker({\n types: [\n {\n description: 'Custom Data Files',\n accept: { 'text/plain': [CUSTOM_EXTENSION] },\n },\n ],\n multiple: false,\n });\n const file = await fileHandle.getFile();\n return await importFromFileInternal(file);\n } catch (error: any) {\n throw new Error('File selection cancelled or failed: ' + error.message);\n }\n } else {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = CUSTOM_EXTENSION;\n input.onchange = async (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n try {\n const data = await importFromFileInternal(file);\n resolve(data);\n } catch (error) {\n reject(error);\n }\n } else {\n reject(new Error('No file selected.'));\n }\n };\n input.click();\n });\n }\n }\n\n /** Copies the given data to the clipboard. */\n async exportToClipboard(data: string): Promise<void> {\n return navigator.clipboard.writeText(data).catch((error) => {\n throw new Error('Failed to copy data to clipboard.' + error);\n });\n }\n\n /** Prompts the user to enter data and returns it. */\n async importFromClipboard(): Promise<string | null> {\n return Modal.prompt('Enter data to import').catch((error) => {\n throw new Error('Failed to read data from clipboard.' + error);\n });\n }\n}\n", "import { SettingsModel, deepLibLogger } from '../deeplib';\n\n/**\n * ModStorage is a singleton class responsible for managing\n * mod-specific persistent storage both in player settings\n * and in browser localStorage.\n *\n * It provides methods to load and save mod data compressed\n * as base64 strings, and exposes typed accessors for\n * playerStorage and extensionStorage.\n */\nexport class ModStorage<T extends SettingsModel = SettingsModel> {\n /** Singleton instance of ModStorage */\n private static _instance: ModStorage | null = null;\n /** The unique mod identifier used as key prefix in storage */\n private modName: string;\n\n constructor(modName: string) {\n if (!ModStorage._instance) {\n ModStorage._instance = this;\n this.modName = modName;\n }\n this.modName ??= modName;\n\n return ModStorage._instance as ModStorage<T>;\n }\n\n get playerStorage(): T {\n return Player[this.modName];\n }\n\n set playerStorage(value: T) {\n Player[this.modName] = value;\n }\n\n get extensionStorage(): string {\n return Player.ExtensionSettings[this.modName];\n }\n\n set extensionStorage(value: string) {\n Player.ExtensionSettings[this.modName] = value;\n }\n\n setLocalStorage(key: string, value: object) {\n localStorage.setItem(`${this.modName}_${key}`, ModStorage.dataCompress(value));\n }\n\n getLocalStorage(key: string): object | null {\n const data = localStorage.getItem(`${this.modName}_${key}`);\n\n if (!data) return null;\n\n return ModStorage.dataDecompress<T>(data);\n }\n\n load() {\n if (this.extensionStorage) {\n const parsed = ModStorage.dataDecompress<T>(this.extensionStorage || '');\n if (parsed === null || !Object.hasOwn(parsed, 'Version')) {\n this.playerStorage = {} as T;\n } else {\n this.playerStorage = parsed;\n };\n } else {\n this.playerStorage = {} as T;\n }\n }\n\n save() {\n if (!this.extensionStorage) this.extensionStorage = '';\n this.extensionStorage = ModStorage.dataCompress(this.playerStorage);\n ServerPlayerExtensionSettingsSync(this.modName);\n }\n\n static dataDecompress<T = object>(string: string): T | null {\n const d = LZString.decompressFromBase64(string as string);\n let data: T | null = null;\n\n try {\n const decoded: T = JSON.parse(d as string);\n data = decoded;\n } catch (error) {\n deepLibLogger.error(error);\n }\n\n return data;\n }\n\n static dataCompress(object: object) {\n return LZString.compressToBase64(JSON.stringify(object));\n }\n\n static measureSize(data: unknown): number {\n try {\n if (typeof data !== 'string') {\n data = JSON.stringify(data) || '';\n }\n \n if (typeof data === 'string') {\n return (new TextEncoder()).encode(data).byteLength;\n }\n\n throw new Error();\n } catch {\n return NaN;\n }\n }\n}\n", "import { SettingElement } from '../../base/elements_typings';\n\nexport const domUtil = {\n /**\n * Automatically sets the position of the element based on the given position.\n * The position can be either a [x, y] tuple or a function returning such a tuple.\n * If both x and y are defined, the element's position is updated accordingly.\n */\n autoSetPosition: autoSetPosition,\n\n /**\n * Automatically sets the size of the element based on the given size.\n * The size can be either a [width, height] tuple or a function returning such a tuple.\n * If both width and height are defined, the element's size is updated accordingly.\n */\n autoSetSize: autoSetSize,\n\n /**\n * Hides the element by setting its CSS display property to 'none'.\n * If the element cannot be found, the function does nothing.\n */\n hide: hide,\n\n /**\n * Unhides the element by clearing its CSS display property (sets it to '').\n * If the element cannot be found, the function does nothing.\n */\n unhide: unhide,\n\n /**\n * Checks if the element has overflow content.\n * Returns an object indicating if there is any overflow,\n * and specifically if there is vertical or horizontal overflow.\n * Returns null if the element is not found.\n */\n hasOverflow: hasOverflow\n};\n\nfunction autoSetPosition(_: ElementHelp.ElementOrId, position: SettingElement['position']) {\n let xPos = undefined;\n let yPos = undefined;\n\n if (Array.isArray(position)) {\n xPos = position[0];\n yPos = position[1];\n } else if (typeof position === 'function') {\n const result = position();\n xPos = result[0];\n yPos = result[1];\n }\n\n if (xPos !== undefined && yPos !== undefined) ElementSetPosition(_, xPos, yPos);\n}\n\nfunction autoSetSize(_: ElementHelp.ElementOrId, size: SettingElement['size']) {\n let width = undefined;\n let height = undefined;\n \n if (Array.isArray(size)) {\n width = size[0];\n height = size[1];\n } else if (typeof size === 'function') {\n const result = size();\n width = result[0];\n height = result[1];\n }\n \n if (width !== undefined && height !== undefined) ElementSetSize(_, width, height);\n}\n\nfunction hide(_: ElementHelp.ElementOrId) {\n const element = ElementWrap(_);\n if (!element) return;\n\n element.style.display = 'none';\n};\n\nfunction unhide(_: ElementHelp.ElementOrId) {\n const element = ElementWrap(_);\n if (!element) return;\n\n element.style.display = '';\n};\n\nfunction hasOverflow(el: ElementHelp.ElementOrId): { any: boolean, vertical: boolean, horizontal: boolean } | null {\n const element = ElementWrap(el);\n if (!element) return null;\n\n const vertical = element.scrollHeight > element.clientHeight;\n const horizontal = element.scrollWidth > element.clientWidth;\n\n return {\n any: vertical || horizontal,\n vertical,\n horizontal,\n };\n}", "export const layout = {\n getSubscreen: elementGetSubscreenDiv,\n appendToSubscreen: elementAppendToSubscreenDiv,\n removeSubscreen: elementRemoveSubscreenDiv,\n\n getSettingsDiv: elementGetSettingsDiv,\n appendToSettingsDiv: elementAppendToSettingsDiv,\n removeSettingsDiv: elementRemoveSettingsDiv,\n\n getMiscDiv: elementGetMiscDiv,\n appendToMiscDiv: elementAppendToMiscDiv,\n removeMiscDiv: elementRemoveMiscDiv\n};\n\nfunction elementGetSubscreenDiv() {\n const subscreenDiv = ElementWrap('deeplib-subscreen');\n if (subscreenDiv) {\n return subscreenDiv;\n }\n\n const div = ElementCreate({\n tag: 'div',\n classList: ['deeplib-subscreen', 'HideOnPopup'],\n attributes: { id: 'deeplib-subscreen' }\n });\n\n return document.body.appendChild(div);\n}\n\nfunction elementRemoveSubscreenDiv() {\n return elementGetSubscreenDiv()?.remove();\n}\n\nfunction elementAppendToSubscreenDiv(...element: HTMLElement[]) {\n return elementGetSubscreenDiv()?.append(...element);\n}\n\nfunction elementGetSettingsDiv() {\n const settingsDiv = ElementWrap('deeplib-settings');\n if (settingsDiv) {\n return settingsDiv;\n }\n\n const div = ElementCreate({\n tag: 'div', \n classList: ['deeplib-settings', 'scroll-box'], \n attributes: { id: 'deeplib-settings' } \n });\n\n return div;\n}\n\nfunction elementAppendToSettingsDiv(...element: HTMLElement[]) {\n return elementGetSettingsDiv()?.append(...element);\n}\n\nfunction elementRemoveSettingsDiv() {\n return elementGetSettingsDiv()?.remove();\n}\n\nfunction elementGetMiscDiv() {\n const miscDiv = ElementWrap('deeplib-misc');\n if (miscDiv) {\n return miscDiv;\n }\n\n const div = ElementCreate({\n tag: 'div', \n classList: ['deeplib-misc'], \n attributes: { id: 'deeplib-misc' }\n });\n\n return div;\n}\n\nfunction elementAppendToMiscDiv(...element: HTMLElement[]) {\n return elementGetMiscDiv()?.append(...element);\n}\n\nfunction elementRemoveMiscDiv() {\n return elementGetMiscDiv()?.remove();\n}\n", "type LogLevel = 'info' | 'log' | 'warn' | 'error' | 'debug';\n\ninterface LogEntry {\n readonly args: readonly any[];\n readonly date: Date;\n readonly logLevel: LogLevel;\n}\n\nexport class Logger extends Array<LogEntry> {\n private ModName: string = 'DeepLib';\n\n constructor(modName?: string) {\n super();\n\n if (modName) {\n this.ModName = modName;\n }\n }\n\n private _Log(level: LogLevel, ...args: any[]): void {\n const logEntry: LogEntry = {\n logLevel: level,\n args: [...args],\n // trace: arguments.callee.caller.toString().split('\\n'), \n date: new Date(Date.now())\n // `[${this.ModName}] ${formattedArgs}` \n };\n\n const userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes('chrome') || userAgent.includes('firefox')) {\n const color = Logger.colorizeLog(level);\n args.forEach(arg => {\n if (typeof arg === 'string') {\n arg = `\\n%c${arg}`;\n // args.splice(args.indexOf(arg), 1, arg, color);\n }\n });\n console.log(`%c${this.ModName}:`, color, ...args);\n } else {\n console.log(`${this.ModName}:`, ...args);\n }\n\n this.push(logEntry);\n }\n\n info(...args: any[]): void {\n this._Log('info', ...args);\n }\n\n log(...args: any[]): void {\n this._Log('log', ...args);\n }\n\n warn(...args: any[]): void {\n this._Log('warn', ...args);\n }\n\n error(...args: any[]): void {\n this._Log('error', ...args);\n }\n\n debug(...args: any[]): void {\n this._Log('debug', ...args);\n }\n\n static colorizeLog(logLevel: LogLevel): string {\n const colors: Record<LogLevel, string> = {\n info: 'color: #32CCCC',\n log: 'color: #CCCC32',\n warn: 'color: #eec355',\n error: 'color: #750b0b',\n debug: 'color: #9E4BCF',\n };\n\n return colors[logLevel];\n }\n}\n\nexport const deepLibLogger = new Logger();\n", "export function sendLocalMessage(id: string | null, message: string, timeoutInSeconds?: number) {\n const element = ElementCreate({\n tag: 'div',\n classList: ['ChatMessage', 'deeplib-message', 'ChatMessageNonDialogue'],\n attributes: {\n id: id ?? `DEEPLIB_LOCAL_MESSAGE_${Date.now()}`,\n 'data-time': ChatRoomCurrentTime(),\n 'data-sender': Player.MemberNumber?.toString(),\n },\n children: [\n {\n tag: 'span',\n classList: ['deeplib-text'],\n innerHTML: message.replaceAll('\\n\\t', ''),\n },\n {\n tag: 'br',\n },\n {\n tag: 'a',\n classList: ['deeplib-text'],\n attributes: {\n href: '#',\n },\n innerHTML: '<b>Close (Click)</b>',\n eventListeners: {\n click: () => {\n element.remove();\n },\n },\n }\n ]\n });\n\n ChatRoomAppendChat(element);\n if (!timeoutInSeconds) return;\n setTimeout(() => element.remove(), timeoutInSeconds * 1000);\n}\n\nexport function sendActionMessage(msg: string, target: undefined | number = undefined, dictionary: ChatMessageDictionaryEntry[] = []) {\n if (!msg) return;\n ServerSend('ChatRoomChat', {\n Content: 'DEEPLIB_CUSTOM_ACTION',\n Type: 'Action',\n Target: target ?? undefined,\n Dictionary: [\n { Tag: 'MISSING TEXT IN \"Interface.csv\": DEEPLIB_CUSTOM_ACTION', Text: msg },\n ...dictionary,\n ],\n });\n}\n", "import rawSdkImport from 'bondage-club-mod-sdk';\n\n// What the fuck is this?? \n// It seems that ESBuild breaks things, either when building this package or a final mod\nconst rawSdk = rawSdkImport as any;\nconst bcModSdkRef = (rawSdk.default ?? rawSdk) as ModSDKGlobalAPI;\n\n/**\n * Defines priority levels for hooking functions.\n * Hooks with higher priority are called first in hook chain.\n */\nexport const HookPriority = {\n Observe: 0,\n AddBehavior: 1,\n ModifyBehavior: 5,\n OverrideBehavior: 10,\n Top: 100\n};\n\n/** Type alias representing module of hook? */\nexport type ModuleCategory = number | string;\n\n/**\n * Interface representing data about a patched function,\n * including the function name and all hooks applied to it.\n */\ninterface IPatchedFunctionData {\n name: string;\n hooks: {\n hook: PatchHook;\n priority: number;\n module: ModuleCategory | null;\n removeCallback: () => void;\n }[];\n}\n\n/**\n * Manager class for mod SDK integration,\n * provides methods to register mods, hook functions, and manage patches.\n */\nexport class ModSdkManager {\n private static SDK: ModSDKModAPI;\n private static patchedFunctions: Map<string, IPatchedFunctionData> = new Map();\n\n public static ModInfo: ModSDKModInfo;\n\n /** Registers a mod with the SDK and stores mod information. */\n constructor(info: ModSDKModInfo, options?: ModSDKModOptions) {\n ModSdkManager.SDK = bcModSdkRef.registerMod(info, options);\n ModSdkManager.ModInfo = info;\n }\n\n /** Retrieves or initializes patch data for a given target function. */\n initPatchableFunction(target: string): IPatchedFunctionData {\n let result = ModSdkManager.patchedFunctions.get(target);\n if (!result) {\n result = {\n name: target,\n hooks: []\n };\n ModSdkManager.patchedFunctions.set(target, result);\n }\n return result;\n }\n\n /**\n * Hooks a function with a callback at a given priority. \n * \n * Prevents duplicate hooks.\n */\n hookFunction<TargetName extends string>(\n target: TargetName,\n priority: number,\n hook: PatchHook<GetDotedPathType<typeof globalThis, TargetName>>,\n module: ModuleCategory | null = null\n ): () => void {\n const data = this.initPatchableFunction(target);\n\n if (data.hooks.some((h) => h.hook === hook)) {\n return () => null;\n }\n\n const removeCallback = ModSdkManager.SDK?.hookFunction(target, priority, hook);\n\n data.hooks.push({\n hook,\n priority,\n module,\n removeCallback\n });\n data.hooks.sort((a, b) => b.priority - a.priority);\n\n return removeCallback;\n }\n\n /**\n * Applies patches to a target function.\n * \n * **This method is DANGEROUS** to use and has high potential to conflict with other mods.\n */\n patchFunction(target: string, patches: Record<string, string>): void {\n ModSdkManager.SDK?.patchFunction(target, patches);\n }\n\n /**\n * Removes all patches from a target function.\n */\n unpatchFunction(target: string): void {\n ModSdkManager.SDK?.removePatches(target);\n }\n\n /**\n * Removes all hooks associated with a specific module from a target function.\n */\n removeHookByModule(target: string, module: ModuleCategory): boolean {\n const data = this.initPatchableFunction(target);\n\n for (let i = data.hooks.length - 1; i >= 0; i--) {\n if (data.hooks[i].module === module) {\n data.hooks[i].removeCallback();\n data.hooks.splice(i, 1);\n }\n }\n\n return true;\n }\n\n /**\n * Removes all hooks associated with a specific module across all patched functions.\n */\n removeAllHooksByModule(module: ModuleCategory): boolean {\n for (const data of ModSdkManager.patchedFunctions.values()) {\n for (let i = data.hooks.length - 1; i >= 0; i--) {\n if (data.hooks[i].module === module) {\n data.hooks[i].removeCallback();\n data.hooks.splice(i, 1);\n }\n }\n }\n\n return true;\n }\n}\n", "export const Style = {\n /**\n * Injects a CSS style block directly into the document head using a <style> tag.\n * If a style element with the same `styleId` already exists, it won't inject again.\n */\n injectInline(styleId: string, styleSource: string) {\n const isStyleLoaded = document.getElementById(styleId);\n\n if (isStyleLoaded) return;\n\n const styleElement = document.createElement('style');\n styleElement.id = styleId;\n styleElement.appendChild(document.createTextNode(styleSource));\n document.head.appendChild(styleElement);\n },\n\n /**\n * Injects a CSS stylesheet link into the document head using a <link> tag.\n * If a link element with the same `styleId` already exists, it won't inject again.\n */\n injectEmbed(styleId: string, styleLink: string) {\n const isStyleLoaded = document.getElementById(styleId);\n\n if (isStyleLoaded) return;\n\n const styleElement = document.createElement('link');\n styleElement.id = styleId;\n styleElement.rel = 'stylesheet';\n styleElement.href = styleLink;\n document.head.appendChild(styleElement);\n },\n\n /**\n * Removes a style element from the document head by its ID.\n * Does nothing if the element is not found.\n */\n eject(id: string) {\n const style = document.getElementById(id);\n if (!style) return;\n\n style.remove();\n },\n\n /**\n * Reloads an inline style by removing the existing style element (if any)\n * and injecting the new styles inline again.\n */\n reload(styleId: string, styleSource: string) {\n Style.eject(styleId);\n Style.injectInline(styleId, styleSource);\n },\n\n /** Fetches the text content of a stylesheet or any resource at the given link. */\n async fetch(link: string) {\n return fetch(link).then((res) => res.text());\n }\n};\n", "/**\n * A dictionary type representing translations,\n * where keys are source tags and values are translated strings.\n */\ntype TranslationDict = {\n [key: string]: string;\n};\n\n/**\n * Options for initializing the Localization system.\n */\nexport interface TranslationOptions {\n /** The path to the folder where the translations are stored. */\n pathToTranslationsFolder?: string;\n /** The default language to use. */\n defaultLanguage?: string;\n /** If true, the localization will be fixed to the default language, ignoring user language settings. */\n fixedLanguage?: boolean;\n}\n\n/**\n * Localization class handles loading and retrieving translation strings\n * from library and mod-specific language files.\n */\nexport class Localization {\n private static LibTranslation: TranslationDict = {};\n private static ModTranslation: TranslationDict = {};\n private static PathToModTranslation: string | undefined;\n private static PathToLibTranslation: string = `${PUBLIC_URL}/dl_translations/`;\n private static DefaultLanguage: string = 'en';\n /** Flag to prevent re-initialization */\n private static initialized = false;\n\n /** Initialize the localization system by loading translation files. */\n static async init(initOptions?: TranslationOptions) {\n if (Localization.initialized) return;\n Localization.initialized = true;\n\n Localization.PathToModTranslation = (() => {\n if (!initOptions?.pathToTranslationsFolder) return undefined;\n\n return initOptions.pathToTranslationsFolder.endsWith('/') ?\n initOptions.pathToTranslationsFolder :\n `${initOptions.pathToTranslationsFolder}/`;\n })();\n\n Localization.DefaultLanguage = initOptions?.defaultLanguage || Localization.DefaultLanguage;\n\n const lang = initOptions?.fixedLanguage ? Localization.DefaultLanguage : TranslationLanguage.toLowerCase();\n\n const libTranslation = await Localization.fetchLanguageFile(Localization.PathToLibTranslation, lang);\n if (lang === Localization.DefaultLanguage) {\n Localization.LibTranslation = libTranslation;\n } else {\n const fallbackTranslation = await Localization.fetchLanguageFile(Localization.PathToLibTranslation, Localization.DefaultLanguage);\n Localization.LibTranslation = { ...fallbackTranslation, ...libTranslation };\n }\n\n if (!Localization.PathToModTranslation) return;\n const modTranslation = await Localization.fetchLanguageFile(Localization.PathToModTranslation, lang);\n if (lang === Localization.DefaultLanguage) {\n Localization.ModTranslation = modTranslation;\n } else {\n const fallbackTranslation = await Localization.fetchLanguageFile(Localization.PathToModTranslation, Localization.DefaultLanguage);\n Localization.ModTranslation = { ...fallbackTranslation, ...modTranslation };\n }\n }\n\n /** Get a translated string from mod translations by source tag. */\n static getTextMod(srcTag: string): string | undefined {\n return Localization.ModTranslation?.[srcTag] || undefined;\n }\n\n /** Get a translated string from library translations by source tag. */\n static getTextLib(srcTag: string): string | undefined {\n return Localization.LibTranslation?.[srcTag] || undefined;\n }\n\n /**\n * Fetch and parse a language file from the given base URL and language code.\n * Falls back to default language if the requested language file is unavailable.\n */\n private static async fetchLanguageFile(baseUrl: string, lang: string): Promise<TranslationDict> {\n const response = await fetch(`${baseUrl}${lang}.lang`);\n\n if (lang !== Localization.DefaultLanguage && !response.ok) {\n return this.fetchLanguageFile(baseUrl, Localization.DefaultLanguage);\n }\n\n if (!response.ok) {\n return {};\n }\n\n const langFileContent = await response.text();\n\n return this.parseLanguageFile(langFileContent);\n }\n\n /**\n * Parse the raw content of a language file into a TranslationDict.\n * Ignores empty lines and comments starting with '#'.\n */\n private static parseLanguageFile(content: string): TranslationDict {\n const translations: TranslationDict = {};\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const [key, ...rest] = trimmed.split('=');\n translations[key.trim()] = rest.join('=').trim();\n }\n\n return translations;\n }\n}\n\n/**\n * Retrieve a localized string for the given source tag.\n * First attempts to get the mod-specific translation,\n * then falls back to the library translation,\n * and if neither exist, returns the source tag itself.\n */\nexport const getText = (srcTag: string): string => {\n return Localization.getTextMod(srcTag) || Localization.getTextLib(srcTag) || srcTag;\n};\n", "import { ModSdkManager } from './sdk';\n\ntype DeepLibMessageDictionaryEntry<Type extends string, Data> = {\n type: Type;\n data: Data;\n};\n\ntype Listener<Payload> = (data: Payload, sender: Character) => void;\n\nexport interface UnverifiedMessage extends ServerChatRoomMessageBase {\n Target?: number;\n Content: ServerChatRoomMessageContentType;\n Type: ServerChatRoomMessageType;\n Dictionary?: {\n type: string;\n data?: any;\n }[];\n Timeout?: number;\n}\n\nexport interface EventChannelMessage<\n TEvents extends Record<string, unknown> = Record<string, unknown>,\n TEvent extends keyof TEvents & string = keyof TEvents & string\n> extends ServerChatRoomMessageBase {\n Target?: number;\n Content: string;\n Type: 'Hidden';\n Dictionary: [\n DeepLibMessageDictionaryEntry<TEvent, TEvents[TEvent]>\n ];\n Timeout?: number;\n Sender: number;\n}\n\nexport class EventChannel<TEvents extends Record<string, unknown>, TChannelName extends string> {\n private listeners: { [K in keyof TEvents]?: Listener<TEvents[K]>[]; } = {};\n\n constructor(private channelName: TChannelName) {\n ModSdkManager.prototype.hookFunction('ChatRoomMessageProcessHidden', 0, (args, next) => {\n if (!this.isChannelMessage(args[0] as UnverifiedMessage)) {\n return next(args);\n }\n\n const [message, sender] = args as unknown as [EventChannelMessage<TEvents>, Character];\n\n const { type, data } = message.Dictionary[0];\n const listeners = this.listeners[type as keyof TEvents];\n if (listeners) {\n (listeners as Listener<unknown>[])\n .forEach(listener => listener(data, sender));\n }\n\n return next(args);\n }, `EventChannel-${channelName}`);\n }\n\n public unload() {\n (Object.keys(this.listeners) as (keyof TEvents)[])\n .forEach(key => delete this.listeners[key]);\n ModSdkManager.prototype.removeHookByModule('ChatRoomMessageProcessHidden', `EventChannel-${this.channelName}`);\n }\n\n public sendEvent<K extends keyof TEvents & string>(type: K, data: TEvents[K], target: number | null = null) {\n const packet = {\n Type: 'Hidden',\n Content: this.channelName,\n Sender: Player.MemberNumber,\n ...(target ? { Target: target } : {}),\n Dictionary: [\n {\n type,\n data\n } as DeepLibMessageDictionaryEntry<K, TEvents[K]>\n ]\n };\n\n ServerSend('ChatRoomChat', packet);\n }\n\n public registerListener<K extends keyof TEvents & string>(event: K, listener: Listener<TEvents[K]>): () => void {\n const listeners = this.listeners[event] ?? [];\n listeners.push(listener);\n this.listeners[event] = listeners;\n\n return () => this.unregisterListener(event, listener);\n }\n\n public unregisterListener<K extends keyof TEvents & string>(event: K, listener: Listener<TEvents[K]>) {\n const listeners = this.listeners[event];\n if (listeners) {\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n }\n\n private isChannelMessage(message: UnverifiedMessage): message is EventChannelMessage<TEvents> {\n return (\n message &&\n message.Type === 'Hidden' &&\n message.Content === this.channelName &&\n message.Sender &&\n message.Sender !== Player.MemberNumber &&\n message.Dictionary &&\n !!message.Dictionary[0]?.data &&\n !!message.Dictionary[0]?.type\n ) || false;\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAGA,QAAI,YAAS,WAAU;AAAC;AAAa,YAAM,IAAE;AAAQ,eAAS,EAAEA,IAAE;AAAC,cAAM,iBAAeA,EAAC;AAAE,cAAMC,KAAE,IAAI,MAAMD,EAAC;AAAE,cAAM,QAAQ,MAAMC,EAAC,GAAEA;AAAA,MAAC;AAA1E;AAA2E,YAAM,IAAE,IAAI;AAAY,eAAS,EAAED,IAAE;AAAC,eAAM,CAAC,CAACA,MAAG,YAAU,OAAOA,MAAG,CAAC,MAAM,QAAQA,EAAC;AAAA,MAAC;AAArD;AAAsD,eAAS,EAAEA,IAAE;AAAC,cAAMC,KAAE,oBAAI;AAAI,eAAOD,GAAE,QAAQ,CAAAA,OAAG,CAACC,GAAE,IAAID,EAAC,KAAGC,GAAE,IAAID,EAAC,EAAE;AAAA,MAAC;AAA9D;AAA+D,YAAM,IAAE,oBAAI,OAAI,IAAE,oBAAI;AAAI,eAAS,EAAEA,IAAE;AAAC,UAAE,IAAIA,EAAC,MAAI,EAAE,IAAIA,EAAC,GAAE,QAAQ,KAAKA,EAAC;AAAA,MAAE;AAAzC;AAA0C,eAAS,EAAEA,IAAE;AAAC,cAAMC,KAAE,CAAC,GAAEC,KAAE,oBAAI,OAAIC,KAAE,oBAAI;AAAI,mBAAUC,MAAK,EAAE,OAAO,GAAE;AAAC,gBAAMC,KAAED,GAAE,SAAS,IAAIJ,GAAE,IAAI;AAAE,cAAGK,IAAE;AAAC,YAAAJ,GAAE,KAAK,GAAGI,GAAE,KAAK;AAAE,uBAAS,CAACJ,IAAEK,EAAC,KAAID,GAAE,QAAQ,QAAQ,EAAE,CAAAH,GAAE,IAAID,EAAC,KAAGC,GAAE,IAAID,EAAC,MAAIK,MAAG,EAAE,gBAAgBF,GAAE,IAAI,0BAA0BJ,GAAE,IAAI;AAAA;AAAA,EAAuGC,EAAC;AAAA;AAAA,EAAcC,GAAE,IAAID,EAAC,KAAG,EAAE;AAAA;AAAA,EAAcK,EAAC,EAAE,GAAEJ,GAAE,IAAID,IAAEK,EAAC,GAAEH,GAAE,IAAIC,GAAE,IAAI;AAAA,UAAC;AAAA,QAAC;AAAC,QAAAH,GAAE,MAAM,CAACD,IAAEC,OAAIA,GAAE,WAASD,GAAE,SAAS;AAAE,cAAMI,MAAE,SAASJ,IAAEC,IAAE;AAAC,cAAG,MAAIA,GAAE,KAAK,QAAOD;AAAE,cAAIE,KAAEF,GAAE,SAAS,EAAE,WAAW,QAAO,IAAI;AAAE,qBAAS,CAACG,IAAEC,EAAC,KAAIH,GAAE,QAAQ,EAAE,CAAAC,GAAE,SAASC,EAAC,KAAG,EAAE,oBAAoBH,GAAE,IAAI,WAAWG,EAAC,cAAc,GAAED,KAAEA,GAAE,WAAWC,IAAEC,EAAC;AAAE,kBAAO,GAAE,MAAM,IAAIF,EAAC,GAAG;AAAA,QAAC,GAAEF,GAAE,UAASE,EAAC;AAAE,YAAIG,KAAE,gCAASJ,IAAE;AAAC,cAAIC,IAAEG;AAAE,gBAAMC,KAAE,UAAQD,MAAGH,KAAE,EAAE,oBAAoB,kBAAgB,WAASG,KAAE,SAAOA,GAAE,KAAKH,IAAEF,GAAE,MAAKG,EAAC,GAAEI,KAAEH,GAAE,MAAM,MAAKH,EAAC;AAAE,iBAAO,QAAMK,MAAGA,GAAE,GAAEC;AAAA,QAAC,GAA3J;AAA6J,iBAAQL,KAAED,GAAE,SAAO,GAAEC,MAAG,GAAEA,MAAI;AAAC,gBAAMC,KAAEF,GAAEC,EAAC,GAAEE,KAAEC;AAAE,UAAAA,KAAE,gCAASJ,IAAE;AAAC,gBAAIC,IAAEG;AAAE,kBAAMC,KAAE,UAAQD,MAAGH,KAAE,EAAE,oBAAoB,cAAY,WAASG,KAAE,SAAOA,GAAE,KAAKH,IAAEF,GAAE,MAAKG,GAAE,GAAG,GAAEI,KAAEJ,GAAE,KAAK,MAAM,MAAK,CAACF,IAAE,CAAAD,OAAG;AAAC,kBAAG,MAAI,UAAU,UAAQ,CAAC,MAAM,QAAQC,EAAC,EAAE,OAAM,IAAI,MAAM,OAAOE,GAAE,GAAG,6DAA6D,OAAOH,EAAC,EAAE;AAAE,qBAAOI,GAAE,KAAK,MAAKJ,EAAC;AAAA,YAAC,CAAC,CAAC;AAAE,mBAAO,QAAMM,MAAGA,GAAE,GAAEC;AAAA,UAAC,GAA7U;AAAA,QAA8U;AAAC,eAAM,EAAC,OAAMN,IAAE,SAAQC,IAAE,gBAAeC,IAAE,OAAME,IAAE,OAAMD,GAAC;AAAA,MAAC;AAAxxC;AAAyxC,eAAS,EAAEJ,IAAEC,KAAE,OAAG;AAAC,YAAIG,KAAE,EAAE,IAAIJ,EAAC;AAAE,YAAGI,GAAE,CAAAH,OAAIG,GAAE,cAAY,EAAEA,EAAC;AAAA,aAAO;AAAC,cAAIH,KAAE;AAAO,gBAAMK,KAAEN,GAAE,MAAM,GAAG;AAAE,mBAAQE,KAAE,GAAEA,KAAEI,GAAE,SAAO,GAAEJ,KAAI,KAAGD,KAAEA,GAAEK,GAAEJ,EAAC,CAAC,GAAE,CAAC,EAAED,EAAC,EAAE,OAAM,IAAI,MAAM,oBAAoBD,EAAC,6BAA6BM,GAAE,MAAM,GAAEJ,KAAE,CAAC,EAAE,KAAK,GAAG,CAAC,gBAAgB;AAAE,gBAAMK,KAAEN,GAAEK,GAAEA,GAAE,SAAO,CAAC,CAAC;AAAE,cAAG,cAAY,OAAOC,GAAE,OAAM,IAAI,MAAM,oBAAoBP,EAAC,0BAA0B;AAAE,gBAAMQ,MAAE,SAASR,IAAE;AAAC,gBAAIC,KAAE;AAAG,uBAAUE,MAAK,EAAE,OAAOH,EAAC,GAAE;AAAC,kBAAIA,KAAE,OAAKC,KAAEE;AAAG,uBAAQF,KAAE,GAAEA,KAAE,GAAEA,KAAI,CAAAD,KAAE,IAAEA,KAAE,aAAWA,OAAI,IAAEA,OAAI;AAAE,cAAAC,KAAEA,OAAI,IAAED;AAAA,YAAC;AAAC,qBAAQ,KAAGC,QAAK,GAAG,SAAS,EAAE,EAAE,SAAS,GAAE,GAAG,EAAE,YAAY;AAAA,UAAC,GAAEM,GAAE,SAAS,EAAE,WAAW,QAAO,IAAI,CAAC,GAAEE,KAAE,EAAC,MAAKT,IAAE,UAASO,IAAE,cAAaC,GAAC;AAAE,UAAAJ,KAAE,OAAO,OAAO,OAAO,OAAO,CAAC,GAAEK,EAAC,GAAE,EAAC,aAAY,EAAEA,EAAC,GAAE,QAAO,6BAAI;AAAA,UAAC,GAAL,WAAO,SAAQR,IAAE,iBAAgBK,GAAEA,GAAE,SAAO,CAAC,EAAC,CAAC,GAAEF,GAAE,SAAO,0BAASJ,IAAE;AAAC,mBAAO,YAAYC,IAAE;AAAC,qBAAOD,GAAE,YAAY,MAAM,MAAM,MAAK,CAACC,EAAC,CAAC;AAAA,YAAC;AAAA,UAAC,GAAEG,EAAC,GAAE,EAAE,IAAIJ,IAAEI,EAAC,GAAEH,GAAEG,GAAE,eAAe,IAAEA,GAAE;AAAA,QAAM;AAAC,eAAOA;AAAA,MAAC;AAAn3B;AAAo3B,eAAS,IAAG;AAAC,mBAAUJ,MAAK,EAAE,OAAO,EAAE,CAAAA,GAAE,cAAY,EAAEA,EAAC;AAAA,MAAC;AAAhD;AAAiD,eAAS,IAAG;AAAC,cAAMA,KAAE,oBAAI;AAAI,mBAAS,CAACC,IAAEC,EAAC,KAAI,EAAE,CAAAF,GAAE,IAAIC,IAAE,EAAC,MAAKA,IAAE,UAASC,GAAE,UAAS,cAAaA,GAAE,cAAa,eAAcA,GAAE,QAAO,mBAAkBA,GAAE,QAAQA,GAAE,eAAe,GAAE,cAAa,EAAEA,GAAE,YAAY,MAAM,KAAK,CAAAF,OAAGA,GAAE,IAAI,CAAC,GAAE,eAAc,MAAM,KAAKE,GAAE,YAAY,cAAc,EAAC,CAAC;AAAE,eAAOF;AAAA,MAAC;AAAlS;AAAmS,YAAM,IAAE,oBAAI;AAAI,eAAS,EAAEA,IAAE;AAAC,UAAE,IAAIA,GAAE,IAAI,MAAIA,MAAG,EAAE,yBAAyBA,GAAE,IAAI,mBAAmB,GAAE,EAAE,OAAOA,GAAE,IAAI,GAAEA,GAAE,SAAO,OAAG,EAAE;AAAA,MAAC;AAA9G;AAA+G,eAAS,EAAEA,IAAEE,IAAE;AAAC,QAAAF,MAAG,YAAU,OAAOA,MAAG,EAAE,uDAAqD,OAAOA,EAAC,GAAE,YAAU,OAAOA,GAAE,QAAMA,GAAE,QAAM,EAAE,uEAAqE,OAAOA,GAAE,IAAI;AAAE,YAAII,KAAE,IAAIJ,GAAE,IAAI;AAAI,oBAAU,OAAOA,GAAE,YAAUA,GAAE,YAAU,EAAE,0BAA0BI,EAAC,mDAAmD,OAAOJ,GAAE,QAAQ,EAAE,GAAEI,KAAE,IAAIJ,GAAE,QAAQ,KAAKA,GAAE,IAAI,MAAK,YAAU,OAAOA,GAAE,WAAS,EAAE,0BAA0BI,EAAC,wCAAwC,OAAOJ,GAAE,OAAO,EAAE,GAAEA,GAAE,eAAaA,GAAE,aAAW,SAAQ,WAASA,GAAE,cAAY,YAAU,OAAOA,GAAE,cAAY,EAAE,0BAA0BI,EAAC,wDAAwD,OAAOJ,GAAE,OAAO,EAAE,GAAE,QAAME,OAAIA,KAAE,CAAC,IAAGA,MAAG,YAAU,OAAOA,MAAG,EAAE,0BAA0BE,EAAC,qDAAqD,OAAOF,EAAC,EAAE;AAAE,cAAMG,KAAE,SAAKH,GAAE,cAAaI,KAAE,EAAE,IAAIN,GAAE,IAAI;AAAE,QAAAM,OAAIA,GAAE,gBAAcD,MAAG,EAAE,wBAAwBD,EAAC;AAAA,mCAA8F,GAAE,EAAEE,EAAC;AAAG,cAAMC,KAAE,wBAAAP,OAAG;AAAC,cAAIC,KAAES,GAAE,SAAS,IAAIV,GAAE,IAAI;AAAE,iBAAOC,OAAIA,KAAE,EAAC,OAAM,CAAC,GAAE,SAAQ,oBAAI,MAAG,GAAES,GAAE,SAAS,IAAIV,GAAE,MAAKC,EAAC,IAAGA;AAAA,QAAC,GAApG,MAAsGU,KAAE,wBAACX,IAAEE,OAAI,IAAIC,OAAI;AAAC,cAAIE,IAAEC;AAAE,gBAAMC,KAAE,UAAQD,MAAGD,KAAE,EAAE,oBAAoB,qBAAmB,WAASC,KAAE,SAAOA,GAAE,KAAKD,IAAEL,IAAEU,GAAE,IAAI;AAAE,UAAAA,GAAE,UAAQ,EAAE,OAAON,EAAC,sDAAsD;AAAE,gBAAMO,KAAET,GAAE,GAAGC,EAAC;AAAE,iBAAO,QAAMI,MAAGA,GAAE,GAAEI;AAAA,QAAC,GAA5O,MAA8OC,KAAE,EAAC,QAAOD,GAAE,WAAU,MAAI,EAAED,EAAC,EAAE,GAAE,cAAaC,GAAE,iBAAgB,CAACX,IAAEE,IAAEC,OAAI;AAAC,sBAAU,OAAOH,MAAGA,MAAG,EAAE,OAAOI,EAAC,mEAAmE,OAAOJ,EAAC,EAAE;AAAE,gBAAMK,KAAE,EAAEL,EAAC,GAAEM,KAAEC,GAAEF,EAAC;AAAE,sBAAU,OAAOH,MAAG,EAAE,OAAOE,EAAC,6BAA6BJ,EAAC,oCAAoC,OAAOE,EAAC,EAAE,GAAE,cAAY,OAAOC,MAAG,EAAE,OAAOC,EAAC,6BAA6BJ,EAAC,kCAAkC,OAAOG,EAAC,EAAE;AAAE,gBAAMQ,KAAE,EAAC,KAAID,GAAE,MAAK,UAASR,IAAE,MAAKC,GAAC;AAAE,iBAAOG,GAAE,MAAM,KAAKK,EAAC,GAAE,EAAE,GAAE,MAAI;AAAC,kBAAMX,KAAEM,GAAE,MAAM,QAAQK,EAAC;AAAE,YAAAX,MAAG,MAAIM,GAAE,MAAM,OAAON,IAAE,CAAC,GAAE,EAAE;AAAA,UAAE;AAAA,QAAC,EAAE,GAAE,eAAcW,GAAE,kBAAiB,CAACX,IAAEE,OAAI;AAAC,sBAAU,OAAOF,MAAGA,MAAG,EAAE,OAAOI,EAAC,mEAAmE,OAAOJ,EAAC,EAAE;AAAE,gBAAMK,KAAE,EAAEL,EAAC,GAAEM,KAAEC,GAAEF,EAAC;AAAE,YAAEH,EAAC,KAAG,EAAE,OAAOE,EAAC,8BAA8BJ,EAAC,mCAAmC,OAAOE,EAAC,EAAE;AAAE,qBAAS,CAACC,IAAEE,EAAC,KAAI,OAAO,QAAQH,EAAC,EAAE,aAAU,OAAOG,KAAEC,GAAE,QAAQ,IAAIH,IAAEE,EAAC,IAAE,SAAOA,KAAEC,GAAE,QAAQ,OAAOH,EAAC,IAAE,EAAE,OAAOC,EAAC,8BAA8BJ,EAAC,+BAA+BG,EAAC,GAAG;AAAE,YAAE;AAAA,QAAC,EAAE,GAAE,eAAcQ,GAAE,kBAAiB,CAAAX,OAAG;AAAC,sBAAU,OAAOA,MAAGA,MAAG,EAAE,OAAOI,EAAC,mEAAmE,OAAOJ,EAAC,EAAE;AAAE,gBAAME,KAAE,EAAEF,EAAC;AAAE,UAAAO,GAAEL,EAAC,EAAE,QAAQ,MAAM,GAAE,EAAE;AAAA,QAAC,EAAE,GAAE,cAAaS,GAAE,iBAAgB,CAACX,IAAEE,IAAEC,OAAI;AAAC,sBAAU,OAAOH,MAAGA,MAAG,EAAE,OAAOI,EAAC,kEAAkE,OAAOJ,EAAC,EAAE;AAAE,gBAAMK,KAAE,EAAEL,EAAC;AAAE,iBAAO,MAAM,QAAQE,EAAC,KAAG,EAAE,OAAOE,EAAC,wDAAwD,OAAOF,EAAC,EAAE,GAAEG,GAAE,SAAS,MAAM,QAAMF,KAAEA,KAAE,YAAWD,EAAC;AAAA,QAAC,EAAE,GAAE,iBAAgBS,GAAE,oBAAmB,CAAAX,OAAG;AAAC,sBAAU,OAAOA,MAAGA,MAAG,EAAE,OAAOI,EAAC,2DAA2D,OAAOJ,EAAC,EAAE;AAAE,iBAAO,EAAEA,EAAC,EAAE;AAAA,QAAY,EAAE,EAAC,GAAEU,KAAE,EAAC,MAAKV,GAAE,MAAK,UAASA,GAAE,UAAS,SAAQA,GAAE,SAAQ,YAAWA,GAAE,YAAW,cAAaK,IAAE,KAAIO,IAAE,QAAO,MAAG,UAAS,oBAAI,MAAG;AAAE,eAAO,EAAE,IAAIZ,GAAE,MAAKU,EAAC,GAAE,OAAO,OAAOE,EAAC;AAAA,MAAC;AAAlrG;AAAmrG,eAAS,IAAG;AAAC,cAAMZ,KAAE,CAAC;AAAE,mBAAUC,MAAK,EAAE,OAAO,EAAE,CAAAD,GAAE,KAAK,EAAC,MAAKC,GAAE,MAAK,UAASA,GAAE,UAAS,SAAQA,GAAE,SAAQ,YAAWA,GAAE,WAAU,CAAC;AAAE,eAAOD;AAAA,MAAC;AAArI;AAAsI,UAAI;AAAE,YAAM,IAAE,WAAS,OAAO,WAAS,OAAO,YAAS,WAAU;AAAC,cAAMC,KAAE,EAAC,SAAQ,GAAE,YAAW,GAAE,aAAY,GAAE,aAAY,GAAE,iBAAgB,GAAE,oBAAmB,OAAO,KAAK,EAAC,kBAAiB,MAAK,WAAU,MAAK,eAAc,KAAI,CAAC,EAAC;AAAE,eAAO,IAAEA,IAAE,OAAO,OAAOA,EAAC;AAAA,MAAC,GAAE,KAAG,EAAE,OAAO,QAAQ,KAAG,EAAE,6CAA6C,GAAE,MAAI,OAAO,SAAS,cAAY,EAAE,yEAAyE,OAAO,SAAS,OAAO,IAAI,GAAE,OAAO,SAAS,YAAU,KAAG,MAAM,2EAA2E,OAAO,SAAS,OAAO;AAAA,kHAAuH,GAAE,OAAO;AAAU,aAAM,eAAa,OAAO,YAAU,OAAO,eAAe,SAAQ,cAAa,EAAC,OAAM,KAAE,CAAC,GAAE,QAAQ,UAAQ,IAAG;AAAA,IAAC,GAAE;AAAA;AAAA;;;ACmB9pO,IAAe,aAAf,MAA0B;AAAA,EAtBjC,OAsBiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,IAAI,iBAAmC;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,kBAAiC;AACnC,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,WAA8B;AAChC,UAAM,UAAU,cAAc,QAAQ;AACtC,QAAI,CAAC,KAAK,gBAAiB,QAAO,CAAC;AACnC,QAAI,CAAC,WAAW,eAAe;AAC7B,aAAO,OAAO,IAAmB,CAAC;AAClC,WAAK,wBAAwB;AAAA,IAC/B,WAAW,CAAC,WAAW,cAAc,KAAK,eAAe,EAAG,MAAK,wBAAwB;AACzF,WAAO,WAAW,cAAc,KAAK,eAAe;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS,OAAO;AAClB,UAAM,UAAU,cAAc,QAAQ;AACtC,UAAM,UAAU,IAAI,WAA0B,OAAO;AACrD,QAAI,CAAC,KAAK,gBAAiB;AAC3B,QAAI,CAAC,QAAQ,eAAe;AAC1B,aAAO,OAAO,IAAmB,CAAC;AAClC,WAAK,wBAAwB;AAAA,IAC/B,WAAW,CAAC,QAAQ,cAAc,KAAK,eAAe,EAAG,MAAK,wBAAwB;AACtF,YAAQ,cAAc,KAAK,eAAe,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO;AACL,SAAK,wBAAwB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,0BAAgC;AAC9B,UAAM,UAAU,KAAK;AACrB,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,WAAW,CAAC,SAAU;AAE3B,WAAO,cAAc,QAAQ,IAAI,EAAE,OAAO,IAAI,OAAO,OAAO,UAAU,OAAO,cAAc,QAAQ,IAAI,EAAE,OAAO,KAAK,CAAC,CAAC;AAAA,EACzH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,kBAA4C;AAC9C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,MAAM;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,SAAS;AAAA,EAAE;AACb;;;AC3DA,eAAsB,aAAa,WAA0C;AAC3E,MAAI,CAAC,IAAI,UAAU;AACjB,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,QAAM,aAAa,OAAO,cAAc,WAAW,YAAY,WAAW,QAAQ;AAClF,QAAM,WAAW,GAAG,cAAc,EAAE,IAAI,UAAU;AAElD,QAAM,gBAAgB,GAAG,CAAC,cAAc,GAAG,QAAQ,EAAE,CAA+B;AACtF;AARsB;AA0Bf,IAAe,gBAAf,MAAe,eAAc;AAAA,EAvFpC,OAuFoC;AAAA;AAAA;AAAA;AAAA,EAElC,OAAO,kBAAmD,CAAC;AAAA;AAAA,EAE3D,OAAO,cAAsB;AAAA;AAAA,EAEpB;AAAA;AAAA,EAEA;AAAA;AAAA,EAET,OAAgB,KAAa,uBAAuB;AAAA;AAAA,EAEpD,OAA0B,mBAAqC;AAAA,IAC7D,eAAe;AAAA,IACf,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EAEA,YAAY,QAAqB;AAC/B,QAAI,OAAQ,MAAK,SAAS;AAE1B,UAAM,OAAO,KAAK;AAClB,SAAK,UAAU;AAAA,MACb,GAAG,eAAc;AAAA,MACjB,GAAG,KAAK;AAAA,IACV;AAEA,UAAM,aAAa,KAAK,QAAQ;AAChC,UAAM,WAAW,GAAG,eAAc,EAAE,IAAI,UAAU;AAElD,mBAAe,GAAG,QAAQ,QAAQ,KAAK,KAAK,KAAK,IAAI,CAAC;AACtD,mBAAe,GAAG,QAAQ,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;AACpD,mBAAe,GAAG,QAAQ,SAAS,KAAK,MAAM,KAAK,IAAI,CAAC;AACxD,mBAAe,GAAG,QAAQ,QAAQ,KAAK,KAAK,KAAK,IAAI,CAAC;AACtD,mBAAe,GAAG,QAAQ,UAAU,KAAK,OAAO,KAAK,IAAI,CAAC;AAC1D,mBAAe,GAAG,QAAQ,UAAU,KAAK,OAAO,KAAK,IAAI,CAAC;AAC1D,mBAAe,GAAG,QAAQ,cAAc,KAAK,QAAQ,UAAU;AAE/D,mBAAe,yBAAyB,cAAc,QAAQ,CAAW,IAAI,CAAC;AAAA,EAChF;AAAA;AAAA,EAGA,MAAM,aAAa,QAAuC;AACxD,WAAO,MAAM,aAAa,MAAM;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,WAA8B;AAChC,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA,EAGA,IAAI,SAAS,OAAO;AAClB,SAAK,OAAO,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,gBAAoC;AACtC,WAAO,CAAC,CAAC,CAAC;AAAA,EACZ;AAAA;AAAA,EAGA,IAAI,cAAgC;AAClC,WAAO,KAAK,cAAc,KAAK,IAAI,eAAc,cAAc,GAAG,KAAK,cAAc,SAAS,CAAC,CAAC;AAAA,EAClG;AAAA,EAEA,eAAuB;AACrB,WAAO,6BAA6B,QAAQ,qBAAqB,GAAG;AAAA,MAClE,eAAe,GAAG,eAAc,WAAW;AAAA,MAC3C,cAAc,GAAG,KAAK,cAAc,MAAM;AAAA,IAC5C,CAAC,EAAE,KAAK,EAAE;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,MAAc,UAAmC;AAC1D,UAAM,aAAa,KAAK,cAAc;AAEtC,QAAI,OAAO,WAAY,QAAO;AAC9B,QAAI,OAAO,EAAG,QAAO;AACrB,mBAAc,cAAc;AAE5B,SAAK,6BAA6B;AAElC,aAAS,KAAK,aAAa,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,+BAA+B;AAC7B,SAAK,cAAc,QAAQ,CAAC,MAAM,OAAO;AACvC,UAAI,MAAM,eAAc,cAAc,GAAG;AACvC,aAAK,QAAQ,CAAC,YAAY;AACxB,kBAAQ,KAAK,GAAG,QAAQ,EAAE,YAAY;AAAA,QACxC,CAAC;AAAA,MACH,OAAO;AACL,aAAK,QAAQ,CAAC,YAAY;AACxB,kBAAQ,OAAO,GAAG,QAAQ,EAAE,YAAY;AAAA,QAC1C,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO;AACL,eAAW,UAAU,QAAQ,GAAG;AAC9B,UAAI,CAAC,OAAO,eAAgB;AAC5B,UAAI,CAAC,OAAO,YAAY,CAAC,OAAO,KAAK,OAAO,QAAQ,EAAE,OAAQ,QAAO,wBAAwB;AAAA,IAC/F;AAEA,mBAAc,cAAc;AAE5B,WAAO,aAAa;AACpB,UAAM,kBAAkB,OAAO,eAAe;AAC9C,WAAO,kBAAkB,eAAe;AAExC,UAAM,OAAO,YAAY,OAAO,oBAAoB,CAAC,CAAC;AACtD,WAAO,kBAAkB,IAAI;AAE7B,QAAI,KAAK,cAAc,SAAS,GAAG;AACjC,YAAM,WAAW,WAAW,eAAe;AAAA,QACzC,IAAI;AAAA,QACJ,MAAM,wBAAC,EAAE,SAAS,MAAM,KAAK,WAAW,eAAc,cAAc,GAAG,QAAQ,GAAzE;AAAA,QACN,oBAAoB,QAAQ,kCAAkC;AAAA,QAC9D,MAAM,wBAAC,EAAE,SAAS,MAAM,KAAK,WAAW,eAAc,cAAc,GAAG,QAAQ,GAAzE;AAAA,QACN,oBAAoB,QAAQ,kCAAkC;AAAA,QAC9D,cAAc,KAAK,aAAa;AAAA,MAClC,CAAC;AAED,kBAAY,YAAY,MAAM,QAAQ;AAAA,IACxC;AAEA,QAAI,KAAK,QAAQ,MAAM;AACrB,YAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,UAAI,SAAS,6BAAM;AAAA,MAAE,GAAR;AACb,UAAI,OAAO,YAAY,YAAY,mBAAmB,KAAK;AACzD,iBAAS,6BAAM,OAAO,KAAK,SAAS,QAAQ,GAAnC;AAAA,MACX,WAAW,OAAO,YAAY,YAAY;AACxC,iBAAS;AAAA,MACX,WAAW,mBAAmB,gBAAe;AAC3C,iBAAS,mCAAY,MAAM,KAAK,aAAa,OAAO,GAA3C;AAAA,MACX;AAEA,WAAK,QAAQ,KAAK,YAAY,QAAQ,kCAAkC;AACxE,WAAK,QAAQ,KAAK,SAAS,GAAG,UAAU;AAExC,YAAM,aAAa,WAAW,aAAa;AAAA,QACzC,IAAI;AAAA,QACJ,MAAM,CAAC,IAAI,EAAE;AAAA,QACb,SAAS;AAAA,QACT,SAAS;AAAA,UACP,OAAO,KAAK,QAAQ,KAAK;AAAA,UACzB,SAAS,KAAK,QAAQ,KAAK;AAAA,QAC7B;AAAA,MACF,CAAC;AAED,kBAAY,aAAa,MAAM,UAAU;AAAA,IAC3C;AAEA,UAAM,iBAAiB,WAAW,YAAY;AAAA,MAC5C,IAAI;AAAA,MACJ,OAAO,QAAQ,GAAG,KAAK,QAAQ,IAAI,QAAQ,EAAE,QAAQ,eAAe,cAAc,QAAQ,OAAO;AAAA,IACnG,CAAC;AACD,WAAO,kBAAkB,cAAc;AAEvC,QAAI,KAAK,QAAQ,SAAS,YAAY;AACpC,YAAM,aAAa,WAAW,aAAa;AAAA,QACzC,IAAI;AAAA,QACJ,MAAM,CAAC,IAAI,EAAE;AAAA,QACb,SAAS,6BAAM;AACb,eAAK,KAAK;AAAA,QACZ,GAFS;AAAA,QAGT,SAAS;AAAA,UACP,OAAO,GAAG,UAAU;AAAA,UACpB,SAAS,QAAQ,kCAAkC;AAAA,QACrD;AAAA,MACF,CAAC;AACD,kBAAY,aAAa,MAAM,UAAU;AAAA,IAC3C;AAEA,UAAM,UAAU,WAAW,cAAc;AACzC,WAAO,kBAAkB,OAAO;AAEhC,SAAK,cAAc;AAAA,MAAQ,CAAC,MAC1B,EAAE,QAAQ,CAAC,SAAS;AAClB,YAAI;AACJ,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AACH,sBAAU,WAAW,YAAY,IAAI;AACrC;AAAA,UACF,KAAK;AACH,sBAAU,WAAW,eAAe,IAAI;AACxC;AAAA,UACF,KAAK;AACH,sBAAU,WAAW,aAAa,IAAI;AACtC;AAAA,UACF,KAAK;AACH,sBAAU,WAAW,YAAY,IAAI;AACrC;AAAA,UACF,KAAK;AACH,sBAAU,WAAW,aAAa,IAAI;AACtC;AAAA,QACJ;AACA,eAAO,oBAAoB,OAAO;AAAA,MACpC,CAAC;AAAA,IACH;AAEA,SAAK,6BAA6B;AAElC,0CAAsC,OAAO,gBAAgB;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM;AACJ,QAAI,KAAK,QAAQ,cAAe,eAAc,QAAQ,IAAI,IAAI,KAAK,KAAK;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO;AACL,0CAAsC;AACtC,wBAAoB,MAAM;AAE1B,UAAM,eAAe,OAAO,KAAK,QAAQ,iBAAiB,aAAa,KAAK,QAAQ,aAAa,IAAI,KAAK,QAAQ;AAElH,QAAI,wBAAwB,kBAAiB,CAAC,cAAc;AAC1D,mBAAa,gBAAgB,UAAU,EAAE,KAAK,MAAM;AAClD,mBAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH,WAAW,MAAM,QAAQ,YAAY,GAAG;AACtC,sBAAgB,GAAG,YAAY,EAAE,KAAK,MAAM;AAC1C,mBAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAAmB,OAAO;AAC/B,UAAM,SAAS,KAAK,QAAQ,gBAAgB,IAAI;AAChD,UAAM,YAAY,OAAO,aAAa;AACtC,UAAM,cAAc,OAAO,eAAe;AAE1C,uBAAmB,aAAa,IAAI,GAAG,CAAC;AACxC,mBAAe,aAAa,IAAI,KAAM,GAAI;AAC1C,uBAAmB,aAAa,IAAI,MAAM;AAE1C,QAAI,KAAK,QAAQ,SAAS,YAAY;AACpC,yBAAmB,eAAe,IAAI,MAAM,QAAQ,GAAG;AACvD,qBAAe,eAAe,IAAI,MAAM,QAAQ,GAAG;AAAA,IACrD,OAAO;AACL,yBAAmB,eAAe,IAAI,MAAM,QAAQ,GAAG;AACvD,qBAAe,eAAe,IAAI,MAAO,QAAQ,GAAG;AAAA,IACtD;AAEA,uBAAmB,2BAA2B,MAAM,QAAQ,EAAE;AAC9D,mBAAe,2BAA2B,KAAK,EAAE;AAEjD,uBAAmB,oBAAoB,MAAM,IAAI,WAAW;AAC5D,mBAAe,oBAAoB,MAAM,EAAE;AAE3C,uBAAmB,WAAW,WAAW,KAAK,IAAI,KAAK,GAAG;AAC1D,mBAAe,WAAW,WAAW,KAAK,IAAI,MAAM,EAAE;AAEtD,mBAAc,gBAAgB,QAAQ,CAAC,SAAS;AAC9C,YAAM,UAAU,KAAK,CAAC;AACtB,YAAM,UAAU,KAAK,CAAC;AAEtB,cAAQ,gBAAgB,QAAQ,MAAM,QAAQ,IAAI,QAAQ,QAAQ;AAClE,cAAQ,YAAY,QAAQ,MAAM,QAAQ,IAAI,QAAQ,IAAI;AAAA,IAC5D,CAAC;AAED,QAAI,aAAa;AACf,UAAI,QAAQ,YAAY,WAAW,GAAG,UAAU;AAC9C,oBAAY,UAAU,IAAI,sBAAsB;AAAA,MAClD,OAAO;AACL,oBAAY,UAAU,OAAO,sBAAsB;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS;AACP,mBAAc,kBAAkB,CAAC;AAEjC,WAAO,gBAAgB;AAAA,EACzB;AACF;;;ACjaA,IAAO,iBAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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",
|
|
4
|
+
"sourcesContent": ["// Bondage Club Mod Development Kit (1.2.0)\n// For more info see: https://github.com/Jomshir98/bondage-club-mod-sdk\n/** @type {ModSDKGlobalAPI} */\nvar bcModSdk=function(){\"use strict\";const o=\"1.2.0\";function e(o){alert(\"Mod ERROR:\\n\"+o);const e=new Error(o);throw console.error(e),e}const t=new TextEncoder;function n(o){return!!o&&\"object\"==typeof o&&!Array.isArray(o)}function r(o){const e=new Set;return o.filter((o=>!e.has(o)&&e.add(o)))}const i=new Map,a=new Set;function c(o){a.has(o)||(a.add(o),console.warn(o))}function s(o){const e=[],t=new Map,n=new Set;for(const r of f.values()){const i=r.patching.get(o.name);if(i){e.push(...i.hooks);for(const[e,a]of i.patches.entries())t.has(e)&&t.get(e)!==a&&c(`ModSDK: Mod '${r.name}' is patching function ${o.name} with same pattern that is already applied by different mod, but with different pattern:\\nPattern:\\n${e}\\nPatch1:\\n${t.get(e)||\"\"}\\nPatch2:\\n${a}`),t.set(e,a),n.add(r.name)}}e.sort(((o,e)=>e.priority-o.priority));const r=function(o,e){if(0===e.size)return o;let t=o.toString().replaceAll(\"\\r\\n\",\"\\n\");for(const[n,r]of e.entries())t.includes(n)||c(`ModSDK: Patching ${o.name}: Patch ${n} not applied`),t=t.replaceAll(n,r);return(0,eval)(`(${t})`)}(o.original,t);let i=function(e){var t,i;const a=null===(i=(t=m.errorReporterHooks).hookChainExit)||void 0===i?void 0:i.call(t,o.name,n),c=r.apply(this,e);return null==a||a(),c};for(let t=e.length-1;t>=0;t--){const n=e[t],r=i;i=function(e){var t,i;const a=null===(i=(t=m.errorReporterHooks).hookEnter)||void 0===i?void 0:i.call(t,o.name,n.mod),c=n.hook.apply(this,[e,o=>{if(1!==arguments.length||!Array.isArray(e))throw new Error(`Mod ${n.mod} failed to call next hook: Expected args to be array, got ${typeof o}`);return r.call(this,o)}]);return null==a||a(),c}}return{hooks:e,patches:t,patchesSources:n,enter:i,final:r}}function l(o,e=!1){let r=i.get(o);if(r)e&&(r.precomputed=s(r));else{let e=window;const a=o.split(\".\");for(let t=0;t<a.length-1;t++)if(e=e[a[t]],!n(e))throw new Error(`ModSDK: Function ${o} to be patched not found; ${a.slice(0,t+1).join(\".\")} is not object`);const c=e[a[a.length-1]];if(\"function\"!=typeof c)throw new Error(`ModSDK: Function ${o} to be patched not found`);const l=function(o){let e=-1;for(const n of t.encode(o)){let o=255&(e^n);for(let e=0;e<8;e++)o=1&o?-306674912^o>>>1:o>>>1;e=e>>>8^o}return((-1^e)>>>0).toString(16).padStart(8,\"0\").toUpperCase()}(c.toString().replaceAll(\"\\r\\n\",\"\\n\")),d={name:o,original:c,originalHash:l};r=Object.assign(Object.assign({},d),{precomputed:s(d),router:()=>{},context:e,contextProperty:a[a.length-1]}),r.router=function(o){return function(...e){return o.precomputed.enter.apply(this,[e])}}(r),i.set(o,r),e[r.contextProperty]=r.router}return r}function d(){for(const o of i.values())o.precomputed=s(o)}function p(){const o=new Map;for(const[e,t]of i)o.set(e,{name:e,original:t.original,originalHash:t.originalHash,sdkEntrypoint:t.router,currentEntrypoint:t.context[t.contextProperty],hookedByMods:r(t.precomputed.hooks.map((o=>o.mod))),patchedByMods:Array.from(t.precomputed.patchesSources)});return o}const f=new Map;function u(o){f.get(o.name)!==o&&e(`Failed to unload mod '${o.name}': Not registered`),f.delete(o.name),o.loaded=!1,d()}function g(o,t){o&&\"object\"==typeof o||e(\"Failed to register mod: Expected info object, got \"+typeof o),\"string\"==typeof o.name&&o.name||e(\"Failed to register mod: Expected name to be non-empty string, got \"+typeof o.name);let r=`'${o.name}'`;\"string\"==typeof o.fullName&&o.fullName||e(`Failed to register mod ${r}: Expected fullName to be non-empty string, got ${typeof o.fullName}`),r=`'${o.fullName} (${o.name})'`,\"string\"!=typeof o.version&&e(`Failed to register mod ${r}: Expected version to be string, got ${typeof o.version}`),o.repository||(o.repository=void 0),void 0!==o.repository&&\"string\"!=typeof o.repository&&e(`Failed to register mod ${r}: Expected repository to be undefined or string, got ${typeof o.version}`),null==t&&(t={}),t&&\"object\"==typeof t||e(`Failed to register mod ${r}: Expected options to be undefined or object, got ${typeof t}`);const i=!0===t.allowReplace,a=f.get(o.name);a&&(a.allowReplace&&i||e(`Refusing to load mod ${r}: it is already loaded and doesn't allow being replaced.\\nWas the mod loaded multiple times?`),u(a));const c=o=>{let e=g.patching.get(o.name);return e||(e={hooks:[],patches:new Map},g.patching.set(o.name,e)),e},s=(o,t)=>(...n)=>{var i,a;const c=null===(a=(i=m.errorReporterHooks).apiEndpointEnter)||void 0===a?void 0:a.call(i,o,g.name);g.loaded||e(`Mod ${r} attempted to call SDK function after being unloaded`);const s=t(...n);return null==c||c(),s},p={unload:s(\"unload\",(()=>u(g))),hookFunction:s(\"hookFunction\",((o,t,n)=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to patch a function: Expected function name string, got ${typeof o}`);const i=l(o),a=c(i);\"number\"!=typeof t&&e(`Mod ${r} failed to hook function '${o}': Expected priority number, got ${typeof t}`),\"function\"!=typeof n&&e(`Mod ${r} failed to hook function '${o}': Expected hook function, got ${typeof n}`);const s={mod:g.name,priority:t,hook:n};return a.hooks.push(s),d(),()=>{const o=a.hooks.indexOf(s);o>=0&&(a.hooks.splice(o,1),d())}})),patchFunction:s(\"patchFunction\",((o,t)=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to patch a function: Expected function name string, got ${typeof o}`);const i=l(o),a=c(i);n(t)||e(`Mod ${r} failed to patch function '${o}': Expected patches object, got ${typeof t}`);for(const[n,i]of Object.entries(t))\"string\"==typeof i?a.patches.set(n,i):null===i?a.patches.delete(n):e(`Mod ${r} failed to patch function '${o}': Invalid format of patch '${n}'`);d()})),removePatches:s(\"removePatches\",(o=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to patch a function: Expected function name string, got ${typeof o}`);const t=l(o);c(t).patches.clear(),d()})),callOriginal:s(\"callOriginal\",((o,t,n)=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to call a function: Expected function name string, got ${typeof o}`);const i=l(o);return Array.isArray(t)||e(`Mod ${r} failed to call a function: Expected args array, got ${typeof t}`),i.original.apply(null!=n?n:globalThis,t)})),getOriginalHash:s(\"getOriginalHash\",(o=>{\"string\"==typeof o&&o||e(`Mod ${r} failed to get hash: Expected function name string, got ${typeof o}`);return l(o).originalHash}))},g={name:o.name,fullName:o.fullName,version:o.version,repository:o.repository,allowReplace:i,api:p,loaded:!0,patching:new Map};return f.set(o.name,g),Object.freeze(p)}function h(){const o=[];for(const e of f.values())o.push({name:e.name,fullName:e.fullName,version:e.version,repository:e.repository});return o}let m;const y=void 0===window.bcModSdk?window.bcModSdk=function(){const e={version:o,apiVersion:1,registerMod:g,getModsInfo:h,getPatchingInfo:p,errorReporterHooks:Object.seal({apiEndpointEnter:null,hookEnter:null,hookChainExit:null})};return m=e,Object.freeze(e)}():(n(window.bcModSdk)||e(\"Failed to init Mod SDK: Name already in use\"),1!==window.bcModSdk.apiVersion&&e(`Failed to init Mod SDK: Different version already loaded ('1.2.0' vs '${window.bcModSdk.version}')`),window.bcModSdk.version!==o&&alert(`Mod SDK warning: Loading different but compatible versions ('1.2.0' vs '${window.bcModSdk.version}')\\nOne of mods you are using is using an old version of SDK. It will work for now but please inform author to update`),window.bcModSdk);return\"undefined\"!=typeof exports&&(Object.defineProperty(exports,\"__esModule\",{value:!0}),exports.default=y),y}();\n", "import { BaseSettingsModel, SettingsModel, Subscreen, ModSdkManager, ModStorage, modStorage } from '../deeplib';\n\n/**\n * An abstract foundation for modular systems that require:\n * - Optional settings screens\n * - Persistent settings storage per module\n * - Default settings registration\n * - Lifecycle hooks for loading, running, and unloading\n *\n * ### Responsibilities\n * This class defines the base contract for all modules in the system:\n * - Provides a standardized interface for retrieving and storing settings\n * - Ensures default settings are registered if missing\n * - Integrates with the module storage system (`modStorage`)\n * - Offers overridable lifecycle methods (`init`, `load`, `run`, `unload`)\n *\n * **Subclass Requirements:**\n * - Must extend `BaseModule`\n * - Should override `defaultSettings` to define defaults for its settings, if any\n * - May override `settingsScreen` to provide a UI component\n * - May override lifecycle methods as needed\n */\nexport abstract class BaseModule {\n /**\n * An optional UI screen for configuring this module's settings.\n * Subclasses can override this getter to provide a `Subscreen` instance.\n * Modules with screens are automatically registered to the main menu.\n */\n get settingsScreen(): Subscreen | null {\n return null;\n }\n\n /**\n * The storage key under which this module's settings will be saved.\n * Defaults to the class name.\n *\n * Subclasses can override this if they require a custom storage key.\n */\n get settingsStorage(): string | null {\n return this.constructor.name;\n }\n\n /**\n * Retrieves the current settings for this module.\n * If no settings exist yet, registers default settings first.\n */\n get settings(): BaseSettingsModel {\n const modName = ModSdkManager.ModInfo.name;\n if (!this.settingsStorage) return {} as BaseSettingsModel;\n if (!modStorage.playerStorage) {\n Player[modName] = <SettingsModel>{};\n this.registerDefaultSettings();\n } else if (!modStorage.playerStorage[this.settingsStorage]) this.registerDefaultSettings();\n return modStorage.playerStorage[this.settingsStorage];\n }\n\n /**\n * Persists new settings for this module.\n * Automatically initializes storage and defaults if they don't exist.\n */\n set settings(value) {\n const modName = ModSdkManager.ModInfo.name;\n const storage = new ModStorage<SettingsModel>(modName);\n if (!this.settingsStorage) return;\n if (!storage.playerStorage) {\n Player[modName] = <SettingsModel>{};\n this.registerDefaultSettings();\n } else if (!storage.playerStorage[this.settingsStorage]) this.registerDefaultSettings();\n storage.playerStorage[this.settingsStorage] = value;\n }\n\n /**\n * Initializes the module.\n * Default implementation registers default settings immediately.\n * Subclasses can override to perform additional setup.\n */\n init() {\n this.registerDefaultSettings();\n }\n\n /**\n * Registers default settings for this module in persistent storage.\n * Only runs if a storage key and default settings are defined.\n * \n * If some settings already exist, they will be merged with defaults.\n * Existing values will NOT be overwritten.\n */\n registerDefaultSettings(): void {\n const storage = this.settingsStorage;\n const defaults = this.defaultSettings;\n if (!storage || !defaults) return;\n\n Player[ModSdkManager.ModInfo.name][storage] = Object.assign(defaults, Player[ModSdkManager.ModInfo.name][storage] ?? {});\n }\n\n /**\n * Provides default settings for this module.\n * Subclasses should override this getter to return their defaults.\n */\n get defaultSettings(): BaseSettingsModel | null {\n return null;\n }\n\n /**\n * Called when the module is loaded into the system.\n * Subclasses should override to perform data loading or initialization.\n */\n load() { }\n\n /**\n * By default doesn't get called each frame, only once when the module is loaded.\n * Subclasses can override to implement runtime logic.\n */\n run() { }\n\n /**\n * Called when the module is being removed.\n * Subclasses can override to perform cleanup or save final state.\n */\n unload() { }\n}\n", "import { BaseModule, BaseSettingsModel, GUI, advElement, ModSdkManager, domUtil, getText, layout, modules, modStorage, exportToGlobal } from '../deeplib';\nimport { SettingElement } from './elements_typings';\n\n/** Optional configuration flags for a `BaseSubscreen` instance. */\nexport type SubscreenOptions = {\n /**\n * If `true`, the subscreen will draw the player's character model\n * in the UI when `run()` is called.\n * Also shift the UI to the right to make room for the character.\n */\n drawCharacter?: boolean;\n\n /**\n * Logical name of this subscreen.\n * Used for localization key resolution in `load()`.\n * Subclasses should override this with a meaningful identifier.\n */\n name: string;\n\n /**\n * Path to or Base64 data for an icon representing this subscreen.\n * Defaults to empty string (no icon).\n */\n icon?: string;\n\n /** \n * An optional help button to open a subscreen or URL or run a function when clicked.\n */\n help?: {\n /** A URL or BaseSubscreen to open or a function to run when the help button is clicked */\n onClick: URL | string | BaseSubscreen | (() => void);\n /** A tooltip to display when the help button is hovered over */\n tooltip?: string;\n /** An icon to display on the help button */\n icon?: string;\n },\n\n /** \n * Screen to return to when exiting this subscreen. \n * If not configured, the default is the main menu for all screens, but main menu itself.\n * For main menu, the default is the Extensions menu \n */\n returnScreen?: (() => ScreenSpecifier | BaseSubscreen) | ScreenSpecifier | BaseSubscreen;\n\n /** \n * The background image for this subscreen. \n * Currently supports only images from the Club.\n */\n background?: string;\n\n /**\n * If `true`, the exit button will be shown on the subscreen.\n * Defaults to `true`.\n */\n doShowExitButton?: boolean;\n\n /**\n * If `true`, the title will be shown on the subscreen.\n * Defaults to `true`.\n */\n doShowTitle?: boolean;\n\n /** \n * The width of the settings div in canvas pixels.\n * Defaults to 1000.\n */\n settingsWidth?: number;\n};\n\n/**\n * Represents a constructor type for a subscreen.\n * Allows dynamic instantiation of subscreen classes with optional\n * configuration options and a parent module reference.\n */\nexport type Subscreen = new (\n module?: BaseModule\n) => BaseSubscreen;\n\n/** Switches the active subscreen in the global `GUI` instance. */\nexport async function setSubscreen(subscreen: BaseSubscreen | string | null) {\n if (!GUI.instance) {\n throw new Error('Attempt to set subscreen before init');\n }\n const screenName = typeof subscreen === 'string' ? subscreen : subscreen?.options.name;\n const screenId = `${BaseSubscreen.id}_${screenName}`;\n\n await CommonSetScreen(...['DeepLibMod', `${screenId}`] as unknown as ScreenSpecifier);\n}\n\n/**\n * Abstract base class for creating settings/configuration subscreens in a module.\n *\n * ### Responsibilities\n * This class defines the base contract for all modules in the system:\n * - Provides a standardized interface for retrieving and storing settings\n * - Ensures default settings are registered if missing\n * - Integrates with the module storage system (`modStorage`)\n * - Offers overridable lifecycle methods (`init`, `load`, `run`, `unload`)\n *\n * **Subclass Requirements:**\n * - Must extend `BaseSubscreen`\n * - Should override `name`, `icon` to define subscreen metadata\n * - May override `pageStructure` to define UI layout and controls\n * - May override lifecycle methods as needed\n */\nexport abstract class BaseSubscreen {\n /** Global registry of currently rendered elements and their definitions. */\n static currentElements: [HTMLElement, SettingElement][] = [];\n /** Tracks the currently visible page number (1-based index). */\n static currentPage: number = 1;\n /** Runtime options for this subscreen. */\n readonly options: SubscreenOptions;\n /** Reference to the module this subscreen belongs to. */\n readonly module!: BaseModule;\n /** Identifier for internal use to avoid screen name collisions. */\n static readonly id: string = CommonGenerateUniqueID();\n /** Optional configuration flags for a BaseSubscreen instance. */\n protected static readonly subscreenOptions: SubscreenOptions = {\n drawCharacter: true,\n name: 'UNKNOWN',\n icon: '',\n background: 'Sheet',\n doShowExitButton: true,\n doShowTitle: true,\n settingsWidth: 1000,\n };\n\n constructor(module?: BaseModule) {\n if (module) this.module = module;\n\n const ctor = this.constructor as typeof BaseSubscreen;\n this.options = {\n ...BaseSubscreen.subscreenOptions,\n ...ctor.subscreenOptions\n };\n\n const screenName = this.options.name;\n const screenId = `${BaseSubscreen.id}_${screenName}`;\n\n exportToGlobal(`${screenId}Load`, this.load.bind(this));\n exportToGlobal(`${screenId}Run`, this.run.bind(this));\n exportToGlobal(`${screenId}Click`, this.click.bind(this));\n exportToGlobal(`${screenId}Exit`, this.exit.bind(this));\n exportToGlobal(`${screenId}Unload`, this.unload.bind(this));\n exportToGlobal(`${screenId}Resize`, this.resize.bind(this));\n exportToGlobal(`${screenId}Background`, this.options.background);\n\n CommonCSVCache[ScreenFileGetTranslation('DeepLibMod', screenId) as string] = [];\n }\n\n /** Changes the currently active subscreen. */\n async setSubscreen(screen: BaseSubscreen | string | null) {\n return await setSubscreen(screen);\n }\n\n /** Gets this subscreen's settings object from its parent module. */\n get settings(): BaseSettingsModel {\n return this.module.settings as BaseSettingsModel;\n }\n\n /** Updates this subscreen's settings in its parent module. */\n set settings(value) {\n this.module.settings = value;\n }\n\n /**\n * Defines the paginated layout of the subscreen's settings UI.\n * Each element in the outer array is a page; each page contains `SettingElement`s.\n *\n * Subclasses should override to define their actual UI structure.\n */\n get pageStructure(): SettingElement[][] {\n return [[]];\n }\n\n /** Gets the currently visible page's settings elements. */\n get currentPage(): SettingElement[] {\n return this.pageStructure[Math.min(BaseSubscreen.currentPage - 1, this.pageStructure.length - 1)];\n }\n\n getPageLabel(): string {\n return CommonStringPartitionReplace(getText('settings.page.label'), {\n $currentPage$: `${BaseSubscreen.currentPage}`,\n $totalPages$: `${this.pageStructure.length}`,\n }).join('');\n }\n\n /**\n * Changes the visible page in a multi-page subscreen.\n * Automatically wraps around when going past the first or last page.\n */\n changePage(page: number, setLabel: (label: string) => void) {\n const totalPages = this.pageStructure.length;\n\n if (page > totalPages) page = 1;\n if (page < 1) page = totalPages;\n BaseSubscreen.currentPage = page;\n\n this.managePageElementsVisibility();\n\n setLabel(this.getPageLabel());\n }\n\n /**\n * Updates the DOM to show only elements belonging to the current page.\n * All elements on other pages are hidden.\n */\n managePageElementsVisibility() {\n this.pageStructure.forEach((item, ix) => {\n item.forEach((setting) => {\n const element = ElementWrap(`${setting.id}-container`) ?? ElementWrap(`${setting.id}`);\n \n if (ix != BaseSubscreen.currentPage - 1) {\n if (element) domUtil.hide(element);\n } else {\n if (element) domUtil.unhide(element);\n }\n });\n });\n }\n\n /**\n * Called when this subscreen is first displayed.\n * Builds the layout, initializes navigation, and renders all settings elements.\n *\n * Handles:\n * - Ensuring each module with a settings screen has its defaults loaded\n * - Creating navigation menus and back/next page controls\n * - Building and appending UI elements based on `pageStructure`\n * - Setting up exit button and tooltip\n * - Resetting to page 1\n */\n load() {\n for (const module of modules()) {\n if (!module.settingsScreen) continue;\n if (!module.settings || !Object.keys(module.settings).length) module.registerDefaultSettings();\n }\n\n BaseSubscreen.currentPage = 1;\n\n layout.getSubscreen();\n const settingsElement = layout.getSettingsDiv();\n layout.appendToSubscreen(settingsElement);\n\n const menu = ElementMenu.Create('deeplib-nav-menu', []);\n layout.appendToSubscreen(menu);\n\n if (this.pageStructure.length > 1) {\n const backNext = advElement.createBackNext({\n id: 'deeplib-page-back-next',\n next: ({ setLabel }) => this.changePage(BaseSubscreen.currentPage + 1, setLabel),\n initialNextTooltip: getText('settings.button.next_button_hint'),\n back: ({ setLabel }) => this.changePage(BaseSubscreen.currentPage - 1, setLabel),\n initialPrevTooltip: getText('settings.button.prev_button_hint'),\n initialLabel: this.getPageLabel()\n });\n\n ElementMenu.PrependItem(menu, backNext);\n }\n\n if (this.options.help) {\n const onClick = this.options.help.onClick;\n let action = () => { };\n if (typeof onClick === 'string' || onClick instanceof URL) {\n action = () => window.open(onClick, '_blank');\n } else if (typeof onClick === 'function') {\n action = onClick;\n } else if (onClick instanceof BaseSubscreen) {\n action = async () => await this.setSubscreen(onClick);\n }\n\n this.options.help.tooltip ??= getText('settings.button.help_button_hint');\n this.options.help.icon ??= `${PUBLIC_URL}/dl_images/bookmark.svg`;\n\n const helpButton = advElement.createButton({\n id: 'deeplib-help',\n size: [90, 90],\n onClick: action,\n options: {\n image: this.options.help.icon,\n tooltip: this.options.help.tooltip\n }\n });\n\n ElementMenu.AppendButton(menu, helpButton);\n }\n\n if (this.options.doShowTitle) {\n const subscreenTitle = advElement.createLabel({\n id: 'deeplib-subscreen-title',\n label: getText(`${this.options.name}.title`).replace('$ModVersion', ModSdkManager.ModInfo.version),\n });\n layout.appendToSubscreen(subscreenTitle);\n }\n\n if (this.options.doShowExitButton) {\n const exitButton = advElement.createButton({\n id: 'deeplib-exit',\n size: [90, 90],\n onClick: () => {\n this.exit();\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/exit.svg`,\n tooltip: getText('settings.button.back_button_hint')\n }\n });\n ElementMenu.AppendButton(menu, exitButton);\n }\n\n const tooltip = advElement.createTooltip();\n layout.appendToSubscreen(tooltip);\n\n this.pageStructure.forEach((s) =>\n s.forEach((item) => {\n let element: HTMLElement;\n switch (item.type) {\n case 'text':\n case 'number':\n case 'color':\n element = advElement.createInput(item);\n break;\n case 'checkbox':\n element = advElement.createCheckbox(item);\n break;\n case 'button':\n element = advElement.createButton(item);\n break;\n case 'label':\n element = advElement.createLabel(item);\n break;\n case 'custom':\n element = advElement.createCustom(item);\n break;\n case 'dropdown':\n element = advElement.createDropdown(item);\n break;\n }\n layout.appendToSettingsDiv(element);\n })\n );\n\n this.managePageElementsVisibility();\n\n CharacterAppearanceForceUpCharacter = Player.MemberNumber ?? -1;\n }\n\n\n /**\n * Called each frame while this subscreen is active.\n * Default behavior draws the player's character if `drawCharacter` is enabled.\n */\n run() {\n if (this.options.drawCharacter) DrawCharacter(Player, 50, 50, 0.9, false);\n }\n\n /**\n * Handles mouse clicks *on canvas* while the subscreen is active.\n * Default implementation is empty \u2014 subclasses may override.\n */\n click() {\n }\n\n /**\n * Exits this subscreen, returning to the main menu.\n * Also saves persistent storage changes.\n * Called after the `unload`.\n */\n exit() {\n CharacterAppearanceForceUpCharacter = -1;\n CharacterLoadCanvas(Player);\n\n const returnScreen = typeof this.options.returnScreen === 'function' ? this.options.returnScreen() : this.options.returnScreen;\n\n if (returnScreen instanceof BaseSubscreen || !returnScreen) {\n setSubscreen(returnScreen ?? 'mainmenu').then(() => {\n modStorage.save();\n });\n } else if (Array.isArray(returnScreen)) {\n CommonSetScreen(...returnScreen).then(() => {\n modStorage.save();\n });\n }\n }\n\n /**\n * Called when the window is resized.\n * Also checks for overflow in the settings div and applies styling accordingly.\n */\n resize(_onLoad: boolean = false) {\n const offset = this.options.drawCharacter ? 0 : 380;\n const subscreen = layout.getSubscreen();\n const settingsDiv = layout.getSettingsDiv();\n\n ElementSetPosition(subscreen, 0, 0);\n ElementSetSize(subscreen, 2000, 1000);\n ElementSetFontSize(subscreen, 'auto');\n\n ElementSetPosition(settingsDiv, 530 - offset, 170);\n ElementSetSize(settingsDiv, this.options.settingsWidth ?? 1000 + offset, 660);\n\n ElementSetPosition('deeplib-subscreen-title', 530 - offset, 75);\n ElementSetSize('deeplib-subscreen-title', 800, 60);\n\n ElementSetPosition('deeplib-nav-menu', 1905, 75, 'top-right');\n ElementSetSize('deeplib-nav-menu', null, 90);\n\n ElementSetPosition(advElement.getTooltip() || '', 250, 850);\n ElementSetSize(advElement.getTooltip() || '', 1500, 70);\n\n BaseSubscreen.currentElements.forEach((item) => {\n const element = item[0];\n const options = item[1];\n\n domUtil.autoSetPosition(options.id ?? element.id, options.position);\n domUtil.autoSetSize(options.id ?? element.id, options.size);\n });\n\n if (settingsDiv) {\n if (domUtil.hasOverflow(settingsDiv)?.vertical) {\n settingsDiv.classList.add('deeplib-overflow-box');\n } else {\n settingsDiv.classList.remove('deeplib-overflow-box');\n }\n }\n }\n\n\n /**\n * Called when this subscreen is being removed.\n * Resets the static element registry and removes the subscreen from the layout.\n * Called before `exit`.\n */\n unload() {\n BaseSubscreen.currentElements = [];\n\n layout.removeSubscreen();\n }\n}\n\n", "export default `.deeplib-subscreen,\n.deeplib-modal {\n --deeplib-background-color: var(--tmd-main, white);\n --deeplib-element-color: var(--tmd-element, white);\n --deeplib-element-hover-color: var(--tmd-element-hover, cyan);\n --deeplib-accent-color: var(--tmd-accent, #FFFF88);\n --deeplib-blocked-color: var(--tmd-blocked, red);\n --deeplib-text-color: var(--tmd-text, black);\n --deeplib-icon-color: var(--tmd-accent, black);\n --deeplib-icon-hover-color: var(--tmd-accent-hover, black);\n --deeplib-border-color: var(--tmd-accent, black);\n --deeplib-border-width: min(0.2vh, 0.1vw);\n --deeplib-border-width: min(0.2dvh, 0.1dvw);\n --deeplib-border-radius: min(1vh, 0.5vw);\n --deeplib-border-radius: min(1dvh, 0.5dvw);\n}\n\n.deeplib-button {\n color: var(--deeplib-text-color);\n width: 100%;\n height: 100%;\n}\n\n.deeplib-button.button-styling,\n.deeplib-button.button-styling::before {\n border-radius: min(1dvh, 0.5dvw);\n}\n\n.deeplib-button img {\n position: absolute;\n top: 0%;\n left: 0%;\n width: 100%;\n height: 100%;\n background-position: left;\n background-color: var(--deeplib-icon-color);\n background-blend-mode: multiply;\n background-size: contain;\n mask-position: left;\n mask-size: contain;\n background-repeat: no-repeat;\n mask-repeat: no-repeat;\n color: transparent;\n background-image: var(--image);\n mask-image: var(--image);\n pointer-events: none;\n}\n\n.deeplib-button:hover img {\n background-color: var(--deeplib-icon-hover-color);\n}\n\n.deeplib-button .button-label {\n background-color: transparent !important;\n color: var(--deeplib-text-color);\n font-size: min(3.6dvh, 1.8dvw);\n}\n\n.deeplib-button .button-tooltip {\n border-radius: min(1dvh, 0.5dvw);\n}\n\n#deeplib-page-label {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n#deeplib-subscreen-title {\n text-align: left;\n color: var(--deeplib-text-color);\n}\n\n.deeplib-text {\n color: var(--deeplib-text-color);\n}\n\n.deeplib-subscreen {\n padding: 0;\n margin: 0;\n pointer-events: none;\n}\n\n.deeplib-subscreen * {\n box-sizing: border-box;\n pointer-events: all;\n}\n\n.deeplib-settings {\n display: grid;\n grid-auto-rows: min-content;\n padding: min(1dvh, 0.5dvw);\n gap: 0.3em;\n}\n\n.deeplib-misc {\n display: flex;\n align-items: center;\n flex-direction: column-reverse;\n gap: min(1vh, 0.5vw);\n}\n\n.deeplib-tooltip {\n background-color: var(--deeplib-element-color);\n color: var(--deeplib-text-color);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: min(1dvh, 0.5dvw);\n padding: min(1vh, 0.5vw);\n font-size: 0.8em;\n border: min(0.2vh, 0.1vw) solid var(--deeplib-border-color);\n z-index: 1;\n}\n\n.deeplib-overflow-box {\n border: var(--deeplib-border-color) solid var(--deeplib-border-width);\n}\n\n.deeplib-prev-next {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-direction: row;\n gap: min(2dvh, 1dvw);\n background-color: var(--deeplib-element-color);\n color: var(--deeplib-text-color);\n border-radius: min(1dvh, 0.5dvw);\n border: min(0.2vh, 0.1vw) solid var(--deeplib-border-color);\n}\n.deeplib-prev-next .deeplib-prev-next-button:hover {\n background-color: var(--deeplib-element-hover-color);\n border-radius: var(--deeplib-border-radius);\n}\n.deeplib-prev-next .deeplib-prev-next-button {\n height: 100%;\n aspect-ratio: 1;\n}\n.deeplib-prev-next .deeplib-prev-next-label {\n white-space: nowrap;\n}\n\n#deeplib-nav-menu {\n display: flex;\n flex-direction: row;\n gap: min(2dvh, 1dvw);\n}\n\n#deeplib-storage-meter {\n position: absolute;\n top: 0px;\n left: 0px;\n width: 100%;\n height: 100%;\n overflow: hidden;\n background-color: var(--deeplib-element-color);\n border: var(--deeplib-border-width) solid var(--deeplib-border-color);\n border-radius: var(--deeplib-border-radius);\n z-index: -1;\n}\n\n#deeplib-storage-bar {\n height: 100%;\n width: 0%;\n background: var(--deeplib-accent-color);\n}\n\n.deeplib-checkbox-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.3em;\n}\n\n.deeplib-checkbox-container input.deeplib-input {\n width: min(5vh, 2.5vw);\n height: min(5vh, 2.5vw);\n width: min(5dvh, 2.5dvw);\n height: min(5dvh, 2.5dvw);\n border-radius: min(1vh, 0.5vw);\n border-radius: min(1dvh, 0.5dvw);\n}\n\n.deeplib-checkbox-container input.deeplib-input[type=checkbox]:checked::before {\n width: 80%;\n height: 80%;\n}\n\n.deeplib-input-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 0.3em;\n}\n\n.deeplib-input-container:has(label.deeplib-text) {\n margin-top: min(1vh, 0.5vw);\n margin-top: min(1dvh, 0.5dvw);\n}\n\n.deeplib-input-container input.deeplib-input {\n font-size: 0.6em;\n padding: min(1vh, 0.5vw);\n padding: min(1dvh, 0.5dvw);\n background-color: transparent;\n outline: none;\n min-height: min(5vh, 2.5vw);\n min-height: min(5dvh, 2.5dvw);\n border-radius: min(1vh, 0.5vw);\n border-radius: min(1dvh, 0.5dvw);\n}\n\n.deeplib-input-container input.deeplib-input[type=color] {\n padding: 0px;\n width: min(5vh, 2.5vw);\n height: min(5vh, 2.5vw);\n width: min(5dvh, 2.5dvw);\n height: min(5dvh, 2.5dvw);\n border-radius: 0px;\n}\n\n.deeplib-input-container input.deeplib-input[type=color]:disabled {\n border: var(--deeplib-blocked-color) solid var(--deeplib-border-width);\n cursor: not-allowed;\n}\n\n.deeplib-dropdown-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: min(2vh, 1vw);\n gap: min(2dvh, 1dvw);\n color: var(--deeplib-text-color);\n}\n.deeplib-dropdown-container select {\n padding: 0 min(1vh, 0.5vw);\n padding: 0 min(1dvh, 0.5dvw);\n border-radius: min(1vh, 0.5vw);\n border-radius: min(1dvh, 0.5dvw);\n}\n\n.deeplib-highlight-text {\n font-weight: bold;\n color: rgb(203, 185, 23);\n}\n\n#TextAreaChatLog[data-colortheme=dark] div.ChatMessage.deeplib-message,\n#TextAreaChatLog[data-colortheme=dark2] div.ChatMessage.deeplib-message {\n background-color: var(--deeplib-element-color);\n border: min(0.2dvh, 0.1dvw) solid var(--deeplib-border-color);\n color: var(--deeplib-text-color);\n}\n\n#TextAreaChatLog div.ChatMessage.deeplib-message {\n background-color: #eee;\n border: min(0.2dvh, 0.1dvw) solid #440171;\n color: #111;\n padding-left: min(0.6dvh, 0.3dvw);\n display: block;\n white-space: normal;\n}\n\n#TextAreaChatLog[data-colortheme=dark] div.ChatMessage.deeplib-message a,\n#TextAreaChatLog[data-colortheme=dark2] div.ChatMessage.deeplib-message a {\n color: var(--deeplib-text-color);\n}\n\n#TextAreaChatLog div.ChatMessage.deeplib-message a {\n cursor: pointer;\n font-weight: bold;\n color: #111;\n}\n\n.deeplib-modal {\n position: fixed;\n top: 10%;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: 0.5em;\n width: max(50dvw, 25dvh);\n font-size: min(4dvh, 2dvw);\n padding: min(2dvh, 1dvw);\n background-color: var(--deeplib-element-color);\n border-radius: min(1.2dvh, 0.6dvw);\n border: min(0.2dvh, 0.1dvw) solid var(--deeplib-border-color);\n color: var(--deeplib-text-color);\n}\n.deeplib-modal .deeplib-modal-input {\n width: 100%;\n font-size: min(2.6dvh, 1.8dvw);\n border-radius: min(1dvh, 0.5dvw);\n padding: min(1dvh, 0.5dvw);\n}\n.deeplib-modal input.deeplib-modal-input {\n max-width: max(50dvh, 25dvw);\n}\n.deeplib-modal .deeplib-modal-button-container {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n gap: 0.5em;\n width: 100%;\n}\n.deeplib-modal .deeplib-modal-button-container .deeplib-button {\n font-size: 0.8em;\n display: flex;\n width: auto;\n padding: min(0.4vh, 0.2vw) min(2vh, 1vw);\n}\n.deeplib-modal .deeplib-modal-button-container .deeplib-button .button-label {\n display: contents;\n}\n.deeplib-modal .deeplib-modal-prompt-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}\n\n.deeplib-modal-blocker {\n z-index: 1000;\n position: fixed;\n top: 0;\n left: 0;\n width: 100dvw;\n height: 100dvh;\n background-color: rgba(0, 0, 0, 0.5);\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL21lZGlhL05WTUUvU3R1ZmYvQ29kZS9iYy9CQy1EZWVwTGliL3NyYy9zdHlsZXMiLCJzb3VyY2VzIjpbInZhcnMuc2NzcyIsImJ1dHRvbnMuc2NzcyIsImVsZW1lbnRzLnNjc3MiLCJpbnB1dHMuc2NzcyIsIm1lc3NhZ2VzLnNjc3MiLCJtb2RhbC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FDZEY7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FDM0NGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdFO0VBQ0U7RUFDQTs7QUFISjtFQU1FO0VBQ0E7O0FBR0Y7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUN6R0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FDdkVKO0VBQ0U7RUFDQTs7O0FBR0Y7QUFBQTtFQUVFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQzdCRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFHRjtFQUNFOztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBS047RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi5kZWVwbGliLXN1YnNjcmVlbixcbi5kZWVwbGliLW1vZGFsIHtcbiAgLS1kZWVwbGliLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXRtZC1tYWluLCB3aGl0ZSk7XG4gIC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yOiB2YXIoLS10bWQtZWxlbWVudCwgd2hpdGUpO1xuICAtLWRlZXBsaWItZWxlbWVudC1ob3Zlci1jb2xvcjogdmFyKC0tdG1kLWVsZW1lbnQtaG92ZXIsIGN5YW4pO1xuICAtLWRlZXBsaWItYWNjZW50LWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LCAjRkZGRjg4KTtcbiAgLS1kZWVwbGliLWJsb2NrZWQtY29sb3I6IHZhcigtLXRtZC1ibG9ja2VkLCByZWQpO1xuICAtLWRlZXBsaWItdGV4dC1jb2xvcjogdmFyKC0tdG1kLXRleHQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWljb24tY29sb3I6IHZhcigtLXRtZC1hY2NlbnQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWljb24taG92ZXItY29sb3I6IHZhcigtLXRtZC1hY2NlbnQtaG92ZXIsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWJvcmRlci1jb2xvcjogdmFyKC0tdG1kLWFjY2VudCwgYmxhY2spO1xuICAtLWRlZXBsaWItYm9yZGVyLXdpZHRoOiBtaW4oMC4ydmgsIDAuMXZ3KTtcbiAgLS1kZWVwbGliLWJvcmRlci13aWR0aDogbWluKDAuMmR2aCwgMC4xZHZ3KTtcbiAgLS1kZWVwbGliLWJvcmRlci1yYWRpdXM6IG1pbigxdmgsIDAuNXZ3KTtcbiAgLS1kZWVwbGliLWJvcmRlci1yYWRpdXM6IG1pbigxZHZoLCAwLjVkdncpO1xufVxuIiwiLmRlZXBsaWItYnV0dG9uIHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5kZWVwbGliLWJ1dHRvbi5idXR0b24tc3R5bGluZyxcbi5kZWVwbGliLWJ1dHRvbi5idXR0b24tc3R5bGluZzo6YmVmb3JlIHtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIGltZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwJTtcbiAgbGVmdDogMCU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtcG9zaXRpb246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItaWNvbi1jb2xvcik7XG4gIGJhY2tncm91bmQtYmxlbmQtbW9kZTogbXVsdGlwbHk7XG4gIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgbWFzay1wb3NpdGlvbjogbGVmdDtcbiAgbWFzay1zaXplOiBjb250YWluO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBtYXNrLXJlcGVhdDogbm8tcmVwZWF0O1xuICBjb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgYmFja2dyb3VuZC1pbWFnZTogdmFyKC0taW1hZ2UpO1xuICBtYXNrLWltYWdlOiB2YXIoLS1pbWFnZSk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uZGVlcGxpYi1idXR0b246aG92ZXIgaW1nIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1pY29uLWhvdmVyLWNvbG9yKTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIC5idXR0b24tbGFiZWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbiAgZm9udC1zaXplOiBtaW4oMy42ZHZoLCAxLjhkdncpO1xufVxuXG4uZGVlcGxpYi1idXR0b24gLmJ1dHRvbi10b29sdGlwIHtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cbiIsIiNkZWVwbGliLXBhZ2UtbGFiZWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuI2RlZXBsaWItc3Vic2NyZWVuLXRpdGxlIHtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbi5kZWVwbGliLXRleHQge1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbn1cblxuLmRlZXBsaWItc3Vic2NyZWVuIHtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAwO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmRlZXBsaWItc3Vic2NyZWVuICoge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwb2ludGVyLWV2ZW50czogYWxsO1xufVxuXG4uZGVlcGxpYi1zZXR0aW5ncyB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtYXV0by1yb3dzOiBtaW4tY29udGVudDtcbiAgcGFkZGluZzogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbiAgZ2FwOiAwLjNlbTtcbn1cblxuLmRlZXBsaWItbWlzYyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgZ2FwOiBtaW4oMXZoLCAwLjV2dyk7XG59XG5cbi5kZWVwbGliLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIHBhZGRpbmc6IG1pbigxdmgsIDAuNXZ3KTtcbiAgZm9udC1zaXplOiAwLjhlbTtcbiAgYm9yZGVyOiBtaW4oMC4ydmgsIDAuMXZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG4gIHotaW5kZXg6IDE7XG59XG5cbi5kZWVwbGliLW92ZXJmbG93LWJveCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLXdpZHRoKTtcbn1cblxuLmRlZXBsaWItcHJldi1uZXh0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGJvcmRlcjogbWluKDAuMnZoLCAwLjF2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuXG4gIC5kZWVwbGliLXByZXYtbmV4dC1idXR0b24ge1xuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWhvdmVyLWNvbG9yKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXBsaWItYm9yZGVyLXJhZGl1cyk7XG4gICAgfVxuICAgIFxuICAgIGhlaWdodDogMTAwJTtcbiAgICBhc3BlY3QtcmF0aW86IDE7XG4gIH1cblxuICAuZGVlcGxpYi1wcmV2LW5leHQtbGFiZWwge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbn1cblxuI2RlZXBsaWItbmF2LW1lbnUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1tZXRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyOiB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVwbGliLWJvcmRlci1yYWRpdXMpO1xuICB6LWluZGV4OiAtMTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1iYXIge1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwJTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZGVlcGxpYi1hY2NlbnQtY29sb3IpO1xufVxuIiwiLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjNlbTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXQge1xuICB3aWR0aDogbWluKDV2aCwgMi41dncpO1xuICBoZWlnaHQ6IG1pbig1dmgsIDIuNXZ3KTtcbiAgd2lkdGg6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBoZWlnaHQ6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wdmgsIDAuNXZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQ6OmJlZm9yZSB7XG4gIHdpZHRoOiA4MCU7XG4gIGhlaWdodDogODAlO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuM2VtO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXI6aGFzKGxhYmVsLmRlZXBsaWItdGV4dCkge1xuICBtYXJnaW4tdG9wOiBtaW4oMXZoLCAwLjV2dyk7XG4gIG1hcmdpbi10b3A6IG1pbigxZHZoLCAwLjVkdncpO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dCB7XG4gIGZvbnQtc2l6ZTogMC42ZW07XG4gIHBhZGRpbmc6IG1pbigxdmgsIDAuNXZ3KTtcbiAgcGFkZGluZzogbWluKDFkdmgsIDAuNWR2dyk7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBvdXRsaW5lOiBub25lO1xuICBtaW4taGVpZ2h0OiBtaW4oNXZoLCAyLjV2dyk7XG4gIG1pbi1oZWlnaHQ6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wdmgsIDAuNXZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNvbG9yXCJdIHtcbiAgcGFkZGluZzogMHB4O1xuICB3aWR0aDogbWluKDV2aCwgMi41dncpO1xuICBoZWlnaHQ6IG1pbig1dmgsIDIuNXZ3KTtcbiAgd2lkdGg6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBoZWlnaHQ6IG1pbig1ZHZoLCAyLjVkdncpO1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0W3R5cGU9XCJjb2xvclwiXTpkaXNhYmxlZCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yKSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCk7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbi5kZWVwbGliLWRyb3Bkb3duLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogbWluKDJ2aCwgMXZ3KTtcbiAgZ2FwOiBtaW4oMmR2aCwgMWR2dyk7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuXG4gIHNlbGVjdCB7XG4gICAgcGFkZGluZzogMCBtaW4oMXZoLCAwLjV2dyk7XG4gICAgcGFkZGluZzogMCBtaW4oMWR2aCwgMC41ZHZ3KTtcbiAgICBib3JkZXItcmFkaXVzOiBtaW4oMXZoLCAwLjV2dyk7XG4gICAgYm9yZGVyLXJhZGl1czogbWluKDFkdmgsIDAuNWR2dyk7XG4gIH1cbn0iLCIuZGVlcGxpYi1oaWdobGlnaHQtdGV4dCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogcmdiKDIwMywgMTg1LCAyMyk7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSxcbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrMiddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbn1cblxuI1RleHRBcmVhQ2hhdExvZyBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgYm9yZGVyOiBtaW4oMC4yZHZoLCAwLjFkdncpIHNvbGlkICM0NDAxNzE7XG4gIGNvbG9yOiAjMTExO1xuICBwYWRkaW5nLWxlZnQ6IG1pbigwLjZkdmgsIDAuM2R2dyk7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nW2RhdGEtY29sb3J0aGVtZT0nZGFyayddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSxcbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrMiddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjMTExO1xufVxuIiwiLmRlZXBsaWItbW9kYWwge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMTAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgei1pbmRleDogMTAwMTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC41ZW07XG4gIHdpZHRoOiBtYXgoNTBkdncsIDI1ZHZoKTtcbiAgZm9udC1zaXplOiBtaW4oNGR2aCwgMmR2dyk7XG4gIHBhZGRpbmc6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMmR2aCwgMC42ZHZ3KTtcbiAgYm9yZGVyOiBtaW4oMC4yZHZoLCAwLjFkdncpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG5cbiAgLmRlZXBsaWItbW9kYWwtaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZvbnQtc2l6ZTogbWluKDIuNmR2aCwgMS44ZHZ3KTtcbiAgICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xuICAgIHBhZGRpbmc6IG1pbigxZHZoLCAwLjVkdncpO1xuICB9XG5cbiAgaW5wdXQuZGVlcGxpYi1tb2RhbC1pbnB1dCB7XG4gICAgbWF4LXdpZHRoOiBtYXgoNTBkdmgsIDI1ZHZ3KTtcbiAgfVxuXG4gIC5kZWVwbGliLW1vZGFsLWJ1dHRvbi1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogMC41ZW07XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAuZGVlcGxpYi1idXR0b24ge1xuICAgICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB3aWR0aDogYXV0bztcbiAgICAgIHBhZGRpbmc6IG1pbigwLjR2aCwgMC4ydncpIG1pbigydmgsIDF2dyk7XG5cbiAgICAgIC5idXR0b24tbGFiZWwge1xuICAgICAgICBkaXNwbGF5OiBjb250ZW50cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZGVlcGxpYi1tb2RhbC1wcm9tcHQtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxufVxuXG4uZGVlcGxpYi1tb2RhbC1ibG9ja2VyIHtcbiAgei1pbmRleDogMTAwMDtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDBkdnc7XG4gIGhlaWdodDogMTAwZHZoO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG4iXX0= */`;\n", "import deeplib_style from '../styles/index.scss';\nimport { BaseModule, ModSdkManager, deepLibLogger, Localization, modules, registerModule, Style, VersionModule, hasSetter, deepMergeMatchingProperties, hasGetter, BaseMigrator, ModStorage, MainMenuOptions, MainMenu, TranslationOptions } from '../deeplib';\n\n/** Configuration object for initializing a mod via `initMod`. */\ninterface InitOptions {\n /**\n * Information about the mod being initialized.\n * - `info` \u2014 Required metadata describing the mod.\n * - `options` \u2014 Optional runtime configuration for the Mod SDK.\n */\n modInfo: {\n info: ModSDKModInfo,\n options?: ModSDKModOptions\n };\n\n /**\n * List of modules (`BaseModule` subclasses) to register with the mod system.\n * Modules are initialized, loaded, and run in order.\n */\n modules?: BaseModule[];\n\n /**\n * List of data migration handlers to register with the `VersionModule`.\n * Each `BaseMigrator` handles upgrading data from one version to another.\n */\n migrators?: BaseMigrator[];\n\n /** Configuration for customizing the main menu when the mod is active. */\n mainMenuOptions?: MainMenuOptions;\n\n /**\n * Optional hook executed *before* login when the player is not yet authenticated.\n * Useful for pre-login setup or display changes.\n */\n beforeLogin?: () => (void);\n\n /**\n * Optional async/sync function run after modules and translations are initialized.\n * Can be used to perform additional setup tasks.\n */\n initFunction?: () => (void | Promise<void>);\n\n /** Options for initializing the localization/translation system. */\n translationOptions?: TranslationOptions;\n}\n\n/**\n * Global storage handler for mod.\n * Initialized by `initMod()` and mod data loaded by `init()`.\n */\nexport let modStorage: ModStorage;\n\n/**\n * Global Mod SDK manager.\n * Initialized by `initMod()`.\n */\nexport let sdk: ModSdkManager;\n\n/**\n * Entry point for initializing a mod. Handles:\n * - Setting up the Mod SDK\n * - Preparing persistent storage\n * - Injecting required styles\n * - Delaying initialization until login (if necessary)\n */\nexport function initMod(options: InitOptions) {\n sdk = new ModSdkManager(options.modInfo.info, options.modInfo.options);\n const MOD_NAME = ModSdkManager.ModInfo.name;\n\n modStorage = new ModStorage(ModSdkManager.ModInfo.name);\n Style.injectInline('deeplib-style', deeplib_style);\n\n deepLibLogger.debug(`Init wait for ${MOD_NAME}`);\n if (CurrentScreen == null || CurrentScreen === 'Login') {\n options.beforeLogin?.();\n const removeHook = sdk.hookFunction('LoginResponse', 0, (args, next) => {\n deepLibLogger.debug(`Init for ${MOD_NAME}! LoginResponse caught: `, args);\n next(args);\n const response = args[0];\n if (response === 'InvalidNamePassword') return next(args);\n if (response && typeof response.Name === 'string' && typeof response.AccountName === 'string') {\n init(options);\n removeHook();\n }\n });\n } else {\n deepLibLogger.debug(`Already logged in, initing ${MOD_NAME}`);\n init(options);\n }\n}\n\n\n/**\n * Fully initializes the mod after login.\n * Handles:\n * - Preventing double-load\n * - Loading mod data\n * - Initializing localization\n * - Registering modules and migrators\n * - Running optional init functions\n * - Applying main menu changes\n * - Merging default settings into module settings\n *\n * @param options {InitOptions} Configuration for mod initialization.\n */\nasync function init(options: InitOptions) {\n const MOD_NAME = ModSdkManager.ModInfo.name;\n const MOD_VERSION = ModSdkManager.ModInfo.version;\n\n if ((window as any)[MOD_NAME + 'Loaded']) return;\n\n modStorage.load();\n\n await Localization.init(options.translationOptions);\n\n if (options.modules && !initModules(options.modules)) {\n unloadMod();\n return;\n }\n\n if (options.migrators) {\n for (const m of options.migrators) {\n VersionModule.registerMigrator(m);\n }\n }\n\n await options.initFunction?.();\n\n if (options.mainMenuOptions)\n MainMenu.setOptions(options.mainMenuOptions);\n\n for (const m of modules()) {\n if (m.defaultSettings && hasGetter(m, 'defaultSettings') && m.settings && hasSetter(m, 'settings')) {\n if (Object.entries(m.defaultSettings).length === 0) continue;\n m.settings = deepMergeMatchingProperties(m.defaultSettings, m.settings);\n }\n }\n\n (window as any)[MOD_NAME + 'Loaded'] = true;\n deepLibLogger.log(`Loaded ${MOD_NAME}! Version: ${MOD_VERSION}`);\n}\n\n\n/**\n * Registers and starts all modules.\n * Runs `init()`, `load()`, and `run()` for each module in order.\n */\nfunction initModules(modulesToRegister: BaseModule[]): boolean {\n const MOD_NAME = ModSdkManager.ModInfo.name;\n\n for (const module of modulesToRegister) {\n registerModule(module);\n }\n\n for (const module of modules()) {\n module.init();\n }\n\n for (const module of modules()) {\n module.load();\n }\n\n for (const module of modules()) {\n module.run();\n }\n\n deepLibLogger.debug(`Modules Loaded for ${MOD_NAME}.`);\n return true;\n}\n\n/** \n * Cleans up and removes the mod from memory.\n * Calls `unload()` on all modules and removes the global loaded flag.\n */\nexport function unloadMod(): true {\n const MOD_NAME = ModSdkManager.ModInfo.name;\n unloadModules();\n\n delete (window as any)[MOD_NAME + 'Loaded'];\n deepLibLogger.debug(`Unloaded ${MOD_NAME}.`);\n return true;\n}\n\n/** Calls the `unload()` lifecycle method on all registered modules. */\nfunction unloadModules() {\n for (const module of modules()) {\n module.unload();\n }\n}\n", "import { BaseModule } from '../deeplib';\n\n/**\n * Global registry of all loaded modules, keyed by their class name.\n *\n * The map is populated via {@link registerModule} and accessed via {@link modules} or {@link getModule}.\n * This is the central storage for active `BaseModule` instances during the mod lifecycle.\n */\nexport const modulesMap: Map<string, BaseModule> = new Map<string, BaseModule>();\n\n/**\n * Retrieves all registered module instances.\n *\n * @returns An array containing every module currently stored in {@link modulesMap}.\n *\n * @remarks\n * The returned array is a **shallow copy** of the `Map` values, meaning that\n * changes to the array do not affect the registry itself.\n *\n * @example\n * ```ts\n * for (const mod of modules()) {\n * mod.run();\n * }\n * ```\n */\nexport function modules(): BaseModule[] {\n return [...modulesMap.values()];\n}\n\n\n/**\n * Registers a module instance in the global registry.\n * \n * @returns The same module instance passed in, for chaining or immediate use.\n *\n * @remarks\n * - If a module with the same constructor name already exists, it will be **overwritten**.\n * - Keys are based on the class name (`module.constructor.name`), so name collisions are possible\n * if two different classes share the same name.\n *\n * @example\n * ```ts\n * registerModule(new MyGlobalModule());\n * ```\n */\nexport function registerModule<T extends BaseModule>(module: T): T {\n modulesMap.set(module.constructor.name, module);\n return module;\n}\n\n\n/**\n * Retrieves a registered module by its type name.\n *\n * @returns The matching module instance cast to type `T`, or `undefined` if not found.\n *\n * @remarks\n * This function does not perform runtime type checks. If the type parameter `T`\n * does not match the actual module type, you may get runtime errors when using the result.\n *\n * @example\n * ```ts\n * const themeModule = getModule<ThemeModule>('ThemeModule');\n * themeModule?.reloadTheme();\n * ```\n */\nexport function getModule<T extends BaseModule>(moduleType: string): T {\n return modulesMap.get(moduleType) as T;\n}\n", "/**\n * Abstract base class for versioned migration handlers.\n *\n * A migrator is responsible for upgrading or transforming stored data\n * when the mod version changes. Each migrator targets a specific version\n * and executes its {@link migrate} method once when needed.\n *\n * @remarks\n * To create a new migrator:\n * 1. Extend `BaseMigrator`.\n * 2. Implement the {@link migrationVersion} getter to return the target version string.\n * 3. Implement {@link migrate} with the migration logic (e.g., data structure changes).\n */\nexport abstract class BaseMigrator {\n\n /**\n * Gets the target version string for this migration.\n *\n * @remarks\n * - This should exactly match the version format used by the mod\n * - Used by the migration system to determine if this migration should be executed.\n */\n abstract get migrationVersion(): string;\n\n /**\n * Executes the migration logic for this version.\n *\n * @remarks\n * - Called once when upgrading from a version earlier than {@link migrationVersion}.\n * - Should handle any necessary data transformations, cleanup, or initialization\n * to bring the mod's state up to date with the new version.\n * - Must be idempotent \u2014 running it multiple times should not cause data corruption.\n */\n abstract migrate(): void;\n}\n", "import { BaseModule, BaseSubscreen, MainMenu, modules, setSubscreen } from '../deeplib';\n\n/** Options for configuring a mod's main button in the extensions menu. */\ntype GuiOptions = {\n\n /**\n * Unique identifier for the mod's settings button.\n * Used internally by the preference system to track the button.\n */\n identifier: string;\n\n /**\n * The label displayed on the settings button.\n * Can be a string or a function that returns a string dynamically.\n */\n buttonText: string | (() => string);\n\n /** \n * The path to or Base64 data of the icon for the settings button.\n * Can be a string or a function that returns a string dynamically.\n */\n image: string | (() => string);\n \n /**\n * The main menu screen for the mod.\n */\n mainMenu?: typeof MainMenu;\n};\n\n/**\n * Central mod GUI controller that manages all subscreens.\n *\n * This module is responsible for:\n * - Registering the mod's settings button in the game's preferences.\n * - Managing subscreens (including settings screens for all registered modules).\n * - Routing lifecycle events (load, run, click, exit, unload) to the active subscreen.\n */\nexport class GUI extends BaseModule {\n /** The singleton instance of the GUI controller. */\n static instance: GUI | null = null;\n\n /** All subscreens managed by this GUI, including the main menu and module settings screens. */\n private _subscreens: BaseSubscreen[];\n /** The mod's main menu screen. */\n private _mainMenu: MainMenu;\n /** Options defining how the mod's settings button is displayed and behaves. */\n private _modButtonOptions: GuiOptions | null;\n\n /** Returns all registered subscreens. */\n get subscreens(): BaseSubscreen[] {\n return this._subscreens;\n }\n\n /** Returns the main menu subscreen instance. */\n get mainMenu(): MainMenu {\n return this._mainMenu;\n }\n\n /** \n * Creates the GUI instance and initializes the main menu. \n * \n * @throws If another `GUI` instance already exists.\n */\n constructor(guiOptions: GuiOptions | null = null) {\n super();\n if (GUI.instance) {\n throw new Error('Duplicate initialization');\n }\n\n for (const module of modules()) {\n if (!module.settingsScreen) continue;\n }\n\n this._mainMenu = guiOptions?.mainMenu ? new guiOptions.mainMenu(this) : new MainMenu(this);\n this._subscreens = [this._mainMenu];\n this._modButtonOptions = guiOptions;\n\n GUI.instance = this;\n }\n\n /**\n * Loads the GUI and registers the mod's settings button in the extensions menu.\n *\n * - Creates subscreens for each module's settings screen.\n * - Registers lifecycle callbacks for subscreens events.\n * - Sets up the main menu and its subscreens.\n */\n load(): void {\n if (!this._modButtonOptions) return;\n \n for (const module of modules()) {\n if (!module.settingsScreen) continue;\n\n this._subscreens.push(new module.settingsScreen(module));\n }\n\n this._mainMenu.subscreens = this._subscreens;\n\n PreferenceRegisterExtensionSetting({\n Identifier: this._modButtonOptions.identifier,\n ButtonText: this._modButtonOptions.buttonText,\n Image: this._modButtonOptions.image,\n load: async () => {\n await setSubscreen(this._mainMenu);\n },\n run: () => {},\n click: () => {},\n exit: () => {},\n });\n }\n}\n", "import { BaseMigrator, BaseModule, ModSdkManager, deepLibLogger, getText, modStorage } from '../deeplib';\n\nexport type VersionModuleOptions = {\n newVersionMessage?: string;\n beforeEach?: () => void;\n afterEach?: () => void;\n beforeAll?: () => void;\n afterAll?: () => void;\n};\n\n/**\n * Handles version tracking, new version detection, and version-based migrations\n * for the mod. Also manages displaying a \"new version\" message to players and\n * executing registered migration routines when an update occurs.\n * \n * **Key Responsibilities:**\n * - Track and store the current mod version in persistent player storage.\n * - Detect if the mod has been updated since the last session.\n * - Run version-specific migrations via registered `BaseMigrator` instances.\n * - Optionally display a message to the user upon detecting a new version.\n */\nexport class VersionModule extends BaseModule {\n /** Whether the current session is running a new version compared to stored data */\n private static isItNewVersion: boolean = false;\n\n /** The current mod version (retrieved from `ModSdkManager.ModInfo.version`) */\n private static version: string;\n\n /** Message to display when a new version is detected */\n private static newVersionMessage?: string = '';\n\n /** List of registered migration handlers, sorted by version */\n private static migrators: BaseMigrator[] = [];\n\n /** Optional lifecycle hook. Runs before each migration */\n private static beforeEach?: () => void;\n /** Optional lifecycle hook. Runs after each migration */\n private static afterEach?: () => void;\n /** Optional lifecycle hook. Runs before all migrations */\n private static beforeAll?: () => void;\n /** Optional lifecycle hook. Runs after all migrations */\n private static afterAll?: () => void;\n\n constructor(options: VersionModuleOptions) {\n super();\n\n VersionModule.newVersionMessage = options.newVersionMessage;\n\n VersionModule.beforeEach = options.beforeEach;\n VersionModule.afterEach = options.afterEach;\n VersionModule.beforeAll = options.beforeAll;\n VersionModule.afterAll = options.afterAll;\n }\n\n /**\n * Initializes the module on load:\n * - Stores the current mod version.\n * - Hooks into `ChatRoomSync` to show a \"new version\" message when applicable.\n */\n load(): void {\n VersionModule.version = ModSdkManager.ModInfo.version;\n\n VersionModule.checkVersionUpdate();\n\n if (modStorage.playerStorage.GlobalModule.doShowNewVersionMessage && VersionModule.isItNewVersion) {\n VersionModule.sendNewVersionMessage();\n }\n }\n\n /**\n * Checks if the stored version differs from the current version.\n * If a new version is detected:\n * - Flags the session as updated.\n * - Runs applicable migrations.\n * - Updates stored version in player data.\n * - Saves `modStorage`.\n */\n private static checkVersionUpdate() {\n const previousVersion = VersionModule.loadVersion();\n const currentVersion = VersionModule.version;\n\n if (VersionModule.isNewVersion(previousVersion, currentVersion)) {\n VersionModule.isItNewVersion = true;\n VersionModule.checkVersionMigration();\n VersionModule.saveVersion();\n }\n\n modStorage.save();\n }\n\n /**\n * Executes migrations for all registered migrators whose `MigrationVersion`\n * is newer than the previously stored version.\n */\n private static checkVersionMigration() {\n const previousVersion = VersionModule.loadVersion();\n const toMigrate = VersionModule.migrators.filter(m =>\n VersionModule.isNewVersion(previousVersion, m.migrationVersion)\n );\n\n if (!toMigrate.length) return;\n\n VersionModule.beforeAll?.();\n\n for (const migrator of toMigrate) {\n VersionModule.beforeEach?.();\n\n migrator.migrate();\n deepLibLogger.info(\n `Migrating ${ModSdkManager.ModInfo.name} from ${previousVersion} to ${migrator.migrationVersion} with ${migrator.constructor.name}`\n );\n\n VersionModule.afterEach?.();\n }\n\n VersionModule.afterAll?.();\n }\n\n /**\n * Registers a new migrator for handling version-specific changes.\n * Migrators are sorted by their `MigrationVersion` in ascending order.\n */\n static registerMigrator(migrator: BaseMigrator) {\n VersionModule.migrators.push(migrator);\n\n VersionModule.migrators.sort((a, b) => a.migrationVersion.localeCompare(b.migrationVersion));\n }\n\n /** Sends the currently configured \"new version\" message to the local player. */\n static sendNewVersionMessage() {\n if (!VersionModule.newVersionMessage) return;\n \n const beepLogLength = FriendListBeepLog.push({\n MemberNumber: Player.MemberNumber,\n MemberName: ModSdkManager.ModInfo.name,\n ChatRoomName: getText('module.version.version_update'),\n ChatRoomSpace: 'X',\n Private: false,\n Sent: false,\n Time: new Date(),\n Message: VersionModule.newVersionMessage\n });\n\n const beepIdx = beepLogLength - 1;\n const title = CommonStringPartitionReplace(getText('module.version.new_version_toast_title'), {\n $modName$: ModSdkManager.ModInfo.name,\n $modVersion$: VersionModule.version\n }).join('');\n const data = FriendListBeepLog[beepIdx];\n\n ServerShowBeep(VersionModule.newVersionMessage, 10000, {\n memberNumber: data.MemberNumber,\n memberName: data.MemberName,\n chatRoomName: data.ChatRoomName,\n ...(data.Message && {\n onClick: () => {\n FriendListShowBeep(beepIdx);\n }\n })\n }, title);\n }\n\n /**\n * Determines if a given `candidate` version is newer than the `current` version.\n * \n * Version strings are expected in `MAJOR.MINOR.PATCH` format.\n */\n private static isNewVersion(current: string | undefined, candidate: string) {\n if (current !== undefined) {\n const CURRENT_ = current.split('.'),\n CANDIDATE_ = candidate.split('.');\n for (let i = 0; i < 3; i++) {\n if (CURRENT_[i] === CANDIDATE_[i]) {\n continue;\n }\n return CANDIDATE_[i] > CURRENT_[i];\n }\n }\n if (current === undefined || current === '' || !current) {\n return true;\n }\n return false;\n }\n\n /** Saves the current mod version into persistent player storage. */\n private static saveVersion() {\n if (modStorage.playerStorage) {\n Player[ModSdkManager.ModInfo.name].Version = VersionModule.version;\n }\n }\n\n /** Loads the stored mod version from persistent player storage. */\n private static loadVersion() {\n return modStorage.playerStorage?.Version;\n }\n}\n", "\nimport { Button, Checkbox, Dropdown, Input, Label, SettingElement } from '../base/elements_typings';\nimport { BaseSubscreen, deepLibLogger, SubscreenOptions } from '../deeplib';\n\nexport class GuiDebug extends BaseSubscreen {\n\n protected static override subscreenOptions: SubscreenOptions = {\n name: 'debug',\n };\n\n get pageStructure(): SettingElement[][] {\n return [[\n <Button>{\n type: 'button',\n id: 'test-deeplib-big-button',\n options: {\n label: 'Big Button',\n tooltip: 'This is a big button',\n image: 'Icons/Exit.png',\n },\n size: [405, 80],\n onClick() {\n deepLibLogger.info('Big Button Clicked');\n }\n },\n <Button>{\n type: 'button',\n id: 'test-deeplib-small-button',\n options: {\n tooltip: 'This is a small button',\n image: 'Icons/Exit.png',\n },\n size: [90, 90],\n onClick() {\n deepLibLogger.info('Small Button Clicked');\n }\n },\n <Checkbox>{\n type: 'checkbox',\n id: 'test-deeplib-checkbox',\n label: 'Checkbox',\n description: 'This is a checkbox',\n setElementValue() {\n return true;\n },\n setSettingValue(val: boolean) {\n deepLibLogger.info('Checkbox value:', val);\n },\n },\n <Input>{\n type: 'text',\n id: 'test-deeplib-text-input',\n label: 'Input',\n description: 'This is a text input',\n setElementValue() {\n return 'Input Value';\n },\n setSettingValue(val: string) {\n deepLibLogger.info('Input value:', val);\n },\n },\n <Input>{\n type: 'number',\n id: 'test-deeplib-number-input',\n label: 'Input',\n description: 'This is a number input',\n setElementValue() {\n return '123';\n },\n setSettingValue(val: string) {\n deepLibLogger.info('Input value:', val);\n },\n },\n <Label>{\n type: 'label',\n id: 'test-deeplib-label',\n label: 'Label',\n description: 'This is a label',\n }\n ],\n [\n <Button>{\n type: 'button',\n id: 'test-deeplib-big-button2',\n options: {\n label: 'Big Button',\n tooltip: 'This is a big button',\n image: 'Icons/Exit.png',\n },\n size: [405, 80],\n onClick() {\n deepLibLogger.info('Big Button Clicked');\n }\n },\n <Button>{\n type: 'button',\n id: 'test-deeplib-small-button2',\n options: {\n tooltip: 'This is a small button',\n image: 'Icons/Next.png',\n },\n size: [90, 90],\n onClick() {\n deepLibLogger.info('Small Button Clicked');\n }\n },\n <Checkbox>{\n type: 'checkbox',\n id: 'test-deeplib-checkbox2',\n label: 'Checkbox',\n description: 'This is a checkbox',\n setElementValue() {\n return true;\n },\n setSettingValue(val: boolean) {\n deepLibLogger.info('Checkbox value:', val);\n },\n },\n <Input>{\n type: 'text',\n id: 'test-deeplib-text-input2',\n label: 'Input',\n description: 'This is a text input',\n setElementValue() {\n return 'Input Value';\n },\n setSettingValue(val: string) {\n deepLibLogger.info('Input value:', val);\n },\n },\n <Input>{\n type: 'number',\n id: 'test-deeplib-number-input2',\n label: 'Input',\n description: 'This is a number input',\n setElementValue() {\n return '123';\n },\n setSettingValue(val: string) {\n deepLibLogger.info('Input value:', val);\n },\n },\n <Label>{\n type: 'label',\n id: 'test-deeplib-label2',\n label: 'Label',\n description: 'This is a label',\n },\n <Dropdown>{\n type: 'dropdown',\n id: 'test-deeplib-dropdown',\n label: 'Dropdown',\n description: 'This is a dropdown',\n optionsList: ['Option 1', 'Option 2', 'Option 3'],\n setElementValue() {\n return 'Option 2';\n },\n setSettingValue(val: string) {\n deepLibLogger.info('Dropdown value:', val);\n },\n options: {\n width: 200,\n }\n }\n ]];\n }\n}\n", "type PlainObject = Record<string, unknown>;\n\nfunction isPlainObject(value: unknown): value is PlainObject {\n return (\n value !== null &&\n typeof value === 'object' &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\n/**\n * Deeply merges two values into a new value.\n * - Arrays are concatenated.\n * - Plain objects are merged recursively.\n * - Other values are replaced by `source`.\n */\nexport function deepMerge<T, U>(target: T, source: U): T & U {\n if (target === undefined) return source as T & U;\n if (source === undefined) return target as T & U;\n\n if (Array.isArray(target) && Array.isArray(source)) {\n return [...target, ...source] as unknown as T & U;\n }\n\n if (isPlainObject(target) && isPlainObject(source)) {\n const result: PlainObject = { ...target };\n\n for (const key of Object.keys(source)) {\n // Protect against prototype pollution\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n continue;\n }\n\n result[key] = key in target\n ? deepMerge((target as PlainObject)[key], source[key])\n : source[key];\n }\n\n return result as T & U;\n }\n\n return source as T & U;\n}\n\n/**\n * Returns a new array with elements of the input array shuffled.\n * Uses something-something shuffle algorithm by splicing from a cloned array.\n */\nexport function shuffleArray(array: string[]) {\n const temp: string[] = JSON.parse(JSON.stringify(array));\n const ret: string[] = [];\n\n while (temp.length > 0) {\n const d = Math.floor(Math.random() * temp.length);\n ret.push(temp[d]);\n temp.splice(d, 1);\n }\n\n return ret;\n}\n\n/**\n * Exports a value to the global object under a nested namespace path.\n * Creates intermediate objects if they do not exist.\n * \n * Example: `exportToGlobal('MyMod.Utils', value)` creates `globalThis.MyMod.Utils = value`.\n */\nexport function exportToGlobal(name: string, value: any): void {\n const keys = name.split('.');\n let current = globalThis as any;\n\n for (let i = 0; i < keys.length - 1; i++) {\n if (!current[keys[i]]) {\n current[keys[i]] = {};\n }\n current = current[keys[i]];\n }\n\n current[keys[keys.length - 1]] = value;\n}\n\n\n/**\n * Deeply merges only matching properties from `mergeFrom` into `mergeTo`.\n * Properties not present in `mergeTo` are ignored.\n * Objects are recursively merged, primitive properties overwritten.\n */\nexport function deepMergeMatchingProperties<T extends object>(mergeTo: T, mergeFrom: T): T {\n const mergedObject = { ...mergeTo };\n\n for (const key in mergeFrom) {\n if (mergeFrom[key] !== null && typeof mergeFrom[key] === 'object') {\n (mergedObject as any)[key] = deepMergeMatchingProperties(mergedObject[key] || {}, mergeFrom[key]);\n } else if (key in mergedObject) {\n (mergedObject as any)[key] = mergeFrom[key];\n }\n }\n\n return mergedObject;\n}\n\n/** Checks if the given property has a getter defined on the object or its prototype chain. */\nexport function hasGetter<T extends object>(obj: T, prop: keyof T | string): boolean {\n while (obj && obj !== Object.prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor?.get) return true;\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n}\n\n/** Checks if the given property has a setter defined on the object or its prototype chain. */\nexport function hasSetter<T extends object>(obj: T, prop: keyof T | string): boolean {\n while (obj && obj !== Object.prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n if (descriptor?.set) return true;\n obj = Object.getPrototypeOf(obj);\n }\n return false;\n}\n\n/**\n * Converts bytes to kilobytes. \n */\nexport const byteToKB = (nByte: number) => Math.round(nByte / 100) / 10;\n", "import { Button, Checkbox, Custom, Dropdown, Input, Label } from '../../base/elements_typings';\nimport { BaseSubscreen, getText } from '../../deeplib';\nimport { deepMerge } from '../common';\n\n/**\n * Collection of element creation utilities.\n * Provides convenience wrappers for generating commonly used UI elements.\n */\nexport const advElement = {\n createButton: elementCreateButton,\n createCheckbox: elementCreateCheckbox,\n createInput: elementCreateInput,\n createLabel: elementCreateLabel,\n createCustom: elementCreateCustom,\n createDropdown: elementCreateDropdown,\n\n createTooltip: elementCreateTooltip,\n getTooltip: elementGetTooltip,\n setTooltip: elementSetTooltip,\n\n createBackNext: elementPrevNext,\n};\n\nfunction elementCreateButton(options: Omit<Button, 'type'>): HTMLButtonElement {\n options.id ??= ElementGenerateID();\n const elem = document.getElementById(options.id) as HTMLButtonElement;\n\n if (elem) return elem;\n\n (options as Button).type = 'button';\n let image = undefined;\n\n if (options.options?.image) {\n image = options.options.image;\n options.options.image = undefined;\n }\n\n const disabled = typeof options?.disabled === 'function' ? options?.disabled() : options?.disabled;\n\n const button = ElementButton.Create(\n options.id,\n options?.onClick ?? (() => { }),\n deepMerge({\n labelPosition: 'center',\n }, options.options),\n deepMerge({\n button: {\n classList: ['deeplib-button'],\n attributes: {\n disabled: disabled,\n },\n children: [\n image ? deepMerge({\n tag: 'img',\n attributes: {\n id: `${options.id}-image`,\n alt: '',\n decoding: 'async',\n loading: 'lazy',\n src: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' // 1x1 transparent image to get rid of broken image\n },\n style: {\n '--image': `url(\"${image}\")`,\n },\n }, options.htmlOptions?.img) : undefined,\n ],\n },\n }, options.htmlOptions ?? {}));\n\n BaseSubscreen.currentElements.push([button, options as Button]);\n\n return button;\n};\n\nfunction elementCreateCheckbox(options: Omit<Checkbox, 'type'>) {\n const elem = document.getElementById(options.id);\n\n if (elem) return elem;\n\n (options as Checkbox).type = 'checkbox';\n\n const disabled = typeof options?.disabled === 'function' ? options?.disabled() : options?.disabled;\n\n const retElem = ElementCreate(deepMerge({\n tag: 'div',\n classList: ['deeplib-checkbox-container'],\n attributes: {\n id: `${options.id}-container`,\n },\n children: [\n deepMerge({\n tag: 'input',\n classList: ['checkbox', 'deeplib-input'],\n attributes: {\n type: 'checkbox',\n id: options.id,\n disabled: disabled,\n checked: options?.setElementValue?.() || undefined,\n },\n eventListeners: {\n change: function () {\n options?.setSettingValue?.(this.checked);\n }\n }\n } as HTMLOptions<'input'>, options.htmlOptions?.checkbox),\n deepMerge({\n tag: 'label',\n classList: ['deeplib-text'],\n attributes: {\n for: options.id,\n },\n children: [options.label]\n } as HTMLOptions<'label'>, options.htmlOptions?.label),\n ],\n } as HTMLOptions<'div'>, options.htmlOptions?.container));\n\n if (options.description) {\n retElem.addEventListener('mouseover', () => {\n elementSetTooltip(options.description || '');\n });\n\n retElem.addEventListener('mouseout', () => {\n elementSetTooltip('');\n });\n }\n\n BaseSubscreen.currentElements.push([retElem, options as Checkbox]);\n\n return retElem;\n}\n\nfunction elementCreateCustom(options: Omit<Custom, 'type'>) {\n options.id ??= ElementGenerateID();\n options.htmlOptions.attributes ??= {};\n options.htmlOptions.attributes.id ??= options.id;\n const elem = document.getElementById(options.htmlOptions.attributes.id as string);\n\n if (elem) return elem;\n\n (options as Custom).type = 'custom';\n\n const retElem = ElementCreate(options.htmlOptions);\n\n BaseSubscreen.currentElements.push([retElem, options as Custom]);\n\n return retElem;\n}\n\nfunction elementCreateInput(options: Input) {\n const elem = document.getElementById(options.id);\n\n if (elem) return elem;\n\n const disabled = typeof options?.disabled === 'function' ? options?.disabled() : options?.disabled;\n\n const retElem = ElementCreate(deepMerge({\n tag: 'div',\n classList: ['deeplib-input-container'],\n attributes: {\n id: `${options.id}-container`,\n },\n children: [\n deepMerge({\n tag: 'input',\n classList: ['deeplib-input'],\n attributes: {\n type: options.type,\n id: options.id,\n placeholder: ' ',\n disabled: disabled,\n value: options?.setElementValue?.() || undefined,\n },\n eventListeners: {\n input: function () {\n options?.setSettingValue?.(this.value);\n }\n }\n } as HTMLOptions<'input'>, options.htmlOptions?.input),\n options.label ? deepMerge({\n tag: 'label',\n classList: ['deeplib-text'],\n attributes: {\n for: options.id,\n },\n children: [options.label]\n } as HTMLOptions<'label'>, options.htmlOptions?.label) : undefined,\n ],\n } as HTMLOptions<'div'>, options.htmlOptions?.container));\n\n if (options.description) {\n retElem.addEventListener('mouseover', () => {\n elementSetTooltip(options.description || '');\n });\n\n retElem.addEventListener('mouseout', () => {\n elementSetTooltip('');\n });\n }\n\n BaseSubscreen.currentElements.push([retElem, options]);\n\n return retElem;\n}\n\nfunction elementCreateLabel(options: Omit<Label, 'type'>) {\n const elem = document.getElementById(options.id);\n\n if (elem) return elem;\n\n (options as Label).type = 'label';\n\n const retElem = ElementCreate(deepMerge({\n tag: 'span',\n classList: ['deeplib-label', 'deeplib-text'],\n attributes: {\n id: options.id\n },\n children: [\n options.label,\n ],\n } as HTMLOptions<'span'>, options.htmlOptions));\n\n if (options.description) {\n retElem.addEventListener('mouseover', () => {\n elementSetTooltip(options.description || '');\n });\n\n retElem.addEventListener('mouseout', () => {\n elementSetTooltip('');\n });\n }\n\n BaseSubscreen.currentElements.push([retElem, options as Label]);\n\n return retElem;\n}\n\nfunction elementCreateDropdown(options: Omit<Dropdown, 'type'>) {\n options.id ??= ElementGenerateID();\n const elem = document.getElementById(`${options.id}-container`) as HTMLDivElement;\n\n if (elem) return elem;\n\n (options as Dropdown).type = 'dropdown';\n\n const retElem = ElementCreate(deepMerge({\n tag: 'div',\n classList: ['deeplib-dropdown-container'],\n attributes: {\n id: `${options.id}-container`\n },\n children: [\n options.label ? deepMerge({\n tag: 'label',\n classList: ['deeplib-text'],\n attributes: {\n for: options.id,\n },\n children: [options.label]\n } as HTMLOptions<'label'>, options.htmlOptions?.label) : undefined,\n ElementCreateDropdown(\n options.id,\n options.optionsList,\n function () { return options.setSettingValue?.(this.value); },\n options.options,\n options.htmlOptions?.select\n ),\n ],\n eventListeners: {\n mouseover: function () {\n elementSetTooltip(options.description ?? '');\n },\n mouseout: function () {\n elementSetTooltip('');\n }\n }\n } as HTMLOptions<'div'>, options.htmlOptions?.container));\n\n BaseSubscreen.currentElements.push([retElem, options as Dropdown]);\n\n return retElem;\n}\n\nfunction elementCreateTooltip() {\n const element = ElementCreate({\n tag: 'div',\n classList: ['deeplib-tooltip'],\n attributes: {\n id: 'deeplib-tooltip'\n },\n style: {\n display: 'none'\n }\n });\n\n return element;\n}\n\nfunction elementGetTooltip() {\n return document.getElementById('deeplib-tooltip') ?? undefined;\n}\n\nfunction elementSetTooltip(text: string) {\n const element = document.getElementById('deeplib-tooltip');\n\n if (!element) return false;\n\n element.innerHTML = text;\n if (text === '') element.style.display = 'none';\n else element.style.display = '';\n\n return true;\n}\n\ninterface PrevNext {\n id: string,\n initialLabel?: string\n back: (arg0: PrevNextCallbacks) => void,\n initialPrevTooltip?: string,\n next: (arg0: PrevNextCallbacks) => void,\n initialNextTooltip?: string\n};\n\ninterface PrevNextCallbacks {\n setLabel: (label: string) => void,\n setBackTooltip: (tooltip: string) => void,\n setNextTooltip: (tooltip: string) => void\n}\n\nfunction elementPrevNext(options: PrevNext) {\n const elem = document.getElementById(options.id);\n\n if (elem) return elem;\n\n const setLabel = (label: string) => {\n const elem = document.getElementById(`${options.id}-label`);\n if (!elem) return false;\n elem.textContent = label;\n };\n\n const setPrevTooltip = (tooltip: string) => {\n const elem = document.getElementById(`deeplib-prev-next-${options.id}-prev-button-tooltip`);\n if (!elem) return false;\n elem.textContent = tooltip;\n };\n\n const setNextTooltip = (tooltip: string) => {\n const elem = document.getElementById(`deeplib-prev-next-${options.id}-next-button-tooltip`);\n if (!elem) return false;\n elem.textContent = tooltip;\n };\n\n const retElem = ElementCreate({\n tag: 'div',\n classList: ['deeplib-prev-next'],\n attributes: {\n id: options.id\n },\n children: [\n advElement.createButton({\n id: `deeplib-prev-next-${options.id}-prev-button`,\n onClick: () => {\n options.back({\n setLabel: setLabel,\n setBackTooltip: setPrevTooltip,\n setNextTooltip: setNextTooltip,\n });\n },\n htmlOptions: {\n button: {\n classList: ['deeplib-prev-next-button']\n }\n },\n options: {\n noStyling: true,\n image: `${PUBLIC_URL}/dl_images/arrow_left.svg`,\n tooltip: options.initialPrevTooltip,\n }\n }),\n advElement.createLabel({\n id: `${options.id}-label`,\n label: options.initialLabel,\n htmlOptions: {\n classList: ['deeplib-prev-next-label']\n }\n }),\n advElement.createButton({\n id: `deeplib-prev-next-${options.id}-next-button`,\n onClick: () => {\n options.next({\n setLabel: setLabel,\n setBackTooltip: setPrevTooltip,\n setNextTooltip: setNextTooltip,\n });\n },\n htmlOptions: {\n button: {\n classList: ['deeplib-prev-next-button']\n }\n },\n options: {\n noStyling: true,\n image: `${PUBLIC_URL}/dl_images/arrow_right.svg`,\n tooltip: options.initialNextTooltip,\n }\n }),\n ]\n });\n\n return retElem;\n}\n\nexport type ModalButton<T extends string = string> = {\n /** Button label text. */\n text: string\n /** Action identifier returned when the button is clicked. */\n action: T\n /** Whether the button is disabled. */\n disabled?: boolean\n};\n\nexport type ModalInputOptions = {\n /** Default input value. */\n defaultValue?: string\n /** Makes the input read-only if true. */\n readOnly?: boolean\n /** Placeholder text. */\n placeholder?: string\n /** Input type. */\n type: 'input' | 'textarea'\n /** Validation callback to check if the input value is valid. */\n validate?: (value: string) => string | null\n};\n\nexport type ModalOptions<T extends string = string> = {\n /** Content or DOM node displayed in the modal header. */\n prompt: ElementButton.StaticNode\n /** Optional input configuration. */\n input?: ModalInputOptions\n /** Buttons to display in the modal. */\n buttons?: ModalButton<T>[]\n /** Whether clicking backdrop closes the modal (default: true). */\n closeOnBackdrop?: boolean\n /** Auto-close timeout in milliseconds. */\n timeoutMs?: number\n /** Action sent when Escape key is pressed. */\n escapeAction?: T\n /** Action sent when Enter key is pressed. */\n enterAction?: T\n};\n\n/**\n * Modal dialog implementation with queuing, buttons, optional input, and focus trapping.\n * Multiple modals are queued to ensure only one is visible at a time.\n */\nexport class Modal<T extends string = string> {\n private dialog: HTMLDialogElement;\n private blocker: HTMLDivElement;\n private inputEl?: HTMLInputElement | HTMLTextAreaElement;\n private timeoutId?: number;\n\n /** Static modal queue. */\n private static queue: Modal<any>[] = [];\n /** Flag to indicate if a modal is currently being shown. */\n private static processing = false;\n\n constructor(private opts: ModalOptions<T>) {\n opts ??= {} as ModalOptions<T>;\n opts.closeOnBackdrop ??= true;\n\n const promptId = `modal-prompt-${Date.now()}`;\n\n const prompt = (CommonIsArray(opts.prompt) ? opts.prompt : [opts.prompt]).filter(i => i != null) ?? [''];\n\n this.dialog = ElementCreate({\n tag: 'dialog',\n classList: ['deeplib-modal'],\n attributes: {\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': promptId\n },\n style: {\n fontFamily: CommonGetFontName()\n },\n children: [\n {\n tag: 'div',\n classList: ['deeplib-modal-prompt-container'],\n children: [\n ...prompt,\n ]\n },\n {\n tag: 'div',\n classList: ['deeplib-modal-prompt'],\n attributes: {\n id: promptId\n },\n children: [\n opts.input ? this.renderInput(opts.input) : undefined,\n ]\n },\n this.renderButtons()\n ]\n });\n\n this.blocker = this.createBlocker();\n\n this.renderButtons();\n document.body.append(this.createBlocker(), this.dialog);\n this.setupFocusTrap();\n if (opts.timeoutMs) {\n this.timeoutId = window.setTimeout(() => this.close('timeout' as T), opts.timeoutMs);\n }\n }\n\n /**\n * Displays the modal and resolves with the chosen action and input value.\n */\n show(): Promise<[T, string | null]> {\n return Modal.enqueue(this);\n }\n\n /**\n * Shows a simple alert modal with a single \"OK\" button.\n */\n static async alert(msg: ElementButton.StaticNode, timeoutMs?: number) {\n await new Modal({\n prompt: msg,\n buttons: [{ action: 'close', text: getText('modal.button.ok') }],\n timeoutMs,\n escapeAction: 'close',\n }).show();\n }\n\n /**\n * Shows a confirmation modal with \"Cancel\" and \"OK\" buttons.\n * Returns true if \"OK\" is clicked.\n */\n static async confirm(msg: ElementButton.StaticNode) {\n const [action] = await new Modal({\n prompt: msg,\n buttons: [{ text: getText('modal.button.decline'), action: 'decline' }, { text: getText('modal.button.confirm'), action: 'confirm' }],\n escapeAction: 'decline',\n enterAction: 'confirm'\n }).show();\n return action === 'confirm';\n }\n\n /**\n * Shows a prompt modal with an input field and \"Submit\"/\"Cancel\" buttons.\n * Returns the input value if submitted, otherwise null.\n */\n static async prompt(msg: ElementButton.StaticNode, defaultValue = ''): Promise<string | null> {\n const [action, value] = await new Modal({\n prompt: msg,\n timeoutMs: 0,\n input: { type: 'input', defaultValue },\n buttons: [{ text: getText('modal.button.cancel'), action: 'cancel' }, { text: getText('modal.button.submit'), action: 'submit' }],\n escapeAction: 'cancel',\n enterAction: 'submit'\n }).show();\n return action === 'submit' ? value : null;\n }\n\n /** Creates the input element for the modal, applying configuration and validation. */\n private renderInput(cfg: ModalInputOptions) {\n const el = document.createElement(cfg.type);\n el.classList.add('deeplib-modal-input');\n if (cfg.placeholder) el.placeholder = cfg.placeholder;\n if (cfg.readOnly) el.readOnly = true;\n if (cfg.defaultValue) el.value = cfg.defaultValue;\n if (cfg.type === 'textarea') (el as HTMLTextAreaElement).rows = 5;\n el.addEventListener('input', () => {\n const err = cfg.validate?.(el.value);\n el.setCustomValidity(err || '');\n });\n this.inputEl = el;\n\n return el;\n }\n\n /** Creates modal action buttons from configuration. */\n private renderButtons() {\n const container = document.createElement('div');\n container.classList.add('deeplib-modal-button-container');\n\n const btns = this.opts.buttons ? [...this.opts.buttons] : [];\n\n btns.forEach(b => {\n const btn = advElement.createButton({\n id: `deeplib-modal-${b.action}`,\n onClick: () => this.close(b.action),\n options: {\n disabled: b.disabled,\n label: b.text,\n }\n });\n container.append(btn);\n });\n\n return container;\n }\n\n /** Creates the modal backdrop blocker with optional click-to-close behavior. */\n private createBlocker() {\n const blocker = document.createElement('div');\n blocker.classList.add('deeplib-modal-blocker');\n blocker.title = 'Click to close';\n if (this.opts.closeOnBackdrop !== false)\n blocker.addEventListener('click', () => this.close('close' as T));\n\n return blocker;\n }\n\n /** Implements a focus trap to keep keyboard navigation inside the modal. */\n private setupFocusTrap() {\n const focusable = 'button, [href], input, textarea, select, [tabindex]:not([tabindex=\"-1\"])';\n const elements = Array.from(this.dialog.querySelectorAll<HTMLElement>(focusable));\n const first = elements[0];\n const last = elements[elements.length - 1];\n this.dialog.addEventListener('keydown', e => {\n if (e.key === 'Tab') {\n if (elements.length === 0) {\n e.preventDefault();\n return;\n }\n if (e.shiftKey) {\n if (document.activeElement === first) {\n last.focus();\n e.preventDefault();\n }\n } else {\n if (document.activeElement === last) {\n first.focus();\n e.preventDefault();\n }\n }\n } else if (e.key === 'Escape') {\n e.stopPropagation();\n this.close((this.opts.escapeAction ?? 'close') as T);\n } else if (e.key === 'Enter') {\n if (elements.some(el => el === document.activeElement) && document.activeElement !== this.inputEl) return;\n e.preventDefault();\n e.stopPropagation();\n this.close((this.opts.enterAction ?? 'submit') as T);\n }\n });\n window.requestAnimationFrame(() => {\n (this.inputEl || first)?.focus();\n });\n }\n\n /** Closes the modal, cleans up DOM, resolves promise, and shows next queued modal. */\n private close(action: T) {\n if (this.timeoutId) clearTimeout(this.timeoutId);\n this.dialog.close();\n this.dialog.remove();\n this.blocker.remove();\n document.body.querySelector('.deeplib-modal-blocker')?.remove();\n const value = this.inputEl?.value ?? '';\n this.resolve([action, value]);\n Modal.dequeue();\n }\n\n /**\n * An internal function where we will save promise function.\n */\n private resolve: (result: [T, string]) => void = () => { };\n\n /** A function that adds a modal to the queue and returns a promise */\n private static enqueue(modal: Modal<any>): Promise<[any, string]> {\n Modal.queue.push(modal);\n if (!Modal.processing) Modal.dequeue();\n return new Promise(resolve => (modal.resolve = resolve));\n }\n\n /** A function that processes the queue, removing the first modal */\n private static dequeue() {\n const modal = Modal.queue.shift();\n if (modal) {\n Modal.processing = true;\n modal.dialog.show();\n } else {\n Modal.processing = false;\n }\n }\n}\n", "\nimport { BaseSubscreen, byteToKB, getText, GUI, GuiDebug, layout, ModStorage, setSubscreen, SubscreenOptions } from '../deeplib';\nimport { advElement } from '../utilities/elements/elements';\nimport { GuiImportExport } from './import_export';\n\n/**\n * Configuration options for the main menu.\n * \n * If these are defined, new button for each option will be added to the main menu.\n */\nexport type MainMenuOptions = {\n /**\n * Optional URL to the project's repository.\n * Example: \"https://github.com/user/project\"\n */\n repoLink?: string;\n\n /**\n * Optional URL to the project's wiki or documentation.\n * Example: \"https://github.com/user/project/wiki\"\n */\n wikiLink?: string;\n\n /**\n * Optional subscreen to use for the \"reset\" action.\n */\n resetSubscreen?: BaseSubscreen;\n\n /**\n * Optional subscreen for import/export functionality.\n * Provides tools to import or export data to or from the mod.\n */\n importExportSubscreen?: GuiImportExport;\n\n /**\n * Optional boolean flag to enable the mod storage fullness indicator.\n */\n storageFullnessIndicator?: boolean;\n};\n\nexport class MainMenu extends BaseSubscreen {\n subscreens: BaseSubscreen[] = [];\n\n private static options: MainMenuOptions = {};\n\n protected static override subscreenOptions: SubscreenOptions = {\n name: 'mainmenu',\n doShowExitButton: false,\n settingsWidth: 600\n };\n\n constructor(module: GUI) {\n super(module);\n\n this.subscreens = module.subscreens;\n }\n\n load(): void {\n if (!GUI.instance || CurrentModule as string !== 'DeepLibMod') {\n this.setSubscreen(this);\n return;\n }\n\n super.load();\n\n const exitButton = advElement.createButton({\n id: 'exit',\n size: [90, 90],\n onClick: () => {\n this.exit();\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/exit.svg`,\n tooltip: getText('settings.button.back_button_hint')\n }\n });\n\n const menu = document.getElementById('deeplib-nav-menu');\n if (menu) {\n ElementMenu.AppendButton(menu, exitButton);\n }\n\n for (const screen of this.subscreens) {\n\n if (screen.options.name == 'mainmenu') continue;\n\n const button = advElement.createButton({\n id: `${screen.options.name}-button`,\n onClick: () => {\n this.setSubscreen(screen);\n },\n size: [null, 90],\n options: {\n image: screen.options.icon,\n label: getText(`mainmenu.button.${screen.options.name}`),\n }\n });\n\n layout.appendToSettingsDiv(button);\n }\n\n const miscDiv = layout.getMiscDiv();\n layout.appendToSubscreen(miscDiv);\n\n if (MainMenu.options.wikiLink) {\n const wikiButton = advElement.createButton({\n id: 'deeplib-wiki-button',\n onClick: () => {\n window.open(MainMenu.options.wikiLink, '_blank');\n },\n size: [null, 80],\n options: {\n image: `${PUBLIC_URL}/dl_images/notebook.svg`,\n label: getText('mainmenu.button.wiki'),\n }\n });\n layout.appendToMiscDiv(wikiButton);\n }\n\n if (MainMenu.options.repoLink) {\n const repoButton = advElement.createButton({\n id: 'deeplib-repo-button',\n onClick: () => {\n window.open(MainMenu.options.repoLink, '_blank');\n },\n size: [null, 80],\n options: {\n image: `${PUBLIC_URL}/dl_images/git.svg`,\n label: getText('mainmenu.button.repo'),\n }\n });\n layout.appendToMiscDiv(repoButton);\n }\n\n if (MainMenu.options.resetSubscreen) {\n const resetButton = advElement.createButton({\n id: 'deeplib-reset-button',\n onClick: () => {\n this.setSubscreen(MainMenu.options.resetSubscreen!);\n },\n size: [null, 80],\n options: {\n image: `${PUBLIC_URL}/dl_images/trash_bin.svg`,\n label: getText('mainmenu.button.reset'),\n }\n });\n layout.appendToMiscDiv(resetButton);\n }\n\n if (MainMenu.options.importExportSubscreen) {\n const importExportButton = advElement.createButton({\n id: 'deeplib-import-export-button',\n onClick: () => {\n this.setSubscreen(MainMenu.options.importExportSubscreen!);\n },\n size: [null, 80],\n options: {\n image: `${PUBLIC_URL}/dl_images/transfer.svg`,\n label: getText('mainmenu.button.import_export'),\n }\n });\n layout.appendToMiscDiv(importExportButton);\n }\n\n if (MainMenu.options.storageFullnessIndicator) {\n const maxStorageCapacityKB = 180;\n const currentStorageCapacityKB = byteToKB(ModStorage.measureSize(Player.OnlineSettings));\n const fullness = (currentStorageCapacityKB / maxStorageCapacityKB * 100).toFixed(1);\n\n const storageFullnessWrapper = advElement.createButton({\n id: CommonGenerateUniqueID(),\n size: [null, 80],\n options: {\n tooltipPosition: 'left',\n noStyling: true,\n tooltip: CommonStringPartitionReplace(getText('mainmenu.meter.storage_hint'), {\n $percentage$: `${fullness}`\n }).join(''),\n label: CommonStringPartitionReplace(getText('mainmenu.meter.storage_label'), {\n $currentCapacity$: `${currentStorageCapacityKB}`,\n $maxCapacity$: `${maxStorageCapacityKB}`,\n }).join(''),\n },\n htmlOptions: {\n button: {\n children: [\n {\n tag: 'div',\n attributes: { id: 'deeplib-storage-meter' },\n children: [\n {\n tag: 'div',\n attributes: { id: 'deeplib-storage-bar' },\n style: { width: `${fullness}%` },\n },\n ]\n }\n ]\n }\n }\n });\n layout.appendToMiscDiv(storageFullnessWrapper);\n }\n\n if (IS_DEBUG) {\n const debugButton = advElement.createButton({\n id: 'deeplib-debug-button',\n onClick: () => {\n this.setSubscreen(new GuiDebug());\n },\n size: [90, 90],\n options: {\n image: `${PUBLIC_URL}/dl_images/bug.svg`,\n }\n });\n if (menu) {\n ElementMenu.PrependItem(menu, debugButton);\n }\n }\n }\n\n run() {\n super.run();\n }\n\n click() { }\n\n exit(): void {\n CharacterAppearanceForceUpCharacter = -1;\n CharacterLoadCanvas(Player);\n\n const returnScreen = typeof this.options.returnScreen === 'function' ? this.options.returnScreen() : this.options.returnScreen;\n\n if (!returnScreen) {\n PreferenceOpenSubscreen('Extensions').then(() => {\n PreferenceSubscreenExtensionsClear();\n });\n } else if (returnScreen instanceof BaseSubscreen) {\n setSubscreen(returnScreen ?? null).then(() => {\n });\n } else if (Array.isArray(returnScreen)) {\n CommonSetScreen(...returnScreen);\n }\n }\n\n resize(): void {\n super.resize();\n ElementSetPosition('deeplib-misc', 1905, 930, 'bottom-right');\n ElementSetSize('deeplib-misc', 405, null);\n }\n\n static setOptions(mainMenuOptions: MainMenuOptions) {\n MainMenu.options = mainMenuOptions;\n }\n}\n\n/**\n * Open a specific subscreen. \n */\n// TODO - Remove after R120. \nasync function PreferenceOpenSubscreen(subscreen: PreferenceSubscreenName, page: number = 1) {\n if (CurrentModule !== 'Character' || CurrentScreen !== 'Preference') {\n await CommonSetScreen('Character', 'Preference');\n }\n PreferenceSubscreen?.unload?.();\n\n PreferenceSubscreen = PreferenceSubscreens.find(s => s.name === subscreen) ?? null;\n if (!CommonIsNonNegativeInteger(page)) page = 1;\n PreferencePageCurrent = page;\n PreferenceMessage = '';\n PreferenceSubscreen?.load?.();\n}", "\nimport { BaseSubscreen, ModSdkManager, getText, layout, SettingsModel, modStorage, deepLibLogger, SubscreenOptions } from '../deeplib';\nimport { advElement, Modal } from '../utilities/elements/elements';\n\n/**\n * Configuration options for the {@link GuiImportExport} class.\n */\nexport type ImportExportOptions = {\n /** \n * A custom save file extension (e.g., \".mydata\"). \n * If it doesn't start with a dot, it will be automatically prefixed.\n */\n customFileExtension: string;\n\n /** Optional callback invoked after data has been successfully imported. */\n onImport?: () => void;\n\n /** Optional callback invoked after data has been successfully exported. */\n onExport?: () => void;\n};\n\n/**\n * Possible data transfer methods for import/export operations.\n * - `clipboard`: Uses the system clipboard.\n * - `file`: Uses file save/load dialogs.\n */\ntype DataTransferMethod = 'clipboard' | 'file';\n\n/**\n * GUI screen for importing and exporting mod data.\n * Provides buttons to import/export data either via file or clipboard.\n */\nexport class GuiImportExport extends BaseSubscreen {\n private importExportOptions: ImportExportOptions;\n\n static override subscreenOptions: SubscreenOptions = {\n name: 'import-export',\n };\n\n constructor(importExportOptions: ImportExportOptions) {\n super();\n this.importExportOptions = importExportOptions;\n }\n\n load(): void {\n\n super.load();\n\n const importFromFileButton = advElement.createButton({\n id: 'deeplib-import-file-button',\n size: [600, 90],\n onClick: () => {\n this.dataImport('file');\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/file_import.svg`,\n label: getText('import-export.button.import_file')\n }\n });\n layout.appendToSettingsDiv(importFromFileButton);\n\n const exportToFileButton = advElement.createButton({\n id: 'deeplib-export-file-button',\n size: [600, 90],\n onClick: () => {\n this.dataExport('file');\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/file_export.svg`,\n label: getText('import-export.button.export_file')\n }\n });\n layout.appendToSettingsDiv(exportToFileButton);\n\n const importFromClipboardButton = advElement.createButton({\n id: 'deeplib-import-clipboard-button',\n size: [600, 90],\n onClick: () => {\n this.dataImport('clipboard');\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/clipboard_import.svg`,\n label: getText('import-export.button.import_clipboard')\n }\n });\n layout.appendToSettingsDiv(importFromClipboardButton);\n\n const exportToClipboardButton = advElement.createButton({\n id: 'deeplib-export-clipboard-button',\n size: [600, 90],\n onClick: () => {\n this.dataExport('clipboard');\n },\n options: {\n image: `${PUBLIC_URL}/dl_images/clipboard_export.svg`,\n label: getText('import-export.button.export_clipboard')\n }\n });\n layout.appendToSettingsDiv(exportToClipboardButton);\n }\n\n resize(): void {\n super.resize();\n }\n\n /** Exports the mod data using the specified method. */\n async dataExport(transferMethod: DataTransferMethod) {\n try {\n const data = LZString.compressToBase64(JSON.stringify(modStorage.playerStorage));\n\n if (transferMethod === 'clipboard') {\n await this.exportToClipboard(data);\n } else if (transferMethod === 'file') {\n await this.exportToFile(data, 'themed_settings');\n }\n\n this.importExportOptions.onExport?.();\n ToastManager.success('Data exported successfully.');\n } catch (error) {\n ToastManager.error('Data export failed.');\n deepLibLogger.error(`Data export failed for ${ModSdkManager.ModInfo.name}.`, error,);\n }\n }\n\n /** Imports mod data using the specified method. */\n async dataImport(transferMethod: DataTransferMethod) {\n try {\n let importedData: string | null = '';\n\n if (transferMethod === 'clipboard') {\n importedData = await this.importFromClipboard() ?? null;\n } else if (transferMethod === 'file') {\n importedData = await this.importFromFile() ?? null;\n }\n\n if (!importedData) {\n throw new Error('No data imported.');\n }\n\n const data = JSON.parse(LZString.decompressFromBase64(importedData) ?? '') as SettingsModel;\n\n if (!data) {\n throw new Error('Invalid data.');\n }\n\n modStorage.playerStorage = data;\n this.importExportOptions.onImport?.();\n ToastManager.success('Data imported successfully.');\n } catch (error) {\n ToastManager.error('Data import failed.');\n deepLibLogger.error(`Data import failed for ${ModSdkManager.ModInfo.name}.`, error,);\n }\n }\n\n /** Saves data to a file using the browser's save dialog. */\n async exportToFile(data: string, defaultFileName: string): Promise<void> {\n const CUSTOM_EXTENSION = this.importExportOptions.customFileExtension.startsWith('.')\n ? this.importExportOptions.customFileExtension\n : '.' + this.importExportOptions.customFileExtension;\n\n const suggestedName = defaultFileName.endsWith(CUSTOM_EXTENSION)\n ? defaultFileName\n : defaultFileName + CUSTOM_EXTENSION;\n\n if ('showSaveFilePicker' in window) {\n try {\n const handle = await (window as any).showSaveFilePicker({\n suggestedName: suggestedName,\n types: [\n {\n description: 'Custom Data Files',\n accept: { 'text/plain': [CUSTOM_EXTENSION] },\n },\n ],\n });\n const writable = await handle.createWritable();\n await writable.write(data);\n await writable.close();\n } catch (error: any) {\n throw new Error('File save cancelled or failed: ' + error.message);\n }\n } else {\n const fileName = await Modal.prompt('Enter file name', suggestedName);\n\n if (fileName === null) {\n return;\n } else if (fileName === '') {\n throw new Error('File name cannot be empty.');\n }\n\n const blob = new Blob([data], { type: 'text/plain' });\n const link = ElementCreate({\n tag: 'a',\n attributes: {\n href: URL.createObjectURL(blob),\n download: fileName.endsWith(CUSTOM_EXTENSION) ? fileName : fileName + CUSTOM_EXTENSION\n },\n });\n\n link.click();\n URL.revokeObjectURL(link.href);\n }\n }\n\n /** Opens a file picker and reads the selected file's contents, importing the data. */\n async importFromFile(): Promise<string | null> {\n const CUSTOM_EXTENSION = this.importExportOptions.customFileExtension.startsWith('.')\n ? this.importExportOptions.customFileExtension\n : '.' + this.importExportOptions.customFileExtension;\n\n async function importFromFileInternal(file: File): Promise<string | null> {\n if (!file.name.endsWith(CUSTOM_EXTENSION)) {\n throw new Error(`Invalid file type. Expected a ${CUSTOM_EXTENSION} file.`);\n }\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(new Error('Failed to read file.'));\n reader.readAsText(file);\n });\n }\n\n if ('showOpenFilePicker' in window) {\n try {\n const [fileHandle] = await (window as any).showOpenFilePicker({\n types: [\n {\n description: 'Custom Data Files',\n accept: { 'text/plain': [CUSTOM_EXTENSION] },\n },\n ],\n multiple: false,\n });\n const file = await fileHandle.getFile();\n return await importFromFileInternal(file);\n } catch (error: any) {\n throw new Error('File selection cancelled or failed: ' + error.message);\n }\n } else {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = CUSTOM_EXTENSION;\n input.onchange = async (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n try {\n const data = await importFromFileInternal(file);\n resolve(data);\n } catch (error) {\n reject(error);\n }\n } else {\n reject(new Error('No file selected.'));\n }\n };\n input.click();\n });\n }\n }\n\n /** Copies the given data to the clipboard. */\n async exportToClipboard(data: string): Promise<void> {\n return navigator.clipboard.writeText(data).catch((error) => {\n throw new Error('Failed to copy data to clipboard.' + error);\n });\n }\n\n /** Prompts the user to enter data and returns it. */\n async importFromClipboard(): Promise<string | null> {\n return Modal.prompt('Enter data to import').catch((error) => {\n throw new Error('Failed to read data from clipboard.' + error);\n });\n }\n}\n", "import { ModSdkManager, SettingsModel, deepLibLogger } from '../deeplib';\n\n/**\n * ModStorage is a singleton class responsible for managing\n * mod-specific persistent storage both in player settings\n * and in browser localStorage.\n *\n * It provides methods to load and save mod data compressed\n * as base64 strings, and exposes typed accessors for\n * playerStorage and extensionStorage.\n */\nexport class ModStorage<T extends SettingsModel = SettingsModel> {\n /** Singleton instance of ModStorage */\n private static _instance: ModStorage | null = null;\n /** The unique mod identifier used as key prefix in storage */\n private modName: string;\n\n constructor(modName: string) {\n if (!ModStorage._instance) {\n ModStorage._instance = this;\n this.modName = modName;\n }\n this.modName ??= modName;\n\n return ModStorage._instance as ModStorage<T>;\n }\n\n get playerStorage(): T {\n return Player[this.modName];\n }\n\n set playerStorage(value: T) {\n Player[this.modName] = value;\n }\n\n get extensionStorage(): string {\n return Player.ExtensionSettings[this.modName];\n }\n\n set extensionStorage(value: string) {\n Player.ExtensionSettings[this.modName] = value;\n }\n\n setLocalStorage(key: string, value: object) {\n localStorage.setItem(`${this.modName}_${key}`, ModStorage.dataCompress(value));\n }\n\n getLocalStorage(key: string): object | null {\n const data = localStorage.getItem(`${this.modName}_${key}`);\n\n if (!data) return null;\n\n return ModStorage.dataDecompress<T>(data);\n }\n\n load() {\n if (this.extensionStorage) {\n const parsed = ModStorage.dataDecompress<T>(this.extensionStorage || '');\n if (parsed === null || !Object.hasOwn(parsed, 'Version')) {\n this.playerStorage = {\n Version: ModSdkManager.ModInfo.version\n } as T;\n } else {\n this.playerStorage = parsed;\n };\n } else {\n this.playerStorage = {} as T;\n }\n }\n\n save() {\n if (!this.extensionStorage) this.extensionStorage = '';\n this.extensionStorage = ModStorage.dataCompress(this.playerStorage);\n ServerPlayerExtensionSettingsSync(this.modName);\n }\n\n static dataDecompress<T = object>(string: string): T | null {\n const d = LZString.decompressFromBase64(string as string);\n let data: T | null = null;\n\n try {\n const decoded: T = JSON.parse(d as string);\n data = decoded;\n } catch (error) {\n deepLibLogger.error(error);\n }\n\n return data;\n }\n\n static dataCompress(object: object) {\n return LZString.compressToBase64(JSON.stringify(object));\n }\n\n static measureSize(data: unknown): number {\n try {\n if (typeof data !== 'string') {\n data = JSON.stringify(data) || '';\n }\n \n if (typeof data === 'string') {\n return (new TextEncoder()).encode(data).byteLength;\n }\n\n throw new Error();\n } catch {\n return NaN;\n }\n }\n}\n", "import { SettingElement } from '../../base/elements_typings';\n\nexport const domUtil = {\n /**\n * Automatically sets the position of the element based on the given position.\n * The position can be either a [x, y] tuple or a function returning such a tuple.\n * If both x and y are defined, the element's position is updated accordingly.\n */\n autoSetPosition: autoSetPosition,\n\n /**\n * Automatically sets the size of the element based on the given size.\n * The size can be either a [width, height] tuple or a function returning such a tuple.\n * If both width and height are defined, the element's size is updated accordingly.\n */\n autoSetSize: autoSetSize,\n\n /**\n * Hides the element by setting its CSS display property to 'none'.\n * If the element cannot be found, the function does nothing.\n */\n hide: hide,\n\n /**\n * Unhides the element by clearing its CSS display property (sets it to '').\n * If the element cannot be found, the function does nothing.\n */\n unhide: unhide,\n\n /**\n * Checks if the element has overflow content.\n * Returns an object indicating if there is any overflow,\n * and specifically if there is vertical or horizontal overflow.\n * Returns null if the element is not found.\n */\n hasOverflow: hasOverflow\n};\n\nfunction autoSetPosition(_: ElementHelp.ElementOrId, position: SettingElement['position']) {\n let xPos = undefined;\n let yPos = undefined;\n\n if (Array.isArray(position)) {\n xPos = position[0];\n yPos = position[1];\n } else if (typeof position === 'function') {\n const result = position();\n xPos = result[0];\n yPos = result[1];\n }\n\n if (xPos !== undefined && yPos !== undefined) ElementSetPosition(_, xPos, yPos);\n}\n\nfunction autoSetSize(_: ElementHelp.ElementOrId, size: SettingElement['size']) {\n let width = undefined;\n let height = undefined;\n \n if (Array.isArray(size)) {\n width = size[0];\n height = size[1];\n } else if (typeof size === 'function') {\n const result = size();\n width = result[0];\n height = result[1];\n }\n \n if (width !== undefined && height !== undefined) ElementSetSize(_, width, height);\n}\n\nfunction hide(_: ElementHelp.ElementOrId) {\n const element = ElementWrap(_);\n if (!element) return;\n\n element.style.display = 'none';\n};\n\nfunction unhide(_: ElementHelp.ElementOrId) {\n const element = ElementWrap(_);\n if (!element) return;\n\n element.style.display = '';\n};\n\nfunction hasOverflow(el: ElementHelp.ElementOrId): { any: boolean, vertical: boolean, horizontal: boolean } | null {\n const element = ElementWrap(el);\n if (!element) return null;\n\n const vertical = element.scrollHeight > element.clientHeight;\n const horizontal = element.scrollWidth > element.clientWidth;\n\n return {\n any: vertical || horizontal,\n vertical,\n horizontal,\n };\n}", "export const layout = {\n getSubscreen: elementGetSubscreenDiv,\n appendToSubscreen: elementAppendToSubscreenDiv,\n removeSubscreen: elementRemoveSubscreenDiv,\n\n getSettingsDiv: elementGetSettingsDiv,\n appendToSettingsDiv: elementAppendToSettingsDiv,\n removeSettingsDiv: elementRemoveSettingsDiv,\n\n getMiscDiv: elementGetMiscDiv,\n appendToMiscDiv: elementAppendToMiscDiv,\n removeMiscDiv: elementRemoveMiscDiv\n};\n\nfunction elementGetSubscreenDiv() {\n const subscreenDiv = ElementWrap('deeplib-subscreen');\n if (subscreenDiv) {\n return subscreenDiv;\n }\n\n const div = ElementCreate({\n tag: 'div',\n classList: ['deeplib-subscreen', 'HideOnPopup'],\n attributes: { id: 'deeplib-subscreen' }\n });\n\n return document.body.appendChild(div);\n}\n\nfunction elementRemoveSubscreenDiv() {\n return elementGetSubscreenDiv()?.remove();\n}\n\nfunction elementAppendToSubscreenDiv(...element: HTMLElement[]) {\n return elementGetSubscreenDiv()?.append(...element);\n}\n\nfunction elementGetSettingsDiv() {\n const settingsDiv = ElementWrap('deeplib-settings');\n if (settingsDiv) {\n return settingsDiv;\n }\n\n const div = ElementCreate({\n tag: 'div', \n classList: ['deeplib-settings', 'scroll-box'], \n attributes: { id: 'deeplib-settings' } \n });\n\n return div;\n}\n\nfunction elementAppendToSettingsDiv(...element: HTMLElement[]) {\n return elementGetSettingsDiv()?.append(...element);\n}\n\nfunction elementRemoveSettingsDiv() {\n return elementGetSettingsDiv()?.remove();\n}\n\nfunction elementGetMiscDiv() {\n const miscDiv = ElementWrap('deeplib-misc');\n if (miscDiv) {\n return miscDiv;\n }\n\n const div = ElementCreate({\n tag: 'div', \n classList: ['deeplib-misc'], \n attributes: { id: 'deeplib-misc' }\n });\n\n return div;\n}\n\nfunction elementAppendToMiscDiv(...element: HTMLElement[]) {\n return elementGetMiscDiv()?.append(...element);\n}\n\nfunction elementRemoveMiscDiv() {\n return elementGetMiscDiv()?.remove();\n}\n", "type LogLevel = 'info' | 'log' | 'warn' | 'error' | 'debug';\n\ninterface LogEntry {\n readonly args: readonly any[];\n readonly date: Date;\n readonly logLevel: LogLevel;\n}\n\nexport class Logger extends Array<LogEntry> {\n private ModName: string = 'DeepLib';\n\n constructor(modName?: string) {\n super();\n\n if (modName) {\n this.ModName = modName;\n }\n }\n\n private _Log(level: LogLevel, ...args: any[]): void {\n const logEntry: LogEntry = {\n logLevel: level,\n args: [...args],\n // trace: arguments.callee.caller.toString().split('\\n'), \n date: new Date(Date.now())\n // `[${this.ModName}] ${formattedArgs}` \n };\n\n const userAgent = navigator.userAgent.toLowerCase();\n if (userAgent.includes('chrome') || userAgent.includes('firefox')) {\n const color = Logger.colorizeLog(level);\n args.forEach(arg => {\n if (typeof arg === 'string') {\n arg = `\\n%c${arg}`;\n // args.splice(args.indexOf(arg), 1, arg, color);\n }\n });\n console.log(`%c${this.ModName}:`, color, ...args);\n } else {\n console.log(`${this.ModName}:`, ...args);\n }\n\n this.push(logEntry);\n }\n\n info(...args: any[]): void {\n this._Log('info', ...args);\n }\n\n log(...args: any[]): void {\n this._Log('log', ...args);\n }\n\n warn(...args: any[]): void {\n this._Log('warn', ...args);\n }\n\n error(...args: any[]): void {\n this._Log('error', ...args);\n }\n\n debug(...args: any[]): void {\n this._Log('debug', ...args);\n }\n\n static colorizeLog(logLevel: LogLevel): string {\n const colors: Record<LogLevel, string> = {\n info: 'color: #32CCCC',\n log: 'color: #CCCC32',\n warn: 'color: #eec355',\n error: 'color: #750b0b',\n debug: 'color: #9E4BCF',\n };\n\n return colors[logLevel];\n }\n}\n\nexport const deepLibLogger = new Logger();\n", "export function sendLocalMessage(id: string | null, message: string, timeoutInSeconds?: number) {\n const element = ElementCreate({\n tag: 'div',\n classList: ['ChatMessage', 'deeplib-message', 'ChatMessageNonDialogue'],\n attributes: {\n id: id ?? `DEEPLIB_LOCAL_MESSAGE_${Date.now()}`,\n 'data-time': ChatRoomCurrentTime(),\n 'data-sender': Player.MemberNumber?.toString(),\n },\n children: [\n {\n tag: 'span',\n classList: ['deeplib-text'],\n innerHTML: message.replaceAll('\\n\\t', ''),\n },\n {\n tag: 'br',\n },\n {\n tag: 'a',\n classList: ['deeplib-text'],\n attributes: {\n href: '#',\n },\n innerHTML: '<b>Close (Click)</b>',\n eventListeners: {\n click: () => {\n element.remove();\n },\n },\n }\n ]\n });\n\n ChatRoomAppendChat(element);\n if (!timeoutInSeconds) return;\n setTimeout(() => element.remove(), timeoutInSeconds * 1000);\n}\n\nexport function sendActionMessage(msg: string, target: undefined | number = undefined, dictionary: ChatMessageDictionaryEntry[] = []) {\n if (!msg) return;\n ServerSend('ChatRoomChat', {\n Content: 'DEEPLIB_CUSTOM_ACTION',\n Type: 'Action',\n Target: target ?? undefined,\n Dictionary: [\n { Tag: 'MISSING TEXT IN \"Interface.csv\": DEEPLIB_CUSTOM_ACTION', Text: msg },\n ...dictionary,\n ],\n });\n}\n", "import rawSdkImport from 'bondage-club-mod-sdk';\n\n// What the fuck is this?? \n// It seems that ESBuild breaks things, either when building this package or a final mod\nconst rawSdk = rawSdkImport as any;\nconst bcModSdkRef = (rawSdk.default ?? rawSdk) as ModSDKGlobalAPI;\n\n/**\n * Defines priority levels for hooking functions.\n * Hooks with higher priority are called first in hook chain.\n */\nexport const HookPriority = {\n Observe: 0,\n AddBehavior: 1,\n ModifyBehavior: 5,\n OverrideBehavior: 10,\n Top: 100\n};\n\n/** Type alias representing module of hook? */\nexport type ModuleCategory = number | string;\n\n/**\n * Interface representing data about a patched function,\n * including the function name and all hooks applied to it.\n */\ninterface IPatchedFunctionData {\n name: string;\n hooks: {\n hook: PatchHook;\n priority: number;\n module: ModuleCategory | null;\n removeCallback: () => void;\n }[];\n}\n\n/**\n * Manager class for mod SDK integration,\n * provides methods to register mods, hook functions, and manage patches.\n */\nexport class ModSdkManager {\n private static SDK: ModSDKModAPI;\n private static patchedFunctions: Map<string, IPatchedFunctionData> = new Map();\n\n public static ModInfo: ModSDKModInfo;\n\n /** Registers a mod with the SDK and stores mod information. */\n constructor(info: ModSDKModInfo, options?: ModSDKModOptions) {\n ModSdkManager.SDK = bcModSdkRef.registerMod(info, options);\n ModSdkManager.ModInfo = info;\n }\n\n /** Retrieves or initializes patch data for a given target function. */\n initPatchableFunction(target: string): IPatchedFunctionData {\n let result = ModSdkManager.patchedFunctions.get(target);\n if (!result) {\n result = {\n name: target,\n hooks: []\n };\n ModSdkManager.patchedFunctions.set(target, result);\n }\n return result;\n }\n\n /**\n * Hooks a function with a callback at a given priority. \n * \n * Prevents duplicate hooks.\n */\n hookFunction<TargetName extends string>(\n target: TargetName,\n priority: number,\n hook: PatchHook<GetDotedPathType<typeof globalThis, TargetName>>,\n module: ModuleCategory | null = null\n ): () => void {\n const data = this.initPatchableFunction(target);\n\n if (data.hooks.some((h) => h.hook === hook)) {\n return () => null;\n }\n\n const removeCallback = ModSdkManager.SDK?.hookFunction(target, priority, hook);\n\n data.hooks.push({\n hook,\n priority,\n module,\n removeCallback\n });\n data.hooks.sort((a, b) => b.priority - a.priority);\n\n return removeCallback;\n }\n\n /**\n * Applies patches to a target function.\n * \n * **This method is DANGEROUS** to use and has high potential to conflict with other mods.\n */\n patchFunction(target: string, patches: Record<string, string>): void {\n ModSdkManager.SDK?.patchFunction(target, patches);\n }\n\n /**\n * Removes all patches from a target function.\n */\n unpatchFunction(target: string): void {\n ModSdkManager.SDK?.removePatches(target);\n }\n\n /**\n * Removes all hooks associated with a specific module from a target function.\n */\n removeHookByModule(target: string, module: ModuleCategory): boolean {\n const data = this.initPatchableFunction(target);\n\n for (let i = data.hooks.length - 1; i >= 0; i--) {\n if (data.hooks[i].module === module) {\n data.hooks[i].removeCallback();\n data.hooks.splice(i, 1);\n }\n }\n\n return true;\n }\n\n /**\n * Removes all hooks associated with a specific module across all patched functions.\n */\n removeAllHooksByModule(module: ModuleCategory): boolean {\n for (const data of ModSdkManager.patchedFunctions.values()) {\n for (let i = data.hooks.length - 1; i >= 0; i--) {\n if (data.hooks[i].module === module) {\n data.hooks[i].removeCallback();\n data.hooks.splice(i, 1);\n }\n }\n }\n\n return true;\n }\n}\n", "export const Style = {\n /**\n * Injects a CSS style block directly into the document head using a <style> tag.\n * If a style element with the same `styleId` already exists, it won't inject again.\n */\n injectInline(styleId: string, styleSource: string) {\n const isStyleLoaded = document.getElementById(styleId);\n\n if (isStyleLoaded) return;\n\n const styleElement = document.createElement('style');\n styleElement.id = styleId;\n styleElement.appendChild(document.createTextNode(styleSource));\n document.head.appendChild(styleElement);\n },\n\n /**\n * Injects a CSS stylesheet link into the document head using a <link> tag.\n * If a link element with the same `styleId` already exists, it won't inject again.\n */\n injectEmbed(styleId: string, styleLink: string) {\n const isStyleLoaded = document.getElementById(styleId);\n\n if (isStyleLoaded) return;\n\n const styleElement = document.createElement('link');\n styleElement.id = styleId;\n styleElement.rel = 'stylesheet';\n styleElement.href = styleLink;\n document.head.appendChild(styleElement);\n },\n\n /**\n * Removes a style element from the document head by its ID.\n * Does nothing if the element is not found.\n */\n eject(id: string) {\n const style = document.getElementById(id);\n if (!style) return;\n\n style.remove();\n },\n\n /**\n * Reloads an inline style by removing the existing style element (if any)\n * and injecting the new styles inline again.\n */\n reload(styleId: string, styleSource: string) {\n Style.eject(styleId);\n Style.injectInline(styleId, styleSource);\n },\n\n /** Fetches the text content of a stylesheet or any resource at the given link. */\n async fetch(link: string) {\n return fetch(link).then((res) => res.text());\n }\n};\n", "/**\n * A dictionary type representing translations,\n * where keys are source tags and values are translated strings.\n */\ntype TranslationDict = {\n [key: string]: string;\n};\n\n/**\n * Options for initializing the Localization system.\n */\nexport interface TranslationOptions {\n /** The path to the folder where the translations are stored. */\n pathToTranslationsFolder?: string;\n /** The default language to use. */\n defaultLanguage?: string;\n /** If true, the localization will be fixed to the default language, ignoring user language settings. */\n fixedLanguage?: boolean;\n}\n\n/**\n * Localization class handles loading and retrieving translation strings\n * from library and mod-specific language files.\n */\nexport class Localization {\n private static LibTranslation: TranslationDict = {};\n private static ModTranslation: TranslationDict = {};\n private static PathToModTranslation: string | undefined;\n private static PathToLibTranslation: string = `${PUBLIC_URL}/dl_translations/`;\n private static DefaultLanguage: string = 'en';\n /** Flag to prevent re-initialization */\n private static initialized = false;\n\n /** Initialize the localization system by loading translation files. */\n static async init(initOptions?: TranslationOptions) {\n if (Localization.initialized) return;\n Localization.initialized = true;\n\n Localization.PathToModTranslation = (() => {\n if (!initOptions?.pathToTranslationsFolder) return undefined;\n\n return initOptions.pathToTranslationsFolder.endsWith('/') ?\n initOptions.pathToTranslationsFolder :\n `${initOptions.pathToTranslationsFolder}/`;\n })();\n\n Localization.DefaultLanguage = initOptions?.defaultLanguage || Localization.DefaultLanguage;\n\n const lang = initOptions?.fixedLanguage ? Localization.DefaultLanguage : TranslationLanguage.toLowerCase();\n\n const libTranslation = await Localization.fetchLanguageFile(Localization.PathToLibTranslation, lang);\n if (lang === Localization.DefaultLanguage) {\n Localization.LibTranslation = libTranslation;\n } else {\n const fallbackTranslation = await Localization.fetchLanguageFile(Localization.PathToLibTranslation, Localization.DefaultLanguage);\n Localization.LibTranslation = { ...fallbackTranslation, ...libTranslation };\n }\n\n if (!Localization.PathToModTranslation) return;\n const modTranslation = await Localization.fetchLanguageFile(Localization.PathToModTranslation, lang);\n if (lang === Localization.DefaultLanguage) {\n Localization.ModTranslation = modTranslation;\n } else {\n const fallbackTranslation = await Localization.fetchLanguageFile(Localization.PathToModTranslation, Localization.DefaultLanguage);\n Localization.ModTranslation = { ...fallbackTranslation, ...modTranslation };\n }\n }\n\n /** Get a translated string from mod translations by source tag. */\n static getTextMod(srcTag: string): string | undefined {\n return Localization.ModTranslation?.[srcTag] || undefined;\n }\n\n /** Get a translated string from library translations by source tag. */\n static getTextLib(srcTag: string): string | undefined {\n return Localization.LibTranslation?.[srcTag] || undefined;\n }\n\n /**\n * Fetch and parse a language file from the given base URL and language code.\n * Falls back to default language if the requested language file is unavailable.\n */\n private static async fetchLanguageFile(baseUrl: string, lang: string): Promise<TranslationDict> {\n const response = await fetch(`${baseUrl}${lang}.lang`);\n\n if (lang !== Localization.DefaultLanguage && !response.ok) {\n return this.fetchLanguageFile(baseUrl, Localization.DefaultLanguage);\n }\n\n if (!response.ok) {\n return {};\n }\n\n const langFileContent = await response.text();\n\n return this.parseLanguageFile(langFileContent);\n }\n\n /**\n * Parse the raw content of a language file into a TranslationDict.\n * Ignores empty lines and comments starting with '#'.\n */\n private static parseLanguageFile(content: string): TranslationDict {\n const translations: TranslationDict = {};\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const [key, ...rest] = trimmed.split('=');\n translations[key.trim()] = rest.join('=').trim();\n }\n\n return translations;\n }\n}\n\n/**\n * Retrieve a localized string for the given source tag.\n * First attempts to get the mod-specific translation,\n * then falls back to the library translation,\n * and if neither exist, returns the source tag itself.\n */\nexport const getText = (srcTag: string): string => {\n return Localization.getTextMod(srcTag) || Localization.getTextLib(srcTag) || srcTag;\n};\n", "import { ModSdkManager } from './sdk';\n\ntype DeepLibMessageDictionaryEntry<Type extends string, Data> = {\n type: Type;\n data: Data;\n};\n\ntype Listener<Payload> = (data: Payload, sender: Character) => void;\n\nexport interface UnverifiedMessage extends ServerChatRoomMessageBase {\n Target?: number;\n Content: ServerChatRoomMessageContentType;\n Type: ServerChatRoomMessageType;\n Dictionary?: {\n type: string;\n data?: any;\n }[];\n Timeout?: number;\n}\n\nexport interface EventChannelMessage<\n TEvents extends Record<string, unknown> = Record<string, unknown>,\n TEvent extends keyof TEvents & string = keyof TEvents & string\n> extends ServerChatRoomMessageBase {\n Target?: number;\n Content: string;\n Type: 'Hidden';\n Dictionary: [\n DeepLibMessageDictionaryEntry<TEvent, TEvents[TEvent]>\n ];\n Timeout?: number;\n Sender: number;\n}\n\nexport class EventChannel<TEvents extends Record<string, unknown>, TChannelName extends string> {\n private listeners: { [K in keyof TEvents]?: Listener<TEvents[K]>[]; } = {};\n\n constructor(private channelName: TChannelName) {\n ModSdkManager.prototype.hookFunction('ChatRoomMessageProcessHidden', 0, (args, next) => {\n if (!this.isChannelMessage(args[0] as UnverifiedMessage)) {\n return next(args);\n }\n\n const [message, sender] = args as unknown as [EventChannelMessage<TEvents>, Character];\n\n const { type, data } = message.Dictionary[0];\n const listeners = this.listeners[type as keyof TEvents];\n if (listeners) {\n (listeners as Listener<unknown>[])\n .forEach(listener => listener(data, sender));\n }\n\n return next(args);\n }, `EventChannel-${channelName}`);\n }\n\n public unload() {\n (Object.keys(this.listeners) as (keyof TEvents)[])\n .forEach(key => delete this.listeners[key]);\n ModSdkManager.prototype.removeHookByModule('ChatRoomMessageProcessHidden', `EventChannel-${this.channelName}`);\n }\n\n public sendEvent<K extends keyof TEvents & string>(type: K, data: TEvents[K], target: number | null = null) {\n const packet = {\n Type: 'Hidden',\n Content: this.channelName,\n Sender: Player.MemberNumber,\n ...(target ? { Target: target } : {}),\n Dictionary: [\n {\n type,\n data\n } as DeepLibMessageDictionaryEntry<K, TEvents[K]>\n ]\n };\n\n ServerSend('ChatRoomChat', packet);\n }\n\n public registerListener<K extends keyof TEvents & string>(event: K, listener: Listener<TEvents[K]>): () => void {\n const listeners = this.listeners[event] ?? [];\n listeners.push(listener);\n this.listeners[event] = listeners;\n\n return () => this.unregisterListener(event, listener);\n }\n\n public unregisterListener<K extends keyof TEvents & string>(event: K, listener: Listener<TEvents[K]>) {\n const listeners = this.listeners[event];\n if (listeners) {\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n }\n\n private isChannelMessage(message: UnverifiedMessage): message is EventChannelMessage<TEvents> {\n return (\n message &&\n message.Type === 'Hidden' &&\n message.Content === this.channelName &&\n message.Sender &&\n message.Sender !== Player.MemberNumber &&\n message.Dictionary &&\n !!message.Dictionary[0]?.data &&\n !!message.Dictionary[0]?.type\n ) || false;\n }\n}\n"],
|
|
5
|
+
"mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
|
|
6
6
|
"names": ["o", "e", "t", "n", "r", "i", "a", "c", "l", "d", "g", "s", "p", "BaseMigrator", "elem", "rawSdkImport"]
|
|
7
7
|
}
|