function __construct($fileContent)
 {
     $this->raceResult = new Event\RaceResult("");
     $this->fileContent = $fileContent;
     $stage = "start";
     $currRaceDriverData = new Event\RaceDriverData();
     $top3racerCount = 0;
     $currracerId = 0;
     foreach ($this->fileContent as $line) {
         $cleanLine = trim($line);
         if (empty($cleanLine)) {
             if ($stage == "start") {
                 // do nothing
             } else {
                 if ($stage == "restOfRacerContent") {
                     // end of restOfRacerContent
                     $stage = "lapTimeHeader";
                 } else {
                     if ($stage == "lapTimeContent") {
                         $stage = "lapTimeHeader";
                     }
                 }
             }
         } else {
             if ($stage == "start") {
                 // collect race name
                 $this->raceResult->name = $cleanLine;
                 $stage = "win_by";
             } else {
                 if ($stage == "win_by") {
                     $stage = "date";
                 } else {
                     if ($stage == "date") {
                         $stage = "winner";
                     } else {
                         if ($stage == "winner") {
                             $stage = "top3racer_ln0";
                         } else {
                             if ($stage == "top3racer_ln0") {
                                 $top3racerCount++;
                                 $currRaceDriverData->finishPosition = $top3racerCount;
                                 $currRaceDriverData->carNum = strval($top3racerCount);
                                 $currRaceDriverData->name = $cleanLine;
                                 $stage = "top3racer_ln1";
                             } else {
                                 if ($stage == "top3racer_ln1") {
                                     $values = preg_split("/\\s+/u", $cleanLine);
                                     if (count($values) != 4) {
                                         echo "Error, line value doesn't have 4 components:";
                                         var_dump($values);
                                         exit;
                                     }
                                     $currRaceDriverData->bestLap = $values[0];
                                     $currRaceDriverData->totalLaps = $values[1];
                                     $currRaceDriverData->behind = $values[2];
                                     $currRaceDriverData->averageLap = $values[3];
                                     $stage = "top3racer_ln2";
                                 } else {
                                     if ($stage == "top3racer_ln2") {
                                         // both info used only in GKR, useless for me
                                         $this->raceResult->addDriver($currRaceDriverData);
                                         $currRaceDriverData = new Event\RaceDriverData();
                                         if ($top3racerCount < 3) {
                                             $stage = "top3racer_ln0";
                                         } else {
                                             $stage = "restOfRacerHeader";
                                         }
                                     } else {
                                         if ($stage == "restOfRacerHeader") {
                                             // it's fixed (hopefully), I don't care.
                                             $stage = "restOfRacerContent";
                                         } else {
                                             if ($stage == "restOfRacerContent") {
                                                 $values = preg_split("/\t+/u", $cleanLine);
                                                 if (count($values) != 7) {
                                                     echo "Error, line value doesn't have 7 components:";
                                                     var_dump($values);
                                                     exit;
                                                 }
                                                 $currRaceDriverData->carNum = $values[0];
                                                 $currRaceDriverData->finishPosition = intval($values[0]);
                                                 $currRaceDriverData->name = trim($values[1]);
                                                 $currRaceDriverData->bestLap = $values[2];
                                                 $currRaceDriverData->behind = $values[3];
                                                 // careful, this is about gap from leader
                                                 $currRaceDriverData->totalLaps = $values[4];
                                                 $currRaceDriverData->averageLap = $values[5];
                                                 // index=6 is RPM score, don't care
                                                 $this->raceResult->addDriver($currRaceDriverData);
                                                 $currRaceDriverData = new Event\RaceDriverData();
                                             } else {
                                                 if ($stage == "lapTimeHeader") {
                                                     $currRacerName = $cleanLine;
                                                     $currracerId = $this->raceResult->getIdByName($currRacerName);
                                                     if ($currracerId === -1) {
                                                         echo "current racer not found: \"{$currRacerName}\"";
                                                         exit;
                                                     }
                                                     $stage = "lapTimeContent";
                                                 } else {
                                                     if ($stage == "lapTimeContent") {
                                                         $values = preg_split("/\\s+/u", $cleanLine);
                                                         if (count($values) == 3) {
                                                             if ($this->raceResult->driverList[$currracerId]->lapData->isEmpty()) {
                                                                 // fill a dummy first lap based on first lap position, GKR doesn't count "before" first real lap data.
                                                                 $tempPos = str_replace("[", "", str_replace("]", "", $values[2]));
                                                                 $this->raceResult->driverList[$currracerId]->lapData->addLapTime(floatval($tempPos));
                                                             }
                                                             $this->raceResult->driverList[$currracerId]->lapData->addLapTime(floatval($values[1]));
                                                         }
                                                         // otherwise, empty lap data for being lapped
                                                     }
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     //var_dump($this->raceResult);
 }