Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package spicetify-cli for openSUSE:Factory 
checked in at 2026-09-11 18:02:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/spicetify-cli (Old)
 and      /work/SRC/openSUSE:Factory/.spicetify-cli.new.1265 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "spicetify-cli"

Fri Sep 11 18:02:31 2026 rev:20 rq:1377013 version:2.45.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/spicetify-cli/spicetify-cli.changes      
2026-07-06 12:35:02.601062833 +0200
+++ /work/SRC/openSUSE:Factory/.spicetify-cli.new.1265/spicetify-cli.changes    
2026-09-11 18:06:24.430570247 +0200
@@ -1,0 +2,20 @@
+Thu Sep 10 07:07:20 UTC 2026 - Khang Lê <[email protected]>
+
+- Update to version 2.45.0:
+  * feat: spotify `1.3.0` support & alpha fix
+  * chore(vscode): use oxc formatter instead of biome (#3919)
+  * fix(wrapper): make PopupModal styling self-contained (#3917)
+  * fix(wrapper): update `Color.CSSFormat` module check (#3907)
+  * feat(config): allow editing spotify launch flags (#3905)
+  * docs(install): explain shell PATH activation (#3903)
+  * feat(lyrics-plus): implement pinyin romanization for Chinese lyrics (#3893)
+  * feat(lyrics-plus): optimize musixmatch API calls (#3909)
+  * feat: added new css mappings for right sidebar (#3898)
+  * chore(deps): bump golang.org/x/net from 0.56.0 to 0.57.0 (#3900)
+  * chore(deps): bump actions/setup-node from 6 to 7 (#3901)
+  * chore(deps): bump actions/setup-go from 6 to 7 (#3902)
+  * fix(css-map): add progress bar container class for 1.2.94 (#3897)
+  * fix(css): artist profile picture fix affecting all images (#3887)
+  * fix(css): incorrect shape for artist profile picture (#3885)
+
+-------------------------------------------------------------------

Old:
----
  cli-2.44.0.obscpio

New:
----
  cli-2.45.0.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ spicetify-cli.spec ++++++
--- /var/tmp/diff_new_pack.QOqGDX/_old  2026-09-11 18:06:25.493614894 +0200
+++ /var/tmp/diff_new_pack.QOqGDX/_new  2026-09-11 18:06:25.496615020 +0200
@@ -20,7 +20,7 @@
 %define         binname spicetify
 
 Name:           spicetify-cli
-Version:        2.44.0
+Version:        2.45.0
 Release:        0
 Summary:        Command-line tool to customize Spotify client
 License:        LGPL-2.1-or-later

++++++ _service ++++++
--- /var/tmp/diff_new_pack.QOqGDX/_old  2026-09-11 18:06:25.526616280 +0200
+++ /var/tmp/diff_new_pack.QOqGDX/_new  2026-09-11 18:06:25.529616406 +0200
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/spicetify/cli</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">@PARENT_TAG@</param>
+    <param name="revision">v2.45.0</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="changesgenerate">enable</param>
     <param name="versionrewrite-pattern">v(.*)</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.QOqGDX/_old  2026-09-11 18:06:25.550617288 +0200
+++ /var/tmp/diff_new_pack.QOqGDX/_new  2026-09-11 18:06:25.552617372 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param name="url">https://github.com/spicetify/cli</param>
-              <param 
name="changesrevision">e1f66811a635557cabbd8726cf0bcc5c3ce2b084</param></service></servicedata>
+              <param 
name="changesrevision">0eb878e0ef981623f86fa3252dd830a5990847fb</param></service></servicedata>
 (No newline at EOF)
 

++++++ cli-2.44.0.obscpio -> cli-2.45.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/.vscode/extensions.json 
new/cli-2.45.0/.vscode/extensions.json
--- old/cli-2.44.0/.vscode/extensions.json      2026-07-05 00:54:22.000000000 
+0200
+++ new/cli-2.45.0/.vscode/extensions.json      2026-09-10 01:21:38.000000000 
+0200
@@ -1,3 +1,3 @@
 {
-       "recommendations": ["timonwong.shellcheck", "biomejs.biome", 
"golang.go", "ms-vscode.powershell"]
+       "recommendations": ["timonwong.shellcheck", "oxc.oxc-vscode", 
"golang.go", "ms-vscode.powershell"]
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/.vscode/settings.json 
new/cli-2.45.0/.vscode/settings.json
--- old/cli-2.44.0/.vscode/settings.json        2026-07-05 00:54:22.000000000 
+0200
+++ new/cli-2.45.0/.vscode/settings.json        2026-09-10 01:21:38.000000000 
+0200
@@ -6,7 +6,16 @@
        "[powershell]": {
                "editor.defaultFormatter": "ms-vscode.powershell"
        },
-       "[javascript][typescript][json]": {
-               "editor.defaultFormatter": "biomejs.biome"
+       "[javascript]": {
+               "editor.defaultFormatter": "oxc.oxc-vscode"
+       },
+       "[typescript]": {
+               "editor.defaultFormatter": "oxc.oxc-vscode"
+       },
+       "[json]": {
+               "editor.defaultFormatter": "oxc.oxc-vscode"
+       },
+       "[jsonc]": {
+               "editor.defaultFormatter": "oxc.oxc-vscode"
        }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/CustomApps/lyrics-plus/OptionsMenu.js 
new/cli-2.45.0/CustomApps/lyrics-plus/OptionsMenu.js
--- old/cli-2.44.0/CustomApps/lyrics-plus/OptionsMenu.js        2026-07-05 
00:54:22.000000000 +0200
+++ new/cli-2.45.0/CustomApps/lyrics-plus/OptionsMenu.js        2026-09-10 
01:21:38.000000000 +0200
@@ -142,6 +142,8 @@
                        none: "None",
                };
 
+               let romanizationOptions = {};
+
                const musixmatchDisplay = new Intl.DisplayNames(["en"], { type: 
"language" });
                const availableMusixmatchLanguages = 
Array.isArray(musixmatchLanguages) ? [...new 
Set(musixmatchLanguages.filter(Boolean))] : [];
                const activeMusixmatchLanguage = musixmatchSelectedLanguage && 
musixmatchSelectedLanguage !== "none" ? musixmatchSelectedLanguage : null;
@@ -205,6 +207,10 @@
                                        hk: "Traditional Chinese (Hong Kong)",
                                        tw: "Traditional Chinese (Taiwan)",
                                };
+                               romanizationOptions = {
+                                       none: "None",
+                                       pinyin: "Pinyin (拼音)",
+                               };
                                break;
                        }
                }
@@ -243,6 +249,15 @@
                                when: () => friendlyLanguage,
                        },
                        {
+                               desc: "Romanization",
+                               key: "romanization",
+                               type: ConfigSelection,
+                               options: romanizationOptions,
+                               renderInline: true,
+                               // only Chinese has a romanization option 
(Pinyin) for now.
+                               when: () => friendlyLanguage === "chinese",
+                       },
+                       {
                                desc: "Convert",
                                key: "translate",
                                type: ConfigSlider,
@@ -377,6 +392,14 @@
                                                                        type: 
ConfigAdjust,
                                                                        min: 
fontSizeLimit.min,
                                                                        max: 
fontSizeLimit.max,
+                                                                       step: 
fontSizeLimit.step,
+                                                               },
+                                                               {
+                                                                       desc: 
"Romanization font size",
+                                                                       key: 
"romanization-font-size",
+                                                                       type: 
ConfigAdjust,
+                                                                       min: 
fontSizeLimit.min,
+                                                                       max: 
fontSizeLimit.max,
                                                                        step: 
fontSizeLimit.step,
                                                                },
                                                                {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/CustomApps/lyrics-plus/Pages.js 
new/cli-2.45.0/CustomApps/lyrics-plus/Pages.js
--- old/cli-2.44.0/CustomApps/lyrics-plus/Pages.js      2026-07-05 
00:54:22.000000000 +0200
+++ new/cli-2.45.0/CustomApps/lyrics-plus/Pages.js      2026-09-10 
01:21:38.000000000 +0200
@@ -170,7 +170,7 @@
        });
 };
 
-const SyncedLyricsPage = react.memo(({ lyrics = [], provider, copyright, 
isKara }) => {
+const SyncedLyricsPage = react.memo(({ lyrics = [], provider, copyright, 
isKara, romanization }) => {
        const [position, setPosition] = useState(0);
        const activeLineEle = useRef();
        const lyricContainerEle = useRef();
@@ -183,6 +183,17 @@
                }
        });
 
+       const romanizationByTime = useMemo(() => {
+               if (!romanization) return null;
+               const map = {};
+               for (const line of romanization) {
+                       if (line.startTime != null) {
+                               map[line.startTime] = line.text;
+                       }
+               }
+               return map;
+       }, [romanization]);
+
        const lyricWithEmptyLines = useMemo(
                () =>
                        [emptyLine, emptyLine, 
...processPauseLines(lyrics)].map((line, i) => ({
@@ -319,6 +330,10 @@
 
                                const belowMode = showTranslatedBelow && 
originalText && belowOrigin !== belowTxt;
 
+                               const romanizedText = 
CONFIG.visual["romanization"] !== "none" && !isPause ? 
romanizationByTime?.[startTime] : null;
+                               const lineTextStr = (typeof lineText === 
"object" ? lineText?.props?.children?.[0] : lineText) ?? "";
+                               const showRomanizedLine = romanizedText && 
romanizedText.replace(/\s+/g, "") !== String(lineTextStr).replace(/\s+/g, "");
+
                                return react.createElement(
                                        "div",
                                        {
@@ -368,6 +383,17 @@
                                                                },
                                                        },
                                                        text
+                                               ),
+                                       showRomanizedLine &&
+                                               react.createElement(
+                                                       "p",
+                                                       {
+                                                               style: {
+                                                                       
opacity: 0.5,
+                                                                       
fontSize: "var(--lyrics-romanization-font-size)",
+                                                               },
+                                                       },
+                                                       romanizedText
                                                )
                                );
                        })
@@ -536,11 +562,22 @@
        );
 }
 
-const SyncedExpandedLyricsPage = react.memo(({ lyrics, provider, copyright, 
isKara }) => {
+const SyncedExpandedLyricsPage = react.memo(({ lyrics, provider, copyright, 
isKara, romanization }) => {
        const [position, setPosition] = useState(() => 
Spicetify.Player.getProgress() + CONFIG.visual["global-delay"] + 
CONFIG.visual.delay);
        const activeLineRef = useRef(null);
        const pageRef = useRef(null);
 
+       const romanizationByTime = useMemo(() => {
+               if (!romanization) return null;
+               const map = {};
+               for (const line of romanization) {
+                       if (line.startTime != null) {
+                               map[line.startTime] = line.text;
+                       }
+               }
+               return map;
+       }, [romanization]);
+
        useTrackPosition(() => {
                if (!Spicetify.Player.data.is_paused) {
                        setPosition(Spicetify.Player.getProgress() + 
CONFIG.visual["global-delay"] + CONFIG.visual.delay);
@@ -648,6 +685,10 @@
 
                        const belowMode = showTranslatedBelow && originalText 
&& belowOrigin !== belowTxt;
 
+                       const romanizedText = CONFIG.visual["romanization"] !== 
"none" && !isPause ? romanizationByTime?.[startTime] : null;
+                       const lineTextStr = (typeof lineText === "object" ? 
lineText?.props?.children?.[0] : lineText) ?? "";
+                       const showRomanizedLine = romanizedText && 
romanizedText.replace(/\s+/g, "") !== String(lineTextStr).replace(/\s+/g, "");
+
                        return react.createElement(
                                "div",
                                {
@@ -692,6 +733,14 @@
                                                        },
                                                },
                                                text
+                                       ),
+                               showRomanizedLine &&
+                                       react.createElement(
+                                               "p",
+                                               {
+                                                       style: { opacity: 0.5, 
fontSize: "var(--lyrics-romanization-font-size)" },
+                                               },
+                                               romanizedText
                                        )
                        );
                }),
@@ -706,7 +755,7 @@
        );
 });
 
-const UnsyncedLyricsPage = react.memo(({ lyrics, provider, copyright }) => {
+const UnsyncedLyricsPage = react.memo(({ lyrics, provider, copyright, 
romanization }) => {
        return react.createElement(
                "div",
                {
@@ -732,6 +781,10 @@
 
                        const belowMode = showTranslatedBelow && originalText 
&& belowOrigin !== belowTxt;
 
+                       const romanizedText = CONFIG.visual["romanization"] !== 
"none" ? romanization?.[index]?.text : null;
+                       const lineTextStr = (typeof lineText === "object" ? 
lineText?.props?.children?.[0] : lineText) ?? "";
+                       const showRomanizedLine = romanizedText && 
romanizedText.replace(/\s+/g, "") !== String(lineTextStr).replace(/\s+/g, "");
+
                        return react.createElement(
                                "div",
                                {
@@ -765,6 +818,14 @@
                                                        },
                                                },
                                                text
+                                       ),
+                               showRomanizedLine &&
+                                       react.createElement(
+                                               "p",
+                                               {
+                                                       style: { opacity: 0.5, 
fontSize: "var(--lyrics-romanization-font-size)" },
+                                               },
+                                               romanizedText
                                        )
                        );
                }),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/cli-2.44.0/CustomApps/lyrics-plus/ProviderMusixmatch.js 
new/cli-2.45.0/CustomApps/lyrics-plus/ProviderMusixmatch.js
--- old/cli-2.44.0/CustomApps/lyrics-plus/ProviderMusixmatch.js 2026-07-05 
00:54:22.000000000 +0200
+++ new/cli-2.45.0/CustomApps/lyrics-plus/ProviderMusixmatch.js 2026-09-10 
01:21:38.000000000 +0200
@@ -55,6 +55,8 @@
                        q_duration: durr,
                        f_subtitle_length: Math.floor(durr),
                        usertoken: CONFIG.providers.musixmatch.token,
+                       optional_calls: "track.richsync",
+                       richsync_compact_type: "words",
                        part: 
"track_lyrics_translation_status,track_structure,track_performer_tagging",
                };
 
@@ -231,28 +233,12 @@
                        return null;
                }
 
-               const baseURL = 
"https://apic-appmobile.musixmatch.com/ws/1.1/track.richsync.get?format=json&subtitle_format=mxm&app_id=mac-ios-v2.0&";;
-
-               const params = {
-                       f_subtitle_length: meta.track.track_length,
-                       q_duration: meta.track.track_length,
-                       commontrack_id: meta.track.commontrack_id,
-                       usertoken: CONFIG.providers.musixmatch.token,
-               };
-
-               const finalURL =
-                       baseURL +
-                       Object.keys(params)
-                               .map((key) => 
`${key}=${encodeURIComponent(params[key])}`)
-                               .join("&");
-
-               let result = await Spicetify.CosmosAsync.get(finalURL, null, 
headers);
-
-               if (result.message.header.status_code !== 200) {
+               const richsyncCall = body?.["track.richsync.get"];
+               if (!richsyncCall || richsyncCall.message.header.status_code 
!== 200 || !richsyncCall.message.body.richsync) {
                        return null;
                }
 
-               result = result.message.body;
+               const result = richsyncCall.message.body;
 
                const snippetQueue = parsePerformerData(meta);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/CustomApps/lyrics-plus/Translator.js 
new/cli-2.45.0/CustomApps/lyrics-plus/Translator.js
--- old/cli-2.44.0/CustomApps/lyrics-plus/Translator.js 2026-07-05 
00:54:22.000000000 +0200
+++ new/cli-2.45.0/CustomApps/lyrics-plus/Translator.js 2026-09-10 
01:21:38.000000000 +0200
@@ -2,6 +2,7 @@
 const kuromojiPath = 
"https://cdn.jsdelivr.net/npm/[email protected]/dist/kuroshiro-analyzer-kuromoji.min.js";;
 const aromanize = 
"https://cdn.jsdelivr.net/npm/[email protected]/aromanize.min.js";;
 const openCCPath = 
"https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/full.min.js";;
+const pinyinProPath = 
"https://cdn.jsdelivr.net/npm/[email protected]/dist/index.min.js";;
 
 const dictPath = "https:/cdn.jsdelivr.net/npm/[email protected]/dict";
 
@@ -19,8 +20,8 @@
                this.createTranslator(lang);
        }
 
-       includeExternal(url) {
-               if ((CONFIG.visual.translate || this.isUsingNetease) && 
!document.querySelector(`script[src="${url}"]`)) {
+       includeExternal(url, forceInclude = false) {
+               if ((forceInclude || CONFIG.visual.translate || 
this.isUsingNetease) && !document.querySelector(`script[src="${url}"]`)) {
                        const script = document.createElement("script");
                        script.setAttribute("type", "text/javascript");
                        script.setAttribute("src", url);
@@ -28,6 +29,10 @@
                }
        }
 
+       isUsingRomanization() {
+               return CONFIG.visual["romanization"] && 
CONFIG.visual["romanization"] !== "none";
+       }
+
        injectExternals(lang) {
                switch (lang?.slice(0, 2)) {
                        case "ja":
@@ -39,6 +44,7 @@
                                break;
                        case "zh":
                                this.includeExternal(openCCPath);
+                               this.includeExternal(pinyinProPath, 
this.isUsingRomanization());
                                break;
                }
        }
@@ -101,16 +107,23 @@
                                this.Aromanize = Aromanize;
                                this.finished.ko = true;
                                break;
-                       case "zh":
-                               if (this.OpenCC) return;
-                               if (typeof OpenCC === "undefined") {
+                       case "zh": {
+                               const needsOpenCC = CONFIG.visual.translate || 
this.isUsingNetease;
+                               const needsPinyin = this.isUsingRomanization();
+                               if (needsOpenCC && typeof OpenCC === 
"undefined") {
+                                       await Translator.#sleep(50);
+                                       return this.createTranslator(lang);
+                               }
+                               if (needsPinyin && typeof pinyinPro === 
"undefined") {
                                        await Translator.#sleep(50);
                                        return this.createTranslator(lang);
                                }
 
-                               this.OpenCC = OpenCC;
+                               if (needsOpenCC && !this.OpenCC) this.OpenCC = 
OpenCC;
+                               if (needsPinyin && !this.pinyinPro) 
this.pinyinPro = pinyinPro;
                                this.finished.zh = true;
                                break;
+                       }
                }
        }
 
@@ -150,6 +163,15 @@
                return converter(text);
        }
 
+       async convertToPinyin(text) {
+               if (!this.finished.zh || !this.pinyinPro) {
+                       await Translator.#sleep(100);
+                       return this.convertToPinyin(text);
+               }
+
+               return this.pinyinPro.pinyin(text, { toneType: "symbol", nonZh: 
"consecutive" });
+       }
+
        /**
         * Async wrapper of `setTimeout`.
         *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/CustomApps/lyrics-plus/index.js 
new/cli-2.45.0/CustomApps/lyrics-plus/index.js
--- old/cli-2.44.0/CustomApps/lyrics-plus/index.js      2026-07-05 
00:54:22.000000000 +0200
+++ new/cli-2.45.0/CustomApps/lyrics-plus/index.js      2026-09-10 
01:21:38.000000000 +0200
@@ -51,12 +51,14 @@
                "lines-before": 
localStorage.getItem("lyrics-plus:visual:lines-before") || "0",
                "lines-after": 
localStorage.getItem("lyrics-plus:visual:lines-after") || "2",
                "font-size": 
localStorage.getItem("lyrics-plus:visual:font-size") || "32",
+               "romanization-font-size": 
localStorage.getItem("lyrics-plus:visual:romanization-font-size") || "16",
                "translate:translated-lyrics-source": 
localStorage.getItem("lyrics-plus:visual:translate:translated-lyrics-source") 
|| "none",
                "translate:display-mode": 
localStorage.getItem("lyrics-plus:visual:translate:display-mode") || "replace",
                "translate:detect-language-override": 
localStorage.getItem("lyrics-plus:visual:translate:detect-language-override") 
|| "off",
                "translation-mode:japanese": 
localStorage.getItem("lyrics-plus:visual:translation-mode:japanese") || 
"furigana",
                "translation-mode:korean": 
localStorage.getItem("lyrics-plus:visual:translation-mode:korean") || "romaja",
                "translation-mode:chinese": 
localStorage.getItem("lyrics-plus:visual:translation-mode:chinese") || "cn",
+               romanization: 
localStorage.getItem("lyrics-plus:visual:romanization") || "none",
                translate: getConfig("lyrics-plus:visual:translate", false),
                "ja-detect-threshold": 
localStorage.getItem("lyrics-plus:visual:ja-detect-threshold") || "40",
                "hans-detect-threshold": 
localStorage.getItem("lyrics-plus:visual:hans-detect-threshold") || "40",
@@ -121,6 +123,7 @@
 CONFIG.visual["lines-before"] = Number.parseInt(CONFIG.visual["lines-before"]);
 CONFIG.visual["lines-after"] = Number.parseInt(CONFIG.visual["lines-after"]);
 CONFIG.visual["font-size"] = Number.parseInt(CONFIG.visual["font-size"]);
+CONFIG.visual["romanization-font-size"] = 
Number.parseInt(CONFIG.visual["romanization-font-size"]);
 CONFIG.visual["ja-detect-threshold"] = 
Number.parseInt(CONFIG.visual["ja-detect-threshold"]);
 CONFIG.visual["hans-detect-threshold"] = 
Number.parseInt(CONFIG.visual["hans-detect-threshold"]);
 
@@ -206,6 +209,7 @@
                        cn: null,
                        hk: null,
                        tw: null,
+                       pinyin: null,
                        musixmatchTranslation: null,
                        musixmatchTranslationLanguage: null,
                        musixmatchAvailableTranslations: [],
@@ -246,6 +250,7 @@
                this.displayMode = null;
                this.currentMusixmatchLanguage = 
CONFIG.visual["musixmatch-translation-language"];
                this._musixmatchTranslationRequestId = null;
+               this._romanizing = false;
        }
 
        infoFromTrack(track) {
@@ -505,6 +510,7 @@
 
                this.fetchTempo(info.uri);
                this.resetDelay();
+               this._romanizing = false;
 
                let tempState;
                // if lyrics are cached
@@ -612,6 +618,7 @@
                                        cn: null,
                                        hk: null,
                                        tw: null,
+                                       pinyin: null,
                                        neteaseTranslation: null,
                                        ...tempState,
                                        ...translationOverrides,
@@ -695,6 +702,28 @@
                                CACHE[lyricsState.uri] = { 
...CACHE[lyricsState.uri], ...resetCache };
                        }
                }
+
+               const canRomanize =
+                       CONFIG.visual["romanization"] !== "none" &&
+                       (lang === "zh-hans" || lang === "zh-hant") &&
+                       (mode === SYNCED || mode === UNSYNCED) &&
+                       Array.isArray(lyrics) &&
+                       lyrics.length;
+
+               if (canRomanize) {
+                       if ((!this.state.pinyin || this.state.pinyin.mode !== 
mode) && !this._romanizing) {
+                               this._romanizing = true;
+                               const uri = lyricsState.uri;
+                               this.romanizeLyrics(lyrics).then((lines) => {
+                                       this._romanizing = false;
+                                       if (uri === this.state.uri) {
+                                               this.setState({ pinyin: { mode, 
lines: lines || null } });
+                                       }
+                               });
+                       }
+               } else if (this.state.pinyin) {
+                       this.state.pinyin = null;
+               }
        }
 
        provideLanguageCode(lyrics) {
@@ -780,6 +809,31 @@
                }
        }
 
+       async romanizeLyrics(lyrics) {
+               if (!lyrics) return null;
+
+               Spicetify.showNotification("Converting...", false, 1000);
+               if (!this.translator) {
+                       this.translator = new Translator("zh");
+               }
+               await this.translator.awaitFinished("zh");
+
+               try {
+                       const result = await Promise.all(
+                               lyrics.map(async (lyric) => ({
+                                       startTime: lyric.startTime,
+                                       text: await 
this.translator.convertToPinyin(lyric.text),
+                               }))
+                       );
+                       Spicetify.showNotification("Converting...", false, 0);
+                       return result;
+               } catch (error) {
+                       Spicetify.showNotification("Convert Error!", true);
+                       console.error(error);
+                       return null;
+               }
+       }
+
        resetDelay() {
                CONFIG.visual.delay = 
Number(localStorage.getItem(`lyrics-delay:${Spicetify.Player.data.item.uri}`)) 
|| 0;
        }
@@ -1011,6 +1065,7 @@
                        ...this.styleVariables,
                        "--lyrics-align-text": CONFIG.visual.alignment,
                        "--lyrics-font-size": `${CONFIG.visual["font-size"]}px`,
+                       "--lyrics-romanization-font-size": 
`${CONFIG.visual["romanization-font-size"]}px`,
                        "--animation-tempo": this.state.tempo,
                };
 
@@ -1039,6 +1094,7 @@
                        ...this.styleVariables,
                        "--lyrics-align-text": CONFIG.visual.alignment,
                        "--lyrics-font-size": `${CONFIG.visual["font-size"]}px`,
+                       "--lyrics-romanization-font-size": 
`${CONFIG.visual["romanization-font-size"]}px`,
                        "--animation-tempo": this.state.tempo,
                };
 
@@ -1069,6 +1125,7 @@
                const hasMusixmatchLanguages = 
Array.isArray(this.state.musixmatchAvailableTranslations) && 
this.state.musixmatchAvailableTranslations.length > 0;
                const hasTranslation = this.state.neteaseTranslation !== null 
|| this.state.musixmatchTranslation !== null || hasMusixmatchLanguages;
                const hasPerformer = !!this.state.currentLyrics?.some((line) => 
line.performer);
+               const romanizationLines = this.state.pinyin?.mode === mode ? 
this.state.pinyin.lines : null;
 
                if (mode !== -1) {
                        showTranslationButton = (friendlyLanguage || 
hasTranslation) && (mode === SYNCED || mode === UNSYNCED);
@@ -1089,6 +1146,7 @@
                                        provider: this.state.provider,
                                        copyright: this.state.copyright,
                                        reRenderLyricsPage: 
this.reRenderLyricsPage,
+                                       romanization: romanizationLines,
                                });
                        } else if (mode === UNSYNCED && this.state.unsynced) {
                                activeItem = 
react.createElement(UnsyncedLyricsPage, {
@@ -1097,6 +1155,7 @@
                                        provider: this.state.provider,
                                        copyright: this.state.copyright,
                                        reRenderLyricsPage: 
this.reRenderLyricsPage,
+                                       romanization: romanizationLines,
                                });
                        } else if (mode === GENIUS && this.state.genius) {
                                activeItem = react.createElement(GeniusPage, {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/css-map.json new/cli-2.45.0/css-map.json
--- old/cli-2.44.0/css-map.json 2026-07-05 00:54:22.000000000 +0200
+++ new/cli-2.45.0/css-map.json 2026-09-10 01:21:38.000000000 +0200
@@ -268,9 +268,11 @@
        "NPvLJSRWfv1Joo8dF0D8": "main-actionButtons",
        "GTAFfOA_w5vh_bDaGJAG": "main-actionButtons",
        "x2zIrx9Juns9lNvs": "main-actionButtons",
+       "qqJ1JBO6dCOkJRS9_98s": "main-actionButtons",
        "WIGgdAaAzrXm7f_loaXi": "main-actionButtons-button",
        "YaU17q8G6eTc2eoKRwnL": "main-actionButtons-spacer",
        "NA8gTZ4nPFEEcDYv": "main-actionButtons-spacer",
+       "MtYp_qNgYodAxs42_Z7u": "main-actionButtons-spacer",
        "SPC4uzYXJmknkCGKpxHw": "main-addButton-active",
        "rRF_r7EyCHjZv058JACi": "main-addButton-active",
        "RbsCNNM9a0WkFCM2UzBA": "main-addButton-button",
@@ -347,55 +349,74 @@
        "P7j2kCLc27vLybuzy5XB": "main-buddyFeed-usernameAndTimestamp",
        "LunqxlFIupJw_Dkx6mNx": "main-card-card",
        "_hPU2Qo7dicv7cnikDRl": "main-card-card",
+       "kfFBBaT99t8M9PjcuwWQ": "main-card-card",
        "aAYpzGljXQv1_zfopxaH": "main-card-cardContainer",
        "RKstfK7T5nPbsDOYT6sT": "main-card-cardContainer",
        "RPV24T758a0OhKtZ": "main-card-cardContainer",
+       "CNfQfoOojaDifUh0yxzp": "main-card-cardContainer",
        "tsv7E_RBBw6v0XTQlcRo": "main-card-cardLink",
        "oboNtEJNVzUoiaCWZRti": "main-card-cardLink",
+       "yRq_zm8vZWGDCDtHCXMy": "main-card-cardLink",
        "ocMpUIgUOBeGMwNIiEDv": "main-card-cardMetadata",
        "LISrKvt3ohgYQtg_": "main-card-cardMetadata",
        "K2GmhKpSMGL9aDJbOJrD": "main-card-cardMetadata",
        "E1N1ByPFWo4AJLHovIBQ": "main-card-cardMetadata",
+       "on2LaRqwqHOyZIZ6d8Vg": "main-card-cardMetadata",
        "qIa0uoOuauQH5s99": "main-card-cardMetadataWrapper",
        "rDjuTujS6qfRKt4apIMQ": "main-card-cardMetadataWrapper",
        "mGpHyHUUZ0wzRQEv": "main-card-cardTitle",
        "xHz124sSHSCYHecLCTfi": "main-card-cardTitle",
        "sq_3oR2TTWUK3HEVWaxx": "main-card-cardTitle",
+       "kbHOXvQULqT5z2vTDD1P": "main-card-cardTitle",
        "UTAdrJMU_kwRYbxi": "main-card-cardTitleLink",
        "Szfh3AX4vGXxz0BQw5Uw": "main-card-cardTitleLink",
        "w9Tpa4Y111UM5u1WMkEl": "main-card-DownloadStatusIndicator",
        "vCaVlmqbg5B36V6PzUsm": "main-card-DownloadStatusIndicator",
+       "V0fxSnuFvgrpYggGF0Ad": "main-card-DownloadStatusIndicator",
        "XiVwj5uoqqSFpS4cYOC6": "main-card-draggable",
        "kpO5z7v_Nr22lge440TY": "main-card-hero",
+       "GYdE4NEvdYo_jXXbHChY": "main-card-hero",
        "YR9YVGItxfIgAZje": "main-card-imageContainer",
        "YnehZkoE2hpA5Tniju8J": "main-card-imageContainer",
        "xBV4XgMq0gC5lQICFWY_": "main-card-imageContainer",
+       "AGngVgYSd6na70ghQCdE": "main-card-imageContainer",
        "xxLDW4qlPuNbzB9jIJKc": "main-card-imageContainerOld",
        "NH6UaoYYe47eIHA2Rmal": "main-card-imageContainerOld",
+       "T009qZwFm5PtBByCd30U": "main-card-imageContainerOld",
        "DcLEXCfwMp91VNH5R4m9": "main-card-imageContainerSkeleton",
        "AYwATC_zEPwCkmO1yc8R": "main-card-imageContainerSkeleton",
+       "aM80N0fS7fx9uhLxFXwG": "main-card-imageContainerSkeleton",
        "UB3cP9wsqoAMAHaeBGDt": "main-card-imagePlaceholder",
+       "KxJOZ3er5tGUxZNYsakR": "main-card-imagePlaceholder",
        "XpvI6Yl46lYYdMY6SnvK": "main-card-newEpisodeIndicator",
        "r9Oj1LabijReMkOyeUxw": "main-card-newEpisodeIndicator",
+       "CD_VxTNKrT5ItUEm9pho": "main-card-newEpisodeIndicator",
        "woJQ5t2YiaJhjTv_KE7p": "main-card-PlayButtonContainer",
        "qpns1iHTAt8rMNnK": "main-card-PlayButtonContainer",
        "EFrqkoAHdmfRItUj8H8H": "main-card-PlayButtonContainer",
+       "Lfmlz1SNgfjwWukLZU5x": "main-card-PlayButtonContainer",
        "khD_dnfwxwd4HF20": "main-card-PlayButtonContainerVisible",
        "zuKTW9yEI9rToECOcWG3": "main-card-PlayButtonContainerVisible",
        "_0rtnZ9bGhwcfS5kspzw": "main-card-PlayButtonContainerVisible",
+       "SKbmros6MNnv2vIbyHb3": "main-card-PlayButtonContainerVisible",
        "iwsv8i7rNxA2c_VvC4CO": "main-card-type",
+       "WhJ6ZtpkIDou9qa66e_c": "main-card-type",
        "c6FJaCManaNcchyUwvoL": "main-card-withWaves",
        "MxnDSnm9KnJu4xcsinKh": "main-card-withWavesWrapper",
        "QO_OHdGt6X6luPH6_Lfg": "main-cardHeader-hasNewEpisodeIndicator",
        "Nqa6Cw3RkDMV8QnYreTr": "main-cardHeader-link",
        "nk6UgB4GUYNoAcPtAQaG": "main-cardHeader-text",
        "yYflTYbufy7rATGQiZfq": "main-cardImage-circular",
+       "_vYcJu3HJyUaRgOu": "main-cardImage-circular",
+       "VVCqZmc7EVyg_FF1lVM2": "main-cardImage-circular",
        "SKJSok3LfyedjZjujmFt": "main-cardImage-image",
        "whMS0fh9Ar4I_GaP": "main-cardImage-image",
        "Z3N2sU3PRuY4NgvdEz55": "main-cardImage-image",
+       "LwhcudULaBeptw_Hhqql": "main-cardImage-image",
        "P0DCrcBH45YVGZwP": "main-cardImage-imageWrapper",
        "mKWCDBYvel1BrZvMNY09": "main-cardImage-imageWrapper",
        "g4PZpjkqEh5g7xDpCr2K": "main-cardImage-imageWrapper",
+       "HEr4cRXbsVPWqTwTerei": "main-cardImage-imageWrapper",
        "qucSNjx66ofSGZDzCuEk": "main-cardSubHeader-isHero",
        "Za_uNH8nTZ0qCuIqbPLZ": "main-cardSubHeader-root",
        "RArlOXg8S6l3NgRKrGsO": "main-cardSubHeader-text",
@@ -822,66 +843,88 @@
        "EHxL6K_6WWDlTCZP6x5w": "main-genericButton-buttonActiveDot",
        "S0nU7XTXYMOBcASz": "main-globalNav-browseButtonWrapper",
        "Ckze8wMFNiDXk_f1IqjJ": "main-globalNav-browseButtonWrapper",
+       "WOA7FPCjtFzDZ3kt_prW": "main-globalNav-browseButtonWrapper",
        "OomFKn3bsxs5JfNUoWhz": "main-globalNav-buddyFeed",
+       "nR3ekhH3c1IU7dX9smcR": "main-globalNav-buddyFeed",
        "zKQSfRjzvD8_Imog": "main-globalNav-contentRight",
        "vRrKblnUUQV5eMbvUdv8": "main-globalNav-contentRight",
+       "YaxaG7RXncXi6VCTEukV": "main-globalNav-contentRight",
        "IEulmRakQT_FgH43ov2a": "main-globalNav-contentRightSpacer",
+       "gI9IyY8kv9SR9nOJQhgk": "main-globalNav-contentRightSpacer",
        "VizXsWMIuNfKGN5pMyox": "main-globalNav-historyButtons",
        "KkJlQWSJM6Cu2GJJSBQ7": "main-globalNav-historyButtons",
        "K1Ve0b6y28X7myMURsKS": "main-globalNav-historyButtons",
        "Jh8hR_VCPJ4cpwDm": "main-globalNav-historyButtons",
+       "Hr6zqFXipVeZnpT0jVAQ": "main-globalNav-historyButtons",
        "Z6t_8rA6LOBrX3huqRJG": "main-globalNav-historyButtonsContainer",
        "VphhNp8Q7R2U552LryhP": "main-globalNav-historyButtonsContainer",
        "pIM9jg__39NIpOvXG89b": "main-globalNav-historyButtonsContainer",
        "AYUEkKOEqksuTXmh": "main-globalNav-historyButtonsContainer",
+       "azTGVyS_7WuUbhEDoCgH": "main-globalNav-historyButtonsContainer",
        "Il1Yz_P2hpTeJyNf9mi_": "main-globalNav-historyButtonsSpacer",
        "ErjO4cqRWhY9rFZf": "main-globalNav-historyButtonsSpacer",
+       "GCNvWhUGp84HhAuncKQ1": "main-globalNav-historyButtonsSpacer",
+       "bjRw1FNwvXxSrC054Bus": "main-globalNav-historyButtonsSpacer",
        "ppjvheuqvs8mmcHwKkK5": "main-globalNav-historyButtonsWrapper",
        "MvzElcNve78O4Oo8": "main-globalNav-historyButtonsWrapper",
+       "nqqkID2Vj36sqqr4GPmw": "main-globalNav-historyButtonsWrapper",
        "rBX1EWVZ2EaPwP4y1Gkd": "main-globalNav-icon",
        "jdlOKroADlFeZZQeTdp8": "main-globalNav-link-icon",
        "dIfr5oVr5kotAi0HsIsW": "main-globalNav-link-icon",
        "_Bg_zSvFrEutyacG": "main-globalNav-link-icon",
+       "xlH6FJnBzFT4l3TgUBre": "main-globalNav-link-icon",
        "YEAFPNm87XbzS4sF5dDe": "main-globalNav-navLink",
        "obd_bH64Snp1npdw29XM": "main-globalNav-navLink",
        "kUHE42xvQVzWqabl": "main-globalNav-navLink",
        "bWBqSiXEceAj1SnzqusU": "main-globalNav-navLink",
+       "RTmbDc5S8vYrrQIJpPXv": "main-globalNav-navLink",
        "voA9ZoTTlPFyLpckNw3S": "main-globalNav-navLinkActive",
        "Ufz621LN174DTRDis7EY": "main-globalNav-navLinkActive",
        "kxv3By32Og8yDEXy": "main-globalNav-navLinkActive",
        "ETjtwGvAB4lRVqSzm8nA": "main-globalNav-navLinkActive",
        "AonZ39aVKATRTjY28Uww": "main-globalNav-navLinkActive",
+       "ajKYUZPcNmFVzcAzzlwe": "main-globalNav-navLinkActive",
        "YsP3Gj4aJDYsaOC5": "main-globalNav-searchContainer",
        "v8JHoFMumOgbCn8vsTvC": "main-globalNav-searchContainer",
        "QrpHSphgBSqzODEHqr_t": "main-globalNav-searchContainer",
        "lj0eGI6WEtfxFX7irC03": "main-globalNav-searchContainer",
+       "mlx0CgXAnGz0dADVsCdS": "main-globalNav-searchContainer",
        "W9VXOkC43GP_7ULClgxQ": "main-globalNav-searchInputContainer",
        "T0ufQRqPgIE3BmjD": "main-globalNav-searchInputContainer",
        "RpMCAf8TjF6HpQSI7hdx": "main-globalNav-searchInputContainer",
        "fksI89zEXwqKWm1O6sJm": "main-globalNav-searchInputContainer",
        "b7r2WRiu5f9Q99qmyreh": "main-globalNav-searchInputContainer",
+       "f0G3CvZVXIxBqmSarCt9": "main-globalNav-searchInputContainer",
        "SrfZ87xJMiJ7OYEB4Ziz": "main-globalNav-searchInputKBDWrapper",
+       "rxYHNa7qp7GadJDDckeX": "main-globalNav-searchInputKBDWrapper",
        "tDFP1X98EgqQIPaumxRt": "main-globalNav-searchInputSection",
        "PvsV2JgJRDME1vDn6IJL": "main-globalNav-searchInputSection",
        "NykkfCmZVlyRYNAqZg35": "main-globalNav-searchInputSection",
        "eu6ObgEHE5owtzi_": "main-globalNav-searchInputSection",
        "_b3hhmbWtOY8_1M1mM1H": "main-globalNav-searchInputSection",
+       "vi4HnZvSILknLijjZ590": "main-globalNav-searchInputSection",
        "Upg3TU2JcLoODwAs": "main-globalNav-searchInputText",
+       "f3zxlcazetW7hEgJi6ac": "main-globalNav-searchInputText",
        "zIEAwziaGLAsvE5h": "main-globalNav-searchInputTextWrapper",
        "al8f6ds34QJ4LZ74vbVP": "main-globalNav-searchInputTextWrapper",
+       "bRRJlkldFGQjaL5FAFze": "main-globalNav-searchInputTextWrapper",
        "eoACZlxIIdCS_g00hynp": "main-globalNav-searchInputWrapper",
        "DW2tFcaSSAWw9twn": "main-globalNav-searchInputWrapper",
+       "HYAdp74EPSxNXv5y43K2": "main-globalNav-searchInputWrapper",
        "W02pQCvfy5Bin7z4EAzo": "main-globalNav-searchSection",
        "jGghIqFVK6VrBUP9FLIq": "main-globalNav-searchSection",
        "gj5VcIUC9oD2p4BsxzGE": "main-globalNav-searchSection",
        "CJFYJUHifjAise1k": "main-globalNav-searchSection",
+       "yrgY7D0BQvaB82DAjMa1": "main-globalNav-searchSection",
        "soGhxDX6VjS7dBxX9Hbd": "main-gridContainer-fixedWidth",
        "YR7WOlf_lck48w4l": "main-gridContainer-gridContainer",
        "iKwGKEfAfW7Rkx2_Ba4E": "main-gridContainer-gridContainer",
        "dZZDxz44v5EOD33wbCZ3": "main-gridContainer-gridContainer",
+       "LloRxwm7PwmJO9a8psUg": "main-gridContainer-gridContainer",
        "iOYHTG9ncL3GLrdb": "main-gridContainer-gridContainerMargin",
        "jTlip_2p9QBKtt5Po88H": "main-gridContainer-gridContainerMargin",
        "PmW2UCL9vlTcNPD7J0KJ": "main-gridContainer-uniformRowHeight",
+       "FoEw3ym29wXY2KSsVOKn": "main-gridContainer-uniformRowHeight",
        "HkbHLcqgUfXruL5xVi28": "main-heroCard-card",
        "_gB1lxCfXeR8_Wze5Cx9": "main-heroCard-cardLink",
        "sm7ZnbOO1Zfg9cupYgPN": "main-heroCard-cardMetadata",
@@ -916,10 +959,13 @@
        "obD7rdENNc2n3fC0": "main-image-image",
        "mMx2LUixlnN_Fu45JpFB": "main-image-image",
        "LBM25IAoFtd0wh7k3EGM": "main-image-image",
+       "FwkSRC8nZx0oFeY2HJi2": "main-image-image",
        "Yn2Ei5QZn19gria6LjZj": "main-image-loaded",
        "qIwhHcbG780QDz68": "main-image-loaded",
        "PgTMmU2Gn7AESFMYhw4i": "main-image-loaded",
+       "xMLEqLC2MvHjIHuD0xxf": "main-image-loaded",
        "yOKoknIYYzAE90pe7_SE": "main-image-loading",
+       "tulkrakGcFm4fc23e1Lc": "main-image-loading",
        "E1Cm2thXvhsxyhom": "main-image-rounded",
        "AZXSqigfbEKLSnNVm1g7": "main-image-rounded",
        "wcftliF4QjZKB1CYgEON": "main-imagePicker-fileInput",
@@ -1356,6 +1402,7 @@
        "N1BHSZD2BszRAq4J": "main-topBar-background",
        "T1xI1RTSFU7Wu94UuvE6": "main-topBar-background",
        "PfgTAe4hVhuNFZRuuKQG": "main-topBar-background",
+       "VF3uvIAJTYAgTCYhK9Hc": "main-topBar-background",
        "WtC1lGbmQRplD6JBhNFU": "main-topBar-buddyFeed",
        "pefa1_ZALRn90eYLANvw": "main-topBar-buddyFeed",
        "IAyWaeDamLJLjxuPeVKw": "main-topBar-buddyFeed",
@@ -1364,19 +1411,25 @@
        "CE17OcVsW2svuK7ebBcx": "main-topBar-buddyFeedIcon",
        "ql0zZd7giPXSnPg75NR0": "main-topBar-button",
        "J6VTd7VdGN2PM_oXCAyH": "main-topBar-button",
+       "YCQudASYII9oSA3VRAJv": "main-topBar-button",
        "qvXMfQh1CjESoKKX49Bl": "main-topBar-buttonActive",
        "bTx8oDVa08kc2tDc": "main-topBar-container",
        "VCH3TJP5s27cQwnxWKnA": "main-topBar-container",
        "facDIsOQo9q7kiWc4jSg": "main-topBar-container",
+       "k0uNGIIWcXreTlFxJLQE": "main-topBar-container",
        "MIX_wd0K1tVHme_pwV2F": "main-topBar-contentArea",
        "BkpKedcdaMGbvgXMlmcg": "main-topBar-contentArea",
+       "pYTZtB41EdPEHJORkp4m": "main-topBar-contentArea",
        "OOsg_GCQDERDXc1d0EmC": "main-topBar-entryPoints",
        "pfMoD1MbelMuF1m8QeMc": "main-topBar-forward",
+       "DZrn0sdiVhJrXNOIIwgJ": "main-topBar-forward",
        "Oq5wiHCwgjjMg_VYy068": "main-topBar-fullscreenHistoryButtons",
        "VgSbatGBB9XwTH2_dsxg": "main-topBar-historyButtons",
        "fWwn9sakqBBjgiNti7LD": "main-topBar-historyButtons",
+       "_ehvtNb15IxmxomR0T9E": "main-topBar-historyButtons",
        "ou0osOf3R1ZRWQ1xzFd9": "main-topBar-icon",
        "IYDlXmBmmUKHveMzIPCF": "main-topBar-icon",
+       "XnDQ91Oe6pIqmTIBV3kf": "main-topBar-icon",
        "cqO5c3gPyN6tXIddpWfr": "main-topBar-left",
        "qxbaGYC8rgMLfyOuYRCM": "main-topBar-loggedOut",
        "LKFFk88SIRC9QKKUWR5u": "main-topBar-loginButtons",
@@ -1384,9 +1437,11 @@
        "AGRpGUcmqIgVZ5Nh": "main-topBar-overlay",
        "fKbzlgPXfvClLUUKYLxj": "main-topBar-overlay",
        "EvIR4O7jOSbNmxtMdIQ0": "main-topBar-overlay",
+       "rhgad0KCkY7pC3Jjdt9T": "main-topBar-overlay",
        "DWIabsKiPzMNV7HphphB": "main-topBar-playButtonWrapper",
        "EcY_T1Upcf0BwniO": "main-topBar-playButtonWrapper",
        "CWFTCu03cdDALodezHmA": "main-topBar-responsiveForward",
+       "vGxcYBngtOYchloEXel_": "main-topBar-responsiveForward",
        "fl1Ov5aB9YCKnMkJYpEu": "main-topBar-right",
        "VGKBvschhennrwdTibUE": "main-topBar-rightSidebarVisible",
        "oyLHDDA5CuA84lzZ": "main-topBar-searchBar",
@@ -1399,6 +1454,7 @@
        "SgtTbe7qcK0Rae6rXLWm": "main-topBar-topbarContent",
        "NXttmW3KPwE1r4Am": "main-topBar-topbarContent",
        "qHWqOt_TYlFxiF0Dm2fD": "main-topBar-topbarContent",
+       "VSCYZSO7dit4MeBttlqI": "main-topBar-topbarContent",
        "ZoyIPzfLrJUqGdBV": "main-topBar-topbarContentContainer",
        "dF0K0jaEfxecrAYyZnVY": "main-topBar-topbarContentContainer",
        "VHvOWFJZz7l5Py6Vud3A": "main-topBar-topbarContentRight",
@@ -1409,6 +1465,7 @@
        "rovbQsmAS_mwvpKHaVhQ": "main-topBar-topbarContentWrapper",
        "FdWkUygeG4YIau9k": "main-topBar-topbarContentWrapper",
        "QoAE5SWKbvYt9ogonr6e": "main-topBar-topbarContentWrapper",
+       "h7p8IPUBTz82rN27_RIE": "main-topBar-topbarContentWrapper",
        "sNde2kloCY28V4GB9AvP": "main-topBar-topNavBarLinks",
        "k0vXhOdr0XE83lAQaJ1O": "main-topBar-topNavBarSeparator",
        "Upqw01TOXETOmR5Td7Dj": "main-topBar-UpgradeButton",
@@ -1420,6 +1477,7 @@
        "kwTbLplLLsW6T_LrtR7_": "main-topBar-whatsNewFeedNotificationDot",
        "dmF7or26BvPJs5kQtYVH": "main-topBar-whatsNewFeedNotificationTitle",
        "coBkWVskipFo8KxLKief": "main-topBar-withBackgroundBlur",
+       "POdOqEdsK4cpUcw1vsUz": "main-topBar-withBackgroundBlur",
        "g_OLJCea3ISA_OEZXMld": "main-topBarStatusIndicator-enter",
        "eUtkhxZmvSKe4G9vJbvG": "main-topBarStatusIndicator-enterActive",
        "y0CwI5JkA0h0OyLFf53Q": "main-topBarStatusIndicator-exitActive",
@@ -1987,6 +2045,7 @@
        "fDGGPFmD54w05ut8Ns4S": "playback-progressbar",
        "tNhfHQhWhj9RoA1rfwY5": "playback-progressbar-container",
        "B1vgcMXBqOxgMxXh5j1f": "playback-progressbar-container",
+       "PuvORL_2IYHBmI6V": "playback-progressbar-container",
        "ihE8PJvbefgJmRhO": "playback-progressbar-isInteractive",
        "WFFDxnFUICVFNvvNU1IE": "playback-progressbar-isInteractive",
        "OEbZDzXdU1OUQactz3ZA": "playback-progressbar-isInteractive",
@@ -2160,6 +2219,15 @@
        "LtqMCWXd5Nkemkym": "Root__right-sidebar",
        "OTfMDdomT5S7B5dbYTT8": "Root__right-sidebar",
        "lAtoMFm8vg4yAlGztUxI": "Root__right-sidebar",
+       "eWU4JoxyECcwnSf_": "Root__right-sidebar-peek",
+       "SC_eWQl28srvyLED": "Root__right-sidebar-fauxMainViewEnd",
+       "vH8s0xuGZZAqkkUl": "Root__right-sidebar-overlayWrapper",
+       "a_fKt7xvd8od_kEb": "Root__right-sidebar-peekContent",
+       "wJiY1vDfuci2a4db": "Root__right-sidebar-overlay",
+       "Q3fgyBaNgcu34CP1": "Root__right-sidebar-overlayButton",
+       "Vmaq2JjgsQ0qt9VG": "Root__right-sidebar-expanded",
+       "fEThIghNSPAx5Xs3": "Root__right-sidebar-collapsed",
+       "WXUVXy433Xk07S0H": "Root__right-sidebar-deferredCollapsed",
        "PHgyArRLVFknlaOm31ID": "Root__top-bar",
        "ZQftYELq0aOsg6tPbVbV": "Root__top-container",
        "POZtIm1wHFiwlxZY5i0a": "Root__top-container",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/go.mod new/cli-2.45.0/go.mod
--- old/cli-2.44.0/go.mod       2026-07-05 00:54:22.000000000 +0200
+++ new/cli-2.45.0/go.mod       2026-09-10 01:21:38.000000000 +0200
@@ -6,8 +6,8 @@
        github.com/go-ini/ini v1.67.0
        github.com/mattn/go-colorable v0.1.15
        github.com/pterm/pterm v0.12.82
-       golang.org/x/net v0.56.0
-       golang.org/x/sys v0.46.0
+       golang.org/x/net v0.57.0
+       golang.org/x/sys v0.47.0
 )
 
 require (
@@ -22,6 +22,6 @@
        github.com/rivo/uniseg v0.4.7 // indirect
        github.com/stretchr/testify v1.9.0 // indirect
        github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
-       golang.org/x/term v0.44.0 // indirect
-       golang.org/x/text v0.38.0 // indirect
+       golang.org/x/term v0.45.0 // indirect
+       golang.org/x/text v0.40.0 // indirect
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/go.sum new/cli-2.45.0/go.sum
--- old/cli-2.44.0/go.sum       2026-07-05 00:54:22.000000000 +0200
+++ new/cli-2.45.0/go.sum       2026-09-10 01:21:38.000000000 +0200
@@ -81,8 +81,8 @@
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod 
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
-golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
+golang.org/x/net v0.57.0 h1:K5+3DljvIuDG9/Jv9rvyMywYNFCQ9RSUY6OOTTkT+tE=
+golang.org/x/net v0.57.0/go.mod h1:KpXc8iv+r3XplLAG/f7Jsf9RPszJzdR0f58q9vGOuEU=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -98,22 +98,22 @@
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
-golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
+golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
-golang.org/x/term v0.44.0/go.mod 
h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
+golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0=
+golang.org/x/term v0.45.0/go.mod 
h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
-golang.org/x/text v0.38.0/go.mod 
h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
+golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs=
+golang.org/x/text v0.40.0/go.mod 
h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod 
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/install.sh new/cli-2.45.0/install.sh
--- old/cli-2.44.0/install.sh   2026-07-05 00:54:22.000000000 +0200
+++ new/cli-2.45.0/install.sh   2026-09-10 01:21:38.000000000 +0200
@@ -146,7 +146,13 @@
 
 echo
 log "spicetify v$tag was installed successfully to $spicetify_install"
-log "Run 'spicetify --help' to get started"
+if [ -n "${shellrc:-}" ] && [ -f "$shellrc" ]; then
+    log "Open a new terminal or reload your shell profile to use spicetify:"
+    log "  source \"$shellrc\""
+    log "Then run 'spicetify --help' to get started"
+else
+    log "After adding spicetify to your PATH, run 'spicetify --help' to get 
started"
+fi
 
 echo "Do you want to install spicetify Marketplace? (Y/n)"
 read -r choice < /dev/tty
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/spicetify.go new/cli-2.45.0/spicetify.go
--- old/cli-2.44.0/spicetify.go 2026-07-05 00:54:22.000000000 +0200
+++ new/cli-2.45.0/spicetify.go 2026-09-10 01:21:38.000000000 +0200
@@ -52,8 +52,14 @@
        log.SetOutput(colorable.NewColorableStdout())
 
        // Separates flags and commands
+       parseFlags := true
        for _, v := range os.Args[1:] {
-               if len(v) > 0 && v[0] == '-' {
+               if parseFlags && v == "--" {
+                       parseFlags = false
+                       continue
+               }
+
+               if parseFlags && len(v) > 0 && v[0] == '-' {
                        if len(v) > 2 && v[1] != '-' {
                                for _, char := range v[1:] {
                                        flags = append(flags, "-"+string(char))
@@ -494,6 +500,8 @@
 
 --bypass-admin      Bypass admin or root (sudo) check. NOT RECOMMENDED
 
+--                  Stop parsing flags; treat remaining arguments as command 
values
+
 -c, --config        Print config file path and quit
 
 -h, --help          Print this help text and quit
@@ -532,6 +540,8 @@
 spotify_launch_flags <string>
     Command-line flags used when launching/restarting Spotify.
     Separate each flag with "|".
+    To set flags from the CLI, place "--" before the value.
+    Example: spicetify config spotify_launch_flags -- "--flag-1|--flag-2"
     List of valid flags: 
https://spicetify.app/docs/development/spotify-cli-flags
 
 always_enable_devtools <0 | 1>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/src/apply/apply.go 
new/cli-2.45.0/src/apply/apply.go
--- old/cli-2.44.0/src/apply/apply.go   2026-07-05 00:54:22.000000000 +0200
+++ new/cli-2.45.0/src/apply/apply.go   2026-09-10 01:21:38.000000000 +0200
@@ -360,7 +360,7 @@
 
                utils.ReplaceOnce(
                        &content,
-                       
`(\.f\.miniCss=function\(\w+,\w+\).*?\(\{)([0-9:,]+)(\}\)\[\w+\])`,
+                       
`(\.f\.miniCss=function\(\w+,\w+(?:,\w+)?\).*?\(\{)([0-9:,]+)(\}\)\[\w+\])`,
                        func(submatches ...string) string {
                                return fmt.Sprintf("%s%s%s%s", submatches[1], 
submatches[2], cssEnableMap, submatches[3])
                        })
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/src/cmd/apply.go 
new/cli-2.45.0/src/cmd/apply.go
--- old/cli-2.44.0/src/cmd/apply.go     2026-07-05 00:54:22.000000000 +0200
+++ new/cli-2.45.0/src/cmd/apply.go     2026-09-10 01:21:38.000000000 +0200
@@ -367,8 +367,7 @@
                }
 
                jsTemplate := fmt.Sprintf(
-                       
`((globalScope)=>((globalScope.rspackChunkclient_web=globalScope.rspackChunkclient_web||globalScope.webpackChunkclient_web||[]),(globalScope.webpackChunkclient_web=globalScope.webpackChunkclient_web||globalScope.rspackChunkclient_web)))
-("undefined"!=typeof self?self:global).push([["%s"],{"%s":(e,t,n)=>{
+                       `((e)=>{const 
t=e.rspackChunk||e.rspackChunkclient_web||e.webpackChunkclient_web||[];return 
e.rspackChunk=e.rspackChunk||t,e.rspackChunkclient_web=e.rspackChunkclient_web||t,e.webpackChunkclient_web=e.webpackChunkclient_web||t,t})("undefined"!=typeof
 self?self:globalThis).push([["%s"],{"%s":(e,t,n)=>{
 "use strict";n.r(t),n.d(t,{default:()=>render});
 %s
 }}]);`,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/src/cmd/config.go 
new/cli-2.45.0/src/cmd/config.go
--- old/cli-2.44.0/src/cmd/config.go    2026-07-05 00:54:22.000000000 +0200
+++ new/cli-2.45.0/src/cmd/config.go    2026-09-10 01:21:38.000000000 +0200
@@ -20,9 +20,7 @@
                switch field {
                case "extensions", "custom_apps":
                        arrayType(featureSection, field, value)
-               case "spotify_launch_flags":
-                       // not editable via config command
-               case "prefs_path", "spotify_path", "current_theme", 
"color_scheme":
+               case "prefs_path", "spotify_path", "current_theme", 
"color_scheme", "spotify_launch_flags":
                        stringType(settingSection, field, value)
 
                default:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/src/jsHelper/spicetifyWrapper/popup.js 
new/cli-2.45.0/src/jsHelper/spicetifyWrapper/popup.js
--- old/cli-2.44.0/src/jsHelper/spicetifyWrapper/popup.js       2026-07-05 
00:54:22.000000000 +0200
+++ new/cli-2.45.0/src/jsHelper/spicetifyWrapper/popup.js       2026-09-10 
01:21:38.000000000 +0200
@@ -1,3 +1,22 @@
+function injectStyles() {
+  if (document.querySelector("style.spicetify-popup-modal")) return;
+
+  const style = document.createElement("style");
+  style.className = "spicetify-popup-modal";
+  style.textContent = `
+generic-modal :where(.spicetify-popup) { display: flex; max-height: calc(100vh 
- 64px); border-radius: 8px; overflow: hidden; }
+generic-modal :where(.spicetify-popup-container) { display: flex; 
flex-direction: column; width: 524px; max-width: 100%; min-height: 0; 
border-radius: 8px; color: var(--spice-text, var(--text-base, #fff)); 
background-color: var(--spice-player, var(--background-elevated-base, 
#121212)); }
+generic-modal :where(.spicetify-popup-container-large) { width: 664px; }
+generic-modal :where(.spicetify-popup-header) { display: flex; flex: 0 0 auto; 
align-items: center; justify-content: space-between; gap: 16px; padding: 24px; }
+generic-modal :where(.spicetify-popup-title) { margin: 0; font-size: 1.5rem; 
font-weight: 700; line-height: 1.3; }
+generic-modal :where(.spicetify-popup-closeBtn) { display: flex; flex: 0 0 
auto; align-items: center; justify-content: center; width: 32px; height: 32px; 
padding: 0; margin-block-start: -8px; margin-inline-end: -8px; border: 0; 
border-radius: 50%; background-color: transparent; color: var(--spice-subtext, 
var(--text-subdued, #b3b3b3)); cursor: pointer; }
+generic-modal :where(.spicetify-popup-closeBtn:hover) { color: 
var(--spice-text, var(--text-base, #fff)); }
+generic-modal :where(.spicetify-popup-closeBtn:focus-visible) { outline: 2px 
solid currentColor; outline-offset: 2px; }
+generic-modal :where(.spicetify-popup-content) { flex: 1 1 auto; min-height: 
0; overflow-y: auto; padding: 0 24px 24px; }
+`;
+  document.head.append(style);
+}
+
 class _HTMLGenericModal extends HTMLElement {
   hide() {
     Spicetify.ReactDOM.unmountComponentAtNode(this.querySelector("main"));
@@ -5,15 +24,21 @@
   }
 
   display({ title, content, isLarge = false }) {
+    injectStyles();
+
+    const containerClass = isLarge
+      ? "spicetify-popup-container spicetify-popup-container-large 
main-embedWidgetGenerator-container"
+      : "spicetify-popup-container main-trackCreditsModal-container";
+
     this.innerHTML = `
 <div class="GenericModal__overlay" style="z-index: 100;">
-       <div class="GenericModal" tabindex="-1" role="dialog" 
aria-label="${title}" aria-modal="true">
-               <div class="${isLarge ? "main-embedWidgetGenerator-container" : 
"main-trackCreditsModal-container"}">
-                       <div class="main-trackCreditsModal-header">
-                               <h1 class="main-type-alto" as="h1">${title}</h1>
-                               <button aria-label="Close" 
class="main-trackCreditsModal-closeBtn"><svg width="18" height="18" viewBox="0 
0 32 32" xmlns="http://www.w3.org/2000/svg";><title>Close</title><path 
d="M31.098 29.794L16.955 15.65 31.097 1.51 29.683.093 15.54 14.237 1.4.094-.016 
1.508 14.126 15.65-.016 29.795l1.414 1.414L15.54 17.065l14.144 14.143" 
fill="currentColor" fill-rule="evenodd"></path></svg></button>
+       <div class="GenericModal spicetify-popup" tabindex="-1" role="dialog" 
aria-label="${title}" aria-modal="true">
+               <div class="${containerClass}">
+                       <div class="spicetify-popup-header 
main-trackCreditsModal-header">
+                               <h1 class="spicetify-popup-title 
main-type-alto" as="h1">${title}</h1>
+                               <button aria-label="Close" 
class="spicetify-popup-closeBtn main-trackCreditsModal-closeBtn"><svg 
width="18" height="18" viewBox="0 0 32 32" 
xmlns="http://www.w3.org/2000/svg";><title>Close</title><path d="M31.098 
29.794L16.955 15.65 31.097 1.51 29.683.093 15.54 14.237 1.4.094-.016 1.508 
14.126 15.65-.016 29.795l1.414 1.414L15.54 17.065l14.144 14.143" 
fill="currentColor" fill-rule="evenodd"></path></svg></button>
                        </div>
-                       <div class="main-trackCreditsModal-mainSection">
+                       <div class="spicetify-popup-content 
main-trackCreditsModal-mainSection">
                                <main 
class="main-trackCreditsModal-originalCredits"></main>
                        </div>
                </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/cli-2.44.0/src/jsHelper/spicetifyWrapper/webpack/runtime-resolvers.js 
new/cli-2.45.0/src/jsHelper/spicetifyWrapper/webpack/runtime-resolvers.js
--- old/cli-2.44.0/src/jsHelper/spicetifyWrapper/webpack/runtime-resolvers.js   
2026-07-05 00:54:22.000000000 +0200
+++ new/cli-2.45.0/src/jsHelper/spicetifyWrapper/webpack/runtime-resolvers.js   
2026-09-10 01:21:38.000000000 +0200
@@ -127,7 +127,7 @@
     Spicetify.ReactQuery.useInfiniteQuery = 
Object.values(require(infiniteQueryChunk[0])).find((m) => typeof m === 
"function");
   }
 
-  if (Spicetify.Color) Spicetify.Color.CSSFormat = modules.find((m) => 
m?.RGBA);
+  if (Spicetify.Color) Spicetify.Color.CSSFormat = modules.find((m) => typeof 
m?.RGBA === "number");
 
   // Combine snackbar and notification
   (function bindShowNotification(attempt = 0) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/src/jsHelper/spicetifyWrapper/webpack.js 
new/cli-2.45.0/src/jsHelper/spicetifyWrapper/webpack.js
--- old/cli-2.44.0/src/jsHelper/spicetifyWrapper/webpack.js     2026-07-05 
00:54:22.000000000 +0200
+++ new/cli-2.45.0/src/jsHelper/spicetifyWrapper/webpack.js     2026-09-10 
01:21:38.000000000 +0200
@@ -9,7 +9,7 @@
 import { waitForURI } from "./webpack/uri.js";
 
 void (async function hotloadWebpackModules() {
-  const getChunkQueue = () => window?.webpackChunkclient_web || 
window?.rspackChunkclient_web;
+  const getChunkQueue = () => window?.rspackChunk || 
window?.rspackChunkclient_web || window?.webpackChunkclient_web;
   const chunkQueue = await waitFor(getChunkQueue, 50);
 
   // Force all webpack modules to load
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cli-2.44.0/src/preprocess/preprocess.go 
new/cli-2.45.0/src/preprocess/preprocess.go
--- old/cli-2.44.0/src/preprocess/preprocess.go 2026-07-05 00:54:22.000000000 
+0200
+++ new/cli-2.45.0/src/preprocess/preprocess.go 2026-09-10 01:21:38.000000000 
+0200
@@ -252,7 +252,7 @@
                                        }
 
                                        // to avoid syntaxerror on Spotify 
1.2.78 and above
-                                       if spotifyMajor >= 1 && spotifyMinor >= 
2 && spotifyPatch < 78 {
+                                       if spotifyMajor == 1 && spotifyMinor == 
2 && spotifyPatch < 78 {
                                                utils.ReplaceOnce(&content, 
`\(\({[^}]*,\s*imageSrc`, func(submatches ...string) string {
                                                        return 
fmt.Sprintf("Spicetify.Snackbar.enqueueImageSnackbar=%s", submatches[0])
                                                })
@@ -296,7 +296,7 @@
                                }
                                if fileName == "xpui.css" || fileName == 
"xpui-snapshot.css" {
                                        content = content + `
-.main-gridContainer-fixedWidth{grid-template-columns:repeat(auto-fill,var(--column-width));width:calc((var(--column-count)
 - 1) * var(--grid-gap)) + var(--column-count) * var(--column-width) 
)}.main-cardImage-imageWrapper{background-color:var(--card-color,#333);border-radius:6px;-webkit-box-shadow:0
 8px 24px rgba(0,0,0,.5);box-shadow:0 8px 24px 
rgba(0,0,0,.5);padding-bottom:100%;position:relative;width:100%}.main-card-imagePlaceholder,.main-cardImage-image{height:100%;left:0;position:absolute;top:0;width:100%}.main-card-card{border-radius:8px;-webkit-box-flex:1;background:var(--spice-player);-ms-flex:1;flex:1;isolation:isolate;padding:16px;position:relative;-webkit-transition:background-color
 .3s;transition:background-color 
.3s;width:100%}.main-card-card:hover,.main-card-card[data-context-menu-open=true]{background:var(--spice-card)}.main-card-card:focus-within{background:var(--spice-card)}.main-card-card
 .main-card-cardLink{position:absolute;z-index:0}.RjYPjR7FsVf42b3a5Efm:before,.
 Z78JmW4GUvvxLXSFjb7R:not(:last-child):after{content:"•";margin:0 
4px}.main-card-card a,.main-card-card 
button{position:relative;z-index:1}.main-card-cardLink{bottom:0;content:"";cursor:pointer;left:0;overflow:hidden;right:0;text-indent:100%;top:0;white-space:nowrap;z-index:0}.main-card-cardTitle{z-index:1}.main-card-cardTitleLink:focus,.main-card-cardTitleLink:hover{text-decoration:none}.Wmr5qZ5jui6X37XCrChA{opacity:0}.main-card-newEpisodeIndicator{margin-top:3px}.main-card-imageContainer{pointer-events:none;position:relative}.main-card-imageContainerOld,.main-card-imageContainerSkeleton{margin-bottom:16px}.main-card-cardMetadata{min-height:62px;-webkit-line-clamp:2}.main-card-DownloadStatusIndicator{bottom:12px;inset-inline-end:12px;position:absolute}.main-card-PlayButtonContainer{border-radius:500px;bottom:8px;-webkit-box-shadow:0
 8px 8px rgba(var(--spice-rgb-shadow),.3);box-shadow:0 8px 8px 
rgba(var(--spice-rgb-shadow),.3);inset-inline-end:8px;opacity:0;pointer-events:none;
 
position:absolute;-webkit-transform:translateY(8px);transform:translateY(8px);z-index:2}@media(pointer:coarse){.main-card-PlayButtonContainer{display:none}}@media(prefers-reduced-motion:no-preference){.main-card-PlayButtonContainer{-webkit-transition:opacity
 .2s ease-out,-webkit-transform .2s ease-out;transition:transform .2s 
ease-out,opacity .2s ease-out,-webkit-transform .2s 
ease-out}}.main-card-PlayButtonContainerVisible{opacity:1;pointer-events:auto;position:absolute;-webkit-transform:translateY(0);transform:translateY(0)}.main-card-cardContainer{--animation-speed:0.2s!important;white-space:normal}.main-card-card:hover
 .main-card-PlayButtonContainer,.main-card-cardContainer:hover 
.main-card-PlayButtonContainer{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}.main-card-card:focus-within
 
.main-card-PlayButtonContainer,.main-card-cardContainer:focus-within{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}@media(pointer:fine){.main-card-card
 .main-
 card-cardLink:hover{cursor:pointer}.main-card-card:hover 
.main-card-PlayButtonContainer,.main-card-cardContainer:hover 
.main-card-PlayButtonContainer{opacity:1;pointer-events:auto;position:absolute}.main-card-card:focus-within
 .main-card-PlayButtonContainer,.main-card-cardContainer:focus-within 
.main-card-PlayButtonContainer{opacity:1;pointer-events:auto;position:absolute}}.main-card-cardMetadata,.v3isO2phyJAoZRkmme0G{display:-webkit-box;-webkit-box-orient:vertical}
+                                               
.main-gridContainer-fixedWidth{grid-template-columns:repeat(auto-fill,var(--column-width));width:calc((var(--column-count)
 - 1) * var(--grid-gap) + var(--column-count) * 
var(--column-width))}.main-cardImage-imageWrapper{background-color:var(--card-color,#333);border-radius:var(--card-image-radius,6px);box-shadow:0
 8px 24px 
rgba(0,0,0,.5);padding-bottom:100%;position:relative;width:100%}.main-cardImage-circular{--card-image-radius:50%}.main-card-imagePlaceholder,.main-cardImage-image{height:100%;left:0;position:absolute;top:0;width:100%}.main-card-card{border-radius:8px;-webkit-box-flex:1;background:var(--spice-player);-ms-flex:1;flex:1;isolation:isolate;padding:16px;position:relative;-webkit-transition:background-color
 .3s;transition:background-color 
.3s;width:100%}.main-card-card:hover,.main-card-card[data-context-menu-open=true]{background:var(--spice-card)}.main-card-card:focus-within{background:var(--spice-card)}.main-card-card
 .main-card-cardLink{position:absolute;z-index
 
:0}.RjYPjR7FsVf42b3a5Efm:before,.Z78JmW4GUvvxLXSFjb7R:not(:last-child):after{content:"\2022";margin:0
 4px}.main-card-card a,.main-card-card 
button{position:relative;z-index:1}.main-card-cardLink{bottom:0;content:"";cursor:pointer;left:0;overflow:hidden;right:0;text-indent:100%;top:0;white-space:nowrap;z-index:0}.main-card-cardTitle{z-index:1}.main-card-cardTitleLink:focus,.main-card-cardTitleLink:hover{text-decoration:none}.Wmr5qZ5jui6X37XCrChA{opacity:0}.main-card-newEpisodeIndicator{margin-top:3px}.main-card-imageContainer{pointer-events:none;position:relative}.main-card-imageContainerOld,.main-card-imageContainerSkeleton{margin-bottom:16px}.main-card-cardMetadata{min-height:62px;line-clamp:2;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis}.main-card-DownloadStatusIndicator{bottom:12px;inset-inline-end:12px;position:absolute}.main-card-PlayButtonContainer{border-radius:500px;bottom:8px;-webkit-box-shadow:0
 8px 8px rgba(var(--spice-rgb-shadow),.3);box-shadow:0 8px 8px r
 
gba(var(--spice-rgb-shadow),.3);inset-inline-end:8px;opacity:0;pointer-events:none;position:absolute;-webkit-transform:translateY(8px);transform:translateY(8px);z-index:2}@media(pointer:coarse){.main-card-PlayButtonContainer{display:none}}@media(prefers-reduced-motion:no-preference){.main-card-PlayButtonContainer{-webkit-transition:opacity
 .2s ease-out,-webkit-transform .2s ease-out;transition:transform .2s 
ease-out,opacity .2s ease-out,-webkit-transform .2s 
ease-out}}.main-card-PlayButtonContainerVisible{opacity:1;pointer-events:auto;position:absolute;-webkit-transform:translateY(0);transform:translateY(0)}.main-card-cardContainer{--animation-speed:0.2s!important;white-space:normal}.main-card-card:hover
 .main-card-PlayButtonContainer,.main-card-cardContainer:hover 
.main-card-PlayButtonContainer{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}.main-card-card:focus-within
 
.main-card-PlayButtonContainer,.main-card-cardContainer:focus-within{opacity:1;-webkit-transfor
 m:translateY(0);transform:translateY(0)}@media(pointer:fine){.main-card-card 
.main-card-cardLink:hover{cursor:pointer}.main-card-card:hover 
.main-card-PlayButtonContainer,.main-card-cardContainer:hover 
.main-card-PlayButtonContainer{opacity:1;pointer-events:auto;position:absolute}.main-card-card:focus-within
 .main-card-PlayButtonContainer,.main-card-cardContainer:focus-within 
.main-card-PlayButtonContainer{opacity:1;pointer-events:auto;position:absolute}}.main-card-cardMetadata,.v3isO2phyJAoZRkmme0G{display:-webkit-box;-webkit-box-orient:vertical}
                                        `
                                }
                                return content
@@ -345,6 +345,20 @@
 }
 
 func colorVariableReplace(content string) string {
+       hexAlphaReplacement := func(maxValue float64) func(submatches 
...string) string {
+               return func(submatches ...string) string {
+                       alpha, err := strconv.ParseUint(submatches[1], 16, 8)
+                       if err != nil {
+                               return submatches[0]
+                       }
+
+                       return fmt.Sprintf(
+                               "rgba(var(--spice-rgb-text),%s)",
+                               strconv.FormatFloat(float64(alpha)/maxValue, 
'f', -1, 64),
+                       )
+               }
+       }
+
        colorPatches := []Patch{
                {
                        Name:  "CSS: --spice-player",
@@ -403,6 +417,16 @@
                        },
                },
                {
+                       Name:        "CSS: --spice-rgb-text (8-digit hex)",
+                       Regex:       `(?i)#ffffff([0-9a-f]{2})\b`,
+                       Replacement: hexAlphaReplacement(255),
+               },
+               {
+                       Name:        "CSS: --spice-rgb-text (4-digit hex)",
+                       Regex:       `(?i)#fff([0-9a-f])\b`,
+                       Replacement: hexAlphaReplacement(15),
+               },
+               {
                        Name:  "CSS: --spice-text",
                        Regex: `(white;|#fff|#ffffff|#f8f8f8)\b`,
                        Replacement: func(submatches ...string) string {
@@ -466,6 +490,13 @@
                        },
                },
                {
+                       Name:  "CSS (rgba): --spice-rgb-text",
+                       Regex: `(?i)rgba\(\s*255\s*,\s*255\s*,\s*255\s*,`,
+                       Replacement: func(submatches ...string) string {
+                               return "rgba(var(--spice-rgb-text),"
+                       },
+               },
+               {
                        Name:  "CSS (rgba): --spice-main",
                        Regex: `rgba\(18,18,18,([\d\.]+)\)`,
                        Replacement: func(submatches ...string) string {

++++++ cli.obsinfo ++++++
--- /var/tmp/diff_new_pack.QOqGDX/_old  2026-09-11 18:06:25.771626570 +0200
+++ /var/tmp/diff_new_pack.QOqGDX/_new  2026-09-11 18:06:25.773626654 +0200
@@ -1,5 +1,5 @@
 name: cli
-version: 2.44.0
-mtime: 1783205662
-commit: e1f66811a635557cabbd8726cf0bcc5c3ce2b084
+version: 2.45.0
+mtime: 1788996098
+commit: 0eb878e0ef981623f86fa3252dd830a5990847fb
 

++++++ vendor.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/syscall_linux.go 
new/vendor/golang.org/x/sys/unix/syscall_linux.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux.go   2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux.go   2026-09-10 
01:21:38.000000000 +0200
@@ -1874,6 +1874,7 @@
 //sys  Dup3(oldfd int, newfd int, flags int) (err error)
 //sysnb        EpollCreate1(flag int) (fd int, err error)
 //sysnb        EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err 
error)
+//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = 
SYS_EPOLL_PWAIT
 //sys  Eventfd(initval uint, flags int) (fd int, err error) = SYS_EVENTFD2
 //sys  Exit(code int) = SYS_EXIT_GROUP
 //sys  Fallocate(fd int, mode uint32, off int64, len int64) (err error)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/syscall_linux_386.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_386.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_386.go       2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_386.go       2026-09-10 
01:21:38.000000000 +0200
@@ -20,7 +20,6 @@
 
 // 64-bit file system and 32-bit uid calls
 // (386 default is 32-bit file system and 16-bit uid).
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64_64
 //sys  Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
 //sys  Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go     2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go     2026-09-10 
01:21:38.000000000 +0200
@@ -6,7 +6,6 @@
 
 package unix
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Fstat(fd int, stat *Stat_t) (err error)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/syscall_linux_arm.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_arm.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_arm.go       2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_arm.go       2026-09-10 
01:21:38.000000000 +0200
@@ -44,7 +44,6 @@
 
 // 64-bit file system and 32-bit uid calls
 // (16-bit uid calls are not always supported in newer kernels)
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
 //sys  Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
 //sys  Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = 
SYS_FSTATAT64
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go     2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go     2026-09-10 
01:21:38.000000000 +0200
@@ -8,7 +8,6 @@
 
 import "unsafe"
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = 
SYS_EPOLL_PWAIT
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Fstat(fd int, stat *Stat_t) (err error)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go   2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go   2026-09-10 
01:21:38.000000000 +0200
@@ -8,7 +8,6 @@
 
 import "unsafe"
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = 
SYS_EPOLL_PWAIT
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Fstatfs(fd int, buf *Statfs_t) (err error)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go   2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go   2026-09-10 
01:21:38.000000000 +0200
@@ -6,7 +6,6 @@
 
 package unix
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Fstatfs(fd int, buf *Statfs_t) (err error)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go     2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go     2026-09-10 
01:21:38.000000000 +0200
@@ -13,7 +13,6 @@
 
 func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 
uintptr, err syscall.Errno)
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go       2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go       2026-09-10 
01:21:38.000000000 +0200
@@ -11,7 +11,6 @@
        "unsafe"
 )
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
 //sys  Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = 
SYS_FSTATAT64
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go    2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go    2026-09-10 
01:21:38.000000000 +0200
@@ -6,7 +6,6 @@
 
 package unix
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Fstat(fd int, stat *Stat_t) (err error)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go   2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go   2026-09-10 
01:21:38.000000000 +0200
@@ -8,7 +8,6 @@
 
 import "unsafe"
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = 
SYS_EPOLL_PWAIT
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Fstat(fd int, stat *Stat_t) (err error)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go     2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go     2026-09-10 
01:21:38.000000000 +0200
@@ -10,7 +10,6 @@
        "unsafe"
 )
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Fstat(fd int, stat *Stat_t) (err error)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go 
new/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go
--- old/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go   2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go   2026-09-10 
01:21:38.000000000 +0200
@@ -6,7 +6,6 @@
 
 package unix
 
-//sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 //sys  Fadvise(fd int, offset int64, length int64, advice int) (err error) = 
SYS_FADVISE64
 //sys  Fchown(fd int, uid int, gid int) (err error)
 //sys  Fstat(fd int, stat *Stat_t) (err error)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zerrors_linux.go 
new/vendor/golang.org/x/sys/unix/zerrors_linux.go
--- old/vendor/golang.org/x/sys/unix/zerrors_linux.go   2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zerrors_linux.go   2026-09-10 
01:21:38.000000000 +0200
@@ -1359,6 +1359,7 @@
        FAN_UNLIMITED_MARKS                         = 0x20
        FAN_UNLIMITED_QUEUE                         = 0x10
        FD_CLOEXEC                                  = 0x1
+       FD_PIDFS_ROOT                               = -0x2712
        FD_SETSIZE                                  = 0x400
        FF0                                         = 0x0
        FIB_RULE_DEV_DETACHED                       = 0x8
@@ -1970,6 +1971,8 @@
        MADV_DONTNEED                               = 0x4
        MADV_DONTNEED_LOCKED                        = 0x18
        MADV_FREE                                   = 0x8
+       MADV_GUARD_INSTALL                          = 0x66
+       MADV_GUARD_REMOVE                           = 0x67
        MADV_HUGEPAGE                               = 0xe
        MADV_HWPOISON                               = 0x64
        MADV_KEEPONFORK                             = 0x13
@@ -2114,7 +2117,7 @@
        MS_NOSEC                                    = 0x10000000
        MS_NOSUID                                   = 0x2
        MS_NOSYMFOLLOW                              = 0x100
-       MS_NOUSER                                   = -0x80000000
+       MS_NOUSER                                   = 0x80000000
        MS_POSIXACL                                 = 0x10000
        MS_PRIVATE                                  = 0x40000
        MS_RDONLY                                   = 0x1
@@ -3786,6 +3789,9 @@
        TCPOPT_TIMESTAMP                            = 0x8
        TCPOPT_TSTAMP_HDR                           = 0x101080a
        TCPOPT_WINDOW                               = 0x3
+       TCP_AO_KEYF_EXCLUDE_OPT                     = 0x2
+       TCP_AO_KEYF_IFINDEX                         = 0x1
+       TCP_AO_MAXKEYLEN                            = 0x50
        TCP_CC_INFO                                 = 0x1a
        TCP_CM_INQ                                  = 0x24
        TCP_CONGESTION                              = 0xd
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zsyscall_linux.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux.go  2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux.go  2026-09-10 
01:21:38.000000000 +0200
@@ -700,6 +700,23 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
+       var _p0 unsafe.Pointer
+       if len(events) > 0 {
+               _p0 = unsafe.Pointer(&events[0])
+       } else {
+               _p0 = unsafe.Pointer(&_zero)
+       }
+       r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
+       n = int(r0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Eventfd(initval uint, flags int) (fd int, err error) {
        r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)
        fd = int(r0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go      2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go      2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(offset), 
uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice))
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go    2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go    2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go      2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go      2026-09-10 
01:21:38.000000000 +0200
@@ -213,23 +213,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fchown(fd int, uid int, gid int) (err error) {
        _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), 
uintptr(gid))
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go    2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go    2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go  2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_loong64.go  2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go     2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go     2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall9(SYS_FADVISE64, uintptr(fd), 0, 
uintptr(offset>>32), uintptr(offset), uintptr(length>>32), uintptr(length), 
uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go   2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go   2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go 2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go 2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go   2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go   2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall9(SYS_FADVISE64, uintptr(fd), 0, uintptr(offset), 
uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 
0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go      2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go      2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fchown(fd int, uid int, gid int) (err error) {
        _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go    2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go    2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go  2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go  2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go  2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go  2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go    2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go    2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go 
new/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go
--- old/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go  2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go  2026-09-10 
01:21:38.000000000 +0200
@@ -45,23 +45,6 @@
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {
-       var _p0 unsafe.Pointer
-       if len(events) > 0 {
-               _p0 = unsafe.Pointer(&events[0])
-       } else {
-               _p0 = unsafe.Pointer(&_zero)
-       }
-       r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), 
uintptr(len(events)), uintptr(msec), 0, 0)
-       n = int(r0)
-       if e1 != 0 {
-               err = errnoErr(e1)
-       }
-       return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
        _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), 
uintptr(length), uintptr(advice), 0, 0)
        if e1 != 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/windows/security_windows.go 
new/vendor/golang.org/x/sys/windows/security_windows.go
--- old/vendor/golang.org/x/sys/windows/security_windows.go     2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/windows/security_windows.go     2026-09-10 
01:21:38.000000000 +0200
@@ -1109,17 +1109,53 @@
 )
 
 // This type is the union inside of TRUSTEE and must be created using one of 
the TrusteeValueFrom* functions.
+//
+// Go pointers stored in a TrusteeValue must be pinned using [runtime.Pinner]
+// for the lifetime of the TrusteeValue.
 type TrusteeValue uintptr
 
+// TrusteeValueFromString is unsafe and should not be used.
+//
+// It returns a uintptr containing a reference to newly-allocated memory
+// which will be freed by the garbage collector.
+// There is no way for the caller to safely reference this memory.
+//
+// To create a [TrusteeValue] from a string, use:
+//
+//     p, err := windows.UTF16PtrFromString(s)
+//     if err != nil {
+//             // handle error
+//     }
+//
+//     // Pin the string for as long as it is used.
+//     var pinner runtime.Pinner
+//     pinner.Pin(p)
+//     defer pinner.Unpin()
+//
+//     tv := TrusteeValue(unsafe.Pointer(p))
+//
+// Deprecated: TrusteeValueFromString is unsafe and should not be used.
 func TrusteeValueFromString(str string) TrusteeValue {
        return TrusteeValue(unsafe.Pointer(StringToUTF16Ptr(str)))
 }
+
+// TrusteeValueFromSID returns a [TrusteeValue] referencing sid.
+//
+// The caller must pin sid using a [runtime.Pinner] for the lifetime of the 
TrusteeValue.
 func TrusteeValueFromSID(sid *SID) TrusteeValue {
        return TrusteeValue(unsafe.Pointer(sid))
 }
+
+// TrusteeValueFromObjectsAndSid returns a [TrusteeValue] referencing 
objectsAndSid.
+//
+// The caller must pin objectsAndSid using a [runtime.Pinner] for the lifetime 
of the TrusteeValue.
 func TrusteeValueFromObjectsAndSid(objectsAndSid *OBJECTS_AND_SID) 
TrusteeValue {
        return TrusteeValue(unsafe.Pointer(objectsAndSid))
 }
+
+// TrusteeValueFromObjectsAndName returns a [TrusteeValue] referencing 
objectsAndName.
+//
+// The caller must pin objectsAndName using a [runtime.Pinner] for the 
lifetime of the TrusteeValue.
 func TrusteeValueFromObjectsAndName(objectsAndName *OBJECTS_AND_NAME) 
TrusteeValue {
        return TrusteeValue(unsafe.Pointer(objectsAndName))
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/windows/syscall_windows.go 
new/vendor/golang.org/x/sys/windows/syscall_windows.go
--- old/vendor/golang.org/x/sys/windows/syscall_windows.go      2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/windows/syscall_windows.go      2026-09-10 
01:21:38.000000000 +0200
@@ -1728,11 +1728,15 @@
 // the more common *uint16 string type.
 func NewNTString(s string) (*NTString, error) {
        var nts NTString
-       s8, err := BytePtrFromString(s)
+       s8, err := ByteSliceFromString(s)
        if err != nil {
                return nil, err
        }
-       RtlInitString(&nts, s8)
+       // The source string plus its terminating NUL must fit within 
MAX_USHORT.
+       if len(s8) > MAX_USHORT {
+               return nil, syscall.EINVAL
+       }
+       RtlInitString(&nts, &s8[0])
        return &nts, nil
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/sys/windows/types_windows.go 
new/vendor/golang.org/x/sys/windows/types_windows.go
--- old/vendor/golang.org/x/sys/windows/types_windows.go        2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/sys/windows/types_windows.go        2026-09-10 
01:21:38.000000000 +0200
@@ -169,6 +169,7 @@
        FORMAT_MESSAGE_ARGUMENT_ARRAY  = 8192
        FORMAT_MESSAGE_MAX_WIDTH_MASK  = 255
 
+       MAX_USHORT    = 0xffff
        MAX_PATH      = 260
        MAX_LONG_PATH = 32768
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/text/cases/context.go 
new/vendor/golang.org/x/text/cases/context.go
--- old/vendor/golang.org/x/text/cases/context.go       2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/text/cases/context.go       2026-09-10 
01:21:38.000000000 +0200
@@ -249,7 +249,7 @@
        return c.copy()
 }
 
-// isUpper writes the isUppercase version of the current rune to dst.
+// isUpper reports whether the current rune is in upper case.
 func isUpper(c *context) bool {
        ct := c.caseType()
        if c.info&hasMappingMask == 0 || ct == cUpper {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/text/cases/map.go 
new/vendor/golang.org/x/text/cases/map.go
--- old/vendor/golang.org/x/text/cases/map.go   2026-07-05 00:54:22.000000000 
+0200
+++ new/vendor/golang.org/x/text/cases/map.go   2026-09-10 01:21:38.000000000 
+0200
@@ -774,7 +774,7 @@
        // From CLDR:
        // # Special titlecasing for Dutch initial "ij".
        // ::Any-Title();
-       // # Fix up Ij at the beginning of a "word" (per Any-Title, notUAX #29)
+       // # Fix up Ij at the beginning of a "word" (per Any-Title, not UAX #29)
        // [:^WB=ALetter:] [:WB=Extend:]* [[:WB=MidLetter:][:WB=MidNumLet:]]? { 
Ij } → IJ ;
        if c.src[c.pSrc] != 'I' && c.src[c.pSrc] != 'i' {
                return title(c)
@@ -794,7 +794,7 @@
        // From CLDR:
        // # Special titlecasing for Dutch initial "ij".
        // ::Any-Title();
-       // # Fix up Ij at the beginning of a "word" (per Any-Title, notUAX #29)
+       // # Fix up Ij at the beginning of a "word" (per Any-Title, not UAX #29)
        // [:^WB=ALetter:] [:WB=Extend:]* [[:WB=MidLetter:][:WB=MidNumLet:]]? { 
Ij } → IJ ;
        if c.src[c.pSrc] != 'I' {
                return isTitle(c)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/text/unicode/norm/forminfo.go 
new/vendor/golang.org/x/text/unicode/norm/forminfo.go
--- old/vendor/golang.org/x/text/unicode/norm/forminfo.go       2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/text/unicode/norm/forminfo.go       2026-09-10 
01:21:38.000000000 +0200
@@ -121,8 +121,12 @@
 //
 // When all 6 bits are zero, the character is inert, meaning it is never
 // influenced by normalization.
+//
+// We set flags to 0x80 (high bit 7 unused in quick check data) to indicate an 
invalid rune.
 type qcInfo uint8
 
+func (p Properties) isInvalid() bool { return p.flags == 0x80 }
+
 func (p Properties) isYesC() bool { return p.flags&0x10 == 0 }
 func (p Properties) isYesD() bool { return p.flags&0x4 == 0 }
 
@@ -247,6 +251,9 @@
 // to a Properties.  See the comment at the top of the file
 // for more information on the format.
 func compInfo(v uint16, sz int) Properties {
+       if sz == 0 {
+               return Properties{flags: 0x80, size: 1}
+       }
        if v == 0 {
                return Properties{size: uint8(sz)}
        } else if v >= 0x8000 {
@@ -254,7 +261,7 @@
                        size:  uint8(sz),
                        ccc:   uint8(v),
                        tccc:  uint8(v),
-                       flags: qcInfo(v >> 8),
+                       flags: qcInfo(v>>8) & 0x3f,
                }
                if p.ccc > 0 || p.combinesBackward() {
                        p.nLead = uint8(p.flags & 0x3)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/text/unicode/norm/iter.go 
new/vendor/golang.org/x/text/unicode/norm/iter.go
--- old/vendor/golang.org/x/text/unicode/norm/iter.go   2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/text/unicode/norm/iter.go   2026-09-10 
01:21:38.000000000 +0200
@@ -376,16 +376,12 @@
                        goto doNorm
                }
                prevCC = i.info.tccc
-               sz := int(i.info.size)
-               if sz == 0 {
-                       sz = 1 // illegal rune: copy byte-by-byte
-               }
-               p := outp + sz
+               p := outp + int(i.info.size)
                if p > len(i.buf) {
                        break
                }
                outp = p
-               i.p += sz
+               i.p += int(i.info.size)
                if i.p >= i.rb.nsrc {
                        i.setDone()
                        break
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/golang.org/x/text/unicode/norm/normalize.go 
new/vendor/golang.org/x/text/unicode/norm/normalize.go
--- old/vendor/golang.org/x/text/unicode/norm/normalize.go      2026-07-05 
00:54:22.000000000 +0200
+++ new/vendor/golang.org/x/text/unicode/norm/normalize.go      2026-09-10 
01:21:38.000000000 +0200
@@ -148,7 +148,7 @@
 // patched buffer and whether the decomposition is still in progress.
 func patchTail(rb *reorderBuffer) bool {
        info, p := lastRuneStart(&rb.f, rb.out)
-       if p == -1 || info.size == 0 {
+       if p == -1 || info.isInvalid() {
                return true
        }
        end := p + int(info.size)
@@ -225,7 +225,7 @@
        }
        fd := &rb.f
        if doMerge {
-               var info Properties
+               info := Properties{flags: 0x80, size: 1} // invalid rune
                if p < n {
                        info = fd.info(src, p)
                        if !info.BoundaryBefore() || info.nLeadingNonStarters() 
> 0 {
@@ -235,7 +235,7 @@
                                p = decomposeSegment(rb, p, true)
                        }
                }
-               if info.size == 0 {
+               if info.isInvalid() {
                        rb.doFlush()
                        // Append incomplete UTF-8 encoding.
                        return src.appendSlice(rb.out, p, n)
@@ -314,7 +314,7 @@
                        continue
                }
                info := f.info(src, i)
-               if info.size == 0 {
+               if info.isInvalid() {
                        if atEOF {
                                // include incomplete runes
                                return n, true
@@ -379,7 +379,7 @@
        // CGJ insertion points correctly. Luckily it doesn't have to.
        for {
                info := fd.info(src, i)
-               if info.size == 0 {
+               if info.isInvalid() {
                        return -1
                }
                if s := ss.next(info); s != ssSuccess {
@@ -424,7 +424,7 @@
        }
        fd := formTable[f]
        info := fd.info(src, 0)
-       if info.size == 0 {
+       if info.isInvalid() {
                if atEOF {
                        return 1
                }
@@ -435,7 +435,7 @@
 
        for i := int(info.size); i < nsrc; i += int(info.size) {
                info = fd.info(src, i)
-               if info.size == 0 {
+               if info.isInvalid() {
                        if atEOF {
                                return i
                        }
@@ -465,7 +465,7 @@
        if p == -1 {
                return -1
        }
-       if info.size == 0 { // ends with incomplete rune
+       if info.isInvalid() { // ends with incomplete rune
                if p == 0 { // starts with incomplete rune
                        return -1
                }
@@ -504,7 +504,7 @@
 func decomposeSegment(rb *reorderBuffer, sp int, atEOF bool) int {
        // Force one character to be consumed.
        info := rb.f.info(rb.src, sp)
-       if info.size == 0 {
+       if info.isInvalid() {
                return 0
        }
        if s := rb.ss.next(info); s == ssStarter {
@@ -528,7 +528,7 @@
                        break
                }
                info = rb.f.info(rb.src, sp)
-               if info.size == 0 {
+               if info.isInvalid() {
                        if !atEOF {
                                return int(iShortSrc)
                        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/vendor/modules.txt new/vendor/modules.txt
--- old/vendor/modules.txt      2026-07-05 00:54:22.000000000 +0200
+++ new/vendor/modules.txt      2026-09-10 01:21:38.000000000 +0200
@@ -42,18 +42,18 @@
 # github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e
 ## explicit; go 1.19
 github.com/xo/terminfo
-# golang.org/x/net v0.56.0
+# golang.org/x/net v0.57.0
 ## explicit; go 1.25.0
 golang.org/x/net/websocket
-# golang.org/x/sys v0.46.0
+# golang.org/x/sys v0.47.0
 ## explicit; go 1.25.0
 golang.org/x/sys/plan9
 golang.org/x/sys/unix
 golang.org/x/sys/windows
-# golang.org/x/term v0.44.0
+# golang.org/x/term v0.45.0
 ## explicit; go 1.25.0
 golang.org/x/term
-# golang.org/x/text v0.38.0
+# golang.org/x/text v0.40.0
 ## explicit; go 1.25.0
 golang.org/x/text/cases
 golang.org/x/text/internal

Reply via email to