    }
  }
  
  void ChartView::signalRemoved(const Signal *sig) {
    for (auto it = sigs.begin(); it != sigs.end(); /**/) {
      it = (it->sig == sig) ? removeItem(it) : ++it;
    }
  }
  
  void ChartView::msgUpdated(uint32_t address) {
 
</s> remove   if (auto m = const_cast<Msg *>(msg(id))) {
 </s> add   if (auto m = const_cast<cabana::Msg *>(msg(id))) { </s> remove       // split into one minitue chunks
 </s> add void ChartView::updateSeries(const cabana::Signal *sig, const std::vector<Event *> *events, bool clear) { </s> remove   inline const std::map<uint32_t, Msg> &messages() const { return msgs; }
  inline const Msg *msg(const MessageId &id) const { return msg(id.address); }
  inline const Msg *msg(uint32_t address) const {
 </s> add   inline const std::map<uint32_t, cabana::Msg> &messages() const { return msgs; }
  inline const cabana::Msg *msg(const MessageId &id) const { return msg(id.address); }
  inline const cabana::Msg *msg(uint32_t address) const { </s> remove int SignalModel::signalRow(const Signal *sig) const {
 </s> add int SignalModel::signalRow(const cabana::Signal *sig) const { </s> remove struct MessageId {
  uint8_t source;
  uint32_t address;

  QString toString() const {
    return QString("%1:%2").arg(source).arg(address, 1, 16);
  }

  bool operator==(const MessageId &other) const {
    return source == other.source && address == other.address;
  }

  bool operator!=(const MessageId &other) const {
    return !(*this == other);
  }

  bool operator<(const MessageId &other) const {
    return std::pair{source, address} < std::pair{other.source, other.address};
  }

  bool operator>(const MessageId &other) const {
    return std::pair{source, address} > std::pair{other.source, other.address};
  }
};

uint qHash(const MessageId &item);
Q_DECLARE_METATYPE(MessageId);

namespace dbcmanager {

typedef QList<std::pair<QString, QString>> ValueDescription;

struct Signal {
  QString name;
  int start_bit, msb, lsb, size;
  bool is_signed;
  double factor, offset;
  bool is_little_endian;
  QString min, max, unit;
  QString comment;
  ValueDescription val_desc;
};

struct Msg {
  QString name;
  uint32_t size;

  std::vector<const Signal*> getSignals() const;
  const Signal *sig(const QString &sig_name) const {
    auto it = std::find_if(sigs.begin(), sigs.end(), [&](auto &s) { return s.name == sig_name; });
    return it != sigs.end() ? &(*it) : nullptr;
  }

private:
  QList<Signal> sigs;
  friend class DBCManager;
};
 </s> add #include "tools/cabana/dbc.h"
void ChartView::signalUpdated(const cabana::Signal *sig) {
    }
  }
  
  void ChartView::signalRemoved(const Signal *sig) {
void ChartView::signalUpdated(const cabana::Signal *sig) {
      it = (it->sig == sig) ? removeItem(it) : ++it;
    }
  }
  
  void ChartView::msgUpdated(uint32_t address) {
keep keep keep keep replace keep keep keep keep keep
 cabana: refactor Msg and Signal into dbc.cc (#27552) 
tools/cabana/chartswidget.cc