[
  {
    "repo": "Nrlemo/Open-PS2-Loader-volume",
    "comparison": {
      "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/compare/master...Nrlemo:master",
      "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...Nrlemo:master",
      "permalink_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/ps2homebrew:b3a2199...Nrlemo:c1a5b33",
      "diff_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...Nrlemo:master.diff",
      "patch_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...Nrlemo:master.patch",
      "base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOBDs4CNoAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "merge_base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOVVtR5NoAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "status": "ahead",
      "ahead_by": 23,
      "behind_by": 0,
      "total_commits": 23,
      "commits": [
        {
          "sha": "d1b79449230633ad908d5018026c4fa00c73c8b4",
          "node_id": "C_kwDOBDs4CNoAKGQxYjc5NDQ5MjMwNjMzYWQ5MDhkNTAxODAyNmM0ZmEwMGM3M2M4YjQ",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:07:42Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:07:42Z"
            },
            "message": "Add in-game volume shortcut support",
            "tree": {
              "sha": "7d7133f0bdb9949d7b2cf645ba5e671ce7dc7a65",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/7d7133f0bdb9949d7b2cf645ba5e671ce7dc7a65"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/d1b79449230633ad908d5018026c4fa00c73c8b4",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d1b79449230633ad908d5018026c4fa00c73c8b4",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d1b79449230633ad908d5018026c4fa00c73c8b4",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d1b79449230633ad908d5018026c4fa00c73c8b4/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "011c3af5254d3e5f01374a745926ad9b79cabc41",
          "node_id": "C_kwDOBDs4CNoAKDAxMWMzYWY1MjU0ZDNlNWYwMTM3NGE3NDU5MjZhZDliNzljYWJjNDE",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:07:54Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:07:54Z"
            },
            "message": "Add in-game volume shortcut support",
            "tree": {
              "sha": "e595c25229cb58bd9739d35fbe0c5eb6878d9aa3",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/e595c25229cb58bd9739d35fbe0c5eb6878d9aa3"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/011c3af5254d3e5f01374a745926ad9b79cabc41",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/011c3af5254d3e5f01374a745926ad9b79cabc41",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/011c3af5254d3e5f01374a745926ad9b79cabc41",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/011c3af5254d3e5f01374a745926ad9b79cabc41/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "d1b79449230633ad908d5018026c4fa00c73c8b4",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d1b79449230633ad908d5018026c4fa00c73c8b4",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d1b79449230633ad908d5018026c4fa00c73c8b4"
            }
          ]
        },
        {
          "sha": "aadd0024b23bd26b3bbd8b05bd96e10a8f800d5f",
          "node_id": "C_kwDOBDs4CNoAKGFhZGQwMDI0YjIzYmQyNmIzYmJkOGIwNWJkOTZlMTBhOGY4MDBkNWY",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:07:56Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:07:56Z"
            },
            "message": "Add in-game volume shortcut support",
            "tree": {
              "sha": "3160bcc28d1be8d57a18678740a951fe84a726a7",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/3160bcc28d1be8d57a18678740a951fe84a726a7"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/aadd0024b23bd26b3bbd8b05bd96e10a8f800d5f",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/aadd0024b23bd26b3bbd8b05bd96e10a8f800d5f",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/aadd0024b23bd26b3bbd8b05bd96e10a8f800d5f",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/aadd0024b23bd26b3bbd8b05bd96e10a8f800d5f/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "011c3af5254d3e5f01374a745926ad9b79cabc41",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/011c3af5254d3e5f01374a745926ad9b79cabc41",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/011c3af5254d3e5f01374a745926ad9b79cabc41"
            }
          ]
        },
        {
          "sha": "e627a0a0c46b98a56a19471f425e157809e6ed7b",
          "node_id": "C_kwDOBDs4CNoAKGU2MjdhMGEwYzQ2Yjk4YTU2YTE5NDcxZjQyNWUxNTc4MDllNmVkN2I",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:04Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:04Z"
            },
            "message": "Add in-game volume shortcut support",
            "tree": {
              "sha": "5efde123d388a5912f8e007d1b3d5583e76cff56",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/5efde123d388a5912f8e007d1b3d5583e76cff56"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/e627a0a0c46b98a56a19471f425e157809e6ed7b",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e627a0a0c46b98a56a19471f425e157809e6ed7b",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e627a0a0c46b98a56a19471f425e157809e6ed7b",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e627a0a0c46b98a56a19471f425e157809e6ed7b/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "aadd0024b23bd26b3bbd8b05bd96e10a8f800d5f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/aadd0024b23bd26b3bbd8b05bd96e10a8f800d5f",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/aadd0024b23bd26b3bbd8b05bd96e10a8f800d5f"
            }
          ]
        },
        {
          "sha": "6193db11668cc9d7a75d2a7336915ace2dbab036",
          "node_id": "C_kwDOBDs4CNoAKDYxOTNkYjExNjY4Y2M5ZDdhNzVkMmE3MzM2OTE1YWNlMmRiYWIwMzY",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:18Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:18Z"
            },
            "message": "Add in-game volume shortcut support",
            "tree": {
              "sha": "083cc9f4db2a7fe03cd22c45a9dd253b0441276e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/083cc9f4db2a7fe03cd22c45a9dd253b0441276e"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/6193db11668cc9d7a75d2a7336915ace2dbab036",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/6193db11668cc9d7a75d2a7336915ace2dbab036",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/6193db11668cc9d7a75d2a7336915ace2dbab036",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/6193db11668cc9d7a75d2a7336915ace2dbab036/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "e627a0a0c46b98a56a19471f425e157809e6ed7b",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e627a0a0c46b98a56a19471f425e157809e6ed7b",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e627a0a0c46b98a56a19471f425e157809e6ed7b"
            }
          ]
        },
        {
          "sha": "1863efcbaddbeeeb85f357642cb829733ba960f1",
          "node_id": "C_kwDOBDs4CNoAKDE4NjNlZmNiYWRkYmVlZWI4NWYzNTc2NDJjYjgyOTczM2JhOTYwZjE",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:32Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:32Z"
            },
            "message": "Add in-game volume shortcut support",
            "tree": {
              "sha": "402d721e9f44fc69070b11fd50c7bde287f22c49",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/402d721e9f44fc69070b11fd50c7bde287f22c49"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/1863efcbaddbeeeb85f357642cb829733ba960f1",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1863efcbaddbeeeb85f357642cb829733ba960f1",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/1863efcbaddbeeeb85f357642cb829733ba960f1",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1863efcbaddbeeeb85f357642cb829733ba960f1/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "6193db11668cc9d7a75d2a7336915ace2dbab036",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/6193db11668cc9d7a75d2a7336915ace2dbab036",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/6193db11668cc9d7a75d2a7336915ace2dbab036"
            }
          ]
        },
        {
          "sha": "54f31bae52ecbf3ca1c314247ce2b602812a0010",
          "node_id": "C_kwDOBDs4CNoAKDU0ZjMxYmFlNTJlY2JmM2NhMWMzMTQyNDdjZTJiNjAyODEyYTAwMTA",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:43Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:43Z"
            },
            "message": "Add in-game volume control proof of concept",
            "tree": {
              "sha": "93aa653487163bbff10ed29f77bf2b902714b909",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/93aa653487163bbff10ed29f77bf2b902714b909"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/54f31bae52ecbf3ca1c314247ce2b602812a0010",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/54f31bae52ecbf3ca1c314247ce2b602812a0010",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/54f31bae52ecbf3ca1c314247ce2b602812a0010",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/54f31bae52ecbf3ca1c314247ce2b602812a0010/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "1863efcbaddbeeeb85f357642cb829733ba960f1",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1863efcbaddbeeeb85f357642cb829733ba960f1",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/1863efcbaddbeeeb85f357642cb829733ba960f1"
            }
          ]
        },
        {
          "sha": "e1d634d4785c4ed9cb3da8f5c60bd0e6164bb21e",
          "node_id": "C_kwDOBDs4CNoAKGUxZDYzNGQ0Nzg1YzRlZDljYjNkYThmNWM2MGJkMGU2MTY0YmIyMWU",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:45Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:45Z"
            },
            "message": "Add in-game volume control proof of concept",
            "tree": {
              "sha": "9f5a4264e64f5abbcdf2d7efea55d22e911754e3",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/9f5a4264e64f5abbcdf2d7efea55d22e911754e3"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/e1d634d4785c4ed9cb3da8f5c60bd0e6164bb21e",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e1d634d4785c4ed9cb3da8f5c60bd0e6164bb21e",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e1d634d4785c4ed9cb3da8f5c60bd0e6164bb21e",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e1d634d4785c4ed9cb3da8f5c60bd0e6164bb21e/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "54f31bae52ecbf3ca1c314247ce2b602812a0010",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/54f31bae52ecbf3ca1c314247ce2b602812a0010",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/54f31bae52ecbf3ca1c314247ce2b602812a0010"
            }
          ]
        },
        {
          "sha": "63782b7a5fcc08cd3e56ab92cbfbaa42e6f03746",
          "node_id": "C_kwDOBDs4CNoAKDYzNzgyYjdhNWZjYzA4Y2QzZTU2YWI5MmNiZmJhYTQyZTZmMDM3NDY",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:50Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:50Z"
            },
            "message": "Add in-game volume control proof of concept",
            "tree": {
              "sha": "4558d8e9704d0f8bbc9e3fe0fed4881a3cdb244a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/4558d8e9704d0f8bbc9e3fe0fed4881a3cdb244a"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/63782b7a5fcc08cd3e56ab92cbfbaa42e6f03746",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/63782b7a5fcc08cd3e56ab92cbfbaa42e6f03746",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/63782b7a5fcc08cd3e56ab92cbfbaa42e6f03746",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/63782b7a5fcc08cd3e56ab92cbfbaa42e6f03746/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "e1d634d4785c4ed9cb3da8f5c60bd0e6164bb21e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e1d634d4785c4ed9cb3da8f5c60bd0e6164bb21e",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e1d634d4785c4ed9cb3da8f5c60bd0e6164bb21e"
            }
          ]
        },
        {
          "sha": "0c24bc111908373e36fd4cea91e9b9d8bbae134f",
          "node_id": "C_kwDOBDs4CNoAKDBjMjRiYzExMTkwODM3M2UzNmZkNGNlYTkxZTliOWQ4YmJhZTEzNGY",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:52Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:52Z"
            },
            "message": "Add in-game volume control proof of concept",
            "tree": {
              "sha": "022e5c278b44b89bd3583090b8d321ba128ea177",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/022e5c278b44b89bd3583090b8d321ba128ea177"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/0c24bc111908373e36fd4cea91e9b9d8bbae134f",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0c24bc111908373e36fd4cea91e9b9d8bbae134f",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0c24bc111908373e36fd4cea91e9b9d8bbae134f",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0c24bc111908373e36fd4cea91e9b9d8bbae134f/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "63782b7a5fcc08cd3e56ab92cbfbaa42e6f03746",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/63782b7a5fcc08cd3e56ab92cbfbaa42e6f03746",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/63782b7a5fcc08cd3e56ab92cbfbaa42e6f03746"
            }
          ]
        },
        {
          "sha": "3e11fd5f13775dfb249210fa05de71d9de2395a4",
          "node_id": "C_kwDOBDs4CNoAKDNlMTFmZDVmMTM3NzVkZmIyNDkyMTBmYTA1ZGU3MWQ5ZGUyMzk1YTQ",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:58Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:08:58Z"
            },
            "message": "Add in-game volume control proof of concept",
            "tree": {
              "sha": "f5acc5ec84dfcc47496b2db9352216497c0aede4",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/f5acc5ec84dfcc47496b2db9352216497c0aede4"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/3e11fd5f13775dfb249210fa05de71d9de2395a4",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/3e11fd5f13775dfb249210fa05de71d9de2395a4",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/3e11fd5f13775dfb249210fa05de71d9de2395a4",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/3e11fd5f13775dfb249210fa05de71d9de2395a4/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "0c24bc111908373e36fd4cea91e9b9d8bbae134f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0c24bc111908373e36fd4cea91e9b9d8bbae134f",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0c24bc111908373e36fd4cea91e9b9d8bbae134f"
            }
          ]
        },
        {
          "sha": "9a15d7876f65a2632f5c630248e03ffe8146dd77",
          "node_id": "C_kwDOBDs4CNoAKDlhMTVkNzg3NmY2NWEyNjMyZjVjNjMwMjQ4ZTAzZmZlODE0NmRkNzc",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:09:10Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:09:10Z"
            },
            "message": "Use IOP SIF RPC entry points in volume service",
            "tree": {
              "sha": "24ce58e39c6947ce3fb59a8f01b91e8b8a42ff39",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/24ce58e39c6947ce3fb59a8f01b91e8b8a42ff39"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/9a15d7876f65a2632f5c630248e03ffe8146dd77",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9a15d7876f65a2632f5c630248e03ffe8146dd77",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/9a15d7876f65a2632f5c630248e03ffe8146dd77",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9a15d7876f65a2632f5c630248e03ffe8146dd77/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "3e11fd5f13775dfb249210fa05de71d9de2395a4",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/3e11fd5f13775dfb249210fa05de71d9de2395a4",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/3e11fd5f13775dfb249210fa05de71d9de2395a4"
            }
          ]
        },
        {
          "sha": "777595f832f86112cf81585fd0ac2d45a07d3c68",
          "node_id": "C_kwDOBDs4CNoAKDc3NzU5NWY4MzJmODYxMTJjZjgxNTg1ZmQwYWMyZDQ1YTA3ZDNjNjg",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:09:13Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:09:13Z"
            },
            "message": "Include EE SIF RPC declarations for volume shortcut",
            "tree": {
              "sha": "8fdc1c9ea7b4ec2d3a7ab8c9b185e8794ffc80aa",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/8fdc1c9ea7b4ec2d3a7ab8c9b185e8794ffc80aa"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/777595f832f86112cf81585fd0ac2d45a07d3c68",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/777595f832f86112cf81585fd0ac2d45a07d3c68",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/777595f832f86112cf81585fd0ac2d45a07d3c68",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/777595f832f86112cf81585fd0ac2d45a07d3c68/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "9a15d7876f65a2632f5c630248e03ffe8146dd77",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9a15d7876f65a2632f5c630248e03ffe8146dd77",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/9a15d7876f65a2632f5c630248e03ffe8146dd77"
            }
          ]
        },
        {
          "sha": "f636b3b9c8938d5be59daca8a750df72c65ba6be",
          "node_id": "C_kwDOBDs4CNoAKGY2MzZiM2I5Yzg5MzhkNWJlNTlkYWNhOGE3NTBkZjcyYzY1YmE2YmU",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:14Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:14Z"
            },
            "message": "Build in-game volume overlay module",
            "tree": {
              "sha": "6f282d1ae1b1edf6d8d390eced16c286e688ff64",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/6f282d1ae1b1edf6d8d390eced16c286e688ff64"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/f636b3b9c8938d5be59daca8a750df72c65ba6be",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f636b3b9c8938d5be59daca8a750df72c65ba6be",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/f636b3b9c8938d5be59daca8a750df72c65ba6be",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f636b3b9c8938d5be59daca8a750df72c65ba6be/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "777595f832f86112cf81585fd0ac2d45a07d3c68",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/777595f832f86112cf81585fd0ac2d45a07d3c68",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/777595f832f86112cf81585fd0ac2d45a07d3c68"
            }
          ]
        },
        {
          "sha": "73de14359c31d74d4232ef1114ed615bfe95f594",
          "node_id": "C_kwDOBDs4CNoAKDczZGUxNDM1OWMzMWQ3NGQ0MjMyZWYxMTE0ZWQ2MTViZmU5NWY1OTQ",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:17Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:17Z"
            },
            "message": "Show overlay when in-game volume changes",
            "tree": {
              "sha": "86608a4ca51ac3c46ca7bda56a69ad142b35db3a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/86608a4ca51ac3c46ca7bda56a69ad142b35db3a"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/73de14359c31d74d4232ef1114ed615bfe95f594",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/73de14359c31d74d4232ef1114ed615bfe95f594",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/73de14359c31d74d4232ef1114ed615bfe95f594",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/73de14359c31d74d4232ef1114ed615bfe95f594/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "f636b3b9c8938d5be59daca8a750df72c65ba6be",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f636b3b9c8938d5be59daca8a750df72c65ba6be",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/f636b3b9c8938d5be59daca8a750df72c65ba6be"
            }
          ]
        },
        {
          "sha": "d97ac3c508a52030f4c56a85cccaf2e8e710facb",
          "node_id": "C_kwDOBDs4CNoAKGQ5N2FjM2M1MDhhNTIwMzBmNGM1NmE4NWNjY2FmMmU4ZTcxMGZhY2I",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:21Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:21Z"
            },
            "message": "Add volume overlay interface",
            "tree": {
              "sha": "798711e3bb95d5181b6c50dfbb1c293275be04c1",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/798711e3bb95d5181b6c50dfbb1c293275be04c1"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/d97ac3c508a52030f4c56a85cccaf2e8e710facb",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d97ac3c508a52030f4c56a85cccaf2e8e710facb",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d97ac3c508a52030f4c56a85cccaf2e8e710facb",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d97ac3c508a52030f4c56a85cccaf2e8e710facb/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "73de14359c31d74d4232ef1114ed615bfe95f594",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/73de14359c31d74d4232ef1114ed615bfe95f594",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/73de14359c31d74d4232ef1114ed615bfe95f594"
            }
          ]
        },
        {
          "sha": "a7e87a1b4152b196d295b257d5b276658bb80c77",
          "node_id": "C_kwDOBDs4CNoAKGE3ZTg3YTFiNDE1MmIxOTZkMjk1YjI1N2Q1YjI3NjY1OGJiODBjNzc",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:24Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:24Z"
            },
            "message": "Add experimental in-game volume overlay renderer",
            "tree": {
              "sha": "c9bc421ec271b8bbd1ced295a1180e632284c099",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/c9bc421ec271b8bbd1ced295a1180e632284c099"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/a7e87a1b4152b196d295b257d5b276658bb80c77",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a7e87a1b4152b196d295b257d5b276658bb80c77",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a7e87a1b4152b196d295b257d5b276658bb80c77",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a7e87a1b4152b196d295b257d5b276658bb80c77/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "d97ac3c508a52030f4c56a85cccaf2e8e710facb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d97ac3c508a52030f4c56a85cccaf2e8e710facb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d97ac3c508a52030f4c56a85cccaf2e8e710facb"
            }
          ]
        },
        {
          "sha": "057bfae02f45abee59ba877df4065a8d4e99928b",
          "node_id": "C_kwDOBDs4CNoAKDA1N2JmYWUwMmY0NWFiZWU1OWJhODc3ZGY0MDY1YThkNGU5OTkyOGI",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:37Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:53:37Z"
            },
            "message": "Document experimental in-game volume overlay",
            "tree": {
              "sha": "ce791fa19a84bd081fd758d53a9599b2bd47f028",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/ce791fa19a84bd081fd758d53a9599b2bd47f028"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/057bfae02f45abee59ba877df4065a8d4e99928b",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/057bfae02f45abee59ba877df4065a8d4e99928b",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/057bfae02f45abee59ba877df4065a8d4e99928b",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/057bfae02f45abee59ba877df4065a8d4e99928b/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "a7e87a1b4152b196d295b257d5b276658bb80c77",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a7e87a1b4152b196d295b257d5b276658bb80c77",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a7e87a1b4152b196d295b257d5b276658bb80c77"
            }
          ]
        },
        {
          "sha": "afb6385f3d496b58acbd0f23a2373ae3257d61b2",
          "node_id": "C_kwDOBDs4CNoAKGFmYjYzODVmM2Q0OTZiNThhY2JkMGYyM2EyMzczYWUzMjU3ZDYxYjI",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:54:39Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:54:39Z"
            },
            "message": "Avoid libc formatting dependency in overlay",
            "tree": {
              "sha": "3ebdeca2413dfde7d14b51018e5ccc26c1458e90",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/3ebdeca2413dfde7d14b51018e5ccc26c1458e90"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/afb6385f3d496b58acbd0f23a2373ae3257d61b2",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/afb6385f3d496b58acbd0f23a2373ae3257d61b2",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/afb6385f3d496b58acbd0f23a2373ae3257d61b2",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/afb6385f3d496b58acbd0f23a2373ae3257d61b2/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "057bfae02f45abee59ba877df4065a8d4e99928b",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/057bfae02f45abee59ba877df4065a8d4e99928b",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/057bfae02f45abee59ba877df4065a8d4e99928b"
            }
          ]
        },
        {
          "sha": "483d9af3a8a481afb0946960e3e57aa35988e45e",
          "node_id": "C_kwDOBDs4CNoAKDQ4M2Q5YWYzYThhNDgxYWZiMDk0Njk2MGUzZTU3YWEzNTk4OGU0NWU",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:56:02Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T10:56:02Z"
            },
            "message": "Recheck VIF1 availability before overlay DMA",
            "tree": {
              "sha": "35d3d4721790e4e8fa2d17042ed522b10a232862",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/35d3d4721790e4e8fa2d17042ed522b10a232862"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/483d9af3a8a481afb0946960e3e57aa35988e45e",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/483d9af3a8a481afb0946960e3e57aa35988e45e",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/483d9af3a8a481afb0946960e3e57aa35988e45e",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/483d9af3a8a481afb0946960e3e57aa35988e45e/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "afb6385f3d496b58acbd0f23a2373ae3257d61b2",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/afb6385f3d496b58acbd0f23a2373ae3257d61b2",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/afb6385f3d496b58acbd0f23a2373ae3257d61b2"
            }
          ]
        },
        {
          "sha": "06934deaa181f93f097a05a0e581144b8f466a9d",
          "node_id": "C_kwDOBDs4CNoAKDA2OTM0ZGVhYTE4MWY5M2YwOTdhMDVhMGU1ODExNDRiOGY0NjZhOWQ",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T18:30:38Z"
            },
            "committer": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T18:30:38Z"
            },
            "message": "Reduce volume overlay memory footprint",
            "tree": {
              "sha": "59134bdde60a306f18c5680a2ee726486390117a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/59134bdde60a306f18c5680a2ee726486390117a"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/06934deaa181f93f097a05a0e581144b8f466a9d",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/06934deaa181f93f097a05a0e581144b8f466a9d",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/06934deaa181f93f097a05a0e581144b8f466a9d",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/06934deaa181f93f097a05a0e581144b8f466a9d/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "483d9af3a8a481afb0946960e3e57aa35988e45e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/483d9af3a8a481afb0946960e3e57aa35988e45e",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/483d9af3a8a481afb0946960e3e57aa35988e45e"
            }
          ]
        },
        {
          "sha": "4ee770d9d86db78e41e2ac92f4e8116f5dab8d3d",
          "node_id": "C_kwDOBDs4CNoAKDRlZTc3MGQ5ZDg2ZGI3OGU0MWUyYWM5MmY0ZTgxMTZmNWRhYjhkM2Q",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T18:32:46Z"
            },
            "committer": {
              "name": "GitHub",
              "email": "noreply@github.com",
              "date": "2026-10-24T18:32:46Z"
            },
            "message": "Merge pull request #2 from Nrlemo/feature/in-game-volume-overlay\n\nWIP: add experimental in-game volume OSD",
            "tree": {
              "sha": "59134bdde60a306f18c5680a2ee726486390117a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/59134bdde60a306f18c5680a2ee726486390117a"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/4ee770d9d86db78e41e2ac92f4e8116f5dab8d3d",
            "comment_count": 0,
            "verification": {
              "verified": true,
              "reason": "valid",
              "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsFcBAABCAAQBQJq3PnOCRC1aQ7uu5UhlAAAKM4QAIW5eRql/sTW8Ok8l+bbA/KS\nPBn8IszjFne/sY80amTT6sqmaxSrrFJdWEGy0iWMgQifBUT1LxTXMH4IqeMkFNXt\nnEijNA+gGKBK9M1wLK1In5YzbS1y3ovmT6YyfKhA8llheI4gh3OV9TNxyYxNOq5Y\nrPt92qufbd6kT7PVqM30rCBEn3VEqriYPr8btBAQ8IFzDFTWGSigUAABQ9QxhG9c\ndEqliprvaZX1vqxwxNX0Xe9pvCLLks6hXKDdidv0g7IwpBNftxbQEN+cSX1uKmTH\n3AbxFrNoDaIJEGDwOm/3hKJFXBx1QSWXLEoB6I9q0EtckiKb6we/raskbX8VxXc/\nKNC4ELn71/mQiwxZuAAfKlUVMC3koiPtjauL22ypmECu6AeHpm5NieRoKGhksEqF\ndfFk4uhjBSvcd5elfW0GelILCj/Q50AFGuGfZezx5he7BZigFaiELlf5E42HnE+q\ntdBi7k/47mSEVRL12g/SP08AE8rFM/pCCXi8pTSVn5KlMXo8oEhTti32+c35TJaL\nrY6rxnOt1VTM9yyVVSJRTaY6HZyAlU7vsN6zCf68OWH1fYVuCqXkP3QY1mfOoZCP\nHtZ+OVP9/q1XRwqCjC1uLFUCbkiiaMaBVdz3UDn6wUho71rZVbHyci3Jh9Whe+/V\nwUCPAz79DmSQoYm51DVw\n=WR35\n-----END PGP SIGNATURE-----\n",
              "payload": "tree 59134bdde60a306f18c5680a2ee726486390117a\nparent 777595f832f86112cf81585fd0ac2d45a07d3c68\nparent 06934deaa181f93f097a05a0e581144b8f466a9d\nauthor Nrlemo <nrlemo@gmail.com> 1792866766 -0300\ncommitter GitHub <noreply@github.com> 1792866766 -0300\n\nMerge pull request #2 from Nrlemo/feature/in-game-volume-overlay\n\nWIP: add experimental in-game volume OSD",
              "verified_at": "2026-10-24T18:32:47Z"
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4ee770d9d86db78e41e2ac92f4e8116f5dab8d3d",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4ee770d9d86db78e41e2ac92f4e8116f5dab8d3d",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4ee770d9d86db78e41e2ac92f4e8116f5dab8d3d/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "web-flow",
            "id": 19864447,
            "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
            "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/web-flow",
            "html_url": "https://github.com/web-flow",
            "followers_url": "https://api.github.com/users/web-flow/followers",
            "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
            "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
            "organizations_url": "https://api.github.com/users/web-flow/orgs",
            "repos_url": "https://api.github.com/users/web-flow/repos",
            "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
            "received_events_url": "https://api.github.com/users/web-flow/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "777595f832f86112cf81585fd0ac2d45a07d3c68",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/777595f832f86112cf81585fd0ac2d45a07d3c68",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/777595f832f86112cf81585fd0ac2d45a07d3c68"
            },
            {
              "sha": "06934deaa181f93f097a05a0e581144b8f466a9d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/06934deaa181f93f097a05a0e581144b8f466a9d",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/06934deaa181f93f097a05a0e581144b8f466a9d"
            }
          ]
        },
        {
          "sha": "c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "node_id": "C_kwDOBDs4CNoAKGMxYTViMzMwNWJlOTU1YmIxZDRhNjExNWJiZjEyMzM1ODgwZjgxNzY",
          "commit": {
            "author": {
              "name": "Nrlemo",
              "email": "nrlemo@gmail.com",
              "date": "2026-10-24T18:34:47Z"
            },
            "committer": {
              "name": "GitHub",
              "email": "noreply@github.com",
              "date": "2026-10-24T18:34:47Z"
            },
            "message": "Merge pull request #1 from Nrlemo/feature/in-game-volume-control\n\nWIP: add in-game master volume shortcuts",
            "tree": {
              "sha": "59134bdde60a306f18c5680a2ee726486390117a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/59134bdde60a306f18c5680a2ee726486390117a"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/c1a5b3305be955bb1d4a6115bbf12335880f8176",
            "comment_count": 0,
            "verification": {
              "verified": true,
              "reason": "valid",
              "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsFcBAABCAAQBQJq3PpHCRC1aQ7uu5UhlAAAoX0QAIlqwEDXBIPM4cj1UVhCWwfI\nefBDS1WucywAXRLjNX3cstipHhnpFJ55yyRN2tHgkjNRnm6w2GCOV4sCM3V5wvsw\ncF0WbzXfVL6iqThOtJY8H8kJhXVVpsFpfPN+uF1JOuyYa1j/EPnANCBTljSn79sF\nwXQxemjQ+nATMichjdU2AO3E+5sXYMCTaact96J7kOBVR+lSKWLpp05Na1A8jBA4\nEuSVqDhKLrej2KyLORQVjV9sW+G7Zd+6GpoE6nSmLVte2siiU6l6Hp93EMUUDrBb\nk8lPpPH+NSZisHMKUHD+nfb1TTtWN22kgFSg7V58qjq68d9dm7ynYz19/1v4QI1Q\nEwVZQXamWmdthnizeEShJtyYxfKJAsYRZ9DJG0gogHJQSnV3eBHuLFWSesfAzR2p\nkBs5WLvrIVBSfo4jJZAA2y6EicSKUaXyvibjVP6njHUIB1yP+OeVTiWFPisNR4NI\nHILImh5Cn+sLceMilQB1N1hqAcbSbWa/FKvgpA4Verpkwk7cfPnb7LMTrx32MZn4\nzUSnkMC0Q0HHdT7v7dKB25QzyjbrU+KKc53AMiPjdLDm2baVLrvBnuo9Z/tgmPfJ\nx7LPGDG6wkJsLK/E61QWYoCGasiNkidcmxykW3ZXJ9kLx2pLti6KxYk6bv01jcAU\nkb/WrzU9+xHFQwGHmnI+\n=QYoX\n-----END PGP SIGNATURE-----\n",
              "payload": "tree 59134bdde60a306f18c5680a2ee726486390117a\nparent b3a2199795fe89ba7e2dd7b843354472dff2c3eb\nparent 4ee770d9d86db78e41e2ac92f4e8116f5dab8d3d\nauthor Nrlemo <nrlemo@gmail.com> 1792866887 -0300\ncommitter GitHub <noreply@github.com> 1792866887 -0300\n\nMerge pull request #1 from Nrlemo/feature/in-game-volume-control\n\nWIP: add in-game master volume shortcuts",
              "verified_at": "2026-10-24T18:34:47Z"
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c1a5b3305be955bb1d4a6115bbf12335880f8176/comments",
          "author": {
            "login": "Nrlemo",
            "id": 177110542,
            "node_id": "U_kgDOCo5-Dg",
            "avatar_url": "https://avatars.githubusercontent.com/u/177110542?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/Nrlemo",
            "html_url": "https://github.com/Nrlemo",
            "followers_url": "https://api.github.com/users/Nrlemo/followers",
            "following_url": "https://api.github.com/users/Nrlemo/following{/other_user}",
            "gists_url": "https://api.github.com/users/Nrlemo/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/Nrlemo/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/Nrlemo/subscriptions",
            "organizations_url": "https://api.github.com/users/Nrlemo/orgs",
            "repos_url": "https://api.github.com/users/Nrlemo/repos",
            "events_url": "https://api.github.com/users/Nrlemo/events{/privacy}",
            "received_events_url": "https://api.github.com/users/Nrlemo/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "web-flow",
            "id": 19864447,
            "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
            "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/web-flow",
            "html_url": "https://github.com/web-flow",
            "followers_url": "https://api.github.com/users/web-flow/followers",
            "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
            "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
            "organizations_url": "https://api.github.com/users/web-flow/orgs",
            "repos_url": "https://api.github.com/users/web-flow/repos",
            "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
            "received_events_url": "https://api.github.com/users/web-flow/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            },
            {
              "sha": "4ee770d9d86db78e41e2ac92f4e8116f5dab8d3d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4ee770d9d86db78e41e2ac92f4e8116f5dab8d3d",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4ee770d9d86db78e41e2ac92f4e8116f5dab8d3d"
            }
          ]
        }
      ],
      "files": [
        {
          "sha": "a7611d8396dc2b02733b73990068dc7e424ef6cb",
          "filename": "Makefile",
          "status": "modified",
          "additions": 7,
          "deletions": 1,
          "changes": 8,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/Makefile",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/Makefile",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/Makefile?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -82,7 +82,7 @@ IOP_OBJS =\tiomanx.o filexio.o ps2fs.o usbd.o bdmevent.o \\\n \t\tsio2man.o padman.o mcman.o mcserv.o \\\n \t\thttpclient-iop.o netman.o ps2ips.o \\\n \t\tbdm_mcemu.o hdd_mcemu.o smb_mcemu.o \\\n-\t\tiremsndpatch.o apemodpatch.o f2techioppatch.o cleareffects.o resetspu.o \\\n+\t\tiremsndpatch.o apemodpatch.o f2techioppatch.o cleareffects.o resetspu.o volctrl.o \\\n \t\tlibsd.o audsrv.o\n \n EECORE_OBJS = ee_core.o ioprp.o util.o \\\n@@ -471,6 +471,12 @@ modules/iopcore/resetspu/resetspu.irx: modules/iopcore/resetspu\n $(EE_ASM_DIR)resetspu.c: modules/iopcore/resetspu/resetspu.irx | $(EE_ASM_DIR)\n \t$(BIN2C) $< $@ $(*F)_irx\n \n+modules/iopcore/volctrl/volctrl.irx: modules/iopcore/volctrl\n+\t$(MAKE) -C $<\n+\n+$(EE_ASM_DIR)volctrl.c: modules/iopcore/volctrl/volctrl.irx | $(EE_ASM_DIR)\n+\t$(BIN2C) $< $@ $(*F)_irx\n+\n modules/mcemu/bdm_mcemu.irx: modules/mcemu\n \t$(MAKE) $(MCEMU_DEBUG_FLAGS) $(PADEMU_FLAGS) USE_BDM=1 -C $< all\n "
        },
        {
          "sha": "21c07a476bb470709014694fd481df0a6e91edc9",
          "filename": "docs/IN_GAME_VOLUME_CONTROL.md",
          "status": "added",
          "additions": 11,
          "deletions": 0,
          "changes": 11,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/docs%2FIN_GAME_VOLUME_CONTROL.md",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/docs%2FIN_GAME_VOLUME_CONTROL.md",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/docs%2FIN_GAME_VOLUME_CONTROL.md?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -0,0 +1,11 @@\n+# In-game master volume control (proof of concept)\n+\n+- `START + R1`: increase the game master volume by 5 percentage points.\n+- `START + R2`: decrease it by 5 percentage points.\n+- The initial scale is relative to master-volume values captured on the first change; 0% mutes, 100% preserves the baseline, and up to 150% is requested.\n+\n+The EE-side IGR polling thread sends the requested percentage over SIF RPC to the IOP module. OPL embeds `volctrl.irx` into its module storage and attempts to load it after IOP initialization. The service uses LIBSD master-volume parameters for both SPU2 cores.\n+\n+## Validation status\n+\n+This is an uncompiled proof of concept. Button-byte masks, LIBSD parameter encoding, RPC imports and behavior across games must be checked against the exact PS2SDK toolchain and on real hardware. Games may reconfigure their master volume, and titles that reboot the IOP may unload the service. Do not treat it as a release build."
        },
        {
          "sha": "42797ac5e72f5c0de4c569fea331e58032410fdf",
          "filename": "docs/IN_GAME_VOLUME_OVERLAY.md",
          "status": "added",
          "additions": 16,
          "deletions": 0,
          "changes": 16,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/docs%2FIN_GAME_VOLUME_OVERLAY.md",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/docs%2FIN_GAME_VOLUME_OVERLAY.md",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/docs%2FIN_GAME_VOLUME_OVERLAY.md?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -0,0 +1,16 @@\n+# In-game volume overlay (experimental)\n+\n+This branch is derived from `feature/in-game-volume-control` and adds a compact on-screen volume indicator when START+R1 or START+R2 changes the requested volume.\n+\n+## Expected behavior\n+\n+- The indicator is placed near the upper-right corner of the currently scanned-out GS framebuffer.\n+- It displays `VOL`, the requested percentage, and a horizontal 0\u2013150% bar.\n+- It is redrawn for up to 90 successful frame polls (roughly 1.5\u20131.8 seconds at common refresh rates).\n+- The renderer supports GS PSMCT32, PSMCT24, PSMCT16 and PSMCT16S. Other display formats cause the indicator to disable itself for that appearance.\n+\n+## Important limitations\n+\n+This is a proof of concept, not a release-ready OSD. It transfers pixels into the active framebuffer through VIF1/GIF. It checks for a busy VIF1 path and avoids changing the game's drawing-context registers, but game-specific DMA scheduling, framebuffer flipping, interlaced output, and GS pixel formats still need validation on real hardware. The transfer path is shared with game rendering, so even with the idle check there is a race window; flicker, rendering interference, or a game-specific failure is possible.\n+\n+No build or hardware test has been run in this environment. Keep this branch separate and do not merge it until it has built with the intended PS2SDK, been tested on at least one game in each relevant display mode, and shown that graphics/audio and IGR remain stable. The base volume-control code also remains an uncompiled proof of concept."
        },
        {
          "sha": "c2ad6826cd640bcae284b59f37af00118c41f984",
          "filename": "ee_core/Makefile",
          "status": "modified",
          "additions": 1,
          "deletions": 1,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2FMakefile",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2FMakefile",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2FMakefile?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -18,7 +18,7 @@ IGSCORE_EE_OBJS = igs_api.o\n CHEATCORE_EE_OBJS = cheat_engine.o cheat_api.o\n \n EE_OBJS = main.o syshook.o iopmgr.o modmgr.o util.o patches.o patches_asm.o \\\n-\t  padhook.o cd_igr_rpc.o tlb.o asm.o crt0.o $(GSMCORE_EE_OBJS) $(CHEATCORE_EE_OBJS)\n+\t  padhook.o volume_overlay.o cd_igr_rpc.o tlb.o asm.o crt0.o $(GSMCORE_EE_OBJS) $(CHEATCORE_EE_OBJS)\n MAPFILE = ee_core.map\n \n EE_INCS := -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -I$(PS2SDK)/ports/include -Iinclude -I."
        },
        {
          "sha": "4a60026b15ced390b65e0e64e12fcf12b8afacda",
          "filename": "ee_core/include/modules.h",
          "status": "modified",
          "additions": 1,
          "deletions": 0,
          "changes": 1,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Finclude%2Fmodules.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Finclude%2Fmodules.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Finclude%2Fmodules.h?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -4,6 +4,7 @@ enum OPL_MODULE_ID {\n     OPL_MODULE_ID_IOPRP,\n     OPL_MODULE_ID_IMGDRV,\n     OPL_MODULE_ID_RESETSPU,\n+    OPL_MODULE_ID_VOLCTRL,\n \n     // SIO2 modules (for mcemu/pademu/mx4sio)\n     OPL_MODULE_ID_SIO2MAN,"
        },
        {
          "sha": "17bc728405da38c1e1737dbf8a134fcbe013eff7",
          "filename": "ee_core/include/volume_overlay.h",
          "status": "added",
          "additions": 8,
          "deletions": 0,
          "changes": 8,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Finclude%2Fvolume_overlay.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Finclude%2Fvolume_overlay.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Finclude%2Fvolume_overlay.h?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -0,0 +1,8 @@\n+/* Experimental in-game volume on-screen indicator. */\n+#ifndef OPL_VOLUME_OVERLAY_H\n+#define OPL_VOLUME_OVERLAY_H\n+\n+void VolumeOverlaySetPercent(int percent);\n+void VolumeOverlayTick(void);\n+\n+#endif"
        },
        {
          "sha": "e03f5aa2ebc933221be7e0323ede7c8914cf70d7",
          "filename": "ee_core/include/volume_rpc.h",
          "status": "added",
          "additions": 8,
          "deletions": 0,
          "changes": 8,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Finclude%2Fvolume_rpc.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Finclude%2Fvolume_rpc.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Finclude%2Fvolume_rpc.h?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -0,0 +1,8 @@\n+/* In-game master-volume RPC shared by EE and IOP. */\n+#ifndef OPL_VOLUME_RPC_H\n+#define OPL_VOLUME_RPC_H\n+#define OPL_VOLUME_RPC_ID       0x8000F0A6\n+#define OPL_VOLUME_RPC_SET      1\n+#define OPL_VOLUME_STEP         5\n+#define OPL_VOLUME_MAX_PERCENT  150\n+#endif"
        },
        {
          "sha": "26049330cac01f866b2733f3d1383854e550d9d2",
          "filename": "ee_core/src/iopmgr.c",
          "status": "modified",
          "additions": 3,
          "deletions": 0,
          "changes": 3,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Fsrc%2Fiopmgr.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Fsrc%2Fiopmgr.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Fsrc%2Fiopmgr.c?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -187,6 +187,9 @@ int New_Reset_Iop(const char *arg, int arglen)\n             DBGCOL(0x00FFFF, IOPMGR, \"ResetIopSpecial (with args) finished!\");\n     }\n \n+    /* Load the game-volume service into the IOP used by the running title. */\n+    LoadOPLModule(OPL_MODULE_ID_VOLCTRL, 0, 0, NULL);\n+\n     if (iop_reboot_count >= 2) {\n #ifdef PADEMU\n         config->PadEmuSettings |= (LoadOPLModule(OPL_MODULE_ID_MCEMU, 0, 0, NULL) > 0) << 24;"
        },
        {
          "sha": "41b27876d1a62ef8b0a1a8cbb7df15178a07756c",
          "filename": "ee_core/src/padhook.c",
          "status": "modified",
          "additions": 87,
          "deletions": 0,
          "changes": 87,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Fsrc%2Fpadhook.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Fsrc%2Fpadhook.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Fsrc%2Fpadhook.c?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -18,6 +18,7 @@\n \n #include <ee_regs.h>\n #include <iopcontrol.h>\n+#include <sifrpc.h>\n #include \"asm.h\"\n #include \"ee_core.h\"\n #include \"iopmgr.h\"\n@@ -35,6 +36,8 @@\n #include \"cheat_api.h\"\n #include \"cd_igr_rpc.h\"\n #include \"coreconfig.h\"\n+#include \"volume_rpc.h\"\n+#include \"volume_overlay.h\"\n \n /* scePadPortOpen & scePad2CreateSocket prototypes */\n static int (*scePadPortOpen)(int port, int slot, void *addr);\n@@ -50,6 +53,74 @@ static powerbuttondata_t Power_Button;\n static int IGR_Thread_ID = -1;\n static int IGR_Intc_ID = -1;\n \n+/* In-game master-volume RPC state. */\n+static SifRpcClientData_t VolumeControlRpcClient __attribute__((aligned(64)));\n+static u32 VolumeControlRpcArgs[16] __attribute__((aligned(64)));\n+static int VolumeControlRpcPending;\n+static int VolumeControlBindDelay;\n+static int GameVolumePercent = 100;\n+static u8 VolumeUpWasPressed;\n+static u8 VolumeDownWasPressed;\n+\n+#define PAD_START_MASK 0x08\n+#define PAD_R1_MASK    0x08\n+#define PAD_R2_MASK    0x02\n+\n+static void GameVolumeControlFlush(void)\n+{\n+    if (VolumeControlRpcClient.server == NULL) {\n+        if (VolumeControlBindDelay > 0) {\n+            VolumeControlBindDelay--;\n+            return;\n+        }\n+        memset(&VolumeControlRpcClient, 0, sizeof(VolumeControlRpcClient));\n+        SifBindRpc(&VolumeControlRpcClient, OPL_VOLUME_RPC_ID, 0);\n+        VolumeControlBindDelay = 60;\n+        return;\n+    }\n+\n+    VolumeControlRpcArgs[0] = (u32)GameVolumePercent;\n+    if (SifCallRpc(&VolumeControlRpcClient, OPL_VOLUME_RPC_SET, 0,\n+                   VolumeControlRpcArgs, sizeof(VolumeControlRpcArgs[0]),\n+                   NULL, 0, NULL, NULL) < 0) {\n+        memset(&VolumeControlRpcClient, 0, sizeof(VolumeControlRpcClient));\n+        VolumeControlBindDelay = 60;\n+        return;\n+    }\n+    VolumeControlRpcPending = 0;\n+}\n+\n+static void GameVolumeControlUpdate(int up_pressed, int down_pressed)\n+{\n+    int changed = 0;\n+\n+    if (up_pressed && !VolumeUpWasPressed) {\n+        if (GameVolumePercent < OPL_VOLUME_MAX_PERCENT) {\n+            GameVolumePercent += OPL_VOLUME_STEP;\n+            if (GameVolumePercent > OPL_VOLUME_MAX_PERCENT)\n+                GameVolumePercent = OPL_VOLUME_MAX_PERCENT;\n+            VolumeControlRpcPending = 1;\n+            changed = 1;\n+        }\n+    } else if (down_pressed && !VolumeDownWasPressed) {\n+        if (GameVolumePercent > 0) {\n+            GameVolumePercent -= OPL_VOLUME_STEP;\n+            if (GameVolumePercent < 0)\n+                GameVolumePercent = 0;\n+            VolumeControlRpcPending = 1;\n+            changed = 1;\n+        }\n+    }\n+\n+    VolumeUpWasPressed = up_pressed ? 1 : 0;\n+    VolumeDownWasPressed = down_pressed ? 1 : 0;\n+    if (changed)\n+        VolumeOverlaySetPercent(GameVolumePercent);\n+    if (VolumeControlRpcPending)\n+        GameVolumeControlFlush();\n+}\n+\n+\n /* IGR thread stack & stack size */\n #define IGR_STACK_SIZE (4 * 1024)\n static u8 IGR_Stack[IGR_STACK_SIZE] __attribute__((aligned(16)));\n@@ -158,6 +229,8 @@ static void IGR_Thread(void *arg)\n     u8 pad_pos_frame;\n     u8 pad_pos_combo1;\n     u8 pad_pos_combo2;\n+    int volume_up_pressed;\n+    int volume_down_pressed;\n \n     (void)arg;\n \n@@ -168,6 +241,8 @@ static void IGR_Thread(void *arg)\n      * Poll the same controller buffer from an ordinary EE thread instead.\n      */\n     for (;;) {\n+        volume_up_pressed = 0;\n+        volume_down_pressed = 0;\n         if (Pad_Data.pad_buf != NULL) {\n             // Read through the uncached segment to obtain live pad data.\n             pad_pos_state =\n@@ -208,6 +283,15 @@ static void IGR_Thread(void *arg)\n                     Pad_Data.vb_count = 0;\n                 }\n \n+                /* START + R1 raises volume; START + R2 lowers it.\n+                 * The controller bytes are active-low. */\n+                volume_up_pressed =\n+                    ((pad_pos_combo2 & PAD_START_MASK) == 0) &&\n+                    ((pad_pos_combo1 & PAD_R1_MASK) == 0);\n+                volume_down_pressed =\n+                    ((pad_pos_combo2 & PAD_START_MASK) == 0) &&\n+                    ((pad_pos_combo1 & PAD_R2_MASK) == 0);\n+\n                 // R1 + L1 + R2 + L2\n                 if (pad_pos_combo1 == IGR_COMBO_R1_L1_R2_L2) {\n                     // Start + Select: reset to configured exit path.\n@@ -229,6 +313,9 @@ static void IGR_Thread(void *arg)\n             }\n         }\n \n+        GameVolumeControlUpdate(volume_up_pressed, volume_down_pressed);\n+        VolumeOverlayTick();\n+\n         /*\n          * Preserve the original power-button monitoring.\n          * These registers require kernel mode."
        },
        {
          "sha": "2fc58b00aa58f004ce863b90e72c8462573f09f5",
          "filename": "ee_core/src/volume_overlay.c",
          "status": "added",
          "additions": 376,
          "deletions": 0,
          "changes": 376,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Fsrc%2Fvolume_overlay.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/ee_core%2Fsrc%2Fvolume_overlay.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Fsrc%2Fvolume_overlay.c?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -0,0 +1,376 @@\n+/*\n+ * Experimental in-game volume OSD for Open PS2 Loader.\n+ *\n+ * This implementation transfers a small bitmap into the active GS display\n+ * framebuffer. It deliberately avoids modifying the game's normal drawing\n+ * context registers. It is still a proof of concept: framebuffer updates and\n+ * DMA scheduling vary between games and require testing on real hardware.\n+ */\n+#include <tamtypes.h>\n+#include <kernel.h>\n+#include <string.h>\n+#include \"volume_overlay.h\"\n+\n+#define OVL_WIDTH              96\n+#define OVL_HEIGHT             16\n+#define OVL_PIXELS             (OVL_WIDTH * OVL_HEIGHT)\n+#define OVL_MAX_IMAGE_QWORDS   (OVL_PIXELS / 4)\n+#define OVL_PACKET_QWORDS      (OVL_MAX_IMAGE_QWORDS + 10)\n+#define OVL_VISIBLE_FRAMES     90\n+\n+#define VIF1_STAT              ((volatile u32 *)0x10003C00)\n+#define VIF1_STAT_BUSY_MASK    0x1F000000\n+#define VIF1_STAT_FDR           (1 << 23)\n+#define VIF1_NOP                0\n+#define VIF1_MSKPATH3(mask)    ((u32)(mask) | ((u32)0x06 << 24))\n+#define VIF1_FLUSHA             ((u32)0x13 << 24)\n+#define VIF1_DIRECT(count)     ((u32)(count) | ((u32)0x50 << 24))\n+\n+#define DMA_VIF1_CHCR          ((volatile u32 *)0x10009000)\n+#define DMA_VIF1_MADR          ((volatile u32 *)0x10009010)\n+#define DMA_VIF1_QWC           ((volatile u32 *)0x10009020)\n+#define GS_CSR                 ((volatile u64 *)0x12001000)\n+#define GS_CSR_FINISH          (1ULL << 1)\n+\n+#define GS_PMODE               ((volatile u64 *)0x12000000)\n+#define GS_DISPFB1              ((volatile u64 *)0x12000070)\n+#define GS_DISPLAY1             ((volatile u64 *)0x12000080)\n+#define GS_DISPFB2              ((volatile u64 *)0x12000090)\n+#define GS_DISPLAY2             ((volatile u64 *)0x120000A0)\n+\n+#define GS_GIF_AD               0x0E\n+#define GS_BITBLTBUF            0x50\n+#define GS_TRXPOS               0x51\n+#define GS_TRXREG               0x52\n+#define GS_TRXDIR               0x53\n+#define GS_FINISH                0x61\n+\n+#define GS_PSM_CT32              0x00\n+#define GS_PSM_CT24              0x01\n+#define GS_PSM_CT16              0x02\n+#define GS_PSM_CT16S             0x0A\n+\n+#define PMODE_EN1(x)             ((x) & 0x01)\n+#define PMODE_EN2(x)             (((x) >> 1) & 0x01)\n+#define DISPFB_FBP(x)            ((u16)((x) & 0x1FF))\n+#define DISPFB_FBW(x)            ((u8)(((x) >> 9) & 0x3F))\n+#define DISPFB_PSM(x)            ((u8)(((x) >> 15) & 0x1F))\n+#define DISPFB_DBX(x)            ((u16)(((x) >> 32) & 0x7FF))\n+#define DISPFB_DBY(x)            ((u16)(((x) >> 43) & 0x7FF))\n+#define DISPLAY_DW(x)            ((u16)(((x) >> 32) & 0xFFF))\n+#define DISPLAY_MAGH(x)          ((u8)(((x) >> 23) & 0xF))\n+\n+#define GIF_TAG(nloop, eop, flg, nreg) \\\n+    ((u64)(nloop) | ((u64)(eop) << 15) | ((u64)(flg) << 58) | ((u64)(nreg) << 60))\n+\n+static u128 VolumeOverlayPacket[OVL_PACKET_QWORDS] __attribute__((aligned(64)));\n+static int VolumeOverlayPercent = 100;\n+static int VolumeOverlayFramesLeft;\n+\n+static u32 Colour32(u8 r, u8 g, u8 b)\n+{\n+    return (u32)r | ((u32)g << 8) | ((u32)b << 16) | 0x80000000U;\n+}\n+\n+static u16 Colour16(u8 r, u8 g, u8 b)\n+{\n+    return (u16)(((r >> 3) & 0x1F) |\n+                 (((g >> 3) & 0x1F) << 5) |\n+                 (((b >> 3) & 0x1F) << 10) | 0x8000);\n+}\n+\n+static void PutPixel(int index, u8 psm, u8 r, u8 g, u8 b)\n+{\n+    if (psm == GS_PSM_CT32 || psm == GS_PSM_CT24) {\n+        u32 *pixels = (u32 *)&VolumeOverlayPacket[7];\n+        pixels[index] = Colour32(r, g, b);\n+    } else {\n+        u16 *pixels = (u16 *)&VolumeOverlayPacket[7];\n+        pixels[index] = Colour16(r, g, b);\n+    }\n+}\n+\n+static void FillRect(u8 psm, int x, int y, int w, int h,\n+                     u8 r, u8 g, u8 b)\n+{\n+    int xx, yy;\n+    if (w <= 0 || h <= 0)\n+        return;\n+    for (yy = y; yy < y + h; yy++) {\n+        for (xx = x; xx < x + w; xx++) {\n+            if (xx >= 0 && xx < OVL_WIDTH && yy >= 0 && yy < OVL_HEIGHT)\n+                PutPixel(yy * OVL_WIDTH + xx, psm, r, g, b);\n+        }\n+    }\n+}\n+\n+static u8 GlyphRow(char ch, int row)\n+{\n+    static const u8 digits[10][7] = {\n+        {14,17,19,21,25,17,14}, {4,12,4,4,4,4,14},\n+        {14,17,1,2,4,8,31}, {30,1,1,14,1,1,30},\n+        {2,6,10,18,31,2,2}, {31,16,16,30,1,1,30},\n+        {6,8,16,30,17,17,14}, {31,1,2,4,8,8,8},\n+        {14,17,17,14,17,17,14}, {14,17,17,15,1,2,12}\n+    };\n+    static const u8 letter_v[7] = {17,17,17,17,17,10,4};\n+    static const u8 letter_o[7] = {14,17,17,17,17,17,14};\n+    static const u8 letter_l[7] = {16,16,16,16,16,16,31};\n+    static const u8 percent[7] = {17,2,4,8,16,17,0};\n+\n+    if (row < 0 || row >= 7)\n+        return 0;\n+    if (ch >= '0' && ch <= '9')\n+        return digits[ch - '0'][row];\n+    switch (ch) {\n+        case 'V': return letter_v[row];\n+        case 'O': return letter_o[row];\n+        case 'L': return letter_l[row];\n+        case '%': return percent[row];\n+        default: return 0;\n+    }\n+}\n+\n+static void DrawText(u8 psm, int x, int y, const char *text,\n+                     u8 r, u8 g, u8 b)\n+{\n+    int i, col, row;\n+    for (i = 0; text[i] != '\\0'; i++) {\n+        for (row = 0; row < 7; row++) {\n+            u8 bits = GlyphRow(text[i], row);\n+            for (col = 0; col < 5; col++) {\n+                if (bits & (1 << (4 - col)))\n+                    PutPixel((y + row) * OVL_WIDTH + x + i * 6 + col,\n+                             psm, r, g, b);\n+            }\n+        }\n+    }\n+}\n+\n+static void BuildOverlayImage(u8 psm, int percent)\n+{\n+    int i, fill;\n+    char text[5];\n+    int digits = 0;\n+    int value = percent;\n+\n+    if (value >= 100) {\n+        text[digits++] = (char)('0' + value / 100);\n+        text[digits++] = (char)('0' + (value / 10) % 10);\n+        text[digits++] = (char)('0' + value % 10);\n+    } else if (value >= 10) {\n+        text[digits++] = (char)('0' + value / 10);\n+        text[digits++] = (char)('0' + value % 10);\n+    } else {\n+        text[digits++] = (char)('0' + value);\n+    }\n+    text[digits++] = '%';\n+    text[digits] = '\\0';\n+\n+    for (i = 0; i < OVL_PIXELS; i++)\n+        PutPixel(i, psm, 20, 22, 30);\n+\n+    /* Subtle frame and a compact volume bar. */\n+    FillRect(psm, 0, 0, OVL_WIDTH, 1, 100, 110, 130);\n+    FillRect(psm, 0, OVL_HEIGHT - 1, OVL_WIDTH, 1, 100, 110, 130);\n+    FillRect(psm, 0, 0, 1, OVL_HEIGHT, 100, 110, 130);\n+    FillRect(psm, OVL_WIDTH - 1, 0, 1, OVL_HEIGHT, 100, 110, 130);\n+\n+    DrawText(psm, 6, 2, \"VOL\", 245, 247, 255);\n+    DrawText(psm, OVL_WIDTH - 6 - (digits * 6 - 1), 2,\n+             text, 245, 247, 255);\n+\n+    FillRect(psm, 6, 9, 84, 5, 100, 110, 130);\n+    FillRect(psm, 7, 10, 82, 3, 35, 38, 48);\n+    fill = (percent * 82) / 150;\n+    if (fill > 82)\n+        fill = 82;\n+    if (fill < 0)\n+        fill = 0;\n+    FillRect(psm, 7, 10, fill, 3, 40, 190, 245);\n+}\n+\n+static int SupportedPSM(u8 psm)\n+{\n+    return psm == GS_PSM_CT32 || psm == GS_PSM_CT24 ||\n+           psm == GS_PSM_CT16 || psm == GS_PSM_CT16S;\n+}\n+\n+/*\n+ * Return 1 if written, 0 if the VIF1/DMA path is busy (retry next poll),\n+ * and -1 when the current display format cannot be handled.\n+ */\n+static int DrawOnFramebuffer(u64 dispfb, u64 display, int percent)\n+{\n+    u16 fbp = DISPFB_FBP(dispfb);\n+    u8 fbw = DISPFB_FBW(dispfb);\n+    u8 psm = DISPFB_PSM(dispfb);\n+    u16 dbx = DISPFB_DBX(dispfb);\n+    u16 dby = DISPFB_DBY(dispfb);\n+    u16 dw = DISPLAY_DW(display);\n+    u8 magh = DISPLAY_MAGH(display);\n+    int visible_width, x, y;\n+    int qwords, direct_qwords, total_qwords;\n+    u64 bitbltbuf, trxpos, trxreg;\n+    u32 *vif;\n+    u64 *gif;\n+    u32 chcr_state;\n+\n+    if (!SupportedPSM(psm))\n+        return -1;\n+    if (fbw < 3)\n+        return -1;\n+\n+    visible_width = ((int)dw + 1) / ((int)magh + 1);\n+    if (visible_width < OVL_WIDTH + 16 || visible_width > ((int)fbw << 6))\n+        visible_width = (int)fbw << 6;\n+\n+    x = (int)dbx + visible_width - OVL_WIDTH - 8;\n+    if (x + OVL_WIDTH > ((int)fbw << 6))\n+        x = ((int)fbw << 6) - OVL_WIDTH - 8;\n+    y = (int)dby + 16;\n+    if (x < 0 || y < 0 || x + OVL_WIDTH > ((int)fbw << 6) ||\n+        y + OVL_HEIGHT > 2048)\n+        return -1;\n+\n+    BuildOverlayImage(psm, percent);\n+    qwords = (psm == GS_PSM_CT32 || psm == GS_PSM_CT24)\n+                 ? OVL_PIXELS / 4\n+                 : OVL_PIXELS / 8;\n+\n+    /* If the game's VIF1/GIF transfer is active, skip this frame. */\n+    if ((*DMA_VIF1_CHCR & 0x100) ||\n+        ((*VIF1_STAT & VIF1_STAT_BUSY_MASK) != 0))\n+        return 0;\n+\n+    bitbltbuf = ((u64)(fbp << 5) << 32) |\n+                ((u64)fbw << 48) | ((u64)psm << 56);\n+    trxpos = ((u64)x << 32) | ((u64)y << 48);\n+    trxreg = (u64)OVL_WIDTH | ((u64)OVL_HEIGHT << 32);\n+\n+    /*\n+     * One VIF1 DIRECT packet:\n+     *   5 qwords for BITBLTBUF/TRXPOS/TRXREG/TRXDIR,\n+     *   1 IMAGE tag + image qwords,\n+     *   2 qwords to issue GS FINISH,\n+     * followed by a VIF command to unmask GIF PATH3.\n+     */\n+    vif = (u32 *)&VolumeOverlayPacket[0];\n+    vif[0] = VIF1_NOP;\n+    vif[1] = VIF1_MSKPATH3(0x8000);\n+    vif[2] = VIF1_FLUSHA;\n+    direct_qwords = qwords + 8;\n+    vif[3] = VIF1_DIRECT(direct_qwords);\n+\n+    gif = (u64 *)&VolumeOverlayPacket[1];\n+    gif[0] = GIF_TAG(4, 0, 0, 1);\n+    gif[1] = GS_GIF_AD;\n+    gif[2] = bitbltbuf; gif[3] = GS_BITBLTBUF;\n+    gif[4] = trxpos;    gif[5] = GS_TRXPOS;\n+    gif[6] = trxreg;    gif[7] = GS_TRXREG;\n+    gif[8] = 0;         gif[9] = GS_TRXDIR;\n+\n+    gif = (u64 *)&VolumeOverlayPacket[6];\n+    gif[0] = GIF_TAG(qwords, 1, 2, 0);\n+    gif[1] = 0;\n+\n+    gif = (u64 *)&VolumeOverlayPacket[7 + qwords];\n+    gif[0] = GIF_TAG(1, 1, 0, 1);\n+    gif[1] = GS_GIF_AD;\n+    gif[2] = 1;\n+    gif[3] = GS_FINISH;\n+\n+    vif = (u32 *)&VolumeOverlayPacket[9 + qwords];\n+    vif[0] = VIF1_MSKPATH3(0);\n+    vif[1] = VIF1_NOP;\n+    vif[2] = VIF1_NOP;\n+    vif[3] = VIF1_NOP;\n+\n+    total_qwords = qwords + 10;\n+    *GS_CSR = GS_CSR_FINISH;\n+    FlushCache(0);\n+\n+    /*\n+     * Recheck immediately before claiming VIF1. A game thread can start a\n+     * transfer while the overlay packet is being prepared.\n+     */\n+    if ((*DMA_VIF1_CHCR & 0x100) ||\n+        ((*VIF1_STAT & VIF1_STAT_BUSY_MASK) != 0))\n+        return 0;\n+    chcr_state = *DMA_VIF1_CHCR;\n+\n+    *DMA_VIF1_QWC = total_qwords;\n+    *DMA_VIF1_MADR = (u32)VolumeOverlayPacket;\n+    *DMA_VIF1_CHCR = 0x101;\n+    asm volatile(\"sync.l\");\n+\n+    while (*DMA_VIF1_CHCR & 0x100)\n+        ;\n+    while ((*GS_CSR & GS_CSR_FINISH) == 0)\n+        ;\n+    while ((*VIF1_STAT & VIF1_STAT_BUSY_MASK) != 0)\n+        ;\n+\n+    *DMA_VIF1_CHCR = chcr_state;\n+    asm volatile(\"sync.l\");\n+    return 1;\n+}\n+\n+static int DrawVolumeOverlay(int percent)\n+{\n+    u64 pmode = *GS_PMODE;\n+    u64 dispfb1 = *GS_DISPFB1;\n+    u64 display1 = *GS_DISPLAY1;\n+    u64 dispfb2 = *GS_DISPFB2;\n+    u64 display2 = *GS_DISPLAY2;\n+    int result, drawn = 0;\n+\n+    if (PMODE_EN1(pmode)) {\n+        result = DrawOnFramebuffer(dispfb1, display1, percent);\n+        if (result < 0)\n+            return -1;\n+        if (result == 0)\n+            return 0;\n+        drawn = 1;\n+    }\n+\n+    if (PMODE_EN2(pmode)) {\n+        /* Avoid duplicate transfers if both circuits scan out one framebuffer. */\n+        if (!(PMODE_EN1(pmode) &&\n+              DISPFB_FBP(dispfb1) == DISPFB_FBP(dispfb2) &&\n+              DISPFB_PSM(dispfb1) == DISPFB_PSM(dispfb2))) {\n+            result = DrawOnFramebuffer(dispfb2, display2, percent);\n+            if (result < 0)\n+                return -1;\n+            if (result == 0)\n+                return 0;\n+            drawn = 1;\n+        }\n+    }\n+\n+    return drawn ? 1 : -1;\n+}\n+\n+void VolumeOverlaySetPercent(int percent)\n+{\n+    if (percent < 0)\n+        percent = 0;\n+    if (percent > 150)\n+        percent = 150;\n+    VolumeOverlayPercent = percent;\n+    VolumeOverlayFramesLeft = OVL_VISIBLE_FRAMES;\n+}\n+\n+void VolumeOverlayTick(void)\n+{\n+    int result;\n+\n+    if (VolumeOverlayFramesLeft <= 0)\n+        return;\n+\n+    result = DrawVolumeOverlay(VolumeOverlayPercent);\n+    if (result > 0)\n+        VolumeOverlayFramesLeft--;\n+    else if (result < 0)\n+        VolumeOverlayFramesLeft = 0;\n+}"
        },
        {
          "sha": "e50ecd0531ed3e1558768aa68bc3656ba4b9c100",
          "filename": "include/extern_irx.h",
          "status": "modified",
          "additions": 2,
          "deletions": 0,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/include%2Fextern_irx.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/include%2Fextern_irx.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fextern_irx.h?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -138,6 +138,8 @@ IMPORT_BIN2C(usbmass_bd_irx);\n \n IMPORT_BIN2C(usb_pademu_irx);\n \n+IMPORT_BIN2C(volctrl_irx);\n+\n IMPORT_BIN2C(xhdd_irx);\n \n #endif"
        },
        {
          "sha": "80c01ae5752ecff74eb4f193a7cc560f02dfb99b",
          "filename": "modules/iopcore/volctrl/Makefile",
          "status": "added",
          "additions": 7,
          "deletions": 0,
          "changes": 7,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/modules%2Fiopcore%2Fvolctrl%2FMakefile",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/modules%2Fiopcore%2Fvolctrl%2FMakefile",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fvolctrl%2FMakefile?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -0,0 +1,7 @@\n+IOP_BIN = volctrl.irx\n+IOP_OBJS = volctrl.o imports.o\n+IOP_INCS += -I../../../ee_core/include\n+\n+include $(PS2SDK)/Defs.make\n+include ../../Rules.bin.make\n+include $(PS2SDK)/samples/Makefile.iopglobal"
        },
        {
          "sha": "9f5540d9862e6eff0663b6b225cf8a7b5be72d05",
          "filename": "modules/iopcore/volctrl/imports.lst",
          "status": "added",
          "additions": 17,
          "deletions": 0,
          "changes": 17,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/modules%2Fiopcore%2Fvolctrl%2Fimports.lst",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/modules%2Fiopcore%2Fvolctrl%2Fimports.lst",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fvolctrl%2Fimports.lst?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -0,0 +1,17 @@\n+libsd_IMPORTS_start\n+I_sceSdSetParam\n+I_sceSdGetParam\n+libsd_IMPORTS_end\n+\n+sifcmd_IMPORTS_start\n+I_sceSifInitRpc\n+I_sceSifSetRpcQueue\n+I_sceSifRegisterRpc\n+I_sceSifRpcLoop\n+sifcmd_IMPORTS_end\n+\n+thbase_IMPORTS_start\n+I_CreateThread\n+I_StartThread\n+I_GetThreadId\n+thbase_IMPORTS_end"
        },
        {
          "sha": "a1ffb77f8880b098447bcb128a3e50287221ef68",
          "filename": "modules/iopcore/volctrl/volctrl.c",
          "status": "added",
          "additions": 73,
          "deletions": 0,
          "changes": 73,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/modules%2Fiopcore%2Fvolctrl%2Fvolctrl.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/modules%2Fiopcore%2Fvolctrl%2Fvolctrl.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fvolctrl%2Fvolctrl.c?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -0,0 +1,73 @@\n+#include <libsd.h>\n+#include <loadcore.h>\n+#include <sifrpc.h>\n+#include <thbase.h>\n+\n+#include \"volume_rpc.h\"\n+\n+IRX_ID(\"volctrl\", 1, 1);\n+\n+static SifRpcDataQueue_t volume_rpc_queue;\n+static SifRpcServerData_t volume_rpc_server;\n+static unsigned char volume_rpc_buffer[64] __attribute__((aligned(64)));\n+\n+static s16 master_volume_baseline[4];\n+static int master_volume_baseline_valid;\n+\n+static void *VolumeControlRpcHandler(int command, void *data, int size)\n+{\n+    int percent, i;\n+    s32 scaled;\n+    static const u16 params[4] = {\n+        SD_PARAM_MVOLL, SD_PARAM_MVOLR, SD_PARAM_MVOLL, SD_PARAM_MVOLR\n+    };\n+    static const u16 cores[4] = {0, 0, 1, 1};\n+\n+    if (command != OPL_VOLUME_RPC_SET || data == NULL || size < sizeof(int))\n+        return data;\n+\n+    percent = *(int *)data;\n+    if (percent < 0) percent = 0;\n+    if (percent > OPL_VOLUME_MAX_PERCENT) percent = OPL_VOLUME_MAX_PERCENT;\n+\n+    if (!master_volume_baseline_valid) {\n+        for (i = 0; i < 4; i++)\n+            master_volume_baseline[i] = (s16)sceSdGetParam(cores[i] | params[i]);\n+        master_volume_baseline_valid = 1;\n+    }\n+\n+    for (i = 0; i < 4; i++) {\n+        scaled = ((s32)master_volume_baseline[i] * percent) / 100;\n+        if (scaled > 0x7FFF) scaled = 0x7FFF;\n+        else if (scaled < -0x7FFF) scaled = -0x7FFF;\n+        sceSdSetParam(cores[i] | params[i], (u16)(s16)scaled);\n+    }\n+    return data;\n+}\n+\n+static void VolumeControlRpcThread(void *arg)\n+{\n+    (void)arg;\n+    sceSifInitRpc(0);\n+    sceSifSetRpcQueue(&volume_rpc_queue, GetThreadId());\n+    sceSifRegisterRpc(&volume_rpc_server, OPL_VOLUME_RPC_ID,\n+                   VolumeControlRpcHandler, volume_rpc_buffer,\n+                   NULL, NULL, &volume_rpc_queue);\n+    sceSifRpcLoop(&volume_rpc_queue);\n+}\n+\n+int _start(int argc, char *argv[])\n+{\n+    iop_thread_t thread;\n+    (void)argc;\n+    (void)argv;\n+    thread.attr = TH_C;\n+    thread.option = 0;\n+    thread.thread = VolumeControlRpcThread;\n+    thread.priority = 0x20;\n+    thread.stacksize = 0x800;\n+    int thread_id = CreateThread(&thread);\n+    if (thread_id <= 0) return MODULE_NO_RESIDENT_END;\n+    if (StartThread(thread_id, NULL) < 0) return MODULE_NO_RESIDENT_END;\n+    return MODULE_RESIDENT_END;\n+}"
        },
        {
          "sha": "204598bc097e0d145b9b5318f6fbf5aff746c5f8",
          "filename": "src/system.c",
          "status": "modified",
          "additions": 2,
          "deletions": 0,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/c1a5b3305be955bb1d4a6115bbf12335880f8176/src%2Fsystem.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/c1a5b3305be955bb1d4a6115bbf12335880f8176/src%2Fsystem.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fsystem.c?ref=c1a5b3305be955bb1d4a6115bbf12335880f8176",
          "patch": "@@ -498,6 +498,8 @@ static unsigned int sendIrxKernelRAM(const char *startup, const char *mode_str,\n     irxptr_tab[modcount++].ptr = (void *)&imgdrv_irx;\n     irxptr_tab[modcount].info = size_resetspu_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_RESETSPU);\n     irxptr_tab[modcount++].ptr = (void *)&resetspu_irx;\n+    irxptr_tab[modcount].info = size_volctrl_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_VOLCTRL);\n+    irxptr_tab[modcount++].ptr = (void *)&volctrl_irx;\n \n #ifdef PADEMU\n #define PADEMU_ARG || gEnablePadEmu"
        }
      ]
    }
  },
  {
    "repo": "tales92/experiment-native-chd",
    "comparison": {
      "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/compare/master...tales92:master",
      "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...tales92:master",
      "permalink_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/ps2homebrew:b3a2199...tales92:b3a2199",
      "diff_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...tales92:master.diff",
      "patch_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...tales92:master.patch",
      "base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOBDs4CNoAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "merge_base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOVUA7rdoAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "status": "identical",
      "ahead_by": 0,
      "behind_by": 0,
      "total_commits": 0,
      "commits": [],
      "files": []
    }
  },
  {
    "repo": "belomaxorka/yaopl",
    "comparison": {
      "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/compare/master...belomaxorka:master",
      "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...belomaxorka:master",
      "permalink_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/ps2homebrew:b3a2199...belomaxorka:33a2b19",
      "diff_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...belomaxorka:master.diff",
      "patch_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...belomaxorka:master.patch",
      "base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOBDs4CNoAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "merge_base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOVTul6doAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "status": "ahead",
      "ahead_by": 99,
      "behind_by": 0,
      "total_commits": 99,
      "commits": [
        {
          "sha": "c755d448596796fe608add716dc4c976c4f7434c",
          "node_id": "C_kwDOBDs4CNoAKGM3NTVkNDQ4NTk2Nzk2ZmU2MDhhZGQ3MTZkYzRjOTc2YzRmNzQzNGM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:19:13Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:19:13Z"
            },
            "message": "cheatman: ignore comment lines that start with blanks\n\nA .cht line such as \" //Gameplay 16:9\" is cut at \"//\" by term_str(),\nwhich leaves \" \". trim_str() returned early for a string without\nprintable characters and kept it as is, so parse_buf() took \" \" as a\ncheat name. In \"select cheats\" mode the codes after such a comment\nshowed up as an unnamed entry instead of belonging to the previous\ncheat, as they do when the comment starts in column 0.\n\ntrim_str() now empties a blank string, so the line is skipped like any\nother comment.\n\nReproduction: SLES_505.41.cht and SLES_539.08.cht from\nPS2-Widescreen/OPL-Widescreen-Cheats. Before: \"Mastercode\" (1 code)\nplus a cheat named \" \" (7 codes). After: \"Mastercode\" with 8 codes, as\nfor a comment in column 0. The other 3,609 files in that repository\nparse the same before and after.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "55b623dd4be9ada9cf4502bfe63bd20c34c51e3f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/55b623dd4be9ada9cf4502bfe63bd20c34c51e3f"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/c755d448596796fe608add716dc4c976c4f7434c",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c755d448596796fe608add716dc4c976c4f7434c",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/c755d448596796fe608add716dc4c976c4f7434c",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c755d448596796fe608add716dc4c976c4f7434c/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "44a003bd5868539481baf3c09922660246ca96f5",
          "node_id": "C_kwDOBDs4CNoAKDQ0YTAwM2JkNTg2ODUzOTQ4MWJhZjNjMDk5MjI2NjAyNDZjYTk2ZjU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:20:49Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:20:49Z"
            },
            "message": "cheatman: stop at MAX_CODES cheats instead of writing past gCheats\n\nparse_buf() tested \"cheat_index < MAX_CODES\" before incrementing\ncheat_index, so the 251st cheat in a file was written to\ngCheats[MAX_CODES], one entry past the array.\n\nRiptOPL fixed the overflow by testing \"cheat_index + 1 < MAX_CODES\"\n(NathanNeurotic/Open-PS2-Loader@8a2e8743). With that test alone the\ncodes of each further cheat are still stored, in the last cheat: its\ncode index restarts at 0 for every name, so they replace that cheat's\nown codes. Stop parsing instead once the table is full.\n\nReproduction: a .cht file with 251 cheats of one code each, parsed by a\nhost build of parse_buf().\n- Before: AddressSanitizer reports a write past the end of gCheats.\n- With only the index test: cheat 250 gets the code of cheat 251.\n- After: 250 cheats, each with its own code.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "ddab3af3d0717b821e186b6690360c9ee8e26256",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/ddab3af3d0717b821e186b6690360c9ee8e26256"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/44a003bd5868539481baf3c09922660246ca96f5",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/44a003bd5868539481baf3c09922660246ca96f5",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/44a003bd5868539481baf3c09922660246ca96f5",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/44a003bd5868539481baf3c09922660246ca96f5/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "cdf07ba8e5826e71405fafeeaf2a8f37c7a360b7",
          "node_id": "C_kwDOBDs4CNoAKGNkZjA3YmE4ZTU4MjZlNzE0MDVmYWZlZWFmMmE4ZjM3YzdhMzYwYjc",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:22:04Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:22:04Z"
            },
            "message": "cheatman: make room for the terminator in make_code()\n\nmake_code() is only called for lines that is_cheat_code() accepted,\nwhich have exactly CODE_DIGITS (16) hex digits. It copies them into\nchar digits[CODE_DIGITS] and then writes the terminating NUL to\ndigits[16], one byte past the array, for every cheat code it parses.\n\nThe same fix is in RiptOPL (NathanNeurotic/Open-PS2-Loader@8a2e8743).\n\nReproduction: any .cht file with a code line, parsed by a host build of\nparse_buf(). Before: AddressSanitizer reports a stack-buffer-overflow\nin make_code(), and an MSVC build with /GS aborts with\nSTATUS_STACK_BUFFER_OVERRUN. After: no report.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "97d5816266d84fa50f24d85fe9203626a225bf32",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/97d5816266d84fa50f24d85fe9203626a225bf32"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/cdf07ba8e5826e71405fafeeaf2a8f37c7a360b7",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/cdf07ba8e5826e71405fafeeaf2a8f37c7a360b7",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/cdf07ba8e5826e71405fafeeaf2a8f37c7a360b7",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/cdf07ba8e5826e71405fafeeaf2a8f37c7a360b7/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "eeb57687be37f21a4e4f4e903fb0ac74c62606af",
          "node_id": "C_kwDOBDs4CNoAKGVlYjU3Njg3YmUzN2YyMWE0ZTRmNGU5MDNmYjBhYzc0YzYyNjA2YWY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:22:45Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:22:45Z"
            },
            "message": "cheatman: do not run past the last line of a .cht file\n\nWhen the last line of a .cht file has no LF, parse_buf():\n- skipped the CHEAT_LINE_MAX cap, which was only applied to lines that\n  end with LF, so a last line longer than 255 bytes was copied past\n  line[256] on the stack;\n- advanced by len + 1, past the terminating NUL, and went on parsing\n  whatever followed the buffer on the heap.\n\nCap every line, and step over the byte after a line only when it is not\nthe terminator. Long lines that end with LF are handled as before.\n\nRiptOPL fixed both (NathanNeurotic/Open-PS2-Loader@8a2e8743).\n\nReproduction, on a host build of parse_buf():\n- 27 of the 3,611 files in PS2-Widescreen/OPL-Widescreen-Cheats end\n  without LF (e.g. SCES_503.00.cht). Before: AddressSanitizer reports a\n  heap-buffer-overflow read on each. After: no report, same cheats.\n- A file ending with a 400-byte line without LF. Before: stack-buffer-\n  overflow write in parse_buf(). After: the line is cut at 255 bytes.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "4be5bf23456bce6dde2ecb50a01d36a62134ce18",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/4be5bf23456bce6dde2ecb50a01d36a62134ce18"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/eeb57687be37f21a4e4f4e903fb0ac74c62606af",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/eeb57687be37f21a4e4f4e903fb0ac74c62606af",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/eeb57687be37f21a4e4f4e903fb0ac74c62606af",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/eeb57687be37f21a4e4f4e903fb0ac74c62606af/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "ff498c1961ff8878a8bef691176cdab11ed3e150",
          "node_id": "C_kwDOBDs4CNoAKGZmNDk4YzE5NjFmZjg4NzhhOGJlZjY5MTE3NmNkYWIxMWVkM2UxNTA",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:26:19Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:26:19Z"
            },
            "message": "isofs, cdvdman: skip directory records without a name\n\ncdvdman_locatefile() advanced to the next directory record only inside\n\"if (filename_len)\". A record with a non-zero length and a name length\nof 0 therefore never moved tocPos, and the scan looped forever. The\ngame list (isofs) hangs on such an image while it looks for\nSYSTEM.CNF; the in-game CDVDMAN copy hangs on the first file lookup.\n\nAdvance past every record that is neither the match nor the directory\nto descend into.\n\nReproduction: a root directory with \".\", \"..\", a 34-byte record whose\nname length is 0, then SYSTEM.CNF;1, fed to host builds of both copies\nof cdvdman_locatefile(). Before: endless loop. After: SYSTEM.CNF;1 is\nfound.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "d757f3ba52893635abf7729aef9ee326f167162d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/d757f3ba52893635abf7729aef9ee326f167162d"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/ff498c1961ff8878a8bef691176cdab11ed3e150",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ff498c1961ff8878a8bef691176cdab11ed3e150",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/ff498c1961ff8878a8bef691176cdab11ed3e150",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ff498c1961ff8878a8bef691176cdab11ed3e150/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "af5b52b74426c728770e5ae25900734e92882ddb",
          "node_id": "C_kwDOBDs4CNoAKGFmNWI1MmI3NDQyNmM3Mjg3NzBlNWFlMjU5MDA3MzRlOTI4ODJkZGI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:26:54Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:26:54Z"
            },
            "message": "isofs, cdvdman: read the directory record length as one byte\n\nstruct dirTocEntry declared the first two bytes of a directory record\nas one short. In ISO 9660 (9.1.1, 9.1.2) byte 0 is the record length\nand byte 1 is the extended attribute record length. A non-zero byte 1\nmade cdvdman_locatefile() step by 256 bytes or more, and a value of\n0x80 or more made the step negative, so the scan read before\ncdvdman_buf and could loop forever.\n\nSplit the field into two bytes and step by the record length alone.\ncdrom_dread() in the in-game CDVDMAN uses the same struct and now steps\nthe same way. Records with byte 1 = 0, which is what mastering tools\nwrite, are handled as before.\n\nReproduction: a root directory with a record whose byte 1 is 0x80,\nfollowed by SYSTEM.CNF;1, fed to host builds of both copies of\ncdvdman_locatefile(). Before: AddressSanitizer reports a read before\ncdvdman_buf. After: SYSTEM.CNF;1 is found.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "151c09f86a01cdf69fce10981a8368fd9382d1d9",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/151c09f86a01cdf69fce10981a8368fd9382d1d9"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/af5b52b74426c728770e5ae25900734e92882ddb",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/af5b52b74426c728770e5ae25900734e92882ddb",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/af5b52b74426c728770e5ae25900734e92882ddb",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/af5b52b74426c728770e5ae25900734e92882ddb/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "ff498c1961ff8878a8bef691176cdab11ed3e150",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ff498c1961ff8878a8bef691176cdab11ed3e150",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/ff498c1961ff8878a8bef691176cdab11ed3e150"
            }
          ]
        },
        {
          "sha": "0253f98bc62bdf08473f6f63f8c19b5d009fa23f",
          "node_id": "C_kwDOBDs4CNoAKDAyNTNmOThiYzYyYmRmMDg0NzNmNmY2M2Y4YzE5YjVkMDA5ZmEyM2Y",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:29:02Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:29:02Z"
            },
            "message": "zso: reject headers with align above 11\n\nread_raw_data() computes the sector of a ZSO block as\noffset / (2048 >> align). Every copy of it (isofs, the EE frontend and\nthe in-game CDVDMAN) divides by zero when the header's align byte is\nabove 11, and a shift of 32 or more is undefined in C. Nothing checked\nthe byte: ziso.py writes align = total size / 2^31, so real images\nuse 0 to 3.\n\nziso_init() now returns -1 for such a header, and its callers treat the\nfile as not being a ZSO image. The game list (isofs) then does not find\nan ISO9660 volume in it and skips the file; launching it no longer\ndivides by zero.\n\nReproduction: a ZSO header with align = 12 passed to host builds of\nziso_init() and isofs read_raw_data(). Before: the first index read\nfails with an integer divide by zero. After: ziso_init() returns -1.\nAlign 0 and 11 read as before.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "0dd092d361d328ac708af0b9e909c4ce115f1405",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/0dd092d361d328ac708af0b9e909c4ce115f1405"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/0253f98bc62bdf08473f6f63f8c19b5d009fa23f",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0253f98bc62bdf08473f6f63f8c19b5d009fa23f",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0253f98bc62bdf08473f6f63f8c19b5d009fa23f",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0253f98bc62bdf08473f6f63f8c19b5d009fa23f/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "43781768fc9d4dbf58628757cdb189209fd38596",
          "node_id": "C_kwDOBDs4CNoAKDQzNzgxNzY4ZmM5ZDRkYmY1ODYyODc1N2NkYjE4OTIwOWZkMzg1OTY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:30:06Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:30:06Z"
            },
            "message": "ps2cnf: reject a BOOT2 line without '='\n\nCNFGetToken() returns NULL when the text does not match the token. The\nresult of the \"=\" lookup was only compared with -1, so for a line such\nas \"BOOT2 cdrom0:\\SLUS_200.62;1\" ps2cnfGetBootFile() passed NULL to\nCNFGetKey(), which dereferences it. This runs for every ISO the game\nlist has not cached yet (GetStartupExecName() in supportbase.c).\n\nTreat a missing '=' like the other parse failures: the image has no\nusable boot file and is skipped.\n\nThe same check is in RiptOPL's C++ edition\n(NathanNeurotic/RiptOPL@a9cf8088, src/platform/ps2cnf.cpp).\n\nReproduction: a SYSTEM.CNF with \"BOOT2 cdrom0:\\SLUS_200.62;1\" passed to\na host build of ps2cnfGetBootFile(). Before: access violation at\naddress 0 in CNFGetKey(). After: it returns -1. \"BOOT2 = ...\" parses as\nbefore.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "079d7dd7c3a7549c8c074e46ba1a69806a030874",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/079d7dd7c3a7549c8c074e46ba1a69806a030874"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/43781768fc9d4dbf58628757cdb189209fd38596",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/43781768fc9d4dbf58628757cdb189209fd38596",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/43781768fc9d4dbf58628757cdb189209fd38596",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/43781768fc9d4dbf58628757cdb189209fd38596/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "2a57ca88b03e207dce2c50edbf205c9a621b9d2e",
          "node_id": "C_kwDOBDs4CNoAKDJhNTdjYTg4YjAzZTIwN2RjZTJjNTBlZGJmMjA1YzlhNjIxYjlkMmU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:31:42Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:31:42Z"
            },
            "message": "supportbase: ignore a partial record at the end of ul.cfg\n\nsbReadList() sizes the game list for size / 64 ul.cfg records, but\nread records while size > 0. When the file size is not a multiple of\n64, the last iteration read a partial record over the previous one and\nstored it in one slot more than the list had room for:\n- with no ISO games, that write went past the end of the list;\n- with ISO games, the garbage entry took the place of the last ISO\n  game, which was dropped from the list.\n\nRead whole records only.\n\nRiptOPL's C++ edition reads records the same way\n(NathanNeurotic/RiptOPL@65ea056d, src/sources/supportbase.cpp).\n\nReproduction: host build of sbReadList() over a ul.cfg of one record\nplus one byte.\n- No ISO games. Before: AddressSanitizer reports a heap-buffer-overflow\n  write; a plain build corrupts the heap. After: one game.\n- Two ISO games. Before: \"Game A\", an empty entry, \"Game 0\"; \"Game 1\"\n  is missing. After: \"Game A\", \"Game 0\", \"Game 1\".\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "832628dd661f428cfa56e6673cffd59f61c3f88e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/832628dd661f428cfa56e6673cffd59f61c3f88e"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/2a57ca88b03e207dce2c50edbf205c9a621b9d2e",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/2a57ca88b03e207dce2c50edbf205c9a621b9d2e",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/2a57ca88b03e207dce2c50edbf205c9a621b9d2e",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/2a57ca88b03e207dce2c50edbf205c9a621b9d2e/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "578ba6b5a63b5fd418604f659859aa744d47c46f",
          "node_id": "C_kwDOBDs4CNoAKDU3OGJhNmI1YTYzYjVmZDQxODYwNGY2NTk4NTlhYTc0NGQ0N2M0NmY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:32:26Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:32:26Z"
            },
            "message": "supportbase: look up each listed game in the whole games.bin cache\n\nupdateISOGameList() decides whether games.bin must be rewritten. Its\ninner loop runs j over the cached entries but compared\ncache->games[i], the entry at the position of the listed game, every\ntime. So:\n- when the folder has more games than the cache, cache->games[i] is\n  read past the end of the cache array;\n- the same games in another order counted as a change, because only\n  the entry at the same position could ever match.\n\nCompare with cache->games[j], as the loop intends. A folder whose games\nare all in the cache, in any order, keeps its games.bin; an added or\nremoved game still rewrites it.\n\nRiptOPL removed the out-of-bounds read with a position-by-position\ncomparison instead (NathanNeurotic/Open-PS2-Loader@515c534a), which\nkeeps rewriting the cache when the order changes.\n\nReproduction: host build of updateISOGameList().\n- Cache of 1 game, folder of 2. Before: AddressSanitizer reports a\n  heap-buffer-overflow read. After: games.bin is rewritten.\n- Same 3 games, first two swapped. Before: rewritten. After: kept.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "64a9a5a4efc8afe534de6148116a8af5c7596066",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/64a9a5a4efc8afe534de6148116a8af5c7596066"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/578ba6b5a63b5fd418604f659859aa744d47c46f",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/578ba6b5a63b5fd418604f659859aa744d47c46f",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/578ba6b5a63b5fd418604f659859aa744d47c46f",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/578ba6b5a63b5fd418604f659859aa744d47c46f/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "f244afff78c1e8c96ab14fb736eba26364a21700",
          "node_id": "C_kwDOBDs4CNoAKGYyNDRhZmZmNzhjMWU4Yzk2YWIxNGZiNzM2ZWJhMjYzNjRhMjE3MDA",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:33:40Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:33:40Z"
            },
            "message": "system: hash ul.cfg names as unsigned bytes in USBA_crc32()\n\nUSBA_crc32() gives the CRC in the ul.%08X.<ID>.%02x chunk names of\nul.cfg games. It read each name byte through a plain char, which is\nsigned on the EE. A byte of 0x80 or more (a non-ASCII title, e.g.\nCyrillic or Japanese) became negative, and crctab[byte ^ ...] read\nmemory before crctab. The CRC of such a title therefore depended on\nwhatever the build placed before the table, so OPL looked for chunk\nfiles that no PC tool had written.\n\nRead the bytes as unsigned char. ASCII titles keep their CRC. For other\ntitles the CRC is now the one that tools hashing unsigned bytes compute\n(PyOPLM, YAOPLM; RiptOPL made the same change in\nNathanNeurotic/Open-PS2-Loader@eb277b61). A non-ASCII ul game whose\nchunks happen to carry the old, build-specific CRC will need its chunks\nrenamed.\n\nReproduction: host build of USBA_crc32() (MSVC char is signed, as on\nthe EE). \"A\" -> 935FAD90 and \"Grand Theft Auto III\" -> 10D00014 before\nand after. CP1251 \"\u0418\u0433\u0440\u0430\" (C8 E3 F0 E0): before, 00000000 in a plain\nbuild and AA71C331 in an AddressSanitizer build of the same code;\nafter, E857E311 in both. 300 random names with bytes 01-FF match an\nindependent unsigned implementation.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "749d073cd916eeecddfc17ecb092833442aac0ed",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/749d073cd916eeecddfc17ecb092833442aac0ed"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/f244afff78c1e8c96ab14fb736eba26364a21700",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f244afff78c1e8c96ab14fb736eba26364a21700",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/f244afff78c1e8c96ab14fb736eba26364a21700",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f244afff78c1e8c96ab14fb736eba26364a21700/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "da9af708e61ad928e9f80e7c50581ec4936dab9d",
          "node_id": "C_kwDOBDs4CNoAKGRhOWFmNzA4ZTYxYWQ5MjhlOWY4MGU3YzUwNTgxZWM0OTM2ZGFiOWQ",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:34:07Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:34:07Z"
            },
            "message": "pc: hash names as unsigned bytes in iso2opl and opl2iso\n\nBoth tools carry a copy of USBA_crc32() that reads the name through a\nplain char. On x86 that char is signed, so a non-ASCII game name gave\na negative table index and a CRC that depends on the build, as in OPL\nbefore the previous commit. Read the bytes as unsigned char so both\ntools name ul chunks the way OPL now looks them up.\n\nReproduction: host build of iso2opl's crc32(). CP1251 \"\u0418\u0433\u0440\u0430\" now gives\nE857E311, the same as OPL's USBA_crc32(); ASCII names are unchanged.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "86eb0a0340d907636b529c9eaa8f9a7b45969650",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/86eb0a0340d907636b529c9eaa8f9a7b45969650"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/da9af708e61ad928e9f80e7c50581ec4936dab9d",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/da9af708e61ad928e9f80e7c50581ec4936dab9d",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/da9af708e61ad928e9f80e7c50581ec4936dab9d",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/da9af708e61ad928e9f80e7c50581ec4936dab9d/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "f244afff78c1e8c96ab14fb736eba26364a21700",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f244afff78c1e8c96ab14fb736eba26364a21700",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/f244afff78c1e8c96ab14fb736eba26364a21700"
            }
          ]
        },
        {
          "sha": "3722eb418ed8869a08f6975643ebbce2d993376a",
          "node_id": "C_kwDOBDs4CNoAKDM3MjJlYjQxOGVkODg2OWEwOGY2OTc1NjQzZWJiY2UyZDk5MzM3NmE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:35:00Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:35:00Z"
            },
            "message": "supportbase: check the name length before looking at its extension\n\nisValidIsoName() compares &name[size - 4] with \".iso\" before checking\nthe length. For a name shorter than 4 bytes, such as the \".\" and \"..\"\nentries that readdir() returns in every CD and DVD subfolder, that\npointer is before the start of the name.\n\nReturn early for names shorter than 5 bytes (\"x.iso\"), which are not\nimages anyway.\n\nRiptOPL has the same guard (NathanNeurotic/Open-PS2-Loader@eb277b61).\n\nReproduction: host build of isValidIsoName() with \"..\". Before:\nAddressSanitizer reports a read 2 bytes before the name. After: it\nreturns 0 without reading outside the name. Image names give the same\nresults as before.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "202ed03824df21f1b71a62f85485621f09757301",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/202ed03824df21f1b71a62f85485621f09757301"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/3722eb418ed8869a08f6975643ebbce2d993376a",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/3722eb418ed8869a08f6975643ebbce2d993376a",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/3722eb418ed8869a08f6975643ebbce2d993376a",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/3722eb418ed8869a08f6975643ebbce2d993376a/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "bfe726f587f21b3dd071ff7edd4598d9d9652e46",
          "node_id": "C_kwDOBDs4CNoAKGJmZTcyNmY1ODdmMjFiM2RkMDcxZmY3ZWRkNDU5OGQ5ZDk2NTJlNDY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:38:11Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:38:11Z"
            },
            "message": "isofs, cdvdman: bound the file name copy in cdvdman_findfile()\n\ncdvdman_findfile() fills the 16-byte name field of the result with\nstrcpy(name, strrchr(path, '\\') + 1). Two problems:\n- The game list opens \"iso:/SYSTEM.CNF;1\", so isofs gets\n  \"/SYSTEM.CNF;1\". It has no '\\', strrchr() returns NULL, and strcpy()\n  copies from address 1 of IOP memory into the name, for every image\n  that is not in games.bin yet.\n- A name of 16 characters or more, possible with ISO 9660 level 2\n  names, runs past the field into the rest of the result and the stack.\n\nTake the last component after '\\' or '/' (the whole path if there is\nneither) and cut it to fit. The name is informational: callers use the\nLSN and size. The in-game copy in searchfile.c (sceCdSearchFile) gets\nthe same change.\n\nRiptOPL bounds the isofs copy in\nNathanNeurotic/Open-PS2-Loader@03f50fa6.\n\nReproduction: host build of the isofs cdvdman_findfile() on a fake\nroot directory.\n- \"/SYSTEM.CNF;1\". Before: access violation at address 1 in strcpy().\n  After: found, name \"SYSTEM.CNF;1\".\n- \"\\A_VERY_LONG_LEVEL2_FILENAME.TXT;1\". Before: AddressSanitizer\n  reports a stack-buffer-overflow. After: name \"A_VERY_LONG_LEV\".\n- \"\\SYSTEM.CNF;1\" gives the same result as before.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "05bf540020db8466870de25022710b5accad8a41",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/05bf540020db8466870de25022710b5accad8a41"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/bfe726f587f21b3dd071ff7edd4598d9d9652e46",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/bfe726f587f21b3dd071ff7edd4598d9d9652e46",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/bfe726f587f21b3dd071ff7edd4598d9d9652e46",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/bfe726f587f21b3dd071ff7edd4598d9d9652e46/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "a2ff76fc99a063f42e063466d97042b1512369f9",
          "node_id": "C_kwDOBDs4CNoAKGEyZmY3NmZjOTlhMDYzZjQyZTA2MzQ2NmQ5NzA0MmIxNTEyMzY5Zjk",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:03Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:03Z"
            },
            "message": "cdvdman: do not overflow cdvdman_curdir on long directory entry names\n\nThe in-game cdvdman_locatefile() copies the name of every directory\nrecord it walks past into char cdvdman_curdir[15], using the record's\nown name length (up to 255). A file or folder name longer than 14\ncharacters, which ISO 9660 level 2 allows and which rebuilt images can\ncontain, overwrites the IOP stack whenever the game looks up any file\nin that directory.\n\nCut the copy to the buffer. Names are compared on 12 characters only,\nso lookups give the same results.\n\nReproduction: host build of the in-game cdvdman_locatefile() on a root\ndirectory holding a 33-character name before SYSTEM.CNF;1. Before:\nAddressSanitizer reports a stack-buffer-overflow in strncpy(). After:\nSYSTEM.CNF;1 is found with no report.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "490e50c9034ad154e148232c735c5e82881ea1d7",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/490e50c9034ad154e148232c735c5e82881ea1d7"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/a2ff76fc99a063f42e063466d97042b1512369f9",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a2ff76fc99a063f42e063466d97042b1512369f9",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a2ff76fc99a063f42e063466d97042b1512369f9",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a2ff76fc99a063f42e063466d97042b1512369f9/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "0afc96f99de63beece68ee9585e20a064b40ef65",
          "node_id": "C_kwDOBDs4CNoAKDBhZmM5NmY5OWRlNjNiZWVjZTY4ZWU5NTg1ZTIwYTA2NGI0MGVmNjU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:40Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:40Z"
            },
            "message": "Merge branch 'fix/cdvdman-long-record-name' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "490e50c9034ad154e148232c735c5e82881ea1d7",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/490e50c9034ad154e148232c735c5e82881ea1d7"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/0afc96f99de63beece68ee9585e20a064b40ef65",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0afc96f99de63beece68ee9585e20a064b40ef65",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0afc96f99de63beece68ee9585e20a064b40ef65",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0afc96f99de63beece68ee9585e20a064b40ef65/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            },
            {
              "sha": "a2ff76fc99a063f42e063466d97042b1512369f9",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a2ff76fc99a063f42e063466d97042b1512369f9",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a2ff76fc99a063f42e063466d97042b1512369f9"
            }
          ]
        },
        {
          "sha": "13ee11d4f3ce1df214c1db8ef01051c795d65a91",
          "node_id": "C_kwDOBDs4CNoAKDEzZWUxMWQ0ZjNjZTFkZjIxNGMxZGI4ZWYwMTA1MWM3OTVkNjVhOTE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:40Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:40Z"
            },
            "message": "Merge branch 'fix/cheat-code-digits' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "df52199cf1d20ee880c61b362dd04d9c799a9c99",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/df52199cf1d20ee880c61b362dd04d9c799a9c99"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/13ee11d4f3ce1df214c1db8ef01051c795d65a91",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/13ee11d4f3ce1df214c1db8ef01051c795d65a91",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/13ee11d4f3ce1df214c1db8ef01051c795d65a91",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/13ee11d4f3ce1df214c1db8ef01051c795d65a91/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "0afc96f99de63beece68ee9585e20a064b40ef65",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0afc96f99de63beece68ee9585e20a064b40ef65",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0afc96f99de63beece68ee9585e20a064b40ef65"
            },
            {
              "sha": "cdf07ba8e5826e71405fafeeaf2a8f37c7a360b7",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/cdf07ba8e5826e71405fafeeaf2a8f37c7a360b7",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/cdf07ba8e5826e71405fafeeaf2a8f37c7a360b7"
            }
          ]
        },
        {
          "sha": "34c8247e01ae1510fd499279720c944073312efd",
          "node_id": "C_kwDOBDs4CNoAKDM0YzgyNDdlMDFhZTE1MTBmZDQ5OTI3OTcyMGM5NDQwNzMzMTJlZmQ",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:40Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:40Z"
            },
            "message": "Merge branch 'fix/cheat-indented-comment' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "ee72f89d867e3c85efae6f61331cc30141003dd8",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/ee72f89d867e3c85efae6f61331cc30141003dd8"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/34c8247e01ae1510fd499279720c944073312efd",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/34c8247e01ae1510fd499279720c944073312efd",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/34c8247e01ae1510fd499279720c944073312efd",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/34c8247e01ae1510fd499279720c944073312efd/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "13ee11d4f3ce1df214c1db8ef01051c795d65a91",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/13ee11d4f3ce1df214c1db8ef01051c795d65a91",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/13ee11d4f3ce1df214c1db8ef01051c795d65a91"
            },
            {
              "sha": "c755d448596796fe608add716dc4c976c4f7434c",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c755d448596796fe608add716dc4c976c4f7434c",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/c755d448596796fe608add716dc4c976c4f7434c"
            }
          ]
        },
        {
          "sha": "5ff1d19b3818c5c34dc2c9aaecd9403dff9f63d6",
          "node_id": "C_kwDOBDs4CNoAKDVmZjFkMTliMzgxOGM1YzM0ZGMyYzlhYWVjZDk0MDNkZmY5ZjYzZDY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:40Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:40Z"
            },
            "message": "Merge branch 'fix/cheat-index-overflow' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "295b389f7fca312a4dd015510ee5d0e6c0308d4a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/295b389f7fca312a4dd015510ee5d0e6c0308d4a"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/5ff1d19b3818c5c34dc2c9aaecd9403dff9f63d6",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/5ff1d19b3818c5c34dc2c9aaecd9403dff9f63d6",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/5ff1d19b3818c5c34dc2c9aaecd9403dff9f63d6",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/5ff1d19b3818c5c34dc2c9aaecd9403dff9f63d6/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "34c8247e01ae1510fd499279720c944073312efd",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/34c8247e01ae1510fd499279720c944073312efd",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/34c8247e01ae1510fd499279720c944073312efd"
            },
            {
              "sha": "44a003bd5868539481baf3c09922660246ca96f5",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/44a003bd5868539481baf3c09922660246ca96f5",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/44a003bd5868539481baf3c09922660246ca96f5"
            }
          ]
        },
        {
          "sha": "860cf373a49725dad18c7b9d72dcb4c7e8183e41",
          "node_id": "C_kwDOBDs4CNoAKDg2MGNmMzczYTQ5NzI1ZGFkMThjN2I5ZDcyZGNiNGM3ZTgxODNlNDE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "message": "Merge branch 'fix/cheat-last-line' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "f85ff094ada576d422240eb53ea678d5529d7ea3",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/f85ff094ada576d422240eb53ea678d5529d7ea3"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/860cf373a49725dad18c7b9d72dcb4c7e8183e41",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/860cf373a49725dad18c7b9d72dcb4c7e8183e41",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/860cf373a49725dad18c7b9d72dcb4c7e8183e41",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/860cf373a49725dad18c7b9d72dcb4c7e8183e41/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "5ff1d19b3818c5c34dc2c9aaecd9403dff9f63d6",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/5ff1d19b3818c5c34dc2c9aaecd9403dff9f63d6",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/5ff1d19b3818c5c34dc2c9aaecd9403dff9f63d6"
            },
            {
              "sha": "eeb57687be37f21a4e4f4e903fb0ac74c62606af",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/eeb57687be37f21a4e4f4e903fb0ac74c62606af",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/eeb57687be37f21a4e4f4e903fb0ac74c62606af"
            }
          ]
        },
        {
          "sha": "df3574d1b823322a04b12cd957f58395fba80313",
          "node_id": "C_kwDOBDs4CNoAKGRmMzU3NGQxYjgyMzMyMmEwNGIxMmNkOTU3ZjU4Mzk1ZmJhODAzMTM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "message": "Merge branch 'fix/findfile-name-copy' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "d156537004bb0f9ac3efd253545b0149c6ef068c",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/d156537004bb0f9ac3efd253545b0149c6ef068c"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/df3574d1b823322a04b12cd957f58395fba80313",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/df3574d1b823322a04b12cd957f58395fba80313",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/df3574d1b823322a04b12cd957f58395fba80313",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/df3574d1b823322a04b12cd957f58395fba80313/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "860cf373a49725dad18c7b9d72dcb4c7e8183e41",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/860cf373a49725dad18c7b9d72dcb4c7e8183e41",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/860cf373a49725dad18c7b9d72dcb4c7e8183e41"
            },
            {
              "sha": "bfe726f587f21b3dd071ff7edd4598d9d9652e46",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/bfe726f587f21b3dd071ff7edd4598d9d9652e46",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/bfe726f587f21b3dd071ff7edd4598d9d9652e46"
            }
          ]
        },
        {
          "sha": "e9ca1c48b95d7aa20433483489c8a9e00d176fe9",
          "node_id": "C_kwDOBDs4CNoAKGU5Y2ExYzQ4Yjk1ZDdhYTIwNDMzNDgzNDg5YzhhOWUwMGQxNzZmZTk",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "message": "Merge branch 'fix/games-bin-cache-compare' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "e0a6e79a9b63ebe79d1aac22a4a7b460b8fe4bfc",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/e0a6e79a9b63ebe79d1aac22a4a7b460b8fe4bfc"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/e9ca1c48b95d7aa20433483489c8a9e00d176fe9",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e9ca1c48b95d7aa20433483489c8a9e00d176fe9",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e9ca1c48b95d7aa20433483489c8a9e00d176fe9",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e9ca1c48b95d7aa20433483489c8a9e00d176fe9/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "df3574d1b823322a04b12cd957f58395fba80313",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/df3574d1b823322a04b12cd957f58395fba80313",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/df3574d1b823322a04b12cd957f58395fba80313"
            },
            {
              "sha": "578ba6b5a63b5fd418604f659859aa744d47c46f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/578ba6b5a63b5fd418604f659859aa744d47c46f",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/578ba6b5a63b5fd418604f659859aa744d47c46f"
            }
          ]
        },
        {
          "sha": "f59b4788f6e6fcfd0b749162f523cfe1fafbffbf",
          "node_id": "C_kwDOBDs4CNoAKGY1OWI0Nzg4ZjZlNmZjZmQwYjc0OTE2MmY1MjNjZmUxZmFmYmZmYmY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "message": "Merge branch 'fix/iso-dir-record-hang' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "a2b0abe68b0e0102308e08b49e4e428fc24aa492",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/a2b0abe68b0e0102308e08b49e4e428fc24aa492"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/f59b4788f6e6fcfd0b749162f523cfe1fafbffbf",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f59b4788f6e6fcfd0b749162f523cfe1fafbffbf",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/f59b4788f6e6fcfd0b749162f523cfe1fafbffbf",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f59b4788f6e6fcfd0b749162f523cfe1fafbffbf/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "e9ca1c48b95d7aa20433483489c8a9e00d176fe9",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e9ca1c48b95d7aa20433483489c8a9e00d176fe9",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e9ca1c48b95d7aa20433483489c8a9e00d176fe9"
            },
            {
              "sha": "af5b52b74426c728770e5ae25900734e92882ddb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/af5b52b74426c728770e5ae25900734e92882ddb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/af5b52b74426c728770e5ae25900734e92882ddb"
            }
          ]
        },
        {
          "sha": "69abebf3a7bd9b150db60933d4bad4620fd7707d",
          "node_id": "C_kwDOBDs4CNoAKDY5YWJlYmYzYTdiZDliMTUwZGI2MDkzM2Q0YmFkNDYyMGZkNzcwN2Q",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "message": "Merge branch 'fix/iso-name-too-short' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "01989db6eb2bae7b3abcabb9b55e6f9007bd698c",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/01989db6eb2bae7b3abcabb9b55e6f9007bd698c"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/69abebf3a7bd9b150db60933d4bad4620fd7707d",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/69abebf3a7bd9b150db60933d4bad4620fd7707d",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/69abebf3a7bd9b150db60933d4bad4620fd7707d",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/69abebf3a7bd9b150db60933d4bad4620fd7707d/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "f59b4788f6e6fcfd0b749162f523cfe1fafbffbf",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f59b4788f6e6fcfd0b749162f523cfe1fafbffbf",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/f59b4788f6e6fcfd0b749162f523cfe1fafbffbf"
            },
            {
              "sha": "3722eb418ed8869a08f6975643ebbce2d993376a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/3722eb418ed8869a08f6975643ebbce2d993376a",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/3722eb418ed8869a08f6975643ebbce2d993376a"
            }
          ]
        },
        {
          "sha": "ba8da5e849224483f40b0799135376845ca85633",
          "node_id": "C_kwDOBDs4CNoAKGJhOGRhNWU4NDkyMjQ0ODNmNDBiMDc5OTEzNTM3Njg0NWNhODU2MzM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "message": "Merge branch 'fix/ps2cnf-boot2-without-equals' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "f13f0e83e3429db41c80d403031e9eee4cb6067e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/f13f0e83e3429db41c80d403031e9eee4cb6067e"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/ba8da5e849224483f40b0799135376845ca85633",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ba8da5e849224483f40b0799135376845ca85633",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/ba8da5e849224483f40b0799135376845ca85633",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ba8da5e849224483f40b0799135376845ca85633/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "69abebf3a7bd9b150db60933d4bad4620fd7707d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/69abebf3a7bd9b150db60933d4bad4620fd7707d",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/69abebf3a7bd9b150db60933d4bad4620fd7707d"
            },
            {
              "sha": "43781768fc9d4dbf58628757cdb189209fd38596",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/43781768fc9d4dbf58628757cdb189209fd38596",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/43781768fc9d4dbf58628757cdb189209fd38596"
            }
          ]
        },
        {
          "sha": "d84091c55609d22905ed691922096aaefc077b8a",
          "node_id": "C_kwDOBDs4CNoAKGQ4NDA5MWM1NTYwOWQyMjkwNWVkNjkxOTIyMDk2YWFlZmMwNzdiOGE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:41Z"
            },
            "message": "Merge branch 'fix/ulcfg-partial-record' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "3652b182aa966cb3535fe395cdce65cda2686671",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/3652b182aa966cb3535fe395cdce65cda2686671"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/d84091c55609d22905ed691922096aaefc077b8a",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d84091c55609d22905ed691922096aaefc077b8a",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d84091c55609d22905ed691922096aaefc077b8a",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d84091c55609d22905ed691922096aaefc077b8a/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "ba8da5e849224483f40b0799135376845ca85633",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ba8da5e849224483f40b0799135376845ca85633",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/ba8da5e849224483f40b0799135376845ca85633"
            },
            {
              "sha": "2a57ca88b03e207dce2c50edbf205c9a621b9d2e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/2a57ca88b03e207dce2c50edbf205c9a621b9d2e",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/2a57ca88b03e207dce2c50edbf205c9a621b9d2e"
            }
          ]
        },
        {
          "sha": "4a722e07aaddafc7b70ebbeb1b6a69e15f00659f",
          "node_id": "C_kwDOBDs4CNoAKDRhNzIyZTA3YWFkZGFmYzdiNzBlYmJlYjFiNmE2OWUxNWYwMDY1OWY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:42Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:42Z"
            },
            "message": "Merge branch 'fix/usba-crc32-unsigned' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "3c8ee70c7eaca63ea261c550a06f468057232fd8",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/3c8ee70c7eaca63ea261c550a06f468057232fd8"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/4a722e07aaddafc7b70ebbeb1b6a69e15f00659f",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4a722e07aaddafc7b70ebbeb1b6a69e15f00659f",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4a722e07aaddafc7b70ebbeb1b6a69e15f00659f",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4a722e07aaddafc7b70ebbeb1b6a69e15f00659f/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "d84091c55609d22905ed691922096aaefc077b8a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d84091c55609d22905ed691922096aaefc077b8a",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d84091c55609d22905ed691922096aaefc077b8a"
            },
            {
              "sha": "da9af708e61ad928e9f80e7c50581ec4936dab9d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/da9af708e61ad928e9f80e7c50581ec4936dab9d",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/da9af708e61ad928e9f80e7c50581ec4936dab9d"
            }
          ]
        },
        {
          "sha": "cd7369496221f0ed1e1ecf62043629f707d99c60",
          "node_id": "C_kwDOBDs4CNoAKGNkNzM2OTQ5NjIyMWYwZWQxZTFlY2Y2MjA0MzYyOWY3MDdkOTljNjA",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:42Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:39:42Z"
            },
            "message": "Merge branch 'fix/zso-align' into yaoplm/all-fixes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "849bd757b75e2d4fd19a1186493f3daf1009c920",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/849bd757b75e2d4fd19a1186493f3daf1009c920"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/cd7369496221f0ed1e1ecf62043629f707d99c60",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/cd7369496221f0ed1e1ecf62043629f707d99c60",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/cd7369496221f0ed1e1ecf62043629f707d99c60",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/cd7369496221f0ed1e1ecf62043629f707d99c60/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "4a722e07aaddafc7b70ebbeb1b6a69e15f00659f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4a722e07aaddafc7b70ebbeb1b6a69e15f00659f",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4a722e07aaddafc7b70ebbeb1b6a69e15f00659f"
            },
            {
              "sha": "0253f98bc62bdf08473f6f63f8c19b5d009fa23f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0253f98bc62bdf08473f6f63f8c19b5d009fa23f",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0253f98bc62bdf08473f6f63f8c19b5d009fa23f"
            }
          ]
        },
        {
          "sha": "543954e68cc93d530b671695e90ea2dc122ee9c8",
          "node_id": "C_kwDOBDs4CNoAKDU0Mzk1NGU2OGNjOTNkNTMwYjY3MTY5NWU5MGVhMmRjMTIyZWU5Yzg",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:45:40Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:45:40Z"
            },
            "message": "labs: host reproductions for the parser fixes\n\nHost programs that run OPL's parsing functions (cheat files, ISO 9660\ndirectory records, ZSO headers, SYSTEM.CNF, ul.cfg, games.bin,\nUSBA_crc32) on malformed input under MSVC and AddressSanitizer. The\nfunctions are copied out of the checked-out tree at build time, so the\nsame run shows the bugs on master and their absence on the fix\nbranches.\n\nThis branch is for the fork only and is not meant for upstream.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "ae045afdaee3c30d99da6e5b9a7e9290b2e439eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/ae045afdaee3c30d99da6e5b9a7e9290b2e439eb"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/543954e68cc93d530b671695e90ea2dc122ee9c8",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/543954e68cc93d530b671695e90ea2dc122ee9c8",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/543954e68cc93d530b671695e90ea2dc122ee9c8",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/543954e68cc93d530b671695e90ea2dc122ee9c8/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb"
            }
          ]
        },
        {
          "sha": "ad117ce73c19bad01e7485694292d93b79b28968",
          "node_id": "C_kwDOBDs4CNoAKGFkMTE3Y2U3M2MxOWJhZDAxZTc0ODU2OTQyOTJkOTNiNzliMjg5Njg",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:52:13Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:52:13Z"
            },
            "message": "labs: console test files for the parser fixes\n\nmake_console_kit.py builds, from one bootable ISO, the malformed cases\nfor a real PS2: directory records with an empty name, an extended\nattribute byte and a 33-character name; BOOT2 without '='; ZSO with\nalign 0 and 12; a ragged ul.cfg; ul games with ASCII and Cyrillic\ntitles; and three .cht files. iso_harness can now scan such an image\nfile directly.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "ffca9443bcc99961f28d2aba5c4d21497608abc5",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/ffca9443bcc99961f28d2aba5c4d21497608abc5"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/ad117ce73c19bad01e7485694292d93b79b28968",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ad117ce73c19bad01e7485694292d93b79b28968",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/ad117ce73c19bad01e7485694292d93b79b28968",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ad117ce73c19bad01e7485694292d93b79b28968/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "543954e68cc93d530b671695e90ea2dc122ee9c8",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/543954e68cc93d530b671695e90ea2dc122ee9c8",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/543954e68cc93d530b671695e90ea2dc122ee9c8"
            }
          ]
        },
        {
          "sha": "e66aa48562c8ab311b01f0c97f4981a987bdfe05",
          "node_id": "C_kwDOBDs4CNoAKGU2NmFhNDg1NjJjOGFiMzExYjAxZjBjOTdmNDk4MWE5ODdiZGZlMDU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:59:17Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T16:59:17Z"
            },
            "message": "Merge branch 'yaoplm/host-repro'\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "7ba2f7a3bdfa9840b220b8fed32f253c446b25e5",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/7ba2f7a3bdfa9840b220b8fed32f253c446b25e5"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/e66aa48562c8ab311b01f0c97f4981a987bdfe05",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e66aa48562c8ab311b01f0c97f4981a987bdfe05",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e66aa48562c8ab311b01f0c97f4981a987bdfe05",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e66aa48562c8ab311b01f0c97f4981a987bdfe05/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "cd7369496221f0ed1e1ecf62043629f707d99c60",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/cd7369496221f0ed1e1ecf62043629f707d99c60",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/cd7369496221f0ed1e1ecf62043629f707d99c60"
            },
            {
              "sha": "ad117ce73c19bad01e7485694292d93b79b28968",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ad117ce73c19bad01e7485694292d93b79b28968",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/ad117ce73c19bad01e7485694292d93b79b28968"
            }
          ]
        },
        {
          "sha": "d38b20d679f9a659a020de3c94fc7404da3652a1",
          "node_id": "C_kwDOBDs4CNoAKGQzOGIyMGQ2NzlmOWE2NTlhMDIwZGUzYzk0ZmM3NDA0ZGEzNjUyYTE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:00:51Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:00:51Z"
            },
            "message": "ci: publish this fork's builds as a rolling pre-release\n\nEvery push to master now replaces the \"latest\" pre-release of this\nfork with the new ELF, the 7z packages and a SHA256SUMS file. The tag\nstays \"latest\" because the Makefile already ignores that tag when it\nbuilds the version string. Upstream's own release steps keep running\nonly in ps2homebrew/Open-PS2-Loader.\n\nBuilds get the version suffix \"yaoplm\" (LOCALVERSION), so they are not\nmistaken for official OPL builds.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "515f49dce83840643a811114767d95bbfaaff1ae",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/515f49dce83840643a811114767d95bbfaaff1ae"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/d38b20d679f9a659a020de3c94fc7404da3652a1",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d38b20d679f9a659a020de3c94fc7404da3652a1",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d38b20d679f9a659a020de3c94fc7404da3652a1",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d38b20d679f9a659a020de3c94fc7404da3652a1/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "e66aa48562c8ab311b01f0c97f4981a987bdfe05",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e66aa48562c8ab311b01f0c97f4981a987bdfe05",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e66aa48562c8ab311b01f0c97f4981a987bdfe05"
            }
          ]
        },
        {
          "sha": "d4fb44f50849f11ada8c9d5c7580e774d8847461",
          "node_id": "C_kwDOBDs4CNoAKGQ0ZmI0NGY1MDg0OWYxMWFkYThjOWQ1Yzc1ODBlNzc0ZDg4NDc0NjE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:04:31Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:04:31Z"
            },
            "message": "labs: game ID pass over image files in run_all.ps1\n\ngameid_harness follows the game list's path from an image to a game\nID: SYSTEM.CNF;1 through isofs cdvdman_locatefile(), then\nGetStartupExecName() and ps2cnfGetBootFile(). run_all.ps1 -Images <dir>\nruns it over every .iso in a folder, e.g. YAOPLM's ISO fixtures, to\ncheck that a change keeps the IDs of well-formed images.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "28e6fd6a8ace6a5af2ad6dca4ab53b565220952d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/28e6fd6a8ace6a5af2ad6dca4ab53b565220952d"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/d4fb44f50849f11ada8c9d5c7580e774d8847461",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d4fb44f50849f11ada8c9d5c7580e774d8847461",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d4fb44f50849f11ada8c9d5c7580e774d8847461",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d4fb44f50849f11ada8c9d5c7580e774d8847461/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "d38b20d679f9a659a020de3c94fc7404da3652a1",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d38b20d679f9a659a020de3c94fc7404da3652a1",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d38b20d679f9a659a020de3c94fc7404da3652a1"
            }
          ]
        },
        {
          "sha": "24d2408a560f3f057baa918b8973172a3a1dc08e",
          "node_id": "C_kwDOBDs4CNoAKDI0ZDI0MDhhNTYwZjNmMDU3YmFhOTE4Yjg5NzMxNzJhM2ExZGMwOGU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:04:58Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:04:58Z"
            },
            "message": "docs: describe this fork, its fixes and how to sync upstream\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "6d7d695652a77cae3052f3546bb13f46030aac6d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/6d7d695652a77cae3052f3546bb13f46030aac6d"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/24d2408a560f3f057baa918b8973172a3a1dc08e",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/24d2408a560f3f057baa918b8973172a3a1dc08e",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/24d2408a560f3f057baa918b8973172a3a1dc08e",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/24d2408a560f3f057baa918b8973172a3a1dc08e/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "d4fb44f50849f11ada8c9d5c7580e774d8847461",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d4fb44f50849f11ada8c9d5c7580e774d8847461",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d4fb44f50849f11ada8c9d5c7580e774d8847461"
            }
          ]
        },
        {
          "sha": "c58cac5e85aa23ff8bf315ac51828f8ad9623e98",
          "node_id": "C_kwDOBDs4CNoAKGM1OGNhYzVlODVhYTIzZmY4YmYzMTVhYzUxODI4ZjhhZDk2MjNlOTg",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:13:29Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:13:29Z"
            },
            "message": "docs: master is the only long-lived branch of this fork\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "f125254d95a94dbbcfb1c60d8b27d46d7f821309",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/f125254d95a94dbbcfb1c60d8b27d46d7f821309"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/c58cac5e85aa23ff8bf315ac51828f8ad9623e98",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c58cac5e85aa23ff8bf315ac51828f8ad9623e98",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/c58cac5e85aa23ff8bf315ac51828f8ad9623e98",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c58cac5e85aa23ff8bf315ac51828f8ad9623e98/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "24d2408a560f3f057baa918b8973172a3a1dc08e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/24d2408a560f3f057baa918b8973172a3a1dc08e",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/24d2408a560f3f057baa918b8973172a3a1dc08e"
            }
          ]
        },
        {
          "sha": "f849239b42e7cd8374c8996767d6947b6f11573c",
          "node_id": "C_kwDOBDs4CNoAKGY4NDkyMzliNDJlN2NkODM3NGM4OTk2NzY3ZDY5NDdiNmYxMTU3M2M",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:19:23Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:19:23Z"
            },
            "message": "Name this fork YAOPL, Yet Another Open PS2 Loader\n\nThe README now opens with what YAOPL is: a fork that continues OPL's\ndevelopment, where builds come from and how they differ from official\nOPL. Upstream's documentation follows unchanged. Build versions end in\n\"-yaopl\" instead of \"-yaoplm\", and the release notes say YAOPL.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "f9729a759efeb32f9f708ecfb985a60d68631b70",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/f9729a759efeb32f9f708ecfb985a60d68631b70"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/f849239b42e7cd8374c8996767d6947b6f11573c",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f849239b42e7cd8374c8996767d6947b6f11573c",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/f849239b42e7cd8374c8996767d6947b6f11573c",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f849239b42e7cd8374c8996767d6947b6f11573c/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "c58cac5e85aa23ff8bf315ac51828f8ad9623e98",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c58cac5e85aa23ff8bf315ac51828f8ad9623e98",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/c58cac5e85aa23ff8bf315ac51828f8ad9623e98"
            }
          ]
        },
        {
          "sha": "4dcf6d94a92e016579a50175d42fb143f8732bbe",
          "node_id": "C_kwDOBDs4CNoAKDRkY2Y2ZDk0YTkyZTAxNjU3OWE1MDE3NWQ0MmZiMTQzZjg3MzJiYmU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:21:20Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:21:20Z"
            },
            "message": "docs: point README links at the renamed repository\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "f2a7a23cb1528b5842115f40f14bbf1a2a19d528",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/f2a7a23cb1528b5842115f40f14bbf1a2a19d528"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/4dcf6d94a92e016579a50175d42fb143f8732bbe",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4dcf6d94a92e016579a50175d42fb143f8732bbe",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4dcf6d94a92e016579a50175d42fb143f8732bbe",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4dcf6d94a92e016579a50175d42fb143f8732bbe/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "f849239b42e7cd8374c8996767d6947b6f11573c",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/f849239b42e7cd8374c8996767d6947b6f11573c",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/f849239b42e7cd8374c8996767d6947b6f11573c"
            }
          ]
        },
        {
          "sha": "cc7905ee253362395f501b332a6765b07651de9b",
          "node_id": "C_kwDOBDs4CNoAKGNjNzkwNWVlMjUzMzYyMzk1ZjUwMWIzMzJhNjc2NWIwNzY1MWRlOWI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:27:00Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:27:00Z"
            },
            "message": "ci: publish only the build of master's current tip\n\nDuring a GitHub Actions slowdown, push runs for older master commits\nstarted long after newer ones, and any of them could have replaced the\npre-release with an older build. The publish step now checks that its\ncommit is still the tip of master, and release jobs of one ref run one\nat a time.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "42890adb4ca8df82b3be32737b924f07998aac66",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/42890adb4ca8df82b3be32737b924f07998aac66"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/cc7905ee253362395f501b332a6765b07651de9b",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/cc7905ee253362395f501b332a6765b07651de9b",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/cc7905ee253362395f501b332a6765b07651de9b",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/cc7905ee253362395f501b332a6765b07651de9b/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "4dcf6d94a92e016579a50175d42fb143f8732bbe",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4dcf6d94a92e016579a50175d42fb143f8732bbe",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4dcf6d94a92e016579a50175d42fb143f8732bbe"
            }
          ]
        },
        {
          "sha": "5192529dec9bce7ed9c8759b70b7892b6f331a89",
          "node_id": "C_kwDOBDs4CNoAKDUxOTI1MjlkZWM5YmNlN2VkOWM4NzU5YjcwYjc4OTJiNmYzMzFhODk",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:33:31Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:33:31Z"
            },
            "message": "util: do not shift from a NULL pointer after a comment at the end\n\nreadFileBuffer() skips '#' comment lines. When such a line is the last\none in the buffer and has no LF, it set lastPtr to NULL but left\nlineSize at the comment's length. The next pass then ran\nmemmove(buffer, NULL, lineSize). Any CFG, theme or language file whose\nlast line is a comment without a newline, such as \"a=1\\r\\n#end\",\ncrashes OPL while it is read (conf_opl.cfg is read at boot).\n\nReset lineSize with lastPtr, so the next pass reaches EOF (or reads on\nwhen the buffer was full).\n\nRiptOPL has the same bug; the review of its config fixes found it.\n\nReproduction: labs/host-repro run_all.ps1 -Only cfg, \"readFileBuffer\n'#' last line, no LF\". Before: access violation (AddressSanitizer) or\nan endless loop. After: one line, \"a=1\".\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "274e027067fdfa2660a44ee48d903fc58f83363a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/274e027067fdfa2660a44ee48d903fc58f83363a"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/5192529dec9bce7ed9c8759b70b7892b6f331a89",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/5192529dec9bce7ed9c8759b70b7892b6f331a89",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/5192529dec9bce7ed9c8759b70b7892b6f331a89",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/5192529dec9bce7ed9c8759b70b7892b6f331a89/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "cc7905ee253362395f501b332a6765b07651de9b",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/cc7905ee253362395f501b332a6765b07651de9b",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/cc7905ee253362395f501b332a6765b07651de9b"
            }
          ]
        },
        {
          "sha": "8dfdd548825a10f3542f2cce275bef21ee2a0ae1",
          "node_id": "C_kwDOBDs4CNoAKDhkZmRkNTQ4ODI1YTEwZjM1NDJmMmNjZTI3NWJlZjIxZWUyYTBhZTE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:33:46Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:33:46Z"
            },
            "message": "util: treat a read error in readFileBuffer() as the end of the file\n\nWhen read() failed (a USB stick removed or an SMB share dropped while a\nCFG or language file was read), readFileBuffer() used the negative\nresult as a length: it wrote the terminator before the heap buffer and\nwent on with negative sizes.\n\nThe same change is in RiptOPL (NathanNeurotic/Open-PS2-Loader@d5851fa5).\n\nReproduction: labs/host-repro run_all.ps1 -Only cfg, \"readFileBuffer\nread() fails\" (read() stubbed to return -1). Before: AddressSanitizer\nreports a heap-buffer-overflow, and a plain build returns a garbage\nline. After: no lines.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "c38fc76e1748a70ea2a49448b7b69859ff8cb568",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/c38fc76e1748a70ea2a49448b7b69859ff8cb568"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/8dfdd548825a10f3542f2cce275bef21ee2a0ae1",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/8dfdd548825a10f3542f2cce275bef21ee2a0ae1",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/8dfdd548825a10f3542f2cce275bef21ee2a0ae1",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/8dfdd548825a10f3542f2cce275bef21ee2a0ae1/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "5192529dec9bce7ed9c8759b70b7892b6f331a89",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/5192529dec9bce7ed9c8759b70b7892b6f331a89",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/5192529dec9bce7ed9c8759b70b7892b6f331a89"
            }
          ]
        },
        {
          "sha": "51b45e09693e5ca5ebc04049ea643b1048358cd6",
          "node_id": "C_kwDOBDs4CNoAKDUxYjQ1ZTA5NjkzZTVjYTVlYmMwNDA0OWVhNjQzYjEwNDgzNThjZDY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:34:11Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:34:11Z"
            },
            "message": "config: read at most three colour bytes in strToColor()\n\nstrToColor() stored every pair of hex digits after '#' into color[n]\nwith no limit on n, but callers pass three bytes (theme colours,\ngDefault*Color). A theme colour with an alpha byte, \"#RRGGBBAA\", or any\nlonger value wrote past the array onto the stack or the next field.\n\nStop after three bytes. The same check is in RiptOPL\n(NathanNeurotic/Open-PS2-Loader@d5851fa5).\n\nReproduction: labs/host-repro run_all.ps1 -Only cfg, \"strToColor\n#11223344556677\" (color[3] followed by a canary). Before: the canary\nholds 44 55 66 77. After: the canary is untouched, colour 11 22 33.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "8014be522fb03cedf9be86d248dcdd6edd6c7c13",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/8014be522fb03cedf9be86d248dcdd6edd6c7c13"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/51b45e09693e5ca5ebc04049ea643b1048358cd6",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/51b45e09693e5ca5ebc04049ea643b1048358cd6",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/51b45e09693e5ca5ebc04049ea643b1048358cd6",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/51b45e09693e5ca5ebc04049ea643b1048358cd6/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "8dfdd548825a10f3542f2cce275bef21ee2a0ae1",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/8dfdd548825a10f3542f2cce275bef21ee2a0ae1",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/8dfdd548825a10f3542f2cce275bef21ee2a0ae1"
            }
          ]
        },
        {
          "sha": "38ae4e6943893686f59889419deaaaf819f54912",
          "node_id": "C_kwDOBDs4CNoAKDM4YWU0ZTY5NDM4OTM2ODZmNTk4ODk0MTlkZWFhYWY4MTlmNTQ5MTI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:34:42Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:34:42Z"
            },
            "message": "config: terminate keys and values cut by splitAssignment()\n\nsplitAssignment() copied at most keymax (32) key bytes and valmax (256)\nvalue bytes with strncpy() and no terminator. A key of 32 characters or\nmore, such as a long application title in conf_apps.cfg, or a value of\n256 or more stayed unterminated, and the strlen(), strchr() and \"%s\"\nthat follow read past the buffer into the stack.\n\nKeep 31 key bytes and 255 value bytes and terminate both. The same\nchange is in RiptOPL (NathanNeurotic/Open-PS2-Loader@d5851fa5).\n\nReproduction: labs/host-repro run_all.ps1 -Only cfg, \"splitAssignment\n40-char key\". Before: key length 37 (the key runs into the value).\nAfter: 31.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "fe5a3e29ec283d7620424754aa0472c2290e17d3",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/fe5a3e29ec283d7620424754aa0472c2290e17d3"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/38ae4e6943893686f59889419deaaaf819f54912",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/38ae4e6943893686f59889419deaaaf819f54912",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/38ae4e6943893686f59889419deaaaf819f54912",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/38ae4e6943893686f59889419deaaaf819f54912/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "51b45e09693e5ca5ebc04049ea643b1048358cd6",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/51b45e09693e5ca5ebc04049ea643b1048358cd6",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/51b45e09693e5ca5ebc04049ea643b1048358cd6"
            }
          ]
        },
        {
          "sha": "4adde8b532bcd7fb3c3e591098a22e5070bb0148",
          "node_id": "C_kwDOBDs4CNoAKDRhZGRlOGI1MzJiY2Q3ZmIzYzNlNTkxMDk4YTIyZTUwNzBiYjAxNDg",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:35:42Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:35:42Z"
            },
            "message": "config: bound the prefix copied by parsePrefix()\n\nconfigReadFileBuffer() treats a line without '=' but with ':' as a key\nprefix and parsePrefix() copied everything before the ':' into the\n32-byte prefix buffer on the stack. A long line without '=' whose\nfirst ':' comes after column 31 (a hand-edited or damaged CFG, theme\nor conf_apps.cfg) overflowed it.\n\nPass the buffer size and cut the prefix to fit. RiptOPL does the same\n(NathanNeurotic/Open-PS2-Loader@d5851fa5).\n\nReproduction: labs/host-repro run_all.ps1 -Only cfg, \"parsePrefix\n60-char prefix\" (prefix[32] followed by a canary). Before: 60 bytes\ncopied, canary overwritten. After: 31 bytes, canary intact.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "76675033635fb405e47d0fae1a78a4eb26ea77e9",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/76675033635fb405e47d0fae1a78a4eb26ea77e9"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/4adde8b532bcd7fb3c3e591098a22e5070bb0148",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4adde8b532bcd7fb3c3e591098a22e5070bb0148",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4adde8b532bcd7fb3c3e591098a22e5070bb0148",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4adde8b532bcd7fb3c3e591098a22e5070bb0148/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "38ae4e6943893686f59889419deaaaf819f54912",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/38ae4e6943893686f59889419deaaaf819f54912",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/38ae4e6943893686f59889419deaaaf819f54912"
            }
          ]
        },
        {
          "sha": "e8da9c86ae31d324e5cb0ef2162bedb6e1930064",
          "node_id": "C_kwDOBDs4CNoAKGU4ZGE5Yzg2YWUzMWQzMjRlNWNiMGVmMjE2MmJlZGI2ZTE5MzAwNjQ",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:36:25Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:36:25Z"
            },
            "message": "config: bound and terminate the legacy IPCONFIG.DAT read\n\nWhen conf_network.cfg is missing, configReadLegacyIP() reads\nIPCONFIG.DAT whole into a 256-byte stack buffer and hands it to\nsscanf() without a terminator. A file of 256 bytes or more overflowed\nthe buffer, and any file was parsed up to whatever followed it.\n\nRead at most 255 bytes and terminate them. RiptOPL clamps the same\nway (NathanNeurotic/Open-PS2-Loader@d5851fa5).\n\nReproduction: labs/host-repro run_all.ps1 -Only cfg,\n\"configReadLegacyIP 300 bytes\" (three addresses padded to 300 bytes).\nBefore: AddressSanitizer reports a stack-buffer-overflow. After: the\nsame three addresses are read, no report.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "b376d68bcb70e0b6907e70c49c09626e8ec563b8",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/b376d68bcb70e0b6907e70c49c09626e8ec563b8"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/e8da9c86ae31d324e5cb0ef2162bedb6e1930064",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e8da9c86ae31d324e5cb0ef2162bedb6e1930064",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e8da9c86ae31d324e5cb0ef2162bedb6e1930064",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e8da9c86ae31d324e5cb0ef2162bedb6e1930064/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "4adde8b532bcd7fb3c3e591098a22e5070bb0148",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4adde8b532bcd7fb3c3e591098a22e5070bb0148",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4adde8b532bcd7fb3c3e591098a22e5070bb0148"
            }
          ]
        },
        {
          "sha": "9c5ed16ca93c6268627e2241abaa17e6a4f604a9",
          "node_id": "C_kwDOBDs4CNoAKDljNWVkMTZjYTkzYzYyNjg2MjdlMjI0MWFiYWExN2U2YTRmNjA0YTk",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:37:06Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:37:06Z"
            },
            "message": "util: read 48 HDD sectors, not 49, for the PS2 logo check\n\nCheckPS2Logo() reads the 12 disc sectors of the logo as 512-byte HDD\nsectors with \"k <= 12 * 4\", which is 49 reads: 25,088 bytes into the\n24,576-byte logo buffer on the stack. It runs on every HDD game launch\nwith the \"PS2 Logo\" option on.\n\nThe same fix is in RiptOPL (NathanNeurotic/Open-PS2-Loader@d5851fa5).\n\nReproduction: labs/host-repro run_all.ps1 -Only cfg, \"CheckPS2Logo\nHDD\" (hddReadSectors() stubbed). Before: 49 sectors, AddressSanitizer\nreports a stack-buffer-overflow and a plain build crashes. After: 48.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "65af2581c2ea560ac179833a36213fce1673013c",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/65af2581c2ea560ac179833a36213fce1673013c"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/9c5ed16ca93c6268627e2241abaa17e6a4f604a9",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9c5ed16ca93c6268627e2241abaa17e6a4f604a9",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/9c5ed16ca93c6268627e2241abaa17e6a4f604a9",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9c5ed16ca93c6268627e2241abaa17e6a4f604a9/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "e8da9c86ae31d324e5cb0ef2162bedb6e1930064",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e8da9c86ae31d324e5cb0ef2162bedb6e1930064",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e8da9c86ae31d324e5cb0ef2162bedb6e1930064"
            }
          ]
        },
        {
          "sha": "e5f85788a71e3512b72cf394ddcdf9750a3e7092",
          "node_id": "C_kwDOBDs4CNoAKGU1Zjg1Nzg4YTcxZTM1MTJiNzJjZjM5NGRkY2RmOTc1MGEzZTcwOTI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:37:12Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:37:12Z"
            },
            "message": "labs: host checks for the config and text-file helpers\n\ncfg_harness runs readFileBuffer(), strToColor(), splitAssignment(),\nparsePrefix(), configReadLegacyIP() and CheckPS2Logo() from the OPL\ntree on the inputs that broke them. run_all.ps1 -Only <groups> runs a\nsubset.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "a1d10b2c9ecf17211c939e04ad2a0209048b7880",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/a1d10b2c9ecf17211c939e04ad2a0209048b7880"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/e5f85788a71e3512b72cf394ddcdf9750a3e7092",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e5f85788a71e3512b72cf394ddcdf9750a3e7092",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e5f85788a71e3512b72cf394ddcdf9750a3e7092",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e5f85788a71e3512b72cf394ddcdf9750a3e7092/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "9c5ed16ca93c6268627e2241abaa17e6a4f604a9",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9c5ed16ca93c6268627e2241abaa17e6a4f604a9",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/9c5ed16ca93c6268627e2241abaa17e6a4f604a9"
            }
          ]
        },
        {
          "sha": "bc35dcc82404e4c75b617827c77c6d4434db2b72",
          "node_id": "C_kwDOBDs4CNoAKGJjMzVkY2M4MjQwNGU0Yzc1YjYxNzgyN2M3N2M2ZDQ0MzRkYjJiNzI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:39:39Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:39:39Z"
            },
            "message": "vmc: never replace an existing VMC without asking\n\nsysCheckVMC() deleted an existing card whenever it was asked to create\none of a different size, and the VMC menu asks exactly that when it is\nclosed: guiGameShowVMCConfig(..., validate = 1) maps any size other\nthan 8/16/32/64 MB to \"8 MB\" and requests an 8 MB card. A 4 MB or\n128 MB card, or a PCSX2 card with ECC (8,650,752 bytes), was replaced by\nan empty 8 MB card, with its saves, as soon as the user left the menu.\n\"Modify\" also recreated a card empty without a confirmation.\n\n- sysCheckVMC() creates a card only when none exists.\n- Closing the VMC menu leaves an existing card alone.\n- Modify asks for the delete confirmation before it deletes the card\n  and creates the new one; \"No\" returns to the dialog.\n\nRiptOPL fixed the same deletion (NathanNeurotic/Open-PS2-Loader@a809e8b3,\nwith the dialog loop fixed in 120f66f6); this is a smaller version of it\nthat keeps sysCheckVMC()'s return values.\n\nReproduction: labs/host-repro run_all.ps1 -Only vmc. Before: a 4 MiB\ncard and an 8,650,752-byte card are deleted and an 8 MB card is\nrequested. After: both are kept and nothing is created. A missing card\nis still created; an explicit delete still deletes.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "b48aea9a5d42d01c4e668c997b08417bb5e6fc08",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/b48aea9a5d42d01c4e668c997b08417bb5e6fc08"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/bc35dcc82404e4c75b617827c77c6d4434db2b72",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/bc35dcc82404e4c75b617827c77c6d4434db2b72",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/bc35dcc82404e4c75b617827c77c6d4434db2b72",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/bc35dcc82404e4c75b617827c77c6d4434db2b72/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "e5f85788a71e3512b72cf394ddcdf9750a3e7092",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e5f85788a71e3512b72cf394ddcdf9750a3e7092",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e5f85788a71e3512b72cf394ddcdf9750a3e7092"
            }
          ]
        },
        {
          "sha": "c1dd09433cdbdf8ca4a1f6cc457b4de9230d5fc3",
          "node_id": "C_kwDOBDs4CNoAKGMxZGQwOTQzM2NkYmRmOGNhNGExZjZjYzQ1N2I0ZGU5MjMwZDVmYzM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:39:40Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:39:40Z"
            },
            "message": "labs: host check for sysCheckVMC() on existing cards\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "5fbd13a423e1602526402a61239656fa9806fd79",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/5fbd13a423e1602526402a61239656fa9806fd79"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/c1dd09433cdbdf8ca4a1f6cc457b4de9230d5fc3",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c1dd09433cdbdf8ca4a1f6cc457b4de9230d5fc3",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/c1dd09433cdbdf8ca4a1f6cc457b4de9230d5fc3",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c1dd09433cdbdf8ca4a1f6cc457b4de9230d5fc3/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "bc35dcc82404e4c75b617827c77c6d4434db2b72",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/bc35dcc82404e4c75b617827c77c6d4434db2b72",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/bc35dcc82404e4c75b617827c77c6d4434db2b72"
            }
          ]
        },
        {
          "sha": "fd642dc6e9e9a904b2d60fdb91848f1d1a715311",
          "node_id": "C_kwDOBDs4CNoAKGZkNjQyZGM2ZTllOWE5MDRiMmQ2MGZkYjkxODQ4ZjFkMWE3MTUzMTE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:40:46Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:40:46Z"
            },
            "message": "cheatconfig: keep the picks of cheats that share a name\n\nRemembered cheat picks are stored by name ($CheatSelNNN). On load,\neach saved name enabled the first cheat with that name, so two picked\ncheats with the same name (common in .cht files with per-character\nsections, e.g. two \"Infinite Health\") came back as one: the second was\nalways off after a reload.\n\nEnable the first matching cheat that is not enabled yet. RiptOPL adds\nthe same condition (NathanNeurotic/Open-PS2-Loader@fa022a5f).\n\nReproduction: labs/host-repro run_all.ps1 -Only cheatsel, \"cheat\npicks, duplicate names\" (both \"Infinite Health\" picked, saved,\nreloaded). Before: [1]=1 [2]=0. After: [1]=1 [2]=1. Distinct names\nload as before.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "7014aab0e148562e7cfe30b56eaca2836a31dc28",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/7014aab0e148562e7cfe30b56eaca2836a31dc28"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/fd642dc6e9e9a904b2d60fdb91848f1d1a715311",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/fd642dc6e9e9a904b2d60fdb91848f1d1a715311",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/fd642dc6e9e9a904b2d60fdb91848f1d1a715311",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/fd642dc6e9e9a904b2d60fdb91848f1d1a715311/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "c1dd09433cdbdf8ca4a1f6cc457b4de9230d5fc3",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/c1dd09433cdbdf8ca4a1f6cc457b4de9230d5fc3",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/c1dd09433cdbdf8ca4a1f6cc457b4de9230d5fc3"
            }
          ]
        },
        {
          "sha": "d8d5e400fb821adcdc1fd336d5781fe22edb44e9",
          "node_id": "C_kwDOBDs4CNoAKGQ4ZDVlNDAwZmI4MjFhZGNkYzFmZDMzNmQ1NzgxZmUyMmVkYjQ0ZTk",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:40:46Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:40:46Z"
            },
            "message": "labs: host check for remembered cheat picks\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "6e0ad7992504dc82e21e715be452475b8e480a59",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/6e0ad7992504dc82e21e715be452475b8e480a59"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/d8d5e400fb821adcdc1fd336d5781fe22edb44e9",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d8d5e400fb821adcdc1fd336d5781fe22edb44e9",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d8d5e400fb821adcdc1fd336d5781fe22edb44e9",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d8d5e400fb821adcdc1fd336d5781fe22edb44e9/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "fd642dc6e9e9a904b2d60fdb91848f1d1a715311",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/fd642dc6e9e9a904b2d60fdb91848f1d1a715311",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/fd642dc6e9e9a904b2d60fdb91848f1d1a715311"
            }
          ]
        },
        {
          "sha": "86ca55ac4d64d828c96765aa03ea1dfe74a38e56",
          "node_id": "C_kwDOBDs4CNoAKDg2Y2E1NWFjNGQ2NGQ4MjhjOTY3NjVhYTAzZWExZGZlNzRhMzhlNTY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:43:24Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:43:24Z"
            },
            "message": "config: report a failed settings save instead of \"Settings saved\"\n\nwriteFileBuffer() and closeFileBuffer() ignored the result of write(),\nand configWrite() always returned 1 and cleared the modified flag. When\na memory card was full or a device failed mid-write, the settings file\nwas left empty or cut short (it is opened with O_TRUNC) while OPL said\n\"Settings saved\".\n\nThe file buffer now records a failed or short write (and a failed close\nof a written file), closeFileBuffer() returns -1 for it, and\nconfigWrite() then returns 0 and keeps the set modified. saveConfig()\nalready reacts to 0: it tries the other devices and otherwise shows\n\"Error saving settings\".\n\nRiptOPL propagates these errors too (NathanNeurotic/Open-PS2-Loader@\nd5851fa5, 442d6b3c, 0a477788); its snapshot and restore of the old file\nis not taken, as RiptOPL itself had to back it out for memory cards.\n\nReproduction: labs/host-repro run_all.ps1 -Only cfgwrite (write()\nstubbed). Before: configWrite = 1 and modified = 0 with an empty or\nhalf-written file. After: configWrite = 0 and modified = 1. A working\nwrite is unchanged.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "e8e49835072afc79f9bf8b70d83fb66a12db326f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/e8e49835072afc79f9bf8b70d83fb66a12db326f"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/86ca55ac4d64d828c96765aa03ea1dfe74a38e56",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/86ca55ac4d64d828c96765aa03ea1dfe74a38e56",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/86ca55ac4d64d828c96765aa03ea1dfe74a38e56",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/86ca55ac4d64d828c96765aa03ea1dfe74a38e56/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "d8d5e400fb821adcdc1fd336d5781fe22edb44e9",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d8d5e400fb821adcdc1fd336d5781fe22edb44e9",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d8d5e400fb821adcdc1fd336d5781fe22edb44e9"
            }
          ]
        },
        {
          "sha": "dd212137f4b418401f02efd7cffed3a445ed77c1",
          "node_id": "C_kwDOBDs4CNoAKGRkMjEyMTM3ZjRiNDE4NDAxZjAyZWZkN2NmZmVkM2E0NDVlZDc3YzE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:43:25Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:43:25Z"
            },
            "message": "labs: host check for configWrite() on failed writes\n\nAlso accept \"-Only a,b\" as one argument, and keep cfg_harness's copy of\nfile_buffer_t in step with include/util.h.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "9395588f8135d2fa6389d98bfbae537bd6f6cd21",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/9395588f8135d2fa6389d98bfbae537bd6f6cd21"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/dd212137f4b418401f02efd7cffed3a445ed77c1",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/dd212137f4b418401f02efd7cffed3a445ed77c1",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/dd212137f4b418401f02efd7cffed3a445ed77c1",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/dd212137f4b418401f02efd7cffed3a445ed77c1/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "86ca55ac4d64d828c96765aa03ea1dfe74a38e56",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/86ca55ac4d64d828c96765aa03ea1dfe74a38e56",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/86ca55ac4d64d828c96765aa03ea1dfe74a38e56"
            }
          ]
        },
        {
          "sha": "65765cfe2496f1127acbc9a4d6b1b0ede7683d6c",
          "node_id": "C_kwDOBDs4CNoAKDY1NzY1Y2ZlMjQ5NmYxMTI3YWNiYzlhNGQ2YjFiMGVkZTc2ODNkNmM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:45:39Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:45:39Z"
            },
            "message": "vmc: find the mcemu slot words even after an aborted launch\n\nThe BDM, SMB and HDD launch code finds VMC slot N in the embedded mcemu\nimage by its marker word 0xC0DEFAC0 + N and overwrites it with the\nslot's settings. Nothing restores the marker, and a launch can still\nreturn to the menu afterwards (a declined VMC prompt, an invalid or too\nfragmented image). The next launch then:\n- did not find the marker, and scanned on with a word index bounded by\n  the image size in bytes, i.e. up to 4 times past the image, possibly\n  into the next mcemu image, where it found that image's marker and\n  wrote the slot there;\n- loaded mcemu with the slots of the aborted launch: the game ran\n  without its VMC, or with the previous game's VMC;\n- on HDD, also kept a slot that it does not use active, since HDD wrote\n  only the slots that have a VMC.\n\nsbMcemuSlotWord() looks each marker up once, while the image is still\npristine, within size / 4 words, and remembers it. HDD now writes both\nslots, inactive when unused.\n\nRiptOPL fixed this with a similar helper\n(NathanNeurotic/Open-PS2-Loader@afa0ab42).\n\nReproduction (console, BDM): game A with VMC slot 1 = \"A\" and slot 2 =\na name that does not exist; launch A and answer \"No\" at the slot 2\nerror. Then launch game B with VMC slot 1 = \"B\" and save in game.\nBefore: B saves to the physical card or to A.bin. After: B.bin changes.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "f57b284cdfa9af30ae1e8917a7ac2658f1fc3b08",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/f57b284cdfa9af30ae1e8917a7ac2658f1fc3b08"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/65765cfe2496f1127acbc9a4d6b1b0ede7683d6c",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/65765cfe2496f1127acbc9a4d6b1b0ede7683d6c",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/65765cfe2496f1127acbc9a4d6b1b0ede7683d6c",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/65765cfe2496f1127acbc9a4d6b1b0ede7683d6c/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "dd212137f4b418401f02efd7cffed3a445ed77c1",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/dd212137f4b418401f02efd7cffed3a445ed77c1",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/dd212137f4b418401f02efd7cffed3a445ed77c1"
            }
          ]
        },
        {
          "sha": "a5cbdb066654336519606a7c5ee8c0abf1c01313",
          "node_id": "C_kwDOBDs4CNoAKGE1Y2JkYjA2NjY1NDMzNjUxOTYwNmE3YzVlZThjMGFiZjFjMDEzMTM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:45:56Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:45:56Z"
            },
            "message": "bdm: count the fragments already used by earlier parts of a game\n\nbdmLaunchGame() collects the fragments of every part of a game into\none table of BDM_MAX_FRAGS (64) entries. For each part it passes the\nroom left, but checked the result against the whole table. ps2sdk's\nget_frag_list() (iop/fs/bdmfs_fatfs/src/fs_driver.c) writes only what\nfits and returns the file's full fragment count. A UL game of two parts\nwith 40 fragments each therefore passed with 80 fragments in a 64-entry\ntable: in game, CDVDMAN walked 16 entries past it and read wrong\nsectors. With a third part the room left went negative and the ioctl\ncould write up to 2 KB past the table.\n\nReject a part whose fragments do not fit in the room left, and an ioctl\nerror, with the existing \"too fragmented\" message.\n\nThe same check is in RiptOPL (NathanNeurotic/Open-PS2-Loader@95990313).\n\nReproduction (console): a 2-part UL game on FAT32 whose parts are\nfragmented so that each has at most 64 fragments and both together more\nthan 64. Before: the game hangs or shows garbage. After: OPL reports\nthe game as too fragmented.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "0d432258a7431545cd086abf0d5a2918a588cde6",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/0d432258a7431545cd086abf0d5a2918a588cde6"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/a5cbdb066654336519606a7c5ee8c0abf1c01313",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a5cbdb066654336519606a7c5ee8c0abf1c01313",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a5cbdb066654336519606a7c5ee8c0abf1c01313",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a5cbdb066654336519606a7c5ee8c0abf1c01313/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "65765cfe2496f1127acbc9a4d6b1b0ede7683d6c",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/65765cfe2496f1127acbc9a4d6b1b0ede7683d6c",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/65765cfe2496f1127acbc9a4d6b1b0ede7683d6c"
            }
          ]
        },
        {
          "sha": "1bf79385ead2405a6c29f26bff1578122d1ea543",
          "node_id": "C_kwDOBDs4CNoAKDFiZjc5Mzg1ZWFkMjQwNWE2YzI5ZjI2YmZmMTU3ODEyMmQxZWE1NDM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:46:07Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:46:07Z"
            },
            "message": "bdm: reset the VMC error for each slot\n\nbdmLaunchGame() set have_error only for a slot with a VMC name and\nnever cleared it, but checks it for both slots. When slot 1 had an\ninvalid VMC and the user chose to continue, a second prompt followed\nfor slot 2 even without a VMC there, with an empty name; answering\n\"No\" to it aborted the launch after slot 1 was already written.\n\nClear it for each slot, as the SMB and HDD launch code effectively do.\nRiptOPL does the same (NathanNeurotic/Open-PS2-Loader@fc0aba7b).\n\nReproduction (console, BDM): VMC slot 1 set to a name that does not\nexist, slot 2 empty; launch and answer \"Yes\" to the slot 1 error.\nBefore: a second error with an empty VMC name. After: the game starts.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "3677f325d4cf9291b806339afad80dd0350b223e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/3677f325d4cf9291b806339afad80dd0350b223e"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/1bf79385ead2405a6c29f26bff1578122d1ea543",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1bf79385ead2405a6c29f26bff1578122d1ea543",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/1bf79385ead2405a6c29f26bff1578122d1ea543",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1bf79385ead2405a6c29f26bff1578122d1ea543/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "a5cbdb066654336519606a7c5ee8c0abf1c01313",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a5cbdb066654336519606a7c5ee8c0abf1c01313",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a5cbdb066654336519606a7c5ee8c0abf1c01313"
            }
          ]
        },
        {
          "sha": "340e633872e91cf548a7db93ad519e957d82bc80",
          "node_id": "C_kwDOBDs4CNoAKDM0MGU2MzM4NzJlOTFjZjU0OGE3ZGI5M2FkNTE5ZTk1N2Q4MmJjODA",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:47:35Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:47:35Z"
            },
            "message": "bdm: allocate the device data again after the NBD server\n\nStarting the NBD server runs deinitAllSupport(), and bdmCleanUp() frees\neach BDM device's data and sets priv to NULL while the device stays\n\"enabled\". When the server stops, initAllSupport(1) reaches\nbdmInitDevicesData(), which only allocates the data on its first call:\nin Auto start mode it then wrote bdmDeviceTick through the NULL pointer\n(and later code read through it too). OPL crashes or freezes when it\nreturns from the NBD server with BDM in Auto mode, or in Manual mode\nonce BDM was started.\n\nAllocate the data again when it was freed and mark the device as not\ninitialized, so it is set up as on the first start. bdmCleanUp() and\nbdmShutdown() also skip data that is already gone.\n\nRiptOPL covers the same path in NathanNeurotic/Open-PS2-Loader@5183f85e.\n\nReproduction (console): BDM start mode Auto, a USB stick in. Main menu,\n\"Start NBD Server\", then close the \"running\" message. Before: crash or\nfreeze on return. After: the menu comes back with the USB page.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "27f19639e116afcbedf4327334e20634891d4d29",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/27f19639e116afcbedf4327334e20634891d4d29"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/340e633872e91cf548a7db93ad519e957d82bc80",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/340e633872e91cf548a7db93ad519e957d82bc80",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/340e633872e91cf548a7db93ad519e957d82bc80",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/340e633872e91cf548a7db93ad519e957d82bc80/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "1bf79385ead2405a6c29f26bff1578122d1ea543",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1bf79385ead2405a6c29f26bff1578122d1ea543",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/1bf79385ead2405a6c29f26bff1578122d1ea543"
            }
          ]
        },
        {
          "sha": "8116fe666829814ff38a1063bfbb948211b8fe29",
          "node_id": "C_kwDOBDs4CNoAKDgxMTZmZTY2NjgyOTgxNGZmMzhhMTA2M2JmYmI5NDgyMTFiOGZlMjk",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:49:21Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:49:21Z"
            },
            "message": "cdvdman: copy only the 2048 data bytes of each odd-sized sector\n\nFor reads with a sector size other than 2048 (2340 or 2328, used by a\nfew games), cdvdman_read() reads one 2048-byte sector into cdvdman_buf\nand copied nsectors * sector_size bytes from it to the caller's buffer,\nafter the 12-byte header for 2340. That read 280 or 292 bytes past\ncdvdman_buf (one sector in the USB, MX4SIO and SMB builds) and, for\n2340, wrote 12 bytes past the end of each sector, i.e. past the\ncaller's buffer on the last one.\n\nCopy the 2048 data bytes. The rest of an odd-sized sector held stale\nbuffer bytes before and keeps the caller's bytes now. No size cost.\n\nThe same change is in RiptOPL (NathanNeurotic/Open-PS2-Loader@af236bd7).\n\nReproduction: labs/host-repro run_all.ps1 -Only cdread (exact-size\nheap buffer). Before: AddressSanitizer reports a heap-buffer-overflow\nfor 2340-byte sectors, and a plain build corrupts the heap. After: no\nreport. 2048-byte reads are unchanged.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "b8658ed3039772beb556e111ad554b0dd9731bd9",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/b8658ed3039772beb556e111ad554b0dd9731bd9"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/8116fe666829814ff38a1063bfbb948211b8fe29",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/8116fe666829814ff38a1063bfbb948211b8fe29",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/8116fe666829814ff38a1063bfbb948211b8fe29",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/8116fe666829814ff38a1063bfbb948211b8fe29/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "340e633872e91cf548a7db93ad519e957d82bc80",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/340e633872e91cf548a7db93ad519e957d82bc80",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/340e633872e91cf548a7db93ad519e957d82bc80"
            }
          ]
        },
        {
          "sha": "eb68ed4642e7d5e7483ee7f5114db5cd4e4ad41d",
          "node_id": "C_kwDOBDs4CNoAKGViNjhlZDQ2NDJlN2Q1ZTc0ODNlZTdmNTExNGRiNWNkNGU0YWQ0MWQ",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:49:21Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:49:21Z"
            },
            "message": "labs: host check for in-game cdvdman_read() with odd sector sizes\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "52a891b24faa210a1b19962d4635a2b3fad700e1",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/52a891b24faa210a1b19962d4635a2b3fad700e1"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/eb68ed4642e7d5e7483ee7f5114db5cd4e4ad41d",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/eb68ed4642e7d5e7483ee7f5114db5cd4e4ad41d",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/eb68ed4642e7d5e7483ee7f5114db5cd4e4ad41d",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/eb68ed4642e7d5e7483ee7f5114db5cd4e4ad41d/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "8116fe666829814ff38a1063bfbb948211b8fe29",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/8116fe666829814ff38a1063bfbb948211b8fe29",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/8116fe666829814ff38a1063bfbb948211b8fe29"
            }
          ]
        },
        {
          "sha": "d5a1237e8a3730464dac6e6161c99f99bceabc1b",
          "node_id": "C_kwDOBDs4CNoAKGQ1YTEyMzdlOGEzNzMwNDY0ZGFjNmU2MTYxYzk5Zjk5YmNlYWJjMWI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:50:01Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:50:01Z"
            },
            "message": "Small hardening from the RiptOPL review\n\nNone of these has a known trigger with OPL's own data:\n- configPrepareNotifications() passed the device path to snprintf() as\n  the format string; use \"%s\".\n- sysLaunchLoaderElf() copied ExitPath, GameModeDesc and GameID into\n  the ee_core config with strncpy() and no terminator. ee_core appends\n  GameID to the IGS screenshot path with _strcat(), so an $AltStartup\n  of 16 characters or more would read past it. Terminate all three.\n- addIopPatch() compared a patch's mode with the game ID instead of the\n  launch mode. No table entry uses a mode yet.\n\nFrom RiptOPL (NathanNeurotic/Open-PS2-Loader@d5851fa5, 03f50fa6,\neb277b61).\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "afa6b86726657ca76b576658b192497cc38ba19e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/afa6b86726657ca76b576658b192497cc38ba19e"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/d5a1237e8a3730464dac6e6161c99f99bceabc1b",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d5a1237e8a3730464dac6e6161c99f99bceabc1b",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d5a1237e8a3730464dac6e6161c99f99bceabc1b",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d5a1237e8a3730464dac6e6161c99f99bceabc1b/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "eb68ed4642e7d5e7483ee7f5114db5cd4e4ad41d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/eb68ed4642e7d5e7483ee7f5114db5cd4e4ad41d",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/eb68ed4642e7d5e7483ee7f5114db5cd4e4ad41d"
            }
          ]
        },
        {
          "sha": "a89c711c59d888e4a8e12e3c4c5fcf027055e865",
          "node_id": "C_kwDOBDs4CNoAKGE4OWM3MTFjNTlkODg4ZTRhOGUxMmUzYzRjNWZjZjAyNzA1NWU4NjU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:52:37Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:52:37Z"
            },
            "message": "docs: list the reviewed RiptOPL fixes, add rules for Claude\n\nFORK.md lists the fixes ported after the review of RiptOPL's changes\nand describes how each fix is checked. CLAUDE.md gives Claude the rules\nof this repository: licence separation from YAOPLM, master as the\nrelease, FORK.md kept current with every fix, and the check sequence.\n\nmake_console_kit.py adds a game CFG ending with a comment line, a\ncheat file with two cheats of the same name, and a 4 MB VMC.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "a96739d3f04405fe37e9e55c25c766b5bbb19844",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/a96739d3f04405fe37e9e55c25c766b5bbb19844"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/a89c711c59d888e4a8e12e3c4c5fcf027055e865",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a89c711c59d888e4a8e12e3c4c5fcf027055e865",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a89c711c59d888e4a8e12e3c4c5fcf027055e865",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a89c711c59d888e4a8e12e3c4c5fcf027055e865/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "d5a1237e8a3730464dac6e6161c99f99bceabc1b",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d5a1237e8a3730464dac6e6161c99f99bceabc1b",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d5a1237e8a3730464dac6e6161c99f99bceabc1b"
            }
          ]
        },
        {
          "sha": "ed7aae60d5e192f804697cd89eb650b6e1d0b96a",
          "node_id": "C_kwDOBDs4CNoAKGVkN2FhZTYwZDVlMTkyZjgwNDY5N2NkODllYjY1MGI2ZTFkMGI5NmE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T17:57:36Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T18:01:41Z"
            },
            "message": "labs: keep the exit code of checks that end at once [skip ci]\n\nStart-Process could lose the exit code of a check that exited before\nits handle was taken, and run_all.ps1 then reported \"CRASH 0x\" for a\ncheck that had passed (seen for \"readFileBuffer plain cfg\"). Run the\nchecks through System.Diagnostics.Process instead.\n\nCLAUDE.md: when to use [skip ci], given that only master's tip is\npublished. FORK.md: gh-pages is deleted and GitHub Pages is off.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "967d6a429f897ad21da3f1cb7e105bf4a6d44f40",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/967d6a429f897ad21da3f1cb7e105bf4a6d44f40"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/ed7aae60d5e192f804697cd89eb650b6e1d0b96a",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ed7aae60d5e192f804697cd89eb650b6e1d0b96a",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/ed7aae60d5e192f804697cd89eb650b6e1d0b96a",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ed7aae60d5e192f804697cd89eb650b6e1d0b96a/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "a89c711c59d888e4a8e12e3c4c5fcf027055e865",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a89c711c59d888e4a8e12e3c4c5fcf027055e865",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a89c711c59d888e4a8e12e3c4c5fcf027055e865"
            }
          ]
        },
        {
          "sha": "fa5d4e56449c8b38c4f0503ded0dad24408ec96b",
          "node_id": "C_kwDOBDs4CNoAKGZhNWQ0ZTU2NDQ5YzhiMzhjNGYwNTAzZGVkMGRhZDI0NDA4ZWM5NmI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T18:39:36Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T18:39:36Z"
            },
            "message": "bdm: do not empty conf_opl.cfg when probing for a writable device\n\nWhen saving settings to the current device fails, trySaveConfigBDM()\nlooks for a USB device with bdmFindPartition(path, \"conf_opl.cfg\", 1),\nwhich opened the file with O_TRUNC just to see whether it can be\nwritten. That emptied the user's conf_opl.cfg, and only the settings\nbeing saved were written back. \"Remember last played\" saves only\nconf_last.cfg at every launch, so a failed memory card write wiped the\nUSB stick's OPL settings (upstream issue ps2homebrew/Open-PS2-Loader#1397).\nSince 86ca55ac reports a failed write instead of ignoring it, a full\nmemory card reached this path at every launch.\n\nOpen without O_TRUNC; configWrite() truncates the files it writes.\nRiptOPL's bdmFindPartition() also opens without O_TRUNC.\n\nReproduction: labs/host-repro run_all.ps1 -Only bdmprobe (mass0:\nmapped to a folder with a 38-byte conf_opl.cfg). Before: 0 bytes after\nthe probe. After: 38.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "20ffda3563579a75550c7025b4aa24498262f65a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/20ffda3563579a75550c7025b4aa24498262f65a"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/fa5d4e56449c8b38c4f0503ded0dad24408ec96b",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/fa5d4e56449c8b38c4f0503ded0dad24408ec96b",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/fa5d4e56449c8b38c4f0503ded0dad24408ec96b",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/fa5d4e56449c8b38c4f0503ded0dad24408ec96b/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "ed7aae60d5e192f804697cd89eb650b6e1d0b96a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/ed7aae60d5e192f804697cd89eb650b6e1d0b96a",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/ed7aae60d5e192f804697cd89eb650b6e1d0b96a"
            }
          ]
        },
        {
          "sha": "b82e79e8016a3d1d84af7e52a7f2c7d0404a40f2",
          "node_id": "C_kwDOBDs4CNoAKGI4MmU3OWU4MDE2YTNkMWQ4NGFmN2U1MmE3ZjJjN2QwNDA0YTQwZjI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T18:39:36Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T18:39:36Z"
            },
            "message": "labs: host check for the settings device probe\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "70705c94f11e4ed8a3d906480ea32aad5780009d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/70705c94f11e4ed8a3d906480ea32aad5780009d"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b82e79e8016a3d1d84af7e52a7f2c7d0404a40f2",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b82e79e8016a3d1d84af7e52a7f2c7d0404a40f2",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b82e79e8016a3d1d84af7e52a7f2c7d0404a40f2",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b82e79e8016a3d1d84af7e52a7f2c7d0404a40f2/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "fa5d4e56449c8b38c4f0503ded0dad24408ec96b",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/fa5d4e56449c8b38c4f0503ded0dad24408ec96b",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/fa5d4e56449c8b38c4f0503ded0dad24408ec96b"
            }
          ]
        },
        {
          "sha": "d3362def7f3884f2445a62dc78fe9d615fbb7acf",
          "node_id": "C_kwDOBDs4CNoAKGQzMzYyZGVmN2YzODg0ZjI0NDVhNjJkYzc4ZmU5ZDYxNWZiYjdhY2Y",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T18:39:50Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T18:39:50Z"
            },
            "message": "docs: list the settings probe fix; point Claude at the local kb/\n\nCLAUDE.md: the local knowledge base kb/ is excluded from git and must\nnot be committed; keep it current.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>",
            "tree": {
              "sha": "e7b87eb084fc46b46ecbb53e4062b7e4daba10e7",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/e7b87eb084fc46b46ecbb53e4062b7e4daba10e7"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/d3362def7f3884f2445a62dc78fe9d615fbb7acf",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d3362def7f3884f2445a62dc78fe9d615fbb7acf",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d3362def7f3884f2445a62dc78fe9d615fbb7acf",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d3362def7f3884f2445a62dc78fe9d615fbb7acf/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b82e79e8016a3d1d84af7e52a7f2c7d0404a40f2",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b82e79e8016a3d1d84af7e52a7f2c7d0404a40f2",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b82e79e8016a3d1d84af7e52a7f2c7d0404a40f2"
            }
          ]
        },
        {
          "sha": "e57decce9e7a0fdd6c5f3a7245418f6ee78e1a22",
          "node_id": "C_kwDOBDs4CNoAKGU1N2RlY2NlOWU3YTBmZGQ2YzVmM2E3MjQ1NDE4ZjZlZTc4ZTFhMjI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:38:31Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:38:31Z"
            },
            "message": "cheatman: keep the code lines with address 0 in the list for the EE core\n\nProblem: set_cheats_list() copies the codes of each enabled cheat until a\ncode whose address is 0. A line such as \"00000000 00000B4C\", the second\nhalf of a multi-line code (upstream issue #1548: a conditional cheat for\nMetal Gear Online), ends the cheat early: the rest of its lines are\ndropped and the engine pairs the unfinished code with the first line of\nthe next cheat. Before cc4844c (cheat selection at launch) the parser\nfilled the list directly and kept such lines.\n\nFix: only an all-zero pair ends the codes of a cheat, as in parse_buf(),\nwhich never stores one, and in the engine's SetupCheats().\n\nOrigin: upstream issue #1548, still open; no fork had fixed it.\n\nCheck: labs/host-repro/run_all.ps1 -Only cheat, \"cheat engine cht_addr0\"\n(the cheat of the issue, a Mastercode and one more cheat, all enabled):\n  before (upstream b3a21997): engine list: 8 of 14 parsed codes\n  after:                      engine list: 14 of 14 parsed codes\nHost check only; not yet tested on a console.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "9a9c4cbf0ace6c22319a5e8430d519000a8d1d31",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/9a9c4cbf0ace6c22319a5e8430d519000a8d1d31"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/e57decce9e7a0fdd6c5f3a7245418f6ee78e1a22",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e57decce9e7a0fdd6c5f3a7245418f6ee78e1a22",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e57decce9e7a0fdd6c5f3a7245418f6ee78e1a22",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e57decce9e7a0fdd6c5f3a7245418f6ee78e1a22/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "d3362def7f3884f2445a62dc78fe9d615fbb7acf",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d3362def7f3884f2445a62dc78fe9d615fbb7acf",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d3362def7f3884f2445a62dc78fe9d615fbb7acf"
            }
          ]
        },
        {
          "sha": "6b645a0060505087a426882d9b951b5a5fc0da65",
          "node_id": "C_kwDOBDs4CNoAKDZiNjQ1YTAwNjA1MDUwODdhNDI2ODgyZDliOTUxYjVhNWZjMGRhNjU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:38:31Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:38:31Z"
            },
            "message": "ee_core: do not write more hooks or codes than the engine's tables hold\n\nProblem: SetupCheats() sorts the loader's cheat list into hooklist\n(MAX_HOOKS = 5 hooks) and codelist (MAX_CODES = 250 codes) without a\nbound. set_cheats_list() lets up to 254 pairs through, so a Mastercode\nwith more than 5 hook lines, or more than 250 enabled codes, is written\npast the tables in cheat_engine.S, and numhooks then makes\nHookSetupThread treat the overflowed words as hook addresses.\nCHT/SLUS_210.09.cht (Sega Classics Collection) in the PS2-Widescreen\ncheat corpus has a Mastercode with 9 hook lines.\n\nFix: hooks beyond MAX_HOOKS and codes beyond MAX_CODES are dropped.\n\nOrigin: this fork (audit of the cheat path).\n\nCheck: labs/host-repro/run_all.ps1 -Only cheat, \"cheat engine cht_9hooks\"\nand \"cheat engine cht_many\" (100 cheats of 3 codes, all enabled):\n  before (upstream b3a21997): numhooks=9 numcodes=1 and numhooks=0\n    numcodes=254, both ASAN global-buffer-overflow in SetupCheats\n  after: numhooks=5 numcodes=1 and numhooks=0 numcodes=250, no report\nHost check only; not yet tested on a console.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "0de4d36a9375a58124ffe3d2f951ab2c34968523",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/0de4d36a9375a58124ffe3d2f951ab2c34968523"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/6b645a0060505087a426882d9b951b5a5fc0da65",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/6b645a0060505087a426882d9b951b5a5fc0da65",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/6b645a0060505087a426882d9b951b5a5fc0da65",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/6b645a0060505087a426882d9b951b5a5fc0da65/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "e57decce9e7a0fdd6c5f3a7245418f6ee78e1a22",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e57decce9e7a0fdd6c5f3a7245418f6ee78e1a22",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e57decce9e7a0fdd6c5f3a7245418f6ee78e1a22"
            }
          ]
        },
        {
          "sha": "a4c0830ffe04d7eb7c99936bd685fb63a7f1169f",
          "node_id": "C_kwDOBDs4CNoAKGE0YzA4MzBmZmUwNGQ3ZWI3Yzk5OTM2YmQ2ODVmYjYzYTdmMTE2OWY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:39:20Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:39:20Z"
            },
            "message": "fntsys: stop fntFitString() at the end of the string\n\nProblem: after the last word, fntFitString() steps past the terminating\nNUL (str = ++sp) and keeps scanning whatever follows the string. When\nthat last word does not fit and no earlier space exists, it also writes\n'\\n' over the NUL. A StaticText value is an exact-size allocation, and an\nAttributeText value such as a game's Description lives in the config\nset's val[256]: a 255-character Description (CFG databases have them)\nruns the scan into the next pointer and the heap, which gives the junk\ncharacters and the freezes of upstream issue #1713.\n\nFix: keep the terminator and stop the loop at it.\n\nOrigin: upstream issue #1713 (still open); the overrun was not fixed in\nany fork.\n\nCheck: labs/host-repro/run_all.ps1 -Only text:\n  before (upstream b3a21997):\n    fntFitString fits, exact buffer: ASAN heap-buffer-overflow in fntFitString\n    fntFitString long word, exact buffer: terminator OVERWRITTEN, ASAN\n    fntFitString 255-char config value: terminator OVERWRITTEN, bytes after it CORRUPTED\n  after: terminator kept in all three, next pointer and bytes after it intact\nHost check only; the console test is a theme with a wrapped Description.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "0341eeb203d0c5d407bad124d3171b8f957a1867",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/0341eeb203d0c5d407bad124d3171b8f957a1867"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/a4c0830ffe04d7eb7c99936bd685fb63a7f1169f",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a4c0830ffe04d7eb7c99936bd685fb63a7f1169f",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a4c0830ffe04d7eb7c99936bd685fb63a7f1169f",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a4c0830ffe04d7eb7c99936bd685fb63a7f1169f/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "6b645a0060505087a426882d9b951b5a5fc0da65",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/6b645a0060505087a426882d9b951b5a5fc0da65",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/6b645a0060505087a426882d9b951b5a5fc0da65"
            }
          ]
        },
        {
          "sha": "0f16d5917610786379db1d9a23462a1f4903d009",
          "node_id": "C_kwDOBDs4CNoAKDBmMTZkNTkxNzYxMDc4NjM3OWRiMWQ5YTIzNDYyYTFmNDkwM2QwMDk",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:39:20Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:39:20Z"
            },
            "message": "themes: wrap a copy of the attribute text, not the config value itself\n\nProblem: drawAttributeText() gets the value of an AttributeText (a\ngame's Description, Title...) from configGetStr(), which returns a\npointer into the config set's own storage, and lets fntFitString()\ninsert the line breaks there. The next save of the game's settings\nwrites those line breaks into the CFG; on reload the config reader\nkeeps only the first line, so the Description is cut (upstream issue\n#1713: \"random carriage returns\", truncated description).\n\nFix: wrap a private copy (wrappedValue), freed when the value is\nrefreshed and when the element ends; the config value stays as read.\n\nOrigin: upstream issue #1713; RiptOPL fixes it the same way\n(NathanNeurotic/Open-PS2-Loader, src/themes.c, its issue #44).\n\nCheck: labs/host-repro/run_all.ps1 -Only text, \"AttributeText wrap,\nconfig value\", 43-character Description, width 100:\n  before (upstream b3a21997): config value after drawing:\n    \"The quick|brown fox|jumps over|the lazy dog\" ('|' = line break)\n  after: config value after drawing: \"The quick brown fox jumps over the\n    lazy dog\"; rendered text: \"Description:|The quick|brown fox|...\"\nHost check only; the console test is a theme with a wrapped Description,\na settings save and a look at the CFG.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "c2a4416d41411dc1f80683dcf227a160928b181b",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/c2a4416d41411dc1f80683dcf227a160928b181b"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/0f16d5917610786379db1d9a23462a1f4903d009",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0f16d5917610786379db1d9a23462a1f4903d009",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0f16d5917610786379db1d9a23462a1f4903d009",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0f16d5917610786379db1d9a23462a1f4903d009/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "a4c0830ffe04d7eb7c99936bd685fb63a7f1169f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a4c0830ffe04d7eb7c99936bd685fb63a7f1169f",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a4c0830ffe04d7eb7c99936bd685fb63a7f1169f"
            }
          ]
        },
        {
          "sha": "d784657c76f0aa8ada973a2610cf8ed66414ad9a",
          "node_id": "C_kwDOBDs4CNoAKGQ3ODQ2NTdjNzZmMGFhOGFkYTk3M2EyNjEwY2Y4ZWQ2NjQxNGFkOWE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:40:38Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:40:38Z"
            },
            "message": "themes: give GameCountText the 60 bytes it formats the count into\n\nProblem: initGameCountText() hands initMutableText() a zeroed 60-byte\nbuffer, and initMutableText() copies its text into a new allocation of\nstrlen + 1 = 1 byte. drawGameCountText() then formats the game count\ninto that byte with a size of 60: a heap overflow of up to 59 bytes on\nevery theme that has a GameCountText element (upstream #1362). The\n60-byte buffer itself was never freed.\n\nFix: seed the element with an empty string and replace the allocation\nby the 60-byte buffer drawGameCountText() writes.\n\nOrigin: this fork (audit of the theme elements); RiptOPL fixes it the\nsame way.\n\nCheck: labs/host-repro/run_all.ps1 -Only theme, \"GameCountText count\nbuffer\" (a count of 1234 drawn once):\n  before (upstream b3a21997): ASAN heap-buffer-overflow in drawGameCountText\n  after:                      GameCountText value: \"1234 games\", no report\nHost check only.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "e5fbe78dca4d6005f069f52acdb20ae5e7e41066",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/e5fbe78dca4d6005f069f52acdb20ae5e7e41066"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/d784657c76f0aa8ada973a2610cf8ed66414ad9a",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d784657c76f0aa8ada973a2610cf8ed66414ad9a",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d784657c76f0aa8ada973a2610cf8ed66414ad9a",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d784657c76f0aa8ada973a2610cf8ed66414ad9a/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "0f16d5917610786379db1d9a23462a1f4903d009",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0f16d5917610786379db1d9a23462a1f4903d009",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0f16d5917610786379db1d9a23462a1f4903d009"
            }
          ]
        },
        {
          "sha": "02ab252a04969c1a04fb6aa527d678f88b1ee08b",
          "node_id": "C_kwDOBDs4CNoAKDAyYWIyNTJhMDQ5NjljMWEwNGZiNmFhNTI3ZDY3OGY4OGIxZWUwOGI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:24Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:24Z"
            },
            "message": "lang: skip language file names too short to carry a name\n\nProblem: lngReadEntry() takes the language name from between \"lang_\"\nand \".lng\" with a length of strlen(name) - 9 + 1, but accepts any file\nwhose name contains \".lng\". A file such as \"ru.lng\" or \"abc.lng\" in\nmc?:/OPL gives a negative length: malloc() fails and memcpy() writes\nthrough NULL; \"abcd.lng\" gives a length of 0 and a write to name[-1].\nmc?:/OPL is scanned at every boot, so OPL crashed at every boot until\nthe file was removed.\n\nFix: file names shorter than lang_X.lng are skipped.\n\nOrigin: this fork (audit of the language loader). RiptOPL e147ef8a\nrequires the lang_ prefix and the .lng suffix instead.\n\nCheck: labs/host-repro/run_all.ps1 -Only lang, \"lngReadEntry file\nnames\" (lang_Russian.lng, abcd.lng, ru.lng):\n  before (upstream b3a21997): CRASH 0xC0000374; ASAN heap-buffer-overflow\n    in lngReadEntry\n  after: language \"Russian\" from mc0:/OPL/lang_Russian.lng | abcd.lng:\n    skipped | ru.lng: skipped\nHost check only.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "d88765c8ff1d2faf359030c6d3659d14cebb9159",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/d88765c8ff1d2faf359030c6d3659d14cebb9159"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/02ab252a04969c1a04fb6aa527d678f88b1ee08b",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/02ab252a04969c1a04fb6aa527d678f88b1ee08b",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/02ab252a04969c1a04fb6aa527d678f88b1ee08b",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/02ab252a04969c1a04fb6aa527d678f88b1ee08b/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "d784657c76f0aa8ada973a2610cf8ed66414ad9a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/d784657c76f0aa8ada973a2610cf8ed66414ad9a",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/d784657c76f0aa8ada973a2610cf8ed66414ad9a"
            }
          ]
        },
        {
          "sha": "80c5558d59f0d6b2bd090fbf6311a2dd94f25145",
          "node_id": "C_kwDOBDs4CNoAKDgwYzU1NThkNTlmMGQ2YjJiZDA5MGZiZjYzMTFhMmRkOTRmMjUxNDU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:24Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:24Z"
            },
            "message": "OSDHistory: cut the boot file name to the 16 characters of a record\n\nProblem: AddHistoryRecordUsingFullPath() keeps the file name in\nfilename[17], and GetBootFilename() copies the whole base name of the\nboot path into it. With $AltStartup set, the path comes from the CFG or\nthe GUI, which allow 31 characters: a base name longer than 16\ncharacters overflows the stack at every launch of that game (release\nbuilds record the OSD history).\n\nFix: the name is cut to 16 characters, all a history record holds.\n\nOrigin: this fork (audit of the launch path).\n\nCheck: labs/host-repro/run_all.ps1 -Only history, \"GetBootFilename\"\nwith cdrom0:\\DATA\\ABCDEFGHIJKLMNOPQRST.ELF;1:\n  before (upstream b3a21997): record \"ABCDEFGHIJKLMNOPQRST.ELF\" (24\n    characters); ASAN stack-buffer-overflow in GetBootFilename\n  after: record \"ABCDEFGHIJKLMNOP\" (16 characters)\nHost check only.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "3e66d67ea0e726085209f0ebce83e9ac0fe89273",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/3e66d67ea0e726085209f0ebce83e9ac0fe89273"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/80c5558d59f0d6b2bd090fbf6311a2dd94f25145",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/80c5558d59f0d6b2bd090fbf6311a2dd94f25145",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/80c5558d59f0d6b2bd090fbf6311a2dd94f25145",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/80c5558d59f0d6b2bd090fbf6311a2dd94f25145/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "02ab252a04969c1a04fb6aa527d678f88b1ee08b",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/02ab252a04969c1a04fb6aa527d678f88b1ee08b",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/02ab252a04969c1a04fb6aa527d678f88b1ee08b"
            }
          ]
        },
        {
          "sha": "0d28c4c52cb811e1ff50ad1136edc8c6e4d97c06",
          "node_id": "C_kwDOBDs4CNoAKDBkMjhjNGM1MmNiODExZTFmZjUwYWQxMTM2ZWRjOGM2ZTRkOTdjMDY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "message": "sound: do not use the default BGM path as a format string\n\nProblem: bgmLoad() calls snprintf() with the default_bgm_path setting\nas the format string. A path with a '%' conversion makes it read\narguments that were never passed; BGM starts at boot.\n\nFix: \"%s\".\n\nOrigin: this fork (audit of the settings); d5a1237e fixed a different\ncall of the same kind.\n\nCheck: labs/host-repro/run_all.ps1 -Only bgm, \"bgmLoad default_bgm_path\"\nwith mass:/MUSIC/100%s.ogg (the harness intercepts snprintf):\n  before (upstream b3a21997): format string = the setting itself (user data)\n  after:                      format string = \"%s\"\nHost check only.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "c444c0e0c930b7c56a15eba8edeb9703a7df4eb6",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/c444c0e0c930b7c56a15eba8edeb9703a7df4eb6"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/0d28c4c52cb811e1ff50ad1136edc8c6e4d97c06",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0d28c4c52cb811e1ff50ad1136edc8c6e4d97c06",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0d28c4c52cb811e1ff50ad1136edc8c6e4d97c06",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0d28c4c52cb811e1ff50ad1136edc8c6e4d97c06/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "80c5558d59f0d6b2bd090fbf6311a2dd94f25145",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/80c5558d59f0d6b2bd090fbf6311a2dd94f25145",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/80c5558d59f0d6b2bd090fbf6311a2dd94f25145"
            }
          ]
        },
        {
          "sha": "9058044e5290586ee99d5a7bf6a0245cfa6c5793",
          "node_id": "C_kwDOBDs4CNoAKDkwNTgwNDRlNTI5MDU4NmVlOTlkNWE3YmY2YTAyNDVjZmE2YzU3OTM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "message": "gsm: ignore a $GSMVMode outside the table of video modes\n\nProblem: PrepareGSM() indexes predef_vmode[29] with $GSMVMode straight\nfrom the per-game or global CFG. The GUI offers only valid values, but a\nhand-edited CFG, a CFG written by another fork (RiptOPL has a 30th mode)\nor a compatibility download gives an index past the table, and the game\nstarts with garbage GS mode registers.\n\nFix: a value outside the table falls back to mode 0.\n\nOrigin: RiptOPL 4b798e86 (the clamp), in a smaller form.\n\nCheck: labs/host-repro/run_all.ps1 -Only gsm, \"PrepareGSM $GSMVMode=29\"\nand \"PrepareGSM $GSMVMode=-1\":\n  before (upstream b3a21997): mode used 0, display 0000000000000000;\n    ASAN global-buffer-overflow in PrepareGSM for 29\n  after: mode used 2, the same as $GSMVMode=0\nHost check only.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "a642ea1f0dde46990965bc7090c000359dca1646",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/a642ea1f0dde46990965bc7090c000359dca1646"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/9058044e5290586ee99d5a7bf6a0245cfa6c5793",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9058044e5290586ee99d5a7bf6a0245cfa6c5793",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/9058044e5290586ee99d5a7bf6a0245cfa6c5793",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9058044e5290586ee99d5a7bf6a0245cfa6c5793/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "0d28c4c52cb811e1ff50ad1136edc8c6e4d97c06",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/0d28c4c52cb811e1ff50ad1136edc8c6e4d97c06",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/0d28c4c52cb811e1ff50ad1136edc8c6e4d97c06"
            }
          ]
        },
        {
          "sha": "8a98f0fde03ce1d2273e8048058cc247911db91b",
          "node_id": "C_kwDOBDs4CNoAKDhhOThmMGZkZTAzY2UxZDIyNzNlODA0ODA1OGNjMjQ3OTExZGI5MWI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "message": "pad: keep a held button repeating across the wrap of the tick counter\n\nProblem: readPads() measures the time since the last poll as the\ndifference of two cpu_ticks() / CLOCKS_PER_MILISEC values. cpu_ticks()\nis the 32-bit COP0 Count register, which wraps every 29 s: at the wrap\nthe difference underflows and the countdown of every held button grows\nby about 29 s, so a held D-pad stops repeating for that long.\n\nFix: take the difference of the raw tick counts, which unsigned\narithmetic keeps right across the wrap, and carry the remainder.\n\nOrigin: RiptOPL 663b5779 (NathanNeurotic), offered upstream in PR #1757\n(closed by its author).\n\nCheck: labs/host-repro/run_all.ps1 -Only pad, \"readPads tick counter\nwrap\" (polls 10 ms apart, the last one after the wrap):\n  before (upstream b3a21997): countdown 590 ms before the wrap, 29707 ms after it\n  after:                      countdown 590 ms before the wrap, 580 ms after it\nHost check only; on the console, hold the D-pad in a long game list for\nmore than 30 s.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "d7b064e20e7d038aad12a5ab915aae896cf20425",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/d7b064e20e7d038aad12a5ab915aae896cf20425"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/8a98f0fde03ce1d2273e8048058cc247911db91b",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/8a98f0fde03ce1d2273e8048058cc247911db91b",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/8a98f0fde03ce1d2273e8048058cc247911db91b",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/8a98f0fde03ce1d2273e8048058cc247911db91b/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "9058044e5290586ee99d5a7bf6a0245cfa6c5793",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9058044e5290586ee99d5a7bf6a0245cfa6c5793",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/9058044e5290586ee99d5a7bf6a0245cfa6c5793"
            }
          ]
        },
        {
          "sha": "885c201f3d1a497060cbe47e72d68edd75b12b11",
          "node_id": "C_kwDOBDs4CNoAKDg4NWMyMDFmM2QxYTQ5NzA2MGNiZTQ3ZTcyZDY4ZWRkNzViMTJiMTE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "message": "genvmc: release the abort semaphore when a cluster write fails\n\nProblem: mc_writecluster() takes genvmc_abort_sema and returns -1 on a\nshort write without releasing it. After one failed write (a full or\nfailing device while a VMC is created), the next VMC creation blocks\nforever in its first write, and an abort blocks in vmc_abort().\n\nFix: release the semaphore before returning the error. The error is\nreported to the GUI as before.\n\nOrigin: RiptOPL fa9b620f and 9ffc9504 (#934), which restructure the\nlocking; this is the smallest form.\n\nCheck: labs/host-repro/run_all.ps1 -Only genvmc, \"genvmc write short\":\n  before (upstream b3a21997): mc_writecluster = -1, abort semaphore LEFT TAKEN\n  after:                      mc_writecluster = -1, abort semaphore released\nHost check only.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "c2b1050dcb8090d6824de100268d34d4a2e232ba",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/c2b1050dcb8090d6824de100268d34d4a2e232ba"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/885c201f3d1a497060cbe47e72d68edd75b12b11",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/885c201f3d1a497060cbe47e72d68edd75b12b11",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/885c201f3d1a497060cbe47e72d68edd75b12b11",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/885c201f3d1a497060cbe47e72d68edd75b12b11/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "8a98f0fde03ce1d2273e8048058cc247911db91b",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/8a98f0fde03ce1d2273e8048058cc247911db91b",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/8a98f0fde03ce1d2273e8048058cc247911db91b"
            }
          ]
        },
        {
          "sha": "33f7c22685e9c0ea6cb220acdfd75db322066115",
          "node_id": "C_kwDOBDs4CNoAKDMzZjdjMjI2ODVlOWMwZWE2Y2IyMjBhY2RmZDc1ZGIzMjIwNjYxMTU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:25Z"
            },
            "message": "dia: restore the scroll speed when a dialog returns through its updater\n\nProblem: diaExecuteDialog() stores the pad repeat delays, sets the\nslower dialog delays and restores the stored ones on every return path\nbut the one that returns an updater's result. The VMC dialog\n(guiGameShowVMCConfig()) returns that way and re-enters the dialog in a\nloop, so the next entry stores the dialog delays as the ones to\nrestore: after the VMC menu the game list scrolls at the dialog speed\nuntil a settings dialog applies the configuration again. Visible with\nthe scroll speed set to Fast or Slow.\n\nFix: restore the delays on that path too.\n\nOrigin: upstream PR #1757 (NathanNeurotic, closed by its author), this\npart only.\n\nCheck: by reading only. On the console: scroll speed Fast, open a\ngame's VMC menu, type a name, back out, compare the list's scroll\nspeed with before.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "67accc2ef9cd82d50f064044e0b3efbe0f7b3ec2",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/67accc2ef9cd82d50f064044e0b3efbe0f7b3ec2"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/33f7c22685e9c0ea6cb220acdfd75db322066115",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/33f7c22685e9c0ea6cb220acdfd75db322066115",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/33f7c22685e9c0ea6cb220acdfd75db322066115",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/33f7c22685e9c0ea6cb220acdfd75db322066115/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "885c201f3d1a497060cbe47e72d68edd75b12b11",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/885c201f3d1a497060cbe47e72d68edd75b12b11",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/885c201f3d1a497060cbe47e72d68edd75b12b11"
            }
          ]
        },
        {
          "sha": "7a37c1ca7f021e785251113bb272a65c717e0e7a",
          "node_id": "C_kwDOBDs4CNoAKDdhMzdjMWNhN2YwMjFlNzg1MjUxMTEzYmIyNzJhNjVjNzE3ZTBlN2E",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:26Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:42:26Z"
            },
            "message": "textures: load grey and grey+alpha PNGs\n\nProblem: texLoadAll() expands grey images but never converts them to\nRGB, so after png_read_update_info() the colour type is still grey,\nwhich the reader switch does not handle: a grey cover or theme image is\nrejected and remembered as missing.\n\nFix: png_set_gray_to_rgb() for grey and grey+alpha images; the filler\nand the RGB/RGBA readers then apply as for colour images.\n\nOrigin: wOPL (ps2homebrew/wOPL, src/textures.c).\n\nCheck: by reading of libpng's transforms only (no libpng on the host).\nOn the console: a grey PNG cover in ART/ is shown.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "d32ee00571962f5062e4405f9069f02e1bc1f4d8",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/d32ee00571962f5062e4405f9069f02e1bc1f4d8"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/7a37c1ca7f021e785251113bb272a65c717e0e7a",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7a37c1ca7f021e785251113bb272a65c717e0e7a",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7a37c1ca7f021e785251113bb272a65c717e0e7a",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7a37c1ca7f021e785251113bb272a65c717e0e7a/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "33f7c22685e9c0ea6cb220acdfd75db322066115",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/33f7c22685e9c0ea6cb220acdfd75db322066115",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/33f7c22685e9c0ea6cb220acdfd75db322066115"
            }
          ]
        },
        {
          "sha": "1183f4e892295742d082791310e8c0e81bb74141",
          "node_id": "C_kwDOBDs4CNoAKDExODNmNGU4OTIyOTU3NDJkMDgyNzkxMzEwZThjMGU4MWJiNzQxNDE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:43:04Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:43:04Z"
            },
            "message": "themes: drop an image texture whose file could not be loaded\n\nProblem: initImageTexture() ignores the result of texDiscoverLoad() (an\nempty statement after the if) and keeps the texture. When the theme\nnames an image file that is not there (a typo, a partial copy, the\nwrong case on SMB), texDiscoverLoad() returns before touching the\ntexture, so its memory pointer is whatever malloc() left: the element is\ndrawn from that pointer and, at the next theme or language change,\nfreeImageTexture() passes it to free(). The failure path that frees the\ntexture had the same problem.\n\nFix: the texture is zeroed, and a failed load drops it, so the element\nis disabled as for an image without a name.\n\nOrigin: this fork (audit of the theme elements); RiptOPL fixes it the\nsame way.\n\nCheck: labs/host-repro/run_all.ps1 -Only theme, \"image file missing\":\n  before (upstream b3a21997): CRASH 0xC0000374; ASAN attempting free on\n    address which was not malloc()-ed, in freeImageTexture\n  after: image file missing: no texture, element disabled | freed\nHost check only; on the console: a theme whose StaticImage names a\nmissing file loads, then a theme change does not crash.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "5ecfd49d2d2f9b49e2f6ac5593075cae90fea0fc",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/5ecfd49d2d2f9b49e2f6ac5593075cae90fea0fc"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/1183f4e892295742d082791310e8c0e81bb74141",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1183f4e892295742d082791310e8c0e81bb74141",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/1183f4e892295742d082791310e8c0e81bb74141",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1183f4e892295742d082791310e8c0e81bb74141/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "7a37c1ca7f021e785251113bb272a65c717e0e7a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7a37c1ca7f021e785251113bb272a65c717e0e7a",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7a37c1ca7f021e785251113bb272a65c717e0e7a"
            }
          ]
        },
        {
          "sha": "669e2f8e6f22eeb62a4da70c3b4b0bc4f97dc895",
          "node_id": "C_kwDOBDs4CNoAKDY2OWUyZjhlNmYyMmVlYjYyYTRkYTcwYzNiNGIwYmM0Zjk3ZGM4OTU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:44:23Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:44:23Z"
            },
            "message": "themes: keep the default items list the theme gets when it has none\n\nProblem: validateItemsList() builds a default ItemsList for a theme that\ndefines none and links it into the element list, but the theme keeps\ngamesItemsList (and appsItemsList) as NULL. thmLoad() then sets\ngTheme->itemsList from it, and menusys dereferences\ngTheme->itemsList->extended on every page move: OPL crashes at the\nfirst scroll with such a theme.\n\nFix: validateItemsList() returns the list it validated or created, and\nthe theme stores it.\n\nOrigin: this fork (audit of the theme loader); RiptOPL fixes it the same\nway.\n\nCheck: labs/host-repro/run_all.ps1 -Only theme, \"theme without ItemsList\":\n  before (upstream b3a21997): gamesItemsList NULL (menusys dereferences it), appsItemsList NULL\n  after:                      gamesItemsList set, appsItemsList set\nHost check only; on the console: a theme whose conf_theme.cfg has no\nItemsList element, then scroll the list.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "4c85c18971c89ae53c1a094c8ea2a311f520261f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/4c85c18971c89ae53c1a094c8ea2a311f520261f"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/669e2f8e6f22eeb62a4da70c3b4b0bc4f97dc895",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/669e2f8e6f22eeb62a4da70c3b4b0bc4f97dc895",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/669e2f8e6f22eeb62a4da70c3b4b0bc4f97dc895",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/669e2f8e6f22eeb62a4da70c3b4b0bc4f97dc895/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "1183f4e892295742d082791310e8c0e81bb74141",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1183f4e892295742d082791310e8c0e81bb74141",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/1183f4e892295742d082791310e8c0e81bb74141"
            }
          ]
        },
        {
          "sha": "9ad4afeb15346c148081488a216713d2241dc534",
          "node_id": "C_kwDOBDs4CNoAKDlhZDRhZmViMTUzNDZjMTQ4MDgxNDg4YTIxNjcxM2QyMjQxZGM1MzQ",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:44:24Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:44:24Z"
            },
            "message": "zso: reject images whose block size is not 2048 bytes\n\nProblem: ziso_init() never reads block_size from the header, and the\nreader indexes blocks of one 2048-byte sector. maxcso writes 16 KiB\nblocks by default for images of 2 GiB and more (src/compress.cpp,\nLARGE_BLOCK_SIZE), so such a .zso has 8 times fewer index entries than\nOPL expects: the game list, the launch and the game read the entries of\nthe wrong blocks, and a block of 16 KiB is written in front of the\n2 KiB buffer the caller provides.\n\nFix: a header with another block size is rejected, as one with an\nunreadable align already is; the image is then not listed as a game.\n\nOrigin: this fork (audit of the ZSO reader, confirmed in the maxcso\nsource).\n\nCheck: labs/host-repro/run_all.ps1 -Only zso, \"zso read 16k 0 4\" (an\nimage of 64 sectors in 16 KiB blocks):\n  before (upstream b3a21997): CRASH 0xC0000005; ASAN access-violation in ziso_read_sector\n  after:                      header rejected (-1): block size 16384, align 0\nHost check only; the kit for the console gets such an image.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "15aecc176294462d558fddef9884117169cbb9bf",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/15aecc176294462d558fddef9884117169cbb9bf"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/9ad4afeb15346c148081488a216713d2241dc534",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9ad4afeb15346c148081488a216713d2241dc534",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/9ad4afeb15346c148081488a216713d2241dc534",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9ad4afeb15346c148081488a216713d2241dc534/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "669e2f8e6f22eeb62a4da70c3b4b0bc4f97dc895",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/669e2f8e6f22eeb62a4da70c3b4b0bc4f97dc895",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/669e2f8e6f22eeb62a4da70c3b4b0bc4f97dc895"
            }
          ]
        },
        {
          "sha": "147e2493313da53bc999210f6facad97e5ee5f7f",
          "node_id": "C_kwDOBDs4CNoAKDE0N2UyNDkzMzEzZGE1M2JjOTk5MjEwZjZmYWNhZDk3ZTVlZTVmN2Y",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:45:47Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:45:47Z"
            },
            "message": "zso: check the index before reading the compressed data\n\nProblem: ziso_read_sector() trusts the block index of the image. The\nsize of the compressed data is (o_end - o_start) << align with no check\nagainst the count * 2048 bytes the caller provides, and the data is read\nto the end of that buffer: an index whose end offset lies before its\nstart offset (a corrupt or truncated .zso, or a download gone wrong)\ngives a huge size, and read_raw_data() writes the file in front of the\nbuffer. The EE reads the image into the 2 KiB IOBuffer for the game\nlist and the launch, the game reads into the IOP's buffers.\n\nFix: the offsets of the sectors to read must not decrease, and their\ndata must fit the buffer; otherwise the read fails, which the callers\nreport as a read error (-EIO on the EE, SCECdErEOM in the game).\n\nOrigin: this fork (RiptOPL review, \"upstream defects nobody fixed\").\n\nCheck: labs/host-repro/run_all.ps1 -Only zso, \"zso read badidx 3 1\" (an\nimage whose index entries 3 and 4 are swapped):\n  before (upstream b3a21997): CRASH 0xC0000409, or an endless loop\n  after:                      read 0 of 1 sectors from 3: read error\nHost check only; the kit for the console gets such an image.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "c3f2190077d2ecad2971232a6a2e16d18104f9f1",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/c3f2190077d2ecad2971232a6a2e16d18104f9f1"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/147e2493313da53bc999210f6facad97e5ee5f7f",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/147e2493313da53bc999210f6facad97e5ee5f7f",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/147e2493313da53bc999210f6facad97e5ee5f7f",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/147e2493313da53bc999210f6facad97e5ee5f7f/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "9ad4afeb15346c148081488a216713d2241dc534",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/9ad4afeb15346c148081488a216713d2241dc534",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/9ad4afeb15346c148081488a216713d2241dc534"
            }
          ]
        },
        {
          "sha": "4baf59215ac79990aa6c361934a7edf6481013df",
          "node_id": "C_kwDOBDs4CNoAKDRiYWY1OTIxNWFjNzk5OTBhYTZjMzYxOTM0YTdlZGY2NDgxMDEzZGY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:47:19Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:47:19Z"
            },
            "message": "zso: read more sectors than the index cache covers in slices\n\nProblem: the index cache holds ZISO_IDX_MAX_ENTRIES (257) block\noffsets, and ziso_read_sector() looks up the end offset of the last\nsector at index count: a read of more than 256 sectors reads past the\ncache, into the heap, and takes the result as the end of the compressed\ndata (which then decides where the data is read to). On the EE the\nreads are small, but in the game cdvdman passes the game's whole\nrequest on when accurate reads are off, and the comment \"no game should\nrequest more than 256 sectors per read\" was the only guard.\n\nFix: ziso_read_sector() reads in slices of at most 256 sectors\n(ziso_read_slice(), the former body); a failed slice ends the read.\n\nOrigin: this fork (audit of the ZSO reader).\n\nCheck: labs/host-repro/run_all.ps1 -Only zso, \"zso read ok 100 300\"\n(300 sectors from a 400-sector image into a 600 KiB buffer):\n  before (upstream b3a21997): CRASH 0xC0000409; ASAN heap-buffer-overflow in ziso_read_sector\n  after:                      read 300 sectors from 100: data ok\nHost check only.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "5176a09975d7252d6c40786aec744fa2cc553870",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/5176a09975d7252d6c40786aec744fa2cc553870"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/4baf59215ac79990aa6c361934a7edf6481013df",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4baf59215ac79990aa6c361934a7edf6481013df",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4baf59215ac79990aa6c361934a7edf6481013df",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4baf59215ac79990aa6c361934a7edf6481013df/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "147e2493313da53bc999210f6facad97e5ee5f7f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/147e2493313da53bc999210f6facad97e5ee5f7f",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/147e2493313da53bc999210f6facad97e5ee5f7f"
            }
          ]
        },
        {
          "sha": "dc33d5e265a5b11727326312aaaa5de57055a296",
          "node_id": "C_kwDOBDs4CNoAKGRjMzNkNWUyNjVhNWIxMTcyNzMyNjMxMmFhYWE1ZGU1NzA1NWEyOTY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:54:44Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:54:44Z"
            },
            "message": "labs: host checks for the Y1 fixes\n\nNew groups in run_all.ps1: text (fntFitString, drawAttributeText), theme\n(GameCountText, initImageTexture, validateGUIElems), lang (lngReadEntry),\nhistory (GetBootFilename), gsm (PrepareGSM), pad (readPads across the\ntick wrap), genvmc (mc_writecluster) and bgm (bgmLoad). The cheat group\nalso builds set_cheats_list() and SetupCheats() and can sweep a corpus\n(cheat-t -s <list>). The zso group reads sectors through the tree's LZ4\ndecoder from images make_inputs.py writes (one-run LZ4 blocks, raw\nblocks, a corrupt index, 16 KiB blocks). extract.py takes multi-line\n#defines, typedef structs and optional names.\n\nrun_all.ps1 -Expected <file> compares every result line with the file\nand fails on a difference; expected.txt is the output of this tree.\n\nmake_console_kit.py adds the cases of the second console checklist: ZSO\nimages with 16 KiB blocks and with a corrupt index, a theme without an\nItemsList that names a missing image and wraps the Description, a CFG\nwith a 255-character Description, a grey cover and a short .lng name.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "6a9de2d78b4cc6b0473f8a0d75a61de4ac18f2fa",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/6a9de2d78b4cc6b0473f8a0d75a61de4ac18f2fa"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/dc33d5e265a5b11727326312aaaa5de57055a296",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/dc33d5e265a5b11727326312aaaa5de57055a296",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/dc33d5e265a5b11727326312aaaa5de57055a296",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/dc33d5e265a5b11727326312aaaa5de57055a296/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "4baf59215ac79990aa6c361934a7edf6481013df",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4baf59215ac79990aa6c361934a7edf6481013df",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4baf59215ac79990aa6c361934a7edf6481013df"
            }
          ]
        },
        {
          "sha": "92d66096eb1d997ba0be66fdb88d82cc1a3d4798",
          "node_id": "C_kwDOBDs4CNoAKDkyZDY2MDk2ZWIxZDk5N2JhMGJlNjZmZGI4OGQ4MmNjMWEzZDQ3OTg",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:54:44Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:54:44Z"
            },
            "message": "ci: run the host checks on Windows for every push\n\nCI-host-checks builds the harnesses of labs/host-repro with MSVC and\nAddressSanitizer on windows-latest and compares every result line with\nlabs/host-repro/expected.txt, so a regression in a checked function\nfails the build.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "c4bb0b6e9f06ea800e2185859db2d9c95318ba14",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/c4bb0b6e9f06ea800e2185859db2d9c95318ba14"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/92d66096eb1d997ba0be66fdb88d82cc1a3d4798",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/92d66096eb1d997ba0be66fdb88d82cc1a3d4798",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/92d66096eb1d997ba0be66fdb88d82cc1a3d4798",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/92d66096eb1d997ba0be66fdb88d82cc1a3d4798/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "dc33d5e265a5b11727326312aaaa5de57055a296",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/dc33d5e265a5b11727326312aaaa5de57055a296",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/dc33d5e265a5b11727326312aaaa5de57055a296"
            }
          ]
        },
        {
          "sha": "64df0a785f64167892da7bc751d052a41b57eb25",
          "node_id": "C_kwDOBDs4CNoAKDY0ZGYwYTc4NWY2NDE2Nzg5MmRhN2JjNzUxZDA1MmE0MWI1N2ViMjU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:54:44Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:54:44Z"
            },
            "message": "docs: list the Y1 fixes in FORK.md\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "8dea3c1c3fe7b62296526b509b18dceb43d29ab8",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/8dea3c1c3fe7b62296526b509b18dceb43d29ab8"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/64df0a785f64167892da7bc751d052a41b57eb25",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/64df0a785f64167892da7bc751d052a41b57eb25",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/64df0a785f64167892da7bc751d052a41b57eb25",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/64df0a785f64167892da7bc751d052a41b57eb25/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "92d66096eb1d997ba0be66fdb88d82cc1a3d4798",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/92d66096eb1d997ba0be66fdb88d82cc1a3d4798",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/92d66096eb1d997ba0be66fdb88d82cc1a3d4798"
            }
          ]
        },
        {
          "sha": "a4ef34f0d41b51f34aedb9da1e0e488669aa322e",
          "node_id": "C_kwDOBDs4CNoAKGE0ZWYzNGYwZDQxYjUxZjM0YWVkYjlkYTFlMGU0ODg2NjlhYTMyMmU",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:58:59Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T19:58:59Z"
            },
            "message": "labs: format the harnesses with clang-format 12\n\nCI-format-check covers every .c file of the tree, including the host\nharnesses.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "77a5d817910088bfafc42a10c744594078aead2a",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/77a5d817910088bfafc42a10c744594078aead2a"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/a4ef34f0d41b51f34aedb9da1e0e488669aa322e",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a4ef34f0d41b51f34aedb9da1e0e488669aa322e",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a4ef34f0d41b51f34aedb9da1e0e488669aa322e",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a4ef34f0d41b51f34aedb9da1e0e488669aa322e/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "64df0a785f64167892da7bc751d052a41b57eb25",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/64df0a785f64167892da7bc751d052a41b57eb25",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/64df0a785f64167892da7bc751d052a41b57eb25"
            }
          ]
        },
        {
          "sha": "e70745567773fd6dffe801237d36b2e0543d0f7d",
          "node_id": "C_kwDOBDs4CNoAKGU3MDc0NTU2Nzc3M2ZkNmRmZmU4MDEyMzdkMzZiMmUwNTQzZDBmN2Q",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T20:01:50Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T20:01:50Z"
            },
            "message": "labs: take the ASan runtime from the toolset vcvars64.bat selects\n\nOn a runner with several MSVC toolsets the first clang_rt.asan_dynamic\nDLL found belonged to an older toolset than the compiler, and every ASan\nbuild ended with 0xC0000139 (entry point not found) in CI-host-checks.\nThe runtime now comes from VCToolsInstallDir of the selected toolset.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "4f49b4b63261823f0fca005d926faa7851a213c9",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/4f49b4b63261823f0fca005d926faa7851a213c9"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/e70745567773fd6dffe801237d36b2e0543d0f7d",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e70745567773fd6dffe801237d36b2e0543d0f7d",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e70745567773fd6dffe801237d36b2e0543d0f7d",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e70745567773fd6dffe801237d36b2e0543d0f7d/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "a4ef34f0d41b51f34aedb9da1e0e488669aa322e",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/a4ef34f0d41b51f34aedb9da1e0e488669aa322e",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/a4ef34f0d41b51f34aedb9da1e0e488669aa322e"
            }
          ]
        },
        {
          "sha": "b8974f506a0bdb9f6f4abd6cdb8aa01dbe474d03",
          "node_id": "C_kwDOBDs4CNoAKGI4OTc0ZjUwNmEwYmRiOWY2ZjRhYmQ2Y2RiOGFhMDFkYmU0NzRkMDM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T20:51:33Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T20:51:33Z"
            },
            "message": "ee_core: sample IGR from the VBLANK_END handler again\n\nReverts da6f6f53 (upstream PR #1762, \"poll IGR without VBLANK\ninterrupt\").\n\nProblem: since that change the IGR combo is watched by a thread of\npriority 127 that an EE alarm wakes. A game that always has a thread\nready to run at a higher priority never lets it run, so IGR does\nnothing in GTA San Andreas, NFS Most Wanted or PES (upstream issue\n#1787: Beta-2248 works, 2250 does not); only idle games such as RE4\nkeep it. RiptOPL reached the same conclusion on hardware and went back\nto the VBLANK_END handler (NathanNeurotic/Open-PS2-Loader 38481e9c).\n\nFix: the VBLANK_END interrupt handler OPL used before 2026-10-05, which\nsamples the pad in interrupt context and so cannot be starved.\n\nKnown cost: Fatal Fury: Battle Archives Volume 2 (SLUS-21723) needs\nCompatibility Mode 6 again, as before PR #1762.\n\nCheck: by reading (ee_core/src/padhook.c) and the CI build of the\nbranch igr-vblank-end; merged on the owner's decision before the\nconsole test. On the console: IGR in a busy game from USB, and Fatal\nFury BA2 with Mode 6.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "908a1bf6f03be4122a298694fc3c183649a32ae1",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/908a1bf6f03be4122a298694fc3c183649a32ae1"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b8974f506a0bdb9f6f4abd6cdb8aa01dbe474d03",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b8974f506a0bdb9f6f4abd6cdb8aa01dbe474d03",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b8974f506a0bdb9f6f4abd6cdb8aa01dbe474d03",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b8974f506a0bdb9f6f4abd6cdb8aa01dbe474d03/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "e70745567773fd6dffe801237d36b2e0543d0f7d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/e70745567773fd6dffe801237d36b2e0543d0f7d",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/e70745567773fd6dffe801237d36b2e0543d0f7d"
            }
          ]
        },
        {
          "sha": "95a99243608f33a408befde0982c12fc1997724d",
          "node_id": "C_kwDOBDs4CNoAKDk1YTk5MjQzNjA4ZjMzYTQwOGJlZmRlMDk4MmMxMmZjMTk5NzcyNGQ",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T20:51:34Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-22T20:51:34Z"
            },
            "message": "docs: list the IGR change in FORK.md\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "611bf8951cb86f16dc3a2f9aa33b937d2a3d37af",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/611bf8951cb86f16dc3a2f9aa33b937d2a3d37af"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/95a99243608f33a408befde0982c12fc1997724d",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/95a99243608f33a408befde0982c12fc1997724d",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/95a99243608f33a408befde0982c12fc1997724d",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/95a99243608f33a408befde0982c12fc1997724d/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b8974f506a0bdb9f6f4abd6cdb8aa01dbe474d03",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b8974f506a0bdb9f6f4abd6cdb8aa01dbe474d03",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b8974f506a0bdb9f6f4abd6cdb8aa01dbe474d03"
            }
          ]
        },
        {
          "sha": "09179482458c8e46002efc2305039c1e3140a197",
          "node_id": "C_kwDOBDs4CNoAKDA5MTc5NDgyNDU4YzhlNDYwMDJlZmMyMzA1MDM5YzFlMzE0MGExOTc",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T05:55:28Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T05:55:28Z"
            },
            "message": "usb: build usbd_mini from the ps2sdk sources from before the USBD rewrite\n\nProblem: since ps2sdk b1f7ff96 (\"USBD feature update\", merged 2024-09-24;\nOPL Beta-2127 and later) the embedded usbd_mini is a new, reverse-engineered\nUSBD 1.2 instead of FreeUsbd. With it Crash Bandicoot: The Wrath of Cortex\n(SLUS_202.38, SLES_503.86) takes up to five minutes to reach its menu from a\nUSB stick and then goes to a black screen, and GTA San Andreas loads slowly\n(upstream issue #1751). The reporter isolated it on PAL slims: the old\nusbd_mini with the current usbmass_bd_mini is enough to fix it. The root\ncause in the rewrite is unknown (ps2sdk issue #908: thirteen A/B builds of\nthe rewrite, none fixed it; its HCD bring-up alone explains the slow menu).\n\nFix: download_usbd.sh fetches iop/usb/usbd of ps2sdk 2dc6b32f (the parent\nof b1f7ff96: FreeUsbd 0.1.2, export table usbd 1.1) with a sparse, shallow,\nblobless fetch of about 0.5 MB, and modules/usb/usbd_mini builds\nusbd_mini.irx from it with -DMINI_DRIVER, as ps2sdk's iop/usb/usbd_mini did\nthen. The Makefile embeds that module instead of the SDK's usbd_mini.irx.\nusbmass_bd_mini, pademu, ds34usb and ds34bt stay the SDK's builds: they\nimport usbd 1.2, but the IOP links imports by major version only (loadcore\ncompLibMinVersion_major_1) and none of them uses the two entries added in\n1.2. The CI build logs the sizes and SHA-256 of both modules.\n\nOrigin: upstream PR #1752 by horizonends, which pins prebuilt binaries of\nboth USB modules; ps2sdk PR #911 takes the same approach inside ps2sdk and\nis not merged.\n\nBefore/after: the module runs on the IOP only, so this is checked by the\nCI build and the console. CI: the unpacked variant ELFs of this commit and\nof the previous release differ in the usbd module alone, plus the version\nstring. Console: Wrath of Cortex from USB (before: minutes to the menu,\nthen a black screen; after: about ten seconds, playable), the usual USB\ngames and PADEMU for regressions.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "1b8332f2180830bd0e52e7e13576c31ade10357f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/1b8332f2180830bd0e52e7e13576c31ade10357f"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/09179482458c8e46002efc2305039c1e3140a197",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/09179482458c8e46002efc2305039c1e3140a197",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/09179482458c8e46002efc2305039c1e3140a197",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/09179482458c8e46002efc2305039c1e3140a197/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "95a99243608f33a408befde0982c12fc1997724d",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/95a99243608f33a408befde0982c12fc1997724d",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/95a99243608f33a408befde0982c12fc1997724d"
            }
          ]
        },
        {
          "sha": "919f4ff98d4ca83990204540592a6b6bfcd1a53f",
          "node_id": "C_kwDOBDs4CNoAKDkxOWY0ZmY5OGQ0Y2E4Mzk5MDIwNDU0MDU5MmE2YjZiZmNkMWE1M2Y",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:02:35Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:02:35Z"
            },
            "message": "labs: list and compare the IOP modules embedded in an OPL ELF\n\nlabs/elfmods.py scans an unpacked OPL ELF (the OPNPS2LD-VARIANTS builds;\nOPNPS2LD.ELF is compressed by ps2-packer) for the embedded IRX modules and\nprints their size, module version, export table version and SHA-256. With\ntwo ELFs it compares the modules by position, since the module names are\nstripped from the embedded files, and reports whether the bytes outside the\nmodules differ.\n\nUsed to check the usbd_mini pin: of the 58 modules of the PADEMU variants\n(54 without PADEMU) exactly one differs between release 2360 and the branch\nbuild, the usbd module (26241 -> 21829 bytes, exports usbd 1.2 -> 1.1).\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "34ed484e9d53fc72c47b99c9967aac41b8167679",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/34ed484e9d53fc72c47b99c9967aac41b8167679"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/919f4ff98d4ca83990204540592a6b6bfcd1a53f",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/919f4ff98d4ca83990204540592a6b6bfcd1a53f",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/919f4ff98d4ca83990204540592a6b6bfcd1a53f",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/919f4ff98d4ca83990204540592a6b6bfcd1a53f/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "09179482458c8e46002efc2305039c1e3140a197",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/09179482458c8e46002efc2305039c1e3140a197",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/09179482458c8e46002efc2305039c1e3140a197"
            }
          ]
        },
        {
          "sha": "375bb6938375bbff42858d087cab6ab5a11a78fb",
          "node_id": "C_kwDOBDs4CNoAKDM3NWJiNjkzODM3NWJiZmY0Mjg1OGQwODdjYWI2YWI1YTExYTc4ZmI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:32:43Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:39:23Z"
            },
            "message": "mmce: build the MMCE IOP modules from ps2-mmce/mmceman\n\nProblem: games on MMCE memory-card emulators (SD2PSX, MemCard PRO 2,\nPSXMemCard Gen2) need the mmceman (menu), mmcedrv (in-game) and mmceigr\n(IGR) modules of ps2-mmce/mmceman. Neither ps2sdk nor ps2sdk-ports carries\nthem, and the ps2-mmce OPL fork expects prebuilt files in $(PS2SDK)/iop/irx\nthat the public toolchain image does not have.\n\nFix: download_mmce.sh fetches mmceman, mmcedrv and mmceigr of\nps2-mmce/mmceman at de28936 (2026-08-01: the SIO2MAN hook rewritten for\ntoday's ps2sdk sio2man, cccc366, plus the \"don't block mc1\" change) with a\nsparse, shallow, blobless fetch, and the Makefile builds the three modules\nwith the repository's own Makefiles and embeds them (mmceman.o, mmcedrv.o,\nmmceigr.o). Nothing uses them yet and --gc-sections drops the unused\narrays, so the ELF does not change. The build job logs their sizes, SHA-256\nand the source commit. CREDITS carries the MIT notice of mmceman; its\nSIO2MAN hook is Maximus32's AFL-2.0 code from the MX4SIO driver.\n\nOrigin: ps2-mmce/Open-PS2-Loader branch mmce_support (bcc23d2 and later, by\nqnox32 and BBsan), which embeds the same modules as prebuilt binaries. This\nfork builds them from source at a pin, as it does for usbd_mini.\n\nBefore/after: CI only. Before: no MMCE module in the tree. After: the three\nmodules build in the ps2homebrew image (sizes in the build log) and the\nloadable segments of the variant ELFs differ from the previous build by the version string alone\n(labs/elfmods.py).\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "5fc55e8ea832f91ba9fb33a4fb6ffd3b08b05e9f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/5fc55e8ea832f91ba9fb33a4fb6ffd3b08b05e9f"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/375bb6938375bbff42858d087cab6ab5a11a78fb",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/375bb6938375bbff42858d087cab6ab5a11a78fb",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/375bb6938375bbff42858d087cab6ab5a11a78fb",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/375bb6938375bbff42858d087cab6ab5a11a78fb/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "919f4ff98d4ca83990204540592a6b6bfcd1a53f",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/919f4ff98d4ca83990204540592a6b6bfcd1a53f",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/919f4ff98d4ca83990204540592a6b6bfcd1a53f"
            }
          ]
        },
        {
          "sha": "fda97f71983a11404a503ca75cf8c8e9760d3151",
          "node_id": "C_kwDOBDs4CNoAKGZkYTk3ZjcxOTgzYTExNDA0YTUwM2NhNzVjZjhjOGU5NzYwZDMxNTE",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:39:24Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:39:24Z"
            },
            "message": "mmce: CDVDMAN back-end that reads the ISO through mmcedrv\n\nProblem: in game, a title on an MMCE memory-card emulator has to read its\nISO from the card over SIO2; OPL's CDVDMAN has no back-end for that.\n\nFix: mmce_cdvdman.irx (USE_MMCE) with device-mmce.c, ported from the\nps2-mmce/Open-PS2-Loader branch mmce_support (qnox32, BBsan). The menu\nopens the ISO on the card and stores the card's own descriptor and the SIO2\nport in cdvdman_settings_mmce; DeviceFSInit() resolves the mmcedrv.irx\nexports and waits for the card to answer with the ISO's size;\nDeviceReadSectors() reads 2048-byte sectors with mmcedrv_read_sector().\nHardening from RiptOPL (NathanNeurotic/Open-PS2-Loader 09618a06, b5df7836)\nin the smallest form: the driver's size is s64 (a -1 no longer passes as\na 4 GiB image), a missing driver or a card that does not answer within\n10 s fails the reads instead of calling garbage pointers or waiting\nforever, a read that succeeds on a retry is a success (the fork judged the\nretry counter), the ACK wait and the alarms keep the driver's defaults\ninstead of the fork's 0/0, and unaligned buffers (the ZSO reader) go\nthrough the aligned bounce buffer of the BDM back-end (upstream #1783),\nbecause the driver DMAs into the buffer. Sector numbers travel as 24 bits,\nso reads beyond 32 GiB fail. Nothing embeds the module yet.\n\nOrigin: ps2-mmce/Open-PS2-Loader bcc23d2, c167605 and 7e5995e; RiptOPL as\nabove; upstream 9768fbfc for the bounce buffer.\n\nBefore/after: the module runs on the IOP only, so this is checked by the\nCI build and later on the console. Host checks unchanged.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "576979c713122afce118ea4ae91333c486814545",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/576979c713122afce118ea4ae91333c486814545"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/fda97f71983a11404a503ca75cf8c8e9760d3151",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/fda97f71983a11404a503ca75cf8c8e9760d3151",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/fda97f71983a11404a503ca75cf8c8e9760d3151",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/fda97f71983a11404a503ca75cf8c8e9760d3151/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "375bb6938375bbff42858d087cab6ab5a11a78fb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/375bb6938375bbff42858d087cab6ab5a11a78fb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/375bb6938375bbff42858d087cab6ab5a11a78fb"
            }
          ]
        },
        {
          "sha": "b83aee5b56d9e7f66297c31cedc18b70dd3b42f3",
          "node_id": "C_kwDOBDs4CNoAKGI4M2FlZTViNTZkOWU3ZjY2Mjk3YzMxY2VkYzE4YjcwZGQzYjQyZjM",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:39:24Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:39:24Z"
            },
            "message": "labs: compare the loadable segments of two OPL ELFs, not the whole files\n\nThe unpacked variant ELFs carry debug sections whose offsets and line\ntables change with every edit of a shared header, so a byte comparison of\nthe files found thousands of differences between builds whose code is the\nsame. elfmods.py now compares the bytes of the PT_LOAD segments that lie\noutside the embedded modules, which is what the console loads, and prints\nthe differing runs instead of the whole stretch between the first and the\nlast one.\n\nCheck: release 2362 against the first mmce build (3ec0a988, which only\nadds unused modules): 58 identical modules, loadable bytes differ in the\ntwo version strings alone (16 bytes in 2 runs).\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "189d376fad0d7b94fd4b76a6de24a431204fc55b",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/189d376fad0d7b94fd4b76a6de24a431204fc55b"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b83aee5b56d9e7f66297c31cedc18b70dd3b42f3",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b83aee5b56d9e7f66297c31cedc18b70dd3b42f3",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b83aee5b56d9e7f66297c31cedc18b70dd3b42f3",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b83aee5b56d9e7f66297c31cedc18b70dd3b42f3/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "fda97f71983a11404a503ca75cf8c8e9760d3151",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/fda97f71983a11404a503ca75cf8c8e9760d3151",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/fda97f71983a11404a503ca75cf8c8e9760d3151"
            }
          ]
        },
        {
          "sha": "4181972504f65ecc664fdf715b2aec02130dd1fb",
          "node_id": "C_kwDOBDs4CNoAKDQxODE5NzI1MDRmNjVlY2M2NjRmZGY3MTViMmFlYzAyMTMwZGQxZmI",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:42:16Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:42:16Z"
            },
            "message": "ee_core: MMCE game mode, its module IDs and the IGR switch to the boot card\n\nProblem: the EE core did not know games on an MMCE memory-card emulator:\nno mode, no slot for the in-game driver and the IGR module in the module\ntable, and nothing to send the card back to its boot card on IGR.\n\nFix: MMCE_MODE in the game modes (parsed from \"MMCE_MODE\"), the module IDs\nOPL_MODULE_ID_MMCEDRV and OPL_MODULE_ID_MMCEIGR, mmcedrv loaded after every\nIOP reset in MMCE_MODE (after the SDK sio2man, which its SIO2MAN hook\nneeds), and MMCEIGRSettings in the core configuration: on IGR, after\nRESETSPU, the single-shot mmceigr module is loaded with one character per\nmemory-card slot ('1' to switch that card back to its boot card). The fork\nbuilt that argument by writing into the string literal \"00\"; it is an\narray here, passed with its terminator.\n\nOrigin: ps2-mmce/Open-PS2-Loader bcc23d2 and d4160d4 (qnox32).\n\nBefore/after: compiled in CI only; nothing selects MMCE_MODE yet, so the\nconsole behaviour is unchanged until the device module lands.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "41ca64ca2026bc22b4c488c3b4762f96057e7488",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/41ca64ca2026bc22b4c488c3b4762f96057e7488"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/4181972504f65ecc664fdf715b2aec02130dd1fb",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4181972504f65ecc664fdf715b2aec02130dd1fb",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4181972504f65ecc664fdf715b2aec02130dd1fb",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4181972504f65ecc664fdf715b2aec02130dd1fb/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "b83aee5b56d9e7f66297c31cedc18b70dd3b42f3",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b83aee5b56d9e7f66297c31cedc18b70dd3b42f3",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b83aee5b56d9e7f66297c31cedc18b70dd3b42f3"
            }
          ]
        },
        {
          "sha": "1046d006eaa18c2ec2642cdd7b170d572fbdccdf",
          "node_id": "C_kwDOBDs4CNoAKDEwNDZkMDA2ZWFhMThjMmVjMjY0MmNkZDdiMTcwZDU3MmZiZGNjZGY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:49:01Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:55:57Z"
            },
            "message": "mmce: the MMCE device: game list, settings and launch\n\nProblem: OPL cannot list or start games stored on an MMCE memory-card\nemulator (SD2PSX, MemCard PRO 2, PSXMemCard Gen2), although the card's SD\ncard holds the usual CD/DVD/ART/CFG folders and the mmceman modules exist.\n\nFix: a new device MMCE_MODE, ported from the ps2-mmce/Open-PS2-Loader\nbranch mmce_support (qnox32, BBsan) onto today's code. src/mmcesupport.c\nlists the games of mmce0:/ or mmce1:/ (memory-card slot 1 or 2; \"Auto\"\ntakes the first port that answers a ping) with the common support-base\ncode, and at launch opens the image on the card, asks mmceman for the\ncard's own descriptor (ioctl2 0x80), fills cdvdman_settings_mmce (port,\ndescriptor, media size, layer 1) and starts the game in MMCE_MODE with\nmmce_cdvdman; the SDK sio2man is packed as for every game, mmcedrv for MMCE\ngames, and mmceigr whenever IGR has to switch a card back to its boot card.\nSettings: start mode, slot, IGR slot(s) and a folder prefix (Settings ->\nMMCE Settings; keys mmce_mode, mmce_slot, mmceigr_slot, mmce_prefix).\n\nDifferences from the fork: the user's prefix is part of the path from the\nfirst scan and always ends with a slash; the card is looked for once, not\npinged on every refresh of the list; mmceman is loaded once; mediaLsnCount\nis filled and the three-argument sbLoadCheats() is used, as the other\ndevices do since the fork's base; a game split into parts is refused with\na message (the driver gets one descriptor); a configured VMC is announced\nas not used yet; no mmcesio2 module (no source exists, the menu runs on\nthe SDK freesio2); only the device's icon is taken, not the fork's set of\nreplacement icons. The Game ID push and the IGR default follow in their\nown commits.\n\nOrigin: ps2-mmce/Open-PS2-Loader bcc23d2, 656292c, f90fc8d, d4160d4 and\nbb415d2 (qnox32, BBsan); the load guard and the prefix handling follow\nRiptOPL ea6224a0 and wOPL 0c9d14a.\n\nBefore/after: host checks unchanged (the list code is the shared support\nbase). The rest runs on the console only: before, no MMCE device; after,\nthe owner's card lists its games and starts an ISO.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "f7273b0b1fa4842e1e9e8a000df322eb82d3eee9",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/f7273b0b1fa4842e1e9e8a000df322eb82d3eee9"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/1046d006eaa18c2ec2642cdd7b170d572fbdccdf",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1046d006eaa18c2ec2642cdd7b170d572fbdccdf",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/1046d006eaa18c2ec2642cdd7b170d572fbdccdf",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1046d006eaa18c2ec2642cdd7b170d572fbdccdf/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "4181972504f65ecc664fdf715b2aec02130dd1fb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/4181972504f65ecc664fdf715b2aec02130dd1fb",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/4181972504f65ecc664fdf715b2aec02130dd1fb"
            }
          ]
        },
        {
          "sha": "27bdbdeb3308830082cb88a85efb77b15974fe57",
          "node_id": "C_kwDOBDs4CNoAKDI3YmRiZGViMzMwODgzMDA4MmNiODhhODVlZmI3N2IxNTk3NGZlNTc",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:51:14Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:55:57Z"
            },
            "message": "mmce: build switch for the console A/B of the in-game SIO2MAN\n\nProblem: the central risk of MMCE support is the pairing of the in-game\ndriver with the SIO2MAN module. OPL packs the SDK sio2man into every game\nsince upstream #1785, and the mmceman modules of 2026-06 (cccc366) hook\nonly that sio2man; RiptOPL reports instead that its stock 2025 driver\nblack-screens after the PS2 logo with the SDK sio2man loaded first and\nskips it for MMCE games (11a5150e). Nobody has reported the pairing this\nfork ships (modules of 2026-08 plus the SDK sio2man) on hardware.\n\nFix: keep upstream's module set as the default and make the alternative a\nbuild switch: make MMCE_NO_SDK_SIO2MAN=1 leaves the SDK sio2man and mcemu\nout of MMCE games (they keep the game's own SIO2MAN, VMC and PADEMU would\nhook it) and marks the version with -nosio2man. The CI-compile workflow\ntakes extra make arguments on a manual run, so both builds come from the\nsame commit for the console A/B.\n\nOrigin: RiptOPL 11a5150e for the alternative; the decision is in the kb\nplan (variant (b) first, (a) for the A/B).\n\nBefore/after: a push build is unchanged (the switch is off). The console\ndecides: if the default build black-screens after the PS2 logo on an MMCE\ngame, the -nosio2man build of the same commit is the comparison.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "2261e7c437c3b6b1e0acc1d93268085c5f92efcb",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/2261e7c437c3b6b1e0acc1d93268085c5f92efcb"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/27bdbdeb3308830082cb88a85efb77b15974fe57",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/27bdbdeb3308830082cb88a85efb77b15974fe57",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/27bdbdeb3308830082cb88a85efb77b15974fe57",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/27bdbdeb3308830082cb88a85efb77b15974fe57/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "1046d006eaa18c2ec2642cdd7b170d572fbdccdf",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/1046d006eaa18c2ec2642cdd7b170d572fbdccdf",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/1046d006eaa18c2ec2642cdd7b170d572fbdccdf"
            }
          ]
        },
        {
          "sha": "243ed9776a5520c9f29e3074cd51e4731926cf46",
          "node_id": "C_kwDOBDs4CNoAKDI0M2VkOTc3NmE1NTIwYzlmMjllMzA3NGNkNTFlNDczMTkyNmNmNDY",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:57:05Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:57:05Z"
            },
            "message": "mmce: send the game ID to the MMCE card after the last memory-card write\n\nProblem: an MMCE card keeps one virtual memory card per game and switches\nto it when told which game starts. The ps2-mmce fork sends the ID only\nfor games on the card, before deinit(), and then OPL still writes the OSD\nhistory record to mc0: inside sysLaunchLoaderElf(): that write lands on\nthe game's card instead of the boot card. It also waits up to 15 x 1 s.\n\nFix: mmceSendGameID() runs from sysLaunchLoaderElf() right after the OSD\nhistory record, so every memory-card write of the launch (last played,\nper-game settings, history) precedes the switch, and for games on every\ndevice (USB, MX4SIO, MMCE): the boot file name without path and version\ngoes to each port that answered a ping (pinged once per session), with\nwOPL's bounded wait (200 ms, then up to 20 x 100 ms polling the busy bit).\nSetting \"Send the game ID to the card\" (mmce_gameid, default on) in the\nMMCE settings; mmceman is loaded for it when the MMCE device is off.\n\nOrigin: ps2-mmce/Open-PS2-Loader 949c734 and 97acabd (devctl 0x8 and the\nbusy poll); wOPL dca04cf (bound and all devices); the order relative to\nthe history record is this fork's.\n\nBefore/after: console only. Before: the card does not switch for USB and\nMX4SIO games, and for MMCE games the OSD history of the launch goes to the\ngame's card. After: the card shows the game's card from the launch on,\nand the boot card keeps the history and settings.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "d221c7df1600975c63ff24ffc4bf0e66f2008f13",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/d221c7df1600975c63ff24ffc4bf0e66f2008f13"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/243ed9776a5520c9f29e3074cd51e4731926cf46",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/243ed9776a5520c9f29e3074cd51e4731926cf46",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/243ed9776a5520c9f29e3074cd51e4731926cf46",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/243ed9776a5520c9f29e3074cd51e4731926cf46/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "27bdbdeb3308830082cb88a85efb77b15974fe57",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/27bdbdeb3308830082cb88a85efb77b15974fe57",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/27bdbdeb3308830082cb88a85efb77b15974fe57"
            }
          ]
        },
        {
          "sha": "33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "node_id": "C_kwDOBDs4CNoAKDMzYTJiMTlhOGFmYTM3YjUwMDE1ZWViMTQxNGY1NzViMjI3MGFjN2Q",
          "commit": {
            "author": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:58:24Z"
            },
            "committer": {
              "name": "Roman Kelesidis",
              "email": "roman25052006.kelesh@gmail.com",
              "date": "2026-10-23T06:58:24Z"
            },
            "message": "mmce: IGR switches back the card(s) that answered, not both slots by default\n\nProblem: the ps2-mmce fork defaults the IGR setting to \"both slots\", so on\nevery IGR the single-shot mmceigr module sends raw MMCE commands to both\nmemory-card ports. With an MX4SIO in the other slot that is a transfer\nthat times out on each IGR, and the module is packed into kernel RAM for\nevery game whether or not an MMCE card is present.\n\nFix: a new value \"Auto\" of the IGR slot setting, the default: the slots\nto switch are the ones where an MMCE card answered the ping (probed once\nper session), mmceIGRSlots(). mmceigr is packed and MMCEIGRSettings set\nonly when that is not empty; the explicit values 1, 2 and Both still work\nas before.\n\nOrigin: the mechanism is the fork's (d4160d4); the default is this fork's,\nafter the MX4SIO sharing note in the kb plan.\n\nBefore/after: console only. Before: IGR with an MX4SIO in slot 2 waits\nfor a timed-out transfer on port 3; after: only the card's slot is\naddressed. The user's PSXMemCard Gen2 sits in slot 1, the MX4SIO in slot 2.\n\nCo-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>",
            "tree": {
              "sha": "ec0818e3ac3aa66a82114299f336dfe0ee0a9238",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/ec0818e3ac3aa66a82114299f336dfe0ee0a9238"
            },
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/33a2b19a8afa37b50015eeb1414f575b2270ac7d",
            "comment_count": 0,
            "verification": {
              "verified": false,
              "reason": "unsigned",
              "signature": null,
              "payload": null,
              "verified_at": null
            }
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/33a2b19a8afa37b50015eeb1414f575b2270ac7d/comments",
          "author": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "committer": {
            "login": "belomaxorka",
            "id": 54049465,
            "node_id": "MDQ6VXNlcjU0MDQ5NDY1",
            "avatar_url": "https://avatars.githubusercontent.com/u/54049465?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/belomaxorka",
            "html_url": "https://github.com/belomaxorka",
            "followers_url": "https://api.github.com/users/belomaxorka/followers",
            "following_url": "https://api.github.com/users/belomaxorka/following{/other_user}",
            "gists_url": "https://api.github.com/users/belomaxorka/gists{/gist_id}",
            "starred_url": "https://api.github.com/users/belomaxorka/starred{/owner}{/repo}",
            "subscriptions_url": "https://api.github.com/users/belomaxorka/subscriptions",
            "organizations_url": "https://api.github.com/users/belomaxorka/orgs",
            "repos_url": "https://api.github.com/users/belomaxorka/repos",
            "events_url": "https://api.github.com/users/belomaxorka/events{/privacy}",
            "received_events_url": "https://api.github.com/users/belomaxorka/received_events",
            "type": "User",
            "user_view_type": "public",
            "site_admin": false
          },
          "parents": [
            {
              "sha": "243ed9776a5520c9f29e3074cd51e4731926cf46",
              "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/243ed9776a5520c9f29e3074cd51e4731926cf46",
              "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/243ed9776a5520c9f29e3074cd51e4731926cf46"
            }
          ]
        }
      ],
      "files": [
        {
          "sha": "e7512aefc306fcd66262460b702129ddd6d869f5",
          "filename": ".clang-format-ignore",
          "status": "modified",
          "additions": 2,
          "deletions": 0,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/.clang-format-ignore",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/.clang-format-ignore",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/.clang-format-ignore?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -2,3 +2,5 @@\n ./modules/isofs/lz4.h\n ./modules/network/lwNBD\n ./thirdparty/clang-format-lint-action\n+./modules/usb/usbd_mini/ps2sdk\n+./modules/mmce/mmceman"
        },
        {
          "sha": "62b0701118f38474b3c0ba4405459d01877000a2",
          "filename": ".github/workflows/compilation.yml",
          "status": "modified",
          "additions": 49,
          "deletions": 3,
          "changes": 52,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/.github%2Fworkflows%2Fcompilation.yml",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/.github%2Fworkflows%2Fcompilation.yml",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/.github%2Fworkflows%2Fcompilation.yml?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -4,6 +4,11 @@ on:\n   push:\n   pull_request:\n   workflow_dispatch:\n+    inputs:\n+      make_args:\n+        description: 'Extra arguments for the main build, e.g. MMCE_NO_SDK_SIO2MAN=1 (the A/B build for MMCE)'\n+        required: false\n+        default: ''\n   repository_dispatch:\n     types: [run_build]\n \n@@ -20,7 +25,19 @@ jobs:\n         git fetch --prune --unshallow\n \n     - name: Compile -> make clean release\n-      run: make --trace clean release\n+      run: make --trace clean release ${{ inputs.make_args }}\n+\n+    - name: Report the embedded USBD (built from pre-rewrite ps2sdk sources, see FORK.md)\n+      run: |\n+        ls -l modules/usb/usbd_mini/usbd_mini.irx \"$PS2SDK/iop/irx/usbd_mini.irx\"\n+        sha256sum modules/usb/usbd_mini/usbd_mini.irx \"$PS2SDK/iop/irx/usbd_mini.irx\"\n+        git -C modules/usb/usbd_mini/ps2sdk log -1 --format='ps2sdk USBD sources: %H (%cs)'\n+\n+    - name: Report the MMCE modules (built from ps2-mmce/mmceman, see FORK.md)\n+      run: |\n+        ls -l modules/mmce/mmceman/mmceman/irx/mmceman.irx modules/mmce/mmceman/mmcedrv/irx/mmcedrv.irx modules/mmce/mmceman/mmceigr/irx/mmceigr.irx\n+        sha256sum modules/mmce/mmceman/mmceman/irx/mmceman.irx modules/mmce/mmceman/mmcedrv/irx/mmcedrv.irx modules/mmce/mmceman/mmceigr/irx/mmceigr.irx\n+        git -C modules/mmce/mmceman log -1 --format='mmceman sources: %H (%cs)'\n \n     - name: Create detailed changelog\n       run: sh ./make_changelog.sh\n@@ -164,6 +181,10 @@ jobs:\n   release:\n     needs: [build, build-variants, build-lang]\n     runs-on: ubuntu-latest\n+    permissions:\n+      contents: write\n+    concurrency:\n+      group: release-${{ github.ref }}\n     if: startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/master'\n     env:\n       USERNAME: ${{ secrets.USERNAME }}\n@@ -194,8 +215,33 @@ jobs:\n         cp -f OPNPS2LD-LANGS-${{ env.OPL_VERSION }}.7z OPNPS2LD-LANGS.7z\n         cp -f OPNPS2LD/OPNPS2LD-${{ env.OPL_VERSION }}.ELF OPNPS2LD.ELF\n \n+    - name: Publish the fork's rolling pre-release\n+      if: github.repository != 'ps2homebrew/Open-PS2-Loader' && github.ref == 'refs/heads/master'\n+      env:\n+        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n+      run: |\n+        # A run that GitHub delays or retries may finish after a newer one: only the tip of master is published.\n+        tip=$(git ls-remote origin refs/heads/master | cut -f1)\n+        if [ \"$tip\" != \"$GITHUB_SHA\" ]; then\n+          echo \"master is at $tip now, not publishing the build of $GITHUB_SHA\"\n+          exit 0\n+        fi\n+        files=\"OPNPS2LD.ELF OPNPS2LD-${{ env.OPL_VERSION }}.7z OPNPS2LD-VARIANTS-${{ env.OPL_VERSION }}.7z OPNPS2LD-LANGS-${{ env.OPL_VERSION }}.7z\"\n+        sha256sum $files > SHA256SUMS\n+        cat SHA256SUMS\n+        gh release delete latest --repo \"$GITHUB_REPOSITORY\" --cleanup-tag --yes || true\n+        git push --delete origin latest || true\n+        {\n+          echo \"Automatic YAOPL (Yet Another Open PS2 Loader) build of ${{ env.OPL_VERSION }} from $GITHUB_SHA.\"\n+          echo\n+          echo \"Not an official OPL build: see FORK.md for what differs from upstream OPL.\"\n+          echo \"SHA-256 checksums of the files are in SHA256SUMS.\"\n+        } > notes.md\n+        gh release create latest $files SHA256SUMS --repo \"$GITHUB_REPOSITORY\" --prerelease \\\n+          --target \"$GITHUB_SHA\" --title \"${{ env.OPL_VERSION }}\" --notes-file notes.md\n+\n     - name: Create prerelease\n-      if: github.ref == 'refs/heads/master'\n+      if: github.repository == 'ps2homebrew/Open-PS2-Loader' && github.ref == 'refs/heads/master'\n       uses: mathieucarbou/marvinpinto-action-automatic-releases@latest\n       with:\n         repo_token: \"${{ secrets.GITHUB_TOKEN }}\"\n@@ -212,7 +258,7 @@ jobs:\n           OPNPS2LD.ELF\n \n     - name: Create release\n-      if: startsWith(github.ref, 'refs/tags/v')\n+      if: github.repository == 'ps2homebrew/Open-PS2-Loader' && startsWith(github.ref, 'refs/tags/v')\n       uses: mathieucarbou/marvinpinto-action-automatic-releases@latest\n       with:\n         repo_token: \"${{ secrets.GITHUB_TOKEN }}\""
        },
        {
          "sha": "07aa9e7354a25070ae053baad24ba05574a6a8c1",
          "filename": ".github/workflows/host-checks.yml",
          "status": "added",
          "additions": 16,
          "deletions": 0,
          "changes": 16,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/.github%2Fworkflows%2Fhost-checks.yml",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/.github%2Fworkflows%2Fhost-checks.yml",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/.github%2Fworkflows%2Fhost-checks.yml?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,16 @@\n+name: CI-host-checks\n+\n+on:\n+  push:\n+  pull_request:\n+  workflow_dispatch:\n+\n+jobs:\n+  host-checks:\n+    runs-on: windows-latest\n+    steps:\n+    - name: git checkout\n+      uses: actions/checkout@v4\n+\n+    - name: Host checks (MSVC with AddressSanitizer) against the expected results\n+      run: powershell -ExecutionPolicy Bypass -File labs\\host-repro\\run_all.ps1 -Expected labs\\host-repro\\expected.txt"
        },
        {
          "sha": "37f8be81ca3fd42f7f58503fcc23862113f92547",
          "filename": ".gitignore",
          "status": "modified",
          "additions": 2,
          "deletions": 0,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/.gitignore",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/.gitignore",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/.gitignore?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -54,3 +54,5 @@ lng/lang_*.lng\n src/lang_internal.c\n include/lang_autogen.h\n tmp/\n+*modules/usb/usbd_mini/ps2sdk\n+*modules/mmce/mmceman"
        },
        {
          "sha": "82d04f0acfd9393739e7083bc8e5a0cb02c9468b",
          "filename": "CLAUDE.md",
          "status": "added",
          "additions": 50,
          "deletions": 0,
          "changes": 50,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/CLAUDE.md",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/CLAUDE.md",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/CLAUDE.md?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,50 @@\n+# CLAUDE.md \u2014 YAOPL agent rules\n+\n+YAOPL (Yet Another Open PS2 Loader) is our fork of Open PS2 Loader that we develop ourselves. Users install the\n+ELF that CI publishes from `master`. Its PC-side companion is YAOPLM (Yet Another OPL Manager), a separate project.\n+\n+Read before working: `FORK.md` (what differs from upstream and why), `README.md` (header), `CONTRIBUTING.md`\n+(upstream's code rules), `labs/host-repro/README.md`. If the local knowledge base `kb/` exists, start with\n+`kb/README.md` and `kb/ROADMAP.md`.\n+\n+## Knowledge base\n+- `kb/` is local only: it is listed in `.git/info/exclude` and must never be committed or pushed, to our GitHub or\n+  upstream. Do not `git add -f` it.\n+- Keep it current: `ROADMAP.md` (what is next), `DECISIONS.md` (new decisions as ADRs), `HISTORY.md` (major steps),\n+  `TESTING.md`, and `research/` for findings. Core docs are in Russian, `research/` in English.\n+\n+## Communication\n+- Talk to the user in **Russian**. They own the project and test on a real PS2.\n+- Write code, comments, commit messages and public docs in **English**.\n+- After a set of fixes, give the user a short Russian checklist of what to test on the console.\n+\n+## Rules\n+1. **Licence.** YAOPL is AFL-3.0 like OPL. Never copy code from YAOPLM (GPL-3.0) into YAOPL, or the other way.\n+2. **`master` is the release.** Every push to `master` publishes the public `latest` pre-release. Push only\n+   finished, checked work. Prepare bigger changes on a short-lived branch and delete it after the merge.\n+   Only the build of master's tip is published: a commit that does not change the ELF (`labs/`, docs) may say\n+   `[skip ci]`, but push it only after the running build has published, or that build is not released.\n+3. **Keep `FORK.md` current.** Every fix or behaviour change updates the table in `FORK.md` (area, fix, origin)\n+   in the same push. Update the README header if what YAOPL is or how to get it changes.\n+4. **One fix per commit.** Subject `<component>: <summary>`. The body states the problem, the fix, its origin\n+   (credit the RiptOPL commit for ported fixes) and the reproduction with the result before and after.\n+5. **Check every fix** (details in `FORK.md`, \"How fixes are checked\"):\n+   - reproduce on an upstream tree first (`labs/host-repro/run_all.ps1 -Opl <tree>`, or a console test);\n+   - rerun the same check after the fix, then all checks for regressions;\n+   - format with clang-format 12 (`make format`, or the `clang-format` 12.0.1 Python wheel on Windows);\n+   - the GitHub Actions build must pass; then the user tests on the console.\n+   Host checks do not emulate the PS2. Say so when a fix is only checked on the host or only by reading code.\n+6. **RiptOPL and other forks are sources of candidates, not truth.** Check each change against upstream code:\n+   take real bugs and zero-risk hardening, in the smallest form; skip speculative or behaviour-changing ones.\n+7. **Small, upstream-shaped diffs**, so merging upstream stays easy. Fix GCC warnings.\n+8. **Upstream contributions** (issues, PRs to ps2homebrew) only when the user asks.\n+9. **Repository settings** (Actions, Pages, branch rules, releases) and anything posted publicly: ask first.\n+10. **User data and devices.** Never write to the user's removable drives without a plan and an explicit OK.\n+    Test data lives in `D:\\yaoplm-testdata\\` (reference clones in `refs\\`, console test files in\n+    `opl-fork-tests\\`); write on D: only there.\n+\n+## Commands\n+- Host checks: `powershell -ExecutionPolicy Bypass -File labs\\host-repro\\run_all.ps1 [-Opl <tree>] [-Only cheat,cfg,...] [-Images <dir of .iso>]`\n+- Console test files: `python labs/host-repro/make_console_kit.py <bootable.iso> <out dir>`\n+- CI: `gh run list -R belomaxorka/yaopl`, `gh workflow run compilation.yml -R belomaxorka/yaopl --ref master`\n+- Upstream sync: see `FORK.md`, \"Pulling in upstream changes\"."
        },
        {
          "sha": "aa60905b8b3433330d0e0d9ba52f0437cc06713e",
          "filename": "CREDITS",
          "status": "modified",
          "additions": 26,
          "deletions": 0,
          "changes": 26,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/CREDITS",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/CREDITS",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/CREDITS?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -49,3 +49,29 @@ by Eric Young (eay@mincom.oz.au)\n \n CI/CD Implementation using Dockers and GiHubActions\n by fjtrujy\n+\n+MMCE modules (mmceman, mmcedrv, mmceigr) built from ps2-mmce/mmceman\n+by qnox32, bbsan2k and the MMCE authors; their SIO2MAN hook comes from Maximus32 (MX4SIO driver, AFL 2.0).\n+The modules are MIT licensed; this is their notice:\n+\n+MIT License\n+\n+Copyright (c) 2024 MMCE Authors\n+\n+Permission is hereby granted, free of charge, to any person obtaining a copy\n+of this software and associated documentation files (the \"Software\"), to deal\n+in the Software without restriction, including without limitation the rights\n+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+copies of the Software, and to permit persons to whom the Software is\n+furnished to do so, subject to the following conditions:\n+\n+The above copyright notice and this permission notice shall be included in all\n+copies or substantial portions of the Software.\n+\n+THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n+SOFTWARE."
        },
        {
          "sha": "d61999c71e196cab3889cc664debe68bc82c5333",
          "filename": "FORK.md",
          "status": "added",
          "additions": 122,
          "deletions": 0,
          "changes": 122,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/FORK.md",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/FORK.md",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/FORK.md?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,122 @@\n+# YAOPL and upstream OPL\n+\n+YAOPL (Yet Another Open PS2 Loader) is a fork of [Open PS2 Loader](https://github.com/ps2homebrew/Open-PS2-Loader)\n+that continues its development. It follows upstream and adds fixes for crashes, hangs, memory errors and data\n+loss that OPL hits on malformed or unusual files: cheat files, ISO and ZSO images, `SYSTEM.CNF`, `ul.cfg`,\n+`games.bin`, configuration files and VMCs. It is not an official OPL build. The licence is the same as\n+upstream's (AFL-3.0, see `LICENSE`).\n+\n+## Getting a build\n+\n+Every push to `master` builds OPL in GitHub Actions and replaces the `latest` pre-release of this\n+repository: the ELF (`OPNPS2LD.ELF`), the upstream-style 7z packages and `SHA256SUMS`. Check a\n+download with `sha256sum -c SHA256SUMS` (Linux) or compare `Get-FileHash <file>` (Windows).\n+Only the build of the current tip of `master` is published.\n+\n+YAOPL builds carry the suffix `-yaopl` in their version string (`LOCALVERSION` in the `Makefile`),\n+for example `v1.2.0-Beta-2310-1a2b3c4-yaopl`. The revision number counts this fork's commits, so it\n+does not match upstream's numbering.\n+\n+## What differs from upstream\n+\n+| Area | Fix | Origin |\n+|---|---|---|\n+| Cheats | A comment line with leading blanks no longer becomes a cheat with an empty name | this fork |\n+| Cheats | The 251st cheat is no longer written past the cheat table | this fork; overflow found by RiptOPL |\n+| Cheats | `make_code()` no longer writes one byte past `digits[]` for every code | RiptOPL |\n+| Cheats | A last line without LF is no longer read past the end of the buffer or copied past `line[]` | RiptOPL |\n+| Cheats | Remembered picks of cheats that share a name survive a reload | RiptOPL |\n+| ISO | A directory record with an empty name no longer hangs the game list or the game | this fork |\n+| ISO | The record length is read as one byte; an extended attribute length no longer derails the scan | this fork |\n+| ISO | In-game lookups no longer overflow `cdvdman_curdir[15]` on names longer than 14 characters | this fork |\n+| ISO | `cdvdman_findfile()` no longer copies from address 1 or past the 16-byte name | RiptOPL (isofs), this fork (in-game) |\n+| ZSO | A header with `align` above 11 is rejected instead of dividing by zero | this fork |\n+| In-game | 2340-byte sector reads no longer write past the game's buffer | RiptOPL |\n+| `SYSTEM.CNF` | `BOOT2` without `=` no longer passes NULL to the parser | RiptOPL C++ edition |\n+| `ul.cfg` | A partial record at the end is ignored instead of written past the game list | RiptOPL C++ edition |\n+| `ul.cfg` | `USBA_crc32()` hashes names as unsigned bytes (non-ASCII titles), also in `pc/` tools | RiptOPL |\n+| `games.bin` | Each listed game is looked up in the whole cache, without reading past it | this fork |\n+| Game list | `isValidIsoName()` no longer reads before short names such as `..` | RiptOPL |\n+| Config files | A CFG, theme or language file whose last line is a `#` comment without LF no longer crashes OPL | this fork |\n+| Config files | A read error (device removed) ends the file instead of corrupting memory | RiptOPL |\n+| Config files | Keys of 32+ and values of 256+ characters are cut and terminated | RiptOPL |\n+| Config files | A long line without `=` no longer overflows the prefix buffer | RiptOPL |\n+| Settings | A failed save (e.g. full memory card) is reported instead of \"Settings saved\" | RiptOPL |\n+| Settings | Looking for a USB device to save to no longer empties its `conf_opl.cfg` (upstream issue #1397) | this fork; RiptOPL has the same change |\n+| Themes | A colour with more than three bytes (`#RRGGBBAA`) no longer writes past the colour | RiptOPL |\n+| Network | An `IPCONFIG.DAT` of 256 bytes or more no longer overflows the stack | RiptOPL |\n+| VMC | Leaving the VMC menu no longer replaces a card of another size (4 MB, 128 MB, PCSX2 `.ps2`); Modify asks first | this fork, after RiptOPL |\n+| VMC | VMC slots are found again after an aborted launch, so a game cannot use the previous game's VMC | RiptOPL |\n+| BDM | All parts of a UL game must fit the fragment table together | RiptOPL |\n+| BDM | One VMC error is no longer reported again for the other slot | RiptOPL |\n+| BDM | Returning from the NBD server no longer crashes | RiptOPL |\n+| HDD | The PS2 logo check reads 48 sectors, not 49 | RiptOPL |\n+| Misc | Format string, terminators and the IOP patch mode compare (hardening, no known trigger) | RiptOPL |\n+| Cheats | A code line with address 0 (the second half of a multi-line code) no longer ends the cheat (upstream issue #1548) | this fork |\n+| Cheats | More than 5 hooks or 250 codes are dropped instead of written past the engine's tables (`SLUS_210.09.cht` has 9 hooks) | this fork |\n+| Themes | `fntFitString()` stops at the end of the string instead of scanning and writing past it (upstream issue #1713) | this fork |\n+| Themes | Wrapped text is a private copy: line breaks no longer go into the game's CFG (upstream issue #1713) | RiptOPL (same fix) |\n+| Themes | `GameCountText` gets the 60 bytes it formats into, not 1 | this fork; RiptOPL has the same fix |\n+| Themes | An image file that is missing disables the element instead of leaving a garbage texture that is drawn and freed | this fork; RiptOPL has the same fix |\n+| Themes | A theme without an `ItemsList` keeps the default list, instead of a NULL that crashes the first scroll | this fork; RiptOPL has the same fix |\n+| Languages | A `.lng` file name shorter than `lang_X.lng` (for example `ru.lng`) no longer crashes OPL at boot | this fork; RiptOPL checks the prefix |\n+| Launch | A boot file name over 16 characters (`$AltStartup`) no longer overflows the OSD history buffer | this fork |\n+| Settings | The default BGM path is no longer used as a format string | this fork |\n+| GSM | A `$GSMVMode` outside the table of modes falls back to mode 0 instead of reading past the table | RiptOPL |\n+| Pad | A held button keeps repeating across the 29 s wrap of the tick counter | RiptOPL (upstream PR #1757) |\n+| VMC | A failed cluster write while creating a VMC no longer leaves genvmc's abort semaphore taken (the next creation hung) | RiptOPL, smaller form |\n+| GUI | The scroll speed is restored after dialogs that return through their updater (VMC menu) | upstream PR #1757 |\n+| Art | Grey and grey+alpha PNGs are loaded | wOPL |\n+| ZSO | Images with a block size other than 2048 (maxcso default for 2 GiB+ images: 16 KiB) are rejected instead of read as the wrong sectors | this fork |\n+| ZSO | The block index is checked before the compressed data is read: a corrupt index gives a read error, not a write before the buffer | this fork |\n+| ZSO | Reads of more than 256 sectors go in slices instead of running past the index cache | this fork |\n+| In-game | IGR is sampled from the VBLANK_END interrupt handler again, not by a polling thread that busy games starve (upstream issue #1787); Fatal Fury: Battle Archives Vol. 2 needs Mode 6 as before | revert of upstream PR #1762, as RiptOPL 38481e9c |\n+| USB | `usbd_mini` is built from the ps2sdk USBD sources from before the \"USBD feature update\" (ps2sdk b1f7ff96, OPL Beta-2127): with the rewritten USBD, Crash Bandicoot: The Wrath of Cortex takes minutes to load from USB and then black-screens (upstream issue #1751, ps2sdk issue #908). `download_usbd.sh` fetches the sources, `modules/usb/usbd_mini` builds them; drop both once ps2sdk fixes its USBD | upstream PR #1752 (prebuilt binaries), ps2sdk PR #911 |\n+| MMCE | A new device, MMCE (Settings \u2192 MMCE Settings): games in `CD` and `DVD` on an MMCE memory-card emulator (SD2PSX, MemCard PRO 2, PSXMemCard Gen2) are listed and started, the ISO streamed in game by `mmcedrv` over SIO2; IGR switches the card back to its boot card. Not yet: VMCs on the card, games split into parts. The modules `mmceman`, `mmcedrv` and `mmceigr` are built from `ps2-mmce/mmceman` (MIT, see `CREDITS`) by `download_mmce.sh`. MMCE games get the SDK `sio2man` like every other game; `make MMCE_NO_SDK_SIO2MAN=1` builds the alternative (RiptOPL's: the game's own SIO2MAN) for a console A/B, with `-nosio2man` in the version | ps2-mmce/Open-PS2-Loader `mmce_support` (qnox32, BBsan), hardening after RiptOPL 09618a06, b5df7836 |\n+\n+RiptOPL is [NathanNeurotic/Open-PS2-Loader](https://github.com/NathanNeurotic/Open-PS2-Loader) and its C++ edition\n+[NathanNeurotic/RiptOPL](https://github.com/NathanNeurotic/RiptOPL). Its fixes were reviewed one by one against\n+upstream: only those that fix a defect present in upstream were taken, some in a smaller or corrected form. Each\n+commit credits the RiptOPL commit it ports.\n+\n+**Compatibility note:** a `ul.cfg` game whose title has non-ASCII bytes now uses the CRC that PC tools\n+compute. Upstream's CRC for such titles depended on the build, so chunks named by upstream OPL itself\n+may need renaming.\n+\n+## How fixes are checked\n+\n+Each fix is a separate commit whose message states the problem, the fix, its origin and the reproduction.\n+\n+1. Reproduce the bug on an upstream tree, with a host check (`labs/host-repro/run_all.ps1 -Opl <tree>`) or,\n+   for code that only runs on the console, a console test.\n+2. Fix it, then rerun the same check on this tree: the bug must be gone.\n+3. Rerun all host checks, and the real data where it applies (cheat corpus, ISO fixtures), for regressions.\n+4. Format with clang-format 12, as `CI-format-check` does.\n+5. The GitHub Actions build (ps2dev toolchain) must pass; then test on a console.\n+\n+`labs/host-repro/` holds the host checks. They compile OPL's own functions, taken from the tree at build\n+time, on Windows with MSVC and AddressSanitizer, with stubs in place of PS2 I/O. They show logic errors and\n+memory errors on the given inputs; they do not emulate the PS2, so a console test remains the final check.\n+`make_console_kit.py` turns a bootable ISO into the malformed test files for a console.\n+\n+## Branches\n+\n+`master` is the only long-lived branch: the releases are built from it. A fix may be prepared on a\n+short-lived branch, which is deleted once it is merged into `master`.\n+\n+The branches `copilot/*`, `main`, `master_old` and `v1.1.z` came from upstream when the fork was\n+created; this fork does not use them. Upstream's website branch `gh-pages` was deleted and GitHub Pages\n+is off, so no copy of the official OPL site is published here.\n+\n+## Pulling in upstream changes\n+\n+```\n+git remote add upstream https://github.com/ps2homebrew/Open-PS2-Loader.git   # once\n+git fetch upstream\n+git switch master\n+git merge upstream/master        # resolve conflicts, keeping this fork's fixes\n+git push origin master           # CI builds and publishes the new pre-release\n+```\n+\n+Do not use GitHub's \"Sync fork\" button with \"Discard commits\": it would drop this fork's fixes.\n+Before pushing a merge, run `labs/host-repro/run_all.ps1` if upstream touched the files it covers."
        },
        {
          "sha": "87abb6057fd118be001784857c5e4c31101e0a45",
          "filename": "Makefile",
          "status": "modified",
          "additions": 55,
          "deletions": 6,
          "changes": 61,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/Makefile",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/Makefile",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/Makefile?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -36,6 +36,9 @@ IGS ?= $(EXTRA_FEATURES)\n #Enables/disables pad emulator\n PADEMU ?= 1\n \n+#A/B build for the console: MMCE games keep the game's own SIO2MAN instead of the SDK sio2man (see FORK.md)\n+MMCE_NO_SDK_SIO2MAN ?= 0\n+\n #Enables/disables building of an edition of OPL that will support the DTL-T10000 (SDK v2.3+)\n DTL_T10000 ?= 0\n \n@@ -49,6 +52,12 @@ INGAME_DEBUG ?= 0\n DECI2_DEBUG ?= 0\n #How the TTY will reach developer: 'UDP', 'PPC_UART'.\n TTY_APPROACH ?= UDP\n+# YAOPL (Yet Another Open PS2 Loader) builds carry a suffix so they are not mistaken for official OPL builds.\n+LOCALVERSION ?= yaopl\n+ifeq ($(MMCE_NO_SDK_SIO2MAN),1)\n+  EE_CFLAGS += -DMMCE_NO_SDK_SIO2MAN\n+  LOCALVERSION := $(LOCALVERSION)-nosio2man\n+endif\n \n # ======== DO NOT MODIFY VALUES AFTER THIS POINT! UNLESS YOU KNOW WHAT YOU ARE DOING ========\n REVISION = $(shell expr $(shell git rev-list --count HEAD) + 2)\n@@ -73,13 +82,13 @@ endif\n \n FRONTEND_OBJS = pad.o xparam.o fntsys.o renderman.o menusys.o OSDHistory.o system.o lang.o lang_internal.o config.o hdd.o dialogs.o \\\n \t\tdia.o ioman.o texcache.o themes.o supportbase.o bdmsupport.o ethsupport.o hddsupport.o zso.o lz4.o \\\n-\t\tappsupport.o gui.o guigame.o vmc_groups.o textures.o opl.o atlas.o nbns.o httpclient.o gsm.o cheatman.o cheatconfig.o sound.o ps2cnf.o\n+\t\tappsupport.o mmcesupport.o gui.o guigame.o vmc_groups.o textures.o opl.o atlas.o nbns.o httpclient.o gsm.o cheatman.o cheatconfig.o sound.o ps2cnf.o\n \n IOP_OBJS =\tiomanx.o filexio.o ps2fs.o usbd.o bdmevent.o \\\n \t\tbdm.o bdmfs_fatfs.o usbmass_bd.o iLinkman.o IEEE1394_bd.o mx4sio_bd.o \\\n \t\tps2atad.o hdpro_atad.o poweroff.o ps2hdd.o xhdd.o genvmc.o lwnbdsvr.o \\\n \t\tps2dev9.o smsutils.o ps2ip.o smap.o isofs.o nbns-iop.o \\\n-\t\tsio2man.o padman.o mcman.o mcserv.o \\\n+\t\tsio2man.o padman.o mcman.o mcserv.o mmceman.o mmcedrv.o mmceigr.o \\\n \t\thttpclient-iop.o netman.o ps2ips.o \\\n \t\tbdm_mcemu.o hdd_mcemu.o smb_mcemu.o \\\n \t\tiremsndpatch.o apemodpatch.o f2techioppatch.o cleareffects.o resetspu.o \\\n@@ -88,7 +97,7 @@ IOP_OBJS =\tiomanx.o filexio.o ps2fs.o usbd.o bdmevent.o \\\n EECORE_OBJS = ee_core.o ioprp.o util.o \\\n \t\tudnl.o imgdrv.o eesync.o \\\n \t\tbdm_cdvdman.o bdm_ata_cdvdman.o IOPRP_img.o smb_cdvdman.o \\\n-\t\thdd_cdvdman.o hdd_hdpro_cdvdman.o cdvdfsv.o \\\n+\t\thdd_cdvdman.o hdd_hdpro_cdvdman.o mmce_cdvdman.o cdvdfsv.o \\\n \t\tingame_smstcpip.o smap_ingame.o smbman.o smbinit.o\n \n PNG_ASSETS = load0 load1 load2 load3 load4 load5 load6 load7 usb usb_bd ilk_bd \\\n@@ -98,7 +107,7 @@ PNG_ASSETS = load0 load1 load2 load3 load4 load5 load6 load7 usb usb_bd ilk_bd \\\n \tRating_1 Rating_2 Rating_3 Rating_4 Rating_5 Scan_240p Scan_240p1 Scan_480i Scan_480p \\\n \tScan_480p1 Scan_480p2 Scan_480p3 Scan_480p4 Scan_480p5 Scan_576i Scan_576p Scan_720p \\\n \tScan_1080i Scan_1080i2 Scan_1080p Vmode_multi Vmode_ntsc Vmode_pal logo case apps_case\\\n-\tIndex_0 Index_1 Index_2 Index_3 Index_4\n+\tIndex_0 Index_1 Index_2 Index_3 Index_4 mmce\n \t# unused icons - up down l1 l2 l3 r1 r2 r3\n \n GFX_OBJS = $(PNG_ASSETS:%=%_png.o) poeveticanew.o icon_sys.o icon_icn.o\n@@ -227,7 +236,7 @@ EE_LDFLAGS += -fdata-sections -ffunction-sections -Wl,--gc-sections\n \n .SILENT:\n \n-.PHONY: all release debug iopcore_debug eesio_debug ingame_debug deci2_debug debug_ppctty iopcore_ppctty_debug ingame_ppctty_debug clean rebuild pc_tools pc_tools_win32 oplversion format format-check ps2sdk-not-setup download_lng download_lwNBD languages\n+.PHONY: all release debug iopcore_debug eesio_debug ingame_debug deci2_debug debug_ppctty iopcore_ppctty_debug ingame_ppctty_debug clean rebuild pc_tools pc_tools_win32 oplversion format format-check ps2sdk-not-setup download_lng download_lwNBD download_usbd download_mmce languages\n \n ifdef PS2SDK\n \n@@ -278,6 +287,7 @@ clean:\tdownload_lwNBD\n \techo \" -cdvdman\"\n \t$(MAKE) -C modules/iopcore/cdvdman USE_BDM=1 clean\n \t$(MAKE) -C modules/iopcore/cdvdman USE_BDM_ATA=1 clean\n+\t$(MAKE) -C modules/iopcore/cdvdman USE_MMCE=1 clean\n \t$(MAKE) -C modules/iopcore/cdvdman USE_SMB=1 clean\n \t$(MAKE) -C modules/iopcore/cdvdman USE_HDD=1 clean\n \t$(MAKE) -C modules/iopcore/cdvdman USE_HDPRO=1 clean\n@@ -331,6 +341,10 @@ clean:\tdownload_lwNBD\n \techo \" -pademu\"\n \t$(MAKE) -C modules/pademu USE_BT=1 clean\n \t$(MAKE) -C modules/pademu USE_USB=1 clean\n+\techo \" -usbd_mini\"\n+\t$(MAKE) -C modules/usb/usbd_mini clean\n+\techo \" -mmce modules\"\n+\ttest ! -d modules/mmce/mmceman/mmceman || $(MAKE) -C modules/mmce/mmceman clean\n \techo \"-pc tools\"\n \t$(MAKE) -C pc clean\n \n@@ -417,6 +431,12 @@ modules/iopcore/cdvdman/bdm_ata_cdvdman.irx: modules/iopcore/cdvdman\n $(EE_ASM_DIR)bdm_ata_cdvdman.c: modules/iopcore/cdvdman/bdm_ata_cdvdman.irx | $(EE_ASM_DIR)\n \t$(BIN2C) $< $@ bdm_ata_cdvdman_irx\n \n+modules/iopcore/cdvdman/mmce_cdvdman.irx: modules/iopcore/cdvdman\n+\t$(MAKE) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) USE_MMCE=1 -C $< all\n+\n+$(EE_ASM_DIR)mmce_cdvdman.c: modules/iopcore/cdvdman/mmce_cdvdman.irx | $(EE_ASM_DIR)\n+\t$(BIN2C) $< $@ $(*F)_irx\n+\n modules/iopcore/cdvdman/smb_cdvdman.irx: modules/iopcore/cdvdman\n \t$(MAKE) $(CDVDMAN_PS2LOGO_FLAGS) $(CDVDMAN_DEBUG_FLAGS) USE_SMB=1 -C $< all\n \n@@ -495,7 +515,30 @@ modules/isofs/isofs.irx: modules/isofs\n $(EE_ASM_DIR)isofs.c: modules/isofs/isofs.irx | $(EE_ASM_DIR)\n \t$(BIN2C) $< $@ $(*F)_irx\n \n-$(EE_ASM_DIR)usbd.c: $(PS2SDK)/iop/irx/usbd_mini.irx | $(EE_ASM_DIR)\n+# Not the SDK's usbd_mini.irx: it is built from the USBD sources from before the ps2sdk rewrite, see FORK.md.\n+modules/usb/usbd_mini/usbd_mini.irx: download_usbd\n+\t$(MAKE) -C modules/usb/usbd_mini\n+\n+$(EE_ASM_DIR)usbd.c: modules/usb/usbd_mini/usbd_mini.irx | $(EE_ASM_DIR)\n+\t$(BIN2C) $< $@ $(*F)_irx\n+\n+# The MMCE modules are built from ps2-mmce/mmceman, which download_mmce.sh fetches; see FORK.md and CREDITS.\n+modules/mmce/mmceman/mmceman/irx/mmceman.irx: download_mmce\n+\t$(MAKE) -C modules/mmce/mmceman/mmceman\n+\n+$(EE_ASM_DIR)mmceman.c: modules/mmce/mmceman/mmceman/irx/mmceman.irx | $(EE_ASM_DIR)\n+\t$(BIN2C) $< $@ $(*F)_irx\n+\n+modules/mmce/mmceman/mmcedrv/irx/mmcedrv.irx: download_mmce\n+\t$(MAKE) -C modules/mmce/mmceman/mmcedrv\n+\n+$(EE_ASM_DIR)mmcedrv.c: modules/mmce/mmceman/mmcedrv/irx/mmcedrv.irx | $(EE_ASM_DIR)\n+\t$(BIN2C) $< $@ $(*F)_irx\n+\n+modules/mmce/mmceman/mmceigr/irx/mmceigr.irx: download_mmce\n+\t$(MAKE) -C modules/mmce/mmceman/mmceigr\n+\n+$(EE_ASM_DIR)mmceigr.c: modules/mmce/mmceman/mmceigr/irx/mmceigr.irx | $(EE_ASM_DIR)\n \t$(BIN2C) $< $@ $(*F)_irx\n \n $(EE_ASM_DIR)libsd.c: $(PS2SDK)/iop/irx/libsd.irx | $(EE_ASM_DIR)\n@@ -794,6 +837,12 @@ download_lng:\n download_lwNBD:\n \t./download_lwNBD.sh\n \n+download_usbd:\n+\t./download_usbd.sh\n+\n+download_mmce:\n+\t./download_mmce.sh\n+\n download_cfla:\n \t./download_cfla.sh\n "
        },
        {
          "sha": "3358d3c20994f9a9b890f88576a14873997de601",
          "filename": "README.md",
          "status": "modified",
          "additions": 36,
          "deletions": 7,
          "changes": 43,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/README.md",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/README.md",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/README.md?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -1,15 +1,44 @@\n+# YAOPL \u2014 Yet Another Open PS2 Loader\n+\n+[![CI](https://github.com/belomaxorka/yaopl/actions/workflows/compilation.yml/badge.svg?branch=master)](https://github.com/belomaxorka/yaopl/actions/workflows/compilation.yml)\n+\n+YAOPL is a fork of [Open PS2 Loader](https://github.com/ps2homebrew/Open-PS2-Loader) (OPL) that continues\n+its development. It tracks upstream OPL and adds its own fixes, starting with crashes, hangs and memory\n+errors on malformed cheat files, ISO and ZSO images, `SYSTEM.CNF`, `ul.cfg` and `games.bin`. It is the\n+loader-side companion of YAOPLM (Yet Another OPL Manager), the PC manager for OPL game libraries.\n+\n+YAOPL is not an official OPL build and is not affiliated with the OPL project.\n+\n+## Download\n+\n+Every change to `master` is built automatically and published as the\n+[`latest` pre-release](https://github.com/belomaxorka/yaopl/releases/tag/latest):\n+`OPNPS2LD.ELF`, the 7z packages and `SHA256SUMS` with the SHA-256 checksum of each file.\n+\n+YAOPL versions end in `-yaopl`, for example `v1.2.0-Beta-2310-1a2b3c4-yaopl`, so they are easy to tell apart\n+from official OPL builds. The ELF keeps OPL's file name, so existing FreeMcBoot or OSDMenu entries keep working.\n+\n+## What differs from OPL\n+\n+[FORK.md](FORK.md) lists every fix with its reproduction and origin, and explains how upstream changes are\n+merged into YAOPL. `labs/host-repro/` has the host programs that show each bug in upstream OPL and its absence\n+here, and a generator of test files for a real console.\n+\n+## Credits and license\n+\n+Open PS2 Loader: copyright 2013, Ifcaro & jimmikaelkael, and the OPL contributors. Some fixes are ported from\n+[RiptOPL](https://github.com/NathanNeurotic/Open-PS2-Loader) by NathanNeurotic; each commit names its source.\n+Licensed under the Academic Free License version 3.0, like OPL. Review the LICENSE file for further details.\n+\n+The rest of this file is upstream OPL's documentation. It applies to YAOPL as well.\n+\n+---\n+\n # Open PS2 Loader\n \n ![logo](https://github.com/ps2homebrew/Open-PS2-Loader/blob/master/gfx/logo.png)\n \n-Copyright 2013, Ifcaro & jimmikaelkael  \n-Licensed under Academic Free License version 3.0  \n-Review the LICENSE file for further details.  \n-\n-[![CI](https://github.com/ps2homebrew/Open-PS2-Loader/actions/workflows/compilation.yml/badge.svg?branch=master)](https://github.com/ps2homebrew/Open-PS2-Loader/actions/workflows/compilation.yml)\n-[![Codacy Badge](https://app.codacy.com/project/badge/Grade/99032a6a180243bfa0d0e23efeb0608d)](https://www.codacy.com/gh/ps2homebrew/Open-PS2-Loader/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=ps2homebrew/Open-PS2-Loader&amp;utm_campaign=Badge_Grade)\n [![Discord](https://img.shields.io/discord/652861436992946216?style=flat&logo=Discord)](https://discord.gg/CVFUa9xh6B)\n-[![Mega](https://img.shields.io/badge/Mega-%23D90007.svg?style=flat&logo=Mega&logoColor=white)](https://mega.nz/folder/Ndwi1bAK#oLWNhH_g-h0p4BoT4c556A)\n \n ## Introduction\n "
        },
        {
          "sha": "6bbfe91c461499c8f18b988b650f62c4b0980a47",
          "filename": "download_mmce.sh",
          "status": "added",
          "additions": 16,
          "deletions": 0,
          "changes": 16,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/download_mmce.sh",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/download_mmce.sh",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/download_mmce.sh?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,16 @@\n+#!/bin/bash\n+\n+## Fetch the MMCE IOP modules (mmceman, mmcedrv, mmceigr) of ps2-mmce/mmceman at a pinned commit: OPL builds\n+## and embeds them for the MMCE device (SD2PSX, MemCard PRO 2 and other memory-card emulators). The modules\n+## are MIT licensed, see CREDITS; FORK.md says why this fork carries them.\n+REPO_URL=\"https://github.com/ps2-mmce/mmceman.git\"\n+REPO_FOLDER=\"modules/mmce/mmceman\"\n+COMMIT=\"de28936fdf45fe445554cfa0b8f058b05fa8212f\"\n+if test ! -d \"$REPO_FOLDER/.git\"; then\n+  # Only the three module directories of that one commit: a sparse, shallow, blobless fetch.\n+  git init -q \"$REPO_FOLDER\" || { exit 1; }\n+  (cd \"$REPO_FOLDER\" && git remote add origin \"$REPO_URL\" && git sparse-checkout set mmceman mmcedrv mmceigr) || { exit 1; }\n+fi\n+if test \"$(cd \"$REPO_FOLDER\" && git rev-parse HEAD 2>/dev/null)\" != \"$COMMIT\" || test ! -f \"$REPO_FOLDER/mmceman/src/mmceman.c\"; then\n+  (cd \"$REPO_FOLDER\" && git fetch -q --depth 1 --filter=blob:none origin \"$COMMIT\" && git checkout -q \"$COMMIT\") || { exit 1; }\n+fi"
        },
        {
          "sha": "a148409a2aab755d3af1ef445f873a128cee6b4d",
          "filename": "download_usbd.sh",
          "status": "added",
          "additions": 16,
          "deletions": 0,
          "changes": 16,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/download_usbd.sh",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/download_usbd.sh",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/download_usbd.sh?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,16 @@\n+#!/bin/bash\n+\n+## Fetch the ps2sdk USBD sources from before the \"USBD feature update\" (ps2sdk b1f7ff96, merged 2024-09-24).\n+## OPL embeds a usbd_mini.irx built from them (modules/usb/usbd_mini): the rewritten USBD of today's\n+## ps2sdk hangs some games on USB (upstream issue #1751, ps2sdk issue #908). See FORK.md.\n+REPO_URL=\"https://github.com/ps2dev/ps2sdk.git\"\n+REPO_FOLDER=\"modules/usb/usbd_mini/ps2sdk\"\n+COMMIT=\"2dc6b32f4ce43593609d895207c720fc6e02e0e4\"\n+if test ! -d \"$REPO_FOLDER/.git\"; then\n+  # Only iop/usb/usbd of that one commit: a sparse, shallow, blobless fetch of about 0.5 MB.\n+  git init -q \"$REPO_FOLDER\" || { exit 1; }\n+  (cd \"$REPO_FOLDER\" && git remote add origin \"$REPO_URL\" && git sparse-checkout set iop/usb/usbd) || { exit 1; }\n+fi\n+if test \"$(cd \"$REPO_FOLDER\" && git rev-parse HEAD 2>/dev/null)\" != \"$COMMIT\" || test ! -f \"$REPO_FOLDER/iop/usb/usbd/src/usbd.c\"; then\n+  (cd \"$REPO_FOLDER\" && git fetch -q --depth 1 --filter=blob:none origin \"$COMMIT\" && git checkout -q \"$COMMIT\") || { exit 1; }\n+fi"
        },
        {
          "sha": "ee7a708d5712e6f510ceb82cca33a3a42f7a50b5",
          "filename": "ee_core/include/coreconfig.h",
          "status": "modified",
          "additions": 3,
          "deletions": 0,
          "changes": 3,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Finclude%2Fcoreconfig.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Finclude%2Fcoreconfig.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Finclude%2Fcoreconfig.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -67,6 +67,9 @@ struct EECoreConfig_t\n \n     int EnableGSMOp;\n     struct GsmConfig_t GsmConfig;\n+\n+    // MMCE cards to switch back to the boot card on IGR: bit 0 = memory-card slot 1, bit 1 = slot 2.\n+    int MMCEIGRSettings;\n };\n \n #define USE_LOCAL_EECORE_CONFIG struct EECoreConfig_t *config = &g_ee_core_config;"
        },
        {
          "sha": "dc7ecc3e804feef2662c65ac9b677df373aca42c",
          "filename": "ee_core/include/ee_core.h",
          "status": "modified",
          "additions": 1,
          "deletions": 0,
          "changes": 1,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Finclude%2Fee_core.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Finclude%2Fee_core.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Finclude%2Fee_core.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -72,6 +72,7 @@ enum GAME_MODE {\n     BDM_HDD_MODE,\n     ETH_MODE,\n     HDD_MODE,\n+    MMCE_MODE,\n };\n \n extern int EnableDebug;"
        },
        {
          "sha": "be74f50445199aad053cd23fd62763955ea56abf",
          "filename": "ee_core/include/modules.h",
          "status": "modified",
          "additions": 4,
          "deletions": 0,
          "changes": 4,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Finclude%2Fmodules.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Finclude%2Fmodules.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Finclude%2Fmodules.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -39,6 +39,10 @@ enum OPL_MODULE_ID {\n     // Special patches\n     OPL_MODULE_ID_IOP_PATCH,\n \n+    // MMCE memory-card emulators: the in-game driver and the single-shot IGR module\n+    OPL_MODULE_ID_MMCEDRV,\n+    OPL_MODULE_ID_MMCEIGR,\n+\n     OPL_MODULE_ID_COUNT\n };\n "
        },
        {
          "sha": "43c5f29362b79c586710299b99768d24bf2997e2",
          "filename": "ee_core/src/cheat_api.c",
          "status": "modified",
          "additions": 9,
          "deletions": 5,
          "changes": 14,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Fsrc%2Fcheat_api.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Fsrc%2Fcheat_api.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Fsrc%2Fcheat_api.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -50,12 +50,16 @@ void SetupCheats()\n         if ((code.addr == 0) && (code.val == 0))\n             break;\n \n+        // hooklist holds MAX_HOOKS hooks and codelist MAX_CODES codes; the loader's list can carry\n+        // more, which must not be written past the tables\n         if (((code.addr & 0xfe000000) == 0x90000000) && nextCodeCanBeHook == 1) {\n-            hooklist[j] = code.addr & 0x01FFFFFC;\n-            j++;\n-            hooklist[j] = code.val;\n-            j++;\n-        } else {\n+            if (j < MAX_HOOKS * 2) {\n+                hooklist[j] = code.addr & 0x01FFFFFC;\n+                j++;\n+                hooklist[j] = code.val;\n+                j++;\n+            }\n+        } else if (k < MAX_CODES * 2) {\n             codelist[k] = code.addr;\n             k++;\n             codelist[k] = code.val;"
        },
        {
          "sha": "925c220e5eb69abcd9c7fc7efae97802a0daaccc",
          "filename": "ee_core/src/iopmgr.c",
          "status": "modified",
          "additions": 4,
          "deletions": 0,
          "changes": 4,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Fsrc%2Fiopmgr.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Fsrc%2Fiopmgr.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Fsrc%2Fiopmgr.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -147,6 +147,10 @@ static void ResetIopSpecial(const char *args, unsigned int arglen)\n             break;\n         case BDM_HDD_MODE:\n             break;\n+        case MMCE_MODE:\n+            // The card keeps the ISO open across the reset; the driver only needs the SDK sio2man loaded above.\n+            LoadOPLModule(OPL_MODULE_ID_MMCEDRV, 0, 0, NULL);\n+            break;\n     };\n }\n "
        },
        {
          "sha": "061d6bab8d8d998ab6ba73be605a2748e2beed4c",
          "filename": "ee_core/src/main.c",
          "status": "modified",
          "additions": 2,
          "deletions": 0,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Fsrc%2Fmain.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Fsrc%2Fmain.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Fsrc%2Fmain.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -53,6 +53,8 @@ static int eecoreInit(int argc, char **argv)\n         config->GameMode = ETH_MODE;\n     else if (!_strncmp(config->GameModeDesc, \"HDD_MODE\", 8))\n         config->GameMode = HDD_MODE;\n+    else if (!_strncmp(config->GameModeDesc, \"MMCE_MODE\", 9))\n+        config->GameMode = MMCE_MODE;\n     DPRINTF(\"Game Mode = %d %s\\n\", config->GameMode, config->GameModeDesc);\n \n     EnableDebug = config->EnableDebug;"
        },
        {
          "sha": "945c7a38eddfad9b7e255e32090f6bf022e00162",
          "filename": "ee_core/src/padhook.c",
          "status": "modified",
          "additions": 62,
          "deletions": 285,
          "changes": 347,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Fsrc%2Fpadhook.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/ee_core%2Fsrc%2Fpadhook.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/ee_core%2Fsrc%2Fpadhook.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -133,255 +133,58 @@ static void t_loadElf(void)\n     Exit(0);\n }\n \n-// Wake the polling IGR thread at approximately one-frame intervals.\n-// SetAlarm() uses horizontal-sync ticks; 256 is close to one frame\n-// for both NTSC and PAL.\n-static void IGR_Poll_Alarm(s32 alarm_id, u16 time, void *common)\n-{\n-    (void)alarm_id;\n-    (void)time;\n-\n-    iWakeupThread(*(int *)common);\n-}\n-\n // In Game Reset Thread\n static void IGR_Thread(void *arg)\n {\n     USE_LOCAL_EECORE_CONFIG;\n-\n     u32 Cop0_Perf;\n-    u32 dmaEnableR;\n-    int i;\n-    int alarm_id;\n-\n-    u8 pad_pos_state;\n-    u8 pad_pos_frame;\n-    u8 pad_pos_combo1;\n-    u8 pad_pos_combo2;\n-\n-    (void)arg;\n-\n-    /*\n-     * Battle Archives 2 conflicts with OPL registering a handler on\n-     * VBLANK_END, even when that handler has an empty body.\n-     *\n-     * Poll the same controller buffer from an ordinary EE thread instead.\n-     */\n-    for (;;) {\n-        if (Pad_Data.pad_buf != NULL) {\n-            // Read through the uncached segment to obtain live pad data.\n-            pad_pos_state =\n-                ((u8 *)UNCACHED_SEG(Pad_Data.pad_buf))\n-                    [Pad_Data.pos_state];\n-\n-            pad_pos_frame =\n-                ((u8 *)UNCACHED_SEG(Pad_Data.pad_buf))\n-                    [Pad_Data.pos_frame];\n-\n-            pad_pos_combo1 =\n-                ((u8 *)UNCACHED_SEG(Pad_Data.pad_buf))\n-                    [Pad_Data.pos_combo1];\n-\n-            pad_pos_combo2 =\n-                ((u8 *)UNCACHED_SEG(Pad_Data.pad_buf))\n-                    [Pad_Data.pos_combo2];\n-\n-            // Check for the stable state used by the detected libpad.\n-            if (((Pad_Data.libpad == IGR_LIBPAD) &&\n-                 (pad_pos_state == IGR_PAD_STABLE_V1)) ||\n-                ((Pad_Data.libpad == IGR_LIBPAD2) &&\n-                 (pad_pos_state == IGR_PAD_STABLE_V2))) {\n-\n-                /*\n-                 * Check periodically whether the captured pad buffer is\n-                 * still active. This preserves the original VBLANK\n-                 * handler's pad-hook recovery behaviour.\n-                 */\n-                if (Pad_Data.vb_count++ >= 10) {\n-                    if (pad_pos_frame != Pad_Data.prev_frame) {\n-                        padOpen_hooked = 1;\n-                        Pad_Data.prev_frame = pad_pos_frame;\n-                    } else {\n-                        padOpen_hooked = 0;\n-                    }\n-\n-                    Pad_Data.vb_count = 0;\n-                }\n-\n-                // R1 + L1 + R2 + L2\n-                if (pad_pos_combo1 == IGR_COMBO_R1_L1_R2_L2) {\n-                    // Start + Select: reset to configured exit path.\n-                    if (pad_pos_combo2 == IGR_COMBO_START_SELECT) {\n-                        Pad_Data.combo_type = pad_pos_combo2;\n-                    }\n-                    // R3 + L3: power off.\n-                    else if (pad_pos_combo2 == IGR_COMBO_R3_L3) {\n-                        Pad_Data.combo_type = pad_pos_combo2;\n-                    }\n-#ifdef IGS\n-                    // Up: in-game screenshot when GSM/IGS is active.\n-                    else if ((pad_pos_combo2 == IGR_COMBO_UP) &&\n-                             config->EnableGSMOp) {\n-                        Pad_Data.combo_type = pad_pos_combo2;\n-                    }\n-#endif\n-                }\n-            }\n-        }\n-\n-        /*\n-         * Preserve the original power-button monitoring.\n-         * These registers require kernel mode.\n-         */\n-        ee_kmode_enter();\n-\n-        if ((*CDVD_R_NDIN & 0x20) &&\n-            (*CDVD_R_POFF & 0x04)) {\n-            Power_Button.press++;\n-\n-            // Cancel immediate poweroff to allow double-press detection.\n-            *CDVD_R_SDIN = 0x00;\n-            *CDVD_R_SCMD = 0x1B;\n-        }\n-\n-        if (Power_Button.press) {\n-            if (Power_Button.vb_count++ >= 50) {\n-                if (Power_Button.press == 1) {\n-                    Pad_Data.combo_type = IGR_COMBO_R3_L3;\n-                } else {\n-                    Pad_Data.combo_type = IGR_COMBO_START_SELECT;\n-                }\n-            }\n-        }\n-\n-        ee_kmode_exit();\n-\n-        if (Pad_Data.combo_type != 0x00) {\n-            break;\n-        }\n-\n-        /*\n-         * Sleep until an EE alarm wakes this thread.\n-         * This avoids a permanent busy loop and does not use VBLANK.\n-         */\n-        alarm_id = SetAlarm(\n-            256,\n-            IGR_Poll_Alarm,\n-            &IGR_Thread_ID);\n-\n-        if (alarm_id >= 0) {\n-            SleepThread();\n-        } else {\n-            /*\n-             * An alarm slot should normally be available. Fall back to\n-             * a low-priority delay rather than sleeping forever.\n-             */\n-            nopdelay();\n-        }\n-    }\n \n-    DPRINTF(\"IGR combination detected by polling thread.\\n\");\n+    // Place our IGR thread in WAIT state\n+    // It will be woken up by our IGR interrupt handler\n+    SleepThread();\n \n-    /*\n-     * Raise this thread to the priority previously assigned by the\n-     * interrupt handler before waking the old IGR worker.\n-     */\n-    ChangeThreadPriority(TH_SELF, 0);\n+    DPRINTF(\"IGR thread woken up!\\n\");\n \n-    /*\n-     * Perform the shutdown preparation that the original VBLANK\n-     * handler performed before waking IGR_Thread().\n-     */\n-\n-    // Wait for preceding loads and stores.\n-    asm volatile(\"sync.l\\n\");\n-\n-    // Stop all DMA except SIF0, SIF1 and SIF2.\n-    dmaEnableR = *R_EE_D_ENABLER;\n-\n-    *R_EE_D_ENABLEW = dmaEnableR | 0x10000;\n-\n-    *R_EE_D_CTRL;\n-    *R_EE_D_STAT;\n-\n-    *R_EE_D0_CHCR = 0;\n-    *R_EE_D1_CHCR = 0;\n-    *R_EE_D2_CHCR = 0;\n-    *R_EE_D3_CHCR = 0;\n-    *R_EE_D4_CHCR = 0;\n-    *R_EE_D8_CHCR = 0;\n-    *R_EE_D9_CHCR = 0;\n-\n-    *R_EE_D_ENABLEW = dmaEnableR;\n-\n-    asm volatile(\"sync.l\\n\");\n-\n-    // Reset the GS.\n-    *R_EE_GS_CSR = 0x100;\n-\n-    asm volatile(\"sync.l\\n\");\n-\n-    while (*R_EE_GS_CSR & 0x100) {\n-    }\n-\n-    /*\n-     * We are now in normal thread context, not interrupt context,\n-     * so use ResetEE rather than OPL's interrupt-only iResetEE wrapper.\n-     */\n-    ResetEE(0x7F);\n-\n-    // Suspend every game thread except this IGR polling thread.\n-    for (i = 1; i < 256; i++) {\n-        if (i != IGR_Thread_ID) {\n-            SuspendThread(i);\n-        }\n-    }\n-\n-    DPRINTF(\"IGR polling thread beginning shutdown.\\n\");\n-\n-    if (EnableDebug) {\n-        DBGCOL(0xFFFFFF, IGR, \"Thread Poll Trigger\");\n-    }\n+    if (EnableDebug)\n+        DBGCOL(0xFFFFFF, IGR, \"Thread WakeUp\");\n \n-    // Reinitialize RPC and CMD.\n+    // Re-Init RPC & CMD\n     SifInitRpc(0);\n \n-    /*\n-     * Start + Select returns to the configured exit ELF.\n-     * IGS Up follows the same reset path.\n-     */\n+    // If Pad Combo is Start + Select then Return to Home, else if Pad Combo is UP then take IGS\n     if ((Pad_Data.combo_type == IGR_COMBO_START_SELECT)\n #ifdef IGS\n-        || ((Pad_Data.combo_type == IGR_COMBO_UP) &&\n-            config->EnableGSMOp)\n+        || ((Pad_Data.combo_type == IGR_COMBO_UP) && (config->EnableGSMOp))\n #endif\n     ) {\n-        if (EnableDebug) {\n+\n+        if (EnableDebug)\n             DBGCOL(0xFF8000, IGR, \"oplIGRShutdown()\");\n-        }\n \n         oplIGRShutdown(0);\n \n-        if (EnableDebug) {\n+        if (EnableDebug)\n             DBGCOL(0x0000FF, IGR, \"Reset IOP\");\n-        }\n \n-        // Reset the IOP.\n+        // Reset IO Processor\n         while (!Reset_Iop(\"\", 0)) {\n+            ;\n         }\n \n-        // Remove OPL's kernel hooks.\n+        // Remove kernel hooks\n         Remove_Kernel_Hooks();\n \n-        /*\n-         * Some games alter the memory map, so restore the TLB before\n-         * loading the configured exit ELF.\n-         */\n+        // Initialize Translation Look-Aside Buffer, like the updated ExecPS2() library function does.\n+        // Some game (GT4, GTA) modify memory map\n+        // A re-init is needed to properly access memory\n         InitializeTLB();\n \n+        // Check Performance Counter\n+        // Some game (GT4) start performance counter\n+        // When counter overflow, an exception occur, so stop them\n         Cop0_Perf = GetCop0(25);\n \n-        // Stop an active performance counter.\n+        // Stop Performance Counter\n         if (Cop0_Perf & 0x80000000) {\n             __asm__ __volatile__(\n                 \" mfc0  $3, $25;\"\n@@ -393,78 +196,73 @@ static void IGR_Thread(void *arg)\n         }\n \n         if (config->EnableGSMOp) {\n-            if (EnableDebug) {\n+            if (EnableDebug)\n                 DBGCOL(0x00FF00, IGR, \"Stopping GSM\");\n-            }\n-\n             DPRINTF(\"Stopping GSM...\\n\");\n             DisableGSM();\n         }\n \n         if (config->gCheatList) {\n-            if (EnableDebug) {\n+            if (EnableDebug)\n                 DBGCOL(0xFF0000, IGR, \"Stopping CheatEngine\");\n-            }\n-\n             DPRINTF(\"Stopping PS2RD Cheat Engine...\\n\");\n             DisableCheats();\n         }\n \n-        if (EnableDebug) {\n+        if (EnableDebug)\n             DBGCOL(0x00FFFF, IGR, \"Waiting for IOP Reboot\");\n-        }\n \n         while (!SifIopSync()) {\n+            ;\n         }\n \n-        if (EnableDebug) {\n-            DBGCOL(\n-                0xFF80FF,\n-                IGR,\n-                \"Initializing RPC and services\");\n-        }\n+        if (EnableDebug)\n+            DBGCOL(0xFF80FF, IGR, \"Initializing RPC and services\");\n \n+        // Init RPC & CMD\n         SifInitRpc(0);\n         SifInitIopHeap();\n         LoadFileInit();\n         sbv_patch_enable_lmb();\n \n-        if (EnableDebug) {\n+        if (EnableDebug)\n             DBGCOL(0x800000, IGR, \"Execute RESETSPU.IRX\");\n-        }\n \n-        /*\n-         * Reset SPU after the IOP reboot so no IOP module competes\n-         * with the EE for the sound hardware.\n-         */\n-        LoadOPLModule(\n-            OPL_MODULE_ID_RESETSPU,\n-            0,\n-            0,\n-            NULL);\n+        // Reset SPU - do it after the IOP reboot, so nothing will compete with the EE for it.\n+        LoadOPLModule(OPL_MODULE_ID_RESETSPU, 0, 0, NULL);\n+\n+        if (config->MMCEIGRSettings != 0) {\n+            // Tell the MMCE card(s) to switch back to the boot card: the argument is one character per\n+            // memory-card slot, '1' to switch.\n+            char slots[3] = \"00\";\n+\n+            if (config->MMCEIGRSettings & 1)\n+                slots[0] = '1';\n+            if (config->MMCEIGRSettings & 2)\n+                slots[1] = '1';\n+\n+            LoadOPLModule(OPL_MODULE_ID_MMCEIGR, 0, sizeof(slots), slots);\n+        }\n \n #ifdef IGS\n-        if ((Pad_Data.combo_type == IGR_COMBO_UP) &&\n-            config->EnableGSMOp) {\n+        if ((Pad_Data.combo_type == IGR_COMBO_UP) && (config->EnableGSMOp))\n             InGameScreenshot();\n-        }\n #endif\n \n-        if (EnableDebug) {\n+        if (EnableDebug)\n             DBGCOL(0x008000, IGR, \"Exiting services\");\n-        }\n \n+        // Exit services\n         SifExitIopHeap();\n         LoadFileExit();\n         SifExitRpc();\n \n         IGR_Exit(0);\n     } else {\n-        if (EnableDebug) {\n+        if (EnableDebug)\n             DBGCOL(0x0000FF, IGR, \"oplIGRShutdown(1)\");\n-        }\n \n-        // R3 + L3 powers off the PS2.\n+        // If combo is R3 + L3, Poweroff PS2\n         oplIGRShutdown(1);\n     }\n }\n@@ -636,60 +434,39 @@ static void Set_libpad_Params(void *addr)\n     EI();\n }\n \n-// Install the polling IGR thread.\n-// Do not register anything on VBLANK_END.\n+// Install IGR thread, and Pad interrupt handler\n void Install_IGR(void)\n {\n     ee_thread_t thread_param;\n \n-    // Reset power-button state.\n+    // Reset power button data\n     Power_Button.press = 0;\n-    Power_Button.vb_count = 0;\n-\n-    // The pad-open hook will supply the live pad-buffer address.\n     Pad_Data.pad_buf = NULL;\n+    Power_Button.vb_count = 0;\n \n-    // Reset runtime IGR state.\n+    // Init runtime Pad_Data information\n     Pad_Data.vb_count = 0;\n     Pad_Data.combo_type = 0x00;\n     Pad_Data.prev_frame = 0x00;\n \n-    // Do not create the polling thread more than once.\n+    // Do not install the IGR thread or interrupt handler more than once.\n     if (IGR_Thread_ID < 0) {\n+        // Create and start IGR thread\n         thread_param.gp_reg = &_gp;\n         thread_param.func = IGR_Thread;\n         thread_param.stack = (void *)IGR_Stack;\n         thread_param.stack_size = IGR_STACK_SIZE;\n-\n-        /*\n-         * Keep OPL's original low priority. The alarm wakes the thread\n-         * periodically, and it raises itself to priority 0 only after\n-         * detecting an IGR combination.\n-         */\n         thread_param.initial_priority = 127;\n-\n         IGR_Thread_ID = CreateThread(&thread_param);\n \n-        if (IGR_Thread_ID >= 0) {\n-            StartThread(IGR_Thread_ID, NULL);\n-        }\n+        StartThread(IGR_Thread_ID, NULL);\n     }\n \n-    /*\n-     * Deliberately do not call:\n-     *\n-     *   AddIntcHandler(kINTC_VBLANK_END, ...)\n-     *   EnableIntc(kINTC_VBLANK_END)\n-     *\n-     * Merely registering that handler causes Battle Archives 2 to\n-     * black-screen, even when its body is empty.\n-     *\n-     * Keep a compile-time reference to the existing function so that\n-     * it may remain in the source without an unused-function warning.\n-     */\n-    (void)IGR_Intc_Handler;\n-\n-    IGR_Intc_ID = -1;\n+    if (IGR_Intc_ID < 0) {\n+        // Create IGR interrupt handler\n+        IGR_Intc_ID = AddIntcHandler(kINTC_VBLANK_END, IGR_Intc_Handler, 0);\n+        EnableIntc(kINTC_VBLANK_END);\n+    }\n }\n \n void Reset_Padhook(void)"
        },
        {
          "sha": "aacc03a56c440af739220904b015de93188726a7",
          "filename": "gfx/mmce.png",
          "status": "added",
          "additions": 0,
          "deletions": 0,
          "changes": 0,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/gfx%2Fmmce.png",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/gfx%2Fmmce.png",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/gfx%2Fmmce.png?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d"
        },
        {
          "sha": "5e313da4e196f10ea1e8f765ad2b0f8d99c559a0",
          "filename": "include/config.h",
          "status": "modified",
          "additions": 5,
          "deletions": 0,
          "changes": 5,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fconfig.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fconfig.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fconfig.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -98,9 +98,14 @@ enum CONFIG_INDEX {\n #define CONFIG_OPL_HDD_MODE             \"hdd_mode\"\n #define CONFIG_OPL_ETH_MODE             \"eth_mode\"\n #define CONFIG_OPL_APP_MODE             \"app_mode\"\n+#define CONFIG_OPL_MMCE_MODE            \"mmce_mode\"\n #define CONFIG_OPL_BDM_CACHE            \"bdm_cache\"\n #define CONFIG_OPL_HDD_CACHE            \"hdd_cache\"\n #define CONFIG_OPL_SMB_CACHE            \"smb_cache\"\n+#define CONFIG_OPL_MMCE_PREFIX          \"mmce_prefix\"\n+#define CONFIG_OPL_MMCE_SLOT            \"mmce_slot\"\n+#define CONFIG_OPL_MMCEIGR_SLOT         \"mmceigr_slot\"\n+#define CONFIG_OPL_MMCE_GAMEID          \"mmce_gameid\"\n #define CONFIG_OPL_ENABLE_ILINK         \"enable_ilink\"\n #define CONFIG_OPL_ENABLE_MX4SIO        \"enable_mx4sio\"\n #define CONFIG_OPL_ENABLE_BDMHDD        \"enable_bdm_hdd\""
        },
        {
          "sha": "ecdef93a1c2504e370ba185b86d82f19be11bdfd",
          "filename": "include/dialogs.h",
          "status": "modified",
          "additions": 7,
          "deletions": 0,
          "changes": 7,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fdialogs.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fdialogs.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fdialogs.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -34,6 +34,11 @@ enum UI_ITEMS {\n     CFG_HDDMODE,\n     CFG_ETHMODE,\n     CFG_APPMODE,\n+    CFG_MMCEMODE,\n+    CFG_MMCEPREFIX,\n+    CFG_MMCESLOT,\n+    CFG_MMCEIGRSLOT,\n+    CFG_MMCEGAMEID,\n     CFG_BDMCACHE,\n     CFG_HDDCACHE,\n     CFG_SMBCACHE,\n@@ -228,4 +233,6 @@ extern struct UIItem diaParentalLockConfig[];\n extern struct UIItem diaBlockDevicesConfig[];\n \n extern struct UIItem diaOSDConfig[];\n+extern struct UIItem diaMMCEConfig[];\n+\n #endif"
        },
        {
          "sha": "8d7f645b4c55dff6d7dff17820ae94d81143ab97",
          "filename": "include/extern_irx.h",
          "status": "modified",
          "additions": 8,
          "deletions": 0,
          "changes": 8,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fextern_irx.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fextern_irx.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fextern_irx.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -76,6 +76,14 @@ IMPORT_BIN2C(mcman_irx);\n \n IMPORT_BIN2C(mcserv_irx);\n \n+IMPORT_BIN2C(mmce_cdvdman_irx);\n+\n+IMPORT_BIN2C(mmceman_irx);\n+\n+IMPORT_BIN2C(mmcedrv_irx);\n+\n+IMPORT_BIN2C(mmceigr_irx);\n+\n IMPORT_BIN2C(nbns_irx);\n \n IMPORT_BIN2C(netman_irx);"
        },
        {
          "sha": "0d157154e527f4e9a73acddfe35d3d7ad60a2e0c",
          "filename": "include/gui.h",
          "status": "modified",
          "additions": 1,
          "deletions": 0,
          "changes": 1,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fgui.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fgui.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fgui.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -131,6 +131,7 @@ void guiShowUIConfig();\n void guiShowAudioConfig();\n void guiShowControllerConfig();\n void guiShowNetConfig();\n+void guiShowMMCEConfig(void);\n void guiShowParentalLockConfig();\n \n void guiCheckNotifications(int checkTheme, int checkLang);"
        },
        {
          "sha": "aa28ab8cf524f7686c4650bce596c11a98db93db",
          "filename": "include/iosupport.h",
          "status": "modified",
          "additions": 1,
          "deletions": 0,
          "changes": 1,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fiosupport.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fiosupport.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fiosupport.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -15,6 +15,7 @@ enum IO_MODES {\n     ETH_MODE,\n     HDD_MODE,\n     APP_MODE,\n+    MMCE_MODE,\n \n     MODE_COUNT\n };"
        },
        {
          "sha": "e8334b861134c91eda22bd3fbe04800879abc518",
          "filename": "include/mmcesupport.h",
          "status": "added",
          "additions": 21,
          "deletions": 0,
          "changes": 21,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fmmcesupport.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fmmcesupport.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fmmcesupport.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,21 @@\n+#ifndef __MMCE_SUPPORT_H\n+#define __MMCE_SUPPORT_H\n+\n+#include \"include/iosupport.h\"\n+\n+// Values of gMMCESlot: the memory-card slot of the MMCE card, or the first port that answers a ping.\n+#define MMCE_SLOT_1    0\n+#define MMCE_SLOT_2    1\n+#define MMCE_SLOT_AUTO 2\n+\n+// Values of gMMCEIGRSlot: bit 0 = memory-card slot 1, bit 1 = slot 2, or the slots where a card answered.\n+#define MMCE_IGR_AUTO 4\n+\n+void mmceInit(item_list_t *itemList);\n+item_list_t *mmceGetObject(int initOnly);\n+void mmceLoadModules(void);\n+void mmceLaunchGame(item_list_t *itemList, int id, config_set_t *configSet);\n+void mmceSendGameID(const char *bootpath);\n+int mmceIGRSlots(void);\n+\n+#endif"
        },
        {
          "sha": "841c7fced062f9dbfd7fe3c7db1529eddce8b09e",
          "filename": "include/opl.h",
          "status": "modified",
          "additions": 5,
          "deletions": 0,
          "changes": 5,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fopl.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fopl.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fopl.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -119,10 +119,14 @@ extern int gBDMStartMode;\n extern int gHDDStartMode;\n extern int gETHStartMode;\n extern int gAPPStartMode;\n+extern int gMMCEStartMode;\n extern int bdmCacheSize;\n extern int hddCacheSize;\n extern int smbCacheSize;\n \n+extern int gMMCESlot;\n+extern int gMMCEIGRSlot;\n+extern int gMMCEEnableGameID;\n extern int gEnableILK;\n extern int gEnableMX4SIO;\n extern int gEnableBdmHDD;\n@@ -194,6 +198,7 @@ extern int gEnableWrite;\n // These prefixes are relative to the device's name (meaning that they do not include the device name).\n extern char gBDMPrefix[32];\n extern char gETHPrefix[32];\n+extern char gMMCEPrefix[32];\n \n extern int gRememberLastPlayed;\n "
        },
        {
          "sha": "eeb7699cdcd7cd1bbe1e973a00733c7372c01f47",
          "filename": "include/supportbase.h",
          "status": "modified",
          "additions": 1,
          "deletions": 0,
          "changes": 1,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fsupportbase.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fsupportbase.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fsupportbase.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -43,6 +43,7 @@ int sbCreateSemaphore(void);\n int sbReadList(base_game_info_t **list, const char *prefix, int *fsize, int *gamecount);\n int sbPrepare(base_game_info_t *game, config_set_t *configSet, int size_cdvdman, void **cdvdman_irx, int *patchindex);\n void sbUnprepare(void *pCommon);\n+int sbMcemuSlotWord(void *irx, int size, int slot, int *cache);\n void sbRebuildULCfg(base_game_info_t **list, const char *prefix, int gamecount, int excludeID);\n void sbCreatePath(const base_game_info_t *game, char *path, const char *prefix, const char *sep, int part);\n void sbDelete(base_game_info_t **list, const char *prefix, const char *sep, int gamecount, int id);"
        },
        {
          "sha": "b05f9f5bd80728853822dfa3b7b77b3d0f9ea9c9",
          "filename": "include/textures.h",
          "status": "modified",
          "additions": 1,
          "deletions": 0,
          "changes": 1,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Ftextures.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Ftextures.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Ftextures.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -18,6 +18,7 @@ enum INTERNAL_TEXTURE {\n     HDD_ICON,\n     ETH_ICON,\n     APP_ICON,\n+    MMCE_ICON,\n     INDEX_0,\n     INDEX_1,\n     INDEX_2,"
        },
        {
          "sha": "5cadb5415c37c765d12b935db64367321cdb4577",
          "filename": "include/themes.h",
          "status": "modified",
          "additions": 1,
          "deletions": 0,
          "changes": 1,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fthemes.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Fthemes.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Fthemes.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -56,6 +56,7 @@ typedef struct\n \n     u32 currentConfigId;\n     char *currentValue;\n+    char *wrappedValue; // the wrapped copy currentValue points to, when wrapping is on\n } mutable_text_t;\n \n typedef struct"
        },
        {
          "sha": "a1ba563c027513eea349fed28ca6809ddfb2e759",
          "filename": "include/util.h",
          "status": "modified",
          "additions": 2,
          "deletions": 1,
          "changes": 3,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Futil.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/include%2Futil.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/include%2Futil.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -18,13 +18,14 @@ typedef struct\n     unsigned int available;\n     char *lastPtr;\n     short allocResult;\n+    short writeError; // A write failed or was short: the file is incomplete\n } file_buffer_t;\n \n file_buffer_t *openFileBufferBuffer(short allocResult, const void *buffer, unsigned int size);\n file_buffer_t *openFileBuffer(char *fpath, int mode, short allocResult, unsigned int size);\n int readFileBuffer(file_buffer_t *readContext, char **outBuf);\n void writeFileBuffer(file_buffer_t *fileBuffer, char *inBuf, int size);\n-void closeFileBuffer(file_buffer_t *fileBuffer);\n+int closeFileBuffer(file_buffer_t *fileBuffer); // 0, or -1 if anything written was lost\n \n int max(int a, int b);\n int min(int a, int b);"
        },
        {
          "sha": "102cce43bd91b0a945d419300710d12a576289e3",
          "filename": "labs/elfmods.py",
          "status": "added",
          "additions": 139,
          "deletions": 0,
          "changes": 139,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Felfmods.py",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Felfmods.py",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Felfmods.py?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,139 @@\n+#!/usr/bin/env python3\n+\"\"\"List the IOP modules (IRX files) embedded in an unpacked OPL ELF: size, SHA-256, module version\n+from .iopmod (the names are stripped) and the export table(s) if the module has any.\n+Usage: elfmods.py <ELF> [<ELF2>]  (two files: compare them module by module, by position, then compare\n+the bytes of the loadable segments that lie outside the modules)\"\"\"\n+import hashlib\n+import struct\n+import sys\n+\n+\n+def irx_modules(data):\n+    mods = []\n+    pos = 0\n+    while True:\n+        pos = data.find(b\"\\x7fELF\", pos)\n+        if pos < 0:\n+            break\n+        hdr = data[pos:pos + 52]\n+        if len(hdr) < 52 or hdr[4] != 1 or hdr[5] != 1:\n+            pos += 4\n+            continue\n+        e_type = struct.unpack_from(\"<H\", hdr, 16)[0]\n+        if e_type != 0xFF80:  # ET_SCE_IOPRELEXEC\n+            pos += 4\n+            continue\n+        (e_phoff, e_shoff, _flags, _ehsize, e_phentsize, e_phnum,\n+         e_shentsize, e_shnum, _shstrndx) = struct.unpack_from(\"<IIIHHHHHH\", hdr, 28)\n+        end = 52\n+        if e_shoff and e_shnum:\n+            end = max(end, e_shoff + e_shnum * e_shentsize)\n+            for i in range(e_shnum):\n+                sh = data[pos + e_shoff + i * e_shentsize:pos + e_shoff + (i + 1) * e_shentsize]\n+                sh_type, _f, _a, sh_off, sh_size = struct.unpack_from(\"<IIIII\", sh, 4)\n+                if sh_type != 8:  # SHT_NOBITS\n+                    end = max(end, sh_off + sh_size)\n+        ver = \"?\"\n+        for i in range(e_phnum):\n+            ph = data[pos + e_phoff + i * e_phentsize:pos + e_phoff + (i + 1) * e_phentsize]\n+            p_type, p_off, _v, _p, p_filesz = struct.unpack_from(\"<IIIII\", ph, 0)\n+            end = max(end, p_off + p_filesz)\n+            if p_type == 0x70000080 and p_filesz >= 0x1A:  # .iopmod: ... u16 version at 0x18\n+                v = struct.unpack_from(\"<H\", data, pos + p_off + 0x18)[0]\n+                ver = \"%d.%d\" % (v >> 8, v & 0xFF)\n+        blob = data[pos:pos + end]\n+        mods.append(dict(off=pos, size=end, sha=hashlib.sha256(blob).hexdigest(), ver=ver,\n+                         exp=export_versions(blob)))\n+        pos += end\n+    return mods\n+\n+\n+def export_versions(blob):\n+    # irx_export_table: u32 magic 0x41C00000, u32 next, u16 version, u16 mode, char name[8]\n+    found = []\n+    pos = 0\n+    while True:\n+        pos = blob.find(b\"\\x00\\x00\\xC0\\x41\", pos)\n+        if pos < 0:\n+            break\n+        if pos + 20 <= len(blob):\n+            nxt, ver, _mode = struct.unpack_from(\"<IHH\", blob, pos + 4)\n+            raw = blob[pos + 12:pos + 20].split(b\"\\0\", 1)[0]\n+            if nxt == 0 and raw and all(32 <= c < 127 for c in raw):\n+                found.append(\"%s %d.%d\" % (raw.decode(\"ascii\"), ver >> 8, ver & 0xFF))\n+        pos += 4\n+    return \", \".join(found)\n+\n+\n+def load_segments(data):\n+    \"\"\"File ranges of the PT_LOAD segments of the (outer) ELF: what the console loads.\"\"\"\n+    e_phoff = struct.unpack_from(\"<I\", data, 28)[0]\n+    e_phentsize, e_phnum = struct.unpack_from(\"<HH\", data, 42)\n+    ranges = []\n+    for i in range(e_phnum):\n+        p_type, p_off, _v, _p, p_filesz = struct.unpack_from(\"<IIIII\", data, e_phoff + i * e_phentsize)\n+        if p_type == 1 and p_filesz:\n+            ranges.append((p_off, p_off + p_filesz))\n+    return ranges\n+\n+\n+def show(path):\n+    data = open(path, \"rb\").read()\n+    mods = irx_modules(data)\n+    segs = load_segments(data)\n+    print(\"%s: %d bytes, %d bytes in %d loadable segments, %d IRX modules\" % (\n+        path, len(data), sum(b - a for a, b in segs), len(segs), len(mods)))\n+    for i, m in enumerate(mods):\n+        print(\"  #%02d v%-6s %7d bytes  exports: %-24s sha256 %s\" % (i, m[\"ver\"], m[\"size\"], m[\"exp\"] or \"-\", m[\"sha\"][:16]))\n+    return data, mods, segs\n+\n+\n+def loaded_outside(data, mods, segs):\n+    \"\"\"The bytes of the loadable segments that are not part of an embedded module.\"\"\"\n+    out = bytearray()\n+    for a, b in segs:\n+        pos = a\n+        for m in mods:\n+            if m[\"off\"] >= b or m[\"off\"] + m[\"size\"] <= a:\n+                continue\n+            out += data[pos:max(pos, m[\"off\"])]\n+            pos = max(pos, m[\"off\"] + m[\"size\"])\n+        out += data[pos:b]\n+    return bytes(out)\n+\n+\n+if __name__ == \"__main__\":\n+    data, mods, segs = show(sys.argv[1])\n+    if len(sys.argv) > 2:\n+        data2, mods2, segs2 = show(sys.argv[2])\n+        print(\"\")\n+        print(\"Comparison by position:\")\n+        differ = 0\n+        for i in range(max(len(mods), len(mods2))):\n+            a = mods[i] if i < len(mods) else None\n+            b = mods2[i] if i < len(mods2) else None\n+            if a is None or b is None:\n+                print(\"  #%02d only in the %s file\" % (i, \"first\" if a else \"second\"))\n+                differ += 1\n+            elif a[\"sha\"] != b[\"sha\"]:\n+                print(\"  #%02d DIFFERS: %d -> %d bytes, v%s -> v%s, exports %s -> %s\" % (\n+                    i, a[\"size\"], b[\"size\"], a[\"ver\"], b[\"ver\"], a[\"exp\"] or \"-\", b[\"exp\"] or \"-\"))\n+                differ += 1\n+        print(\"  modules: %d vs %d, differing: %d\" % (len(mods), len(mods2), differ))\n+        r1, r2 = loaded_outside(data, mods, segs), loaded_outside(data2, mods2, segs2)\n+        print(\"  loadable bytes outside the modules: %d vs %d, %s\" % (len(r1), len(r2), \"identical\" if r1 == r2 else \"differ\"))\n+        if r1 != r2 and len(r1) == len(r2):\n+            diffs = [i for i in range(len(r1)) if r1[i] != r2[i]]\n+            # Group the differing bytes into runs (a gap of more than 16 bytes starts a new run).\n+            runs = []\n+            for i in diffs:\n+                if runs and i - runs[-1][1] <= 16:\n+                    runs[-1][1] = i\n+                else:\n+                    runs.append([i, i])\n+            print(\"  differing bytes: %d in %d runs\" % (len(diffs), len(runs)))\n+            for lo, hi in runs[:6]:\n+                a, b = max(0, lo - 12), min(len(r1), hi + 13)\n+                print(\"   at %d (%d bytes): %r -> %r\" % (lo, hi - lo + 1, r1[a:b], r2[a:b]))\n+            if len(runs) > 6:\n+                print(\"   ... %d more runs\" % (len(runs) - 6))"
        },
        {
          "sha": "567609b1234a9b8806c5a05da6c866e480aa148d",
          "filename": "labs/host-repro/.gitignore",
          "status": "added",
          "additions": 1,
          "deletions": 0,
          "changes": 1,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2F.gitignore",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2F.gitignore",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2F.gitignore?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1 @@\n+build/"
        },
        {
          "sha": "465d68394a690648c8491fd8b009b8dded2a3904",
          "filename": "labs/host-repro/README.md",
          "status": "added",
          "additions": 68,
          "deletions": 0,
          "changes": 68,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2FREADME.md",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2FREADME.md",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2FREADME.md?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,68 @@\n+# Host reproductions of parser bugs\n+\n+Small host programs that run OPL's own functions on malformed input and report\n+crashes, endless loops and AddressSanitizer findings. Each fix commit of this fork names\n+the check that shows its bug, with the result before and after.\n+\n+Nothing here is built into OPL. The harnesses do not carry copies of OPL code:\n+`extract.py` copies the functions under test out of the OPL tree at build time, so one run\n+checks whatever is checked out.\n+\n+## Run\n+\n+Windows with Visual Studio Build Tools (MSVC with AddressSanitizer) and Python 3:\n+\n+```\n+powershell -ExecutionPolicy Bypass -File labs\\host-repro\\run_all.ps1 [-Opl <OPL checkout>] [-Only <groups>] [-Images <dir>] [-Expected <file>]\n+```\n+\n+`-Opl` defaults to this checkout. Inputs and binaries go to `labs/host-repro/build/`.\n+MSVC's `char` is signed, as on the EE and the IOP. `-Only cheat,zso,...` runs some groups\n+only. `-Images <dir>` also prints the game ID OPL derives from every `.iso` in the directory.\n+\n+`-Expected labs\\host-repro\\expected.txt` compares every result line with that file and\n+exits with 1 on a difference. `CI-host-checks` (`.github/workflows/host-checks.yml`) runs\n+the checks that way on `windows-latest` for every push. After adding or changing a check,\n+regenerate the file from a run on this tree:\n+`run_all.ps1 > labs\\host-repro\\expected.txt` (its first line, the tree path, is ignored).\n+\n+## What it covers\n+\n+| Group | Function | Bug on upstream |\n+|---|---|---|\n+| `cheat` | `src/cheatman.c` `make_code()` | writes `digits[16]`, one byte past the array, for every code |\n+| `cheat` | `parse_buf()`, `trim_str()` | an indented comment becomes a cheat named `\" \"` |\n+| `cheat` | `parse_buf()` | the 251st cheat is written to `gCheats[250]` |\n+| `cheat` | `parse_buf()` | a last line over 255 bytes without LF overflows `line[]` |\n+| `cheat` | `parse_buf()` | a last line without LF reads past the buffer |\n+| `cheat` | `set_cheats_list()` | a code line with address 0 ends the cheat (upstream #1548) |\n+| `cheat` | `ee_core/src/cheat_api.c` `SetupCheats()` | more than 5 hooks or 250 codes overflow the engine's tables (`cheat-t -s <list>` sweeps a corpus) |\n+| `iso` | `cdvdman_locatefile()`, isofs and in-game | a record with name length 0 loops forever; an extended attribute length >= 0x80 steps backwards; in-game, a name over 14 characters overflows `cdvdman_curdir[15]` |\n+| `find` | `cdvdman_findfile()` | a `/`-only path copies from address 1; long names overflow `name[16]` |\n+| `zso` | `ziso_init()`, `read_raw_data()` | align > 11 divides by zero; a block size other than 2048 is read as the wrong sectors |\n+| `zso` | `ziso_read_sector()` with the tree's LZ4 | a corrupt index writes in front of the buffer; a read over 256 sectors runs past the index cache |\n+| `cnf` | `ps2cnfGetBootFile()` | `BOOT2` without `=` passes NULL to `CNFGetKey()` |\n+| `sb` | `sbReadList()`, `updateISOGameList()` | a ul.cfg size that is not a multiple of 64 writes past the list; the cache compare reads past the cache |\n+| `name` | `isValidIsoName()` | reads before the name for `..` |\n+| `crc` | `USBA_crc32()` | non-ASCII titles index `crctab` negatively; `ref` is an independent unsigned implementation |\n+| `cfg` | `readFileBuffer()`, `strToColor()`, `splitAssignment()`, `parsePrefix()`, `configReadLegacyIP()`, `CheckPS2Logo()` | a `#` last line without LF crashes; a read error corrupts memory; colours, keys, prefixes and `IPCONFIG.DAT` overflow; the HDD logo read is one sector too long |\n+| `cheatsel` | `cheatConfigLoadSelections()` | picks of cheats that share a name are lost |\n+| `cfgwrite` | `configWrite()` | a failed write is reported as saved |\n+| `cdread` | in-game `cdvdman_read()` | 2340-byte sectors are copied 12 bytes past the buffer |\n+| `bdmprobe` | `bdmFindPartition()` | the write probe empties `conf_opl.cfg` (upstream #1397) |\n+| `vmc` | `sysCheckVMC()` | a VMC of another size is replaced without asking |\n+| `text` | `fntFitString()`, `drawAttributeText()` | the wrap scans past the terminator and writes over it; line breaks go into the config value (upstream #1713) |\n+| `theme` | `initGameCountText()`, `initImageTexture()`, `validateGUIElems()` | a 1-byte count buffer; a missing image file leaves a garbage texture; a theme without `ItemsList` leaves it NULL |\n+| `lang` | `lngReadEntry()` | a `.lng` name shorter than `lang_X.lng` gives a negative length |\n+| `history` | `GetBootFilename()` | a boot file name over 16 characters overflows `filename[17]` |\n+| `gsm` | `PrepareGSM()` | `$GSMVMode` indexes past the table of 29 modes |\n+| `pad` | `readPads()` | the button repeat countdown jumps by 29 s at the tick counter wrap |\n+| `genvmc` | `mc_writecluster()` | a failed write leaves the abort semaphore taken |\n+| `bgm` | `bgmLoad()` | the default BGM path is the format string |\n+\n+## Console test files\n+\n+`make_console_kit.py <bootable.iso> <out dir>` turns one bootable image (for example a\n+homebrew ELF packed as a disc) into the same malformed cases for a real PS2: ISO and ZSO\n+variants for `DVD/`, two `ul.cfg` sets, `.cht`, CFG, VMC, theme, cover and language files.\n+`iso_harness` can check an image directly: `iso-<tag>.exe file <image>`."
        },
        {
          "sha": "525bdb531e486475f9efc7d4fe7c05a11fc0b49a",
          "filename": "labs/host-repro/bdmprobe_harness.c",
          "status": "added",
          "additions": 42,
          "deletions": 0,
          "changes": 42,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fbdmprobe_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fbdmprobe_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fbdmprobe_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,42 @@\n+/* Host harness for bdmFindPartition() (src/bdmsupport.c), the probe the settings save uses to\n+ * find a writable USB device:\n+ *   bdmprobe <dir>\n+ * \"massN:\" maps to <dir>\\massN\\. Probes for conf_opl.cfg with write = 1 and prints its size\n+ * before and after. */\n+#include <fcntl.h>\n+#include <io.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include <sys/stat.h>\n+\n+#define MAX_BDM_DEVICES 5\n+static char gBDMPrefix[32];\n+static char root[512];\n+\n+static int harness_open(const char *path, int flags, ...)\n+{\n+    char local[1024];\n+    int unit = path[4] - '0'; /* \"massN:...\" */\n+    sprintf(local, \"%s\\\\mass%d\\\\%s\", root, unit, strchr(path, ':') + 1);\n+    return _open(local, flags | _O_BINARY, _S_IREAD | _S_IWRITE);\n+}\n+#define open  harness_open\n+#define close _close\n+\n+#include \"bdmprobe_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    char target[256], cfg[600];\n+    struct _stat st;\n+    long before;\n+\n+    strcpy(root, argv[1]);\n+    sprintf(cfg, \"%s\\\\mass0\\\\conf_opl.cfg\", root);\n+    before = _stat(cfg, &st) == 0 ? (long)st.st_size : -1;\n+    int r = bdmFindPartition(target, \"conf_opl.cfg\", 1);\n+    _stat(cfg, &st);\n+    printf(\"probe = %d (%s); conf_opl.cfg %ld bytes before, %ld after\\n\", r, target, before, (long)st.st_size);\n+    return 0;\n+}"
        },
        {
          "sha": "5be6d0992285687c8794f0ffb921124400c7d514",
          "filename": "labs/host-repro/bgm_harness.c",
          "status": "added",
          "additions": 54,
          "deletions": 0,
          "changes": 54,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fbgm_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fbgm_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fbgm_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,54 @@\n+/* Host harness for src/sound.c bgmLoad(): the path of the default background\n+ * music comes from the user's settings. Argument: the default_bgm_path value.\n+ * snprintf() is intercepted, so a format string taken from that setting is\n+ * reported instead of being executed. */\n+#include <errno.h>\n+#include <stdarg.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+#define LOG(...)\n+\n+typedef struct\n+{\n+    int unused;\n+} OggVorbis_File;\n+typedef struct\n+{\n+    int unused;\n+} ov_callbacks;\n+static const ov_callbacks OV_CALLBACKS_DEFAULT = {0};\n+static int ov_open_callbacks(void *f, OggVorbis_File *vf, const char *initial, long ibytes, ov_callbacks cb) { return -1; }\n+static int thmGetGuiValue(void) { return 0; }\n+static char *thmGetFilePath(int id) { return \"mass:/THM/thm_x/\"; }\n+char gDefaultBGMPath[256];\n+static OggVorbis_File *vorbisFile;\n+\n+static int harness_snprintf(char *s, size_t n, const char *fmt, ...)\n+{\n+    va_list ap;\n+    int r;\n+\n+    if (fmt == gDefaultBGMPath) {\n+        printf(\"format string = the setting itself (user data)\\n\");\n+        strncpy(s, fmt, n - 1);\n+        s[n - 1] = '\\0';\n+        return (int)strlen(s);\n+    }\n+    printf(\"format string = \\\"%s\\\"\\n\", fmt);\n+    va_start(ap, fmt);\n+    r = vsnprintf(s, n, fmt, ap);\n+    va_end(ap);\n+    return r;\n+}\n+#define snprintf harness_snprintf\n+\n+#include \"bgm_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    strncpy(gDefaultBGMPath, argc > 1 ? argv[1] : \"mass:/bgm.ogg\", sizeof(gDefaultBGMPath) - 1);\n+    printf(\"bgmLoad = %d\\n\", bgmLoad());\n+    return 0;\n+}"
        },
        {
          "sha": "3a802165cfc7fda14341fb43aaaa0c8193be1cd1",
          "filename": "labs/host-repro/cdread_harness.c",
          "status": "added",
          "additions": 56,
          "deletions": 0,
          "changes": 56,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcdread_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcdread_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fcdread_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,56 @@\n+/* Host harness for the in-game cdvdman_read() (modules/iopcore/cdvdman/cdvdman.c), as built for\n+ * USB, MX4SIO and SMB (cdvdman_buf holds one sector):\n+ *   cdread <sector size> <sectors>\n+ * reads into a heap block of exactly <sectors> * <sector size> bytes. */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned char u8;\n+typedef unsigned short u16;\n+typedef unsigned int u32;\n+#define PHYSADDR(x)         (x)\n+#define CDVDMAN_BUF_SECTORS 1\n+#define SCECdStatRead       0x06\n+#define SCECdStatPause      0x0A\n+#define WaitSema(s)         ((void)0)\n+#define SignalSema(s)       ((void)0)\n+\n+static struct\n+{\n+    int status;\n+} cdvdman_stat;\n+static int cdvdman_searchfilesema;\n+static u32 ReadPos;\n+/* the static buffer, with the memory that follows it in the module */\n+static struct\n+{\n+    u8 buf[CDVDMAN_BUF_SECTORS * 2048];\n+    u8 next[512];\n+} mem;\n+#define cdvdman_buf mem.buf\n+\n+typedef struct\n+{\n+    u8 minute, second, sector, track;\n+} sceCdlLOCCD;\n+static void sceCdIntToPos(u32 i, sceCdlLOCCD *p) { p->minute = p->second = p->sector = p->track = 0; }\n+static int cdvdman_read_sectors(u32 lsn, unsigned int sectors, void *buf)\n+{\n+    memset(buf, 0x5A, sectors * 2048);\n+    return 0;\n+}\n+\n+#include \"cdread_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    u16 size = (u16)atoi(argv[1]);\n+    u32 sectors = (u32)atoi(argv[2]);\n+    u8 *buf = malloc(size * sectors);\n+\n+    cdvdman_read(16, sectors, size, buf);\n+    printf(\"read %u sectors of %u bytes into a %u-byte buffer\\n\", sectors, size, size * sectors);\n+    free(buf);\n+    return 0;\n+}"
        },
        {
          "sha": "36222ae59a2442e44244fd4b5edf4f0b40fa040a",
          "filename": "labs/host-repro/cfg_harness.c",
          "status": "added",
          "additions": 141,
          "deletions": 0,
          "changes": 141,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcfg_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcfg_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fcfg_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,141 @@\n+/* Host harness for the text-file and config helpers of src/util.c and src/config.c:\n+ *   cfg lines <file> [readerror]  readFileBuffer() lines of a file, as configRead() reads them\n+ *   cfg color <string>            strToColor() into color[3], with a canary after it\n+ *   cfg split <line>              splitAssignment() into key[32] and val[256]\n+ *   cfg prefix <line>             parsePrefix() into prefix[32], with a canary after it\n+ *   cfg legacyip <IPCONFIG.DAT>   configReadLegacyIP()\n+ *   cfg logo                      CheckPS2Logo() for an HDD game, counting sectors read */\n+#include <fcntl.h>\n+#include <io.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned char u8;\n+typedef unsigned int u32;\n+#define ALIGNED(x)\n+#define LOG(...)\n+\n+typedef struct\n+{\n+    int fd;\n+    int mode;\n+    char *buffer;\n+    unsigned int size;\n+    unsigned int available;\n+    char *lastPtr;\n+    short allocResult;\n+    short writeError; /* as in include/util.h; unused by older trees */\n+} file_buffer_t;\n+\n+static int failReads; /* make read() fail, as on a USB unplug or SMB drop */\n+static int harness_read(int fd, void *buf, unsigned int n)\n+{\n+    return failReads ? -1 : _read(fd, buf, n);\n+}\n+#define read            harness_read\n+#define write           _write\n+#define close           _close\n+#define lseek           _lseek\n+#define openFile(p, m)  _open(p, (m) | _O_BINARY)\n+#define getFileSize(fd) _filelength(fd)\n+\n+/* CheckPS2Logo() */\n+#define ZSO_MAGIC                 0x4F53495A\n+#define CONSOLE_REGION_EUROPE     2\n+#define guiWarning(text, timeout) ((void)0)\n+typedef struct\n+{\n+    u32 magic;\n+} ZISO_header;\n+static int ConsoleRegion, gEnableDebug, probed_fd;\n+static u32 probed_lba;\n+static int ziso_init(ZISO_header *h, u32 first) { return -1; }\n+static int ziso_read_sector(u8 *buf, u32 sector, unsigned int count) { return 0; }\n+static int sectorsRead;\n+static int hddReadSectors(u32 lba, u32 nsectors, void *buf)\n+{\n+    sectorsRead += nsectors;\n+    memset(buf, 0x11, nsectors * 512);\n+    return 0;\n+}\n+\n+/* configReadLegacyIP() */\n+#define CONFIG_INDEX_NETWORK 3\n+#define CONFIG_NET_PS2_IP    \"ps2_ip_addr\"\n+#define CONFIG_NET_PS2_NETM  \"ps2_netmask\"\n+#define CONFIG_NET_PS2_GATEW \"ps2_gateway\"\n+#define CONFIG_NET_PS2_DNS   \"ps2_dns\"\n+typedef struct\n+{\n+    int unused;\n+} config_set_t;\n+static config_set_t configFiles[8];\n+static char legacyNetConfigPath[256];\n+static int ps2_ip[4], ps2_netmask[4], ps2_gateway[4];\n+static int configSetStr(config_set_t *set, const char *key, const char *value)\n+{\n+    printf(\"%s=%s \", key, value);\n+    return 1;\n+}\n+\n+#undef min\n+#undef max\n+#include \"cfg_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    const char *mode = argv[1];\n+\n+    if (strcmp(mode, \"lines\") == 0) {\n+        file_buffer_t *fb = openFileBuffer(argv[2], O_RDONLY, 0, 4096);\n+        char *line;\n+        int n = 0;\n+\n+        failReads = argc > 3;\n+        while (fb != NULL && readFileBuffer(fb, &line) && n < 20)\n+            printf(\"line %d: \\\"%s\\\"\\n\", ++n, line);\n+        printf(\"%d lines\\n\", n);\n+    } else if (strcmp(mode, \"color\") == 0) {\n+        struct\n+        {\n+            unsigned char color[3];\n+            unsigned char canary[13];\n+        } c;\n+        memset(&c, 0xCC, sizeof(c));\n+        strToColor(argv[2], c.color);\n+        printf(\"color %02X %02X %02X, canary %02X %02X %02X %02X\\n\", c.color[0], c.color[1], c.color[2], c.canary[0], c.canary[1], c.canary[2], c.canary[3]);\n+    } else if (strcmp(mode, \"split\") == 0) {\n+        struct\n+        {\n+            char key[32], val[256];\n+        } kv;\n+        char line[1024];\n+        memset(&kv, 0, sizeof(kv));\n+        strcpy(line, argv[2]);\n+        splitAssignment(line, kv.key, sizeof(kv.key), kv.val, sizeof(kv.val));\n+        printf(\"key length %u (buffer 32): \\\"%s\\\"\\n\", (unsigned)strlen(kv.key), kv.key);\n+    } else if (strcmp(mode, \"prefix\") == 0) {\n+        struct\n+        {\n+            char prefix[32];\n+            char canary[96];\n+        } p;\n+        char line[1024];\n+        memset(&p, 0, sizeof(p));\n+        strcpy(line, argv[2]);\n+#ifdef PREFIX_MAX\n+        parsePrefix(line, p.prefix, sizeof(p.prefix));\n+#else\n+        parsePrefix(line, p.prefix);\n+#endif\n+        printf(\"prefix length %u, canary %s\\n\", (unsigned)strlen(p.prefix), p.canary[0] ? \"OVERWRITTEN\" : \"intact\");\n+    } else if (strcmp(mode, \"legacyip\") == 0) {\n+        strcpy(legacyNetConfigPath, argv[2]);\n+        printf(\"-> %d\\n\", configReadLegacyIP());\n+    } else if (strcmp(mode, \"logo\") == 0) {\n+        CheckPS2Logo(0, 1000);\n+        printf(\"HDD logo check read %d sectors of 512 bytes into a %d-byte buffer\\n\", sectorsRead, 12 * 2048);\n+    }\n+    return 0;\n+}"
        },
        {
          "sha": "dc27973d236f0a15284dde6930031a93c251fdc0",
          "filename": "labs/host-repro/cfgwrite_harness.c",
          "status": "added",
          "additions": 74,
          "deletions": 0,
          "changes": 74,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcfgwrite_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcfgwrite_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fcfgwrite_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,74 @@\n+/* Host harness for configWrite() (src/config.c) with the file buffer of src/util.c:\n+ *   cfgwrite <file> ok|fail|short\n+ * saves a modified two-key config while write() works, fails or writes half. */\n+#include <fcntl.h>\n+#include <io.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include <sys/stat.h>\n+\n+typedef unsigned int u32;\n+#define LOG(...)\n+#define CONFIG_KEY_NAME_LEN  32\n+#define CONFIG_KEY_VALUE_LEN 256\n+\n+typedef struct\n+{\n+    int fd;\n+    int mode;\n+    char *buffer;\n+    unsigned int size;\n+    unsigned int available;\n+    char *lastPtr;\n+    short allocResult;\n+    short writeError;\n+} file_buffer_t;\n+\n+struct config_value_t\n+{\n+    char key[CONFIG_KEY_NAME_LEN];\n+    char val[CONFIG_KEY_VALUE_LEN];\n+    struct config_value_t *next;\n+};\n+typedef struct\n+{\n+    int type;\n+    struct config_value_t *head;\n+    struct config_value_t *tail;\n+    char *filename;\n+    int modified;\n+    u32 uid;\n+} config_set_t;\n+\n+static int writeMode; /* 0: works, 1: fails (-1), 2: writes half of the bytes */\n+static int harness_write(int fd, const void *buf, unsigned int n)\n+{\n+    if (writeMode == 1)\n+        return -1;\n+    return _write(fd, buf, writeMode == 2 ? n / 2 : n);\n+}\n+#define write          harness_write\n+#define read           _read\n+#define close          _close\n+#define lseek          _lseek\n+#define openFile(p, m) _open(p, (m) | _O_BINARY, _S_IREAD | _S_IWRITE)\n+#define bgmMute()\n+#define bgmUnMute()\n+\n+#include \"cfgwrite_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    struct config_value_t b = {\"b\", \"2\", NULL}, a = {\"a\", \"1\", &b};\n+    config_set_t set = {0, &a, &b, argv[1], 1, 0};\n+    struct _stat st;\n+    int r;\n+\n+    writeMode = strcmp(argv[2], \"fail\") == 0 ? 1 : strcmp(argv[2], \"short\") == 0 ? 2 :\n+                                                                                   0;\n+    r = configWrite(&set);\n+    _stat(argv[1], &st);\n+    printf(\"configWrite = %d, modified = %d, file %ld of 10 bytes\\n\", r, set.modified, (long)st.st_size);\n+    return 0;\n+}"
        },
        {
          "sha": "bd001fa1441c118b759c4311e480ce48a2b47a2e",
          "filename": "labs/host-repro/cheat_harness.c",
          "status": "added",
          "additions": 155,
          "deletions": 0,
          "changes": 155,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcheat_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcheat_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fcheat_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,155 @@\n+/* Host harness for src/cheatman.c parse_buf() and set_cheats_list(), and for\n+ * ee_core/src/cheat_api.c SetupCheats(). cheat_extracted.c is produced by\n+ * extract.py from the OPL checkout under test, so the same harness runs against\n+ * master and against a fix branch. */\n+#include <ctype.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned int u32;\n+\n+#define MAX_HOOKS      5\n+#define MAX_CODES      250\n+#define MAX_CHEATLIST  (MAX_HOOKS * 2 + MAX_CODES * 2)\n+#define CHEAT_NAME_MAX 128\n+#define NUL            0x00\n+#define LF             0x0A\n+#define CR             0x0D\n+#define SPACE          0x20\n+#define CODE_DIGITS    16\n+#define LOG(...)\n+\n+typedef struct\n+{\n+    u32 addr;\n+    u32 val;\n+} code_t;\n+\n+typedef struct\n+{\n+    char name[CHEAT_NAME_MAX + 1];\n+    code_t codes[MAX_CHEATLIST];\n+    int enabled;\n+} cheat_entry_t;\n+\n+cheat_entry_t gCheats[MAX_CODES];\n+static int gCheatMode = 1; /* select mode: only master codes start enabled */\n+\n+static int cheatConfigIsMasterCode(const char *name)\n+{\n+    return _stricmp(name, \"mastercode\") == 0 || _stricmp(name, \"master code\") == 0;\n+}\n+\n+/* set_cheats_list() fills this list for the EE core (static in cheatman.c) */\n+static u32 gCheatList[MAX_CHEATLIST];\n+\n+/* SetupCheats() reads the list through the EE core config and fills the engine's tables.\n+ * Separate globals, so AddressSanitizer sees a write past any of them. */\n+struct local_cfg\n+{\n+    u32 *gCheatList;\n+} local_config = {gCheatList};\n+#define USE_LOCAL_EECORE_CONFIG struct local_cfg *config = &local_config;\n+u32 numhooks;\n+u32 hooklist[MAX_HOOKS * 2];\n+u32 numcodes;\n+u32 codelist[MAX_CODES * 2];\n+\n+#include \"cheat_extracted.c\"\n+\n+static int run(const char *path, int engine, int sweep);\n+\n+int main(int argc, char **argv)\n+{\n+    char path[1024];\n+    FILE *list;\n+    int engine = 0, sweep = 0;\n+\n+    /* -l <list>: parse every file of the list; -e <file>: enable all cheats and build the engine\n+     * tables; -s <list>: report the files of the list whose cheats exceed the engine tables */\n+    if (argc == 3 && (strcmp(argv[1], \"-l\") == 0 || strcmp(argv[1], \"-s\") == 0)) {\n+        sweep = strcmp(argv[1], \"-s\") == 0;\n+        list = fopen(argv[2], \"r\");\n+        while (list != NULL && fgets(path, sizeof(path), list) != NULL) {\n+            path[strcspn(path, \"\\r\\n\")] = '\\0';\n+            if (!sweep)\n+                printf(\"## %s\\n\", strrchr(path, '\\\\') ? strrchr(path, '\\\\') + 1 : path);\n+            run(path, sweep, sweep);\n+        }\n+        return 0;\n+    }\n+    if (argc == 3 && strcmp(argv[1], \"-e\") == 0)\n+        engine = 1;\n+    return run(argv[argc - 1], engine, 0);\n+}\n+\n+static int code_count(const cheat_entry_t *cheat)\n+{\n+    int j;\n+\n+    /* A code line may have address 0: only an all-zero pair, which parse_buf() never stores, ends the codes */\n+    for (j = 0; j < MAX_CHEATLIST && (cheat->codes[j].addr != 0 || cheat->codes[j].val != 0); j++)\n+        ;\n+    return j;\n+}\n+\n+static int run(const char *path, int engine, int sweep)\n+{\n+    FILE *f = fopen(path, \"rb\");\n+    long size;\n+    char *buf;\n+    int i, j, parsed = 0, listed = 0, wantHooks = 0, wantCodes = 0, nextCodeCanBeHook = 1;\n+\n+    if (f == NULL)\n+        return 2;\n+    fseek(f, 0, SEEK_END);\n+    size = ftell(f);\n+    rewind(f);\n+    buf = malloc(size + 1); /* same layout as read_text_file(): exactly size + 1 */\n+    fread(buf, 1, size, f);\n+    fclose(f);\n+    buf[size] = '\\0';\n+\n+    memset(gCheats, 0, sizeof(gCheats));\n+    parse_buf(buf);\n+    free(buf);\n+\n+    if (!engine) {\n+        for (i = 0; i < MAX_CODES && gCheats[i].name[0] != NUL; i++)\n+            printf(\"cheat %3d name=\\\"%s\\\" enabled=%d codes=%d first=%08X\\n\", i, gCheats[i].name, gCheats[i].enabled, code_count(&gCheats[i]), gCheats[i].codes[0].addr);\n+        printf(\"total cheats: %d\\n\", i);\n+        return 0;\n+    }\n+\n+    /* \"enable all\", as the automatic cheat mode does */\n+    for (i = 0; i < MAX_CODES && gCheats[i].name[0] != NUL; i++) {\n+        gCheats[i].enabled = 1;\n+        parsed += code_count(&gCheats[i]);\n+    }\n+    set_cheats_list();\n+    for (i = 0; i + 1 < MAX_CHEATLIST && (gCheatList[i] != 0 || gCheatList[i + 1] != 0); i += 2) {\n+        /* the same classification as SetupCheats(), to count what it would store */\n+        if ((gCheatList[i] & 0xfe000000) == 0x90000000 && nextCodeCanBeHook)\n+            wantHooks++;\n+        else\n+            wantCodes++;\n+        nextCodeCanBeHook = !((gCheatList[i] & 0xf0000000) == 0x40000000 || (gCheatList[i] & 0xf0000000) == 0x30000000);\n+        listed++;\n+    }\n+    if (sweep) {\n+        if (wantHooks > MAX_HOOKS || wantCodes > MAX_CODES)\n+            printf(\"%s: %d hooks, %d codes for tables of %d and %d\\n\", strrchr(path, '\\\\') ? strrchr(path, '\\\\') + 1 : path, wantHooks, wantCodes, MAX_HOOKS, MAX_CODES);\n+        return 0;\n+    }\n+    printf(\"engine list: %d of %d parsed codes\", listed, parsed);\n+    if (listed < 16) {\n+        printf(\":\");\n+        for (j = 0; j < listed; j++)\n+            printf(\" %08X/%08X\", gCheatList[j * 2], gCheatList[j * 2 + 1]);\n+    }\n+    printf(\"\\n\");\n+    SetupCheats();\n+    printf(\"SetupCheats: numhooks=%u numcodes=%u (list had %d hooks and %d codes)\\n\", numhooks, numcodes, wantHooks, wantCodes);\n+    return 0;\n+}"
        },
        {
          "sha": "65a4e7a53650b8fc2b8d4e30acdd21429353e5f7",
          "filename": "labs/host-repro/cheatsel_harness.c",
          "status": "added",
          "additions": 86,
          "deletions": 0,
          "changes": 86,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcheatsel_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcheatsel_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fcheatsel_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,86 @@\n+/* Host harness for the remembered cheat picks in src/cheatconfig.c: picks are saved with\n+ * cheatConfigSaveSelections() and loaded back with cheatConfigLoadSelections(). The names are\n+ * given on the command line; a leading '+' marks a picked cheat. */\n+#include <ctype.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned int u32;\n+#define NUL                                0x00\n+#define SPACE                              0x20\n+#define MAX_CODES                          250\n+#define CHEAT_NAME_MAX                     128\n+#define CONFIG_KEY_NAME_LEN                32\n+#define CONFIG_KEY_VALUE_LEN               256\n+#define CONFIG_ITEM_CHEAT_SELECTION_PREFIX \"$CheatSel\"\n+#define CHEAT_SELECTION_KEY_MAX            CONFIG_KEY_NAME_LEN\n+\n+typedef struct\n+{\n+    char name[CHEAT_NAME_MAX + 1];\n+    int enabled;\n+} cheat_entry_t;\n+static cheat_entry_t gCheats[MAX_CODES];\n+\n+/* A tiny config set: enough key/value pairs for the picks. */\n+typedef struct\n+{\n+    char key[64][CONFIG_KEY_NAME_LEN];\n+    char val[64][CONFIG_KEY_VALUE_LEN];\n+    int count;\n+} config_set_t;\n+static int find(config_set_t *s, const char *key)\n+{\n+    int i;\n+    for (i = 0; i < s->count; i++)\n+        if (strcmp(s->key[i], key) == 0)\n+            return i;\n+    return -1;\n+}\n+static int configGetStrCopy(config_set_t *s, const char *key, char *val, int size)\n+{\n+    int i = find(s, key);\n+    if (i < 0)\n+        return 0;\n+    strncpy(val, s->val[i], size);\n+    return 1;\n+}\n+static int configSetStr(config_set_t *s, const char *key, const char *val)\n+{\n+    int i = find(s, key);\n+    if (i < 0)\n+        i = s->count++;\n+    strcpy(s->key[i], key);\n+    strcpy(s->val[i], val);\n+    return 1;\n+}\n+static int configRemoveKey(config_set_t *s, const char *key)\n+{\n+    int i = find(s, key);\n+    if (i >= 0)\n+        s->key[i][0] = '\\0';\n+    return i >= 0;\n+}\n+\n+#include \"cheatsel_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    static config_set_t set;\n+    int i;\n+\n+    for (i = 1; i < argc; i++) {\n+        strcpy(gCheats[i - 1].name, argv[i][0] == '+' ? argv[i] + 1 : argv[i]);\n+        gCheats[i - 1].enabled = argv[i][0] == '+';\n+    }\n+    cheatConfigSaveSelections(&set);\n+    for (i = 0; i < argc - 1; i++)\n+        gCheats[i].enabled = 0;\n+    cheatConfigLoadSelections(&set);\n+    printf(\"picked after reload:\");\n+    for (i = 0; i < argc - 1; i++)\n+        printf(\" [%d %s]=%d\", i, gCheats[i].name, gCheats[i].enabled);\n+    printf(\"\\n\");\n+    return 0;\n+}"
        },
        {
          "sha": "7f82d66971068ff02dbf582209feb15ede41680f",
          "filename": "labs/host-repro/cnf_harness.c",
          "status": "added",
          "additions": 19,
          "deletions": 0,
          "changes": 19,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcnf_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcnf_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fcnf_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,19 @@\n+/* Host harness for ps2cnfGetBootFile() from src/ps2cnf.c. */\n+#include <ctype.h>\n+#include <errno.h>\n+#include <stdio.h>\n+#include <string.h>\n+\n+#define CNF_PATH_LEN_MAX 64\n+#define LOG(...)\n+\n+#include \"cnf_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    char bootfile[CNF_PATH_LEN_MAX + 1] = \"\";\n+    int r = ps2cnfGetBootFile(argv[1], bootfile);\n+\n+    printf(\"ps2cnfGetBootFile = %d, bootfile = \\\"%s\\\"\\n\", r, bootfile);\n+    return 0;\n+}"
        },
        {
          "sha": "543d75016af65e8a05a31b861f7e1d0b9def7e8d",
          "filename": "labs/host-repro/crc_harness.c",
          "status": "added",
          "additions": 25,
          "deletions": 0,
          "changes": 25,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcrc_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fcrc_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fcrc_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,25 @@\n+/* Host harness for USBA_crc32() (src/system.c or pc/iso2opl). Prints the CRC of each\n+ * argument given as hex bytes (\"\" for the empty name). MSVC's char is signed, as on the EE. */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned int u32;\n+static unsigned int crctab[0x400];\n+\n+#include \"crc_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    int i;\n+\n+    for (i = 1; i < argc; i++) {\n+        char name[64] = {0};\n+        size_t n = strlen(argv[i]) / 2, k;\n+\n+        for (k = 0; k < n; k++)\n+            name[k] = (char)strtol((char[]) {argv[i][2 * k], argv[i][2 * k + 1], 0}, NULL, 16);\n+        printf(\"%-24s %08X\\n\", argv[i][0] ? argv[i] : \"(empty)\", USBA_crc32(name));\n+    }\n+    return 0;\n+}"
        },
        {
          "sha": "5b982a4441d97360495e9f8de6e4711641bf500a",
          "filename": "labs/host-repro/expected.txt",
          "status": "added",
          "additions": 166,
          "deletions": 0,
          "changes": 166,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fexpected.txt",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fexpected.txt",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fexpected.txt?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,166 @@\n+OPL tree: C:\\Users\\Admin\\Projects\\Open-PS2-Loader\n+cheat cht_plain                    plain: cheat   0 name=\"Mastercode\" enabled=1 codes=1 first=90106418 | cheat   1 name=\"Cheat\" enabled=0 codes=1 first=20100000 | total cheats: 2\n+                                   asan:  cheat   0 name=\"Mastercode\" enabled=1 codes=1 first=90106418 | cheat   1 name=\"Cheat\" enabled=0 codes=1 first=20100000 | total cheats: 2\n+cheat cht_indented                 plain: cheat   0 name=\"Mastercode\" enabled=1 codes=3 first=90106418 | total cheats: 1\n+                                   asan:  cheat   0 name=\"Mastercode\" enabled=1 codes=3 first=90106418 | total cheats: 1\n+cheat cht_251                      plain: cheat 248 name=\"Cheat 248\" enabled=0 codes=1 first=201003E0 | cheat 249 name=\"Cheat 249\" enabled=0 codes=1 first=201003E4 | total cheats: 250\n+                                   asan:  cheat 248 name=\"Cheat 248\" enabled=0 codes=1 first=201003E0 | cheat 249 name=\"Cheat 249\" enabled=0 codes=1 first=201003E4 | total cheats: 250\n+cheat cht_long_last                plain: cheat   0 name=\"Mastercode\" enabled=1 codes=1 first=90106418 | total cheats: 1\n+                                   asan:  cheat   0 name=\"Mastercode\" enabled=1 codes=1 first=90106418 | total cheats: 1\n+cheat cht_no_lf                    plain: cheat   0 name=\"Mastercode\" enabled=1 codes=1 first=90106418 | cheat   1 name=\"Cheat\" enabled=0 codes=1 first=20100000 | total cheats: 2\n+                                   asan:  cheat   0 name=\"Mastercode\" enabled=1 codes=1 first=90106418 | cheat   1 name=\"Cheat\" enabled=0 codes=1 first=20100000 | total cheats: 2\n+cheat engine cht_addr0             plain: engine list: 14 of 14 parsed codes: 90183688/0C07B869 E10100FD/0028489C 000FFFE0/00000001 E10100FB/0028489C 000FFFE0/00000000 E1020000/000FFFE0 60284390/00000080 00000000/00000B4C E1020001/000FFFE0 60284390/00000088 00000000/00000B4C E1010002/2028C598 000FFFE0/00000000 20100000/00000001 | SetupCheats: numhooks=1 numcodes=13 (list had 1 hooks and 13 codes)\n+                                   asan:  engine list: 14 of 14 parsed codes: 90183688/0C07B869 E10100FD/0028489C 000FFFE0/00000001 E10100FB/0028489C 000FFFE0/00000000 E1020000/000FFFE0 60284390/00000080 00000000/00000B4C E1020001/000FFFE0 60284390/00000088 00000000/00000B4C E1010002/2028C598 000FFFE0/00000000 20100000/00000001 | SetupCheats: numhooks=1 numcodes=13 (list had 1 hooks and 13 codes)\n+cheat engine cht_9hooks            plain: engine list: 10 of 10 parsed codes: 901B9920/0C047714 901B9A20/0C047714 901B9B20/0C047714 901B9C20/0C047714 901B9D20/0C047714 901B9E20/0C047714 901B9F20/0C047714 901BA020/0C047714 901BA120/0C047714 2039FCF8/3FAAAAAB | SetupCheats: numhooks=5 numcodes=1 (list had 9 hooks and 1 codes)\n+                                   asan:  engine list: 10 of 10 parsed codes: 901B9920/0C047714 901B9A20/0C047714 901B9B20/0C047714 901B9C20/0C047714 901B9D20/0C047714 901B9E20/0C047714 901B9F20/0C047714 901BA020/0C047714 901BA120/0C047714 2039FCF8/3FAAAAAB | SetupCheats: numhooks=5 numcodes=1 (list had 9 hooks and 1 codes)\n+cheat engine cht_many              plain: engine list: 254 of 300 parsed codes | SetupCheats: numhooks=0 numcodes=250 (list had 0 hooks and 254 codes)\n+                                   asan:  engine list: 254 of 300 parsed codes | SetupCheats: numhooks=0 numcodes=250 (list had 0 hooks and 254 codes)\n+isofs locatefile ok                plain: found lba=24 size=100 after 1 sector reads\n+                                   asan:  found lba=24 size=100 after 1 sector reads\n+cdvdman locatefile ok              plain: found lba=24 size=100 after 1 sector reads\n+                                   asan:  found lba=24 size=100 after 1 sector reads\n+isofs locatefile zero              plain: found lba=24 size=100 after 1 sector reads\n+                                   asan:  found lba=24 size=100 after 1 sector reads\n+cdvdman locatefile zero            plain: found lba=24 size=100 after 1 sector reads\n+                                   asan:  found lba=24 size=100 after 1 sector reads\n+isofs locatefile xa                plain: found lba=24 size=100 after 1 sector reads\n+                                   asan:  found lba=24 size=100 after 1 sector reads\n+cdvdman locatefile xa              plain: found lba=24 size=100 after 1 sector reads\n+                                   asan:  found lba=24 size=100 after 1 sector reads\n+isofs locatefile long              plain: found lba=24 size=100 after 1 sector reads\n+                                   asan:  found lba=24 size=100 after 1 sector reads\n+cdvdman locatefile long            plain: found lba=24 size=100 after 1 sector reads\n+                                   asan:  found lba=24 size=100 after 1 sector reads\n+isofs findfile \\SYSTEM.CNF;1       plain: \\SYSTEM.CNF;1: found=1 lsn=24 size=100 name=\"SYSTEM.CNF;1\"\n+                                   asan:  \\SYSTEM.CNF;1: found=1 lsn=24 size=100 name=\"SYSTEM.CNF;1\"\n+isofs findfile /SYSTEM.CNF;1       plain: /SYSTEM.CNF;1: found=1 lsn=24 size=100 name=\"SYSTEM.CNF;1\"\n+                                   asan:  /SYSTEM.CNF;1: found=1 lsn=24 size=100 name=\"SYSTEM.CNF;1\"\n+isofs findfile \\A_VERY_LONG_LEVEL2_FILENAME.TXT;1 plain: \\A_VERY_LONG_LEVEL2_FILENAME.TXT;1: found=1 lsn=26 size=300 name=\"A_VERY_LONG_LEV\"\n+                                   asan:  \\A_VERY_LONG_LEVEL2_FILENAME.TXT;1: found=1 lsn=26 size=300 name=\"A_VERY_LONG_LEV\"\n+zso align 0                        plain: align 0: header accepted, reading index... | read ok\n+                                   asan:  align 0: header accepted, reading index... | read ok\n+zso align 11                       plain: align 11: header accepted, reading index... | read ok\n+                                   asan:  align 11: header accepted, reading index... | read ok\n+zso align 12                       plain: align 12: header rejected (-1)\n+                                   asan:  align 12: header rejected (-1)\n+zso align 255                      plain: align 255: header rejected (-1)\n+                                   asan:  align 255: header rejected (-1)\n+zso read ok 0 4                    plain: header accepted: 400 sectors, block size 2048, align 0 | read 4 sectors from 0: data ok\n+                                   asan:  header accepted: 400 sectors, block size 2048, align 0 | read 4 sectors from 0: data ok\n+zso read ok 7 3                    plain: header accepted: 400 sectors, block size 2048, align 0 | read 3 sectors from 7: data ok\n+                                   asan:  header accepted: 400 sectors, block size 2048, align 0 | read 3 sectors from 7: data ok\n+zso read align4 0 40               plain: header accepted: 40 sectors, block size 2048, align 4 | read 40 sectors from 0: data ok\n+                                   asan:  header accepted: 40 sectors, block size 2048, align 4 | read 40 sectors from 0: data ok\n+zso read ok 100 300                plain: header accepted: 400 sectors, block size 2048, align 0 | read 300 sectors from 100: data ok\n+                                   asan:  header accepted: 400 sectors, block size 2048, align 0 | read 300 sectors from 100: data ok\n+zso read badidx 3 1                plain: header accepted: 10 sectors, block size 2048, align 0 | read 0 of 1 sectors from 3: read error\n+                                   asan:  header accepted: 10 sectors, block size 2048, align 0 | read 0 of 1 sectors from 3: read error\n+zso read 16k 0 4                   plain: header rejected (-1): block size 16384, align 0\n+                                   asan:  header rejected (-1): block size 16384, align 0\n+ps2cnf cnf_ok                      plain: ps2cnfGetBootFile = 0, bootfile = \"cdrom0:\\SLUS_200.62;1\"\n+                                   asan:  ps2cnfGetBootFile = 0, bootfile = \"cdrom0:\\SLUS_200.62;1\"\n+ps2cnf cnf_no_eq                   plain: ps2cnfGetBootFile = -1, bootfile = \"\"\n+                                   asan:  ps2cnfGetBootFile = -1, bootfile = \"\"\n+sbReadList ul64 0                  plain: ul.cfg size 64, 1 games: [Game A]\n+                                   asan:  ul.cfg size 64, 1 games: [Game A]\n+sbReadList ul65 0                  plain: ul.cfg size 65, 1 games: [Game A]\n+                                   asan:  ul.cfg size 65, 1 games: [Game A]\n+sbReadList ul129 0                 plain: ul.cfg size 129, 2 games: [Game A] [Game B]\n+                                   asan:  ul.cfg size 129, 2 games: [Game A] [Game B]\n+sbReadList ul65 2                  plain: ul.cfg size 65, 3 games: [Game A] [Game 0] [Game 1]\n+                                   asan:  ul.cfg size 65, 3 games: [Game A] [Game 0] [Game 1]\n+sbReadList ul129 2                 plain: ul.cfg size 129, 4 games: [Game A] [Game B] [Game 0] [Game 1]\n+                                   asan:  ul.cfg size 129, 4 games: [Game A] [Game B] [Game 0] [Game 1]\n+updateISOGameList 2 2              plain: cache 2, listed 2: games.bin kept\n+                                   asan:  cache 2, listed 2: games.bin kept\n+updateISOGameList 3 3 swap         plain: cache 3, listed 3 (reordered): games.bin kept\n+                                   asan:  cache 3, listed 3 (reordered): games.bin kept\n+updateISOGameList 1 2              plain: cache 1, listed 2: games.bin rewritten\n+                                   asan:  cache 1, listed 2: games.bin rewritten\n+isValidIsoName                     plain: ..                       format=0 name_len=-1 | x.iso                    format=2 name_len=1 | SLUS_200.62.Title.iso    format=1 name_len=5\n+                                   asan:  ..                       format=0 name_len=-1 | x.iso                    format=2 name_len=1 | SLUS_200.62.Title.iso    format=1 name_len=5\n+USBA_crc32                         plain: 4772616e64205468656674204175746f20494949 10D00014 | c8e3f0e0                 E857E311 | d098d0b3d180d0b0         E0598591\n+                                   asan:  4772616e64205468656674204175746f20494949 10D00014 | c8e3f0e0                 E857E311 | d098d0b3d180d0b0         E0598591\n+                                   ref:   (empty)                  00000000 | 41                       935FAD90 | 4772616e64205468656674204175746f20494949 10D00014 | c8e3f0e0                 E857E311 | d098d0b3d180d0b0         E0598591\n+readFileBuffer plain cfg           plain: line 1: \"a=1\" | line 2: \"b=2\" | 2 lines\n+                                   asan:  line 1: \"a=1\" | line 2: \"b=2\" | 2 lines\n+readFileBuffer '#' last line, no LF plain: line 1: \"a=1\" | 1 lines\n+                                   asan:  line 1: \"a=1\" | 1 lines\n+readFileBuffer read() fails        plain: 0 lines\n+                                   asan:  0 lines\n+strToColor #112233                 plain: color 11 22 33, canary CC CC CC CC\n+                                   asan:  color 11 22 33, canary CC CC CC CC\n+strToColor #11223344556677         plain: color 11 22 33, canary CC CC CC CC\n+                                   asan:  color 11 22 33, canary CC CC CC CC\n+splitAssignment 40-char key        plain: key length 31 (buffer 32): \"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk\"\n+                                   asan:  key length 31 (buffer 32): \"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk\"\n+parsePrefix 60-char prefix         plain: prefix length 31, canary intact\n+                                   asan:  prefix length 31, canary intact\n+configReadLegacyIP 300 bytes       plain: ps2_ip_addr=192.168.0.10 ps2_netmask=255.255.255.0 ps2_gateway=192.168.0.1 ps2_dns=192.168.0.1 -> 1\n+                                   asan:  ps2_ip_addr=192.168.0.10 ps2_netmask=255.255.255.0 ps2_gateway=192.168.0.1 ps2_dns=192.168.0.1 -> 1\n+CheckPS2Logo HDD                   plain: HDD logo check read 48 sectors of 512 bytes into a 24576-byte buffer\n+                                   asan:  HDD logo check read 48 sectors of 512 bytes into a 24576-byte buffer\n+cheat picks, distinct names        plain: picked after reload: [0 Mastercode]=1 [1 Infinite Health]=1 [2 Max Money]=0 [3 Moon Jump]=1\n+                                   asan:  picked after reload: [0 Mastercode]=1 [1 Infinite Health]=1 [2 Max Money]=0 [3 Moon Jump]=1\n+cheat picks, duplicate names       plain: picked after reload: [0 Mastercode]=1 [1 Infinite Health]=1 [2 Infinite Health]=1 [3 Max Money]=0\n+                                   asan:  picked after reload: [0 Mastercode]=1 [1 Infinite Health]=1 [2 Infinite Health]=1 [3 Max Money]=0\n+configWrite, write() ok            plain: configWrite = 1, modified = 0, file 10 of 10 bytes\n+                                   asan:  configWrite = 1, modified = 0, file 10 of 10 bytes\n+configWrite, write() fail          plain: configWrite = 0, modified = 1, file 0 of 10 bytes\n+                                   asan:  configWrite = 0, modified = 1, file 0 of 10 bytes\n+configWrite, write() short         plain: configWrite = 0, modified = 1, file 5 of 10 bytes\n+                                   asan:  configWrite = 0, modified = 1, file 5 of 10 bytes\n+cdvdman_read 2048 2                plain: read 2 sectors of 2048 bytes into a 4096-byte buffer\n+                                   asan:  read 2 sectors of 2048 bytes into a 4096-byte buffer\n+cdvdman_read 2340 1                plain: read 1 sectors of 2340 bytes into a 2340-byte buffer\n+                                   asan:  read 1 sectors of 2340 bytes into a 2340-byte buffer\n+cdvdman_read 2340 3                plain: read 3 sectors of 2340 bytes into a 7020-byte buffer\n+                                   asan:  read 3 sectors of 2340 bytes into a 7020-byte buffer\n+cdvdman_read 2328 2                plain: read 2 sectors of 2328 bytes into a 4656-byte buffer\n+                                   asan:  read 2 sectors of 2328 bytes into a 4656-byte buffer\n+bdmFindPartition write probe       plain: probe = 1 (mass0:); conf_opl.cfg 38 bytes before, 38 after\n+                                   asan : probe = 1 (mass0:); conf_opl.cfg 38 bytes before, 38 after\n+sysCheckVMC 4 MiB card, create 8 MB plain: returned 4; card kept, 4194304 bytes; no new card\n+                                   asan : returned 4; card kept, 4194304 bytes; no new card\n+sysCheckVMC PCSX2 .ps2 size, create 8 MB plain: returned 0; card kept, 8650752 bytes; no new card\n+                                   asan : returned 0; card kept, 8650752 bytes; no new card\n+sysCheckVMC 8 MiB card, create 8 MB plain: returned 8; card kept, 8388608 bytes; no new card\n+                                   asan : returned 8; card kept, 8388608 bytes; no new card\n+sysCheckVMC no card, create 8 MB   plain: returned -1; no card file; genvmc asked for a new 8 MB card\n+                                   asan : returned -1; no card file; genvmc asked for a new 8 MB card\n+sysCheckVMC 4 MiB card, delete     plain: returned -1; no card file; no new card\n+                                   asan : returned -1; no card file; no new card\n+fntFitString fits, exact buffer    plain: wrapped: \"two words\" | terminator kept\n+                                   asan:  wrapped: \"two words\" | terminator kept\n+fntFitString long word, exact buffer plain: wrapped: \"Averyveryverylongword\" | terminator kept\n+                                   asan:  wrapped: \"Averyveryverylongword\" | terminator kept\n+fntFitString 255-char config value plain: 255-character value: terminator kept, next pointer intact, bytes after it intact\n+                                   asan:  255-character value: terminator kept, next pointer intact, bytes after it intact\n+AttributeText wrap, config value   plain: config value after drawing: \"The quick brown fox jumps over the lazy dog\" | rendered text: \"Description:|The quick|brown fox|jumps over|the lazy dog\"\n+                                   asan:  config value after drawing: \"The quick brown fox jumps over the lazy dog\" | rendered text: \"Description:|The quick|brown fox|jumps over|the lazy dog\"\n+GameCountText count buffer         plain: GameCountText value: \"1234 games\"\n+                                   asan:  GameCountText value: \"1234 games\"\n+image file missing                 plain: image file missing: no texture, element disabled | freed\n+                                   asan:  image file missing: no texture, element disabled | freed\n+theme without ItemsList            plain: theme without ItemsList: gamesItemsList set, appsItemsList set\n+                                   asan:  theme without ItemsList: gamesItemsList set, appsItemsList set\n+lngReadEntry file names            plain: lang_Russian.lng: language \"Russian\" from mc0:/OPL/lang_Russian.lng | abcd.lng: skipped | ru.lng: skipped\n+                                   asan:  lang_Russian.lng: language \"Russian\" from mc0:/OPL/lang_Russian.lng | abcd.lng: skipped | ru.lng: skipped\n+GetBootFilename                    plain: cdrom0:\\SLUS_200.62;1: record \"SLUS_200.62\" (11 characters) | cdrom0:\\DATA\\ABCDEFGHIJKLMNOPQRST.ELF;1: record \"ABCDEFGHIJKLMNOP\" (16 characters)\n+                                   asan:  cdrom0:\\SLUS_200.62;1: record \"SLUS_200.62\" (11 characters) | cdrom0:\\DATA\\ABCDEFGHIJKLMNOPQRST.ELF;1: record \"ABCDEFGHIJKLMNOP\" (16 characters)\n+PrepareGSM $GSMVMode=0             plain: $GSMVMode=0: mode used 2, interlace 1, ffmd 0, display 001BF9FF0182E2BC, cmdline \"1 2 0 7874698008519356 56154283650848769 1 0 0 0 0 0\"\n+                                   asan:  $GSMVMode=0: mode used 2, interlace 1, ffmd 0, display 001BF9FF0182E2BC, cmdline \"1 2 0 7874698008519356 56154283650848769 1 0 0 0 0 0\"\n+PrepareGSM $GSMVMode=28            plain: $GSMVMode=28: mode used 75, interlace 0, ffmd 1, display 003FF4FF0882815E, cmdline \"0 75 1 18002299729379678 31525197431439361 2 0 0 0 0 0\"\n+                                   asan:  $GSMVMode=28: mode used 75, interlace 0, ffmd 1, display 003FF4FF0882815E, cmdline \"0 75 1 18002299729379678 31525197431439361 2 0 0 0 0 0\"\n+PrepareGSM $GSMVMode=29            plain: $GSMVMode=29: mode used 2, interlace 1, ffmd 0, display 001BF9FF0182E2BC, cmdline \"1 2 0 7874698008519356 56154283650848769 1 0 0 0 0 0\"\n+                                   asan:  $GSMVMode=29: mode used 2, interlace 1, ffmd 0, display 001BF9FF0182E2BC, cmdline \"1 2 0 7874698008519356 56154283650848769 1 0 0 0 0 0\"\n+PrepareGSM $GSMVMode=-1            plain: $GSMVMode=-1: mode used 2, interlace 1, ffmd 0, display 001BF9FF0182E2BC, cmdline \"1 2 0 7874698008519356 56154283650848769 1 0 0 0 0 0\"\n+                                   asan:  $GSMVMode=-1: mode used 2, interlace 1, ffmd 0, display 001BF9FF0182E2BC, cmdline \"1 2 0 7874698008519356 56154283650848769 1 0 0 0 0 0\"\n+readPads tick counter wrap         plain: held button: countdown 590 ms before the wrap, 580 ms after it (10 ms later)\n+                                   asan:  held button: countdown 590 ms before the wrap, 580 ms after it (10 ms later)\n+genvmc write ok                    plain: write ok: mc_writecluster = 0, abort semaphore released\n+                                   asan:  write ok: mc_writecluster = 0, abort semaphore released\n+genvmc write short                 plain: write short: mc_writecluster = -1, abort semaphore released\n+                                   asan:  write short: mc_writecluster = -1, abort semaphore released\n+bgmLoad default_bgm_path           plain: format string = \"%s\" | bgmLoad = -2\n+                                   asan:  format string = \"%s\" | bgmLoad = -2"
        },
        {
          "sha": "e406ba9c4ba81f68f77704c4d9674d1ea988089b",
          "filename": "labs/host-repro/extract.py",
          "status": "added",
          "additions": 70,
          "deletions": 0,
          "changes": 70,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fextract.py",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fextract.py",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fextract.py?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,70 @@\n+\"\"\"Copy named top-level C functions, #defines and structs out of an OPL source file.\n+\n+Usage: extract.py <source.c> <name> [<name> ...]\n+A name matches a function definition (`... name(` at column 0, body up to the\n+next `}` at column 0), a `#define name` (with its continuation lines), a\n+`struct name` block or a `typedef struct { ... } name;` block. A name that\n+starts with `?` may be absent (a helper that only a fixed tree has). Output\n+goes to stdout in source order.\n+\"\"\"\n+import re\n+import sys\n+\n+\n+def main():\n+    path = sys.argv[1]\n+    required = set(n for n in sys.argv[2:] if not n.startswith(\"?\"))\n+    names = set(n.lstrip(\"?\") for n in sys.argv[2:])\n+    lines = open(path, encoding=\"latin-1\").read().splitlines()\n+    out, found = [], set()\n+    i = 0\n+    while i < len(lines):\n+        line = lines[i]\n+        m = re.match(r\"#define\\s+(\\w+)\", line)\n+        if m and m.group(1) in names:\n+            j = i\n+            while lines[j].rstrip().endswith(\"\\\\\"):\n+                j += 1\n+            out.extend(lines[i : j + 1])\n+            found.add(m.group(1))\n+            i = j + 1\n+            continue\n+        m = re.match(r\"^struct\\s+(\\w+)\\s*$\", line)\n+        if m and m.group(1) in names:\n+            j = i\n+            while not lines[j].startswith(\"}\"):\n+                j += 1\n+            out.extend(lines[i : j + 1])\n+            out.append(\"\")\n+            found.add(m.group(1))\n+            i = j + 1\n+            continue\n+        if re.match(r\"^typedef struct(\\s+\\w+)?\\s*$\", line):\n+            j = i\n+            while not lines[j].startswith(\"}\"):\n+                j += 1\n+            m = re.match(r\"^\\}\\s*(\\w+)\\s*;\", lines[j])\n+            if m and m.group(1) in names:\n+                out.extend(lines[i : j + 1])\n+                out.append(\"\")\n+                found.add(m.group(1))\n+                i = j + 1\n+                continue\n+        m = re.match(r\"^[A-Za-z_].*?\\b(\\w+)\\s*\\(\", line)\n+        if m and m.group(1) in names and not line.rstrip().endswith(\";\"):\n+            j = i\n+            while lines[j] != \"}\":\n+                j += 1\n+            out.extend(lines[i : j + 1])\n+            out.append(\"\")\n+            found.add(m.group(1))\n+            i = j + 1\n+            continue\n+        i += 1\n+    missing = required - found\n+    if missing:\n+        sys.exit(\"not found in %s: %s\" % (path, \", \".join(sorted(missing))))\n+    print(\"\\n\".join(out))\n+\n+\n+main()"
        },
        {
          "sha": "17c61667554c0c459f4f551cf01e054f088b8524",
          "filename": "labs/host-repro/find_harness.c",
          "status": "added",
          "additions": 79,
          "deletions": 0,
          "changes": 79,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Ffind_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Ffind_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Ffind_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,79 @@\n+/* Host harness for cdvdman_findfile() from modules/isofs/isofs.c: opens argv[1] on a fake\n+ * disc whose root holds SYSTEM.CNF;1 and a file with a 20-character name. */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned char u8;\n+typedef unsigned int u32;\n+#define __attribute__(x)\n+#define DPRINTF(...)\n+\n+typedef struct\n+{\n+    u32 lsn;\n+    u32 size;\n+    char name[16];\n+    u8 date[8];\n+} cd_file_t;\n+typedef struct\n+{\n+    u32 maxLBA;\n+    u32 rootDirtocLBA;\n+    u32 rootDirtocLength;\n+} layer_info_t;\n+static struct\n+{\n+    layer_info_t layer_info[2];\n+} MountPoint;\n+\n+static u8 disc[64][2048];\n+static unsigned char cdvdman_buf[2048];\n+\n+static int sceCdReadDvdDualInfo(int *on_dual, u32 *layer1_start)\n+{\n+    *on_dual = 0;\n+    *layer1_start = 0;\n+    return 1;\n+}\n+static int cdEmuRead(u32 lsn, unsigned int count, void *buffer)\n+{\n+    memcpy(buffer, disc[lsn], count * 2048);\n+    return 0;\n+}\n+\n+#pragma pack(push, 1)\n+#include \"find_extracted.c\"\n+#pragma pack(pop)\n+\n+static int rec(u8 *sec, int pos, int len_dr, u32 lba, u32 size, int flags, const char *name)\n+{\n+    u8 *r = sec + pos;\n+    int name_len = name[0] < 2 ? 1 : (int)strlen(name); /* names 0x00 and 0x01 are . and .. */\n+    r[0] = (u8)len_dr;\n+    memcpy(r + 2, &lba, 4);\n+    memcpy(r + 10, &size, 4);\n+    r[25] = (u8)flags;\n+    r[32] = (u8)name_len;\n+    memcpy(r + 33, name, name_len);\n+    return pos + len_dr;\n+}\n+\n+int main(int argc, char **argv)\n+{\n+    cd_file_t cdfile;\n+    int pos = 0, r;\n+\n+    pos = rec(disc[20], pos, 34, 20, 2048, 2, \"\\0\");\n+    pos = rec(disc[20], pos, 34, 20, 2048, 2, \"\\1\");\n+    pos = rec(disc[20], pos, 46, 24, 100, 0, \"SYSTEM.CNF;1\");\n+    pos = rec(disc[20], pos, 56, 25, 200, 0, \"LONGNAME_123456.TXT;1\");\n+    pos = rec(disc[20], pos, 66, 26, 300, 0, \"A_VERY_LONG_LEVEL2_FILENAME.TXT;1\");\n+    MountPoint.layer_info[0].rootDirtocLBA = 20;\n+    MountPoint.layer_info[0].rootDirtocLength = 2048;\n+\n+    memset(&cdfile, 0, sizeof(cdfile));\n+    r = cdvdman_findfile(&cdfile, argv[1], 0);\n+    printf(\"%s: found=%d lsn=%u size=%u name=\\\"%.16s\\\"\\n\", argv[1], r, cdfile.lsn, cdfile.size, cdfile.name);\n+    return 0;\n+}"
        },
        {
          "sha": "9572a8f8abbb94f09c86fb6e140fadec3f471bbd",
          "filename": "labs/host-repro/gameid_harness.c",
          "status": "added",
          "additions": 76,
          "deletions": 0,
          "changes": 76,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fgameid_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fgameid_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fgameid_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,76 @@\n+/* Host harness: the game ID OPL's game list derives from an image file, as in\n+ * scanForISO(): find SYSTEM.CNF;1 in the root with isofs cdvdman_locatefile(), then\n+ * GetStartupExecName() (src/supportbase.c) and ps2cnfGetBootFile() (src/ps2cnf.c). */\n+#include <ctype.h>\n+#include <errno.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned char u8;\n+typedef unsigned int u32;\n+#define __attribute__(x)\n+#define DPRINTF(...)\n+#define LOG(...)\n+#define CNF_PATH_LEN_MAX 64\n+#define GAME_STARTUP_MAX 12\n+\n+static FILE *image;\n+static unsigned char cdvdman_buf[2048];\n+\n+static int sceCdReadDvdDualInfo(int *on_dual, u32 *layer1_start)\n+{\n+    *on_dual = 0;\n+    *layer1_start = 0;\n+    return 1;\n+}\n+static int cdEmuRead(u32 lsn, unsigned int count, void *buffer)\n+{\n+    memset(buffer, 0, count * 2048);\n+    fseek(image, (long)lsn * 2048, SEEK_SET);\n+    fread(buffer, 2048, count, image);\n+    return 0;\n+}\n+int ps2cnfGetBootFile(const char *path, char *bootfile);\n+\n+#pragma pack(push, 1)\n+#include \"gameid_extracted.c\"\n+#pragma pack(pop)\n+\n+int main(int argc, char **argv)\n+{\n+    static u8 pvd[2048], cnf[2048];\n+    char startup[GAME_STARTUP_MAX], tmp[L_tmpnam + 16];\n+    struct dirTocEntry *root, *e;\n+    char path[] = \"SYSTEM.CNF;1\";\n+    FILE *t;\n+    int r;\n+\n+    image = fopen(argv[1], \"rb\");\n+    if (image == NULL)\n+        return 2;\n+    cdEmuRead(16, 1, pvd);\n+    if (pvd[0] != 1 || memcmp(&pvd[1], \"CD001\", 5) != 0) {\n+        printf(\"no ISO9660 volume: skipped\\n\");\n+        return 0;\n+    }\n+    root = (struct dirTocEntry *)&pvd[0x9c];\n+    e = cdvdman_locatefile(path, root->fileLBA, root->fileSize, 0);\n+    if (e == NULL) {\n+        printf(\"no SYSTEM.CNF;1: hidden\\n\");\n+        return 0;\n+    }\n+    cdEmuRead(e->fileLBA, 1, cnf);\n+    sprintf(tmp, \"%s.cnf\", argv[1]);\n+    t = fopen(tmp, \"wb\");\n+    fwrite(cnf, 1, e->fileSize < 2048 ? e->fileSize : 2048, t);\n+    fclose(t);\n+    memset(startup, 0, sizeof(startup));\n+    r = GetStartupExecName(tmp, startup, GAME_STARTUP_MAX - 1);\n+    remove(tmp);\n+    if (r != 0)\n+        printf(\"hidden (GetStartupExecName = %d)\\n\", r);\n+    else\n+        printf(\"ID \\\"%s\\\"\\n\", startup);\n+    return 0;\n+}"
        },
        {
          "sha": "892ae6084b8974c3e810bfe6fd8480f6c703bb89",
          "filename": "labs/host-repro/genvmc_harness.c",
          "status": "added",
          "additions": 34,
          "deletions": 0,
          "changes": 34,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fgenvmc_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fgenvmc_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fgenvmc_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,34 @@\n+/* Host harness for modules/vmc/genvmc/genvmc.c mc_writecluster(): the write of\n+ * one cluster under the abort semaphore. Argument: 1 makes write() short. */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef struct\n+{\n+    int cluster_size;\n+} MCDevInfo;\n+\n+static MCDevInfo devinfo = {1024};\n+static int genvmc_abort = 0;\n+static int genvmc_abort_sema = 1;\n+static int sema_depth = 0;\n+static int write_short = 0;\n+\n+static void WaitSema(int sema) { sema_depth++; }\n+static void SignalSema(int sema) { sema_depth--; }\n+static long lseek(int fd, long offset, int whence) { return offset; }\n+static int write(int fd, const void *buf, int size) { return write_short ? size - 1 : size; }\n+\n+#include \"genvmc_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    char cluster[1024];\n+    int r;\n+\n+    write_short = argc > 1 && atoi(argv[1]);\n+    r = mc_writecluster(3, 0, cluster, 1);\n+    printf(\"write %s: mc_writecluster = %d, abort semaphore %s\\n\", write_short ? \"short\" : \"ok\", r, sema_depth == 0 ? \"released\" : \"LEFT TAKEN\");\n+    return 0;\n+}"
        },
        {
          "sha": "ab58a7ba99f6305dbf7b44f58253f29bcfa7f6ce",
          "filename": "labs/host-repro/gsm_harness.c",
          "status": "added",
          "additions": 63,
          "deletions": 0,
          "changes": 63,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fgsm_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fgsm_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fgsm_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,63 @@\n+/* Host harness for src/gsm.c PrepareGSM(): the per-game $GSMVMode indexes the\n+ * table of video modes. Argument: the $GSMVMode value. The GS mode constants of\n+ * gsKit are replaced by distinct numbers; only the table lookup is under test. */\n+#include <fcntl.h>\n+#include <io.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned char u8;\n+typedef short s16;\n+typedef unsigned int u32;\n+typedef unsigned long long u64;\n+#define LOG(...)\n+#define open     _open\n+#define read     _read\n+#define close    _close\n+#define O_RDONLY _O_RDONLY\n+\n+#define GS_INTERLACED       1\n+#define GS_NONINTERLACED    0\n+#define GS_FIELD            0\n+#define GS_FRAME            1\n+#define GS_MODE_NTSC        0x02\n+#define GS_MODE_PAL         0x03\n+#define GS_MODE_DTV_480P    0x50\n+#define GS_MODE_DTV_576P    0x53\n+#define GS_MODE_DTV_720P    0x52\n+#define GS_MODE_DTV_1080I   0x51\n+#define GS_MODE_VGA_640_60  0x1A\n+#define GS_MODE_VGA_640_72  0x1B\n+#define GS_MODE_VGA_640_75  0x1C\n+#define GS_MODE_VGA_640_85  0x1D\n+#define GS_MODE_VGA_800_56  0x2A\n+#define GS_MODE_VGA_800_60  0x2B\n+#define GS_MODE_VGA_800_72  0x2C\n+#define GS_MODE_VGA_800_75  0x2D\n+#define GS_MODE_VGA_800_85  0x2E\n+#define GS_MODE_VGA_1024_60 0x3B\n+#define GS_MODE_VGA_1024_70 0x3C\n+#define GS_MODE_VGA_1024_75 0x3D\n+#define GS_MODE_VGA_1024_85 0x3E\n+#define GS_MODE_VGA_1280_60 0x4A\n+#define GS_MODE_VGA_1280_75 0x4B\n+\n+static int gGSMVMode;\n+static int gGSMXOffset;\n+static int gGSMYOffset;\n+static int gGSMFIELDFix;\n+\n+#include \"gsm_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    char cmdline[256];\n+    struct GsmConfig_t config;\n+\n+    gGSMVMode = atoi(argv[1]);\n+    memset(&config, 0, sizeof(config));\n+    PrepareGSM(cmdline, &config);\n+    printf(\"$GSMVMode=%s: mode used %d, interlace %d, ffmd %d, display %016llX, cmdline \\\"%s\\\"\\n\", argv[1], config.mode, config.interlace, config.ffmd, config.display, cmdline);\n+    return 0;\n+}"
        },
        {
          "sha": "01ba70a0002778b45b9c76da37f765a841aa552e",
          "filename": "labs/host-repro/history_harness.c",
          "status": "added",
          "additions": 26,
          "deletions": 0,
          "changes": 26,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fhistory_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fhistory_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fhistory_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,26 @@\n+/* Host harness for src/OSDHistory.c GetBootFilename() and\n+ * AddHistoryRecordUsingFullPath(): the launch path is cut to the file name that\n+ * goes into the OSD history. Each argument is a boot path. */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+int AddHistoryRecord(const char *name)\n+{\n+    printf(\"record \\\"%s\\\" (%u characters)\\n\", name, (unsigned int)strlen(name));\n+    return 0;\n+}\n+\n+#include \"history_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    int i;\n+\n+    for (i = 1; i < argc; i++) {\n+        printf(\"%s: \", argv[i]);\n+        fflush(stdout);\n+        AddHistoryRecordUsingFullPath(argv[i]);\n+    }\n+    return 0;\n+}"
        },
        {
          "sha": "cc6b5c4b067092d5f685c1cb58a429b261b46360",
          "filename": "labs/host-repro/iso_harness.c",
          "status": "added",
          "additions": 107,
          "deletions": 0,
          "changes": 107,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fiso_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fiso_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fiso_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,107 @@\n+/* Host harness for cdvdman_locatefile(): modules/isofs/isofs.c (EE game list) or, with\n+ * /DINGAME, modules/iopcore/cdvdman/searchfile.c (in-game CDVDMAN). The root directory\n+ * of a fake disc is built from the test name given in argv[1]. */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned char u8;\n+typedef unsigned short u16;\n+typedef unsigned int u32;\n+#define __attribute__(x)\n+#define DPRINTF(...)\n+\n+static u8 disc[64][2048];\n+static unsigned char cdvdman_buf[2048];\n+static long reads; /* sector reads, to tell a hang from a slow scan */\n+\n+static int sceCdReadDvdDualInfo(int *on_dual, unsigned int *layer1_start)\n+{\n+    *on_dual = 0;\n+    *layer1_start = 0;\n+    return 1;\n+}\n+\n+#ifdef INGAME\n+#define IOPCORE_COMPAT_EMU_DVDDL 0x10\n+static struct\n+{\n+    struct\n+    {\n+        u32 flags;\n+    } common;\n+} cdvdman_settings;\n+static int sceCdRead(u32 lsn, u32 count, void *buf, void *mode)\n+{\n+    if (++reads > 1000000 || lsn + count > 64)\n+        exit(3);\n+    memcpy(buf, disc[lsn], count * 2048);\n+    return 1;\n+}\n+static int sceCdSync(int mode) { return 0; }\n+#else\n+static int cdEmuRead(u32 lsn, unsigned int count, void *buffer)\n+{\n+    if (++reads > 1000000 || lsn + count > 64)\n+        exit(3);\n+    memcpy(buffer, disc[lsn], count * 2048);\n+    return 0;\n+}\n+#endif\n+\n+#pragma pack(push, 1)\n+#include \"iso_extracted.c\"\n+#pragma pack(pop)\n+\n+/* ISO 9660 9.1: LEN_DR, extended attribute length, LBA (both-endian), size, ..., flags, name. */\n+static int rec(u8 *sec, int pos, int len_dr, int xa, u32 lba, u32 size, int flags, const char *name, int name_len)\n+{\n+    u8 *r = sec + pos;\n+    r[0] = (u8)len_dr;\n+    r[1] = (u8)xa;\n+    memcpy(r + 2, &lba, 4);\n+    memcpy(r + 10, &size, 4);\n+    r[25] = (u8)flags;\n+    r[32] = (u8)name_len;\n+    memcpy(r + 33, name, name_len);\n+    return pos + len_dr;\n+}\n+\n+int main(int argc, char **argv)\n+{\n+    const char *test = argv[1];\n+    u8 *root = disc[20];\n+    int pos = 0;\n+    struct dirTocEntry *e;\n+#ifdef INGAME\n+    char path[] = \"\\\\SYSTEM.CNF;1\";\n+#else\n+    char path[] = \"SYSTEM.CNF;1\";\n+#endif\n+\n+    if (strcmp(test, \"file\") == 0) { /* an image file whose root directory is at LBA 20 */\n+        FILE *f = fopen(argv[2], \"rb\");\n+        if (f == NULL)\n+            return 2;\n+        fread(disc, 1, sizeof(disc), f);\n+        fclose(f);\n+        goto locate;\n+    }\n+    pos = rec(root, pos, 34, 0, 20, 2048, 2, \"\\0\", 1);\n+    pos = rec(root, pos, 34, 0, 20, 2048, 2, \"\\1\", 1);\n+    if (strcmp(test, \"zero\") == 0) /* name length 0, record length 34 */\n+        pos = rec(root, pos, 34, 0, 30, 10, 0, \"\", 0);\n+    else if (strcmp(test, \"xa\") == 0) /* extended attribute length 0x80 in byte 1 */\n+        pos = rec(root, pos, 46, 0x80, 30, 10, 0, \"A.TXT;1\", 7);\n+    else if (strcmp(test, \"long\") == 0) /* ISO 9660 level 2 name of 33 characters */\n+        pos = rec(root, pos, 66, 0, 30, 10, 0, \"A_VERY_LONG_LEVEL2_FILENAME.TXT;1\", 33);\n+    pos = rec(root, pos, 46, 0, 24, 100, 0, \"SYSTEM.CNF;1\", 12);\n+\n+locate:\n+    e = cdvdman_locatefile(path, 20, 2048, 0);\n+    if (e != NULL)\n+        printf(\"found lba=%u size=%u after %ld sector reads\\n\", e->fileLBA, e->fileSize, reads);\n+    else\n+        printf(\"not found after %ld sector reads\\n\", reads);\n+    return 0;\n+}"
        },
        {
          "sha": "7b3b83e3009f076c66ee24176e908558295a5208",
          "filename": "labs/host-repro/lang_harness.c",
          "status": "added",
          "additions": 37,
          "deletions": 0,
          "changes": 37,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Flang_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Flang_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Flang_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,37 @@\n+/* Host harness for src/lang.c lngReadEntry(): the directory scan callback that\n+ * registers a language file. Each argument is a file name found in mc0:/OPL. */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+#define LOG(...)\n+#define MAX_LANGUAGE_FILES 15\n+#define DT_DIR             4\n+\n+typedef struct\n+{\n+    char *filePath;\n+    char *name;\n+} language_t;\n+\n+static int nLanguages = 0;\n+static language_t languages[MAX_LANGUAGE_FILES];\n+\n+#include \"lang_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    int i, index;\n+\n+    for (i = 1; i < argc; i++) {\n+        memset(languages, 0, sizeof(languages));\n+        index = lngReadEntry(0, \"mc0:/OPL\", \"/\", argv[i], 0);\n+        if (index == 1) {\n+            printf(\"%s: language \\\"%s\\\" from %s\\n\", argv[i], languages[0].name, languages[0].filePath);\n+            free(languages[0].name);\n+            free(languages[0].filePath);\n+        } else\n+            printf(\"%s: skipped\\n\", argv[i]);\n+    }\n+    return 0;\n+}"
        },
        {
          "sha": "5fa04f83e954ba01a3c9617c039158a8c8b1ebeb",
          "filename": "labs/host-repro/make_console_kit.py",
          "status": "added",
          "additions": 241,
          "deletions": 0,
          "changes": 241,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fmake_console_kit.py",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fmake_console_kit.py",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fmake_console_kit.py?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,241 @@\n+\"\"\"Build console test files for the parser fixes from one bootable PS2 ISO.\n+\n+Usage: make_console_kit.py <bootable.iso> <out dir>\n+\n+The ISO must have SYSTEM.CNF;1 in its root and fit its root directory in one sector, e.g. a\n+homebrew ELF packed as a disc. Every variant keeps that ISO's game ID. Cheat files only use\n+codes with address 0 and no hook line (9xxxxxxx): without a hook the cheat engine never\n+applies the codes it is given.\n+\"\"\"\n+import os\n+import shutil\n+import struct\n+import sys\n+import zlib\n+\n+SECTOR = 2048\n+\n+\n+def usba_crc32(name: bytes) -> int:\n+    \"\"\"USBA_crc32 with unsigned bytes, as OPL computes it after the fix.\"\"\"\n+    tab = [0] * 256\n+    crc = 0\n+    for t in range(256):\n+        crc = (t << 24) & 0xFFFFFFFF\n+        for _ in range(8):\n+            crc = (crc << 1) & 0xFFFFFFFF if crc & 0x80000000 else ((crc << 1) ^ 0x04C11DB7) & 0xFFFFFFFF\n+        tab[255 - t] = crc\n+    for b in (name + b\"\\0\")[:33]:\n+        crc = tab[b ^ (crc >> 24)] ^ ((crc << 8) & 0xFFFFFF00)\n+    return crc\n+\n+\n+def root_dir(iso: bytearray):\n+    pvd = 16 * SECTOR\n+    assert iso[pvd] == 1 and iso[pvd + 1 : pvd + 6] == b\"CD001\"\n+    lba, size = struct.unpack_from(\"<I\", iso, pvd + 156 + 2)[0], struct.unpack_from(\"<I\", iso, pvd + 156 + 10)[0]\n+    assert size == SECTOR, \"root directory must be one sector\"\n+    records, pos = [], lba * SECTOR\n+    while iso[pos] != 0:\n+        records.append(bytes(iso[pos : pos + iso[pos]]))\n+        pos += iso[pos]\n+    return lba, records\n+\n+\n+def record(name: bytes, lba: int, size: int, xa: int = 0) -> bytes:\n+    length = 33 + len(name) + (1 - len(name) % 2)  # ISO 9660 9.1.12: pad to an even length\n+    r = bytearray(length)\n+    r[0], r[1] = length, xa\n+    struct.pack_into(\"<I\", r, 2, lba)\n+    struct.pack_into(\">I\", r, 6, lba)\n+    struct.pack_into(\"<I\", r, 10, size)\n+    struct.pack_into(\">I\", r, 14, size)\n+    r[32] = len(name)\n+    r[33 : 33 + len(name)] = name\n+    return bytes(r)\n+\n+\n+def with_record_after_dotdot(base: bytes, extra: bytes) -> bytes:\n+    \"\"\"Insert a record right after '.' and '..', before SYSTEM.CNF;1, as OPL scans in order.\"\"\"\n+    iso = bytearray(base)\n+    lba, records = root_dir(iso)\n+    sector = b\"\".join(records[:2] + [extra] + records[2:])\n+    assert len(sector) <= SECTOR\n+    iso[lba * SECTOR : (lba + 1) * SECTOR] = sector.ljust(SECTOR, b\"\\0\")\n+    return bytes(iso)\n+\n+\n+def system_cnf(iso: bytes):\n+    _, records = root_dir(bytearray(iso))\n+    for r in records:\n+        if r[33 : 33 + r[32]] == b\"SYSTEM.CNF;1\":\n+            return struct.unpack_from(\"<I\", r, 2)[0], struct.unpack_from(\"<I\", r, 10)[0]\n+    raise SystemExit(\"no SYSTEM.CNF;1 in the root\")\n+\n+\n+def game_id(iso: bytes) -> bytes:\n+    lba, size = system_cnf(iso)\n+    cnf = iso[lba * SECTOR : lba * SECTOR + size]\n+    value = cnf.split(b\"BOOT2\", 1)[1].split(b\"=\", 1)[1].strip().split(b\"\\r\")[0].split(b\"\\n\")[0]\n+    return value.split(b\":\", 1)[1].lstrip(b\"\\\\\").split(b\";\")[0]\n+\n+\n+def zso(iso: bytes, align: int = 0) -> bytes:\n+    \"\"\"ZSO with every block stored uncompressed (index bit 31 set).\"\"\"\n+    blocks = len(iso) // SECTOR\n+    data = 24 + 4 * (blocks + 1)\n+    index = [((data + k * SECTOR) >> align) | 0x80000000 for k in range(blocks)] + [(data + blocks * SECTOR) >> align]\n+    header = b\"ZISO\" + struct.pack(\"<IQIBB2x\", 24, len(iso), SECTOR, 1, align)\n+    return header + struct.pack(\"<%dI\" % len(index), *index) + iso\n+\n+\n+def zso_blocks(iso: bytes, block_size: int) -> bytes:\n+    \"\"\"ZSO with uncompressed blocks of block_size bytes, as maxcso writes 16 KiB blocks by default\n+    for images of 2 GiB and more. The image is padded to whole blocks.\"\"\"\n+    iso = iso + b\"\\0\" * ((-len(iso)) % block_size)\n+    blocks = len(iso) // block_size\n+    data = 24 + 4 * (blocks + 1)\n+    index = [(data + k * block_size) | 0x80000000 for k in range(blocks)] + [data + blocks * block_size]\n+    header = b\"ZISO\" + struct.pack(\"<IQIBB2x\", 24, len(iso), block_size, 1, 0)\n+    return header + struct.pack(\"<%dI\" % len(index), *index) + iso\n+\n+\n+def zso_bad_index(z: bytes, sector: int) -> bytes:\n+    \"\"\"Swap the index entries of `sector` and the next one: the sector then ends before it starts.\"\"\"\n+    z = bytearray(z)\n+    a, b = 24 + 4 * sector, 24 + 4 * (sector + 1)\n+    z[a : a + 4], z[b : b + 4] = z[b : b + 4], z[a : a + 4]\n+    return bytes(z)\n+\n+\n+def png_grey(width: int, height: int) -> bytes:\n+    \"\"\"An 8-bit greyscale PNG (colour type 0) with a diagonal gradient.\"\"\"\n+\n+    def chunk(tag: bytes, data: bytes) -> bytes:\n+        return struct.pack(\">I\", len(data)) + tag + data + struct.pack(\">I\", zlib.crc32(tag + data) & 0xFFFFFFFF)\n+\n+    rows = b\"\".join(b\"\\0\" + bytes((x + y) & 0xFF for x in range(width)) for y in range(height))\n+    ihdr = struct.pack(\">IIBBBBB\", width, height, 8, 0, 0, 0, 0)\n+    return b\"\\x89PNG\\r\\n\\x1a\\n\" + chunk(b\"IHDR\", ihdr) + chunk(b\"IDAT\", zlib.compress(rows)) + chunk(b\"IEND\", b\"\")\n+\n+\n+THEME_CFG = \"\"\"# YAOPL test theme: no ItemsList (OPL adds a default one), a StaticImage whose file is missing,\n+# a GameCountText and a wrapped Description\n+main0:\n+\\ttype=Background\n+\\tpattern=BG\n+main1:\n+\\ttype=StaticImage\n+\\tdefault=missing_image\n+\\tx=420\n+\\ty=40\n+main2:\n+\\ttype=GameCountText\n+\\tx=420\n+\\ty=60\n+main3:\n+\\ttype=AttributeText\n+\\tattribute=Description\n+\\tx=420\n+\\ty=90\n+\\twidth=200\n+\\theight=300\n+\\twrap=1\n+main4:\n+\\ttype=ItemText\n+\\tx=-124\n+\\ty=-155\n+main5:\n+\\ttype=HintText\n+\\taligned=1\n+\\tx=POS_MID\n+\"\"\"\n+\n+\n+def ul_record(name: bytes, startup: bytes) -> bytes:\n+    r = bytearray(64)\n+    r[0 : len(name)] = name\n+    r[0x20:0x23] = b\"ul.\"\n+    r[0x23 : 0x23 + len(startup)] = startup\n+    r[0x2F] = 1  # parts\n+    r[0x30] = 0x14  # DVD\n+    r[0x35] = 0x08\n+    return bytes(r)\n+\n+\n+def write(path, data):\n+    os.makedirs(os.path.dirname(path), exist_ok=True)\n+    with open(path, \"wb\") as f:\n+        f.write(data)\n+\n+\n+def main():\n+    base = open(sys.argv[1], \"rb\").read()\n+    out = sys.argv[2]\n+    gid = game_id(base)\n+    cnf_lba, cnf_size = system_cnf(base)\n+    dvd = os.path.join(out, \"stick\", \"DVD\")\n+\n+    write(os.path.join(dvd, \"T0 control.iso\"), base)\n+    write(os.path.join(dvd, \"T1 zero-length name.iso\"), with_record_after_dotdot(base, record(b\"\", cnf_lba, cnf_size)))\n+    write(os.path.join(dvd, \"T2 ext-attr byte.iso\"), with_record_after_dotdot(base, record(b\"XA.TXT;1\", cnf_lba, cnf_size, xa=0x80)))\n+    write(os.path.join(dvd, \"T3 long file name.iso\"), with_record_after_dotdot(base, record(b\"A_VERY_LONG_LEVEL2_FILENAME.TXT;1\", cnf_lba, cnf_size)))\n+    no_eq = bytearray(base)\n+    start = cnf_lba * SECTOR\n+    cnf = bytes(no_eq[start : start + cnf_size])\n+    i = cnf.index(b\"BOOT2\") + 5\n+    j = cnf.index(b\"=\", i)\n+    no_eq[start + j] = ord(\" \")\n+    write(os.path.join(dvd, \"T4 BOOT2 without equals.iso\"), bytes(no_eq))\n+    control_zso = zso(base, 0)\n+    write(os.path.join(dvd, \"T5 control.zso\"), control_zso)\n+    write(os.path.join(dvd, \"T6 align 12.zso\"), control_zso[:21] + bytes([12]) + control_zso[22:])\n+    write(os.path.join(dvd, \"T10 16k blocks.zso\"), zso_blocks(base, 16384))\n+    # The index of the SYSTEM.CNF sector is corrupt: reading it must fail, not write before the buffer\n+    write(os.path.join(dvd, \"T11 bad index.zso\"), zso_bad_index(control_zso, cnf_lba))\n+\n+    # One record plus one stray byte; the chunk is the control image.\n+    name = b\"T7 ragged ul.cfg\"\n+    write(os.path.join(out, \"ul-ragged\", \"ul.cfg\"), ul_record(name, gid) + b\"\\0\")\n+    write(os.path.join(out, \"ul-ragged\", \"ul.%08X.%s.00\" % (usba_crc32(name), gid.decode())), base)\n+\n+    for name in (b\"T8 ul ASCII title\", \"T9 \u0422\u0435\u0441\u0442 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u044b\".encode(\"utf-8\")):\n+        assert len(name) <= 32\n+        write(os.path.join(out, \"ul-cyrillic\", \"ul.%08X.%s.00\" % (usba_crc32(name), gid.decode())), base)\n+    write(\n+        os.path.join(out, \"ul-cyrillic\", \"ul.cfg\"),\n+        ul_record(b\"T8 ul ASCII title\", gid) + ul_record(\"T9 \u0422\u0435\u0441\u0442 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u044b\".encode(\"utf-8\"), gid),\n+    )\n+\n+    cht = gid.decode() + \".cht\"\n+    write(\n+        os.path.join(out, \"cht-indented\", cht),\n+        b'\"Indented comment test\"\\r\\nMastercode\\r\\n00000000 00000001\\r\\n\\r\\n'\n+        b\" //An indented comment\\r\\n00000000 00000002\\r\\n\\r\\nCheat B\\r\\n00000000 00000003\\r\\n\",\n+    )\n+    write(os.path.join(out, \"cht-251\", cht), b\"\".join(b\"Cheat %d\\r\\n00000000 %08X\\r\\n\" % (n, n + 1) for n in range(251)))\n+    write(os.path.join(out, \"cht-long-last-line\", cht), b\"Cheat A\\r\\n00000000 00000001\\r\\nCheat B\\r\\n00000000 00000002\\r\\n\" + b\"X\" * 400)\n+    cht_dup = (\n+        b\"Mastercode\\r\\n00000000 00000001\\r\\n\"\n+        b\"Character A\\r\\nInfinite Health\\r\\n00000000 00000002\\r\\n\"\n+        b\"Character B\\r\\nInfinite Health\\r\\n00000000 00000003\\r\\n\"\n+    )\n+    write(os.path.join(out, \"cht-duplicate-names\", cht), cht_dup)\n+\n+    # The game's own CFG, ending with a comment line without LF\n+    write(os.path.join(out, \"cfg-comment-end\", gid.decode() + \".cfg\"), b\"$Compatibility=0\\r\\n#end\")\n+    # A VMC of a size OPL's menu does not offer (contents do not matter for the menu)\n+    write(os.path.join(out, \"vmc-4mb\", \"keep4mb.bin\"), bytes(4 * 1024 * 1024))\n+\n+    # A Description of 255 characters, the most the config reader keeps, for the test theme's wrap\n+    description = b\"\".join(b\"Word%03d \" % n for n in range(40))[:255]\n+    write(os.path.join(out, \"cfg-long-description\", gid.decode() + \".cfg\"), b\"Title=Long description test\\r\\nDescription=\" + description + b\"\\r\\n\")\n+    write(os.path.join(out, \"theme-test\", \"THM\", \"thm_yaopl-test\", \"conf_theme.cfg\"), THEME_CFG.encode(\"ascii\"))\n+    # A grey cover: OPL only loaded RGB, RGBA and palette PNGs\n+    write(os.path.join(out, \"art-grey\", \"ART\", gid.decode() + \"_COV.png\"), png_grey(140, 200))\n+    # A language file name shorter than lang_X.lng: the scan of a device's LNG folder crashed on it\n+    write(os.path.join(out, \"lng-short-name\", \"LNG\", \"ru.lng\"), b\"Russian\\r\\nFontName\\r\\n\")\n+    print(\"game ID\", gid.decode(), \"- files written to\", out)\n+\n+\n+main()"
        },
        {
          "sha": "53b7a39ad119574f2f96cebd4049424c57a70ec0",
          "filename": "labs/host-repro/make_inputs.py",
          "status": "added",
          "additions": 141,
          "deletions": 0,
          "changes": 141,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fmake_inputs.py",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fmake_inputs.py",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fmake_inputs.py?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,141 @@\n+\"\"\"Write the malformed inputs used by run_all.ps1 into the given directory.\"\"\"\n+import os\n+import struct\n+import sys\n+\n+\n+def cheats(out):\n+    files = {\n+        \"cht_plain.cht\": b\"Mastercode\\r\\n90106418 0c0418ae\\r\\n\\r\\nCheat\\r\\n20100000 00000001\\r\\n\",\n+        # Same layout as SLES_505.41.cht in PS2-Widescreen/OPL-Widescreen-Cheats\n+        \"cht_indented.cht\": b'\"Game /ID SLES_000.00\"\\r\\nMastercode\\r\\n90106418 0c0418ae\\r\\n\\r\\n'\n+        b\" //Gameplay 16:9\\r\\n20142e50 3c023faa\\r\\n201430c4 3c023faa\\r\\n\",\n+        \"cht_251.cht\": b\"\".join(b\"Cheat %d\\r\\n2%07X 00000001\\r\\n\" % (n, 0x100000 + n * 4) for n in range(251)),\n+        \"cht_long_last.cht\": b\"Mastercode\\r\\n90106418 0c0418ae\\r\\n\" + b\"A\" * 400,\n+        \"cht_no_lf.cht\": b\"Mastercode\\r\\n90106418 0c0418ae\\r\\nCheat\\r\\n20100000 00000001\",\n+        # The cheat of upstream issue #1548: lines with address 0 are the second half of multi-line codes\n+        \"cht_addr0.cht\": b\"Mastercode\\r\\n90183688 0C07B869\\r\\n\\r\\nAiming on L3, off on R3\\r\\n\"\n+        b\"E10100FD 0028489C\\r\\n000FFFE0 00000001\\r\\nE10100FB 0028489C\\r\\n000FFFE0 00000000\\r\\n\"\n+        b\"E1020000 000FFFE0\\r\\n60284390 00000080\\r\\n00000000 00000B4C\\r\\n\"\n+        b\"E1020001 000FFFE0\\r\\n60284390 00000088\\r\\n00000000 00000B4C\\r\\n\"\n+        b\"E1010002 2028C598\\r\\n000FFFE0 00000000\\r\\n\\r\\nAnother cheat\\r\\n20100000 00000001\\r\\n\",\n+        # Same shape as SLUS_210.09.cht (Sega Classics Collection): a Mastercode with 9 hook lines\n+        \"cht_9hooks.cht\": b\"Mastercode\\r\\n\" + b\"\".join(b\"9%07X 0C047714\\r\\n\" % (0x01B9920 + n * 0x100) for n in range(9))\n+        + b\"\\r\\nCheat\\r\\n2039FCF8 3FAAAAAB\\r\\n\",\n+        # 100 cheats of 3 codes: 300 codes for the engine's list of 250 when all are enabled\n+        \"cht_many.cht\": b\"\".join(\n+            b\"Cheat %d\\r\\n2%07X 00000001\\r\\n2%07X 00000002\\r\\n2%07X 00000003\\r\\n\" % (n, 0x100000 + n * 16, 0x100004 + n * 16, 0x100008 + n * 16)\n+            for n in range(100)\n+        ),\n+    }\n+    for name, data in files.items():\n+        with open(os.path.join(out, name), \"wb\") as f:\n+            f.write(data)\n+\n+\n+def ul_record(name, startup):\n+    r = bytearray(64)\n+    r[0 : len(name)] = name\n+    r[0x20:0x23] = b\"ul.\"\n+    r[0x23 : 0x23 + len(startup)] = startup\n+    r[0x2F] = 2\n+    r[0x30] = 0x14\n+    r[0x35] = 0x08\n+    return bytes(r)\n+\n+\n+def ul_cfg(out):\n+    a = ul_record(b\"Game A\", b\"SLUS_200.62\")\n+    b = ul_record(b\"Game B\", b\"SLES_505.41\")\n+    for d, data in ((\"ul64\", a), (\"ul65\", a + b\"\\x00\"), (\"ul129\", a + b + b\"\\x0a\")):\n+        os.makedirs(os.path.join(out, d), exist_ok=True)\n+        with open(os.path.join(out, d, \"ul.cfg\"), \"wb\") as f:\n+            f.write(data)\n+    os.makedirs(os.path.join(out, \"cachedir\"), exist_ok=True)\n+\n+\n+def system_cnf(out):\n+    for name, boot2 in ((\"cnf_ok.cnf\", b\"BOOT2 = \"), (\"cnf_no_eq.cnf\", b\"BOOT2 \")):\n+        with open(os.path.join(out, name), \"wb\") as f:\n+            f.write(boot2 + b\"cdrom0:\\\\SLUS_200.62;1\\r\\nVER = 1.00\\r\\nVMODE = NTSC\\r\\n\")\n+\n+\n+def config_files(out):\n+    files = {\n+        \"cfg_comment_end.cfg\": b\"a=1\\r\\n#end\",  # last line is a comment without LF\n+        \"cfg_plain.cfg\": b\"a=1\\r\\n#comment\\r\\nb=2\\r\\n\",\n+        \"IPCONFIG.DAT\": b\"192.168.0.10 255.255.255.0 192.168.0.1\".ljust(300, b\" \"),\n+    }\n+    for name, data in files.items():\n+        with open(os.path.join(out, name), \"wb\") as f:\n+            f.write(data)\n+\n+\n+def lz4_run(byte, size):\n+    \"\"\"One LZ4 block of `size` copies of `byte`: a literal, a match on it and 11 closing literals.\"\"\"\n+    ext = (size - 12) - 4 - 15  # match length beyond the token's 15, written as 255s and a remainder\n+    block = bytearray([0x1F, byte, 1, 0])\n+    while ext >= 255:\n+        block.append(255)\n+        ext -= 255\n+    block.append(ext)\n+    block.append(0xB0)\n+    block += bytes([byte]) * 11\n+    return bytes(block)\n+\n+\n+def sector_byte(n):\n+    return (n * 7 + 1) & 0xFF\n+\n+\n+def zso_file(path, sectors, block_size=2048, align=0, raw_all=False, swap=None):\n+    \"\"\"A ZSO image whose sector n holds 2048 bytes of sector_byte(n). Even blocks are LZ4 (one run),\n+    odd blocks raw. swap=(a, b) exchanges two index entries, so block a ends before it starts.\"\"\"\n+    per_block = block_size // 2048\n+    nblocks = sectors * 2048 // block_size\n+    unit = 1 << align\n+    blocks = []\n+    for b in range(nblocks):\n+        data = b\"\".join(bytes([sector_byte(s)]) * 2048 for s in range(b * per_block, (b + 1) * per_block))\n+        if raw_all or b % 2:\n+            blocks.append((True, data))\n+        else:\n+            blocks.append((False, lz4_run(sector_byte(b), 2048)))\n+    first = 24 + 4 * (nblocks + 1)\n+    pos = (first + unit - 1) // unit * unit\n+    index, body = [], b\"\"\n+    for raw, data in blocks:\n+        index.append((pos // unit) | (0x80000000 if raw else 0))\n+        padded = data + b\"\\0\" * ((-len(data)) % unit)\n+        body += padded\n+        pos += len(padded)\n+    index.append(pos // unit)\n+    if swap:\n+        index[swap[0]], index[swap[1]] = index[swap[1]], index[swap[0]]\n+    header = struct.pack(\"<IIQIBBBB\", 0x4F53495A, 24, sectors * 2048, block_size, 1, align, 0, 0)\n+    with open(path, \"wb\") as f:\n+        f.write(header + struct.pack(\"<%dI\" % len(index), *index) + b\"\\0\" * ((-first) % unit) + body)\n+\n+\n+def zso_images(out):\n+    zso_file(os.path.join(out, \"zso_ok.zso\"), 400)\n+    zso_file(os.path.join(out, \"zso_align4.zso\"), 40, align=4)\n+    zso_file(os.path.join(out, \"zso_badidx.zso\"), 10, swap=(3, 4))\n+    # maxcso writes 16 KiB blocks by default for images of 2 GiB and more\n+    zso_file(os.path.join(out, \"zso_16k.zso\"), 64, block_size=16384, raw_all=True)\n+\n+\n+def main():\n+    out = sys.argv[1]\n+    os.makedirs(out, exist_ok=True)\n+    cheats(out)\n+    ul_cfg(out)\n+    system_cnf(out)\n+    config_files(out)\n+    zso_images(out)\n+    with open(os.path.join(out, \"zero.bin\"), \"wb\") as f:\n+        f.write(bytes(65536))\n+    print(\"inputs written to\", out)\n+\n+\n+main()"
        },
        {
          "sha": "1f17516f3ba90f0a9004d7e5edceacf867b4591f",
          "filename": "labs/host-repro/name_harness.c",
          "status": "added",
          "additions": 37,
          "deletions": 0,
          "changes": 37,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fname_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fname_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fname_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,37 @@\n+/* Host harness for isValidIsoName() from src/supportbase.c. Each argument is copied into a\n+ * heap block of exactly strlen + 1 bytes, as a short directory entry name would be. */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+#include <ctype.h>\n+/* Instrumented here, so AddressSanitizer sees every byte strcasecmp reads (_stricmp is not). */\n+static int strcasecmp(const char *a, const char *b)\n+{\n+    for (; tolower((unsigned char)*a) == tolower((unsigned char)*b); a++, b++)\n+        if (*a == '\\0')\n+            return 0;\n+    return tolower((unsigned char)*a) - tolower((unsigned char)*b);\n+}\n+enum GAME_FORMAT {\n+    GAME_FORMAT_USBLD = 0,\n+    GAME_FORMAT_OLD_ISO,\n+    GAME_FORMAT_ISO,\n+};\n+\n+#include \"name_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    int i;\n+\n+    for (i = 1; i < argc; i++) {\n+        char *name = _strdup(argv[i]);\n+        int len = -1;\n+        int format = isValidIsoName(name, &len);\n+\n+        printf(\"%-24s format=%d name_len=%d\\n\", argv[i], format, len);\n+        free(name);\n+    }\n+    return 0;\n+}"
        },
        {
          "sha": "9d3f742cd3eaa39ea3e9cf8d6884cd4592551634",
          "filename": "labs/host-repro/pad_harness.c",
          "status": "added",
          "additions": 63,
          "deletions": 0,
          "changes": 63,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fpad_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fpad_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fpad_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,63 @@\n+/* Host harness for src/pad.c readPads(): the button repeat countdown across the\n+ * wrap of the 32-bit tick counter. cpu_ticks() is scripted: three polls 10 ms\n+ * apart, the last one after the counter wrapped. */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned int u32;\n+#define LOG(...)\n+\n+struct pad_data_t\n+{\n+    int port, slot;\n+};\n+\n+/* the statics of pad.c, including the ones a fix may add */\n+static u32 curtime = 0;\n+static u32 time_since_last = 0;\n+static u32 lastticks = 0;\n+static u32 tickrem = 0;\n+static unsigned short pad_count = 1;\n+static struct pad_data_t pad_data[4];\n+static u32 paddata;\n+static u32 oldpaddata;\n+static int delaycnt[16];\n+static int paddelay[16];\n+\n+static u32 fake_ticks;\n+static int held;\n+\n+static u32 cpu_ticks(void) { return fake_ticks; }\n+static int readPad(struct pad_data_t *pad)\n+{\n+    paddata = held ? 0x40 : 0;\n+    return 0;\n+}\n+static int getKeyPressed(int id) { return held; }\n+\n+#include \"pad_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    const u32 ms = CLOCKS_PER_MILISEC;\n+    int i, before;\n+\n+    for (i = 0; i < 16; i++)\n+        paddelay[i] = 200;\n+\n+    /* 15 ms before the wrap, nothing held: the countdown is armed at the initial delay */\n+    fake_ticks = (u32)(0 - 15 * ms);\n+    held = 0;\n+    readPads();\n+    /* 5 ms before the wrap, button held */\n+    fake_ticks = (u32)(0 - 5 * ms);\n+    held = 1;\n+    readPads();\n+    before = delaycnt[0];\n+    /* 5 ms after the wrap, still held: 10 ms passed */\n+    fake_ticks = 5 * ms;\n+    readPads();\n+    printf(\"held button: countdown %d ms before the wrap, %d ms after it (10 ms later)\\n\", before, delaycnt[0]);\n+    return 0;\n+}"
        },
        {
          "sha": "4655ed98d9ace6b892ec6ef76512c6bff4fa2550",
          "filename": "labs/host-repro/run_all.ps1",
          "status": "added",
          "additions": 278,
          "deletions": 0,
          "changes": 278,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Frun_all.ps1",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Frun_all.ps1",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Frun_all.ps1?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,278 @@\n+# Host reproductions for OPL parser bugs on malformed input (Windows, MSVC with AddressSanitizer).\n+#\n+#   powershell -ExecutionPolicy Bypass -File labs\\host-repro\\run_all.ps1 [-Opl <OPL checkout>]\n+#\n+# Each harness copies the functions under test out of the OPL checkout (extract.py), so the same\n+# run works on master and on a fix branch. Every test is built twice: plain (/GS-, so a small stack\n+# overrun does not abort) for the output, and with /fsanitize=address for memory errors.\n+# -Images <dir> also prints the game ID OPL derives from every .iso image in <dir>.\n+# -Only cheat,iso,find,zso,cnf,sb,name,crc,cfg,... runs only those groups.\n+# -Expected <file> compares every result line with <file> (the output of an earlier run, without the\n+# \"OPL tree:\" line) and exits with 1 on any difference. CI runs the checks this way.\n+param([string]$Opl = (Resolve-Path (Join-Path $PSScriptRoot \"..\\..\")).Path, [string]$Images = \"\", [string[]]$Only = @(), [string]$Expected = \"\")\n+$ErrorActionPreference = \"Stop\"\n+$here = $PSScriptRoot\n+$build = Join-Path $here \"build\"\n+$inputs = Join-Path $build \"in\"\n+New-Item -ItemType Directory -Force $build | Out-Null\n+\n+$vs = & \"${env:ProgramFiles(x86)}\\Microsoft Visual Studio\\Installer\\vswhere.exe\" -latest -products * -property installationPath\n+$vcvars = Join-Path $vs \"VC\\Auxiliary\\Build\\vcvars64.bat\"\n+# The ASan runtime must come from the toolset vcvars64.bat selects: a runner with several toolsets has\n+# several copies, and a binary built by a newer compiler does not start with an older DLL (0xC0000139)\n+$vcTools = (cmd /c \"`\"$vcvars`\" >nul 2>nul && echo %VCToolsInstallDir%\" | Select-Object -Last 1).Trim()\n+$asanDir = if ($vcTools -and (Test-Path (Join-Path $vcTools \"bin\\Hostx64\\x64\\clang_rt.asan_dynamic-x86_64.dll\"))) {\n+    Join-Path $vcTools \"bin\\Hostx64\\x64\"\n+} else {\n+    (Get-ChildItem (Join-Path $vs \"VC\\Tools\\MSVC\") -Recurse -Filter \"clang_rt.asan_dynamic-x86_64.dll\" |\n+        Where-Object { $_.FullName -like \"*Hostx64\\x64*\" } | Sort-Object FullName | Select-Object -Last 1).DirectoryName\n+}\n+$env:PATH = \"$asanDir;$env:PATH\"\n+python -I (Join-Path $here \"make_inputs.py\") $inputs | Out-Null\n+\n+$Only = @($Only | ForEach-Object { $_ -split \",\" } | Where-Object { $_ })\n+function Want([string]$Group) { return ($Only.Count -eq 0) -or ($Only -contains $Group) }\n+\n+$script:lines = @()\n+function Emit([string]$Line) {\n+    $script:lines += $Line\n+    $Line\n+}\n+\n+function Build([string]$Harness, [string]$Tag, [string]$Source, [string[]]$Funcs, [string]$Source2 = \"\", [string[]]$Funcs2 = @(), [string]$Source3 = \"\", [string[]]$Funcs3 = @(), [string[]]$Patch = @(), [string]$Defines = \"\") {\n+    $text = \"\"\n+    if ($Source3) { $text += (python -I (Join-Path $here \"extract.py\") (Join-Path $Opl $Source3) @Funcs3 | Out-String) }\n+    if ($Source2) { $text += (python -I (Join-Path $here \"extract.py\") (Join-Path $Opl $Source2) @Funcs2 | Out-String) }\n+    $text += (python -I (Join-Path $here \"extract.py\") (Join-Path $Opl $Source) @Funcs | Out-String)\n+    foreach ($p in $Patch) {\n+        $a, $b = $p -split \"=>\", 2\n+        $text = $text.Replace($a, $b)\n+    }\n+    Set-Content -Encoding ascii (Join-Path $build ($Harness + \"_extracted.c\")) $text\n+    $src = Join-Path $here ($Harness + \"_harness.c\")\n+    $exe = Join-Path $build \"$Harness-$Tag\"\n+    $common = \"/nologo /W3 /Od /Zi /wd4996 $Defines /I`\"$build`\" `\"$src`\"\"\n+    cmd /c \"`\"$vcvars`\" >nul 2>nul && cl $common /GS- /Fe:`\"$exe.exe`\" /Fo:`\"$exe.obj`\" /Fd:`\"$exe.pdb`\" >`\"$exe.log`\" && cl $common /fsanitize=address /Fe:`\"$exe-asan.exe`\" /Fo:`\"$exe-asan.obj`\" /Fd:`\"$exe-asan.pdb`\" >>`\"$exe.log`\"\"\n+    if ($LASTEXITCODE -ne 0) { Get-Content \"$exe.log\"; throw \"build of $Harness failed\" }\n+}\n+\n+function Run([string]$Exe, [string[]]$Arguments) {\n+    # Process rather than Start-Process: the latter can lose the exit code of a process that ends at once\n+    $psi = New-Object System.Diagnostics.ProcessStartInfo\n+    $psi.FileName = Join-Path $build \"$Exe.exe\"\n+    $psi.Arguments = (@($Arguments | ForEach-Object { if ($_ -match \"\\s\") { \"`\"$_`\"\" } else { $_ } })) -join \" \"\n+    $psi.UseShellExecute = $false\n+    $psi.RedirectStandardOutput = $true\n+    $psi.RedirectStandardError = $true\n+    $p = [System.Diagnostics.Process]::Start($psi)\n+    $stdout = $p.StandardOutput.ReadToEndAsync()\n+    $stderr = $p.StandardError.ReadToEndAsync()\n+    if (-not $p.WaitForExit(10000)) { $p.Kill(); return \"TIMEOUT: endless loop\" }\n+    $p.WaitForExit()\n+    $lines = @($stdout.Result -split \"`r?`n\" | Where-Object { $_ } | Select-Object -Last 3)\n+    $err = $stderr.Result -split \"`r?`n\"\n+    $asan = $err | Select-String -Pattern \"ERROR: AddressSanitizer: ([\\w-]+)\" | Select-Object -First 1\n+    $frame = $err | Select-String -Pattern \"#\\d+ 0x\\w+ in (\\w+) .*(extracted|harness)\" | Select-Object -First 1\n+    if ($asan) { return \"ASAN \" + $asan.Matches[0].Groups[1].Value + \" in \" + $frame.Matches[0].Groups[1].Value }\n+    if ($p.ExitCode -ne 0) { return (\"CRASH 0x{0:X8}\" -f $p.ExitCode) }\n+    return ($lines -join \" | \")\n+}\n+\n+function Test([string]$Name, [string]$Exe, [string[]]$Arguments) {\n+    Emit (\"{0,-34} plain: {1}\" -f $Name, (Run $Exe $Arguments))\n+    Emit (\"{0,-34} asan:  {1}\" -f \"\", (Run \"$Exe-asan\" $Arguments))\n+}\n+\n+\"OPL tree: $Opl\"\n+if (Want \"cheat\") {\n+    $cheatFuncs = \"make_code\", \"is_cheat_code\", \"parse_line\", \"is_cmt_str\", \"chr_idx\", \"term_str\", \"is_empty_str\", \"trim_str\", \"is_empty_substr\", \"parse_buf\", \"CHEAT_LINE_MAX\", \"set_cheats_list\"\n+    Build cheat t \"src\\cheatman.c\" $cheatFuncs -Source2 \"ee_core\\src\\cheat_api.c\" -Funcs2 \"SetupCheats\"\n+    foreach ($t in \"cht_plain\", \"cht_indented\", \"cht_251\", \"cht_long_last\", \"cht_no_lf\") { Test \"cheat $t\" cheat-t (Join-Path $inputs \"$t.cht\") }\n+    # every cheat enabled, then the list for the EE core and the engine's hook and code tables\n+    foreach ($t in \"cht_addr0\", \"cht_9hooks\", \"cht_many\") { Test \"cheat engine $t\" cheat-t \"-e\", (Join-Path $inputs \"$t.cht\") }\n+    if ((Get-Content -Raw (Join-Path $Opl \"src\\cheatman.c\")).Contains(\"char digits[CODE_DIGITS];\")) {\n+        Emit \"(make_code() overruns digits[] on every code; again with only that line fixed, to see the other bugs)\"\n+        Build cheat iso \"src\\cheatman.c\" $cheatFuncs -Source2 \"ee_core\\src\\cheat_api.c\" -Funcs2 \"SetupCheats\" -Patch \"char digits[CODE_DIGITS];=>char digits[CODE_DIGITS + 1];\"\n+        foreach ($t in \"cht_251\", \"cht_long_last\", \"cht_no_lf\") { Test \"cheat $t (digits fixed)\" cheat-iso (Join-Path $inputs \"$t.cht\") }\n+        foreach ($t in \"cht_addr0\", \"cht_9hooks\", \"cht_many\") { Test \"cheat engine $t (digits fixed)\" cheat-iso \"-e\", (Join-Path $inputs \"$t.cht\") }\n+    }\n+}\n+\n+if (Want \"iso\") {\n+    Build iso ee \"modules\\isofs\\isofs.c\" \"dirTocEntry\", \"cdvdman_locatefile\"\n+    Build iso ingame \"modules\\iopcore\\cdvdman\\searchfile.c\" \"cdvdman_locatefile\" -Source2 \"modules\\iopcore\\cdvdman\\internal.h\" -Funcs2 \"dirTocEntry\" -Defines \"/DINGAME\"\n+    foreach ($t in \"ok\", \"zero\", \"xa\", \"long\") {\n+        Test \"isofs locatefile $t\" iso-ee $t\n+        Test \"cdvdman locatefile $t\" iso-ingame $t\n+    }\n+}\n+\n+if (Want \"find\") {\n+    Build find t \"modules\\isofs\\isofs.c\" \"dirTocEntry\", \"cdvdman_trimspaces\", \"cdvdman_locatefile\", \"cdvdman_findfile\"\n+    foreach ($n in \"\\SYSTEM.CNF;1\", \"/SYSTEM.CNF;1\", \"\\A_VERY_LONG_LEVEL2_FILENAME.TXT;1\") { Test \"isofs findfile $n\" find-t $n }\n+}\n+\n+if (Want \"zso\") {\n+    $zsoDefine = if ((Get-Content -Raw (Join-Path $Opl \"modules\\isofs\\zso.c\")).Contains(\"int ziso_init(\")) { \"/DINIT_RETURNS_INT\" } else { \"\" }\n+    # the LZ4 decoder of the tree, and 32-bit pointer arithmetic kept whole on a 64-bit host\n+    Copy-Item (Join-Path $Opl \"modules\\isofs\\lz4.c\"), (Join-Path $Opl \"modules\\isofs\\lz4.h\") $build\n+    $zsoPatch = \"(u32)ziso_tmp_buf & 63=>(size_t)ziso_tmp_buf & 63\", \"(void *)(((u32)ziso_tmp_buf & (~63)) + 64)=>(void *)(((size_t)ziso_tmp_buf & (~63)) + 64)\"\n+    Build zso t \"modules\\isofs\\isofs.c\" \"longLseek\", \"read_raw_data\" -Source2 \"modules\\isofs\\zso.c\" -Funcs2 \"ziso_init\", \"?ziso_read_slice\", \"ziso_read_sector\" -Defines $zsoDefine -Patch $zsoPatch\n+    foreach ($a in \"0\", \"11\", \"12\", \"255\") { Test \"zso align $a\" zso-t (Join-Path $inputs \"zero.bin\"), $a }\n+    # sector reads over LZ4 and raw blocks into buffers of exactly count * 2048 bytes\n+    foreach ($c in \"ok 0 4\", \"ok 7 3\", \"align4 0 40\", \"ok 100 300\", \"badidx 3 1\", \"16k 0 4\") {\n+        $a = $c.Split(\" \")\n+        Test \"zso read $c\" zso-t \"read\", (Join-Path $inputs \"zso_$($a[0]).zso\"), $a[1], $a[2]\n+    }\n+}\n+\n+if (Want \"cnf\") {\n+    Build cnf t \"src\\ps2cnf.c\" \"CNF_LEN_MAX\", \"CNFGetToken\", \"CNFAdvanceLine\", \"CNFGetKey\", \"ps2cnfGetBootFile\" -Patch 'fopen(path, \"r\")=>fopen(path, \"rb\")'\n+    foreach ($t in \"cnf_ok\", \"cnf_no_eq\") { Test \"ps2cnf $t\" cnf-t (Join-Path $inputs \"$t.cnf\") }\n+}\n+\n+if (Want \"sb\") {\n+    Build sb t \"src\\supportbase.c\" \"game_list_t\", \"game_cache_list\", \"sbReadList\", \"updateISOGameList\" -Defines \"/DHAVE_SBREADLIST /DHAVE_UPDATE\"\n+    foreach ($c in \"ul64 0\", \"ul65 0\", \"ul129 0\", \"ul65 2\", \"ul129 2\") {\n+        $a = $c.Split(\" \")\n+        Test \"sbReadList $c\" sb-t \"ul\", (Join-Path $inputs $a[0]), $a[1]\n+    }\n+    foreach ($c in \"2 2\", \"3 3 swap\", \"1 2\") { Test \"updateISOGameList $c\" sb-t (@(\"cache\", (Join-Path $inputs \"cachedir\")) + $c.Split(\" \")) }\n+}\n+\n+if (Want \"name\") {\n+    Build name t \"src\\supportbase.c\" \"isValidIsoName\"\n+    Test \"isValidIsoName\" name-t \"..\", \"x.iso\", \"SLUS_200.62.Title.iso\"\n+}\n+\n+if (Want \"crc\") {\n+    Build crc t \"src\\system.c\" \"USBA_crc32\"\n+    $names = '\"\"', \"41\", \"4772616e64205468656674204175746f20494949\", \"c8e3f0e0\", \"d098d0b3d180d0b0\"\n+    Test \"USBA_crc32\" crc-t $names\n+    Emit (\"{0,-34} ref:   {1}\" -f \"\", ((python -I (Join-Path $here \"usba_ref.py\") @names) -join \" | \"))\n+}\n+\n+if (Want \"cfg\") {\n+    # void * arithmetic in CheckPS2Logo() is a GCC extension\n+    $cfgDefine = if ((Get-Content -Raw (Join-Path $Opl \"src\\config.c\")).Contains(\"size_t prefixmax\")) { \"/DPREFIX_MAX\" } else { \"\" }\n+    Build cfg t \"src\\config.c\" \"strToColor\", \"isWS\", \"splitAssignment\", \"parsePrefix\", \"configReadLegacyIP\" -Source2 \"src\\util.c\" -Funcs2 \"openFileBuffer\", \"readFileBuffer\", \"closeFileBuffer\", \"min\", \"fromHex\", \"CheckPS2Logo\" -Patch \"void *buffer = logo;=>u8 *buffer = logo;\" -Defines $cfgDefine\n+    Test \"readFileBuffer plain cfg\" cfg-t \"lines\", (Join-Path $inputs \"cfg_plain.cfg\")\n+    Test \"readFileBuffer '#' last line, no LF\" cfg-t \"lines\", (Join-Path $inputs \"cfg_comment_end.cfg\")\n+    Test \"readFileBuffer read() fails\" cfg-t \"lines\", (Join-Path $inputs \"cfg_plain.cfg\"), \"readerror\"\n+    Test \"strToColor #112233\" cfg-t \"color\", \"#112233\"\n+    Test \"strToColor #11223344556677\" cfg-t \"color\", \"#11223344556677\"\n+    Test \"splitAssignment 40-char key\" cfg-t \"split\", (\"k\" * 40 + \"=value\")\n+    Test \"parsePrefix 60-char prefix\" cfg-t \"prefix\", (\"A\" * 60 + \": no equals sign\")\n+    Test \"configReadLegacyIP 300 bytes\" cfg-t \"legacyip\", (Join-Path $inputs \"IPCONFIG.DAT\")\n+    Test \"CheckPS2Logo HDD\" cfg-t \"logo\"\n+}\n+\n+if (Want \"cheatsel\") {\n+    Build cheatsel t \"src\\cheatconfig.c\" \"normalizeCheatName\", \"cheatConfigIsMasterCode\", \"cheatNamesMatch\", \"cheatConfigLoadSelections\", \"cheatConfigSaveSelections\"\n+    Test \"cheat picks, distinct names\" cheatsel-t \"+Mastercode\", \"+Infinite Health\", \"Max Money\", \"+Moon Jump\"\n+    Test \"cheat picks, duplicate names\" cheatsel-t \"+Mastercode\", \"+Infinite Health\", \"+Infinite Health\", \"Max Money\"\n+}\n+\n+if (Want \"cfgwrite\") {\n+    Build cfgwrite t \"src\\config.c\" \"configWrite\" -Source2 \"src\\util.c\" -Funcs2 \"openFileBuffer\", \"writeFileBuffer\", \"closeFileBuffer\"\n+    foreach ($m in \"ok\", \"fail\", \"short\") { Test \"configWrite, write() $m\" cfgwrite-t (Join-Path $build \"cfgwrite-$m.cfg\"), $m }\n+}\n+\n+if (Want \"cdread\") {\n+    # The IOP has 32-bit pointers; keep them whole on a 64-bit host\n+    Build cdread t \"modules\\iopcore\\cdvdman\\cdvdman.c\" \"cdvdman_read\" -Patch \"(void *)((u32)buf + offset)=>(void *)((u8 *)buf + offset)\", \"(u32)(buf)&3=>(size_t)(buf)&3\"\n+    foreach ($c in \"2048 2\", \"2340 1\", \"2340 3\", \"2328 2\") { Test \"cdvdman_read $c\" cdread-t $c.Split(\" \") }\n+}\n+\n+if (Want \"bdmprobe\") {\n+    Build bdmprobe t \"src\\bdmsupport.c\" \"bdmFindPartition\"\n+    $dir = Join-Path $build \"bdmprobe\"\n+    foreach ($v in \"plain\", \"asan\") {\n+        New-Item -ItemType Directory -Force (Join-Path $dir \"mass0\") | Out-Null\n+        Set-Content -Encoding ascii (Join-Path $dir \"mass0\\conf_opl.cfg\") \"theme=Some theme`r`nlanguage=Russian`r`n\"\n+        $exe = if ($v -eq \"plain\") { \"bdmprobe-t\" } else { \"bdmprobe-t-asan\" }\n+        Emit (\"{0,-34} {1}: {2}\" -f $(if ($v -eq \"plain\") { \"bdmFindPartition write probe\" } else { \"\" }), $v.PadRight(5), (Run $exe $dir))\n+    }\n+}\n+\n+if (Want \"vmc\") {\n+    Build vmc t \"src\\system.c\" \"sysCheckVMC\"\n+    $dir = Join-Path $build \"vmc\"\n+    New-Item -ItemType Directory -Force (Join-Path $dir \"VMC\") | Out-Null\n+    # card size in bytes (-1: no card), createSize as the VMC menu passes it\n+    foreach ($c in @(@(4194304, 8, \"4 MiB card, create 8 MB\"), @(8650752, 8, \"PCSX2 .ps2 size, create 8 MB\"), @(8388608, 8, \"8 MiB card, create 8 MB\"), @(-1, 8, \"no card, create 8 MB\"), @(4194304, -1, \"4 MiB card, delete\"))) {\n+        foreach ($v in \"plain\", \"asan\") {\n+            $card = Join-Path $dir \"VMC\\keep.bin\"\n+            Remove-Item $card -ErrorAction SilentlyContinue\n+            if ($c[0] -ge 0) { [IO.File]::WriteAllBytes($card, (New-Object byte[] $c[0])) }\n+            $exe = if ($v -eq \"plain\") { \"vmc-t\" } else { \"vmc-t-asan\" }\n+            Emit (\"{0,-34} {1}: {2}\" -f $(if ($v -eq \"plain\") { \"sysCheckVMC \" + $c[2] } else { \"\" }), $v.PadRight(5), (Run $exe $dir, \"keep\", \"$($c[1])\"))\n+        }\n+    }\n+}\n+\n+if (Want \"text\") {\n+    Build text t \"src\\themes.c\" \"drawAttributeText\" -Source2 \"src\\fntsys.c\" -Funcs2 \"fntFitString\"\n+    Test \"fntFitString fits, exact buffer\" text-t \"fit\", \"200\", \"two words\"\n+    Test \"fntFitString long word, exact buffer\" text-t \"fit\", \"40\", \"Averyveryverylongword\"\n+    Test \"fntFitString 255-char config value\" text-t \"cfgval\", \"100\"\n+    Test \"AttributeText wrap, config value\" text-t \"attr\", \"100\", \"The quick brown fox jumps over the lazy dog\"\n+}\n+\n+if (Want \"theme\") {\n+    Build theme t \"src\\themes.c\" \"initMutableText\", \"getGameCount\", \"drawGameCountText\", \"initGameCountText\", \"freeImageTexture\", \"initImageTexture\", \"validateItemsList\", \"validateGUIElems\"\n+    Test \"GameCountText count buffer\" theme-t \"gamecount\"\n+    Test \"image file missing\" theme-t \"image\"\n+    Test \"theme without ItemsList\" theme-t \"itemslist\"\n+}\n+\n+if (Want \"lang\") {\n+    Build lang t \"src\\lang.c\" \"lngReadEntry\"\n+    Test \"lngReadEntry file names\" lang-t \"lang_Russian.lng\", \"abcd.lng\", \"ru.lng\"\n+}\n+\n+if (Want \"history\") {\n+    Build history t \"src\\OSDHistory.c\" \"GetBootFilename\", \"AddHistoryRecordUsingFullPath\"\n+    Test \"GetBootFilename\" history-t \"cdrom0:\\SLUS_200.62;1\", \"cdrom0:\\DATA\\ABCDEFGHIJKLMNOPQRST.ELF;1\"\n+}\n+\n+if (Want \"gsm\") {\n+    Build gsm t \"src\\gsm.c\" \"PrepareGSM\" -Source2 \"include\\pggsm.h\" -Funcs2 \"makeDISPLAY\", \"makeSYNCV\", \"predef_vmode_struct\" -Source3 \"ee_core\\include\\coreconfig.h\" -Funcs3 \"GsmConfig_t\"\n+    foreach ($m in \"0\", \"28\", \"29\", \"-1\") { Test \"PrepareGSM `$GSMVMode=$m\" gsm-t $m }\n+}\n+\n+if (Want \"pad\") {\n+    Build pad t \"src\\pad.c\" \"CLOCKS_PER_MILISEC\", \"getKeyDelay\", \"readPads\"\n+    Test \"readPads tick counter wrap\" pad-t \"wrap\"\n+}\n+\n+if (Want \"genvmc\") {\n+    Build genvmc t \"modules\\vmc\\genvmc\\genvmc.c\" \"mc_writecluster\"\n+    Test \"genvmc write ok\" genvmc-t \"0\"\n+    Test \"genvmc write short\" genvmc-t \"1\"\n+}\n+\n+if (Want \"bgm\") {\n+    Build bgm t \"src\\sound.c\" \"bgmLoad\"\n+    Test \"bgmLoad default_bgm_path\" bgm-t \"mass:/MUSIC/100%s.ogg\"\n+}\n+\n+if ($Images) {\n+    Build gameid t \"src\\supportbase.c\" \"GetStartupExecName\" -Source2 \"modules\\isofs\\isofs.c\" -Funcs2 \"dirTocEntry\", \"cdvdman_trimspaces\", \"cdvdman_locatefile\" -Source3 \"src\\ps2cnf.c\" -Funcs3 \"CNF_LEN_MAX\", \"CNFGetToken\", \"CNFAdvanceLine\", \"CNFGetKey\", \"ps2cnfGetBootFile\" -Patch 'fopen(path, \"r\")=>fopen(path, \"rb\")'\n+    foreach ($f in Get-ChildItem $Images -File | Where-Object { $_.Extension -in \".iso\" }) { Test \"gameid $($f.Name)\" gameid-t $f.FullName }\n+}\n+\n+if ($Expected) {\n+    $want = @(Get-Content $Expected | Where-Object { $_ -notmatch \"^OPL tree:\" })\n+    $got = @($script:lines)\n+    $bad = 0\n+    for ($i = 0; $i -lt [Math]::Max($want.Count, $got.Count); $i++) {\n+        if ($want[$i] -cne $got[$i]) {\n+            \"line $($i + 1) expected: $($want[$i])\"\n+            \"line $($i + 1) got:      $($got[$i])\"\n+            $bad++\n+        }\n+    }\n+    if ($bad) { \"$bad lines differ from $Expected\"; exit 1 }\n+    \"all $($got.Count) lines match $Expected\"\n+}"
        },
        {
          "sha": "a9f00cba9b19a7c2b036957569d8236930861d4b",
          "filename": "labs/host-repro/sb_harness.c",
          "status": "added",
          "additions": 132,
          "deletions": 0,
          "changes": 132,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fsb_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fsb_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fsb_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,132 @@\n+/* Host harness for src/supportbase.c:\n+ *   sb ul <dir> <iso games>          sbReadList() over <dir>\\ul.cfg plus fake ISO games\n+ *   sb cache <dir> <cached> <listed> [swap]\n+ *                                    updateISOGameList() with a games.bin cache of <cached>\n+ *                                    games and a scanned list of <listed> games (same names,\n+ *                                    optionally in another order); prints whether it rewrote */\n+#include <fcntl.h>\n+#include <io.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned char u8;\n+typedef unsigned int u32;\n+#define LOG(...)\n+#define memalign(a, s)  malloc(s)\n+#define openFile(p, f)  _open(p, (f) | _O_BINARY)\n+#define getFileSize(fd) _filelength(fd)\n+#define read            _read\n+#define close           _close\n+#define SCECdPS2CD      0x12\n+#define SCECdPS2DVD     0x14\n+\n+#define UL_GAME_NAME_MAX       32\n+#define ISO_GAME_NAME_MAX      160\n+#define ISO_GAME_EXTENSION_MAX 4\n+#define GAME_STARTUP_MAX       12\n+enum GAME_FORMAT {\n+    GAME_FORMAT_USBLD = 0,\n+    GAME_FORMAT_OLD_ISO,\n+    GAME_FORMAT_ISO,\n+};\n+typedef struct\n+{\n+    char name[ISO_GAME_NAME_MAX + 1];\n+    char startup[GAME_STARTUP_MAX + 1];\n+    char extension[ISO_GAME_EXTENSION_MAX + 1];\n+    u8 parts;\n+    u8 media;\n+    u8 format;\n+    u32 sizeMB;\n+} base_game_info_t;\n+typedef struct\n+{\n+    char name[UL_GAME_NAME_MAX];\n+    char magic[3];\n+    char startup[GAME_STARTUP_MAX];\n+    u8 parts;\n+    u8 media;\n+    u8 unknown[4];\n+    u8 Byte08;\n+    u8 unknown2[10];\n+} USBExtreme_game_entry_t;\n+\n+struct game_list_t;\n+static int scanForISO(char *path, char type, struct game_list_t **glist);\n+\n+#include \"sb_extracted.c\"\n+\n+static int fake_iso_games;\n+\n+static struct game_list_t *make_list(int n, int swap)\n+{\n+    struct game_list_t *head = NULL;\n+    int i;\n+\n+    for (i = n - 1; i >= 0; i--) {\n+        struct game_list_t *g = calloc(1, sizeof(*g));\n+        int k = (swap && i < 2) ? 1 - i : i;\n+        sprintf(g->gameinfo.name, \"Game %d\", k);\n+        strcpy(g->gameinfo.extension, \".iso\");\n+        g->next = head;\n+        head = g;\n+    }\n+    return head;\n+}\n+\n+static int scanForISO(char *path, char type, struct game_list_t **glist)\n+{\n+    int n = (type == SCECdPS2CD) ? fake_iso_games : 0;\n+    struct game_list_t *l = make_list(n, 0), *t = l;\n+\n+    if (t == NULL)\n+        return 0;\n+    while (t->next != NULL)\n+        t = t->next;\n+    t->next = *glist;\n+    *glist = l;\n+    return n;\n+}\n+\n+int main(int argc, char **argv)\n+{\n+    char prefix[512];\n+\n+    sprintf(prefix, \"%s\\\\\", argv[2]);\n+#ifdef HAVE_SBREADLIST\n+    if (strcmp(argv[1], \"ul\") == 0) {\n+        base_game_info_t *list = NULL;\n+        int fsize, count, i;\n+\n+        fake_iso_games = atoi(argv[3]);\n+        count = sbReadList(&list, prefix, &fsize, &count);\n+        printf(\"ul.cfg size %d, %d games:\", fsize, count);\n+        for (i = 0; i < count; i++)\n+            printf(\" [%s]\", list[i].name);\n+        printf(\"\\n\");\n+        return 0;\n+    }\n+#endif\n+#ifdef HAVE_UPDATE\n+    if (strcmp(argv[1], \"cache\") == 0) {\n+        struct game_cache_list cache;\n+        char gb[600];\n+        int listed = atoi(argv[4]);\n+        struct game_list_t *l = make_list(listed, argc > 5), *g;\n+        int i;\n+\n+        cache.count = atoi(argv[3]);\n+        cache.games = calloc(cache.count, sizeof(base_game_info_t)); /* exactly count entries */\n+        for (i = 0, g = make_list(cache.count, 0); i < (int)cache.count; i++, g = g->next)\n+            cache.games[i] = g->gameinfo;\n+        sprintf(gb, \"%s\\\\games.bin\", argv[2]);\n+        remove(gb);\n+        updateISOGameList(argv[2], &cache, l, listed);\n+        printf(\"cache %u, listed %d%s: games.bin %s\\n\", cache.count, listed, argc > 5 ? \" (reordered)\" : \"\",\n+               _access(gb, 0) == 0 ? \"rewritten\" : \"kept\");\n+        return 0;\n+    }\n+#endif\n+    return 1;\n+}"
        },
        {
          "sha": "05479b33381808b30369f6f16cecf9cb6083e679",
          "filename": "labs/host-repro/text_harness.c",
          "status": "added",
          "additions": 146,
          "deletions": 0,
          "changes": 146,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Ftext_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Ftext_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Ftext_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,146 @@\n+/* Host harness for src/fntsys.c fntFitString() and src/themes.c\n+ * drawAttributeText(): the word wrapping of theme text. Glyphs are 8 pixels\n+ * per byte and the screen is not scaled. Modes:\n+ *   text-t fit <width> <text>    wrap an exact-size heap copy of <text>\n+ *   text-t cfgval <width>        wrap a 255-character value inside a config_value_t\n+ *   text-t attr <width> <text>   draw an AttributeText whose config value is <text> */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned int u32;\n+typedef unsigned long long u64;\n+#define LOG(...)\n+#define SIZING_NONE    -1\n+#define SIZING_CLIP    0\n+#define SIZING_WRAP    1\n+#define DISPLAY_ALWAYS 0\n+#define DISPLAY_NEVER  2\n+#define _STR_SIZE      1\n+\n+#define CONFIG_KEY_NAME_LEN  32\n+#define CONFIG_KEY_VALUE_LEN 256\n+struct config_value_t\n+{\n+    char key[CONFIG_KEY_NAME_LEN];\n+    char val[CONFIG_KEY_VALUE_LEN];\n+    struct config_value_t *next;\n+};\n+typedef struct\n+{\n+    int uid;\n+    struct config_value_t value;\n+    char tail[16]; /* ends a scan that ran past the value and the next pointer */\n+} config_set_t;\n+\n+struct menu_list;\n+struct submenu_list;\n+typedef struct theme_element\n+{\n+    int type;\n+    int posX;\n+    int posY;\n+    short aligned;\n+    int width;\n+    int height;\n+    short scaled;\n+    u64 color;\n+    int font;\n+    void *extended;\n+} theme_element_t;\n+\n+typedef struct\n+{\n+    char *value;\n+    int sizingMode;\n+    char *alias;\n+    int displayMode;\n+    u32 currentConfigId;\n+    char *currentValue;\n+    char *wrappedValue; /* the private copy a fix may add */\n+} mutable_text_t;\n+\n+static char rendered[1024];\n+\n+int fntCalcDimensions(int id, const char *str) { return 8 * (int)strlen(str); }\n+int rmScaleX(int x) { return x; }\n+int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t height, const char *string, u64 colour)\n+{\n+    strncpy(rendered, string, sizeof(rendered) - 1);\n+    return 0;\n+}\n+char *_l(unsigned int id) { return id == _STR_SIZE ? \"Size\" : \"Description\"; }\n+int configGetStr(config_set_t *configSet, const char *key, const char **value)\n+{\n+    if (strcmp(key, configSet->value.key) != 0)\n+        return 0;\n+    *value = configSet->value.val;\n+    return 1;\n+}\n+\n+#include \"text_extracted.c\"\n+\n+/* print up to n bytes of s, line breaks as '|' */\n+static void show(const char *label, const char *s, size_t n)\n+{\n+    size_t i;\n+\n+    printf(\"%s \\\"\", label);\n+    for (i = 0; i < n && s[i]; i++)\n+        putchar(s[i] == '\\n' ? '|' : s[i]);\n+    printf(\"\\\"\\n\");\n+}\n+\n+int main(int argc, char **argv)\n+{\n+    int width = argc > 2 ? atoi(argv[2]) : 0;\n+\n+    if (argc == 4 && strcmp(argv[1], \"fit\") == 0) {\n+        size_t len = strlen(argv[3]);\n+        char *copy = malloc(len + 1); /* exactly the text, as a StaticText value */\n+        memcpy(copy, argv[3], len + 1);\n+        fntFitString(0, copy, width);\n+        show(\"wrapped:\", copy, len);\n+        printf(\"terminator %s\\n\", copy[len] == '\\0' ? \"kept\" : \"OVERWRITTEN\");\n+        free(copy);\n+        return 0;\n+    }\n+    if (argc == 3 && strcmp(argv[1], \"cfgval\") == 0) {\n+        config_set_t cfg;\n+        memset(&cfg, 0, sizeof(cfg));\n+        strcpy(cfg.value.key, \"Description\");\n+        memset(cfg.value.val, 'A', CONFIG_KEY_VALUE_LEN - 1); /* the longest value the config reader keeps */\n+        cfg.value.next = (struct config_value_t *)(size_t)0x4141414141414141ULL;\n+        strcpy(cfg.tail, \"BBBBBBB\");\n+        fntFitString(0, cfg.value.val, width);\n+        printf(\"255-character value: terminator %s, next pointer %s, bytes after it %s\\n\",\n+               cfg.value.val[CONFIG_KEY_VALUE_LEN - 1] == '\\0' ? \"kept\" : \"OVERWRITTEN\",\n+               cfg.value.next == (struct config_value_t *)(size_t)0x4141414141414141ULL ? \"intact\" : \"CORRUPTED\",\n+               strcmp(cfg.tail, \"BBBBBBB\") == 0 ? \"intact\" : \"CORRUPTED\");\n+        return 0;\n+    }\n+    if (argc == 4 && strcmp(argv[1], \"attr\") == 0) {\n+        config_set_t cfg;\n+        theme_element_t elem;\n+        mutable_text_t text;\n+\n+        memset(&cfg, 0, sizeof(cfg));\n+        cfg.uid = 1;\n+        strcpy(cfg.value.key, \"Description\");\n+        strncpy(cfg.value.val, argv[3], CONFIG_KEY_VALUE_LEN - 1);\n+        memset(&elem, 0, sizeof(elem));\n+        elem.width = width;\n+        elem.height = 100;\n+        elem.extended = &text;\n+        memset(&text, 0, sizeof(text));\n+        text.value = _strdup(\"Description\");\n+        text.alias = _strdup(\"Description:\\n\");\n+        text.sizingMode = SIZING_WRAP;\n+        text.displayMode = DISPLAY_ALWAYS;\n+        drawAttributeText(NULL, NULL, &cfg, &elem);\n+        show(\"config value after drawing:\", cfg.value.val, CONFIG_KEY_VALUE_LEN);\n+        show(\"rendered text:\", rendered, sizeof(rendered));\n+        return 0;\n+    }\n+    return 2;\n+}"
        },
        {
          "sha": "c9125ecdf27826ea7afd31d96bfd24accb454631",
          "filename": "labs/host-repro/theme_harness.c",
          "status": "added",
          "additions": 218,
          "deletions": 0,
          "changes": 218,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Ftheme_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Ftheme_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Ftheme_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,218 @@\n+/* Host harness for theme elements of src/themes.c: the GameCountText element,\n+ * image textures and the items list. configGetInt() and configGetStr() find\n+ * nothing, as with a theme that sets no property; texDiscoverLoad() finds no\n+ * file. Modes: theme-t gamecount | image | itemslist */\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned int u32;\n+typedef unsigned long long u64;\n+#define LOG(...)\n+#define DIM_UNDEF      -1\n+#define ALIGN_NONE     0\n+#define SCALING_NONE   0\n+#define SCALING_RATIO  1\n+#define SIZING_NONE    -1\n+#define SIZING_CLIP    0\n+#define SIZING_WRAP    1\n+#define DISPLAY_ALWAYS 0\n+#define DISPLAY_NEVER  2\n+#define THM_MAX_FONTS  16\n+enum {\n+    ELEM_TYPE_ATTRIBUTE_TEXT,\n+    ELEM_TYPE_STATIC_TEXT,\n+    ELEM_TYPE_ATTRIBUTE_IMAGE,\n+    ELEM_TYPE_GAME_IMAGE,\n+    ELEM_TYPE_STATIC_IMAGE,\n+    ELEM_TYPE_BACKGROUND,\n+    ELEM_TYPE_MENU_ICON,\n+    ELEM_TYPE_MENU_TEXT,\n+    ELEM_TYPE_ITEMS_LIST\n+};\n+enum {\n+    _STR_INFO_TITLE,\n+    _STR_INFO_GENRE,\n+    _STR_INFO_RELEASE,\n+    _STR_INFO_DEVELOPER,\n+    _STR_SIZE,\n+    _STR_INFO_DESCRIPTION,\n+    _STR_FILE_COUNT\n+};\n+\n+typedef struct\n+{\n+    int uid;\n+} config_set_t;\n+typedef struct\n+{\n+    u32 Width, Height;\n+    void *Mem;\n+    void *Clut;\n+} GSTEXTURE;\n+typedef struct item_list\n+{\n+    int (*itemGetCount)(struct item_list *itemList);\n+} item_list_t;\n+struct menu_item\n+{\n+    void *userdata;\n+};\n+struct menu_list\n+{\n+    struct menu_item *item;\n+};\n+struct submenu_list;\n+\n+typedef struct\n+{\n+    int upperLeft_x, upperLeft_y, upperRight_x, upperRight_y, lowerLeft_x, lowerLeft_y, lowerRight_x, lowerRight_y;\n+    char *name;\n+    GSTEXTURE source;\n+} image_texture_t;\n+typedef struct\n+{\n+    int count;\n+    char *suffix;\n+} image_cache_t;\n+typedef struct\n+{\n+    int currentUid;\n+    u32 currentConfigId;\n+    char *currentValue;\n+    image_cache_t *cache;\n+    int cacheLinked;\n+    image_texture_t *defaultTexture;\n+    image_texture_t *overlayTexture;\n+} mutable_image_t;\n+typedef struct\n+{\n+    char *value;\n+    int sizingMode;\n+    char *alias;\n+    int displayMode;\n+    u32 currentConfigId;\n+    char *currentValue;\n+    char *wrappedValue; /* the private copy a fix may add */\n+} mutable_text_t;\n+typedef struct\n+{\n+    int displayedItems;\n+    const char *decorator;\n+    mutable_image_t *decoratorImage;\n+} items_list_t;\n+typedef struct theme_element\n+{\n+    int type;\n+    int posX;\n+    int posY;\n+    short aligned;\n+    int width;\n+    int height;\n+    short scaled;\n+    u64 color;\n+    int font;\n+    void *extended;\n+    void (*drawElem)(struct menu_list *menu, struct submenu_list *item, config_set_t *config, struct theme_element *elem);\n+    void (*endElem)(struct theme_element *elem);\n+    struct theme_element *next;\n+} theme_element_t;\n+typedef struct\n+{\n+    theme_element_t *first;\n+    theme_element_t *last;\n+} theme_elems_t;\n+typedef struct theme\n+{\n+    int usedHeight;\n+    u64 textColor;\n+    theme_elems_t mainElems;\n+    theme_elems_t infoElems;\n+    theme_element_t *gamesItemsList;\n+    theme_elems_t appsMainElems;\n+    theme_elems_t appsInfoElems;\n+    theme_element_t *appsItemsList;\n+    int fonts[THM_MAX_FONTS];\n+} theme_t;\n+\n+static int screenWidth = 640, screenHeight = 448;\n+static char *strings[] = {\"Title\", \"Genre\", \"Release\", \"Developer\", \"Size\", \"Description\", \"%d games\"};\n+\n+char *_l(unsigned int id) { return strings[id]; }\n+int configGetInt(config_set_t *configSet, const char *key, int *value) { return 0; }\n+int configGetStr(config_set_t *configSet, const char *key, const char **value) { return 0; }\n+void fntFitString(int id, char *string, size_t width) {}\n+int fntRenderString(int id, int x, int y, short aligned, size_t width, size_t height, const char *string, u64 colour) { return 0; }\n+void rmUnloadTexture(GSTEXTURE *txt) {}\n+int texLookupInternalTexId(const char *name) { return -1; }\n+int texLoadInternal(GSTEXTURE *texture, int texId) { return -1; }\n+/* the file is not there: as in OPL, nothing is written to the texture */\n+int texDiscoverLoad(GSTEXTURE *texture, const char *path, int texId) { return -1; }\n+static void endMutableText(theme_element_t *elem) {}\n+static theme_element_t *initBasic(const char *themePath, config_set_t *themeConfig, theme_t *theme, const char *name, int type, int x, int y, short aligned, int w, int h, short scaled, u64 color, int font)\n+{\n+    theme_element_t *elem = calloc(1, sizeof(theme_element_t));\n+    elem->type = type;\n+    elem->width = w;\n+    elem->height = h;\n+    return elem;\n+}\n+static void initItemsList(const char *themePath, config_set_t *themeConfig, theme_t *theme, theme_element_t *elem, const char *name, const char *decorator)\n+{\n+    items_list_t *itemsList = calloc(1, sizeof(items_list_t));\n+    itemsList->displayedItems = 10;\n+    elem->extended = itemsList;\n+}\n+static void validateBackgroundElems(const char *themePath, config_set_t *themeConfig, theme_t *theme, theme_elems_t *mainElems, theme_elems_t *infoElems) {}\n+\n+#include \"theme_extracted.c\"\n+\n+static int countGames(item_list_t *itemList)\n+{\n+    return 1234;\n+}\n+\n+int main(int argc, char **argv)\n+{\n+    theme_t theme;\n+\n+    memset(&theme, 0, sizeof(theme));\n+    if (argc == 2 && strcmp(argv[1], \"gamecount\") == 0) {\n+        item_list_t list = {countGames};\n+        struct menu_item menuItem = {&list};\n+        struct menu_list menu = {&menuItem};\n+        config_set_t config = {1};\n+        theme_element_t elem;\n+\n+        memset(&elem, 0, sizeof(elem));\n+        elem.width = DIM_UNDEF;\n+        elem.height = DIM_UNDEF;\n+        initGameCountText(NULL, NULL, &theme, &elem, \"gc\");\n+        elem.drawElem(&menu, NULL, &config, &elem);\n+        printf(\"GameCountText value: \\\"%s\\\"\\n\", ((mutable_text_t *)elem.extended)->value);\n+        return 0;\n+    }\n+    if (argc == 2 && strcmp(argv[1], \"image\") == 0) {\n+        image_texture_t *texture = initImageTexture(\"mass:/THM/thm_x/\", NULL, \"bg\", \"missing\", 0);\n+        printf(\"image file missing: %s\\n\", texture ? \"texture kept, its memory pointer never set\" : \"no texture, element disabled\");\n+        fflush(stdout);\n+        if (texture)\n+            freeImageTexture(texture);\n+        printf(\"freed\\n\");\n+        return 0;\n+    }\n+    if (argc == 2 && strcmp(argv[1], \"itemslist\") == 0) {\n+        theme_element_t background, appsBackground;\n+\n+        memset(&background, 0, sizeof(background));\n+        memset(&appsBackground, 0, sizeof(appsBackground));\n+        background.type = appsBackground.type = ELEM_TYPE_BACKGROUND;\n+        theme.mainElems.first = theme.mainElems.last = &background;\n+        theme.appsMainElems.first = theme.appsMainElems.last = &appsBackground;\n+        validateGUIElems(\"mass:/THM/thm_x/\", NULL, &theme);\n+        printf(\"theme without ItemsList: gamesItemsList %s, appsItemsList %s\\n\",\n+               theme.gamesItemsList ? \"set\" : \"NULL (menusys dereferences it)\", theme.appsItemsList ? \"set\" : \"NULL\");\n+        return 0;\n+    }\n+    return 2;\n+}"
        },
        {
          "sha": "235f581e4d69e47e3e2f7de01076fb70a3ccef8b",
          "filename": "labs/host-repro/usba_ref.py",
          "status": "added",
          "additions": 23,
          "deletions": 0,
          "changes": 23,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fusba_ref.py",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fusba_ref.py",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fusba_ref.py?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,23 @@\n+\"\"\"Independent USBA_crc32 with unsigned bytes (the behaviour the fix should give).\"\"\"\n+import sys\n+\n+\n+def usba_crc32(name: bytes) -> int:\n+    tab = [0] * 256\n+    crc = 0\n+    for t in range(256):\n+        crc = (t << 24) & 0xFFFFFFFF\n+        for _ in range(8):\n+            if crc & 0x80000000:\n+                crc = (crc << 1) & 0xFFFFFFFF\n+            else:\n+                crc = ((crc << 1) ^ 0x04C11DB7) & 0xFFFFFFFF\n+        tab[255 - t] = crc\n+    data = (name + b\"\\0\")[:33]\n+    for b in data:\n+        crc = tab[b ^ (crc >> 24)] ^ ((crc << 8) & 0xFFFFFF00)\n+    return crc\n+\n+\n+for a in sys.argv[1:]:\n+    print(\"%-24s %08X\" % (a or \"(empty)\", usba_crc32(bytes.fromhex(a))))"
        },
        {
          "sha": "12a7b10fe6bd6a8365cf48f14604e2611e902d4b",
          "filename": "labs/host-repro/vmc_harness.c",
          "status": "added",
          "additions": 75,
          "deletions": 0,
          "changes": 75,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fvmc_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fvmc_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fvmc_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,75 @@\n+/* Host harness for sysCheckVMC() from src/system.c, as the VMC menu calls it:\n+ *   vmc <dir> <name> <createSize>\n+ * <dir>/VMC/<name>.bin is the card. Prints the result, the card's size afterwards and whether\n+ * a new card was requested from genvmc. */\n+#include <fcntl.h>\n+#include <io.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include <sys/stat.h>\n+\n+typedef unsigned char u8;\n+typedef unsigned short u16;\n+typedef unsigned int u32;\n+#define LOG(...)\n+#define S_IXUSR       0\n+#define S_IRGRP       0\n+#define S_IWGRP       0\n+#define S_IXGRP       0\n+#define S_IROTH       0\n+#define S_IWOTH       0\n+#define S_IXOTH       0\n+#define open(p, f, m) _open(p, (f) | _O_BINARY, _S_IREAD | _S_IWRITE)\n+#define lseek         _lseek\n+#define read          _read\n+#define close         _close\n+#define unlink        _unlink\n+\n+typedef struct\n+{\n+    char magic[40];\n+    u16 page_size;\n+    u16 pages_per_cluster;\n+    u16 pages_per_block;\n+    u16 unused0;\n+    u32 clusters_per_card;\n+    u8 rest[300];\n+    u8 mc_type;\n+    u8 mc_flag;\n+} vmc_superblock_t;\n+\n+typedef struct\n+{\n+    char VMC_filename[1024];\n+    int VMC_size_mb;\n+    int VMC_blocksize;\n+    int VMC_thread_priority;\n+    int VMC_card_slot;\n+} createVMCparam_t;\n+\n+static int created;\n+static int fileXioDevctl(const char *name, int cmd, void *arg, unsigned int arglen, void *buf, unsigned int buflen)\n+{\n+    created = ((createVMCparam_t *)arg)->VMC_size_mb;\n+    return 0;\n+}\n+\n+#include \"vmc_extracted.c\"\n+\n+int main(int argc, char **argv)\n+{\n+    char prefix[512], path[600];\n+    struct _stat st;\n+    int r;\n+\n+    sprintf(prefix, \"%s\\\\\", argv[1]);\n+    r = sysCheckVMC(prefix, \"\\\\\", argv[2], atoi(argv[3]), NULL);\n+    sprintf(path, \"%sVMC\\\\%s.bin\", prefix, argv[2]);\n+    if (_stat(path, &st) == 0)\n+        printf(\"returned %d; card kept, %ld bytes\", r, (long)st.st_size);\n+    else\n+        printf(\"returned %d; no card file\", r);\n+    printf(created ? \"; genvmc asked for a new %d MB card\\n\" : \"; no new card\\n\", created);\n+    return 0;\n+}"
        },
        {
          "sha": "bbc24e4c92296a5873f897b580629b70f29a2b6a",
          "filename": "labs/host-repro/zso_harness.c",
          "status": "added",
          "additions": 123,
          "deletions": 0,
          "changes": 123,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fzso_harness.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/labs%2Fhost-repro%2Fzso_harness.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/labs%2Fhost-repro%2Fzso_harness.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,123 @@\n+/* Host harness for modules/isofs/zso.c ziso_init() and ziso_read_sector(), with\n+ * read_raw_data() and longLseek() from modules/isofs/isofs.c and the LZ4 decoder\n+ * of the tree. Two modes:\n+ *   zso-t <file> <align>          ziso_init() on a header whose align byte is <align>\n+ *   zso-t read <zso> <lsn> <count> read <count> sectors into a buffer of exactly\n+ *                                 count * 2048 bytes and check them against the\n+ *                                 pattern make_inputs.py wrote (sector n holds\n+ *                                 (n * 7 + 1) & 0xFF) */\n+#include <fcntl.h>\n+#include <io.h>\n+#include <limits.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+\n+typedef unsigned char u8;\n+typedef unsigned int u32;\n+typedef unsigned long long u64;\n+#define lseek                _lseek\n+#define read                 _read\n+#define ZISO_IDX_MAX_ENTRIES 257\n+\n+#include \"lz4.c\"\n+#ifndef MIN\n+#define MIN(x, y) ((x < y) ? x : y)\n+#endif\n+\n+typedef struct\n+{\n+    u32 magic;\n+    u32 header_size;\n+    u64 total_bytes;\n+    u32 block_size;\n+    u8 ver;\n+    u8 align;\n+    u8 rsv_06[2];\n+} ZISO_header;\n+\n+u32 *ziso_idx_cache = NULL;\n+int ziso_idx_start_block = -1;\n+u32 ziso_align;\n+u32 ziso_total_block;\n+u8 *ziso_tmp_buf = NULL;\n+static struct\n+{\n+    int fd;\n+} MountPoint;\n+\n+void *ziso_alloc(u32 size) { return malloc(size); }\n+\n+#include \"zso_extracted.c\"\n+\n+static int init(ZISO_header *h, u32 first_block)\n+{\n+#ifdef INIT_RETURNS_INT\n+    return ziso_init(h, first_block);\n+#else\n+    ziso_init(h, first_block);\n+    return 0;\n+#endif\n+}\n+\n+static int read_test(const char *file, u32 lsn, unsigned int count)\n+{\n+    ZISO_header h;\n+    u32 first_block, i, k;\n+    u8 *buf;\n+    int r, bad = -1;\n+\n+    MountPoint.fd = _open(file, _O_RDONLY | _O_BINARY);\n+    if (MountPoint.fd < 0 || _read(MountPoint.fd, &h, sizeof(h)) != sizeof(h) || _read(MountPoint.fd, &first_block, 4) != 4) {\n+        printf(\"cannot read %s\\n\", file);\n+        return 2;\n+    }\n+    if ((r = init(&h, first_block)) != 0) {\n+        printf(\"header rejected (%d): block size %u, align %u\\n\", r, h.block_size, h.align);\n+        return 0;\n+    }\n+    printf(\"header accepted: %u sectors, block size %u, align %u\\n\", ziso_total_block, h.block_size, h.align);\n+    fflush(stdout);\n+\n+    buf = malloc(count * 2048); /* exactly what the caller provides: ASan sees writes outside it */\n+    memset(buf, 0, count * 2048);\n+    r = ziso_read_sector(buf, lsn, count);\n+    for (i = 0; i < (u32)r && bad < 0; i++) {\n+        u8 want = (u8)(((lsn + i) * 7 + 1) & 0xFF);\n+        for (k = 0; k < 2048; k++)\n+            if (buf[i * 2048 + k] != want) {\n+                bad = lsn + i;\n+                break;\n+            }\n+    }\n+    if (r != (int)count)\n+        printf(\"read %d of %u sectors from %u: read error\\n\", r, count, lsn);\n+    else if (bad >= 0)\n+        printf(\"read %u sectors from %u: WRONG DATA from sector %d\\n\", count, lsn, bad);\n+    else\n+        printf(\"read %u sectors from %u: data ok\\n\", count, lsn);\n+    free(buf);\n+    return 0;\n+}\n+\n+int main(int argc, char **argv)\n+{\n+    ZISO_header h = {0x4F53495A, 24, 2048 * 100, 2048, 1, 0, {0, 0}};\n+    u8 buf[64];\n+    int r;\n+\n+    if (argc == 5 && strcmp(argv[1], \"read\") == 0)\n+        return read_test(argv[2], (u32)strtoul(argv[3], NULL, 10), (unsigned int)strtoul(argv[4], NULL, 10));\n+\n+    h.align = (u8)atoi(argv[2]);\n+    MountPoint.fd = _open(argv[1], _O_RDONLY | _O_BINARY);\n+    if ((r = init(&h, 0)) != 0) {\n+        printf(\"align %u: header rejected (%d)\\n\", h.align, r);\n+        return 0;\n+    }\n+    printf(\"align %u: header accepted, reading index...\\n\", h.align);\n+    fflush(stdout);\n+    read_raw_data(buf, 4, 24, ziso_align);\n+    printf(\"read ok\\n\");\n+    return 0;\n+}"
        },
        {
          "sha": "cf1870ce52605b2fd75ab0f44eae3bbc6188d8ab",
          "filename": "lng_tmpl/_base.yml",
          "status": "modified",
          "additions": 26,
          "deletions": 0,
          "changes": 26,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/lng_tmpl%2F_base.yml",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/lng_tmpl%2F_base.yml",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/lng_tmpl%2F_base.yml?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -703,3 +703,29 @@ gui_strings:\n - comment: Warning shown when saving a per-game parental lock while no parental lock password is set.\n   label: PARENLOCK_GAME_NO_PASSWORD\n   string: Set a parental lock password, or this game will not be locked.\n+- label: MMCE\n+  string: MMCE\n+- label: MMCE_GAMES\n+  string: MMCE Games\n+- label: MMCE_SETTINGS\n+  string: MMCE Settings\n+- label: MMCEMODE\n+  string: MMCE Start Mode\n+- label: MMCE_SLOT\n+  string: MMCE Slot\n+- label: MMCEIGR_SLOT\n+  string: IGR Boot Card Slot(s)\n+- label: HINT_MMCEIGR_SLOT\n+  string: On IGR the card(s) in the selected slot(s) switch back to the boot card; Auto = the slots where a card answered\n+- label: MMCE_PREFIX\n+  string: MMCE Prefix Path\n+- label: MMCE_GAMEID\n+  string: Send the game ID to the card\n+- label: HINT_MMCE_GAMEID\n+  string: The card switches to the game's own memory card, also for games on USB or MX4SIO\n+- label: MMCE_ERR_NO_CARD\n+  string: No MMCE card answered.\n+- label: MMCE_ERR_UL_PARTS\n+  string: Games split into parts cannot be started from MMCE yet.\n+- label: MMCE_NO_VMC_YET\n+  string: VMCs are not used on MMCE yet; the game saves to the real memory card."
        },
        {
          "sha": "6d04222e587449fd725bf5f568cd9488bdc330ff",
          "filename": "modules/iopcore/cdvdman/Makefile",
          "status": "modified",
          "additions": 10,
          "deletions": 0,
          "changes": 10,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2FMakefile",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2FMakefile",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fcdvdman%2FMakefile?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -51,6 +51,16 @@ IOP_CFLAGS += -DDEV9_DEBUG\n endif\n endif\n \n+ifeq ($(USE_MMCE),1)\n+IOP_BIN  = mmce_cdvdman.irx\n+IOP_OBJS_DIR = obj.mmce/\n+IOP_OBJS += device-mmce.o\n+IOP_CFLAGS += -DMMCE_DRIVER\n+ifeq ($(IOPCORE_DEBUG),1)\n+USE_DEV9 = 1\n+endif\n+endif\n+\n IOP_INCS += -I../common\n \n ifeq ($(IOPCORE_DEBUG),1)"
        },
        {
          "sha": "03d85d3b1bdaf893c1117186297e80ae26b8c7ae",
          "filename": "modules/iopcore/cdvdman/cdvdman.c",
          "status": "modified",
          "additions": 4,
          "deletions": 4,
          "changes": 8,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2Fcdvdman.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2Fcdvdman.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fcdvdman%2Fcdvdman.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -243,9 +243,7 @@ static int ProbeZSO(u8 *buffer)\n     if (DeviceReadSectors(0, buffer, 1) != SCECdErNO)\n         return 0;\n     probed = 1;\n-    if (*(u32 *)buffer == ZSO_MAGIC) {\n-        // initialize ZSO\n-        ziso_init((ZISO_header *)buffer, *(u32 *)(buffer + sizeof(ZISO_header)));\n+    if (*(u32 *)buffer == ZSO_MAGIC && ziso_init((ZISO_header *)buffer, *(u32 *)(buffer + sizeof(ZISO_header))) == 0) { // initialize ZSO\n         // initialize cache\n         initCache();\n         // redirect sector reader\n@@ -388,7 +386,9 @@ static int cdvdman_read(u32 lsn, u32 sectors, u16 sector_size, void *buf)\n \n             // Copy the data for buffer.\n             // For any sector other than 2048 one sector at a time is copied.\n-            memcpy((void *)((u32)buf + offset), cdvdman_buf, nbytes);\n+            // Only 2048 bytes per sector are data: copying sector_size bytes after the header read past\n+            // cdvdman_buf and, for 2340-byte sectors, wrote 12 bytes past the caller's buffer.\n+            memcpy((void *)((u32)buf + offset), cdvdman_buf, nsectors * 2048);\n \n             // For these custom sizes we need to manually fix the header.\n             // For 2340 we have 12bytes. 4 are position."
        },
        {
          "sha": "941c215d2f0c68098594b0f82eb9714d0bd3919f",
          "filename": "modules/iopcore/cdvdman/device-mmce.c",
          "status": "added",
          "additions": 186,
          "deletions": 0,
          "changes": 186,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2Fdevice-mmce.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2Fdevice-mmce.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fcdvdman%2Fdevice-mmce.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,186 @@\n+/*\n+  Copyright 2024-2025, qnox32 and BBsan (ps2-mmce/Open-PS2-Loader)\n+  Licenced under Academic Free License version 3.0\n+  Review Open PS2 Loader README & LICENSE files for further details.\n+\n+  CDVDMAN back-end for MMCE memory-card emulators (SD2PSX, MemCard PRO 2, PSXMemCard Gen2): the ISO is a\n+  file on the card, opened by the menu and kept open by the card across the IOP reset, and it is read in\n+  game through mmcedrv.irx (ps2-mmce/mmceman) over SIO2.\n+*/\n+\n+#include \"internal.h\"\n+\n+#include \"device.h\"\n+#include \"ioplib_util.h\"\n+#include \"mmcedrv_config.h\"\n+\n+extern struct cdvdman_settings_mmce cdvdman_settings;\n+\n+// Entries 4 to 6 of the export table of mmcedrv.irx (ps2-mmce/mmceman, mmceman/src/exports.tab). The\n+// sector number and the count travel as 24-bit values: an image can have at most 0x1000000 sectors (32 GiB).\n+static s64 (*mmcedrv_get_size)(int fd) = NULL;\n+static int (*mmcedrv_read_sector)(int fd, u32 sector, u32 count, void *buffer) = NULL;\n+static void (*mmcedrv_config_set)(int setting, int value) = NULL;\n+\n+#define MMCE_MAX_SECTORS 0x1000000\n+#define MMCE_READY_TRIES 100 // x 100 ms: how long DeviceFSInit() waits for the card to answer\n+#define MMCE_READ_TRIES  3\n+\n+static int mmce_io_sema;\n+static int mmce_ready = 0; // the card answered mmcedrv_get_size() for the ISO\n+\n+//\n+// cdvdman \"Device\" functions\n+//\n+\n+void DeviceInit(void)\n+{\n+    iop_sema_t smp;\n+\n+    DPRINTF(\"%s\\n\", __func__);\n+\n+    smp.initial = 1;\n+    smp.max = 1;\n+    smp.option = 0;\n+    smp.attr = SA_THPRI;\n+    mmce_io_sema = CreateSema(&smp);\n+}\n+\n+void DeviceDeinit(void)\n+{\n+    DPRINTF(\"%s\\n\", __func__);\n+}\n+\n+int DeviceReady(void)\n+{\n+    return SCECdComplete;\n+}\n+\n+void DeviceStop(void)\n+{\n+    DPRINTF(\"%s\\n\", __func__);\n+}\n+\n+// mmcedrv.irx is loaded by the EE core after cdvdman, on every IOP reset. Without it every read fails\n+// instead of calling garbage pointers.\n+static int mmceResolveDriver(void)\n+{\n+    modinfo_t info;\n+\n+    if (mmcedrv_read_sector != NULL)\n+        return 1;\n+\n+    if (!getModInfo(\"mmcedrv\\0\", &info)) {\n+        DPRINTF(\"%s: mmcedrv is not loaded\\n\", __func__);\n+        return 0;\n+    }\n+\n+    mmcedrv_get_size = (void *)info.exports[4];\n+    mmcedrv_read_sector = (void *)info.exports[5];\n+    mmcedrv_config_set = (void *)info.exports[6];\n+\n+    // SIO2 port of the card: 2 = memory-card slot 1, 3 = slot 2. The ACK wait cycles and the alarms keep\n+    // the driver's defaults.\n+    if (cdvdman_settings.port == 2 || cdvdman_settings.port == 3)\n+        mmcedrv_config_set(MMCEDRV_SETTING_PORT, cdvdman_settings.port);\n+\n+    return 1;\n+}\n+\n+// The size is the ISO's once the card is up after the IOP reset, -1 (a 64-bit value) on a timeout or a\n+// bad reply.\n+static int mmceProbe(void)\n+{\n+    s64 size;\n+\n+    if (!mmceResolveDriver())\n+        return 0;\n+\n+    size = mmcedrv_get_size(cdvdman_settings.iso_fd);\n+    if (size <= 0)\n+        return 0;\n+\n+    DPRINTF(\"%s: fd %d, %u KiB on port %d\\n\", __func__, cdvdman_settings.iso_fd, (unsigned int)(size >> 10), cdvdman_settings.port);\n+    mmce_ready = 1;\n+    return 1;\n+}\n+\n+void DeviceFSInit(void)\n+{\n+    int i;\n+\n+    DPRINTF(\"Waiting for device...\\n\");\n+    for (i = 0; i < MMCE_READY_TRIES; i++) {\n+        if (mmceProbe())\n+            break;\n+        DelayThread(100 * 1000); // 100 ms\n+    }\n+    DPRINTF(\"Waiting for device...%s\\n\", mmce_ready ? \"done!\" : \"timed out\");\n+}\n+\n+void DeviceLock(void)\n+{\n+    DPRINTF(\"%s\\n\", __func__);\n+\n+    WaitSema(mmce_io_sema);\n+}\n+\n+void DeviceUnmount(void)\n+{\n+    DPRINTF(\"%s\\n\", __func__);\n+}\n+\n+// A read that fails on the bus is retried; one that succeeds on a retry is a success.\n+static int mmceRead(u32 lsn, void *buffer, unsigned int sectors)\n+{\n+    int i, res;\n+\n+    for (i = 0; i < MMCE_READ_TRIES; i++) {\n+        res = mmcedrv_read_sector(cdvdman_settings.iso_fd, lsn, sectors, buffer);\n+        if (res == (int)sectors)\n+            return 1;\n+        DPRINTF(\"%s: sector %u, count %u: got %d (try %d)\\n\", __func__, lsn, sectors, res, i + 1);\n+    }\n+\n+    return 0;\n+}\n+\n+int DeviceReadSectors(u64 lsn, void *buffer, unsigned int sectors)\n+{\n+    int rv = SCECdErNO;\n+\n+    // DPRINTF(\"%s(%u, 0x%p, %u)\\n\", __func__, (unsigned int)lsn, buffer, sectors);\n+\n+    if (lsn + sectors > MMCE_MAX_SECTORS)\n+        return SCECdErREAD;\n+\n+    WaitSema(mmce_io_sema);\n+    if (!mmce_ready && !mmceProbe()) {\n+        SignalSema(mmce_io_sema);\n+        return SCECdErREAD;\n+    }\n+\n+    if (((u32)buffer & 3) == 0) {\n+        if (!mmceRead((u32)lsn, buffer, sectors))\n+            rv = SCECdErREAD;\n+    } else {\n+        // The driver DMAs into the buffer, so unaligned buffers (e.g. from the ZSO reader) go through an\n+        // aligned bounce buffer, as the BDM back-end does.\n+        static u8 bounce[2048] __attribute__((aligned(64)));\n+        u8 *p = buffer;\n+\n+        while (sectors > 0) {\n+            if (!mmceRead((u32)lsn, bounce, 1)) {\n+                rv = SCECdErREAD;\n+                break;\n+            }\n+            memcpy(p, bounce, 2048);\n+            p += 2048;\n+            lsn++;\n+            sectors--;\n+        }\n+    }\n+    SignalSema(mmce_io_sema);\n+\n+    return rv;\n+}"
        },
        {
          "sha": "47800e9a5a023f9df9ea93ac3145c23e49fa7797",
          "filename": "modules/iopcore/cdvdman/internal.h",
          "status": "modified",
          "additions": 5,
          "deletions": 1,
          "changes": 6,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2Finternal.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2Finternal.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fcdvdman%2Finternal.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -48,6 +48,9 @@\n #elif BDM_DRIVER\n #define CDVDMAN_SETTINGS_TYPE cdvdman_settings_bdm\n #define CDVDMAN_SETTINGS_DEFAULT_DEVICE_SETTINGS\n+#elif MMCE_DRIVER\n+#define CDVDMAN_SETTINGS_TYPE cdvdman_settings_mmce\n+#define CDVDMAN_SETTINGS_DEFAULT_DEVICE_SETTINGS\n #else\n #error Unknown driver type. Please check the Makefile.\n #endif\n@@ -83,7 +86,8 @@ typedef struct\n \n struct dirTocEntry\n {\n-    short length;\n+    u8 length;           // 0, ISO 9660 LEN_DR\n+    u8 extAttrLength;    // 1, not used\n     u32 fileLBA;         // 2\n     u32 fileLBA_bigend;  // 6\n     u32 fileSize;        // 10"
        },
        {
          "sha": "3e83ac656209a104e644c6c1b85da24fa84084c8",
          "filename": "modules/iopcore/cdvdman/searchfile.c",
          "status": "modified",
          "additions": 14,
          "deletions": 3,
          "changes": 17,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2Fsearchfile.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcdvdman%2Fsearchfile.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fcdvdman%2Fsearchfile.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -114,6 +114,9 @@ static struct dirTocEntry *cdvdman_locatefile(char *name, u32 tocLBA, int tocLen\n \n             filename_len = tocEntryPointer->filenameLength;\n             if (filename_len) {\n+                // Longer (ISO 9660 level 2) names would overflow cdvdman_curdir. Only 12 characters are compared below.\n+                if (filename_len >= (int)sizeof(cdvdman_curdir))\n+                    filename_len = sizeof(cdvdman_curdir) - 1;\n                 strncpy(cdvdman_curdir, tocEntryPointer->filename, filename_len); // copy filename\n                 cdvdman_curdir[filename_len] = 0;\n \n@@ -140,10 +143,11 @@ static struct dirTocEntry *cdvdman_locatefile(char *name, u32 tocLBA, int tocLen\n                     }\n \n                     goto lbl_startlocate;\n-                } else {\n-                    tocPos += (tocEntryPointer->length << 16) >> 16;\n                 }\n             }\n+\n+            // Advance past every other record, including one without a name\n+            tocPos += tocEntryPointer->length;\n         } while (tocPos < 2016);\n     }\n \n@@ -202,7 +206,14 @@ static int cdvdman_findfile(sceCdlFILE *pcdfile, const char *name, int layer)\n     else\n         pcdfile->size = tocEntryPointer->fileSize;\n \n-    strcpy(pcdfile->name, strrchr(name, '\\\\') + 1);\n+    // For information only: the last path component, cut to fit. The name may use '/' and have no '\\\\'.\n+    const char *base = name, *c;\n+    for (c = name; *c != '\\0'; c++) {\n+        if (*c == '\\\\' || *c == '/')\n+            base = c + 1;\n+    }\n+    strncpy(pcdfile->name, base, sizeof(pcdfile->name) - 1);\n+    pcdfile->name[sizeof(pcdfile->name) - 1] = '\\0';\n \n     DPRINTF(\"cdvdman_findfile found %s\\n\", name);\n "
        },
        {
          "sha": "9c830a4b4ece4dc2df4bd10ad4cef263371c1abf",
          "filename": "modules/iopcore/common/cdvd_config.h",
          "status": "modified",
          "additions": 11,
          "deletions": 0,
          "changes": 11,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcommon%2Fcdvd_config.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcommon%2Fcdvd_config.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fcommon%2Fcdvd_config.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -89,6 +89,17 @@ struct cdvdman_settings_bdm\n     bd_fragment_t frags[BDM_MAX_FRAGS];\n } __attribute__((packed));\n \n+struct cdvdman_settings_mmce\n+{\n+    struct cdvdman_settings_common common;\n+\n+    // SIO2 port of the MMCE card: 2 = memory-card slot 1, 3 = slot 2.\n+    int port;\n+\n+    // The card's own descriptor of the ISO, which the menu opened (fileXioIoctl2 0x80 on the mmce handle).\n+    int iso_fd;\n+} __attribute__((packed));\n+\n #define CDVDMAN_SETTINGS_DEFAULT_COMMON                                \\\n     {                                                                  \\\n         0x68, 0x68, 0x1234, 0x39393939, \"DSKID\", 16, 8, 16, 0x87654321 \\"
        },
        {
          "sha": "fee13354cc78800db004f517dc23122cc5b7da06",
          "filename": "modules/iopcore/common/mmcedrv_config.h",
          "status": "added",
          "additions": 15,
          "deletions": 0,
          "changes": 15,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcommon%2Fmmcedrv_config.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fiopcore%2Fcommon%2Fmmcedrv_config.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fiopcore%2Fcommon%2Fmmcedrv_config.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,15 @@\n+/*\n+  Settings of mmcedrv.irx (ps2-mmce/mmceman, mmceman/include/mmcedrv_config.h, MIT), as its export\n+  mmcedrv_config_set(setting, value) takes them.\n+*/\n+\n+#ifndef MMCEDRV_CONFIG_H\n+#define MMCEDRV_CONFIG_H\n+\n+enum mmcedrv_settings {\n+    MMCEDRV_SETTING_PORT = 0x0,\n+    MMCEDRV_SETTING_ACK_WAIT_CYCLES = 0x1,\n+    MMCEDRV_SETTING_USE_ALARMS = 0x2,\n+};\n+\n+#endif"
        },
        {
          "sha": "093869d2bba9834546443e3f3c4548900fad2b52",
          "filename": "modules/isofs/isofs.c",
          "status": "modified",
          "additions": 15,
          "deletions": 7,
          "changes": 22,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fisofs%2Fisofs.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fisofs%2Fisofs.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fisofs%2Fisofs.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -18,7 +18,8 @@ IRX_ID(MODNAME, 1, 1);\n \n struct dirTocEntry\n {\n-    short length;\n+    u8 length;           // 0, ISO 9660 LEN_DR\n+    u8 extAttrLength;    // 1, not used\n     u32 fileLBA;         // 2\n     u32 fileLBA_bigend;  // 6\n     u32 fileSize;        // 10\n@@ -288,10 +289,11 @@ static struct dirTocEntry *cdvdman_locatefile(char *name, u32 tocLBA, int tocLen\n                         tocLBA += layer1_start;\n \n                     goto lbl_startlocate;\n-                } else {\n-                    tocPos += (tocEntryPointer->length << 16) >> 16;\n                 }\n             }\n+\n+            // Advance past every other record, including one without a name\n+            tocPos += tocEntryPointer->length;\n         } while (tocPos < 2016);\n     }\n \n@@ -336,7 +338,14 @@ static int cdvdman_findfile(cd_file_t *pcdfile, const char *name, int layer)\n         pcdfile->lsn = lsn;\n         pcdfile->size = tocEntryPointer->fileSize;\n \n-        strcpy(pcdfile->name, strrchr(name, '\\\\') + 1);\n+        // For information only: the last path component, cut to fit. The name may use '/' and have no '\\\\'.\n+        const char *base = name, *c;\n+        for (c = name; *c != '\\0'; c++) {\n+            if (*c == '\\\\' || *c == '/')\n+                base = c + 1;\n+        }\n+        strncpy(pcdfile->name, base, sizeof(pcdfile->name) - 1);\n+        pcdfile->name[sizeof(pcdfile->name) - 1] = '\\0';\n     } else {\n         return 0;\n     }\n@@ -513,9 +522,8 @@ static int ProbeZISO(int fd)\n         u32 first_block;\n     } ziso_data;\n     longLseek(fd, 0);\n-    if (read(fd, &ziso_data, sizeof(ziso_data)) == sizeof(ziso_data) && ziso_data.header.magic == ZSO_MAGIC) {\n-        // initialize ZSO\n-        ziso_init(&ziso_data.header, ziso_data.first_block);\n+    if (read(fd, &ziso_data, sizeof(ziso_data)) == sizeof(ziso_data) && ziso_data.header.magic == ZSO_MAGIC &&\n+        ziso_init(&ziso_data.header, ziso_data.first_block) == 0) { // initialize ZSO\n         // redirect cdEmuRead function\n         cdEmuRead = &cdEmuReadCompressed;\n         return 1;"
        },
        {
          "sha": "60cf058b0f0c19c4593d053f9819fc986213775e",
          "filename": "modules/isofs/zso.c",
          "status": "modified",
          "additions": 46,
          "deletions": 11,
          "changes": 57,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fisofs%2Fzso.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fisofs%2Fzso.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fisofs%2Fzso.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -16,8 +16,16 @@ u32 ziso_total_block;\n // block buffers\n u8 *ziso_tmp_buf = NULL;\n \n-void ziso_init(ZISO_header *header, u32 first_block)\n+int ziso_init(ZISO_header *header, u32 first_block)\n {\n+    // read_raw_data() divides by (2048 >> align), so a larger shift cannot be read\n+    if (header->align > 11)\n+        return -1;\n+    // The reader indexes blocks of one 2048-byte sector: with a larger block size (maxcso writes\n+    // 16 KiB blocks for images of 2 GiB and more) the index would be read as the wrong sectors\n+    if (header->block_size != 2048)\n+        return -1;\n+\n     // read header information\n     ziso_align = header->align;\n     ziso_idx_start_block = -1;\n@@ -33,6 +41,7 @@ void ziso_init(ZISO_header *header, u32 first_block)\n             ziso_idx_cache = (u32 *)(ziso_tmp_buf + 2048);\n         }\n     }\n+    return 0;\n }\n \n /*\n@@ -41,19 +50,12 @@ void ziso_init(ZISO_header *header, u32 first_block)\n   Tailored for OPL.\n   It's made to work with 2048 block size (matching DVD sector size) and LZ4 compression (ZSO).\n */\n-int ziso_read_sector(u8 *addr, u32 lsn, unsigned int count)\n+// Reads at most ZISO_IDX_MAX_ENTRIES - 1 sectors, which the index cache covers at once\n+static int ziso_read_slice(u8 *addr, u32 lsn, unsigned int count)\n {\n \n     u32 cur_block = lsn;\n \n-    if (lsn >= ziso_total_block) {\n-        return 0; // can't seek beyond file\n-    }\n-\n-    if (lsn + count > ziso_total_block) {\n-        count = ziso_total_block - lsn; // adjust oob reads\n-    }\n-\n     // refresh index table if needed\n     if (ziso_idx_start_block < 0 || lsn < ziso_idx_start_block || lsn + count >= ziso_idx_start_block + ZISO_IDX_MAX_ENTRIES - 1) {\n         read_raw_data((u8 *)ziso_idx_cache, ZISO_IDX_MAX_ENTRIES * sizeof(u32), lsn * 4 + sizeof(ZISO_header), 0);\n@@ -64,8 +66,17 @@ int ziso_read_sector(u8 *addr, u32 lsn, unsigned int count)\n     u32 o_end = (ziso_idx_cache[cur_block + count - ziso_idx_start_block] & 0x7FFFFFFF);\n     u32 compressed_size = (o_end - o_start) << ziso_align;\n \n+    // A corrupt index could place the compressed data outside the buffer: the offsets must not\n+    // decrease, and the blocks must fit the count * 2048 bytes the caller provides (a block is\n+    // stored in at most the 2048 bytes it decodes to)\n+    for (unsigned int i = 1; i <= count; i++) {\n+        if ((ziso_idx_cache[cur_block - ziso_idx_start_block + i] & 0x7FFFFFFF) < (ziso_idx_cache[cur_block - ziso_idx_start_block + i - 1] & 0x7FFFFFFF))\n+            return 0;\n+    }\n+    if (o_end - o_start > (count * 2048) >> ziso_align)\n+        return 0;\n+\n     // read all compressed data to the end of provided buffer to reduce IO\n-    // there should be no overflow or overrun, as long as compressed data is smaller, and it should be\n     u8 *c_buff = addr + (count * 2048) - compressed_size;\n     read_raw_data(c_buff, compressed_size, o_start, ziso_align);\n \n@@ -98,3 +109,27 @@ int ziso_read_sector(u8 *addr, u32 lsn, unsigned int count)\n     }\n     return cur_block - lsn;\n }\n+\n+int ziso_read_sector(u8 *addr, u32 lsn, unsigned int count)\n+{\n+    unsigned int done = 0;\n+\n+    if (lsn >= ziso_total_block) {\n+        return 0; // can't seek beyond file\n+    }\n+\n+    if (lsn + count > ziso_total_block) {\n+        count = ziso_total_block - lsn; // adjust oob reads\n+    }\n+\n+    // the index cache holds ZISO_IDX_MAX_ENTRIES offsets: a larger read goes in slices\n+    while (done < count) {\n+        unsigned int n = count - done;\n+        if (n > ZISO_IDX_MAX_ENTRIES - 1)\n+            n = ZISO_IDX_MAX_ENTRIES - 1;\n+        if (ziso_read_slice(addr + done * 2048, lsn + done, n) != (int)n)\n+            break;\n+        done += n;\n+    }\n+    return done;\n+}"
        },
        {
          "sha": "e8574a1ad44c2aea324b1386ae3825877b91425d",
          "filename": "modules/isofs/zso.h",
          "status": "modified",
          "additions": 1,
          "deletions": 1,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fisofs%2Fzso.h",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fisofs%2Fzso.h",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fisofs%2Fzso.h?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -38,7 +38,7 @@ extern u32 ziso_total_block;\n // temp block buffer (2048 bytes)\n extern u8 *ziso_tmp_buf;\n \n-void ziso_init(ZISO_header *header, u32 first_block);\n+int ziso_init(ZISO_header *header, u32 first_block); // 0, or -1 for a header OPL cannot read\n int ziso_read_sector(u8 *buf, u32 sector, unsigned int count);\n \n // This must be implemented by isofs/cdvdman/frontend"
        },
        {
          "sha": "671e06dc3d63926a9ff0d792873cf290bc31198a",
          "filename": "modules/usb/usbd_mini/Makefile",
          "status": "added",
          "additions": 14,
          "deletions": 0,
          "changes": 14,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fusb%2Fusbd_mini%2FMakefile",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fusb%2Fusbd_mini%2FMakefile",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fusb%2Fusbd_mini%2FMakefile?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,14 @@\n+# usbd_mini.irx built from the ps2sdk USBD sources from before the \"USBD feature update\" (ps2sdk\n+# b1f7ff96), which download_usbd.sh fetches into ps2sdk/. It is built the way ps2sdk built it then:\n+# the sources of iop/usb/usbd with -DMINI_DRIVER (iop/usb/usbd_mini/Makefile of that tree). See FORK.md.\n+IOP_BIN = usbd_mini.irx\n+IOP_OBJS = hcd.o hub.o interface.o mem.o usbd.o usbio.o driver.o imports.o exports.o\n+\n+USBD_DIR = ps2sdk/iop/usb/usbd/\n+IOP_CFLAGS += -DMINI_DRIVER\n+IOP_INCS += -I$(USBD_DIR)src/ -I$(USBD_DIR)include/\n+\n+include $(PS2SDK)/Defs.make\n+include ../../Rules.bin.make\n+IOP_SRC_DIR = $(USBD_DIR)src/\n+include $(PS2SDK)/samples/Makefile.iopglobal"
        },
        {
          "sha": "77398fec18e3009c319cd26fedd84836858333ae",
          "filename": "modules/vmc/genvmc/genvmc.c",
          "status": "modified",
          "additions": 3,
          "deletions": 1,
          "changes": 4,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fvmc%2Fgenvmc%2Fgenvmc.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/modules%2Fvmc%2Fgenvmc%2Fgenvmc.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/modules%2Fvmc%2Fgenvmc%2Fgenvmc.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -206,8 +206,10 @@ static int mc_writecluster(int fd, int cluster, void *buf, int dup)\n         lseek(fd, cluster * mcdi->cluster_size, SEEK_SET);\n         size = mcdi->cluster_size * dup;\n         r = write(fd, buf, size);\n-        if (r != size)\n+        if (r != size) {\n+            SignalSema(genvmc_abort_sema); // the next write, and an abort, wait on it\n             return -1;\n+        }\n     }\n \n     SignalSema(genvmc_abort_sema);"
        },
        {
          "sha": "e88d38ba28804ad0b327efd64579dc8c58a531ed",
          "filename": "pc/iso2opl/src/iso2opl.c",
          "status": "modified",
          "additions": 1,
          "deletions": 1,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/pc%2Fiso2opl%2Fsrc%2Fiso2opl.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/pc%2Fiso2opl%2Fsrc%2Fiso2opl.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/pc%2Fiso2opl%2Fsrc%2Fiso2opl.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -62,7 +62,7 @@ u32 crc32(const char *string)\n     }\n \n     do {\n-        byte = string[count++];\n+        byte = (unsigned char)string[count++]; // same as USBA_crc32() in OPL: bytes >= 0x80 are not negative\n         crc = crctab[byte ^ ((crc >> 24) & 0xFF)] ^ ((crc << 8) & 0xFFFFFF00);\n     } while (string[count - 1] != 0);\n "
        },
        {
          "sha": "995f5fac9e33c4c62a898a785097395fb48162eb",
          "filename": "pc/opl2iso/src/opl2iso.c",
          "status": "modified",
          "additions": 1,
          "deletions": 1,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/pc%2Fopl2iso%2Fsrc%2Fopl2iso.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/pc%2Fopl2iso%2Fsrc%2Fopl2iso.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/pc%2Fopl2iso%2Fsrc%2Fopl2iso.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -57,7 +57,7 @@ u32 crc32(const char *string)\n     }\n \n     do {\n-        byte = string[count++];\n+        byte = (unsigned char)string[count++]; // same as USBA_crc32() in OPL: bytes >= 0x80 are not negative\n         crc = crctab[byte ^ ((crc >> 24) & 0xFF)] ^ ((crc << 8) & 0xFFFFFF00);\n     } while (string[count - 1] != 0);\n "
        },
        {
          "sha": "fb903e8663b83f79e4ad97b4f4d8bcf9763b0d4c",
          "filename": "src/OSDHistory.c",
          "status": "modified",
          "additions": 4,
          "deletions": 1,
          "changes": 5,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2FOSDHistory.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2FOSDHistory.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2FOSDHistory.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -273,14 +273,17 @@ static void GetBootFilename(const char *bootpath, char *filename)\n             if (length > 2 && bootpath[length - 1] == '1' && bootpath[length - 2] == ';')\n                 length -= 2;\n             length -= (i + 1);\n+            if (length > 16) // A history record holds 16 characters; filename has room for 16 and the NUL.\n+                length = 16;\n             strncpy(filename, &bootpath[i + 1], length);\n             filename[length] = '\\0';\n             break;\n         }\n     }\n \n     if (i == 0) { // The boot path contains only the filename.\n-        strcpy(filename, bootpath);\n+        strncpy(filename, bootpath, 16);\n+        filename[16] = '\\0';\n     }\n }\n "
        },
        {
          "sha": "a2548e152dae48193a1db8988de5ba30fb3b81bb",
          "filename": "src/bdmsupport.c",
          "status": "modified",
          "additions": 24,
          "deletions": 14,
          "changes": 38,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fbdmsupport.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fbdmsupport.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fbdmsupport.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -43,8 +43,8 @@ int bdmFindPartition(char *target, const char *name, int write)\n             sprintf(path, \"mass%d:%s/%s\", i, gBDMPrefix, name);\n         else\n             sprintf(path, \"mass%d:%s\", i, name);\n-        if (write)\n-            fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0666);\n+        if (write) // Only a probe: the file is written later, and only if its settings are saved\n+            fd = open(path, O_WRONLY | O_CREAT, 0666);\n         else\n             fd = open(path, O_RDONLY);\n \n@@ -344,6 +344,7 @@ void bdmLaunchGame(item_list_t *itemList, int id, config_set_t *configSet)\n \n     for (vmc_id = 0; vmc_id < 2; vmc_id++) {\n         memset(&bdm_vmc_infos, 0, sizeof(bdm_vmc_infos_t));\n+        have_error = 0; // An error in slot 1 must not be reported again for slot 2\n         configGetVMC(configSet, vmc_name, sizeof(vmc_name), vmc_id);\n         if (vmc_name[0]) {\n             have_error = 1;\n@@ -401,13 +402,12 @@ void bdmLaunchGame(item_list_t *itemList, int id, config_set_t *configSet)\n         } else\n             LOG(\"VMC error\\n\");\n \n-        for (i = 0; i < size_bdm_mcemu_irx; i++) {\n-            if (((u32 *)&bdm_mcemu_irx)[i] == (0xC0DEFAC0 + vmc_id)) {\n-                if (bdm_vmc_infos.active)\n-                    size_mcemu_irx = size_bdm_mcemu_irx;\n-                memcpy(&((u32 *)&bdm_mcemu_irx)[i], &bdm_vmc_infos, sizeof(bdm_vmc_infos_t));\n-                break;\n-            }\n+        static int mcemuSlots[2];\n+        int slotWord = sbMcemuSlotWord(&bdm_mcemu_irx, size_bdm_mcemu_irx, vmc_id, mcemuSlots);\n+        if (slotWord >= 0) {\n+            if (bdm_vmc_infos.active)\n+                size_mcemu_irx = size_bdm_mcemu_irx;\n+            memcpy(&((u32 *)&bdm_mcemu_irx)[slotWord], &bdm_vmc_infos, sizeof(bdm_vmc_infos_t));\n         }\n     }\n \n@@ -450,7 +450,8 @@ void bdmLaunchGame(item_list_t *itemList, int id, config_set_t *configSet)\n \n         // Get fragment list\n         int iFragCount = fileXioIoctl2(iop_fd, USBMASS_IOCTL_GET_FRAGLIST, NULL, 0, (void *)&settings->frags[iTotalFragCount], sizeof(bd_fragment_t) * (BDM_MAX_FRAGS - iTotalFragCount));\n-        if (iFragCount > BDM_MAX_FRAGS) {\n+        // The driver returns the file's full fragment count, even when only part of it fitted\n+        if (iFragCount < 0 || iFragCount > BDM_MAX_FRAGS - iTotalFragCount) {\n             // Too many fragments\n             close(fd);\n             sbUnprepare(&settings->common);\n@@ -639,9 +640,11 @@ static void bdmCleanUp(item_list_t *itemList, int exception)\n         LOG(\"BDMSUPPORT CleanUp\\n\");\n \n         bdm_device_data_t *pDeviceData = (bdm_device_data_t *)itemList->priv;\n-        free(pDeviceData->bdmGames);\n-        free(pDeviceData);\n-        itemList->priv = NULL;\n+        if (pDeviceData != NULL) {\n+            free(pDeviceData->bdmGames);\n+            free(pDeviceData);\n+            itemList->priv = NULL;\n+        }\n \n         //      if ((exception & UNMOUNT_EXCEPTION) == 0)\n         //          ...\n@@ -663,7 +666,7 @@ static void bdmShutdown(item_list_t *itemList)\n     // As required by some (typically 2.5\") HDDs, issue the SCSI STOP UNIT command to avoid causing an emergency park.\n     fileXioDevctl(path, USBMASS_DEVCTL_STOP_ALL, NULL, 0, NULL, 0);\n \n-    if (itemList->enabled) {\n+    if (itemList->enabled && pDeviceData != NULL) {\n         LOG(\"BDMSUPPORT Shutdown free data\\n\");\n \n         // Free device data.\n@@ -721,6 +724,13 @@ void bdmInitDevicesData()\n \n     // Refresh the visibility of the menu.\n     for (int i = 0; i < MAX_BDM_DEVICES; i++) {\n+        // bdmCleanUp() frees the per-device data, e.g. before the NBD server starts. Allocate it again\n+        // and mark the device as not initialized, so it is set up again like on the first start.\n+        if (bdmDeviceList[i].priv == NULL) {\n+            bdmDeviceList[i].priv = calloc(1, sizeof(bdm_device_data_t));\n+            bdmDeviceList[i].enabled = 0;\n+        }\n+\n         // Register the device structure into the UI.\n         initSupport(&bdmDeviceList[i], i, 0);\n "
        },
        {
          "sha": "d01e513609547776bc62831095fabcfbcecc4d70",
          "filename": "src/cheatconfig.c",
          "status": "modified",
          "additions": 2,
          "deletions": 1,
          "changes": 3,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fcheatconfig.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fcheatconfig.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fcheatconfig.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -79,8 +79,9 @@ void cheatConfigLoadSelections(config_set_t *configSet)\n         if (!configGetStrCopy(configSet, key, savedName, sizeof(savedName)))\n             break;\n \n+        // Each saved name enables the first match not enabled yet, so cheats that share a name keep their picks\n         for (cheatIndex = 0; cheatIndex < MAX_CODES && gCheats[cheatIndex].name[0] != NUL; cheatIndex++) {\n-            if (!cheatConfigIsMasterCode(gCheats[cheatIndex].name) &&\n+            if (!gCheats[cheatIndex].enabled && !cheatConfigIsMasterCode(gCheats[cheatIndex].name) &&\n                 cheatNamesMatch(gCheats[cheatIndex].name, savedName)) {\n                 gCheats[cheatIndex].enabled = 1;\n                 break;"
        },
        {
          "sha": "fe6a282ef9ca2f5825843e9f8dc132eeab359305",
          "filename": "src/cheatman.c",
          "status": "modified",
          "additions": 20,
          "deletions": 8,
          "changes": 28,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fcheatman.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fcheatman.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fcheatman.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -72,7 +72,7 @@ static code_t make_code(const char *s)\n     code_t code;\n     u32 address;\n     u32 value;\n-    char digits[CODE_DIGITS];\n+    char digits[CODE_DIGITS + 1]; // is_cheat_code() let exactly CODE_DIGITS digits through, plus NUL\n     int i = 0;\n \n     while (*s) {\n@@ -198,9 +198,11 @@ static int trim_str(char *s)\n     size_t slen;\n     char *t = s;\n \n-    /* Return if string is empty */\n-    if (is_empty_str(s))\n+    /* Return if string is empty. A string of blanks trims to an empty one. */\n+    if (is_empty_str(s)) {\n+        *s = NUL;\n         return -1;\n+    }\n \n     /* Get first non-space char */\n     while (isspace((int)*t++))\n@@ -257,9 +259,9 @@ static int parse_buf(const char *buf)\n     while (*buf) {\n         /* Scanner */\n         int len = chr_idx(buf, LF);\n-        if (len < 0)\n+        if (len < 0) // The last line may have no LF\n             len = strlen(buf);\n-        else if (len > CHEAT_LINE_MAX)\n+        if (len > CHEAT_LINE_MAX)\n             len = CHEAT_LINE_MAX;\n \n         if (!is_empty_substr(buf, len)) {\n@@ -282,7 +284,13 @@ static int parse_buf(const char *buf)\n                 code = parse_line(line, linenumber);\n                 if (!(code.addr == 0 && code.val == 0)) {\n                     // Only add the cheat entry if we have a valid cheat name in temp_name\n-                    if (cheat_index < MAX_CODES && temp_name[0] != NUL) {\n+                    if (temp_name[0] != NUL) {\n+                        // gCheats is full: drop the remaining cheats instead of writing past the\n+                        // array or appending their codes to the last cheat.\n+                        if (cheat_index + 1 >= MAX_CODES) {\n+                            LOG(\"%s: more than %d cheats, ignoring the rest\\n\", __FUNCTION__, MAX_CODES);\n+                            break;\n+                        }\n                         cheat_index++; // Move to the next cheat entry\n                         strncpy(gCheats[cheat_index].name, temp_name, CHEAT_NAME_MAX);\n                         gCheats[cheat_index].name[CHEAT_NAME_MAX] = NUL;\n@@ -296,7 +304,9 @@ static int parse_buf(const char *buf)\n             }\n         }\n         linenumber++;\n-        buf += len + 1;\n+        buf += len;\n+        if (*buf != NUL) // Step over the LF (or the byte where a long line was cut), never over the end\n+            buf++;\n     }\n \n     return 0;\n@@ -390,7 +400,9 @@ void set_cheats_list(void)\n     // Populate the cheat list\n     for (int i = 0; i < MAX_CODES; ++i) {\n         if (gCheats[i].enabled) {\n-            for (int j = 0; j < MAX_CHEATLIST && gCheats[i].codes[j].addr != 0; ++j) {\n+            // A code line may have address 0 (the second line of multi-line codes): only an all-zero\n+            // pair, which parse_buf() never stores, ends the codes, as in the cheat engine\n+            for (int j = 0; j < MAX_CHEATLIST && (gCheats[i].codes[j].addr != 0 || gCheats[i].codes[j].val != 0); ++j) {\n                 if (cheatCount + 2 <= MAX_CHEATLIST) {\n                     // Store the address and value in gCheatList\n                     gCheatList[cheatCount++] = gCheats[i].codes[j].addr;"
        },
        {
          "sha": "092bb9dc68462e97736db4a8b641d62e5deebf39",
          "filename": "src/config.c",
          "status": "modified",
          "additions": 23,
          "deletions": 12,
          "changes": 35,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fconfig.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fconfig.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fconfig.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -41,7 +41,7 @@ static int strToColor(const char *string, unsigned char *color)\n \n     string++;\n \n-    while (*string) {\n+    while (*string && n < 3) { // Ignore digits past RRGGBB, e.g. an alpha byte\n         int fh = fromHex(*string);\n         if (fh >= 0) {\n             color[n] = color[n] * 16 + fh;\n@@ -82,31 +82,35 @@ static int splitAssignment(char *line, char *key, size_t keymax, char *val, size\n     char *eqpos = strchr(line, '=');\n \n     if (eqpos) {\n-        // copy the name and the value\n-        size_t keylen = min(keymax, eqpos - line);\n+        // copy the name and the value, cut to fit with room for the terminator\n+        size_t keylen = min(keymax - 1, eqpos - line);\n \n         strncpy(key, line, keylen);\n+        key[keylen] = '\\0';\n \n         eqpos++;\n \n-        size_t vallen = min(valmax, strlen(line) - (eqpos - line));\n+        size_t vallen = min(valmax - 1, strlen(line) - (eqpos - line));\n         strncpy(val, eqpos, vallen);\n+        val[vallen] = '\\0';\n     }\n \n     return (int)eqpos;\n }\n \n-static int parsePrefix(char *line, char *prefix)\n+static int parsePrefix(char *line, char *prefix, size_t prefixmax)\n {\n     // find \"=\".\n     // If found, the text before is key, after is val.\n     // Otherwise malformed string is encountered\n     char *colpos = strchr(line, ':');\n \n     if (colpos && colpos != line) {\n-        // copy the name and the value\n-        strncpy(prefix, line, colpos - line);\n-        prefix[colpos - line] = 0;\n+        // copy the name, cut to fit with room for the terminator\n+        size_t len = min(prefixmax - 1, colpos - line);\n+\n+        strncpy(prefix, line, len);\n+        prefix[len] = 0;\n \n         return 1;\n     } else {\n@@ -176,7 +180,7 @@ void configPrepareNotifications(char *prefix)\n {\n     char *colpos;\n \n-    snprintf(cfgDevice, sizeof(cfgDevice), prefix);\n+    snprintf(cfgDevice, sizeof(cfgDevice), \"%s\", prefix);\n \n     if ((colpos = strchr(cfgDevice, ':')) != NULL)\n         *(colpos + 1) = '\\0';\n@@ -415,8 +419,11 @@ static int configReadLegacyIP(void)\n     if (fd >= 0) {\n         char ipconfig[256];\n         int size = getFileSize(fd);\n-        read(fd, &ipconfig, size);\n+        if (size < 0 || size > (int)sizeof(ipconfig) - 1) // The three addresses fit easily; ignore the rest\n+            size = sizeof(ipconfig) - 1;\n+        size = read(fd, ipconfig, size);\n         close(fd);\n+        ipconfig[size > 0 ? size : 0] = '\\0';\n \n         sscanf(ipconfig, \"%d.%d.%d.%d %d.%d.%d.%d %d.%d.%d.%d\", &ps2_ip[0], &ps2_ip[1], &ps2_ip[2], &ps2_ip[3],\n                &ps2_netmask[0], &ps2_netmask[1], &ps2_netmask[2], &ps2_netmask[3],\n@@ -497,7 +504,7 @@ static int configReadFileBuffer(file_buffer_t *fileBuffer, config_set_t *configS\n             } else {\n                 configSetStr(configSet, key, val);\n             }\n-        } else if (parsePrefix(line, prefix)) {\n+        } else if (parsePrefix(line, prefix, sizeof(prefix))) {\n             // prefix is set, that's about it\n         } else {\n             LOG(\"CONFIG Malformed file '%s' line %d: '%s'\\n\", configSet->filename, lineno, line);\n@@ -557,7 +564,11 @@ int configWrite(config_set_t *configSet)\n                 cur = cur->next;\n             }\n \n-            closeFileBuffer(fileBuffer);\n+            if (closeFileBuffer(fileBuffer) != 0) {\n+                // The file is incomplete (e.g. the memory card is full): report it and keep the changes\n+                bgmUnMute();\n+                return 0;\n+            }\n             configSet->modified = 0;\n             bgmUnMute();\n             return 1;"
        },
        {
          "sha": "6cb611c1c73c5f2a6b205edbd67bbdeae3c4b32f",
          "filename": "src/dia.c",
          "status": "modified",
          "additions": 3,
          "deletions": 1,
          "changes": 4,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fdia.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fdia.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fdia.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -954,8 +954,10 @@ int diaExecuteDialog(struct UIItem *ui, int uiId, short inMenu, int (*updater)(i\n \n         if (updater) {\n             int updResult = updater(modified);\n-            if (updResult)\n+            if (updResult) {\n+                diaRestoreScrollSpeed();\n                 return updResult;\n+            }\n         }\n     }\n }"
        },
        {
          "sha": "a2cdaacb346ea8c5ffcb45db7676beeaa2b8bb60",
          "filename": "src/dialogs.c",
          "status": "modified",
          "additions": 37,
          "deletions": 0,
          "changes": 37,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fdialogs.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fdialogs.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fdialogs.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -1087,3 +1087,40 @@ struct UIItem diaOSDConfig[] = {\n     {UI_BREAK},\n     // end of dialog\n     {UI_TERMINATOR}};\n+\n+// MMCE Settings Menu\n+struct UIItem diaMMCEConfig[] = {\n+    {UI_LABEL, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_MMCE_SETTINGS}}},\n+    {UI_SPLITTER},\n+\n+    {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_MMCEMODE}}},\n+    {UI_SPACER},\n+    {UI_ENUM, CFG_MMCEMODE, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}},\n+    {UI_BREAK},\n+\n+    {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_MMCE_SLOT}}},\n+    {UI_SPACER},\n+    {UI_ENUM, CFG_MMCESLOT, 1, 1, -1, 0, 0, {.intvalue = {0, 0}}},\n+    {UI_BREAK},\n+\n+    {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_MMCEIGR_SLOT}}},\n+    {UI_SPACER},\n+    {UI_ENUM, CFG_MMCEIGRSLOT, 1, 1, _STR_HINT_MMCEIGR_SLOT, 0, 0, {.intvalue = {0, 0}}},\n+    {UI_BREAK},\n+\n+    {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_MMCE_PREFIX}}},\n+    {UI_SPACER},\n+    {UI_STRING, CFG_MMCEPREFIX, 1, 1, -1, 0, 0, {.stringvalue = {\"\", \"\", NULL}}},\n+    {UI_BREAK},\n+\n+    {UI_LABEL, 0, 1, 1, -1, -40, 0, {.label = {NULL, _STR_MMCE_GAMEID}}},\n+    {UI_SPACER},\n+    {UI_BOOL, CFG_MMCEGAMEID, 1, 1, _STR_HINT_MMCE_GAMEID, 0, 0, {.intvalue = {0, 0}}},\n+    {UI_BREAK},\n+\n+    // buttons\n+    {UI_OK, 0, 1, 1, -1, 0, 0, {.label = {NULL, _STR_OK}}},\n+    {UI_BREAK},\n+\n+    // end of dialog\n+    {UI_TERMINATOR}};\n\\ No newline at end of file"
        },
        {
          "sha": "d6753ccc53a74c4ad52db9009f6b0506a4562db2",
          "filename": "src/ethsupport.c",
          "status": "modified",
          "additions": 6,
          "deletions": 7,
          "changes": 13,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fethsupport.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fethsupport.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fethsupport.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -621,13 +621,12 @@ static void ethLaunchGame(item_list_t *itemList, int id, config_set_t *configSet\n             }\n         }\n \n-        for (i = 0; i < size_smb_mcemu_irx; i++) {\n-            if (((u32 *)&smb_mcemu_irx)[i] == (0xC0DEFAC0 + vmc_id)) {\n-                if (smb_vmc_infos.active)\n-                    size_mcemu_irx = size_smb_mcemu_irx;\n-                memcpy(&((u32 *)&smb_mcemu_irx)[i], &smb_vmc_infos, sizeof(smb_vmc_infos_t));\n-                break;\n-            }\n+        static int mcemuSlots[2];\n+        int slotWord = sbMcemuSlotWord(&smb_mcemu_irx, size_smb_mcemu_irx, vmc_id, mcemuSlots);\n+        if (slotWord >= 0) {\n+            if (smb_vmc_infos.active)\n+                size_mcemu_irx = size_smb_mcemu_irx;\n+            memcpy(&((u32 *)&smb_mcemu_irx)[slotWord], &smb_vmc_infos, sizeof(smb_vmc_infos_t));\n         }\n     }\n "
        },
        {
          "sha": "eb4b4d49c06bd8f47127ce9b6bc2b28952d331a7",
          "filename": "src/fntsys.c",
          "status": "modified",
          "additions": 5,
          "deletions": 1,
          "changes": 6,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Ffntsys.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Ffntsys.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Ffntsys.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -772,7 +772,7 @@ void fntFitString(int id, char *string, size_t width)\n                 *sp = osp;\n                 cw = ww;\n                 psp = sp;\n-            } else {\n+            } else if (osp != '\\0') {\n                 // no prev. space to hijack, must break after the word\n                 // this will mean overflowed text...\n                 *sp = '\\n';\n@@ -784,6 +784,10 @@ void fntFitString(int id, char *string, size_t width)\n             psp = sp;\n         }\n \n+        // the last word ended at the terminator: stop there instead of scanning past it\n+        if (osp == '\\0')\n+            break;\n+\n         cw += spacewidth;\n         str = ++sp;\n     }"
        },
        {
          "sha": "98f01a28256b170eb7f86cad22b98e2fb29831c5",
          "filename": "src/gsm.c",
          "status": "modified",
          "additions": 4,
          "deletions": 0,
          "changes": 4,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fgsm.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fgsm.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fgsm.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -106,6 +106,10 @@ void PrepareGSM(char *cmdline, struct GsmConfig_t *config)\n     int k576p_fix, kGsDxDyOffsetSupported, fd, FIELD_fix;\n     char romver[16], romverNum[5], *pROMDate;\n \n+    // $GSMVMode comes from a CFG file: an index past the table would send garbage to the GS\n+    if (gGSMVMode < 0 || gGSMVMode >= (int)(sizeof(predef_vmode) / sizeof(predef_vmode[0])))\n+        gGSMVMode = 0;\n+\n #ifdef _DTL_T10000\n     if (predef_vmode[gGSMVMode].mode == GS_MODE_DTV_576P) // There is no 576P code implemented for development TOOLs.\n         gGSMVMode = 2;                                    // Change to PAL instead."
        },
        {
          "sha": "5201f4e0fd080ba6cce48f1c4907e8d850e45367",
          "filename": "src/gui.c",
          "status": "modified",
          "additions": 39,
          "deletions": 2,
          "changes": 41,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fgui.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fgui.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fgui.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -479,8 +479,10 @@ int guiDeviceTypeToIoMode(int deviceType)\n         return ETH_MODE;\n     else if (deviceType == 2)\n         return HDD_MODE;\n-    else\n+    else if (deviceType == 3)\n         return APP_MODE;\n+    else\n+        return MMCE_MODE;\n }\n \n int guiIoModeToDeviceType(int ioMode)\n@@ -498,6 +500,8 @@ int guiIoModeToDeviceType(int ioMode)\n             return 2;\n         case APP_MODE:\n             return 3;\n+        case MMCE_MODE:\n+            return 4;\n         default:\n             return 0;\n     }\n@@ -506,7 +510,7 @@ int guiIoModeToDeviceType(int ioMode)\n void guiShowConfig()\n {\n     // configure the enumerations\n-    const char *deviceNames[] = {_l(_STR_BDM_GAMES), _l(_STR_NET_GAMES), _l(_STR_HDD_GAMES), _l(_STR_APPS), NULL};\n+    const char *deviceNames[] = {_l(_STR_BDM_GAMES), _l(_STR_NET_GAMES), _l(_STR_HDD_GAMES), _l(_STR_APPS), _l(_STR_MMCE), NULL};\n     const char *deviceModes[] = {_l(_STR_OFF), _l(_STR_MANUAL), _l(_STR_AUTO), NULL};\n \n     diaSetEnum(diaConfig, CFG_DEFDEVICE, deviceNames);\n@@ -844,6 +848,39 @@ void guiShowNetConfig(void)\n     }\n }\n \n+void guiShowMMCEConfig(void)\n+{\n+    int ret;\n+    const char *deviceModes[] = {_l(_STR_OFF), _l(_STR_MANUAL), _l(_STR_AUTO), NULL};\n+    const char *deviceSlots[] = {\"1\", \"2\", _l(_STR_AUTO), NULL};\n+    const char *deviceIGRSlots[] = {\"None\", \"1\", \"2\", \"Both\", _l(_STR_AUTO), NULL};\n+\n+    diaSetEnum(diaMMCEConfig, CFG_MMCEMODE, deviceModes);\n+    diaSetInt(diaMMCEConfig, CFG_MMCEMODE, gMMCEStartMode);\n+\n+    diaSetEnum(diaMMCEConfig, CFG_MMCESLOT, deviceSlots);\n+    diaSetInt(diaMMCEConfig, CFG_MMCESLOT, gMMCESlot);\n+\n+    diaSetEnum(diaMMCEConfig, CFG_MMCEIGRSLOT, deviceIGRSlots);\n+    diaSetInt(diaMMCEConfig, CFG_MMCEIGRSLOT, gMMCEIGRSlot);\n+\n+    diaSetString(diaMMCEConfig, CFG_MMCEPREFIX, gMMCEPrefix);\n+    diaSetInt(diaMMCEConfig, CFG_MMCEGAMEID, gMMCEEnableGameID);\n+\n+    ret = diaExecuteDialog(diaMMCEConfig, -1, 1, NULL);\n+    if (ret) {\n+        diaGetInt(diaMMCEConfig, CFG_MMCEMODE, &gMMCEStartMode);\n+        diaGetInt(diaMMCEConfig, CFG_MMCESLOT, &gMMCESlot);\n+        diaGetInt(diaMMCEConfig, CFG_MMCEIGRSLOT, &gMMCEIGRSlot);\n+\n+        diaGetString(diaMMCEConfig, CFG_MMCEPREFIX, gMMCEPrefix, sizeof(gMMCEPrefix));\n+        diaGetInt(diaMMCEConfig, CFG_MMCEGAMEID, &gMMCEEnableGameID);\n+    }\n+\n+    applyConfig(-1, -1, 0);\n+    menuReinitMainMenu();\n+}\n+\n void guiShowParentalLockConfig(void)\n {\n     int result;"
        },
        {
          "sha": "2023338d3658e0a69138c2eaaf15aa06f194e1a8",
          "filename": "src/guigame.c",
          "status": "modified",
          "additions": 17,
          "deletions": 5,
          "changes": 22,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fguigame.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fguigame.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fguigame.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -244,12 +244,24 @@ static int guiGameShowVMCConfig(int id, item_list_t *support, char *VMCName, int\n                     sizeUI = 8;\n \n                 if (sizeUI != size) {\n-                    support->itemCheckVMC(support, vmc, sizeUI);\n+                    int create = 1;\n+\n+                    if (size != -1) { // The card exists with another size: a new one replaces it and its saves\n+                        if (validate)\n+                            break; // Leaving the menu never replaces a card, e.g. one of 4 MB or a PCSX2 card\n+                        create = guiMsgBox(_l(_STR_DELETE_WARNING), 1, diaVMC);\n+                        if (create)\n+                            support->itemCheckVMC(support, vmc, -1);\n+                    }\n+\n+                    if (create) {\n+                        support->itemCheckVMC(support, vmc, sizeUI);\n \n-                    diaSetEnabled(diaVMC, VMC_NAME, 0);\n-                    diaSetEnabled(diaVMC, VMC_SIZE, 0);\n-                    diaSetLabel(diaVMC, VMC_BUTTON_CREATE, _l(_STR_ABORT));\n-                    vmc_operation = OPERATION_CREATING;\n+                        diaSetEnabled(diaVMC, VMC_NAME, 0);\n+                        diaSetEnabled(diaVMC, VMC_SIZE, 0);\n+                        diaSetLabel(diaVMC, VMC_BUTTON_CREATE, _l(_STR_ABORT));\n+                        vmc_operation = OPERATION_CREATING;\n+                    }\n                 } else\n                     break;\n             } else if (vmc_operation == OPERATION_ENDING) {"
        },
        {
          "sha": "5d01b598ec54689c238eacda4e49ecc15e858304",
          "filename": "src/hddsupport.c",
          "status": "modified",
          "additions": 10,
          "deletions": 11,
          "changes": 21,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fhddsupport.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fhddsupport.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fhddsupport.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -472,9 +472,9 @@ void hddLaunchGame(item_list_t *itemList, int id, config_set_t *configSet)\n         pfs_blockinfo_t blocks[11];\n \n         for (vmc_id = 0; vmc_id < 2; vmc_id++) {\n+            hdd_vmc_infos.active = 0; // A slot without a VMC is written as inactive below\n             if (vmc_name[vmc_id][0]) {\n                 have_error = 1;\n-                hdd_vmc_infos.active = 0;\n                 if (sysCheckVMC(gHDDPrefix, \"/\", vmc_name[vmc_id], 0, &vmc_superblock) > 0) {\n                     hdd_vmc_infos.flags = vmc_superblock.mc_flag & 0xFF;\n                     hdd_vmc_infos.flags |= 0x100;\n@@ -513,15 +513,15 @@ void hddLaunchGame(item_list_t *itemList, int id, config_set_t *configSet)\n                     } else\n                         LOG(\"VMC error\\n\");\n                 }\n+            }\n \n-                for (i = 0; i < size_hdd_mcemu_irx; i++) {\n-                    if (((u32 *)&hdd_mcemu_irx)[i] == (0xC0DEFAC0 + vmc_id)) {\n-                        if (hdd_vmc_infos.active)\n-                            size_mcemu_irx = size_hdd_mcemu_irx;\n-                        memcpy(&((u32 *)&hdd_mcemu_irx)[i], &hdd_vmc_infos, sizeof(hdd_vmc_infos_t));\n-                        break;\n-                    }\n-                }\n+            // Write every slot, so a slot left active by an aborted launch cannot ride along\n+            static int mcemuSlots[2];\n+            int slotWord = sbMcemuSlotWord(&hdd_mcemu_irx, size_hdd_mcemu_irx, vmc_id, mcemuSlots);\n+            if (slotWord >= 0) {\n+                if (hdd_vmc_infos.active)\n+                    size_mcemu_irx = size_hdd_mcemu_irx;\n+                memcpy(&((u32 *)&hdd_mcemu_irx)[slotWord], &hdd_vmc_infos, sizeof(hdd_vmc_infos_t));\n             }\n         }\n     }\n@@ -592,10 +592,9 @@ void hddLaunchGame(item_list_t *itemList, int id, config_set_t *configSet)\n     // Check for ZSO to correctly adjust layer1 start\n     settings->common.layer1_start = 0; // cdvdman will read it from APA header\n     hddReadSectors(game->start_sector + OPL_HDD_MODE_PS2LOGO_OFFSET, 1, IOBuffer);\n-    if (*(u32 *)IOBuffer == ZSO_MAGIC) {\n+    if (*(u32 *)IOBuffer == ZSO_MAGIC && ziso_init((ZISO_header *)IOBuffer, *(u32 *)((u8 *)IOBuffer + sizeof(ZISO_header))) == 0) {\n         probed_fd = 0;\n         probed_lba = game->start_sector + OPL_HDD_MODE_PS2LOGO_OFFSET;\n-        ziso_init((ZISO_header *)IOBuffer, *(u32 *)((u8 *)IOBuffer + sizeof(ZISO_header)));\n         ziso_read_sector(IOBuffer, 16, 1);\n         u32 maxLBA = *(u32 *)(IOBuffer + 80);\n         if (maxLBA > 0 && maxLBA < ziso_total_block) {   // dual layer check"
        },
        {
          "sha": "bef6169c67712d560421816eeea1891ee11f5779",
          "filename": "src/lang.c",
          "status": "modified",
          "additions": 4,
          "deletions": 0,
          "changes": 4,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Flang.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Flang.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Flang.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -103,6 +103,10 @@ static int lngReadEntry(int index, const char *path, const char *separator, cons\n {\n     if (d_type != DT_DIR) {\n         if (strstr(name, \".lng\") || strstr(name, \".LNG\")) {\n+            // The language name is cut from lang_<Name>.lng: a shorter file name has none, and gave\n+            // a negative length below\n+            if (strlen(name) < 10)\n+                return index;\n \n             language_t *currLang = &languages[nLanguages + index];\n "
        },
        {
          "sha": "c6160e84a36e3b8533f5ee8c3110e697af0059bd",
          "filename": "src/menusys.c",
          "status": "modified",
          "additions": 6,
          "deletions": 1,
          "changes": 7,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fmenusys.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fmenusys.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fmenusys.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -29,6 +29,7 @@ enum MENU_IDs {\n     MENU_NET_CONFIG,\n     MENU_NET_UPDATE,\n     MENU_START_NBD,\n+    MENU_MMCE_SETTINGS,\n     MENU_ABOUT,\n     MENU_SAVE_CHANGES,\n     MENU_EXIT,\n@@ -221,6 +222,7 @@ static void menuInitMainMenu(void)\n     submenuAppendItem(&mainMenu, -1, NULL, MENU_NET_CONFIG, _STR_NETCONFIG);\n     submenuAppendItem(&mainMenu, -1, NULL, MENU_NET_UPDATE, _STR_NET_UPDATE);\n     submenuAppendItem(&mainMenu, -1, NULL, MENU_START_NBD, _STR_STARTNBD);\n+    submenuAppendItem(&mainMenu, -1, NULL, MENU_MMCE_SETTINGS, _STR_MMCE_SETTINGS);\n     submenuAppendItem(&mainMenu, -1, NULL, MENU_ABOUT, _STR_ABOUT);\n     submenuAppendItem(&mainMenu, -1, NULL, MENU_SAVE_CHANGES, _STR_SAVE_CHANGES);\n     submenuAppendItem(&mainMenu, -1, NULL, MENU_EXIT, _STR_EXIT);\n@@ -936,6 +938,9 @@ void menuHandleInputMenu()\n         } else if (id == MENU_START_NBD) {\n             if (menuCheckParentalLock() == 0)\n                 handleLwnbdSrv();\n+        } else if (id == MENU_MMCE_SETTINGS) {\n+            if (menuCheckParentalLock() == 0)\n+                guiShowMMCEConfig();\n         } else if (id == MENU_ABOUT) {\n             guiShowAbout();\n         } else if (id == MENU_SAVE_CHANGES) {\n@@ -962,7 +967,7 @@ void menuHandleInputMenu()\n \n     if (getKeyOn(KEY_START) || getKeyOn(gSelectButton == KEY_CIRCLE ? KEY_CROSS : KEY_CIRCLE)) {\n         // Check if there is anything to show the user, at all.\n-        if (gAPPStartMode || gETHStartMode || gBDMStartMode || gHDDStartMode) {\n+        if (gAPPStartMode || gETHStartMode || gBDMStartMode || gHDDStartMode || gMMCEStartMode) {\n             guiSwitchScreen(GUI_SCREEN_MAIN);\n             refreshMenuPosition();\n         }"
        },
        {
          "sha": "5543a4cb93fbf3fdb6eb8c3605894e0eec5c83ce",
          "filename": "src/mmcesupport.c",
          "status": "added",
          "additions": 515,
          "deletions": 0,
          "changes": 515,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fmmcesupport.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fmmcesupport.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fmmcesupport.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -0,0 +1,515 @@\n+/*\n+  Copyright 2024-2025, qnox32 and BBsan (ps2-mmce/Open-PS2-Loader)\n+  Licenced under Academic Free License version 3.0\n+  Review Open PS2 Loader README & LICENSE files for further details.\n+\n+  Games on an MMCE memory-card emulator (SD2PSX, MemCard PRO 2, PSXMemCard Gen2). The card's SD card is\n+  the iomanX file system \"mmce\" of mmceman.irx (mmce0: is memory-card slot 1, mmce1: slot 2) and holds\n+  the same CD, DVD, ART, CFG... folders as a USB device. In game the ISO is read through mmcedrv.irx, see\n+  modules/iopcore/cdvdman/device-mmce.c.\n+*/\n+\n+#include \"include/opl.h\"\n+#include \"include/lang.h\"\n+#include \"include/gui.h\"\n+#include \"include/supportbase.h\"\n+#include \"include/mmcesupport.h\"\n+#include \"include/util.h\"\n+#include \"include/themes.h\"\n+#include \"include/textures.h\"\n+#include \"include/ioman.h\"\n+#include \"include/system.h\"\n+#include \"include/extern_irx.h\"\n+#include \"include/cheatman.h\"\n+#include \"modules/iopcore/common/cdvd_config.h\"\n+\n+#include <ps2sdkapi.h>\n+#define NEWLIB_PORT_AWARE // for fileXioIoctl2 and fileXioDevctl; files are opened with open(), as in bdmsupport.c\n+#include <fileXio_rpc.h>\n+#include <delaythread.h>\n+\n+// mmceman devctl and ioctl2 codes (ps2-mmce/mmceman: mmceman/include/mmce_cmds.h, mmceman/src/mmce_fs.c)\n+#define MMCE_DEVCTL_PING       0x1  // -1 when no card answers on that port\n+#define MMCE_DEVCTL_GET_STATUS 0x2  // bit 0: the card is busy\n+#define MMCE_DEVCTL_SET_GAMEID 0x8  // the game ID string, so the card switches to that game's memory card\n+#define MMCE_IOCTL2_GET_FD     0x80 // the card's own descriptor of an open file\n+\n+static char mmcePrefix[40]; // \"mmceN:/\" plus the user's prefix: the folder that holds CD, DVD, ART, CFG...\n+static int mmcePort = -1;   // SIO2 port of the card the prefix points at (2 = slot 1, 3 = slot 2), -1 = none\n+static int mmceULSizePrev = -2;\n+static time_t mmceModifiedCDPrev;\n+static time_t mmceModifiedDVDPrev;\n+static int mmceGameCount = 0;\n+static base_game_info_t *mmceGames = NULL;\n+static int mmceModulesLoaded = 0;\n+\n+// forward declaration\n+static item_list_t mmceGameList;\n+\n+// The prefix for a port: the user's prefix is a folder on the card, without a leading slash and with a\n+// trailing one.\n+static void mmceBuildPrefix(int port)\n+{\n+    const char *folder = gMMCEPrefix;\n+    size_t len;\n+\n+    while (*folder == '/')\n+        folder++;\n+\n+    snprintf(mmcePrefix, sizeof(mmcePrefix), \"mmce%d:/%s\", (port == 3) ? 1 : 0, folder);\n+    len = strlen(mmcePrefix);\n+    if (*folder != '\\0' && mmcePrefix[len - 1] != '/' && len < sizeof(mmcePrefix) - 1) {\n+        mmcePrefix[len] = '/';\n+        mmcePrefix[len + 1] = '\\0';\n+    }\n+}\n+\n+// The SIO2 ports that have an MMCE card, as bits 2 and 3 (port 2 = memory-card slot 1, port 3 = slot 2).\n+// Pinged once per session, or again when asked (mmceman must be loaded).\n+static int mmceProbePorts(int again)\n+{\n+    static int ports = -1;\n+\n+    if (ports < 0 || again) {\n+        ports = 0;\n+        if (fileXioDevctl(\"mmce0:/\", MMCE_DEVCTL_PING, NULL, 0, NULL, 0) != -1)\n+            ports |= 1 << 2;\n+        if (fileXioDevctl(\"mmce1:/\", MMCE_DEVCTL_PING, NULL, 0, NULL, 0) != -1)\n+            ports |= 1 << 3;\n+    }\n+\n+    return ports;\n+}\n+\n+// The configured slot, or in Auto mode the first port that answers a ping. Returns the port, or -1.\n+static int mmceFindCard(int again)\n+{\n+    int ports;\n+\n+    if (gMMCESlot == MMCE_SLOT_1)\n+        return 2;\n+    if (gMMCESlot == MMCE_SLOT_2)\n+        return 3;\n+\n+    ports = mmceProbePorts(again);\n+    if (ports & (1 << 2))\n+        return 2;\n+    if (ports & (1 << 3))\n+        return 3;\n+\n+    return -1;\n+}\n+\n+// Keeps the prefix in step with the settings. The card is looked for again only when the settings\n+// changed or no card was found before, so the ports are not pinged on every refresh of the list.\n+static void mmceSetPrefix(int force)\n+{\n+    static int slotUsed = -1;\n+    static char folderUsed[sizeof(gMMCEPrefix)] = \"\";\n+    int port;\n+\n+    if (!force && mmcePort > 0 && slotUsed == gMMCESlot && !strcmp(folderUsed, gMMCEPrefix))\n+        return;\n+\n+    port = mmceFindCard(force || mmcePort < 0);\n+    slotUsed = gMMCESlot;\n+    strcpy(folderUsed, gMMCEPrefix);\n+    mmceBuildPrefix(port);\n+    mmcePort = port;\n+\n+    LOG(\"MMCESUPPORT prefix %s, port %d\\n\", mmcePrefix, mmcePort);\n+}\n+\n+void mmceLoadModules(void)\n+{\n+    if (mmceModulesLoaded)\n+        return;\n+\n+    LOG(\"[MMCEMAN]:\\n\");\n+    if (sysLoadModuleBuffer(&mmceman_irx, size_mmceman_irx, 0, NULL) == 0)\n+        mmceModulesLoaded = 1;\n+    else\n+        LOG(\"MMCESUPPORT mmceman did not load\\n\");\n+}\n+\n+// The memory-card slots whose MMCE card IGR switches back to its boot card (bit 0 = slot 1, bit 1 = slot 2):\n+// the setting, or with \"Auto\" the slots where a card answered a ping.\n+int mmceIGRSlots(void)\n+{\n+    int ports;\n+\n+    if (gMMCEIGRSlot != MMCE_IGR_AUTO)\n+        return gMMCEIGRSlot & 3;\n+\n+    mmceLoadModules();\n+    if (!mmceModulesLoaded)\n+        return 0;\n+\n+    ports = mmceProbePorts(0);\n+    return ((ports >> 2) & 1) | (((ports >> 3) & 1) << 1);\n+}\n+\n+// Tells the MMCE card(s) which game starts, so a card switches to that game's own memory card. It must run\n+// after the last write to the real memory card (last played, OSD history): from then on mc0: or mc1: is\n+// the game's card. The card is busy for a moment after the command; the wait is bounded, as in wOPL\n+// dca04cf (200 ms, then up to 20 x 100 ms).\n+void mmceSendGameID(const char *bootpath)\n+{\n+    static const char *const devices[2] = {\"mmce0:/\", \"mmce1:/\"};\n+    char gameid[17];\n+    const char *name, *p;\n+    int ports, port, i, status;\n+    size_t len;\n+\n+    if (!gMMCEEnableGameID || bootpath == NULL)\n+        return;\n+\n+    // The boot file name alone, without the path and the version: SLUS_202.38.\n+    name = bootpath;\n+    for (p = bootpath; *p != '\\0'; p++) {\n+        if (*p == '/' || *p == '\\\\' || *p == ':')\n+            name = p + 1;\n+    }\n+    for (len = 0; name[len] != '\\0' && name[len] != ';' && len < sizeof(gameid) - 1; len++)\n+        gameid[len] = name[len];\n+    gameid[len] = '\\0';\n+    if (len == 0)\n+        return;\n+\n+    mmceLoadModules();\n+    if (!mmceModulesLoaded)\n+        return;\n+\n+    ports = mmceProbePorts(0);\n+    for (port = 2; port <= 3; port++) {\n+        if (!(ports & (1 << port)))\n+            continue;\n+\n+        LOG(\"MMCESUPPORT game ID %s to %s\\n\", gameid, devices[port - 2]);\n+        DelayThread(200 * 1000);\n+        if (fileXioDevctl(devices[port - 2], MMCE_DEVCTL_SET_GAMEID, gameid, len + 1, NULL, 0) < 0) {\n+            LOG(\"MMCESUPPORT the card did not take the game ID\\n\");\n+            continue;\n+        }\n+        for (i = 0; i < 20; i++) {\n+            DelayThread(100 * 1000);\n+            status = fileXioDevctl(devices[port - 2], MMCE_DEVCTL_GET_STATUS, NULL, 0, NULL, 0);\n+            if (status < 0 || (status & 1) == 0)\n+                break;\n+        }\n+    }\n+}\n+\n+void mmceInit(item_list_t *itemList)\n+{\n+    LOG(\"MMCESUPPORT Init\\n\");\n+    mmceULSizePrev = -2;\n+    mmceModifiedCDPrev = 0;\n+    mmceModifiedDVDPrev = 0;\n+    mmceGameCount = 0;\n+    mmceGames = NULL;\n+\n+    configGetInt(configGetByType(CONFIG_OPL), \"usb_frames_delay\", &mmceGameList.delay);\n+    mmceGameList.updateDelay = -1; // no periodic rescans: the card is not hot-plugged\n+\n+    mmceLoadModules();\n+    mmceSetPrefix(1);\n+\n+    mmceGameList.enabled = 1;\n+}\n+\n+item_list_t *mmceGetObject(int initOnly)\n+{\n+    if (initOnly && !mmceGameList.enabled)\n+        return NULL;\n+    return &mmceGameList;\n+}\n+\n+static int mmceNeedsUpdate(item_list_t *itemList)\n+{\n+    static unsigned char ThemesLoaded = 0;\n+    static unsigned char LanguagesLoaded = 0;\n+\n+    char path[256];\n+    int result = 0;\n+    struct stat st;\n+\n+    mmceSetPrefix(0);\n+\n+    if (mmceULSizePrev == -2)\n+        result = 1;\n+\n+    sprintf(path, \"%sCD\", mmcePrefix);\n+    if (stat(path, &st) != 0)\n+        st.st_mtime = 0;\n+\n+    if (mmceModifiedCDPrev != st.st_mtime) {\n+        mmceModifiedCDPrev = st.st_mtime;\n+        result = 1;\n+    }\n+\n+    sprintf(path, \"%sDVD\", mmcePrefix);\n+    if (stat(path, &st) != 0)\n+        st.st_mtime = 0;\n+\n+    if (mmceModifiedDVDPrev != st.st_mtime) {\n+        mmceModifiedDVDPrev = st.st_mtime;\n+        result = 1;\n+    }\n+\n+    if (!sbIsSameSize(mmcePrefix, mmceULSizePrev))\n+        result = 1;\n+\n+    // update Themes\n+    if (!ThemesLoaded) {\n+        sprintf(path, \"%sTHM\", mmcePrefix);\n+        if (thmAddElements(path, \"/\", 1) > 0)\n+            ThemesLoaded = 1;\n+    }\n+\n+    // update Languages\n+    if (!LanguagesLoaded) {\n+        sprintf(path, \"%sLNG\", mmcePrefix);\n+        if (lngAddLanguages(path, \"/\", mmceGameList.mode) > 0)\n+            LanguagesLoaded = 1;\n+    }\n+\n+    sbCreateFolders(mmcePrefix, 1);\n+\n+    return result;\n+}\n+\n+static int mmceUpdateGameList(item_list_t *itemList)\n+{\n+    sbReadList(&mmceGames, mmcePrefix, &mmceULSizePrev, &mmceGameCount);\n+    return mmceGameCount;\n+}\n+\n+static int mmceGetGameCount(item_list_t *itemList)\n+{\n+    return mmceGameCount;\n+}\n+\n+static void *mmceGetGame(item_list_t *itemList, int id)\n+{\n+    return (void *)&mmceGames[id];\n+}\n+\n+static char *mmceGetGameName(item_list_t *itemList, int id)\n+{\n+    return mmceGames[id].name;\n+}\n+\n+static int mmceGetGameNameLength(item_list_t *itemList, int id)\n+{\n+    return ((mmceGames[id].format != GAME_FORMAT_USBLD) ? ISO_GAME_NAME_MAX + 1 : UL_GAME_NAME_MAX + 1);\n+}\n+\n+static char *mmceGetGameStartup(item_list_t *itemList, int id)\n+{\n+    return mmceGames[id].startup;\n+}\n+\n+static void mmceDeleteGame(item_list_t *itemList, int id)\n+{\n+    sbDelete(&mmceGames, mmcePrefix, \"/\", mmceGameCount, id);\n+    mmceULSizePrev = -2;\n+}\n+\n+static void mmceRenameGame(item_list_t *itemList, int id, char *newName)\n+{\n+    sbRename(&mmceGames, mmcePrefix, \"/\", mmceGameCount, id, newName);\n+    mmceULSizePrev = -2;\n+}\n+\n+void mmceLaunchGame(item_list_t *itemList, int id, config_set_t *configSet)\n+{\n+    int fd, iso_fd, index, compatmask = 0;\n+    int EnablePS2Logo = 0;\n+    int result, vmc_id;\n+    char partname[256], filename[32], vmc_name[32];\n+    base_game_info_t *game;\n+    struct cdvdman_settings_mmce *settings;\n+    u32 layer1_start, layer1_offset;\n+    unsigned short int layer1_part;\n+    u64 isoTotalBytes;\n+\n+    game = &mmceGames[id];\n+\n+    // In game the image is read through one descriptor on the card: a game split into parts cannot be\n+    // streamed yet.\n+    if (game->format == GAME_FORMAT_USBLD && game->parts > 1) {\n+        guiMsgBox(_l(_STR_MMCE_ERR_UL_PARTS), 0, NULL);\n+        return;\n+    }\n+\n+    if (mmcePort < 0) {\n+        guiMsgBox(_l(_STR_MMCE_ERR_NO_CARD), 0, NULL);\n+        return;\n+    }\n+\n+    void *irx = &mmce_cdvdman_irx;\n+    int irx_size = size_mmce_cdvdman_irx;\n+    compatmask = sbPrepare(game, configSet, irx_size, irx, &index);\n+    settings = (struct cdvdman_settings_mmce *)((u8 *)irx + index);\n+    if (settings == NULL)\n+        return;\n+\n+    // VMCs on the card are not served in game yet: say so instead of silently saving to the real card.\n+    for (vmc_id = 0; vmc_id < 2; vmc_id++) {\n+        configGetVMC(configSet, vmc_name, sizeof(vmc_name), vmc_id);\n+        if (vmc_name[0]) {\n+            guiWarning(_l(_STR_MMCE_NO_VMC_YET), 10);\n+            break;\n+        }\n+    }\n+\n+    sbCreatePath(game, partname, mmcePrefix, \"/\", 0);\n+\n+    fd = open(partname, O_RDONLY, 0666);\n+    if (fd < 0) {\n+        sbUnprepare(&settings->common);\n+        guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL);\n+        return;\n+    }\n+    isoTotalBytes = lseek64(fd, 0, SEEK_END);\n+    if (gPS2Logo)\n+        EnablePS2Logo = CheckPS2Logo(fd, 0);\n+    close(fd);\n+\n+    // Initialize layer 1 information.\n+    layer1_start = sbGetISO9660MaxLBA(partname);\n+\n+    // Real media size, for CDVDMAN's out-of-bounds read emulation (see bdmsupport.c).\n+    settings->common.mediaLsnCount = sbGetMediaLsnCount(partname, isoTotalBytes);\n+\n+    switch (game->format) {\n+        case GAME_FORMAT_USBLD:\n+            layer1_part = layer1_start / 0x80000;\n+            layer1_offset = layer1_start % 0x80000;\n+            sbCreatePath(game, partname, mmcePrefix, \"/\", layer1_part);\n+            break;\n+        default: // Raw ISO9660 disc image; one part.\n+            layer1_part = 0;\n+            layer1_offset = layer1_start;\n+    }\n+\n+    if (sbProbeISO9660(partname, game, layer1_offset) != 0) {\n+        layer1_start = 0;\n+        LOG(\"DVD detected.\\n\");\n+    } else {\n+        layer1_start -= 16;\n+        LOG(\"DVD-DL layer 1 @ part %u sector 0x%lx.\\n\", layer1_part, layer1_offset);\n+    }\n+    settings->common.layer1_start = layer1_start;\n+\n+    // No sector cache for compressed images on MMCE (as in the ps2-mmce fork).\n+    settings->common.zso_cache = 0;\n+\n+    if ((result = sbLoadCheats(mmcePrefix, game->startup, configSet)) < 0) {\n+        switch (result) {\n+            case -ENOENT:\n+                guiWarning(_l(_STR_NO_CHEATS_FOUND), 10);\n+                break;\n+            default:\n+                guiWarning(_l(_STR_ERR_CHEATS_LOAD_FAILED), 10);\n+        }\n+    }\n+\n+    if (gRememberLastPlayed) {\n+        configSetStr(configGetByType(CONFIG_LAST), \"last_played\", game->startup);\n+        saveConfig(CONFIG_LAST, 0);\n+    }\n+\n+    if (configGetStrCopy(configSet, CONFIG_ITEM_ALTSTARTUP, filename, sizeof(filename)) == 0)\n+        strcpy(filename, game->startup);\n+\n+    // The card keeps the image open across the IOP reset and mmcedrv reads it by the card's own\n+    // descriptor, which is neither the EE's nor the IOP's. The handle is not closed on purpose.\n+    sbCreatePath(game, partname, mmcePrefix, \"/\", 0);\n+    fd = open(partname, O_RDONLY, 0666);\n+    if (fd < 0) {\n+        sbUnprepare(&settings->common);\n+        guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL);\n+        return;\n+    }\n+    iso_fd = fileXioIoctl2(ps2sdk_get_iop_fd(fd), MMCE_IOCTL2_GET_FD, NULL, 0, NULL, 0);\n+    if (iso_fd < 0) {\n+        close(fd);\n+        sbUnprepare(&settings->common);\n+        guiMsgBox(_l(_STR_ERR_FILE_INVALID), 0, NULL);\n+        return;\n+    }\n+    settings->port = mmcePort;\n+    settings->iso_fd = iso_fd;\n+\n+    LOG(\"MMCESUPPORT %s: port %d, card fd %d\\n\", game->startup, mmcePort, iso_fd);\n+\n+    deinit(NO_EXCEPTION, MMCE_MODE); // CAREFUL: deinit will call mmceCleanUp, so mmceGames/game will be freed\n+\n+    sysLaunchLoaderElf(filename, \"MMCE_MODE\", irx_size, irx, 0, NULL, EnablePS2Logo, compatmask);\n+}\n+\n+static config_set_t *mmceGetConfig(item_list_t *itemList, int id)\n+{\n+    return sbPopulateConfig(&mmceGames[id], mmcePrefix, \"/\");\n+}\n+\n+static int mmceGetImage(item_list_t *itemList, char *folder, int isRelative, char *value, char *suffix, GSTEXTURE *resultTex, short psm)\n+{\n+    char path[256];\n+    if (isRelative)\n+        snprintf(path, sizeof(path), \"%s%s/%s_%s\", mmcePrefix, folder, value, suffix);\n+    else\n+        snprintf(path, sizeof(path), \"%s%s_%s\", folder, value, suffix);\n+    return texDiscoverLoad(resultTex, path, -1);\n+}\n+\n+static int mmceGetTextId(item_list_t *itemList)\n+{\n+    return _STR_MMCE_GAMES;\n+}\n+\n+static int mmceGetIconId(item_list_t *itemList)\n+{\n+    return MMCE_ICON;\n+}\n+\n+// This may be called, even if mmceInit() was not.\n+static void mmceCleanUp(item_list_t *itemList, int exception)\n+{\n+    if (mmceGameList.enabled) {\n+        LOG(\"MMCESUPPORT CleanUp\\n\");\n+\n+        free(mmceGames);\n+        mmceGames = NULL;\n+        mmceGameCount = 0;\n+    }\n+}\n+\n+// This may be called, even if mmceInit() was not.\n+static void mmceShutdown(item_list_t *itemList)\n+{\n+    if (mmceGameList.enabled) {\n+        LOG(\"MMCESUPPORT Shutdown\\n\");\n+\n+        free(mmceGames);\n+        mmceGames = NULL;\n+        mmceGameCount = 0;\n+    }\n+}\n+\n+static int mmceCheckVMC(item_list_t *itemList, char *name, int createSize)\n+{\n+    return sysCheckVMC(mmcePrefix, \"/\", name, createSize, NULL);\n+}\n+\n+static char *mmceGetPrefix(item_list_t *itemList)\n+{\n+    return mmcePrefix;\n+}\n+\n+static item_list_t mmceGameList = {\n+    MMCE_MODE, 2, 0, 0, MENU_MIN_INACTIVE_FRAMES, -1, NULL, NULL, &mmceGetTextId, &mmceGetPrefix, &mmceInit, &mmceNeedsUpdate,\n+    &mmceUpdateGameList, &mmceGetGameCount, &mmceGetGame, &mmceGetGameName, &mmceGetGameNameLength, &mmceGetGameStartup, &mmceDeleteGame, &mmceRenameGame,\n+    &mmceLaunchGame, &mmceGetConfig, &mmceGetImage, &mmceCleanUp, &mmceShutdown, &mmceCheckVMC, &mmceGetIconId};"
        },
        {
          "sha": "46ed1a626e14a1dd221771c860a57e44b56ff75e",
          "filename": "src/opl.c",
          "status": "modified",
          "additions": 31,
          "deletions": 3,
          "changes": 34,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fopl.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fopl.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fopl.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -30,6 +30,7 @@\n #include \"include/ethsupport.h\"\n #include \"include/hddsupport.h\"\n #include \"include/appsupport.h\"\n+#include \"include/mmcesupport.h\"\n \n #include \"include/cheatman.h\"\n #include \"include/sound.h\"\n@@ -133,9 +134,13 @@ int gBDMStartMode;\n int gHDDStartMode;\n int gETHStartMode;\n int gAPPStartMode;\n+int gMMCEStartMode;\n int bdmCacheSize;\n int hddCacheSize;\n int smbCacheSize;\n+int gMMCEIGRSlot;\n+int gMMCESlot;\n+int gMMCEEnableGameID;\n int gEnableILK;\n int gEnableMX4SIO;\n int gEnableBdmHDD;\n@@ -176,6 +181,7 @@ int gPS2Logo;\n int gDefaultDevice;\n int gEnableWrite;\n char gBDMPrefix[32];\n+char gMMCEPrefix[32];\n char gETHPrefix[32];\n int gRememberLastPlayed;\n int KeyPressedOnce;\n@@ -402,6 +408,8 @@ void initSupport(item_list_t *itemList, int mode, int force_reinit)\n         startMode = gHDDStartMode;\n     else if (mode == APP_MODE)\n         startMode = gAPPStartMode;\n+    else if (mode == MMCE_MODE)\n+        startMode = gMMCEStartMode;\n \n     if (startMode) {\n         if (!mod->support) {\n@@ -428,6 +436,7 @@ static void initAllSupport(int force_reinit)\n     initSupport(ethGetObject(0), ETH_MODE, force_reinit || (gNetworkStartup >= ERROR_ETH_SMB_CONN));\n     initSupport(hddGetObject(0), HDD_MODE, force_reinit);\n     initSupport(appGetObject(0), APP_MODE, force_reinit);\n+    initSupport(mmceGetObject(0), MMCE_MODE, force_reinit);\n }\n \n static void deinitAllSupport(int exception, int modeSelected)\n@@ -946,6 +955,7 @@ static void _loadConfig()\n             configGetInt(configOPL, CONFIG_OPL_DEFAULT_DEVICE, &gDefaultDevice);\n             configGetInt(configOPL, CONFIG_OPL_ENABLE_WRITE, &gEnableWrite);\n             configGetInt(configOPL, CONFIG_OPL_HDD_SPINDOWN, &gHDDSpindown);\n+            configGetStrCopy(configOPL, CONFIG_OPL_MMCE_PREFIX, gMMCEPrefix, sizeof(gMMCEPrefix));\n             configGetStrCopy(configOPL, CONFIG_OPL_BDM_PREFIX, gBDMPrefix, sizeof(gBDMPrefix));\n             configGetStrCopy(configOPL, CONFIG_OPL_ETH_PREFIX, gETHPrefix, sizeof(gETHPrefix));\n             configGetInt(configOPL, CONFIG_OPL_REMEMBER_LAST, &gRememberLastPlayed);\n@@ -954,6 +964,10 @@ static void _loadConfig()\n             configGetInt(configOPL, CONFIG_OPL_HDD_MODE, &gHDDStartMode);\n             configGetInt(configOPL, CONFIG_OPL_ETH_MODE, &gETHStartMode);\n             configGetInt(configOPL, CONFIG_OPL_APP_MODE, &gAPPStartMode);\n+            configGetInt(configOPL, CONFIG_OPL_MMCE_MODE, &gMMCEStartMode);\n+            configGetInt(configOPL, CONFIG_OPL_MMCE_SLOT, &gMMCESlot);\n+            configGetInt(configOPL, CONFIG_OPL_MMCEIGR_SLOT, &gMMCEIGRSlot);\n+            configGetInt(configOPL, CONFIG_OPL_MMCE_GAMEID, &gMMCEEnableGameID);\n             configGetInt(configOPL, CONFIG_OPL_ENABLE_ILINK, &gEnableILK);\n             configGetInt(configOPL, CONFIG_OPL_ENABLE_MX4SIO, &gEnableMX4SIO);\n             configGetInt(configOPL, CONFIG_OPL_ENABLE_BDMHDD, &gEnableBdmHDD);\n@@ -1113,6 +1127,7 @@ static void _saveConfig()\n         configSetInt(configOPL, CONFIG_OPL_DEFAULT_DEVICE, gDefaultDevice);\n         configSetInt(configOPL, CONFIG_OPL_ENABLE_WRITE, gEnableWrite);\n         configSetInt(configOPL, CONFIG_OPL_HDD_SPINDOWN, gHDDSpindown);\n+        configSetStr(configOPL, CONFIG_OPL_MMCE_PREFIX, gMMCEPrefix);\n         configSetStr(configOPL, CONFIG_OPL_BDM_PREFIX, gBDMPrefix);\n         configSetStr(configOPL, CONFIG_OPL_ETH_PREFIX, gETHPrefix);\n         configSetInt(configOPL, CONFIG_OPL_REMEMBER_LAST, gRememberLastPlayed);\n@@ -1121,6 +1136,10 @@ static void _saveConfig()\n         configSetInt(configOPL, CONFIG_OPL_HDD_MODE, gHDDStartMode);\n         configSetInt(configOPL, CONFIG_OPL_ETH_MODE, gETHStartMode);\n         configSetInt(configOPL, CONFIG_OPL_APP_MODE, gAPPStartMode);\n+        configSetInt(configOPL, CONFIG_OPL_MMCE_MODE, gMMCEStartMode);\n+        configSetInt(configOPL, CONFIG_OPL_MMCE_SLOT, gMMCESlot);\n+        configSetInt(configOPL, CONFIG_OPL_MMCEIGR_SLOT, gMMCEIGRSlot);\n+        configSetInt(configOPL, CONFIG_OPL_MMCE_GAMEID, gMMCEEnableGameID);\n         configSetInt(configOPL, CONFIG_OPL_BDM_CACHE, bdmCacheSize);\n         configSetInt(configOPL, CONFIG_OPL_HDD_CACHE, hddCacheSize);\n         configSetInt(configOPL, CONFIG_OPL_SMB_CACHE, smbCacheSize);\n@@ -1178,8 +1197,8 @@ static void _saveConfig()\n \n void applyConfig(int themeID, int langID, int skipDeviceRefresh)\n {\n-    if (gDefaultDevice < 0 || gDefaultDevice > APP_MODE)\n-        gDefaultDevice = APP_MODE;\n+    if (gDefaultDevice < 0 || gDefaultDevice > MMCE_MODE)\n+        gDefaultDevice = MMCE_MODE;\n \n     guiUpdateScrollSpeed();\n \n@@ -1746,6 +1765,7 @@ static void setDefaults(void)\n     gRememberLastPlayed = 0;\n     gAutoStartLastPlayed = 9;\n     gSelectButton = KEY_CIRCLE; // Default to Japan.\n+    gMMCEPrefix[0] = '\\0';\n     gBDMPrefix[0] = '\\0';\n     gETHPrefix[0] = '\\0';\n     gEnableNotifications = 0;\n@@ -1765,6 +1785,11 @@ static void setDefaults(void)\n     gHDDStartMode = START_MODE_DISABLED;\n     gETHStartMode = START_MODE_DISABLED;\n     gAPPStartMode = START_MODE_DISABLED;\n+    gMMCEStartMode = START_MODE_DISABLED;\n+\n+    gMMCESlot = MMCE_SLOT_AUTO;\n+    gMMCEIGRSlot = MMCE_IGR_AUTO;\n+    gMMCEEnableGameID = 1;\n \n     gEnableILK = 0;\n     gEnableMX4SIO = 0;\n@@ -1904,8 +1929,11 @@ static void miniInit(int mode)\n             if (mode == BDM_MODE) {\n                 configGetStrCopy(configOPL, CONFIG_OPL_BDM_PREFIX, gBDMPrefix, sizeof(gBDMPrefix));\n                 configGetInt(configOPL, CONFIG_OPL_BDM_CACHE, &bdmCacheSize);\n-            } else if (mode == HDD_MODE)\n+            } else if (mode == HDD_MODE) {\n                 configGetInt(configOPL, CONFIG_OPL_HDD_CACHE, &hddCacheSize);\n+            } else if (mode == MMCE_MODE) {\n+                configGetStrCopy(configOPL, CONFIG_OPL_MMCE_PREFIX, gMMCEPrefix, sizeof(gMMCEPrefix));\n+            }\n         }\n     }\n }"
        },
        {
          "sha": "72fb11580a441812b177d40e0118013e84633d1f",
          "filename": "src/pad.c",
          "status": "modified",
          "additions": 9,
          "deletions": 6,
          "changes": 15,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fpad.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fpad.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fpad.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -40,8 +40,9 @@ struct pad_data_t\n     int actuators;\n };\n \n-/// current time in miliseconds (last update time)\n-static u32 curtime = 0;\n+/// tick count at the last update, and the ticks of it not yet counted as a millisecond\n+static u32 lastticks = 0;\n+static u32 tickrem = 0;\n static u32 time_since_last = 0;\n \n static unsigned short pad_count;\n@@ -330,10 +331,12 @@ int readPads()\n     oldpaddata = paddata;\n     paddata = 0;\n \n-    // in ms.\n-    u32 newtime = cpu_ticks() / CLOCKS_PER_MILISEC;\n-    time_since_last = newtime - curtime;\n-    curtime = newtime;\n+    // in ms. The 32-bit tick counter wraps every 29 s: the difference of the raw counts is wrap-safe\n+    u32 ticks = cpu_ticks();\n+    u32 elapsed = (ticks - lastticks) + tickrem;\n+    time_since_last = elapsed / CLOCKS_PER_MILISEC;\n+    tickrem = elapsed % CLOCKS_PER_MILISEC;\n+    lastticks = ticks;\n \n     int rslt = 0;\n "
        },
        {
          "sha": "36779bde1acc4176977a9aa37d68872ffed202ac",
          "filename": "src/ps2cnf.c",
          "status": "modified",
          "additions": 1,
          "deletions": 1,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fps2cnf.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fps2cnf.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fps2cnf.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -108,7 +108,7 @@ int ps2cnfGetBootFile(const char *path, char *bootfile)\n         return -1;\n     }\n \n-    if ((pChar = CNFGetToken(pChar, cnf_end, \"=\")) == (const char *)-1) { // Unexpected EOF\n+    if ((pChar = CNFGetToken(pChar, cnf_end, \"=\")) == (const char *)-1 || pChar == NULL) { // Unexpected EOF, or BOOT2 without '='\n         return -1;\n     }\n "
        },
        {
          "sha": "b3a01b97e859a56271fdcc9cd23a67966e3911e7",
          "filename": "src/sound.c",
          "status": "modified",
          "additions": 1,
          "deletions": 1,
          "changes": 2,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fsound.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fsound.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fsound.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -338,7 +338,7 @@ static int bgmLoad(void)\n         char *thmPath = thmGetFilePath(themeID);\n         snprintf(bgmPath, sizeof(bgmPath), \"%ssound/bgm.ogg\", thmPath);\n     } else\n-        snprintf(bgmPath, sizeof(bgmPath), gDefaultBGMPath);\n+        snprintf(bgmPath, sizeof(bgmPath), \"%s\", gDefaultBGMPath);\n \n     bgmFile = fopen(bgmPath, \"rb\");\n     if (bgmFile == NULL) {"
        },
        {
          "sha": "ae756fbe006761ea4a5323433e048ca7e2655df3",
          "filename": "src/supportbase.c",
          "status": "modified",
          "additions": 29,
          "deletions": 5,
          "changes": 34,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fsupportbase.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fsupportbase.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fsupportbase.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -65,6 +65,8 @@ int isValidIsoName(char *name, int *pNameLen)\n \n     // Minimum is 17 char, GameID (11) + \".\" (1) + filename (1 min.) + \".iso\" (4)\n     int size = strlen(name);\n+    if (size < 5) // Also keeps name[size - 4] inside the name, e.g. for \"..\"\n+        return 0;\n     if (strcasecmp(&name[size - 4], \".iso\") == 0 || strcasecmp(&name[size - 4], \".zso\") == 0) {\n         if ((size >= 17) && (name[4] == '_') && (name[8] == '.') && (name[11] == '.')) {\n             *pNameLen = size - 16;\n@@ -202,7 +204,7 @@ static int updateISOGameList(const char *path, const struct game_cache_list *cac\n \n             for (i = 0; i < count; i++) {\n                 for (j = 0; j < cache->count; j++) {\n-                    if (strncmp(cache->games[i].name, game->gameinfo.name, ISO_GAME_NAME_MAX + 1) == 0 && strncmp(cache->games[i].extension, game->gameinfo.extension, ISO_GAME_EXTENSION_MAX + 1) == 0)\n+                    if (strncmp(cache->games[j].name, game->gameinfo.name, ISO_GAME_NAME_MAX + 1) == 0 && strncmp(cache->games[j].extension, game->gameinfo.extension, ISO_GAME_EXTENSION_MAX + 1) == 0)\n                         break;\n                 }\n \n@@ -409,7 +411,8 @@ int sbReadList(base_game_info_t **list, const char *prefix, int *fsize, int *gam\n             if ((*list = (base_game_info_t *)malloc(sizeof(base_game_info_t) * count)) != NULL) {\n                 memset(*list, 0, sizeof(base_game_info_t) * count);\n \n-                while (size > 0) {\n+                // count only has room for whole records: ignore a partial one at the end\n+                while (size >= (int)sizeof(USBExtreme_game_entry_t)) {\n                     base_game_info_t *g = &(*list)[id++];\n \n                     // populate game entry in list even if entry corrupted\n@@ -482,9 +485,8 @@ static int ProbeZISO(int fd)\n         u32 first_block;\n     } ziso_data;\n     lseek(fd, 0, SEEK_SET);\n-    if (read(fd, &ziso_data, sizeof(ziso_data)) == sizeof(ziso_data) && ziso_data.header.magic == ZSO_MAGIC) {\n-        // initialize ZSO\n-        ziso_init(&ziso_data.header, ziso_data.first_block);\n+    if (read(fd, &ziso_data, sizeof(ziso_data)) == sizeof(ziso_data) && ziso_data.header.magic == ZSO_MAGIC &&\n+        ziso_init(&ziso_data.header, ziso_data.first_block) == 0) { // initialize ZSO\n         // set ISO file descriptor for ZSO reader\n         probed_fd = fd;\n         probed_lba = 0;\n@@ -686,6 +688,28 @@ void sbUnprepare(void *pCommon)\n     memcpy(pCommon, &cdvdman_settings_common_sample, sizeof(struct cdvdman_settings_common));\n }\n \n+/* Returns the index of the u32 word that holds VMC slot `slot` in an mcemu image, or -1.\n+   The slot is marked by the word 0xC0DEFAC0 + slot, which the first launch overwrites with the\n+   slot's settings; an aborted launch returns to the menu, so the next launch could no longer\n+   find it. `cache` (two ints, zero at start) keeps the index of each slot found in the pristine image. */\n+int sbMcemuSlotWord(void *irx, int size, int slot, int *cache)\n+{\n+    if (cache[slot] == 0) { // word 0 is the ELF header, so 0 means \"not looked up yet\"\n+        u32 *words = (u32 *)irx;\n+        int i;\n+\n+        cache[slot] = -1;\n+        for (i = 0; i < size / 4; i++) {\n+            if (words[i] == 0xC0DEFAC0 + slot) {\n+                cache[slot] = i;\n+                break;\n+            }\n+        }\n+    }\n+\n+    return cache[slot];\n+}\n+\n void sbRebuildULCfg(base_game_info_t **list, const char *prefix, int gamecount, int excludeID)\n {\n     char path[256];"
        },
        {
          "sha": "29b6483a65a53a574c3ce43062cc9c4b6915ee66",
          "filename": "src/system.c",
          "status": "modified",
          "additions": 36,
          "deletions": 8,
          "changes": 44,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fsystem.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fsystem.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fsystem.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -18,6 +18,7 @@\n #include \"include/ioman.h\"\n #include \"include/ioprp.h\"\n #include \"include/bdmsupport.h\"\n+#include \"include/mmcesupport.h\"\n #include \"include/OSDHistory.h\"\n #include \"include/renderman.h\"\n #include \"include/extern_irx.h\"\n@@ -317,7 +318,7 @@ unsigned int USBA_crc32(const char *string)\n     }\n \n     do {\n-        byte = string[count++];\n+        byte = (unsigned char)string[count++]; // char is signed on the EE: bytes >= 0x80 must not index crctab negatively\n         crc = crctab[byte ^ ((crc >> 24) & 0xFF)] ^ ((crc << 8) & 0xFFFFFF00);\n     } while ((string[count - 1] != 0) && (count <= 32));\n \n@@ -392,6 +393,7 @@ void sysExecExit(void)\n #define CORE_IRX_DECI2  0x40\n #define CORE_IRX_ILINK  0x80\n #define CORE_IRX_MX4SIO 0x100\n+#define CORE_IRX_MMCE   0x200\n \n typedef struct\n {\n@@ -421,7 +423,7 @@ static unsigned int addIopPatch(const char *mode_str, const char *startup, irxpt\n     for (i = 0; iop_patch_list[i].game != NULL; i++) {\n         p = &iop_patch_list[i];\n \n-        if (!strcmp(p->game, startup) && (p->mode[0] == '\\0' || !strcmp(p->mode, startup))) {\n+        if (!strcmp(p->game, startup) && (p->mode[0] == '\\0' || !strcmp(p->mode, mode_str))) {\n             tab->info = (*(p->module_size)) | SET_OPL_MOD_ID(OPL_MODULE_ID_IOP_PATCH);\n             tab->ptr = (void *)p->module;\n             return 1;\n@@ -477,8 +479,17 @@ static unsigned int sendIrxKernelRAM(const char *startup, const char *mode_str,\n         modules |= CORE_IRX_HDD;\n     else if (!strcmp(mode_str, \"ETH_MODE\"))\n         modules |= CORE_IRX_ETH | CORE_IRX_SMB;\n-    else\n+    else if (!strcmp(mode_str, \"HDD_MODE\"))\n         modules |= CORE_IRX_HDD;\n+    else if (!strcmp(mode_str, \"MMCE_MODE\"))\n+        modules |= CORE_IRX_MMCE;\n+\n+#ifdef MMCE_NO_SDK_SIO2MAN\n+    // A/B build for the console: MMCE games keep the game's own SIO2MAN, as RiptOPL does (11a5150e), so\n+    // neither the SDK sio2man nor mcemu is packed for them. VMC and PADEMU would hook the game's SIO2MAN.\n+    if (modules & CORE_IRX_MMCE)\n+        modules &= ~CORE_IRX_VMC;\n+#endif\n \n     irxtable = (irxtab_t *)ModuleStorage;\n     irxptr_tab = (irxptr_t *)((unsigned char *)irxtable + sizeof(irxtab_t));\n@@ -499,6 +510,12 @@ static unsigned int sendIrxKernelRAM(const char *startup, const char *mode_str,\n     irxptr_tab[modcount].info = size_resetspu_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_RESETSPU);\n     irxptr_tab[modcount++].ptr = (void *)&resetspu_irx;\n \n+    // mmceigr (1.4 KB) stays in kernel RAM when IGR has to switch an MMCE card back to its boot card.\n+    if (mmceIGRSlots() != 0) {\n+        irxptr_tab[modcount].info = size_mmceigr_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_MMCEIGR);\n+        irxptr_tab[modcount++].ptr = (void *)&mmceigr_irx;\n+    }\n+\n #ifdef PADEMU\n #define PADEMU_ARG || gEnablePadEmu\n #else\n@@ -542,6 +559,11 @@ static unsigned int sendIrxKernelRAM(const char *startup, const char *mode_str,\n         irxptr_tab[modcount++].ptr = (void *)mcemu_irx;\n     }\n \n+    if (modules & CORE_IRX_MMCE) {\n+        irxptr_tab[modcount].info = size_mmcedrv_irx | SET_OPL_MOD_ID(OPL_MODULE_ID_MMCEDRV);\n+        irxptr_tab[modcount++].ptr = (void *)&mmcedrv_irx;\n+    }\n+\n #ifdef PADEMU\n     if (gEnablePadEmu) {\n         if (gPadEmuSettings & 0xFF) {\n@@ -817,6 +839,9 @@ void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdv\n     AddHistoryRecordUsingFullPath(filename);\n #endif\n \n+    // The last write to the real memory card is done: an MMCE card may now switch to the game's own card.\n+    mmceSendGameID(filename);\n+\n     if (gExitPath[0] == '\\0')\n         strncpy(gExitPath, \"Browser\", sizeof(gExitPath));\n \n@@ -902,7 +927,11 @@ void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdv\n     config->magic[1] = EE_CORE_MAGIC_1;\n \n     strncpy(config->ExitPath, gExitPath, CORE_EXIT_PATH_MAX_LEN);\n+    config->ExitPath[CORE_EXIT_PATH_MAX_LEN - 1] = '\\0';\n     strncpy(config->GameModeDesc, mode_str, CORE_GAME_MODE_DESC_MAX_LEN);\n+    config->GameModeDesc[CORE_GAME_MODE_DESC_MAX_LEN - 1] = '\\0';\n+\n+    config->MMCEIGRSettings = mmceIGRSlots();\n \n     config->EnableDebug = gEnableDebug;\n     config->HDDSpindown = gHDDSpindown;\n@@ -959,6 +988,7 @@ void sysLaunchLoaderElf(const char *filename, const char *mode_str, int size_cdv\n     config->ModStorageEnd = ModuleStorageEnd;\n \n     strncpy(config->GameID, filename, CORE_GAME_ID_MAX_LEN);\n+    config->GameID[CORE_GAME_ID_MAX_LEN - 1] = '\\0';\n \n     config->_CompatMask = compatflags;\n \n@@ -1079,13 +1109,11 @@ int sysCheckVMC(const char *prefix, const char *sep, char *name, int createSize,\n                 size /= 1048576;\n \n             close(fd);\n-\n-            if (createSize && (createSize != size))\n-                unlink(path);\n         }\n \n-\n-        if (createSize && (createSize != size)) {\n+        // Only create a card where there is none. Replacing a card loses its saves, so the\n+        // caller has to delete it first (createSize == -1).\n+        if (createSize && (size == -1)) {\n             createVMCparam_t createParam;\n             strcpy(createParam.VMC_filename, path);\n             createParam.VMC_size_mb = createSize;"
        },
        {
          "sha": "2c76da8715145929df34df7c615d6d066a13b204",
          "filename": "src/textures.c",
          "status": "modified",
          "additions": 7,
          "deletions": 1,
          "changes": 8,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Ftextures.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Ftextures.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Ftextures.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -20,6 +20,7 @@ extern void *hdd_bd_png;\n extern void *hdd_png;\n extern void *eth_png;\n extern void *app_png;\n+extern void *mmce_png;\n extern void *Index_0_png;\n extern void *Index_1_png;\n extern void *Index_2_png;\n@@ -143,6 +144,7 @@ static texture_t internalDefault[TEXTURES_COUNT] = {\n     {HDD_ICON, \"hdd\", &hdd_png},\n     {ETH_ICON, \"eth\", &eth_png},\n     {APP_ICON, \"app\", &app_png},\n+    {MMCE_ICON, \"mmce\", &mmce_png},\n     {INDEX_0, \"Index_0\", &Index_0_png},\n     {INDEX_1, \"Index_1\", &Index_1_png},\n     {INDEX_2, \"Index_2\", &Index_2_png},\n@@ -480,12 +482,16 @@ static int texLoadAll(GSTEXTURE *texture, const char *filePath, int texId)\n     if (bitDepth == 16)\n         png_set_strip_16(pngPtr);\n \n-    if (colorType == PNG_COLOR_TYPE_GRAY || bitDepth < 4) {\n+    if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA || bitDepth < 4) {\n         png_set_expand(pngPtr);\n         if (png_get_valid(pngPtr, infoPtr, PNG_INFO_tRNS))\n             png_set_tRNS_to_alpha(pngPtr);\n     }\n \n+    // The readers below take RGB, RGBA and palettes: grey images are expanded to RGB\n+    if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA)\n+        png_set_gray_to_rgb(pngPtr);\n+\n     png_set_filler(pngPtr, 0xff, PNG_FILLER_AFTER);\n     png_read_update_info(pngPtr, infoPtr);\n "
        },
        {
          "sha": "c2a5a4bdc7e8eff9791fafba38cbabe5e51968ee",
          "filename": "src/themes.c",
          "status": "modified",
          "additions": 38,
          "deletions": 17,
          "changes": 55,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fthemes.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Fthemes.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Fthemes.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -90,6 +90,9 @@ static void endMutableText(theme_element_t *elem)\n         if (mutableText->alias)\n             free(mutableText->alias);\n \n+        if (mutableText->wrappedValue)\n+            free(mutableText->wrappedValue);\n+\n         free(mutableText);\n     }\n \n@@ -101,6 +104,7 @@ static mutable_text_t *initMutableText(const char *themePath, config_set_t *them\n     mutable_text_t *mutableText = (mutable_text_t *)malloc(sizeof(mutable_text_t));\n     mutableText->currentConfigId = 0;\n     mutableText->currentValue = NULL;\n+    mutableText->wrappedValue = NULL;\n     mutableText->alias = NULL;\n \n     char elemProp[64];\n@@ -225,11 +229,14 @@ static void drawGameCountText(struct menu_list *menu, struct submenu_list *item,\n \n static void initGameCountText(const char *themePath, config_set_t *themeConfig, theme_t *theme, theme_element_t *elem, const char *name)\n {\n-    int length = 60;\n-    char *countStr = (char *)malloc(length * sizeof(char));\n-    memset(countStr, 0, length * sizeof(char));\n+    mutable_text_t *mutableText = initMutableText(themePath, themeConfig, theme, name, ELEM_TYPE_ATTRIBUTE_TEXT, elem, \"\", NULL, DISPLAY_ALWAYS, SIZING_NONE);\n+\n+    // initMutableText() sizes value after the text it is given: drawGameCountText() formats up to\n+    // 60 bytes into it\n+    free(mutableText->value);\n+    mutableText->value = (char *)calloc(60, sizeof(char));\n \n-    elem->extended = initMutableText(themePath, themeConfig, theme, name, ELEM_TYPE_ATTRIBUTE_TEXT, elem, countStr, NULL, DISPLAY_ALWAYS, SIZING_NONE);\n+    elem->extended = mutableText;\n     elem->endElem = &endMutableText;\n     elem->drawElem = &drawGameCountText;\n }\n@@ -244,9 +251,22 @@ static void drawAttributeText(struct menu_list *menu, struct submenu_list *item,\n             // force refresh\n             mutableText->currentConfigId = config->uid;\n             mutableText->currentValue = NULL;\n+            if (mutableText->wrappedValue) {\n+                free(mutableText->wrappedValue);\n+                mutableText->wrappedValue = NULL;\n+            }\n             if (configGetStr(config, mutableText->value, (const char **)&mutableText->currentValue)) {\n-                if (mutableText->sizingMode == SIZING_WRAP)\n-                    fntFitString(elem->font, mutableText->currentValue, elem->width);\n+                if (mutableText->sizingMode == SIZING_WRAP) {\n+                    // configGetStr() points into the config's own value: wrap a copy, or the line\n+                    // breaks would be saved into the CFG with the next settings save\n+                    int length = strlen(mutableText->currentValue) + 1;\n+                    mutableText->wrappedValue = (char *)malloc(length);\n+                    if (mutableText->wrappedValue) {\n+                        memcpy(mutableText->wrappedValue, mutableText->currentValue, length);\n+                        fntFitString(elem->font, mutableText->wrappedValue, elem->width);\n+                        mutableText->currentValue = mutableText->wrappedValue;\n+                    }\n+                }\n             }\n         }\n         if (mutableText->currentValue) {\n@@ -354,7 +374,9 @@ static void freeImageTexture(image_texture_t *texture)\n \n static image_texture_t *initImageTexture(const char *themePath, config_set_t *themeConfig, const char *name, const char *imgName, int isOverlay)\n {\n-    image_texture_t *texture = (image_texture_t *)malloc(sizeof(image_texture_t));\n+    // Zeroed: a failed load leaves the texture unset, and it is then freed (NULL pointers) and\n+    // dropped below, so that the element is disabled instead of drawn from what the memory held\n+    image_texture_t *texture = (image_texture_t *)calloc(1, sizeof(image_texture_t));\n     texture->name = NULL;\n \n     int texId = -1;\n@@ -363,14 +385,10 @@ static image_texture_t *initImageTexture(const char *themePath, config_set_t *th\n     if (themePath) {\n         char path[256];\n         snprintf(path, sizeof(path), \"%s%s\", themePath, imgName);\n-        if (texDiscoverLoad(&texture->source, path, texId) >= 0)\n-            ;\n-        result = 1;\n+        result = (texDiscoverLoad(&texture->source, path, texId) >= 0);\n     } else {\n         texId = texLookupInternalTexId(imgName);\n-        if (texLoadInternal(&texture->source, texId) >= 0)\n-            ;\n-        result = 1;\n+        result = (texLoadInternal(&texture->source, texId) >= 0);\n     }\n \n     if (result) {\n@@ -965,7 +983,7 @@ static void validateBackgroundElems(const char *themePath, config_set_t *themeCo\n     }\n }\n \n-static void validateItemsList(const char *themePath, config_set_t *themeConfig, theme_t *theme, theme_element_t *list, theme_elems_t *mainElems)\n+static theme_element_t *validateItemsList(const char *themePath, config_set_t *themeConfig, theme_t *theme, theme_element_t *list, theme_elems_t *mainElems)\n {\n     if (list) {\n         items_list_t *itemsList = (items_list_t *)list->extended;\n@@ -994,6 +1012,8 @@ static void validateItemsList(const char *themePath, config_set_t *themeConfig,\n         list->next = mainElems->first->next; // Position the itemsList as second element (right after the Background)\n         mainElems->first->next = list;\n     }\n+\n+    return list;\n }\n \n static void validateGUIElems(const char *themePath, config_set_t *themeConfig, theme_t *theme)\n@@ -1002,9 +1022,10 @@ static void validateGUIElems(const char *themePath, config_set_t *themeConfig, t\n     validateBackgroundElems(themePath, themeConfig, theme, &theme->mainElems, &theme->infoElems);\n     validateBackgroundElems(themePath, themeConfig, theme, &theme->appsMainElems, &theme->appsInfoElems);\n \n-    // 2. check we have a valid ItemsList element, and link its decorator to the target element\n-    validateItemsList(themePath, themeConfig, theme, theme->gamesItemsList, &theme->mainElems);\n-    validateItemsList(themePath, themeConfig, theme, theme->appsItemsList, &theme->appsMainElems);\n+    // 2. check we have a valid ItemsList element, and link its decorator to the target element;\n+    // the theme must know the default list, menusys navigates with it\n+    theme->gamesItemsList = validateItemsList(themePath, themeConfig, theme, theme->gamesItemsList, &theme->mainElems);\n+    theme->appsItemsList = validateItemsList(themePath, themeConfig, theme, theme->appsItemsList, &theme->appsMainElems);\n }\n \n static int addGUIElem(const char *themePath, config_set_t *themeConfig, theme_t *theme, theme_elems_t *elems, const char *type, const char *name)"
        },
        {
          "sha": "e05c2e01a5be3262e929a52ce6c0a12f994aa77a",
          "filename": "src/util.c",
          "status": "modified",
          "additions": 24,
          "deletions": 11,
          "changes": 35,
          "blob_url": "https://github.com/ps2homebrew/Open-PS2-Loader/blob/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Futil.c",
          "raw_url": "https://github.com/ps2homebrew/Open-PS2-Loader/raw/33a2b19a8afa37b50015eeb1414f575b2270ac7d/src%2Futil.c",
          "contents_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/contents/src%2Futil.c?ref=33a2b19a8afa37b50015eeb1414f575b2270ac7d",
          "patch": "@@ -255,6 +255,7 @@ file_buffer_t *openFileBuffer(char *fpath, int mode, short allocResult, unsigned\n         } else\n             fileBuffer->lastPtr = fileBuffer->buffer;\n         fileBuffer->allocResult = allocResult;\n+        fileBuffer->writeError = 0;\n         fileBuffer->fd = fd;\n         fileBuffer->mode = mode;\n     }\n@@ -273,6 +274,7 @@ file_buffer_t *openFileBufferBuffer(short allocResult, const void *buffer, unsig\n     fileBuffer->buffer = (char *)malloc((size + 1) * sizeof(char));\n     fileBuffer->lastPtr = fileBuffer->buffer; // O_RDONLY, but with the data in the buffer.\n     fileBuffer->allocResult = allocResult;\n+    fileBuffer->writeError = 0;\n     fileBuffer->fd = -1;\n     fileBuffer->mode = O_RDONLY;\n \n@@ -312,6 +314,8 @@ int readFileBuffer(file_buffer_t *fileBuffer, char **outBuf)\n                 length = fileBuffer->size - lineSize - 1;\n                 // LOG(\"##### Asking for %d characters to complete buffer\\n\", length);\n                 readSize = read(fileBuffer->fd, fileBuffer->buffer + lineSize, length);\n+                if (readSize < 0) // A read error (e.g. the device was removed) ends the file\n+                    readSize = 0;\n                 fileBuffer->buffer[lineSize + readSize] = '\\0';\n \n                 // Search again (from the lastly added chars only), the result will be \"analyzed\" in next if\n@@ -353,8 +357,11 @@ int readFileBuffer(file_buffer_t *fileBuffer, char **outBuf)\n         if (fileBuffer->lastPtr[0] == '#') { // '#' for comment lines\n             if (posLF)\n                 fileBuffer->lastPtr = posLF + 1;\n-            else\n+            else {\n+                // The comment ends the buffer: nothing of it is left to shift on the next pass\n                 fileBuffer->lastPtr = NULL;\n+                lineSize = 0;\n+            }\n             continue;\n         }\n \n@@ -379,14 +386,16 @@ void writeFileBuffer(file_buffer_t *fileBuffer, char *inBuf, int size)\n     // LOG(\"writeFileBuffer avail: %d size: %d\\n\", fileBuffer->available, size);\n     if (fileBuffer->available && fileBuffer->available + size > fileBuffer->size) {\n         // LOG(\"writeFileBuffer flushing: %d\\n\", fileBuffer->available);\n-        write(fileBuffer->fd, fileBuffer->buffer, fileBuffer->available);\n+        if (write(fileBuffer->fd, fileBuffer->buffer, fileBuffer->available) != (int)fileBuffer->available)\n+            fileBuffer->writeError = 1;\n         fileBuffer->lastPtr = fileBuffer->buffer;\n         fileBuffer->available = 0;\n     }\n \n     if (size > fileBuffer->size) {\n         // LOG(\"writeFileBuffer direct write: %d\\n\", size);\n-        write(fileBuffer->fd, inBuf, size);\n+        if (write(fileBuffer->fd, inBuf, size) != size)\n+            fileBuffer->writeError = 1;\n     } else {\n         memcpy(fileBuffer->lastPtr, inBuf, size);\n         fileBuffer->lastPtr += size;\n@@ -396,17 +405,23 @@ void writeFileBuffer(file_buffer_t *fileBuffer, char *inBuf, int size)\n     }\n }\n \n-void closeFileBuffer(file_buffer_t *fileBuffer)\n+int closeFileBuffer(file_buffer_t *fileBuffer)\n {\n+    int result;\n+\n     if (fileBuffer->fd >= 0) {\n         if (fileBuffer->mode != O_RDONLY && fileBuffer->available) {\n             // LOG(\"writeFileBuffer final write: %d\\n\", fileBuffer->available);\n-            write(fileBuffer->fd, fileBuffer->buffer, fileBuffer->available);\n+            if (write(fileBuffer->fd, fileBuffer->buffer, fileBuffer->available) != (int)fileBuffer->available)\n+                fileBuffer->writeError = 1;\n         }\n-        close(fileBuffer->fd);\n+        if (close(fileBuffer->fd) < 0 && fileBuffer->mode != O_RDONLY) // Closing flushes the device's cache\n+            fileBuffer->writeError = 1;\n     }\n+    result = fileBuffer->writeError ? -1 : 0;\n     free(fileBuffer->buffer);\n     free(fileBuffer);\n+    return result;\n }\n \n // a simple maximum of two\n@@ -528,18 +543,16 @@ int CheckPS2Logo(int fd, u32 lba)\n         lseek(fd, 0, SEEK_SET);\n         w = read(fd, logo, sizeof(logo)) == sizeof(logo);\n     }\n-    if ((lba > 0) && (fd == 0)) {       // HDD_MODE\n-        for (k = 0; k <= 12 * 4; k++) { // NB: Disc sector size (2048 bytes) and HDD sector size (512 bytes) differ, hence why we multiplied the number of sectors (12) by 4.\n+    if ((lba > 0) && (fd == 0)) {      // HDD_MODE\n+        for (k = 0; k < 12 * 4; k++) { // NB: Disc sector size (2048 bytes) and HDD sector size (512 bytes) differ, hence why we multiplied the number of sectors (12) by 4.\n             w = !(hddReadSectors(lba + k, 1, buffer));\n             if (!w)\n                 break;\n             buffer += 512;\n         }\n     }\n \n-    if (*(u32 *)logo == ZSO_MAGIC) {\n-        // initialize ZSO\n-        ziso_init((ZISO_header *)logo, *(u32 *)((u8 *)logo + sizeof(ZISO_header)));\n+    if (*(u32 *)logo == ZSO_MAGIC && ziso_init((ZISO_header *)logo, *(u32 *)((u8 *)logo + sizeof(ZISO_header))) == 0) { // initialize ZSO\n         probed_fd = fd;\n         probed_lba = lba;\n         // read ZISO data"
        }
      ]
    }
  },
  {
    "repo": "oDaviDias/Open-PS2-Loader",
    "comparison": {
      "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/compare/master...oDaviDias:master",
      "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...oDaviDias:master",
      "permalink_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/ps2homebrew:b3a2199...oDaviDias:b3a2199",
      "diff_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...oDaviDias:master.diff",
      "patch_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...oDaviDias:master.patch",
      "base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOBDs4CNoAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "merge_base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOVXId99oAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "status": "identical",
      "ahead_by": 0,
      "behind_by": 0,
      "total_commits": 0,
      "commits": [],
      "files": []
    }
  },
  {
    "repo": "ftrmftho-creator/Open-PS2-Loader",
    "comparison": {
      "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/compare/master...ftrmftho-creator:master",
      "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...ftrmftho-creator:master",
      "permalink_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/ps2homebrew:b3a2199...ftrmftho-creator:b3a2199",
      "diff_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...ftrmftho-creator:master.diff",
      "patch_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...ftrmftho-creator:master.patch",
      "base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOBDs4CNoAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "merge_base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOVWsp1toAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "status": "identical",
      "ahead_by": 0,
      "behind_by": 0,
      "total_commits": 0,
      "commits": [],
      "files": []
    }
  },
  {
    "repo": "omga123omga/Open-PS2-Loader",
    "comparison": {
      "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/compare/master...omga123omga:master",
      "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...omga123omga:master",
      "permalink_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/ps2homebrew:b3a2199...omga123omga:b3a2199",
      "diff_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...omga123omga:master.diff",
      "patch_url": "https://github.com/ps2homebrew/Open-PS2-Loader/compare/master...omga123omga:master.patch",
      "base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOBDs4CNoAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "merge_base_commit": {
        "sha": "b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "node_id": "C_kwDOVVaQhtoAKGIzYTIxOTk3OTVmZTg5YmE3ZTJkZDdiODQzMzU0NDcyZGZmMmMzZWI",
        "commit": {
          "author": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "committer": {
            "name": "Julian Uy",
            "email": "uyjulian@gmail.com",
            "date": "2026-10-13T04:04:53Z"
          },
          "message": "docs: Add note about different proejcts",
          "tree": {
            "sha": "629942bc0487ded832fc729166b238664b54da51",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/trees/629942bc0487ded832fc729166b238664b54da51"
          },
          "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/git/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
          "comment_count": 0,
          "verification": {
            "verified": true,
            "reason": "valid",
            "signature": "-----BEGIN SSH SIGNATURE-----\nU1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAg/uIwoNSEmFGAdOGSX7Z8piUG6y\nkHBLCse4ArZh5qLqgAAAADZ2l0AAAAAAAAAAZzaGE1MTIAAABTAAAAC3NzaC1lZDI1NTE5\nAAAAQBcAcRw2w3m+FiekZNt4HcUFnIdt/z48lcqsw+MLooDPObd8tXmCxTtmQoNOEK6f1H\n2MeOqAcrPp9kOP5/GIIAo=\n-----END SSH SIGNATURE-----",
            "payload": "tree 629942bc0487ded832fc729166b238664b54da51\nparent 7fdf949c9fce1cd416025f9d097e408610fbc2a1\nauthor Julian Uy <uyjulian@gmail.com> 1791864293 -0500\ncommitter Julian Uy <uyjulian@gmail.com> 1791864293 -0500\n\ndocs: Add note about different proejcts\n",
            "verified_at": "2026-10-13T04:04:57Z"
          }
        },
        "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/b3a2199795fe89ba7e2dd7b843354472dff2c3eb",
        "comments_url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/b3a2199795fe89ba7e2dd7b843354472dff2c3eb/comments",
        "author": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "committer": {
          "login": "uyjulian",
          "id": 1689374,
          "node_id": "MDQ6VXNlcjE2ODkzNzQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1689374?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/uyjulian",
          "html_url": "https://github.com/uyjulian",
          "followers_url": "https://api.github.com/users/uyjulian/followers",
          "following_url": "https://api.github.com/users/uyjulian/following{/other_user}",
          "gists_url": "https://api.github.com/users/uyjulian/gists{/gist_id}",
          "starred_url": "https://api.github.com/users/uyjulian/starred{/owner}{/repo}",
          "subscriptions_url": "https://api.github.com/users/uyjulian/subscriptions",
          "organizations_url": "https://api.github.com/users/uyjulian/orgs",
          "repos_url": "https://api.github.com/users/uyjulian/repos",
          "events_url": "https://api.github.com/users/uyjulian/events{/privacy}",
          "received_events_url": "https://api.github.com/users/uyjulian/received_events",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "parents": [
          {
            "sha": "7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "url": "https://api.github.com/repos/ps2homebrew/Open-PS2-Loader/commits/7fdf949c9fce1cd416025f9d097e408610fbc2a1",
            "html_url": "https://github.com/ps2homebrew/Open-PS2-Loader/commit/7fdf949c9fce1cd416025f9d097e408610fbc2a1"
          }
        ]
      },
      "status": "identical",
      "ahead_by": 0,
      "behind_by": 0,
      "total_commits": 0,
      "commits": [],
      "files": []
    }
  }
]