public override string GetModuleInfo(string configuration, float reliabilityAtTime)
        {
            foreach (var configNode in configs)
            {
                if (!configNode.HasValue("configuration"))
                {
                    continue;
                }

                var nodeConfiguration = configNode.GetValue("configuration");

                if (string.Equals(nodeConfiguration, configuration, StringComparison.InvariantCultureIgnoreCase))
                {
                    if (configNode.HasNode("reliabilityCurve"))
                    {
                        var nodeReliability = new FloatCurve();
                        nodeReliability.Load(configNode.GetNode("reliabilityCurve"));

                        // core is not yet available here
                        float reliabilityMin = TestFlightUtil.FailureRateToReliability(nodeReliability.Evaluate(nodeReliability.minTime), reliabilityAtTime);
                        float reliabilityMax = TestFlightUtil.FailureRateToReliability(nodeReliability.Evaluate(nodeReliability.maxTime), reliabilityAtTime);
                        return($"  Reliability at 0 data: <color=#b1cc00ff>{reliabilityMin:P1}</color>\n  Reliability at max data: <color=#b1cc00ff>{reliabilityMax:p1}</color>");
                    }
                }
            }

            return(base.GetModuleInfo(configuration, reliabilityAtTime));
        }
        public override List <string> GetTestFlightInfo(float reliabilityAtTime)
        {
            List <string> infoStrings = new List <string>();

            if (core == null)
            {
                Log("Core is null");
                return(infoStrings);
            }
            if (reliabilityCurve == null)
            {
                Log("Curve is null");
                return(infoStrings);
            }

            float flightData = core.GetFlightData();

            if (flightData < 0f)
            {
                flightData = 0f;
            }

            double currentFailRate = GetBaseFailureRate(flightData);
            double maxFailRate     = GetBaseFailureRate(reliabilityCurve.maxTime);

            double currentReliability = TestFlightUtil.FailureRateToReliability(currentFailRate, reliabilityAtTime);
            double maxReliability     = TestFlightUtil.FailureRateToReliability(maxFailRate, reliabilityAtTime);

            string currentMTBF = core.FailureRateToMTBFString(currentFailRate, TestFlightUtil.MTBFUnits.SECONDS, 999);
            string maxMTBF     = core.FailureRateToMTBFString(maxFailRate, TestFlightUtil.MTBFUnits.SECONDS, 999);

            infoStrings.Add("<b>Base Reliability</b>");
            infoStrings.Add($"<b>Current Reliability</b>: {currentReliability:P1} at full burn, {currentMTBF} <b>MTBF</b>");
            infoStrings.Add($"<b>Maximum Reliability</b>: {maxReliability:P1} at full burn, {maxMTBF} <b>MTBF</b>");

            return(infoStrings);
        }