Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Microsoft Store Save Compatibility #3

Closed
Swqnky opened this issue Jul 1, 2021 · 5 comments
Closed

Microsoft Store Save Compatibility #3

Swqnky opened this issue Jul 1, 2021 · 5 comments
Labels
enhancement New feature or request

Comments

@Swqnky
Copy link

Swqnky commented Jul 1, 2021

With the release of the game on game pass, it brought a new save format.

The save is a random string of letters and numbers with no file extension located in C:\Users\{user}\AppData\Local\Packages\DANGENEntertainment.BugFables_zfxw8h9xxzgzt\SystemAppData\wgs\, then inside two userID folders within wgs\.

When opened in Notepad++ it seems like the flags are stored mostly in plaintext, but I also don't exactly know what I'm doing so I can't be certain. I know this is probably a very niche request but I'll help in any way that I can if you have the time to work on it. I'll paste the plaintext below and also attach the save file itself if you want to poke around at it.

Thanks a lot for your contributions to the Bug Fables scene!

Here is the save file

�   �UpArrow
DownArrow
LeftArrow
RightArrow
C
X
Z
V
Escape
Return
0
False
1
False
False
0.4
0.5
True
0
False
2
0
2
1
0.5
0
-1
True
False
-55
-55
-55
-55
-55
-55
-55
-55
-55
-55
False
False,False,False,False,False
2
FalseŒr-2,0,8.5,False,False,False,False,False,False,Test
0,7,7,7,2,2,0,0@1,9,9,9,2,2,0,0
1,0,100,10,10,0,16,0,5,5,10,35,0,2,36,0
0,1,7,12,30@19,6,9,43,42
0,1,7,12,30@19,6,9,43,42
0@11,0@0
0@27@

4,-1@5,-1@1,-1@0,-1

False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False@False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False@False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False@False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False@False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False
False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,True,False,False,True,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False
Explorer Permit|SPLIT|the|SPLIT|letterprompt,10,-11,-158,8|SPLIT||SPLIT||SPLIT||SPLIT||SPLIT||SPLIT||SPLIT||SPLIT|Test|SPLIT||SPLIT||SPLIT||SPLIT|
3,1,0,0,0,-1,0,0,0,0,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9500,4500,0,0,0,0,0,0,0,8,0,0,1,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False
False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False

0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@1,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0@0,0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ```
@aldelaro5
Copy link
Owner

As I said on Twitter I am taking a hiatus from working on Bug Fables things, but I actually can at least point people in the right direction should they choose to make a pr to support it (since I will be able to review PRs).

The file begines with 04 00 00 00 D7 01. Following that is the content of config.dat which is always 43 lines. After that, you have an 8C and then following that, the 18 lines of the save (I assume it's save0.dat, I wouldn't be surprised if save1.dat was following that and then save2.dat with the 8C separator).

This can be a challenge to support: the save editor doesn't support editing config.dat (it could be argued it's in the scope of the project to do that though) and when you write the file, the save part is a partial part of the file. What this means is unlike on pc where you write the whole file with XOR encryption, here, you have to write a part of the file with NO ENCRYPTION.

Maybe we should consider adding support for config.dat because it's part of the persistent storage of the game. I unfortunately haven't researched what line is which though, but you can figure this out by checking the game's code. If you were to add support, then you could offer the option to CREATE a new microsoft store save format because currently, you can't: config.dat isn't supported, you would only be able to EDIT an existing one.

For the record, the switch save format also operates with different files, it's just that they aren't encrypted and they have a different header, but the rest are the same.

So yeah, that's all one would need to know to add support to this.

@aldelaro5 aldelaro5 added the enhancement New feature or request label Jul 1, 2021
@aldelaro5
Copy link
Owner

As Bug Fables was removed from gamepass, this feature is not as needed.

However, I will not close this issue because there have been some cases where people still wants to load up their save file from gamepass and convert it to standard pc save. The procedure to do it is a little weird, but it is possible for me to come up with something.

FYI, the first starts with some sort of binary header, followed by config.dat followed by some kind of separator followed by save0.dat in the standard format as outlined here: https://github.com/aldelaro5/Bug-Fables-Internal-Docs/blob/master/Data%20format/Save%20File%20Format.md . The only difference is that the file isn't XORed like it is on standard pc.

It is possible to manually convert the file which is what I have been doing by copying the piece of it that is the save file. You can need to load the save without XORing which the editor doesn't support currently and it will parse all well.

I need to do some renovation work on this project, having the ability to load without XORing is going to be a thing before the full conversion feature.

@aldelaro5
Copy link
Owner

Update on this: implementing reading from this format is easy and will be done.

Exporting to it however is very complex and may not be possible because of the complexity involved. It is DEFINITELY not possible to create a blank one, but the question of whether modifying an existing one is possible remains.

It's the last feature I want before the next big release so I will look into it, but the reality is this version is by far the worst version of the game (it has known major issues) and its save format is probably the worst because it's so encoded upon layers of weirdness. Even the switch format is really easy to deal with: it just uses BinaryReader/BinaryWriter encoding, but the xbox pc one is not just the blob (the file you can read the file from), it also involves a container which has an outer structure too and these structures have moving parts that aren't as well documented.

Basically, expect reading from, don't get your hopes up for writing to and definitely do not expect creating blank saves in this format.

@aldelaro5
Copy link
Owner

Ok last update before I implement this (and release, I actually plan to release p soon after I setup this + potential avalonia upgrade + setup CI).

It's basically a mixed bag, but I can confirm reading will be 100% supported as well as updating an existing save.

I did some digging and I found a VERY useful thread by someone who was working to reverse the format for No Man's Sky: goatfungus/NMSSaveEditor#306

There are only a few things I knew that they didn't, but most of it is essentially as much as I could gather and they also performed more testing than me that proves/disproves some stuff. With all this info, I was able to come up with how this system works at a high level, what we can do with it and what are the practicality of doing so. I'll give only a high level explanation so people can understand, but feel free to check the issue I posted above for the full details.

How the format works

Your files are located at %LocalAppData%\Packages\[gameName]\SystemAppData\wgs\[xuuid]_00000000000000000000000072AA0689\ where:

  • %LocalAppData% is your AppData's local folder that lives under your Windows user. For those who don't know, inside your user's folder, you have an AppData folder that is hidden by default (you need to go into Windows explorer settings to show it or alternatively, you can windows + r and type %LocalAppData% which will open it for you).
  • [gameName] is the same for everyone and in this case, it is DANGENEntertainment.BugFables_zfxw8h9xxzgzt. Pretty self explanatory.
  • [xuuid] is your xuuid which is a unique identifier associated to your user. It is NOT your gamertag. You can actually look it up using this webapp someone made from your gamertag: https://www.cxkes.me/xbox/xuid. The part after the underscore is unknown, but the issue above indicates they don't change so we don't care about them.

From there, it starts to get tricky, but basically, an xbox save file is made up of containers which can contain one or more blobs which contains the data. Fortunately (or unfortunately as we'll see shortly), bf made this super simple: there's only one container with one blob containing all the 4 files persisted by every versions (config.dat and the usual 3 saves files).

So if you piece together what the issue above says, we essentially have only 3 files involved in this whole thing that are in a structure like so:

> container.index
> [containerName]
--> container.[num]
--> [blobName]

The container.index has some unknowns in its file, but more importantly, it contains 2 pieces of information to resolve the contrainer: its name (that 16 bytes folder name is its name) and its number (which is the suffix used in the inner container file). This means these 2 info MUST match the structure.

Once you get into the inner folder though, it's easy: the container.[num] file is fully known and it contains the blobName (another 16 bytes hex name) which is ultimately where the good stuff is.

The encoding is super simple: start with a uint32 with a value of 4 and then do a BinaryWriter.Write(string) encoding for the data starting with config.dat then the save data in order.

What this all means?

Gathering all of this leads me to some observations:

  • We can very easily create the container.[num] and the blob from scratch (the names could be random uuid), but the container.index is impossible to create: there are way too many unknowns with it. I am suspecting there's some kind of handles or timestamps which the only way you could get what those are would be to reverse the sdk which is not only time consuming, but it has kinda bad legal implications that I honestly don't want to deal with (see practicality section below). So basically, creation is not possible.
  • Converting a save to a blob's segment is possible: there's nothing that would prevent me from converting a switch or standard pc save to xbox's blob segment...but it's not useful on its own because you need a whole valid blob and this creates problems (see practicality section below).
  • Contrary to what many might think: there are no ms side checksums or encryption done to the containers or the blobs. They're just weirdly encoded and most of what matters to me is something I can partially work with. This means there are no reasons to believe that if you were to surgically edit the blob segment with your file and you make sure that the saves after are shifted correctly that the game wouldn't accept it. In fact, the issue above suggests there's no reasons it wouldn't accept it. This makes updating an existing save possible AND practical as long as you make sure the filename of your existing blob and the one your replace with are matching (since container.[num] is looking for it).

So basically, creation from scratch is not possible, reads is 100% doable, conversion to is possible (with caveats) and updating existing save is doable.

However, we need to talk practicality for a moment.

Practicality and final conclusion

Let's face it: this version is the worst version of the game to buy short of those cloud gaming ones because it is known to have at least 2 major issues and I am not gonna lie, one of the main reasons I want to implement AT LEAST reading the file is because I had to manually convert like 5+ people's saves so far since they wanted to migrate AWAY from it in part due to the game no longer being on game poss.

What I mean is that not only converting a save TO this format isn't just not popular in demand, it's also less practical: I always would not recommend to buy this version over the MANY other ones that don't have such problems EVEN if you buy it on switch (requires homebrew to edit saves) or ps4 (which I have no samples of to test and definitely requires homebrew). Creating a save from scratch in this format is even worse considering this.

Given everything, it's not worth the effort investing in save creation. THAT BEING SAID, it is also not worth to convert TO, but this is also because there's an additional complication.

When I said the structure of the blob is too simple, it's because it combines your config.dat and ALL THREE save files into one. This means that if you want to CONVERT from pc/switch to xbox pc, what do I do to generate the blob? Do I give you a default config which clears all your settings? Do I leave the other 2 saves blanks which might delete them if you replace the blob file? It's such a different structure that it basically means the most reasonable way to accommodate it is to build a module SPECIFICALLY to generate this format with 3 different save editor sessions and it has to be AFTER I get done a config editor which is already platform specific to start with...

So it's a lot of effort for very little gain. THAT BEING SAID, there is however one usecase that this doesn't apply: updating an existing save. If you load an xbox pc save, edit it, it is actually not hard to save it back in the same blob with your edits. The most complications are ensuring the save data after the one you edit are shifted correctly, but the rest is the same. All it would need is to have the format class remember the state at which you read the file and use that info to write the new data correctly on save. This is something I am fine to implement even the low practicality because it's relatively low effort and I want to implement reads anyway so might as well.

So to conclude:

  • Reading from a save data will be supported (a prompt will appear for you to choose which save file to load) and once loaded, it is possible to convert it to the other 2 formats.
  • From xbox pc to xbox pc is supported only by updating the existing save using the information gathered when it was loaded. This will be awkward for browsers until WASM save file picker polyfill for Firefox AvaloniaUI/Avalonia#11085 gets merged, but I can show a prompt to tell you what to do.
  • Creating from scratch an xbox pc save is NOT going to be supported
  • Converting a non xbox pc save to xbox pc is NOT going to be supported

There, hopefully I can release within a week :)

@aldelaro5
Copy link
Owner

This is now supported as of 1.0.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants