Skip to content

Commit 937d4fd

Browse files
7.2 Updates (#1330)
* Update RaptureAtkModule * Update AgentInterface * Update AtkUnitBase * Update UIModule * Update UIModuleInterface * Update RaptureAtkModule again * Update AgentModule * Fixes * Update UIState * Update ConfigOption * Update LovmRanking * Fix AgentInterface vfuncs in data.yml * Revert "Fix AgentInterface vfuncs in data.yml" This reverts commit 1268818. * Fix AgentInterface vfuncs * Update PvPProfile * Update PlayerState
1 parent 3c111cd commit 937d4fd

File tree

13 files changed

+946
-924
lines changed

13 files changed

+946
-924
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
namespace FFXIVClientStructs.FFXIV.Client.Game.UI;
22

33
// Client::Game::UI::LovmRanking
4-
[StructLayout(LayoutKind.Explicit, Size = 0x1C40)]
4+
[StructLayout(LayoutKind.Explicit, Size = 0x1C3C)]
55
public struct LovmRanking;

FFXIVClientStructs/FFXIV/Client/Game/UI/PlayerState.cs

+58-58
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Game.UI;
66
// Client::Game::UI::PlayerState
77
// ctor "E8 ?? ?? ?? ?? 33 D2 45 33 E4"
88
[GenerateInterop]
9-
[StructLayout(LayoutKind.Explicit, Size = 0x8B0)]
9+
[StructLayout(LayoutKind.Explicit, Size = 0x8C0)]
1010
public unsafe partial struct PlayerState {
1111
[StaticAddress("48 8D 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 84 C0 75 06 F6 43 18 02", 3)]
1212
public static partial PlayerState* Instance();
@@ -79,54 +79,54 @@ public unsafe partial struct PlayerState {
7979

8080
// Size: (MountSheet.Max(row => row.Order) + 7) / 8
8181
/// <remarks> Use <see cref="IsMountUnlocked"/> </remarks>
82-
[FieldOffset(0x2DD), FixedSizeArray] internal FixedSizeArray38<byte> _unlockedMountsBitmask;
82+
[FieldOffset(0x2DD), FixedSizeArray] internal FixedSizeArray39<byte> _unlockedMountsBitmask;
8383
// Size: (OrnamentSheet.RowCount + 7) / 8
8484
/// <remarks> Use <see cref="IsOrnamentUnlocked"/> </remarks>
85-
[FieldOffset(0x303), FixedSizeArray] internal FixedSizeArray7<byte> _unlockedOrnamentsBitmask;
85+
[FieldOffset(0x304), FixedSizeArray] internal FixedSizeArray7<byte> _unlockedOrnamentsBitmask;
8686
// Size: (GlassesStylesSheet.RowCount + 7) / 8
8787
/// <remarks> Use <see cref="IsGlassesUnlocked"/> </remarks>
88-
[FieldOffset(0x30A), FixedSizeArray] internal FixedSizeArray4<byte> _unlockedGlassesStylesBitmask;
89-
[FieldOffset(0x310)] public ushort NumOwnedMounts;
88+
[FieldOffset(0x30B), FixedSizeArray] internal FixedSizeArray5<byte> _unlockedGlassesStylesBitmask;
89+
[FieldOffset(0x312)] public ushort NumOwnedMounts;
9090

9191
// Ref: "48 89 5C 24 ?? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ?? 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 45 30 48 8B 81 ?? ?? ?? ?? 49 8B D8"
9292
// Size: (SpearfishingNotebookSheet.RowCount + 7) / 8
93-
[FieldOffset(0x3C2), FixedSizeArray] internal FixedSizeArray8<byte> _unlockedSpearfishingNotebookBitmask;
93+
[FieldOffset(0x3C6), FixedSizeArray] internal FixedSizeArray8<byte> _unlockedSpearfishingNotebookBitmask;
9494

9595
// Size: (FishParameterSheet.Count(row => row.IsInLog) + 7) / 8
9696
/// <remarks> Use <see cref="IsFishCaught(uint)"/> </remarks>
97-
[FieldOffset(0x3EC), FixedSizeArray] internal FixedSizeArray180<byte> _caughtFishBitmask;
98-
[FieldOffset(0x4A0)] public uint NumFishCaught;
99-
[FieldOffset(0x4A4)] public uint FishingBait;
97+
[FieldOffset(0x3F0), FixedSizeArray] internal FixedSizeArray180<byte> _caughtFishBitmask;
98+
[FieldOffset(0x4A8)] public uint NumFishCaught;
99+
[FieldOffset(0x4AC)] public uint FishingBait;
100100
// Ref: "40 53 55 57 48 83 EC 50 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 44 24 ?? 4C 8B 12"
101101
// Size: (SpearfishingItemSheet.RowCount + 7) / 8
102102
/// <remarks> Use <see cref="IsSpearfishCaught(uint)"/> </remarks>
103-
[FieldOffset(0x4B1), FixedSizeArray] internal FixedSizeArray39<byte> _caughtSpearfishBitmask;
104-
[FieldOffset(0x4D8)] public uint NumSpearfishCaught;
105-
[FieldOffset(0x4DC)] internal int UnknownUnixTimestamp; // could be an array of size 1?!
103+
[FieldOffset(0x4B9), FixedSizeArray] internal FixedSizeArray39<byte> _caughtSpearfishBitmask;
104+
[FieldOffset(0x4E0)] public uint NumSpearfishCaught;
105+
[FieldOffset(0x4E4)] internal int UnknownUnixTimestamp; // could be an array of size 1?!
106106
/// <remarks>
107107
/// Index is column 27 of ContentRoulette sheet.<br/>
108108
/// See also: <see cref="InstanceContent.IsRouletteComplete" />
109109
/// </remarks>
110-
[FieldOffset(0x4E0), FixedSizeArray] internal FixedSizeArray12<byte> _contentRouletteCompletion;
111-
[FieldOffset(0x4EC)] public short PlayerCommendations;
112-
113-
[FieldOffset(0x4EE), FixedSizeArray] internal FixedSizeArray7<byte> _selectedPoses;
114-
[FieldOffset(0x4F5), FixedSizeArray] internal FixedSizeArray3<byte> _playerStateFlags;
115-
[FieldOffset(0x4F5), Obsolete("Use PlayerStateFlags[0]", true)] public byte PlayerStateFlags1;
116-
[FieldOffset(0x4F6), Obsolete("Use PlayerStateFlags[1]", true)] public byte PlayerStateFlags2;
117-
[FieldOffset(0x4F7), Obsolete("Use PlayerStateFlags[2]", true)] public byte PlayerStateFlags3;
118-
119-
[FieldOffset(0x522)] public byte SightseeingLogUnlockState; // 0 = Not Unlocked, 1 = ARR Part 1, 2 = ARR Part 2
120-
[FieldOffset(0x523)] public byte SightseeingLogUnlockStateEx; // 3 = Quest "Sights of the North" completed (= AdventureExPhase unlocked?)
121-
[FieldOffset(0x524), FixedSizeArray] internal FixedSizeArray44<byte> _unlockedAdventureBitmask; // maybe?
110+
[FieldOffset(0x4E8), FixedSizeArray] internal FixedSizeArray12<byte> _contentRouletteCompletion;
111+
[FieldOffset(0x4F4)] public short PlayerCommendations;
112+
113+
[FieldOffset(0x4F6), FixedSizeArray] internal FixedSizeArray7<byte> _selectedPoses;
114+
[FieldOffset(0x4FD), FixedSizeArray] internal FixedSizeArray3<byte> _playerStateFlags;
115+
[FieldOffset(0x4FD), Obsolete("Use PlayerStateFlags[0]", true)] public byte PlayerStateFlags1;
116+
[FieldOffset(0x4FE), Obsolete("Use PlayerStateFlags[1]", true)] public byte PlayerStateFlags2;
117+
[FieldOffset(0x4FF), Obsolete("Use PlayerStateFlags[2]", true)] public byte PlayerStateFlags3;
118+
119+
[FieldOffset(0x52A)] public byte SightseeingLogUnlockState; // 0 = Not Unlocked, 1 = ARR Part 1, 2 = ARR Part 2
120+
[FieldOffset(0x52B)] public byte SightseeingLogUnlockStateEx; // 3 = Quest "Sights of the North" completed (= AdventureExPhase unlocked?)
121+
[FieldOffset(0x52C), FixedSizeArray] internal FixedSizeArray44<byte> _unlockedAdventureBitmask; // maybe?
122122
// Ref: PlayerState.IsAdventureComplete
123123
/// <remarks> Use <see cref="IsAdventureComplete"/> </remarks>
124-
[FieldOffset(0x550), FixedSizeArray] internal FixedSizeArray44<byte> _completedAdventureBitmask;
124+
[FieldOffset(0x558), FixedSizeArray] internal FixedSizeArray44<byte> _completedAdventureBitmask;
125125

126-
[FieldOffset(0x581), FixedSizeArray] internal FixedSizeArray56<byte> _unlockFlags;
126+
[FieldOffset(0x589), FixedSizeArray] internal FixedSizeArray56<byte> _unlockFlags;
127127

128128
/// <summary>Carrier Level of Delivery Moogle Quests</summary>
129-
[FieldOffset(0x5BD)] public byte DeliveryLevel;
129+
[FieldOffset(0x5C5)] public byte DeliveryLevel;
130130
// [FieldOffset(0x5BE)] public byte UnkWeddingPlanFlag; // see lua function "GetWeddingPlan"
131131
/// <summary>
132132
/// Flag containing information about which DoH job the player is specialized in.
@@ -137,63 +137,63 @@ public unsafe partial struct PlayerState {
137137
/// <see cref="IsMeisterFlagMaxCount" /><br/>
138138
/// <see cref="IsMeisterFlagAndHasSoulStoneEquipped" />
139139
/// </remarks>
140-
[FieldOffset(0x5BF)] public byte MeisterFlag;
141-
[FieldOffset(0x5C0)] internal byte WeeklyLockoutInfo; // unsure how exactly it's processed
140+
[FieldOffset(0x5C7)] public byte MeisterFlag;
141+
[FieldOffset(0x5C8)] internal byte WeeklyLockoutInfo; // unsure how exactly it's processed
142142

143-
[FieldOffset(0x5C4)] public int SquadronMissionCompletionTimestamp;
144-
[FieldOffset(0x5C8)] public int SquadronTrainingCompletionTimestamp;
145-
[FieldOffset(0x5CC)] public ushort ActiveGcArmyExpedition;
146-
[FieldOffset(0x5CE)] public ushort ActiveGcArmyTraining;
147-
[FieldOffset(0x5D0)] public bool HasNewGcArmyCandidate; // see lua function "GcArmyIsNewCandidate"
148-
// [FieldOffset(0x5D1)] public bool UnkGcPvpMountActionCheck; // see "80 3D ?? ?? ?? ?? ?? 75 3C"
143+
[FieldOffset(0x5CC)] public int SquadronMissionCompletionTimestamp;
144+
[FieldOffset(0x5D0)] public int SquadronTrainingCompletionTimestamp;
145+
[FieldOffset(0x5D4)] public ushort ActiveGcArmyExpedition;
146+
[FieldOffset(0x5D6)] public ushort ActiveGcArmyTraining;
147+
[FieldOffset(0x5D8)] public bool HasNewGcArmyCandidate; // see lua function "GcArmyIsNewCandidate"
148+
// [FieldOffset(0x5D9)] public bool UnkGcPvpMountActionCheck; // see "80 3D ?? ?? ?? ?? ?? 75 3C"
149149

150-
[FieldOffset(0x5D2), FixedSizeArray] internal FixedSizeArray2<byte> _unlockedMinerFolkloreTomeBitmask;
151-
[FieldOffset(0x5D4), FixedSizeArray] internal FixedSizeArray2<byte> _unlockedBotanistFolkloreTomeBitmask;
152-
[FieldOffset(0x5D6), FixedSizeArray] internal FixedSizeArray2<byte> _unlockedFishingFolkloreTomeBitmask;
153-
[FieldOffset(0x5D8), FixedSizeArray] internal FixedSizeArray92<byte> _unlockedOrchestrionRollBitmask;
150+
[FieldOffset(0x5DA), FixedSizeArray] internal FixedSizeArray2<byte> _unlockedMinerFolkloreTomeBitmask;
151+
[FieldOffset(0x5DC), FixedSizeArray] internal FixedSizeArray2<byte> _unlockedBotanistFolkloreTomeBitmask;
152+
[FieldOffset(0x5DE), FixedSizeArray] internal FixedSizeArray2<byte> _unlockedFishingFolkloreTomeBitmask;
153+
[FieldOffset(0x5E0), FixedSizeArray] internal FixedSizeArray92<byte> _unlockedOrchestrionRollBitmask;
154154

155155
#region Weekly Bonus/Weekly Bingo/Wondrous Tails Fields (packet reader in "48 83 EC 28 48 8B D1 48 8D 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 8B 0D ?? ?? ?? ??")
156156

157157
/// <summary>RowIds of WeeklyBingoOrderData sheet</summary>
158-
[FieldOffset(0x6E8), FixedSizeArray] internal FixedSizeArray16<byte> _weeklyBingoOrderData;
158+
[FieldOffset(0x6F4), FixedSizeArray] internal FixedSizeArray16<byte> _weeklyBingoOrderData;
159159
/// <summary>RowIds of WeeklyBingoRewardData sheet</summary>
160-
[FieldOffset(0x6F8), FixedSizeArray] internal FixedSizeArray4<byte> _weeklyBingoRewardData;
160+
[FieldOffset(0x704), FixedSizeArray] internal FixedSizeArray4<byte> _weeklyBingoRewardData;
161161
/// <summary>Bitflags of placed stickers.</summary>
162162
/// <remarks>Use IsWeeklyBingoStickerPlaced(index) and WeeklyBingoNumPlacedStickers instead.</remarks>
163-
[FieldOffset(0x6FC)] private ushort _weeklyBingoStickers;
163+
[FieldOffset(0x708)] private ushort _weeklyBingoStickers;
164164

165165
/// <remarks>Use GetWeeklyBingoExpireUnixTimestamp(), WeeklyBingoNumSecondChancePoints and HasWeeklyBingoJournal instead</remarks>
166-
[FieldOffset(0x700)] private uint _weeklyBingoFlags;
167-
[FieldOffset(0x704), FixedSizeArray] internal FixedSizeArray4<byte> __weeklyBingoTaskStatus;
168-
[FieldOffset(0x708)] public byte WeeklyBingoRequestOpenBingoNo;
166+
[FieldOffset(0x70C)] private uint _weeklyBingoFlags;
167+
[FieldOffset(0x710), FixedSizeArray] internal FixedSizeArray4<byte> __weeklyBingoTaskStatus;
168+
[FieldOffset(0x714)] public byte WeeklyBingoRequestOpenBingoNo;
169169

170-
[FieldOffset(0x744)] public byte WeeklyBingoExpMultiplier;
171-
[FieldOffset(0x745)] public bool WeeklyBingoUnk63;
170+
[FieldOffset(0x750)] public byte WeeklyBingoExpMultiplier;
171+
[FieldOffset(0x751)] public bool WeeklyBingoUnk63;
172172

173173
#endregion
174174

175175
/// <remarks> For easier access, use <see cref="GetContentValue"/>. </remarks>
176-
[FieldOffset(0x74C), FixedSizeArray] internal FixedSizeArray3<StdPair<uint, uint>> _contentKeyValueData;
176+
[FieldOffset(0x758), FixedSizeArray] internal FixedSizeArray3<StdPair<uint, uint>> _contentKeyValueData;
177177

178178
/// <remarks>
179179
/// 1 = Shadowbringers
180180
/// 2 = Endwalker
181181
/// 3 = Dawntrail
182182
/// </remarks>
183-
[FieldOffset(0x7DC)] public byte MentorVersion;
183+
[FieldOffset(0x7E8)] public byte MentorVersion;
184184

185185
/// <remarks> Index is DohDolJobIndex from the ClassJob sheet. </remarks>
186-
[FieldOffset(0x7E0), FixedSizeArray] internal FixedSizeArray8<uint> _desynthesisLevels;
187-
// 0x800 (int): some Faux Hollows timestamp?
188-
// 0x804 (int): some Faux Hollows state?
186+
[FieldOffset(0x7EC), FixedSizeArray] internal FixedSizeArray8<uint> _desynthesisLevels;
187+
// 0x80C (int): some Faux Hollows timestamp?
188+
// 0x810 (int): some Faux Hollows state?
189189

190-
[FieldOffset(0x830), FixedSizeArray] internal FixedSizeArray26<byte> _unlockedFramersKitsBitmask;
190+
[FieldOffset(0x83C), FixedSizeArray] internal FixedSizeArray26<byte> _unlockedFramersKitsBitmask;
191191

192-
[FieldOffset(0x868)] public StdMap<uint, bool> TrackedStatuses;
193-
[FieldOffset(0x878)] public StdMap<uint, bool> TrackedActionUnlocks;
194-
[FieldOffset(0x888)] public StdMap<uint, bool> TrackedTraitUnlocks;
195-
[FieldOffset(0x898)] public bool TrackedTraitUnlocksDirty;
196-
[FieldOffset(0x899)] public bool TrackedActionUnlocksDirty;
192+
[FieldOffset(0x874)] public StdMap<uint, bool> TrackedStatuses;
193+
[FieldOffset(0x884)] public StdMap<uint, bool> TrackedActionUnlocks;
194+
[FieldOffset(0x894)] public StdMap<uint, bool> TrackedTraitUnlocks;
195+
[FieldOffset(0x8A4)] public bool TrackedTraitUnlocksDirty;
196+
[FieldOffset(0x8A5)] public bool TrackedActionUnlocksDirty;
197197

198198
public bool IsLegacy => (QuestSpecialFlags & 1) != 0;
199199
public bool IsWarriorOfLight => (QuestSpecialFlags & 2) != 0;

FFXIVClientStructs/FFXIV/Client/Game/UI/PvPProfile.cs

+37-38
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Game.UI;
22

33
// Client::Game::UI::PvPProfile
44
[GenerateInterop]
5-
[StructLayout(LayoutKind.Explicit, Size = 0x7C)]
5+
[StructLayout(LayoutKind.Explicit, Size = 0x84)]
66
public unsafe partial struct PvPProfile {
77
[StaticAddress("48 8D 0D ?? ?? ?? ?? 0F B6 78 31", 3)]
88
public static partial PvPProfile* Instance();
@@ -16,43 +16,42 @@ public unsafe partial struct PvPProfile {
1616
[FieldOffset(0x11)] public byte RankTwinAdder;
1717
[FieldOffset(0x12)] public byte RankImmortalFlames;
1818

19-
[FieldOffset(0x1E)] public byte Series;
20-
[FieldOffset(0x1F)] public byte SeriesCurrentRank;
21-
[FieldOffset(0x20)] public byte SeriesClaimedRank;
22-
23-
[FieldOffset(0x22)] public ushort SeriesExperience;
24-
[FieldOffset(0x24)] public byte PreviousSeriesClaimedRank;
25-
[FieldOffset(0x25)] public byte PreviousSeriesRank;
26-
27-
[FieldOffset(0x28)] public uint FrontlineTotalMatches;
28-
[FieldOffset(0x2C)] public uint FrontlineTotalFirstPlace;
29-
[FieldOffset(0x30)] public uint FrontlineTotalSecondPlace;
30-
[FieldOffset(0x34)] public uint FrontlineTotalThirdPlace;
31-
[FieldOffset(0x38)] public ushort FrontlineWeeklyMatches;
32-
[FieldOffset(0x3A)] public ushort FrontlineWeeklyFirstPlace;
33-
[FieldOffset(0x3C)] public ushort FrontlineWeeklySecondPlace;
34-
[FieldOffset(0x3E)] public ushort FrontlineWeeklyThirdPlace;
35-
36-
[FieldOffset(0x41)] public byte CrystallineConflictSeason;
37-
[FieldOffset(0x42)] public ushort CrystallineConflictCasualMatches;
38-
[FieldOffset(0x44)] public ushort CrystallineConflictCasualMatchesWon;
39-
[FieldOffset(0x46)] public ushort CrystallineConflictRankedMatches;
40-
[FieldOffset(0x48)] public ushort CrystallineConflictRankedMatchesWon;
41-
42-
[FieldOffset(0x4E)] public ushort CrystallineConflictCurrentCrystalCredit;
43-
[FieldOffset(0x50)] public ushort CrystallineConflictHighestCrystalCredit;
44-
45-
[FieldOffset(0x54)] public byte CrystallineConflictCurrentRank;
46-
[FieldOffset(0x55)] public byte CrystallineConflictHighestRank;
47-
[FieldOffset(0x56)] public byte CrystallineConflictCurrentRiser;
48-
[FieldOffset(0x57)] public byte CrystallineConflictHighestRiser;
49-
[FieldOffset(0x58)] public byte CrystallineConflictCurrentRisingStars;
50-
[FieldOffset(0x59)] public byte CrystallineConflictHighestRisingStars;
51-
52-
[FieldOffset(0x6C)] public uint RivalWingsTotalMatches;
53-
[FieldOffset(0x70)] public uint RivalWingsTotalMatchesWon;
54-
[FieldOffset(0x74)] public uint RivalWingsWeeklyMatches;
55-
[FieldOffset(0x78)] public uint RivalWingsWeeklyMatchesWon;
19+
[FieldOffset(0x24)] public byte Series;
20+
[FieldOffset(0x25)] public byte SeriesCurrentRank;
21+
[FieldOffset(0x26)] public byte SeriesClaimedRank;
22+
23+
[FieldOffset(0x28)] public ushort SeriesExperience;
24+
[FieldOffset(0x2A)] public byte PreviousSeriesClaimedRank;
25+
[FieldOffset(0x2B)] public byte PreviousSeriesRank;
26+
[FieldOffset(0x2C)] public uint FrontlineTotalMatches;
27+
[FieldOffset(0x30)] public uint FrontlineTotalFirstPlace;
28+
[FieldOffset(0x34)] public uint FrontlineTotalSecondPlace;
29+
[FieldOffset(0x38)] public uint FrontlineTotalThirdPlace;
30+
[FieldOffset(0x3C)] public ushort FrontlineWeeklyMatches;
31+
[FieldOffset(0x3E)] public ushort FrontlineWeeklyFirstPlace;
32+
[FieldOffset(0x40)] public ushort FrontlineWeeklySecondPlace;
33+
[FieldOffset(0x42)] public ushort FrontlineWeeklyThirdPlace;
34+
35+
[FieldOffset(0x45)] public byte CrystallineConflictSeason;
36+
[FieldOffset(0x46)] public ushort CrystallineConflictCasualMatches;
37+
[FieldOffset(0x48)] public ushort CrystallineConflictCasualMatchesWon;
38+
[FieldOffset(0x4A)] public ushort CrystallineConflictRankedMatches;
39+
[FieldOffset(0x4C)] public ushort CrystallineConflictRankedMatchesWon;
40+
41+
[FieldOffset(0x52)] public ushort CrystallineConflictCurrentCrystalCredit;
42+
[FieldOffset(0x54)] public ushort CrystallineConflictHighestCrystalCredit;
43+
44+
[FieldOffset(0x58)] public byte CrystallineConflictCurrentRank;
45+
[FieldOffset(0x59)] public byte CrystallineConflictHighestRank;
46+
[FieldOffset(0x5A)] public byte CrystallineConflictCurrentRiser;
47+
[FieldOffset(0x5B)] public byte CrystallineConflictHighestRiser;
48+
[FieldOffset(0x5C)] public byte CrystallineConflictCurrentRisingStars;
49+
[FieldOffset(0x5D)] public byte CrystallineConflictHighestRisingStars;
50+
51+
[FieldOffset(0x70)] public uint RivalWingsTotalMatches;
52+
[FieldOffset(0x74)] public uint RivalWingsTotalMatchesWon;
53+
[FieldOffset(0x78)] public uint RivalWingsWeeklyMatches;
54+
[FieldOffset(0x7C)] public uint RivalWingsWeeklyMatchesWon;
5655

5756
/// <summary>Gets the current PvP rank for the active Grand Company.</summary>
5857
[MemberFunction("E8 ?? ?? ?? ?? 3A 47 4F")]

0 commit comments

Comments
 (0)