    }
  }
  
  int Localizer::locationd_thread() {
    const std::initializer_list<const char *> service_list = {"gnssMeasurements", "cameraOdometry", "liveCalibration",
                                                            "carState", "carParams", "accelerometer", "gyroscope"};
  
    // TODO: remove carParams once we're always sending at 100Hz
    SubMaster sm(service_list, {}, nullptr, {"gnssMeasurements", "carParams"});
    PubMaster pm({"liveLocationKalman"});
 
</s> remove   SubMaster sm(service_list, {}, nullptr, {"gnssMeasurements", "carParams"});
 </s> add   SubMaster sm(service_list, {}, nullptr, {gps_location_socket, "carParams"}); </s> remove       "cameraOdometry", "accelerometer", "gyroscope", "gnssMeasurements",
      "liveCalibration", "carState", "carParams"
 </s> add       "cameraOdometry", "accelerometer", "gyroscope", "gpsLocationExternal",
      "liveCalibration", "carState", "carParams", "gpsLocation" </s> remove   if ((gps_est_error > GPS_POS_ERROR_RESET_THRESHOLD && ecef_pos_std_norm < GPS_POS_STD_RESET_THRESHOLD) || this->last_gps_msg == 0) {
 </s> add   if ((gps_est_error > GPS_POS_ERROR_RESET_THRESHOLD && ecef_pos_std < GPS_POS_STD_RESET_THRESHOLD) || this->last_gps_msg == 0) { </s> remove   } else if (log.isGnssMeasurements()) {
    this->handle_gnss(t, log.getGnssMeasurements());
 </s> add   } else if (log.isGpsLocation()) {
    this->handle_gps(t, log.getGpsLocation(), GPS_QUECTEL_SENSOR_TIME_OFFSET);
  } else if (log.isGpsLocationExternal()) {
    this->handle_gps(t, log.getGpsLocationExternal(), GPS_UBLOX_SENSOR_TIME_OFFSET);
  //} else if (log.isGnssMeasurements()) {
  //  this->handle_gnss(t, log.getGnssMeasurements());
  LocalizerGnssSource source;
  const char* gps_location_socket;
  if (Params().getBool("UbloxAvailable")) {
    source = LocalizerGnssSource::UBLOX;
    gps_location_socket = "gpsLocationExternal";
  } else {
    source = LocalizerGnssSource::QCOM;
    gps_location_socket = "gpsLocation";
  }

  this->configure_gnss_source(source);
  const std::initializer_list<const char *> service_list = {gps_location_socket, "cameraOdometry", "liveCalibration",
    }
  }
  
  int Localizer::locationd_thread() {
  LocalizerGnssSource source;
  const char* gps_location_socket;
  if (Params().getBool("UbloxAvailable")) {
    source = LocalizerGnssSource::UBLOX;
    gps_location_socket = "gpsLocationExternal";
  } else {
    source = LocalizerGnssSource::QCOM;
    gps_location_socket = "gpsLocation";
  }

  this->configure_gnss_source(source);
  const std::initializer_list<const char *> service_list = {gps_location_socket, "cameraOdometry", "liveCalibration",
                                                            "carState", "carParams", "accelerometer", "gyroscope"};
  
    // TODO: remove carParams once we're always sending at 100Hz
    SubMaster sm(service_list, {}, nullptr, {"gnssMeasurements", "carParams"});
    PubMaster pm({"liveLocationKalman"});
keep keep keep keep replace keep keep keep keep keep
 Revert laikad llk (#29535)

* Revert "bump laika (#29522)"

This reverts commit 3523bef732316b534de66dcb9e7d29e53e37e99f.

* Revert "Locationd: switch to laikad (#29278)"

This reverts commit fd3b8a3d7511ad3d7c5aa0b82a1e2c28505e5a7f. 
selfdrive/locationd/locationd.cc