code: func nodeConditionsHaveChanged(originalConditions []v1.NodeCondition, conditions []v1.NodeCondition) bool {
  	if len(originalConditions) != len(conditions) {
  		return true
  	}
  
  	originalConditionsCopy := make([]v1.NodeCondition, 0, len(originalConditions))
  	originalConditionsCopy = append(originalConditionsCopy, originalConditions...)
  	conditionsCopy := make([]v1.NodeCondition, 0, len(conditions))
  	conditionsCopy = append(conditionsCopy, conditions...)
  
  	sort.SliceStable(originalConditionsCopy, func(i, j int) bool { return originalConditionsCopy[i].Type < originalConditionsCopy[j].Type })
  	sort.SliceStable(conditionsCopy, func(i, j int) bool { return conditionsCopy[i].Type < conditionsCopy[j].Type })
  
  	replacedheartbeatTime := metav1.Time{}
  	for i := range conditionsCopy {
  		originalConditionsCopy[i].LastHeartbeatTime = replacedheartbeatTime
  		conditionsCopy[i].LastHeartbeatTime = replacedheartbeatTime
  		if !apiequality.Semantic.DeepEqual(&originalConditionsCopy[i], &conditionsCopy[i]) {
  			return true
  		}
  	}
  	return false
  }
docs: // nodeConditionsHaveChanged compares the original node and current node's
  // conditions and returns true if any change happens. The heartbeat timestamp is
  // ignored.