Jump to content

Suspiria

Members
  • Posts

    226
  • Joined

  • Last visited

Posts posted by Suspiria

  1. On 7/13/2020 at 2:39 AM, R315r4z0r said:

    I don't like any of the commander aspects of the game. I think it removes a large part of the appeal of Renegade's multiplayer. That is to say, we are a team and we all work together, communicate, strategize and execute as a team. Yeah, sometimes some voices end up as the 'commanding' voice, but that all happens during a match.

    I have fond memories of multi-hour matches in the original Renegade where you just form bonds with your teammates. You learn each other's strengths and begin to trust in the ideas of others. If someone was in that match for 2 hours and they had to leave, you actually felt the weight of that.

    The commander functions completely remove this aspect from the game. Paired with the increased pace given in the game's balance, there simply is no more room to form those bonds on the fly. Now, you're either a commander and the weight is on you, or you're a no body and should just shut up and listen.

    And to be completely honest with you, 90% of the time I just completely ignore anything the commander does or says. It's spam as far as I'm aware.

    Hmm, interesting perspective.

    Quite a few people here call those multi-hour matches "stalemates", and strongly prefer to play more than one map/match in their two hours of free time.
    Myself included.

    However I really do understand just how it feels to be in never-ending matches.

    Back in 2005, I've experienced these 40+ hour battlegrounds in World of Warcraft.
    I'd go to sleep, wake up in the morning, go to school, come back home,.. and then the same battle was still going on.
    And many of the exact same people were there again, just like me. As if nobody had a RL; we had our own little world.
    I've never understood exactly why it felt so epic, but I've always longed back to those days.

    At the same time it was also (one of) the world's first MMORPG battleground with 40x40 players in one little spot. Completely unique to its time.
    Having said that, I do think that some nostalgia can be based on false attribution, where one (mis)associates such freshness and uniqueness with less or even ir-relevant game traits. Then later when you think back of those less relevant game traits, those emotions and memories that were coupled arise again aswell.

    Now, I'm not necessarily saying that such a dynamic on its own would fully explain why I don't feel the same way about Renegade-X as you do.

    What happens to me in a nutshell is that I start feeling braindead/bored out of my mind with the non-stop field battles where little else happens except pushing back and fort a little. There's little to no purpose to destroy the other tank, because he'll just get a new one and be back in <2min. Why even bother?

    The only way to win such a game was to... well: wait until the other party tires enough that they make some stupid mistake in defense.
    Possibly because their top defender(s) had enough and leave(s) the game and nobody effectively takes up their spot(s).
    And then you would capitalize on that mistake and the game finally ends, yeeey.

    In other words: without leadership, to me it feels like both teams are just trying to bore/tire each other off the battlefield.
    And in the meantime have some fun shooting each other with all kinds of stuff, ofcourse.
    But that's just that, after a while. And only that, is not really my idea of excitement. Which I do seek in videogames.

    I don't just want to win the battle with the other tank.
    I also want to win the war.
    And I don't always have, or want to invest, 5 hours to do that.
    Especially if there are so many great maps to play.

    Please do keep voicing your opinion however (perhaps in another topic; not sure if such a discussion would fit here), because I'm still quite curious as to what exactly makes some people long back to OldRen dynamics so much, other than possibly some false attribution here and there.

    Because sometimes there are actually still some great (sometimes very subtle) elements in OldRen that definately do fit into RX.
    Such as the recently added smooth camera movement getting in and out of vehicles, to give you a tiny example. I love it!
    And perhaps one day we'll find a way to make the sky go red on a nuke, and make it rain with the ion. Stuff like that would still be totally legit. (if enough ROI)

    Those are unseen/forgotten dynamics that people don't always know how to articulate, but together all those things do create a certain "feel" or even "vibe".

    And I wonder if one day RX will be able to better approach that "feel" of OldRen, without having to surrender its own modern, progressive soul in the process.
    (which is a real fear of some RX ppl, and understandably so)

  2. Thanks!!

    Possibly some extension indeed.
    I tested only reading with the other browser, not posting.

    Spoiler

    hmm it's not doing it now

    Spoiler

    function NotifyConnectionError(EProgressMessageType MessageType, optional string Message=Localize("Errors", "ConnectionFailed", "Engine"), optional string Title=Localize("Errors", "ConnectionFailed_Title", "Engine") )
    {
        local WorldInfo WI;

        TickCounter++;
        if (TickCounter < 1200) return;      // Plenty, for testing this fix. Can be reduced later for sooner reconnecting.
        TickCounter = 0;

        if(bKickMessageRecently && Title != "Kicked") {
            ConsoleCommand("Disconnect");
            `log(`location@`showvar(MessageType)@`showvar(Message)@`showvar(Title));
            return;
        }

        if(Title == "Kicked") {
            bKickMessageRecently = true;
        }

        WI = class'Engine'.static.GetCurrentWorldInfo();

        `log(`location@`showvar(MessageType)@`showvar(Message)@`showvar(Title));

        if (WI.Game != None)
        {
            // Mark the server as having a problem
            WI.Game.bHasNetworkError = true;
        }

        class'UTPlayerController'.static.SetFrontEndErrorMessage(Title, Message);

        // Start quitting to the main menu
        `RxGameObject.LANBroadcast.Close();
        if (UTPlayerController(Outer.GamePlayers[0].Actor) != None)
        {
            // Reconnecting as part of the sound-bug fix
            ConsoleCommand("Reconnect");        
    //        UTPlayerController(Outer.GamePlayers[0].Actor).QuitToMainMenu();
        }
        else
        {
            // stop any movies currently playing before we quit out
            class'Engine'.static.StopMovie(true);

            // Call disconnect to force us back to the menu level
            ConsoleCommand("Disconnect");
        }
    }

     

  3. I've been further validating my reproduction setup:

    • indeed I cannot reproduce it with the 32-bit client
    • symptoms match up to the tiniest detail

    This isn't watertight, but it does make it very likely that I'm reproducing the exact same bug.
    I mean, that's a start, right? 😁 (joking. this is actually the most important part imo.)

    So here is my new research on the causal level:

    Spoiler

    I've temporally and logically isolated the bug.
    With that I mean both "(milli)seconds after/before" and "after/before script statement(s)".

    From there I've arrived at the following conclusion which I will explain as good as I can:

    The server tells the client: "Hey bro, your plane is about to depart. Start packing your stuff and take out the last garbage."
    And because of this message, the client then sort of expects the server to travel NOW, not tomorrow, and starts cleaning up.

    ServerTravel -> ProcessServerTravel -> ProcessClientTravel -> PreClientTravel+ClientTravel -> (NATIVE) PlayerController::ClientTravel -> ... -> Browse()

    It is at that point of/after Browse(), that the x64-client seems to prematurely mark the current map/datastores as "allowed to be garbage-collected" for some reason. Then after an arbitrary amount of seconds, a routine (periodic) GC sweep kicks in and does the dirty.

    The problem with this is that there is a holy rule in UE that there MUST always be some kind of a map loaded.
    Hence they invented seamless travel, using a so-called transition map such as the empty, pitch-black map EnvyEntry.udk
    Which we have disabled because of afaik were major issues. (crashes?)

    "The reason the transition map exists, is that there must always be a world loaded (which holds the map), so we can't free the old map before loading the new one." (Source)

    So it makes sense that (part of) our engine crashes if the current map is prematurely GC'd.

    It's a little bit similar to prematurely clearing out the last food from your refrigerator the last night before going on holiday, only to find that you really still needed that as breakfast before moving to the airport.

    And this is the suggested workaround:

    Spoiler

    Now, what I've found is that the current map is NOT garbage-collected prematurely if the client ISN'T being informed explicitly of the travel. Therefore the sound-bug is NOT produced in this particular situation.

    To do this, in ProcessServerTravel (Rx_Game.uc), add the following and also comment out the following.

    So that it looks like this:

        foreach WorldInfo.AllControllers(class'PlayerController', P)
        {
            if ( NetConnection(P.Player) == None )
                LocalPlayer = P;
        }
    //    // Notify clients we're switching level and give them time to receive.
    //    if (TravelURL != "") {
    //        LocalPlayer = ProcessClientTravel(TravelURL, NextMapGuid, false, bAbsolute);
    //    }
    //    else {
    //        LocalPlayer = ProcessClientTravel(URL, NextMapGuid, bSeamless, bAbsolute);
    //    }

    What will happen now, is that the client won't know what hit 'em when the server switches maps.
    But! In Rx_GameViewportClient, it does get continuously (every tick) notified of a connection-error in NotifyConnectionError.

    In it's current state, the latter client-side error-function would immediately do a ConsoleCommand("DISCONNECT") to return the client to the main menu.  ....but we could make it so, that it first attempts to reconnect for a while before eventually returning.

    Unfortunately, simply replacing ConsoleCommand("DISCONNECT") with ConsoleCommand("RECONNECT") here is not enough. As in that case it will still end up prematurely calling Browse() at the very first sign of the server switching, thereby dooming the client. Since the continuous calling of NotifyConnectionError-call already starts as soon as the server closes the client connections pre-travel.

    Therefore we need to devise a workaround that delays that reconnect-procedure client-wise, up until the moment that the server is ready to immediately accept the new connection.

    Had Rx_GameViewportClient been a descendant of Actor, then perhaps one would immediately think of a timer-function. But in this case we can store WorldInfo.TimeSeconds upon receiving the first call to NotifyConnectionError, and from there on with each subsequent call check if enough time has elapsed yet to initiate the reconnect.

    Here are the code adjustments for Rx_GameViewportClient.uc:

    Spoiler

    var int FirstConnError_TimeSeconds;

    function NotifyConnectionError(EProgressMessageType MessageType, optional string Message=Localize("Errors", "ConnectionFailed", "Engine"), optional string Title=Localize("Errors", "ConnectionFailed_Title", "Engine") )
    {
        local WorldInfo WI;

        if(bKickMessageRecently && Title != "Kicked") {
            ConsoleCommand("Disconnect");
            `log(`location@`showvar(MessageType)@`showvar(Message)@`showvar(Title));
            bKickMessageRecently = false;
            return;
        }

        if(Title == "Kicked") {
            class'UTPlayerController'.static.SetFrontEndErrorMessage(Title, Message);
            bKickMessageRecently = true;
        }
        else if (MessageType == PMT_ConnectionFailure // PMT_SocketFailure?
            && FailoverURL != "") {
            // Try to failover
            if (Outer.GamePlayers[0].Actor != None) {
                `log("Engaging failover to URL:"@FailoverURL$"!");
                Outer.GamePlayers[0].Actor.ClientTravel(FailoverURL, TRAVEL_Absolute);
            }
        
            // Clear failover
            FailoverURL = "";
            return;
        }

        // Return to main menu when it's a "real" DC
        if (Message == "Your connection to the host timed out") {
            `log(`location@`showvar(MessageType)@`showvar(Message)@`showvar(Title));
            class'UTPlayerController'.static.SetFrontEndErrorMessage(Title, Message$".");
            ConsoleCommand("Disconnect");
            return;
        }

        WI = class'Engine'.static.GetCurrentWorldInfo();

        if (FirstConnError_TimeSeconds == 0 && !bKickMessageRecently) {
            FirstConnError_TimeSeconds = WI.TimeSeconds;
            return;
        }

        // SOUND BUG FIX
        // How long does the slowest server need to switch maps?
        // For now, we set this to plenty of time for testing purposes. (24 seconds)
        // IF this experiment proves to be a fix, then don't forget to tweak this value down towards about 15-21 seconds.
       // Until complaints return and then you backpedal for a stable margin, which is preferably also a little bit future-proof.
        if (WI.TimeSeconds - FirstConnError_TimeSeconds < 24 && !bKickMessageRecently) {
            return;
        }

        `log(`location@`showvar(MessageType)@`showvar(Message)@`showvar(Title));

        if (WI.Game != None)
        {
            // Mark the server as having a problem
            WI.Game.bHasNetworkError = true;
        }

        if (UTPlayerController(Outer.GamePlayers[0].Actor) != None && Title != "Kicked" && !bKickMessageRecently)
        {
            // Reconnecting as part of the sound-bug fix
            ConsoleCommand("Reconnect");        
    //        UTPlayerController(Outer.GamePlayers[0].Actor).QuitToMainMenu();
        }
        else
        {
            class'UTPlayerController'.static.SetFrontEndErrorMessage(Title, Message);

            // Start quitting to the main menu
            `RxGameObject.LANBroadcast.Close();

            // stop any movies currently playing before we quit out
            class'Engine'.static.StopMovie(true);

            // Call disconnect to force us back to the menu level
            ConsoleCommand("Disconnect");
        }

        FirstConnError_TimeSeconds = 0;
    }

    So for now, the code changes that I've presented here offer a true workaround on my reproduction setup (without Vista fix) and is imo very much worth a try. The Vista fix oddly enough also works for me, while not for some others. So, fingers crossed that that doesn't mean that it's a different bug. Yep, that's scary.

    Direct result:
    No more sound bug. Map switching works great.
    Nothing critical changed as far as I can see from here.
    Triple-checked mapchange, restart, kicked, true DC.

    Side effects:
    It does break the recently added Failover functionality, which would ordinarily respond to such a connection loss.
    But! If you scroll down this thread, you'll find that I've later added an Rcon command and properly integrated this fix with the FO.

    These changes have been thoroughly SDK-tested with Dedicated + PC-client + Laptop-client.
    I cannot guarantee the working of the fix, but it should at least NOT break the game after rollout.

    This workaround comes from an even more informed position than the other two attempts, and has a decent chance at resolving the issue.

    ...

    ... and if not we'll just write a new engine. 🤣 (sarc)

    • Like 2
    • Thanks 2
  4. On 1/14/2020 at 10:44 AM, SonnyX said:

    Can you try with Windows Vista compatibility mode instead?

    OK. So while the Vista compatibility mode does eliminate the bug on my repro,...
    ...and I also not once had the bug again personally on retail...  ...it does not seem to be a universal fix.

    As at least one person has now explicitly reported having encountered the bug once in Vista mode.
    And others were talking about a "reduction", meaning the bug still occurs.

    I therefore assume this is not the fix we're truly looking for.
    So that's good to know. Onwards....

    On 3/8/2020 at 7:34 AM, StoneD said:

    I think both of those options are unachievable or not worth the effort or money. If I recall correctly, it was discovered that seamless was the reason for a lot of crashes between maps. And there's not really much faster we can go, personally I host the AllNoobs renx server on ramdisk and the process has complete access to cpu, there's only so fast that it will get. I think we are pretty much at that peak unless we invest 100+$ more into our monthly bills.

    Yes I hear you.
    So, I've continued tracking down the bug again. :) 

  5. 12 hours ago, SteelEagle said:

    I appreciate the concern. I ran a full system scan with Bitdefender and nothing. I ran a scan with windows defender and nothing. I ran a scan with the link you provided some things about steam, 2 games and my gaming headset were listed as suspect. The games that were suspect were ones that I haven't updated in awhile. My headset and the usb connector are always making online connections back and forth when from discord . I think what happened is that BD was in need of an update and restart. I launched the game before this update happened. I have launched the game after the update and I haven't seen that warning since. If you downloaded BD after my post then yours would've been up to date automatically. Thats probably why you didn't get the same warning I got. 

    Alrighty then. Glad you're safe. :) Enjoy!

  6. 3 minutes ago, StoneD said:
      Reveal hidden contents

     

      Hide contents
      Reveal hidden contents

     

     

    I just used it the other day and I don't see an issue with it. Haven't heard of anyone having issues before. Try clearing cache/cookies for the forums and see if that helps.

    Thank you for testing.

    Well, I double-checked this with a clean browser.
    It's server-side code injection, possibly tied to my account only.
    There's no other explanation.

    Let's see if it happens a 3rd time.

    Thanks again.

  7. On 7/7/2020 at 10:29 PM, N4CR said:

    Thanks I'll give it a shot. Figured out how to restore sound without restart - disable/renable the sound device in win7 sound control panel/mixer. It consistently takes out sound for entire OS... which is really, really weird I've almost never had that happen and I fixed PCs for 5-6 years...

    This bug also pops up in conjuction with a 'cant spawn bug' where it gives 'Insert something text here' overlay and all controls are randomly reversed and you are stuck in spectator mode.... they are often related. 

    Will report back with testing, however seen some use this fix and still get the bug so praying it fixes it for me.
     

    Cheers

    EDIT: Ah, I thought you ment without restarting Renegade-X. That would've been a very valuable find.
    Anyway yes this one is beyond tricky to fix. Many a dev went in and NEVER returned.....

    • Sad 1
  8. What happened to the forum spoiler code?

    Last time that I made a spoiler, it inserted a huge "nerdy" emoticon.
    And today, it inserts multiple white button-up white-collar shirts. Pages long.

    When I open the same spoiler with another (clean) browser, same view. Seems server-side.
    Has the webserver been hacked, or did I make enemies lol.

    1.png

  9. On 7/9/2020 at 11:44 PM, SteelEagle said:

    I have a handful of games that I play and that was the first time something like that came up.

    Once more thank you for your quick, kind, and professional response. 

    Yes, I understand. I would've double-checked it too.
    You're quite welcome.

    EDIT: I would've loved to end this conversation on that high note, but something still bothers me about your situation.

    There are still a couple of unknown variables here:
    1. If this is a false-positive, why am I not getting it too? (since I now also run BitDefender with Steam)
    2. The warning is extraordinarily concise, specifically claiming an encryption process. (on a simple log file..)
    3. I've thoroughly searched the Launcher code, and as far as I can see it does not deal with local Steam files at all.
    4. Viruses are known to inject malicious code into other - innocent - running processes, shifting blame to the latter.
    5. Ransomware goes after documents and images first. .txt files will likely fall under that umbrella.

    Depending on your personal level of neuroticism, I would suggest you consider that offline backup and to proceed carefully.
    The Renegade X files are probably clean, but I cannot fully guarantee that the rest of your computer is too.

    Perhaps you'd like to have a look at a more thorough scan, just to make sure.
    Better safe than sorry.

    Up to you.

  10. 5 hours ago, SteelEagle said:

    I use Bitdefender. The details are as follows. The process C:\Program Files (x86)\Renegade X\Launcher\Renegade X Launcher.exe manifests ransomware behavior and was blocked. Several files were encrypted by it and we couldn't automatically restore all of them. You can find the files to be restored below.

    The file in question is connection_log_7777.txt C:\Program Files (86)\Steam\logs

    Yes I run steam all the time my AV has no problem with it. 

    To make sure: upload your "Renegade X Launcher.exe" file to VirusTotal and report back the result.
    Also, for your safety, I have installed BitDefender myself to check for a false-positive.

    Under no circumstance does mine warn of ransomware.

    However, it is acting triggerhappy on other (online) files which could not be more clean.
    So that already tanks my trust in BitDefender as to not play on the customer's fears.

    Which version of BitDefender are you using exactly?

    Kindly be reminded that today's ransomware attacks are overally decreasing and also shifting to businesses.
    Nevertheless, do take precautions such as making an offline backup of your most sensitive or valuable files.

    IF ever you fear or suspect an active ransomware encryption process: hibernate the machine.
    Then unplug the power and calmly yet timely seek professional assistance. Do NOT reboot or shutdown.

    Renegade X's Launcher does indeed interact with Steam.
    In what way I don't know, but this is obviously a false positive. 🙂

    • Like 1
    • Thanks 1
  11. On 7/8/2020 at 6:47 AM, PembolongSabun said:

    It seems that a problem occurred while patching. (in the extraction phase)
    Does your computer have plenty of disk space on the drive letter to which you're installing?

    If there is, then open up the spoiler.

    Spoiler
    We could start with the following:

    1. Temporarily disable your antivirus
    2. Right-click Renegade X Launcher.exe and click Run as administrator
    3. In the Launcher, navigate to "Settings" in the upper-right corner and click "Verify game integrity"
    4. Wait for it to fully finish
    5. Reenable your antivirus

    If this doesn't help, please submit the new Launcher log(s).
    And also find and upload your UDK log from the Renegade X\UDKGame\Logs folder.

     

  12. On 7/8/2020 at 7:54 AM, Kaylock said:

    the Launcher fails on all fronts, just a Spiny loading wheel then nothing, not even in the task manager.

    Try deleting the contents of the folder %localappdata%\Totem_Arts.
    While leaving the "Totem_Arts" folder itself in place.

    Please do let us know if this solves the problem for you.

  13. We at Folding@Home have now surpassed 1 exaflops.
    That is five times the world's fastest supercomputer, which is the Summit from Oak Ridge National Laboratory @ a mere 200 petaflops.

    We are killing it.
    And I can say "we", because that's just the way this works.

    One more thing: if you want to support both the Rosetta project aswell as F@H, this can be fully automated.
    To do so, follow these instructions:

    Spoiler

    Open up F@H "Advanced Control" from the tray icon.
    Configure -> Advanced -> Folding Core Priority, set this to "Slightly higher"

    Now open up BOINC manager -> Computing preferences -> Suspend when non-BOINC CPU usage is above X%"
    Set this to 25% or 40% so that Rosetta will turn off when and as long as F@H has WU's.

    Thanks again, and I wish y'all a good health.

    • Like 1
  14. On 3/19/2020 at 4:47 PM, Sarie said:

    I think you guys are really missing the point. Ideally this system would just be used by people who already play together or for people who are learning the game and are playing with someone. There is no auto match system, people only join from getting invited and accepting the invite, it should be used with people who intend to play together or coordinate. Squads are a catalyst for allowing easier coordination for people who aren't pro.

    Yeah I definately am missing your point.
    Thought we were here to do a lil brainstorming on a Squad Mechanic. 😋

  15. Great!

    I've been doing work on FAHViewer as it kind of broke in the last patch.
    Instead of showing you a demo proteïn it now actually connects to the WU's and will show you what's actually happening inside the core.

    Also I've made some performance tweaks and there will be an official release soon.

    On 3/17/2020 at 4:51 PM, Demigan said:

    I'm on Folding@Home now. Thought it would be appropriate to watch some origami on my phone while it happens ;)

    Yeah it's kind of advanced origami.

    You can also use your brain instead of your PC.
    Are you smarter than your computer?

    • Like 1
  16. 6 hours ago, Sarie said:

    Possibly 32 people on voice chat... disorganized screaming and yelling.. imagine pug voicechat but 10x worse. I don't want team-wide voice chat.

    That's true.

  17. UpdateDue to batshit crazy success, Folding@Home is now usually out of work units.  /APPLAUSE
    There is now more grid processing power than there is research.

    Supercomputers cannot beat this kind of infrastructure! It is really a myth.
    They're not quite compatible and at the end of the day orders of magnitude slower than our collective grid. Not to mention expensive.

    For you diehards I recommend installing both Rosetta and F@H and setting F@H to have slightly higher priority in advanced settings menu.
    If you tell Rosetta to only run at <40% CPU load, then it will automatically take over when F@H is out of WU's again.

    Cure's on its way. Let's keep it up!

    • Like 1
  18. 6 hours ago, Sarie said:
    • command-based system for joining, inviting and leaving squads

    + Client toggleable option: Auto-join/exit commander's squad while (not) in xx ft. proximity of commander for >yy seconds.

    Enabled by default, this may subtly attract players to commanders due to a sense of belonging.
    And puts that tiny bit of social pressure on commanders to actually lead.

    4 hours ago, Sarie said:
    • squad exclusive text channel (pink chat)

    As a defender worth my salt I also need to know what & when our attackers are doing.
    And as a mid-fielder, especially if radio's would also be rerouted, I'd want to monitor ALL channels for the same reason.

    So if you mean "exclusive" beyond color here, then this could easily backfire on teamplay and thus needs to be carefully thought-out.

    7 hours ago, Sarie said:

    Other ideas include voice chat for your squad

    Giving squads their own comms, especially voice chat channels, may end up feeling like "splitting up the group" again.
    There would no longer be that populated feel where one's plugged into everything that happens across the map, socially speaking.

    You will miss things.
    Cheerful screaming, funny moments, rages....

    Which would you rather have:
    "Ooh you weren't on? Everyone sang happy birthday for Sarah on <other server> last night! She was elated!"
      -VS-
    This apparently having happened right under your nose on the same server but you weren't in that channel so you'll still feel like an outsider while you were actually right there playing with them. (They were in your team for Christ's sake.)

    I know which poison I'd pick.

    7 hours ago, Sarie said:

    What do you think is the best way to go about this? Does it even sound worth finishing and implementing? Please let me know.

    Consider the commander-proximity auto-join/exit after yy seconds idea to get a feel for how it would be.
    If that proves successful, you'll know at that point how far you want to take this.

    That, is my recommendation.

    DISCLAIMER: I make mistakes like everybody else so my recommendations may or may not be useful.

  19. Folding@Home is now fully operational and distributing SARS-CoV-2 workloads.
    Due to the urgent nature, documentation always follows workload distribution thus may at some point be unavailable.

    If you're getting other numbers than above range, input them in this box: https://apps.foldingathome.org/project

    If it says "unspecified", or nothing at all: it's for COVID-19.
    Anything that is not clearly documented to be for anything else can be safely assumed to be so aswell.

    Keep up the good work!
    You're helping thousands. ❤️

×
×
  • Create New...