Skip to content

Comments

Update download link#3

Open
lspepinho wants to merge 7 commits intoSmmServer:masterfrom
lspepinho:master
Open

Update download link#3
lspepinho wants to merge 7 commits intoSmmServer:masterfrom
lspepinho:master

Conversation

@lspepinho
Copy link
Contributor

Update the mega.nz download link to the new version (python rewrite)

@mrexodia
Copy link
Contributor

mrexodia commented Jan 9, 2026

Could you explain how to built this package locally?

@lspepinho
Copy link
Contributor Author

lspepinho commented Jan 10, 2026

I detailed it on the main README (and added the Cemu folder from the V9 release and dragged 2.6 into it). Sorry for the late response!

@mrexodia
Copy link
Contributor

Okay I did some testing locally to try and reproduce things, but there are some issues with the current implementation:

  • The app should not require Administrator access
  • Cemu 2.6 does not require modifying the hosts file, you can specify the endpoint directly in the configuration now
  • It's not possible to run the HTTP server independent from the UI, this should be decoupled (probably should be in NintendoClients)
  • Documentation about Cemu config modifications is necessary (this was fully undocumented, I figured it out from the source code)
  • Instead of 127.0.0.1 we should use 127.0.5.1 or a similar localhost address, this can avoid port conflicts. This only works on Windows/Linux though, not macos. I did not test this with Cemu, but I don't foresee any issues

My time is limited, so I was not able to test things fully. I made some minor changes to SmmServer, switched to uv and fixed package generation but it requires some more work before I can release it. If you are up for it I am happy to accept PRs to improve the situation, but otherwise you'll have to give me a few weeks to find time to investigate the issue.

Here is a modified version of the previous version of SmmServer that works with Cemu 2.6 and does not require patching or hosts modifications: https://mega.nz/file/K9gWHALD#vkeT380GJdWKWA1jMNi-s6uf1FqPCvi78fj311dcoiM. My next steps would be to separate out the new HTTP server and make things work (running manually now freezes when you open course world, but this package works).

@lspepinho
Copy link
Contributor Author

I literally couldnt figure out the "Custom" setting, glad u figured it out. I probably will push the HTTP server and Admin fix with my new PR (adds proper Course World support, with Star Ranking and New Arrivals). I'll definitely look into that manual run problem!

@lspepinho
Copy link
Contributor Author

Just pushed a PR fixing the things you mentioned. Could you test it?

@lspepinho
Copy link
Contributor Author

lspepinho commented Jan 16, 2026

Updated download link for the project.
@mrexodia
Copy link
Contributor

So I am trying this locally with Cemu 2.6, which has the network_services.xml configured to point everything to 127.0.5.1:8383:

uv run pretendo.py
cd NintendoClients
uv run example_smm_server.py
uv run example_friends_server.py

All from separate terminals of course. I also copied the datastore files for the official courses to the www folder. For pretendo.py:

$ uv run pretendo.py 
APP_DIR='C:\\CodeBlocks\\SmmServer'
BASE_DIR='C:\\CodeBlocks\\SmmServer'
CLIENTS_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients'
CONFIGS_DIR='C:\\CodeBlocks\\SmmServer\\Configs'
SETTINGS_INI_PATH='C:\\CodeBlocks\\SmmServer\\Configs\\settings.ini'
CURRENT_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients'
ROOT_DIR='C:\\CodeBlocks\\SmmServer'
SETTINGS_INI_PATH='C:\\CodeBlocks\\SmmServer\\Configs\\settings.ini'
BASE_SMMDB_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients\\www\\smmdb'
BASE_CW_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients\\www\\courseworld'
LISTS_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients\\www\\lists'
TMP_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients\\www\\tmp'
smmdb initialized!
[Pretendo] Server running on 127.0.5.1:8383
[Pretendo] GET /p01/tasksheet/1//preport?c=PL&l=en - 404
[Pretendo] GET /p01/tasksheet/1/IeUc4hQsKKe9rJHB/CHARA?c=PL&l=en - 404
[Pretendo] POST /v1/api/oauth20/access_token/generate - 200
[Pretendo] GET /v1/api/provider/nex_token/@me?game_server_id=1018DB00 - 200
[Pretendo] GET /v1/api/provider/service_token/@me?client_id=87cd32617f1985439ea608c2746e4610 - 200
[Pretendo] GET /datastore/00000900000-00045 - 200
[Pretendo] GET /v1/api/provider/service_token/@me?client_id=762eb78aa0f646aea258652c688571f8 - 200
[Pretendo] GET /p01/tasksheet/1//COURSE2?c=PL&l=en - 404

For the SMM server:

C:\CodeBlocks\SmmServer\NintendoClients>uv run example_smm_server.py
[2026-01-17 16:05:01] INFO: Starting PRUDP server at 127.0.5.1:59921:1
[2026-01-17 16:05:01] INFO: smm secure server 127.0.5.1:59921
[2026-01-17 16:05:01] INFO: Starting PRUDP server at 127.0.5.1:59900:1
[2026-01-17 16:05:01] INFO: smm auth server 127.0.5.1:59900
[2026-01-17 16:05:01] INFO: Press Ctrl+C to exit...
[2026-01-17 16:07:59] INFO: Accepting PRUDP connection from 127.0.0.1:9104
[2026-01-17 16:08:00] INFO: AuthenticationServer.login_ex()
[2026-01-17 16:08:00] INFO: User trying to log in: 1337
[2026-01-17 16:08:00] INFO: AuthenticationServer.request_ticket()
[2026-01-17 16:08:00] INFO: Accepting PRUDP connection from 127.0.0.1:9104
[2026-01-17 16:08:00] INFO: SecureConnectionServer.register()
[2026-01-17 16:08:00] INFO: Connection closed by other end point
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_meta()
[2026-01-17 16:08:01] INFO: param: {"access_password": 0, "data_id": 0, "persistence_target": {"owner_id": 1337, "persistence_id": 0}, "result_option": 5}
[2026-01-17 16:08:01] INFO: res: {"create_time": {"value": 135263953656}, "data_id": 20000000000, "data_type": 1, "delete_permission": {"permission": 3, "recipients": []}, "expire_time": {"value": 671075926016}, "flag": 256, "meta_binary": [66, 80, 70, 67, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 1, 66, 48, 128, 1, 56, 132, 224, 164, 128, 96, 145, 220, 237, 190, 88, 189, 163, 239, 75, 0, 0, 0, 214, 20, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 56, 0, 111, 0, 114, 0, 79, 69, 16, 0, 33, 1, 2, 104, 68, 24, 32, 52, 70, 20, 129, 18, 23, 104, 13, 0, 0, 41, 0, 82, 72, 80, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "name": "Player 1337", "owner_id": 1337, "period": 90, "permission": {"permission": 0, "recipients": []}, "ratings": [], "refer_data_id": 0, "referred_count": 0, "referred_time": {"value": 135263953656}, "size": 0, "status": 0, "tags": [], "update_time": {"value": 135263953656}}
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.change_meta()
[2026-01-17 16:08:01] INFO: param: {"compare_param": {"comparison_flag": 0, "data_type": 0, "delete_permission": {"permission": 3, "recipients": []}, "meta_binary": [], "name": "", "period": 90, "permission": {"permission": 3, "recipients": []}, "referred_count": 0, "status": 0, "tags": []}, "data_id": 20000000000, "data_type": 0, "delete_permission": {"permission": 3, "recipients": []}, "meta_binary": [66, 80, 70, 67, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 48, 90, 198, 187, 37, 32, 196, 112, 240, 148, 38, 232, 47, 184, 174, 110, 213, 144, 4, 0, 0, 0, 0, 95, 48, 75, 48, 104, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 55, 0, 0, 33, 1, 2, 100, 164, 24, 32, 69, 70, 20, 129, 18, 23, 104, 13, 0, 0, 41, 2, 81, 72, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4], "modifies_flag": 16, "name": "", "period": 90, "permission": {"permission": 3, "recipients": []}, "referred_count": 0, "status": 0, "tags": [], "update_password": 0}
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:08:01] INFO: param: {"data_ids": [20000000000], "magic": 300000000, "unk": 39}
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_application_config()
[2026-01-17 16:08:01] INFO: get_application_config(0)
[2026-01-17 16:08:01] INFO: res: [1, 50, 150, 300, 500, 800, 1300, 2000, 3000, 5000, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 35, 75, 35, 75, 50, 0, 3, 3, 100, 6, 1, 96, 5, 96, 0, 2020, 1, 1, 12, 0]
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_application_config()
[2026-01-17 16:08:01] INFO: get_application_config(1)
[2026-01-17 16:08:01] INFO: res: [2, 1770179696, 1770179664, 1770179640, 1770180827, 1770180777, 1770180745, 1770177625, 1770177590]
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_application_config()
[2026-01-17 16:08:01] INFO: get_application_config(2)
[2026-01-17 16:08:01] INFO: res: [2015, 12, 22, 5, 0]
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.followings_latest_course_search_object()
[2026-01-17 16:08:01] INFO: unknown1: {"pids": [1337], "unk1": 1, "unk10": 0, "unk11": [], "unk12": 0, "unk13": 0, "unk14": {"unk1": 0, "unk2": 100}, "unk15": 39, "unk16": 0, "unk17": false, "unk3": 0, "unk4": [], "unk5": 65535, "unk6": {"value": 671076024059}, "unk7": {"value": 671076024059}, "unk8": {"value": 671076024059}, "unk9": {"value": 671076024059}}
unknown2: ["0", "3", "10", "4", "11", "5", "12", "6", "13", "7", "14", "8", "15"]
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_meta()
[2026-01-17 16:08:01] INFO: param: {"access_password": 0, "data_id": 0, "persistence_target": {"owner_id": 1337, "persistence_id": 0}, "result_option": 7}
[2026-01-17 16:08:01] INFO: res: {"create_time": {"value": 135263953656}, "data_id": 20000000000, "data_type": 1, "delete_permission": {"permission": 3, "recipients": []}, "expire_time": {"value": 671075926016}, "flag": 256, "meta_binary": [66, 80, 70, 67, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 1, 66, 48, 128, 1, 56, 132, 224, 164, 128, 96, 145, 220, 237, 190, 88, 189, 163, 239, 75, 0, 0, 0, 214, 20, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 56, 0, 111, 0, 114, 0, 79, 69, 16, 0, 33, 1, 2, 104, 68, 24, 32, 52, 70, 20, 129, 18, 23, 104, 13, 0, 0, 41, 0, 82, 72, 80, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "name": "Player 1337", "owner_id": 1337, "period": 90, "permission": {"permission": 0, "recipients": []}, "ratings": [], "refer_data_id": 0, "referred_count": 0, "referred_time": {"value": 135263953656}, "size": 0, "status": 0, "tags": [], "update_time": {"value": 135263953656}}
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:08:01] INFO: param: {"data_ids": [20000000000], "magic": 300000000, "unk": 39}
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_application_config_string()
[2026-01-17 16:08:01] INFO: param: 128 (0x80)
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_application_config_string()
[2026-01-17 16:08:01] INFO: param: 129 (0x81)
[2026-01-17 16:08:01] INFO: DataStoreSmmServer.get_application_config_string()
[2026-01-17 16:08:01] INFO: param: 130 (0x82)
[2026-01-17 16:08:09] INFO: DataStoreSmmServer.get_buffer_queue()
[2026-01-17 16:08:09] INFO: param: {"data_id": 20000000000, "unk2": 0}
[2026-01-17 16:08:09] INFO: unk2==0 (Star List?)
[2026-01-17 16:08:09] INFO: res: [[200, 228, 11, 84, 2, 0, 0, 0]]
[2026-01-17 16:08:09] INFO: DataStoreSmmServer.prepare_get_object()
[2026-01-17 16:08:09] INFO: param: {"access_password": 0, "data_id": 900000, "extra_data": ["WUP", "4", "EUR", "97", "PL", ""], "lock_id": 0, "persistence_target": {"owner_id": 0, "persistence_id": 65535}}
[2026-01-17 16:08:09] INFO: res: {"data_id": 900000, "headers": [], "root_ca_cert": [], "size": 450068, "url": "http://127.0.5.1:8383/datastore/00000900000-00045"}
[2026-01-17 16:08:09] INFO: DataStoreSmmServer.get_meta()
[2026-01-17 16:08:09] INFO: param: {"access_password": 0, "data_id": 900000, "persistence_target": {"owner_id": 0, "persistence_id": 65535}, "result_option": 0}
[2026-01-17 16:08:09] INFO: res: {"create_time": {"value": 135271087238}, "data_id": 900000, "data_type": 50, "delete_permission": {"permission": 0, "recipients": []}, "expire_time": {"value": 671075926016}, "flag": 256, "meta_binary": [], "name": "", "owner_id": 2, "period": 64306, "permission": {"permission": 0, "recipients": []}, "ratings": [], "refer_data_id": 0, "referred_count": 0, "referred_time": {"value": 135271087238}, "size": 450068, "status": 0, "tags": [], "update_time": {"value": 135402751254}}
[2026-01-17 16:08:10] INFO: DataStoreSmmServer.followings_latest_course_search_object()
[2026-01-17 16:08:10] INFO: unknown1: {"pids": [1337], "unk1": 1, "unk10": 0, "unk11": [], "unk12": 0, "unk13": 0, "unk14": {"unk1": 0, "unk2": 100}, "unk15": 39, "unk16": 0, "unk17": false, "unk3": 0, "unk4": [], "unk5": 65535, "unk6": {"value": 671076024059}, "unk7": {"value": 671076024059}, "unk8": {"value": 671076024059}, "unk9": {"value": 671076024059}}
unknown2: ["0", "3", "10", "4", "11", "5", "12", "6", "13", "7", "14", "8", "15"]
[2026-01-17 16:08:10] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:08:10] INFO: param: {"data_ids": [20000000000], "magic": 300000000, "unk": 39}
[2026-01-17 16:08:10] INFO: DataStoreSmmServer.get_meta()
[2026-01-17 16:08:10] INFO: param: {"access_password": 0, "data_id": 900000, "persistence_target": {"owner_id": 0, "persistence_id": 65535}, "result_option": 0}
[2026-01-17 16:08:10] INFO: res: {"create_time": {"value": 135271087238}, "data_id": 900000, "data_type": 50, "delete_permission": {"permission": 0, "recipients": []}, "expire_time": {"value": 671075926016}, "flag": 256, "meta_binary": [], "name": "", "owner_id": 2, "period": 64306, "permission": {"permission": 0, "recipients": []}, "ratings": [], "refer_data_id": 0, "referred_count": 0, "referred_time": {"value": 135271087238}, "size": 450068, "status": 0, "tags": [], "update_time": {"value": 135402751254}}
[2026-01-17 16:08:10] INFO: DataStoreSmmServer.get_metas_with_course_record()
[2026-01-17 16:08:10] INFO: unknown: []
[2026-01-17 16:08:10] INFO: get_meta_param: {"access_password": 0, "data_id": 0, "persistence_target": {"owner_id": 0, "persistence_id": 65535}, "result_option": 4}
[2026-01-17 16:08:10] INFO: res: {"infos": [null], "result": {"error_code": 65537}, "results": [{"error_code": 6881281}], "unknown": [{"data_id": 10000000200, "first_clear_date": {"value": 1781058687}, "first_clear_pid": 1781058687, "unk2": 0, "world_record": 40320, "world_record_date": {"value": 1781058687}, "world_record_pid": 1781058687}]}
[2026-01-17 16:08:23] INFO: DataStoreSmmServer.get_meta()
[2026-01-17 16:08:23] INFO: param: {"access_password": 0, "data_id": 0, "persistence_target": {"owner_id": 1337, "persistence_id": 0}, "result_option": 7}
[2026-01-17 16:08:23] INFO: res: {"create_time": {"value": 135263953656}, "data_id": 20000000000, "data_type": 1, "delete_permission": {"permission": 3, "recipients": []}, "expire_time": {"value": 671075926016}, "flag": 256, "meta_binary": [66, 80, 70, 67, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 1, 66, 48, 128, 1, 56, 132, 224, 164, 128, 96, 145, 220, 237, 190, 88, 189, 163, 239, 75, 0, 0, 0, 214, 20, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 56, 0, 111, 0, 114, 0, 79, 69, 16, 0, 33, 1, 2, 104, 68, 24, 32, 52, 70, 20, 129, 18, 23, 104, 13, 0, 0, 41, 0, 82, 72, 80, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "name": "Player 1337", "owner_id": 1337, "period": 90, "permission": {"permission": 0, "recipients": []}, "ratings": [], "refer_data_id": 0, "referred_count": 0, "referred_time": {"value": 135263953656}, "size": 0, "status": 0, "tags": [], "update_time": {"value": 135263953656}}
[2026-01-17 16:08:23] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:08:23] INFO: param: {"data_ids": [20000000000], "magic": 300000000, "unk": 39}
[2026-01-17 16:08:43] INFO: DataStoreSmmServer.recommended_course_search_object()
[2026-01-17 16:08:43] INFO: unknown1: {"pids": [], "unk1": 1, "unk10": 0, "unk11": [], "unk12": 0, "unk13": 0, "unk14": {"unk1": 0, "unk2": 50}, "unk15": 39, "unk16": 0, "unk17": false, "unk3": 0, "unk4": [], "unk5": 65535, "unk6": {"value": 671076024059}, "unk7": {"value": 671076024059}, "unk8": {"value": 671076024059}, "unk9": {"value": 671076024059}}
unknown2: ["1", "0", "34", "", "0"]
[2026-01-17 16:08:43] INFO: min: 0, max: 34
[2026-01-17 16:08:43] INFO: detected 100 mario
[Dataprovider] Not enough unplayed random courses. Waiting for smmdb.py to download more.
[2026-01-17 16:08:43] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:08:43] INFO: param: {"data_ids": [], "magic": 0, "unk": 39}
[2026-01-17 16:08:43] INFO: get_custom_ranking_by_data_id(course) unknown data_id: 10000000200
[2026-01-17 16:08:43] INFO: RMC failed with error 0x80690004 (DataStore::NotFound)
[2026-01-17 16:09:19] INFO: DataStoreSmmServer.method49()
[2026-01-17 16:09:19] INFO: unknown: {"unk1": 420260116, "unk2": {"unk1": 127, "unk2": 0, "unk3": 0, "unk4": 0, "unk5": 4294967295}, "unk3": 55, "unk4": {"unk1": 0, "unk2": 100}}
[2026-01-17 16:09:19] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:09:19] INFO: param: {"data_ids": [], "magic": 300000000, "unk": 39}
[2026-01-17 16:09:27] INFO: DataStoreSmmServer.recommended_course_search_object()
[2026-01-17 16:09:27] INFO: unknown1: {"pids": [], "unk1": 1, "unk10": 0, "unk11": [], "unk12": 0, "unk13": 0, "unk14": {"unk1": 0, "unk2": 100}, "unk15": 39, "unk16": 0, "unk17": false, "unk3": 0, "unk4": [], "unk5": 65535, "unk6": {"value": 671076024059}, "unk7": {"value": 671076024059}, "unk8": {"value": 671076024059}, "unk9": {"value": 671076024059}}
unknown2: ["1", "35", "74", "0", "0"]
[2026-01-17 16:09:27] INFO: detected course browser (highlights, normal)
[Dataprovider] Not enough unplayed random courses. Waiting for smmdb.py to download more.
[2026-01-17 16:09:28] INFO: DataStoreSmmServer.get_metas_multiple_param()
[2026-01-17 16:09:28] INFO: params: []
[2026-01-17 16:09:28] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:09:28] INFO: param: {"data_ids": [], "magic": 300000000, "unk": 39}
[2026-01-17 16:15:47] ERROR: Packet timed out: <PRUDPPacket type=TYPE_PING flags=NEED_ACK,RELIABLE,HAS_SIZE seq=75 frag=0>
[2026-01-17 16:15:49] INFO: Accepting PRUDP connection from 127.0.0.1:50207
[2026-01-17 16:15:49] INFO: AuthenticationServer.login_ex()
[2026-01-17 16:15:49] INFO: User trying to log in: 1337
[2026-01-17 16:15:49] INFO: AuthenticationServer.request_ticket()
[2026-01-17 16:15:50] INFO: Accepting PRUDP connection from 127.0.0.1:50207
[2026-01-17 16:15:50] INFO: SecureConnectionServer.register()
[2026-01-17 16:15:50] INFO: Connection closed by other end point
[2026-01-17 16:15:50] INFO: DataStoreSmmServer.get_meta()
[2026-01-17 16:15:50] INFO: param: {"access_password": 0, "data_id": 0, "persistence_target": {"owner_id": 1337, "persistence_id": 0}, "result_option": 5}
[2026-01-17 16:15:50] INFO: res: {"create_time": {"value": 135263953656}, "data_id": 20000000000, "data_type": 1, "delete_permission": {"permission": 3, "recipients": []}, "expire_time": {"value": 671075926016}, "flag": 256, "meta_binary": [66, 80, 70, 67, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 1, 66, 48, 128, 1, 56, 132, 224, 164, 128, 96, 145, 220, 237, 190, 88, 189, 163, 239, 75, 0, 0, 0, 214, 20, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 56, 0, 111, 0, 114, 0, 79, 69, 16, 0, 33, 1, 2, 104, 68, 24, 32, 52, 70, 20, 129, 18, 23, 104, 13, 0, 0, 41, 0, 82, 72, 80, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "name": "Player 1337", "owner_id": 1337, "period": 90, "permission": {"permission": 0, "recipients": []}, "ratings": [], "refer_data_id": 0, "referred_count": 0, "referred_time": {"value": 135263953656}, "size": 0, "status": 0, "tags": [], "update_time": {"value": 135263953656}}
[2026-01-17 16:15:50] INFO: DataStoreSmmServer.change_meta()
[2026-01-17 16:15:50] INFO: param: {"compare_param": {"comparison_flag": 0, "data_type": 0, "delete_permission": {"permission": 3, "recipients": []}, "meta_binary": [], "name": "", "period": 90, "permission": {"permission": 3, "recipients": []}, "referred_count": 0, "status": 0, "tags": []}, "data_id": 20000000000, "data_type": 0, "delete_permission": {"permission": 3, "recipients": []}, "meta_binary": [66, 80, 70, 67, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 48, 90, 198, 187, 37, 32, 196, 112, 240, 148, 38, 232, 47, 184, 174, 110, 213, 144, 4, 0, 0, 0, 0, 95, 48, 75, 48, 104, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 55, 0, 0, 33, 1, 2, 100, 164, 24, 32, 69, 70, 20, 129, 18, 23, 104, 13, 0, 0, 41, 2, 81, 72, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4], "modifies_flag": 16, "name": "", "period": 90, "permission": {"permission": 3, "recipients": []}, "referred_count": 0, "status": 0, "tags": [], "update_password": 0}
[2026-01-17 16:15:50] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:15:50] INFO: param: {"data_ids": [20000000000], "magic": 300000000, "unk": 39}
[2026-01-17 16:15:50] INFO: DataStoreSmmServer.get_application_config()
[2026-01-17 16:15:50] INFO: get_application_config(0)
[2026-01-17 16:15:50] INFO: res: [1, 50, 150, 300, 500, 800, 1300, 2000, 3000, 5000, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 35, 75, 35, 75, 50, 0, 3, 3, 100, 6, 1, 96, 5, 96, 0, 2020, 1, 1, 12, 0]
[2026-01-17 16:15:51] INFO: DataStoreSmmServer.get_application_config()
[2026-01-17 16:15:51] INFO: get_application_config(1)
[2026-01-17 16:15:51] INFO: res: [2, 1770179696, 1770179664, 1770179640, 1770180827, 1770180777, 1770180745, 1770177625, 1770177590]
[2026-01-17 16:15:51] INFO: DataStoreSmmServer.get_application_config()
[2026-01-17 16:15:51] INFO: get_application_config(2)
[2026-01-17 16:15:51] INFO: res: [2015, 12, 22, 5, 0]
[2026-01-17 16:15:51] INFO: DataStoreSmmServer.followings_latest_course_search_object()
[2026-01-17 16:15:51] INFO: unknown1: {"pids": [1337], "unk1": 1, "unk10": 0, "unk11": [], "unk12": 0, "unk13": 0, "unk14": {"unk1": 0, "unk2": 100}, "unk15": 39, "unk16": 0, "unk17": false, "unk3": 0, "unk4": [], "unk5": 65535, "unk6": {"value": 671076024059}, "unk7": {"value": 671076024059}, "unk8": {"value": 671076024059}, "unk9": {"value": 671076024059}}
unknown2: ["0", "3", "10", "4", "11", "5", "12", "6", "13", "7", "14", "8", "15"]
[2026-01-17 16:15:51] INFO: DataStoreSmmServer.get_meta()
[2026-01-17 16:15:51] INFO: param: {"access_password": 0, "data_id": 0, "persistence_target": {"owner_id": 1337, "persistence_id": 0}, "result_option": 7}
[2026-01-17 16:15:51] INFO: res: {"create_time": {"value": 135263953656}, "data_id": 20000000000, "data_type": 1, "delete_permission": {"permission": 3, "recipients": []}, "expire_time": {"value": 671075926016}, "flag": 256, "meta_binary": [66, 80, 70, 67, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 1, 66, 48, 128, 1, 56, 132, 224, 164, 128, 96, 145, 220, 237, 190, 88, 189, 163, 239, 75, 0, 0, 0, 214, 20, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 56, 0, 111, 0, 114, 0, 79, 69, 16, 0, 33, 1, 2, 104, 68, 24, 32, 52, 70, 20, 129, 18, 23, 104, 13, 0, 0, 41, 0, 82, 72, 80, 80, 0, 97, 0, 116, 0, 114, 0, 105, 0, 99, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], "name": "Player 1337", "owner_id": 1337, "period": 90, "permission": {"permission": 0, "recipients": []}, "ratings": [], "refer_data_id": 0, "referred_count": 0, "referred_time": {"value": 135263953656}, "size": 0, "status": 0, "tags": [], "update_time": {"value": 135263953656}}
[2026-01-17 16:15:51] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:15:51] INFO: param: {"data_ids": [20000000000], "magic": 300000000, "unk": 39}
[2026-01-17 16:15:51] INFO: DataStoreSmmServer.get_application_config_string()
[2026-01-17 16:15:51] INFO: param: 128 (0x80)
[2026-01-17 16:15:51] INFO: DataStoreSmmServer.get_application_config_string()
[2026-01-17 16:15:51] INFO: param: 129 (0x81)
[2026-01-17 16:15:51] INFO: DataStoreSmmServer.get_application_config_string()
[2026-01-17 16:15:51] INFO: param: 130 (0x82)
[2026-01-17 16:16:00] INFO: DataStoreSmmServer.get_buffer_queue()
[2026-01-17 16:16:00] INFO: param: {"data_id": 20000000000, "unk2": 0}
[2026-01-17 16:16:00] INFO: unk2==0 (Star List?)
[2026-01-17 16:16:00] INFO: res: [[200, 228, 11, 84, 2, 0, 0, 0]]
[2026-01-17 16:16:00] INFO: DataStoreSmmServer.prepare_get_object()
[2026-01-17 16:16:00] INFO: param: {"access_password": 0, "data_id": 900000, "extra_data": ["WUP", "4", "EUR", "97", "PL", ""], "lock_id": 0, "persistence_target": {"owner_id": 0, "persistence_id": 65535}}
[2026-01-17 16:16:00] INFO: res: {"data_id": 900000, "headers": [], "root_ca_cert": [], "size": 450068, "url": "http://127.0.5.1:8383/datastore/00000900000-00045"}
[2026-01-17 16:16:00] INFO: DataStoreSmmServer.get_meta()
[2026-01-17 16:16:00] INFO: param: {"access_password": 0, "data_id": 900000, "persistence_target": {"owner_id": 0, "persistence_id": 65535}, "result_option": 0}
[2026-01-17 16:16:00] INFO: res: {"create_time": {"value": 135271087238}, "data_id": 900000, "data_type": 50, "delete_permission": {"permission": 0, "recipients": []}, "expire_time": {"value": 671075926016}, "flag": 256, "meta_binary": [], "name": "", "owner_id": 2, "period": 64306, "permission": {"permission": 0, "recipients": []}, "ratings": [], "refer_data_id": 0, "referred_count": 0, "referred_time": {"value": 135271087238}, "size": 450068, "status": 0, "tags": [], "update_time": {"value": 135402751254}}
[2026-01-17 16:16:01] INFO: DataStoreSmmServer.followings_latest_course_search_object()
[2026-01-17 16:16:01] INFO: unknown1: {"pids": [1337], "unk1": 1, "unk10": 0, "unk11": [], "unk12": 0, "unk13": 0, "unk14": {"unk1": 0, "unk2": 100}, "unk15": 39, "unk16": 0, "unk17": false, "unk3": 0, "unk4": [], "unk5": 65535, "unk6": {"value": 671076024059}, "unk7": {"value": 671076024059}, "unk8": {"value": 671076024059}, "unk9": {"value": 671076024059}}
unknown2: ["0", "3", "10", "4", "11", "5", "12", "6", "13", "7", "14", "8", "15"]
[2026-01-17 16:16:01] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:16:01] INFO: param: {"data_ids": [20000000000], "magic": 300000000, "unk": 39}
[2026-01-17 16:16:01] INFO: DataStoreSmmServer.get_meta()
[2026-01-17 16:16:01] INFO: param: {"access_password": 0, "data_id": 900000, "persistence_target": {"owner_id": 0, "persistence_id": 65535}, "result_option": 0}
[2026-01-17 16:16:01] INFO: res: {"create_time": {"value": 135271087238}, "data_id": 900000, "data_type": 50, "delete_permission": {"permission": 0, "recipients": []}, "expire_time": {"value": 671075926016}, "flag": 256, "meta_binary": [], "name": "", "owner_id": 2, "period": 64306, "permission": {"permission": 0, "recipients": []}, "ratings": [], "refer_data_id": 0, "referred_count": 0, "referred_time": {"value": 135271087238}, "size": 450068, "status": 0, "tags": [], "update_time": {"value": 135402751254}}
[2026-01-17 16:16:01] INFO: DataStoreSmmServer.get_metas_with_course_record()
[2026-01-17 16:16:01] INFO: unknown: []
[2026-01-17 16:16:01] INFO: get_meta_param: {"access_password": 0, "data_id": 0, "persistence_target": {"owner_id": 0, "persistence_id": 65535}, "result_option": 4}
[2026-01-17 16:16:01] INFO: res: {"infos": [null], "result": {"error_code": 65537}, "results": [{"error_code": 6881281}], "unknown": [{"data_id": 10000000200, "first_clear_date": {"value": 1781058687}, "first_clear_pid": 1781058687, "unk2": 0, "world_record": 40320, "world_record_date": {"value": 1781058687}, "world_record_pid": 1781058687}]}
[2026-01-17 16:16:07] INFO: DataStoreSmmServer.recommended_course_search_object()
[2026-01-17 16:16:07] INFO: unknown1: {"pids": [], "unk1": 1, "unk10": 0, "unk11": [], "unk12": 0, "unk13": 0, "unk14": {"unk1": 0, "unk2": 50}, "unk15": 39, "unk16": 0, "unk17": false, "unk3": 0, "unk4": [], "unk5": 65535, "unk6": {"value": 671076024059}, "unk7": {"value": 671076024059}, "unk8": {"value": 671076024059}, "unk9": {"value": 671076024059}}
unknown2: ["1", "0", "34", "", "0"]
[2026-01-17 16:16:07] INFO: min: 0, max: 34
[2026-01-17 16:16:07] INFO: detected 100 mario
[Dataprovider] Not enough unplayed random courses. Waiting for smmdb.py to download more.
[2026-01-17 16:16:07] INFO: DataStoreSmmServer.get_custom_ranking_by_data_id()
[2026-01-17 16:16:07] INFO: param: {"data_ids": [], "magic": 0, "unk": 39}
[2026-01-17 16:16:07] INFO: get_custom_ranking_by_data_id(course) unknown data_id: 10000000200
[2026-01-17 16:16:07] INFO: RMC failed with error 0x80690004 (DataStore::NotFound)

This happens when trying 100 mario. It says 'waiting for smmdb.py to download more' but there is nothing actually waiting...

@lspepinho
Copy link
Contributor Author

lspepinho commented Jan 17, 2026

Oh, you need to run smmdb.py in another terminal. It downloads all the course stuff (I'll probably remove Proxy because we don't need it anymore)

@mrexodia
Copy link
Contributor

Thanks, that fixed the 'courses' tab, but for 100 mario there is the same error.

Contents of the www folder after waiting: https://mega.nz/file/alAFgK4T#vO1hVLInIgyyckVGQ5RmILySCbYHIcH60kw_piBX8ws

C:\CodeBlocks\SmmServer\NintendoClients>
C:\CodeBlocks\SmmServer\NintendoClients>uv run smmdb.py
CURRENT_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients'
ROOT_DIR='C:\\CodeBlocks\\SmmServer'
SETTINGS_INI_PATH='C:\\CodeBlocks\\SmmServer\\Configs\\settings.ini'
BASE_SMMDB_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients\\www\\smmdb'
BASE_CW_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients\\www\\courseworld'
LISTS_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients\\www\\lists'
TMP_DIR='C:\\CodeBlocks\\SmmServer\\NintendoClients\\www\\tmp'
[CacheManager] Active source: SMMDB
[CacheManager] SAVED: 10000000000
[CacheManager] SAVED: 10000000001
[CacheManager] SAVED: 10000000002
[CacheManager] SAVED: 10000000003
[CacheManager] SAVED: 10000000004
[CacheManager] SAVED: 10000000005
[CacheManager] SAVED: 10000000006
[CacheManager] SAVED: 10000000007
[CacheManager] SAVED: 10000000008
[CacheManager] SAVED: 10000000009
[CacheManager] SAVED: 10000000010
[CacheManager] SAVED: 10000000011
[CacheManager] SAVED: 10000000012
[CacheManager] SAVED: 10000000013
[CacheManager] SAVED: 10000000014
[CacheManager] SAVED: 10000000015
[CacheManager] SAVED: 10000000016
[CacheManager] SAVED: 10000000017
[CacheManager] SAVED: 10000000018
[CacheManager] Failed 5ff451525af07495b3d05b63: 404 Client Error: Not Found for url: https://smmdb.net/api/downloadcourse?id=5ff451525af07495b3d05b63&type=zip
[CacheManager] SAVED: 10000000019
[CacheManager] SAVED: 10000000020
[CacheManager] SAVED: 10000000021
[CacheManager] SAVED: 10000000022
[CacheManager] SAVED: 10000000023
[CacheManager] SAVED: 10000000024
[CacheManager] SAVED: 10000000025
[CacheManager] SAVED: 10000000026
[CacheManager] SAVED: 10000000027
[CacheManager] SAVED: 10000000028
[CacheManager] SAVED: 10000000029
[CacheManager] SAVED: 10000000030
[CacheManager] SAVED: 10000000031
[CacheManager] SAVED: 10000000032
[CacheManager] SAVED: 10000000033
[CacheManager] SAVED: 10000000034
[CacheManager] SAVED: 10000000035
[CacheManager] SAVED: 10000000036
[CacheManager] SAVED: 10000000037
[CacheManager] SAVED: 10000000038
[CacheManager] SAVED: 10000000039
[CacheManager] Updated list new_arrivals.json with 20 new items.
[CacheManager] SAVED: 10000000040
[CacheManager] SAVED: 10000000041
[CacheManager] SAVED: 10000000042
[CacheManager] SAVED: 10000000043
[CacheManager] SAVED: 10000000044
[CacheManager] SAVED: 10000000045
[CacheManager] SAVED: 10000000046
[CacheManager] SAVED: 10000000047
[CacheManager] SAVED: 10000000048
[CacheManager] SAVED: 10000000049
[CacheManager] Failed 5ff451fa5af074b718d05b7f: 404 Client Error: Not Found for url: https://smmdb.net/api/downloadcourse?id=5ff451fa5af074b718d05b7f&type=zip
[CacheManager] SAVED: 10000000050
[CacheManager] SAVED: 10000000051
[CacheManager] SAVED: 10000000052
[CacheManager] Failed 61f4465cb2f07c5c61dc4115: 404 Client Error: Not Found for url: https://smmdb.net/api/downloadcourse?id=61f4465cb2f07c5c61dc4115&type=zip
[CacheManager] SAVED: 10000000053
[CacheManager] SAVED: 10000000054
[CacheManager] SAVED: 10000000055
[CacheManager] SAVED: 10000000056
[CacheManager] SAVED: 10000000057
[CacheManager] SAVED: 10000000058
[CacheManager] SAVED: 10000000059
[CacheManager] Updated list star_ranking.json with 20 new items.
[CacheStatus] Status: Random=20, Uploaded=20, Stars=20 unplayed courses available.
[CacheManager] SAVED: 10000000060
[CacheManager] SAVED: 10000000061
[CacheManager] SAVED: 10000000062
[CacheManager] SAVED: 10000000063
[CacheManager] SAVED: 10000000064
[CacheManager] SAVED: 10000000065
[CacheManager] SAVED: 10000000066
[CacheManager] SAVED: 10000000067
[CacheManager] SAVED: 10000000068
[CacheManager] SAVED: 10000000069
[CacheManager] SAVED: 10000000070
[CacheManager] SAVED: 10000000071
[CacheManager] SAVED: 10000000072
[CacheManager] SAVED: 10000000073
[CacheManager] SAVED: 10000000074
[CacheManager] SAVED: 10000000075
[CacheManager] SAVED: 10000000076
[CacheManager] SAVED: 10000000077
[CacheManager] SAVED: 10000000078
[CacheManager] SAVED: 10000000079
[CacheManager] SAVED: 10000000080
[CacheManager] SAVED: 10000000081
[CacheManager] SAVED: 10000000082
[CacheManager] Failed 5ff451525af07495b3d05b63: 404 Client Error: Not Found for url: https://smmdb.net/api/downloadcourse?id=5ff451525af07495b3d05b63&type=zip
[CacheManager] SAVED: 10000000083
[CacheManager] SAVED: 10000000084
[CacheManager] SAVED: 10000000085
[CacheManager] SAVED: 10000000086
[CacheManager] SAVED: 10000000087
[CacheManager] SAVED: 10000000088
[CacheManager] SAVED: 10000000089
[CacheManager] SAVED: 10000000090
[CacheManager] SAVED: 10000000091
[CacheManager] SAVED: 10000000092
[CacheManager] SAVED: 10000000093
[CacheManager] SAVED: 10000000094
[CacheManager] SAVED: 10000000095
[CacheManager] SAVED: 10000000096
[CacheManager] SAVED: 10000000097
[CacheManager] SAVED: 10000000098
[CacheManager] SAVED: 10000000099
[CacheManager] SAVED: 10000000100
[CacheManager] SAVED: 10000000101
[CacheManager] SAVED: 10000000102
[CacheManager] SAVED: 10000000103
[CacheManager] SAVED: 10000000104
[CacheManager] SAVED: 10000000105
[CacheManager] SAVED: 10000000106
[CacheManager] SAVED: 10000000107
[CacheManager] SAVED: 10000000108
[CacheManager] SAVED: 10000000109
[CacheManager] SAVED: 10000000110
[CacheManager] SAVED: 10000000111
[CacheManager] SAVED: 10000000112
[CacheManager] SAVED: 10000000113
[CacheManager] SAVED: 10000000114
[CacheManager] SAVED: 10000000115
[CacheManager] SAVED: 10000000116
[CacheManager] Failed 59722426f160681a439daa0f: 404 Client Error: Not Found for url: https://smmdb.net/api/downloadcourse?id=59722426f160681a439daa0f&type=zip
[CacheManager] SAVED: 10000000117
[CacheManager] SAVED: 10000000118
[CacheManager] SAVED: 10000000119
[CacheManager] SAVED: 10000000120
[CacheManager] SAVED: 10000000121
[CacheManager] SAVED: 10000000122
[CacheManager] SAVED: 10000000123
[CacheManager] SAVED: 10000000124
[CacheManager] SAVED: 10000000125
[CacheManager] SAVED: 10000000126
[CacheManager] SAVED: 10000000127
[CacheManager] SAVED: 10000000128
[CacheManager] SAVED: 10000000129
[CacheManager] SAVED: 10000000130
[CacheManager] SAVED: 10000000131
[CacheManager] SAVED: 10000000132
[CacheManager] SAVED: 10000000133
[CacheManager] SAVED: 10000000134
[CacheManager] SAVED: 10000000135
[CacheManager] SAVED: 10000000136
[CacheManager] SAVED: 10000000137
[CacheManager] SAVED: 10000000138
[CacheManager] SAVED: 10000000139
[CacheManager] Updated list new_arrivals.json with 20 new items.
[CacheManager] SAVED: 10000000140
[CacheManager] SAVED: 10000000141
[CacheManager] SAVED: 10000000142
[CacheManager] SAVED: 10000000143
[CacheManager] SAVED: 10000000144
[CacheManager] SAVED: 10000000145
[CacheManager] SAVED: 10000000146
[CacheManager] SAVED: 10000000147
[CacheManager] SAVED: 10000000148
[CacheManager] SAVED: 10000000149
[CacheManager] Failed 5ff451fa5af074b718d05b7f: 404 Client Error: Not Found for url: https://smmdb.net/api/downloadcourse?id=5ff451fa5af074b718d05b7f&type=zip
[CacheManager] SAVED: 10000000150
[CacheManager] SAVED: 10000000151
[CacheManager] SAVED: 10000000152
[CacheManager] Failed 61f4465cb2f07c5c61dc4115: 404 Client Error: Not Found for url: https://smmdb.net/api/downloadcourse?id=61f4465cb2f07c5c61dc4115&type=zip
[CacheManager] SAVED: 10000000153
[CacheManager] SAVED: 10000000154
[CacheManager] SAVED: 10000000155
[CacheManager] SAVED: 10000000156
[CacheManager] SAVED: 10000000157
[CacheManager] SAVED: 10000000158
[CacheManager] SAVED: 10000000159
[CacheManager] Updated list star_ranking.json with 20 new items.
[CacheStatus] Status: Random=80, Uploaded=40, Stars=40 unplayed courses available.
[CacheStatus] Status: Random=80, Uploaded=40, Stars=40 unplayed courses available.
[CacheStatus] Status: Random=80, Uploaded=40, Stars=40 unplayed courses available.
[CacheStatus] Status: Random=80, Uploaded=40, Stars=40 unplayed courses available.
[CacheStatus] Status: Random=80, Uploaded=40, Stars=40 unplayed courses available.

@lspepinho
Copy link
Contributor Author

I usually dont test with 100 mario challenge, thank you for testing it, ill fix that bug!

@lspepinho
Copy link
Contributor Author

@lspepinho
Copy link
Contributor Author

Turns out that 100 mario checks for the course 10000000200-00001, so I made a simple copy of an course (and readded difficulties back)

@mrexodia
Copy link
Contributor

Looks like it works, thanks a lot!

@lspepinho
Copy link
Contributor Author

lspepinho commented Jan 18, 2026

Just dont merge it yet, i just found a bug with Nintendo Course World, when I push that, I think it'll be ready to release

@lspepinho
Copy link
Contributor Author

Update: Fixed the bug in manual run, now im figuring it out for PyInstaller

@mrexodia
Copy link
Contributor

You should use uv it works out of the box...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants