public void OnEnabled() => TMPELifecycle.StartMod();
 public void OnDisabled() => TMPELifecycle.EndMod();
        public static void Load()
        {
            Log.Info("Loading Traffic Manager: PE Data");
            TMPELifecycle.Instance.Deserializing = true;
            bool loadingSucceeded = true;

            try {
                Log.Info("Initializing flags");
                Flags.OnBeforeLoadData();
            }
            catch (Exception e) {
                Log.Error($"OnLoadData: Error while initializing Flags: {e}");
                loadingSucceeded = false;
            }

            foreach (ICustomManager manager in TMPELifecycle.Instance.RegisteredManagers)
            {
                try {
                    Log.Info($"OnBeforeLoadData: {manager.GetType().Name}");
                    manager.OnBeforeLoadData();
                }
                catch (Exception e) {
                    Log.Error($"OnLoadData: Error while initializing {manager.GetType().Name}: {e}");
                    loadingSucceeded = false;
                }
            }

            Log.Info("Initialization done. Loading mod data now.");

            try {
                byte[] data = SerializableData.LoadData(VERSION_INFO_DATA_ID);
                DeserializeVersionData(data);
            }
            catch (Exception e) {
                Log.Error($"OnLoadData: Error while deserializing version data: {e}");
                loadingSucceeded = false;
            }

            try {
                byte[] data = SerializableData.LoadData(DATA_ID);
                DeserializeData(data);
            }
            catch (Exception e) {
                Log.Error($"OnLoadData: Error while deserializing data: {e}");
                loadingSucceeded = false;
            }

            // load options (empty byte array causes default options to be applied)
            try {
                if (TMPELifecycle.InGameOrEditor())
                {
                    // Always force default options on new game
                    // See: https://github.com/CitiesSkylinesMods/TMPE/pull/1425
                    byte[] options = TMPELifecycle.IsNewGame
                        ? null
                        : SerializableData.LoadData("TMPE_Options");

                    if (!OptionsManager.Instance.LoadData(options ?? new byte[0]))
                    {
                        loadingSucceeded = false;
                    }
                }
            }
            catch (Exception e) {
                Log.Error($"OnLoadData: Error while loading options: {e}");
                loadingSucceeded = false;
            }

            if (loadingSucceeded)
            {
                Log.Info("OnLoadData completed successfully.");
            }
            else
            {
                Log.Info("An error occurred while loading.");

                // UIView.library.ShowModal<ExceptionPanel>("ExceptionPanel")
                // .SetMessage("An error occurred while loading",
                // "Traffic Manager: President Edition detected an error while loading. Please do
                // NOT save this game under the old filename, otherwise your timed traffic lights,
                // custom lane arrows, etc. are in danger. Instead, please navigate to
                // http://steamcommunity.com/sharedfiles/filedetails/?id=583429740 and follow the
                // steps under 'In case problems arise'.", true);
            }

            TMPELifecycle.Instance.Deserializing = false;

            foreach (ICustomManager manager in TMPELifecycle.Instance.RegisteredManagers)
            {
                try {
                    Log.Info($"OnAfterLoadData: {manager.GetType().Name}");
                    manager.OnAfterLoadData();
                }
                catch (Exception e) {
                    Log.Error($"OnLoadData: Error while initializing {manager.GetType().Name}: {e}");
                    loadingSucceeded = false;
                }
            }
        }