Skip to content

Commit

Permalink
Everything OK except for weak dtor order
Browse files Browse the repository at this point in the history
  • Loading branch information
robojumper committed Oct 25, 2024
1 parent e689fba commit ceac3a6
Show file tree
Hide file tree
Showing 8 changed files with 105 additions and 67 deletions.
76 changes: 38 additions & 38 deletions config/SOUE01/symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4069,7 +4069,7 @@ fn_800BD7A0 = .text:0x800BD7A0; // type:function size:0x74
fn_800BD820 = .text:0x800BD820; // type:function size:0x8
fn_800BD830 = .text:0x800BD830; // type:function size:0x78
fn_800BD8B0 = .text:0x800BD8B0; // type:function size:0x10
doNothing__16SceneflagManagerFv = .text:0x800BD8C0; // type:function size:0x4
init__16SceneflagManagerFv = .text:0x800BD8C0; // type:function size:0x4
setShouldCommit__16SceneflagManagerFUs = .text:0x800BD8D0; // type:function size:0xC
__ct__16SceneflagManagerFv = .text:0x800BD8E0; // type:function size:0x64
isNotTempOrZoneFlag__16SceneflagManagerFUs = .text:0x800BD950; // type:function size:0xC
Expand Down Expand Up @@ -4161,58 +4161,58 @@ onDirty__20ItemStoryManagerBaseFv = .text:0x800BF630; // type:function size:0x4
FUN_800bf640__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function size:0x10
doCommit_Priv__20ItemStoryManagerBaseFv = .text:0x800BF650; // type:function size:0x40
FUN_800bf690__20ItemStoryManagerBaseFv = .text:0x800BF690; // type:function size:0x4
__ct__16StoryFlagManagerFv = .text:0x800BF6A0; // type:function size:0x5C
copyFlagsFromSave__16StoryFlagManagerFv = .text:0x800BF700; // type:function size:0x3C
setupUnkFlagsStuff__16StoryFlagManagerFv = .text:0x800BF740; // type:function size:0x10
onDirty__16StoryFlagManagerFv = .text:0x800BF750; // type:function size:0x4
commit__16StoryFlagManagerFv = .text:0x800BF760; // type:function size:0x4C
unsetFlag__16StoryFlagManagerFUs = .text:0x800BF7B0; // type:function size:0x4
__ct__15ItemFlagManagerFv = .text:0x800BF7C0; // type:function size:0x5C
copyFlagsFromSave__15ItemFlagManagerFv = .text:0x800BF820; // type:function size:0x3C
setupUnkFlagsStuff__15ItemFlagManagerFv = .text:0x800BF860; // type:function size:0x10
onDirty__15ItemFlagManagerFv = .text:0x800BF870; // type:function size:0x4
commit__15ItemFlagManagerFv = .text:0x800BF880; // type:function size:0x4C
copyFromSave__18DungeonflagManagerFUs = .text:0x800BF8D0; // type:function size:0x54
__ct__16StoryflagManagerFv = .text:0x800BF6A0; // type:function size:0x5C
copyFlagsFromSave__16StoryflagManagerFv = .text:0x800BF700; // type:function size:0x3C
setupUnkFlagsStuff__16StoryflagManagerFv = .text:0x800BF740; // type:function size:0x10
onDirty__16StoryflagManagerFv = .text:0x800BF750; // type:function size:0x4
commit__16StoryflagManagerFv = .text:0x800BF760; // type:function size:0x4C
unsetFlag__16StoryflagManagerFUs = .text:0x800BF7B0; // type:function size:0x4
__ct__15ItemflagManagerFv = .text:0x800BF7C0; // type:function size:0x5C
copyFlagsFromSave__15ItemflagManagerFv = .text:0x800BF820; // type:function size:0x3C
setupUnkFlagsStuff__15ItemflagManagerFv = .text:0x800BF860; // type:function size:0x10
onDirty__15ItemflagManagerFv = .text:0x800BF870; // type:function size:0x4
commit__15ItemflagManagerFv = .text:0x800BF880; // type:function size:0x4C
copyFromSave_Internal__18DungeonflagManagerFUs = .text:0x800BF8D0; // type:function size:0x54
setCommitFlag__18DungeonflagManagerFUs = .text:0x800BF930; // type:function size:0xC
__ct__18DungeonflagManagerFv = .text:0x800BF940; // type:function size:0x3C
setupFlagStuff__18DungeonflagManagerFv = .text:0x800BF980; // type:function size:0x54
copyFromSave__18DungeonflagManagerFs = .text:0x800BF9E0; // type:function size:0xC
init__18DungeonflagManagerFv = .text:0x800BF980; // type:function size:0x54
copyFromSave__18DungeonflagManagerFUl = .text:0x800BF9E0; // type:function size:0xC
setToValue__18DungeonflagManagerFUsUl = .text:0x800BF9F0; // type:function size:0x6C
setFlag__18DungeonflagManagerFUs = .text:0x800BFA60; // type:function size:0x60
getDungeonFlag__18DungeonflagManagerFUs = .text:0x800BFAC0; // type:function size:0x50
doCommit__18DungeonflagManagerFv = .text:0x800BFB10; // type:function size:0x8C
copyFromSave__15SkipflagManagerFv = .text:0x800BFBA0; // type:function size:0x44
setCommitFlag__15SkipflagManagerFUs = .text:0x800BFBF0; // type:function size:0xC
__ct__15SkipflagManagerFv = .text:0x800BFC00; // type:function size:0x2C
unsetCommitFlag__15SkipflagManagerFv = .text:0x800BFC30; // type:function size:0xC
init__15SkipflagManagerFv = .text:0x800BFC30; // type:function size:0xC
thunk_copyFromSave__15SkipflagManagerFv = .text:0x800BFC40; // type:function size:0x4
setFlag__15SkipflagManagerFUs = .text:0x800BFC50; // type:function size:0xD0
checkFlag__15SkipflagManagerFUs = .text:0x800BFD20; // type:function size:0x68
commitFlags__15SkipflagManagerFv = .text:0x800BFD90; // type:function size:0x70
setupFlagManagers__FPQ23EGG4Heap = .text:0x800BFE00; // type:function size:0x294
__dt__15TBoxFlagManagerFv = .text:0x800C00A0; // type:function size:0x40
__dt__18EnemyDefeatManagerFv = .text:0x800C00E0; // type:function size:0x40
__dt__16StoryFlagManagerFv = .text:0x800C0120; // type:function size:0x58
__dt__15ItemFlagManagerFv = .text:0x800C0180; // type:function size:0x58
__dt__16StoryflagManagerFv = .text:0x800C0120; // type:function size:0x58
__dt__15ItemflagManagerFv = .text:0x800C0180; // type:function size:0x58
postSetup__Fv = .text:0x800C01E0; // type:function size:0x8
copyAllFlagManagersFromSave__Fv = .text:0x800C01F0; // type:function size:0x78
updateFlagForFlagIndex__FUs = .text:0x800C0270; // type:function size:0x58
commitAllFlagManagers = .text:0x800C02D0; // type:function size:0x54
commitAllFlagManagers__Fv = .text:0x800C02D0; // type:function size:0x54
checkedMemcpy = .text:0x800C0330; // type:function size:0x54
getSaveFlagSpace__15ItemFlagManagerCFv = .text:0x800C0390; // type:function size:0x8
unk3__15ItemFlagManagerFUs = .text:0x800C03A0; // type:function size:0x8
getUncommittedValue__15ItemFlagManagerFUs = .text:0x800C03B0; // type:function size:0x8
getCounterOrFlag__15ItemFlagManagerCFUs = .text:0x800C03C0; // type:function size:0x8
setFlagOrCounterToValue__15ItemFlagManagerFUsUs = .text:0x800C03D0; // type:function size:0x8
unsetFlag__15ItemFlagManagerFUs = .text:0x800C03E0; // type:function size:0x8
doCommit__15ItemFlagManagerFv = .text:0x800C03F0; // type:function size:0x44
setFlagszptr__15ItemFlagManagerFv = .text:0x800C0440; // type:function size:0xC
getSaveFlagSpace__16StoryFlagManagerCFv = .text:0x800C0450; // type:function size:0x8
doCommit__16StoryFlagManagerFv = .text:0x800C0460; // type:function size:0x44
setFlagszptr__16StoryFlagManagerFv = .text:0x800C04B0; // type:function size:0xC
getSaveFlagSpace__15ItemflagManagerCFv = .text:0x800C0390; // type:function size:0x8
unk3__15ItemflagManagerFUs = .text:0x800C03A0; // type:function size:0x8
getUncommittedValue__15ItemflagManagerFUs = .text:0x800C03B0; // type:function size:0x8
getCounterOrFlag__15ItemflagManagerCFUs = .text:0x800C03C0; // type:function size:0x8
setFlagOrCounterToValue__15ItemflagManagerFUsUs = .text:0x800C03D0; // type:function size:0x8
unsetFlag__15ItemflagManagerFUs = .text:0x800C03E0; // type:function size:0x8
doCommit__15ItemflagManagerFv = .text:0x800C03F0; // type:function size:0x44
setFlagszptr__15ItemflagManagerFv = .text:0x800C0440; // type:function size:0xC
getSaveFlagSpace__16StoryflagManagerCFv = .text:0x800C0450; // type:function size:0x8
doCommit__16StoryflagManagerFv = .text:0x800C0460; // type:function size:0x44
setFlagszptr__16StoryflagManagerFv = .text:0x800C04B0; // type:function size:0xC
doCommit__18EnemyDefeatManagerFv = .text:0x800C04C0; // type:function size:0x44
__dt__18ItemFlagManagerSubFv = .text:0x800C0510; // type:function size:0x5C
__dt__19StoryFlagManagerSubFv = .text:0x800C0570; // type:function size:0x5C
__dt__18ItemflagManagerSubFv = .text:0x800C0510; // type:function size:0x5C
__dt__19StoryflagManagerSubFv = .text:0x800C0570; // type:function size:0x5C
__dt__21EnemyDefeatManagerSubFv = .text:0x800C05D0; // type:function size:0x40
__dt__18TBoxFlagManagerSubFv = .text:0x800C0610; // type:function size:0x40
fn_800C0650 = .text:0x800C0650; // type:function size:0x3C
Expand Down Expand Up @@ -31008,12 +31008,12 @@ lbl_80510B48 = .data:0x80510B48; // type:object size:0xC
lbl_80510B54 = .data:0x80510B54; // type:object size:0xC
lbl_80510B60 = .data:0x80510B60; // type:object size:0x10
lbl_80510B70 = .data:0x80510B70; // type:object size:0x18
__vt__18ItemFlagManagerSub = .data:0x80510B88; // type:object size:0x3C
__vt__19StoryFlagManagerSub = .data:0x80510BC4; // type:object size:0x3C
__vt__18ItemflagManagerSub = .data:0x80510B88; // type:object size:0x3C
__vt__19StoryflagManagerSub = .data:0x80510BC4; // type:object size:0x3C
__vt__21EnemyDefeatManagerSub = .data:0x80510C00; // type:object size:0x14
__vt__18TBoxFlagManagerSub = .data:0x80510C14; // type:object size:0x14
__vt__15ItemFlagManager = .data:0x80510C28; // type:object size:0x3C
__vt__16StoryFlagManager = .data:0x80510C64; // type:object size:0x3C
__vt__15ItemflagManager = .data:0x80510C28; // type:object size:0x3C
__vt__16StoryflagManager = .data:0x80510C64; // type:object size:0x3C
__vt__20ItemStoryManagerBase = .data:0x80510CA0; // type:object size:0x3C
__vt__18EnemyDefeatManager = .data:0x80510CDC; // type:object size:0x14
__vt__15TBoxFlagManager = .data:0x80510CF0; // type:object size:0x14
Expand Down Expand Up @@ -48333,8 +48333,8 @@ TIMESHIFT_STONE_REFS = .bss:0x805A78C4; // type:object size:0xC data:4byte
sSceneFlags__16SceneflagManager = .bss:0x805A78D0; // type:object size:0x10
sZoneFlags__16SceneflagManager = .bss:0x805A78E0; // type:object size:0x1F8
sEnemyDefeatFlags__18EnemyDefeatManager = .bss:0x805A7AD8; // type:object size:0x2000
STATIC_STORYFLAGS = .bss:0x805A9AD8; // type:object size:0x100
STATIC_ITEM_FLAGS = .bss:0x805A9BD8; // type:object size:0x80
sFlags__16StoryflagManager = .bss:0x805A9AD8; // type:object size:0x100
sFlags__15ItemflagManager = .bss:0x805A9BD8; // type:object size:0x80
sDungeonFlags__18DungeonflagManager = .bss:0x805A9C58; // type:object size:0x10
sSkipFlags__15SkipflagManager = .bss:0x805A9C68; // type:object size:0x20
lbl_805A9C88 = .bss:0x805A9C88; // type:object size:0x10 data:4byte
Expand Down
18 changes: 10 additions & 8 deletions include/toBeSorted/item_story_flag_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class ItemStoryManagerBase {
/** 0x10 */ virtual void onDirty();
/** 0x14 */ virtual void copyFlagsFromSave() = 0;
/** 0x18 */ virtual void setupUnkFlagsStuff() = 0;
/** 0x1C */ virtual bool doCommit() = 0;
/** 0x1C */ virtual void doCommit() = 0;
/** 0x20 */ virtual void setFlag(u16 flag);
/** 0x24 */ virtual void unsetFlag(u16 flag);
/** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value);
Expand Down Expand Up @@ -59,16 +59,19 @@ class StoryflagManager : public ItemStoryManagerBase {

FlagSpace storyFlags;

void init();
bool commit();

/** 0x0C */ virtual void setFlagszptr() override {

storyFlagsPtr = &storyFlags;
}
/** 0x10 */ virtual void onDirty() override;
/** 0x14 */ virtual void copyFlagsFromSave() override;
/** 0x18 */ virtual void setupUnkFlagsStuff() override;
/** 0x1C */ virtual bool doCommit() override {}
/** 0x1C */ virtual void doCommit() override {
u16 sz = flagSizeMaybe;
u16 *flags = storyFlagsPtr->getFlagPtrUnchecked();
FileManager::sInstance->setStoryFlags(flags, 0, sz);
}
/** 0x20 */ virtual void setFlag(u16 flag) override;
/** 0x24 */ virtual void unsetFlag(u16 flag) override;
/** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) override;
Expand All @@ -92,16 +95,15 @@ class ItemflagManager : public ItemStoryManagerBase {
ItemflagManager();
virtual ~ItemflagManager() {}

void init();
bool commit();

/** 0x0C */ virtual void setFlagszptr() override {

storyFlagsPtr = &itemFlags;
}
/** 0x10 */ virtual void onDirty() override;
/** 0x14 */ virtual void copyFlagsFromSave();
/** 0x18 */ virtual void setupUnkFlagsStuff();
/** 0x1C */ virtual bool doCommit() {
/** 0x1C */ virtual void doCommit() {
u16 sz = flagSizeMaybe;
u16 *flags = storyFlagsPtr->getFlagPtrUnchecked();
FileManager::sInstance->setItemFlags(flags, 0, sz);
Expand All @@ -117,7 +119,7 @@ class ItemflagManager : public ItemStoryManagerBase {
return getFlag(flag & ~0x4000);
}
/** 0x30 */ virtual u16 getUncommittedValue(u16 flag) {
return getUncommittedValue_Priv(flag & ~0x4000);
return ItemStoryManagerBase::getUncommittedValue(flag & ~0x4000);
}
/** 0x34 */ virtual void unk3(u16 arg) {
FUN_800bf600(arg & ~0x4000);
Expand Down
2 changes: 1 addition & 1 deletion include/toBeSorted/misc_flag_managers.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ class EnemyDefeatManager : public CommittableFlagManager {

virtual void doCommit() override {
FileManager *mgr = FileManager::sInstance;
mgr->setItemFlags(mFlagSpace.getFlagPtrUnchecked(), 0, 0x1000);
mgr->setEnemyDefeatFlags(mFlagSpace.getFlagPtrUnchecked(), 0, 0x1000);
};
};

Expand Down
2 changes: 1 addition & 1 deletion include/toBeSorted/sceneflag_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class SceneflagManager {
static u16 sZoneFlags[0xFC];

static SceneflagManager *sInstance;
void doNothing();
void init();
void setShouldCommit(u16 flag);
SceneflagManager();
s32 isNotTempOrZoneFlag(u16 flag);
Expand Down
16 changes: 8 additions & 8 deletions src/toBeSorted/flag_managers/dungeonflag_manager.inc
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ public:
static u16 sDungeonFlags[8];
// static DungeonflagManager *sInstance;

void copyFromSave(s16 flag);
void copyFromSave(u16 flagIndex);
void copyFromSave(u32 flag);
void copyFromSave_Internal(u16 flagIndex);
void setCommitFlag(u16 flag);
DungeonflagManager();
void setupFlagStuff();
void init();
void setToValue(u16 flag, u32 value);
void setFlag(u16 flag);
u16 getDungeonFlag(u16 flag);
Expand All @@ -38,13 +38,13 @@ public:
};

/** 80575404 */
// DungeonflagManager *DungeonflagManager::sInstance = nullptr;
DungeonflagManager *DungeonflagManager::sInstance = nullptr;

/** 805a9c58 */
u16 DungeonflagManager::sDungeonFlags[8] = {};

/** 800bf8d0 */
void DungeonflagManager::copyFromSave(u16 flagIndex) {
void DungeonflagManager::copyFromSave_Internal(u16 flagIndex) {
mFlagSpace.copyFromSaveFile(saveFilePtr(flagIndex), 0, 0x8);
}

Expand All @@ -59,15 +59,15 @@ DungeonflagManager::DungeonflagManager()
mFlagSpace(sDungeonFlags, ARRAY_LENGTH(sDungeonFlags)) {}

/** 800bf980 */
void DungeonflagManager::setupFlagStuff() {
void DungeonflagManager::init() {
mFlagStuff = new UnkFlagStuff(0x11, DungeonflagManager__FLAG_DEFINITIONS);
mShouldCommit = false;
}

/** 800bf9e0 */
void DungeonflagManager::copyFromSave(s16 flag) {
void DungeonflagManager::copyFromSave(u32 flag) {
mStageIndex = flag;
copyFromSave((u16)flag);
copyFromSave_Internal(flag);
}

/** 800bf9f0 */
Expand Down
52 changes: 44 additions & 8 deletions src/toBeSorted/flag_managers/flag_managers.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// clang-format off

#include "common.h"
#include "toBeSorted/sceneflag_manager.h"
#include <toBeSorted/flag_space.h>
#include <toBeSorted/misc_flag_managers.h>
#include <toBeSorted/item_story_flag_manager.h>
Expand All @@ -11,6 +13,12 @@
#include <toBeSorted/flag_managers/unk_flag_stuff.inc>
#include <toBeSorted/flag_managers/bitwise_flag_helper.inc>

u16 StoryflagManager::sFlags[0x80];
u16 ItemflagManager::sFlags[0x40];


StoryflagManager *StoryflagManager::sInstance = nullptr;
ItemflagManager *ItemflagManager::sInstance = nullptr;

ItemStoryManagerBase::ItemStoryManagerBase(): flagSizeMaybe(0), anotherSizeMaybe(0), storyFlagsPtr(nullptr), unkFlagsPtr(nullptr), dirty(false) {}
ItemStoryManagerBase::~ItemStoryManagerBase() {
Expand Down Expand Up @@ -197,6 +205,10 @@ bool ItemflagManager::commit() {
static void postSetup();
static void updateFlagForFlagIndex(u16 stage);
class TBoxFlagManagerSub : public TBoxFlagManager {
public:
TBoxFlagManagerSub() {
TBoxFlagManager::sInstance = this;
}
// virtual ~TBoxFlagManagerSub() {}
};

Expand All @@ -213,14 +225,23 @@ class ItemflagManagerSub : public ItemflagManager {
// virtual ~ItemflagManagerSub() {}
};

class SceneflagManagerSub : public SceneflagManager {

};

class DungeonflagManagerSub : public DungeonflagManager {

};

class SkipflagManagerSub : public SkipflagManager {

};

void setupFlagManagers(EGG::Heap *heap) {
if (SceneflagManager::sInstance == nullptr) {
SceneflagManager::sInstance = new (heap) SceneflagManager();
SceneflagManager::sInstance = new (heap) SceneflagManagerSub();
mHeap m(heap);
SceneflagManager::sInstance->doNothing();
SceneflagManager::sInstance->init();
}

if (TBoxFlagManager::sInstance == nullptr) {
Expand Down Expand Up @@ -248,15 +269,15 @@ void setupFlagManagers(EGG::Heap *heap) {
}

if (DungeonflagManager::sInstance == nullptr) {
DungeonflagManager::sInstance = new (heap) DungeonflagManager();
DungeonflagManager::sInstance = new (heap) DungeonflagManagerSub();
mHeap m(heap);
DungeonflagManager::sInstance->setupFlagStuff();
DungeonflagManager::sInstance->init();
}

if (SkipflagManager::sInstance == nullptr) {
SkipflagManager::sInstance = new (heap) SkipflagManager();
SkipflagManager::sInstance = new (heap) SkipflagManagerSub();
mHeap m(heap);
SkipflagManager::sInstance->unsetCommitFlag();
SkipflagManager::sInstance->init();
}

postSetup();
Expand All @@ -273,11 +294,26 @@ void copyAllFlagManagersFromSave() {
StoryflagManager::sInstance->copyFlagsFromSave_Priv();
ItemflagManager::sInstance->copyFlagsFromSave_Priv();
DungeonflagManager::sInstance->copyFromSave(flag);
SkipflagManager::sInstance->copyFromSave();
SkipflagManager::sInstance->thunk_copyFromSave();
EnemyDefeatManager::sInstance->copyFromSave(flag);
}

static void updateFlagForFlagIndex(u16 stage) {}
static void updateFlagForFlagIndex(u16 stage) {
SceneflagManager::sInstance->updateFlagindex(stage);
TBoxFlagManager::sInstance->copyFromSave(stage);
EnemyDefeatManager::sInstance->updateFlagIndex(stage);
DungeonflagManager::sInstance->copyFromSave(stage);
}

void commitAllFlagManagers() {
StoryflagManager::sInstance->commit();
ItemflagManager::sInstance->commit();
DungeonflagManager::sInstance->doCommit();
SkipflagManager::sInstance->commitFlags();
SceneflagManager::sInstance->doCommit();
TBoxFlagManager::sInstance->commitIfNecessary();
EnemyDefeatManager::sInstance->commitIfNecessary();
}

extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) {
if (dest == nullptr || src == nullptr || destLen < count || destLen > 0xFFFF) {
Expand Down
2 changes: 1 addition & 1 deletion src/toBeSorted/flag_managers/sceneflag_manager.inc
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ u16 SceneflagManager::sTempFlags[] = {};
u16 SceneflagManager::sSceneFlags[8] = {};
u16 SceneflagManager::sZoneFlags[0xFC] = {};

void SceneflagManager::doNothing() {}
void SceneflagManager::init() {}
void SceneflagManager::setShouldCommit(u16 flag) {
mShouldCommit = 1;
}
Expand Down
4 changes: 2 additions & 2 deletions src/toBeSorted/flag_managers/skipflag_manager.inc
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public:
void copyFromSave();
void setCommitFlag(u16 flag);
SkipflagManager();
void unsetCommitFlag();
void init();
void thunk_copyFromSave();
void setFlag(u16 flag);
bool checkFlag(u16 flag);
Expand All @@ -44,7 +44,7 @@ void SkipflagManager::setCommitFlag(u16 flag) {
SkipflagManager::SkipflagManager() : mFlagSpace(sSkipFlags, ARRAY_LENGTH(sSkipFlags)), mShouldCommit(false) {}

// 800bfc30
void SkipflagManager::unsetCommitFlag() {
void SkipflagManager::init() {
mShouldCommit = false;
}

Expand Down

0 comments on commit ceac3a6

Please sign in to comment.