        }
      }
  
      // tracked dropped frames
      uint32_t vipc_dropped_frames = meta_main.frame_id - last_vipc_frame_id - 1;
      float frames_dropped = frame_dropped_filter.update((float)std::min(vipc_dropped_frames, 10U));
      if (run_count < 10) { // let frame drops warm up
 
</s> remove   SubMaster sm({"lateralPlan", "roadCameraState", "liveCalibration", "driverMonitoringState", "navModel"});
 </s> add   SubMaster sm({"lateralPlan", "roadCameraState", "liveCalibration", "driverMonitoringState", "navModel", "navInstruction"}); </s> remove ModelOutput* model_eval_frame(ModelState* s, VisionBuf* buf, VisionBuf* wbuf,
                              const mat3 &transform, const mat3 &transform_wide, float *desire_in, bool is_rhd, float *driving_style, float *nav_features, bool prepare_only) {
 </s> add ModelOutput* model_eval_frame(ModelState* s, VisionBuf* buf, VisionBuf* wbuf, const mat3 &transform, const mat3 &transform_wide,
                              float *desire_in, bool is_rhd, float *driving_style, float *nav_features, float *nav_instructions, bool prepare_only) { </s> remove     ModelOutput *model_output = model_eval_frame(&model, buf_main, buf_extra, model_transform_main, model_transform_extra, vec_desire, is_rhd, driving_style, nav_features, prepare_only);
 </s> add     ModelOutput *model_output = model_eval_frame(&model, buf_main, buf_extra, model_transform_main, model_transform_extra, vec_desire, is_rhd, driving_style, nav_features, nav_instructions, prepare_only); </s> remove     parse_banner_instructions(msg.navInstruction, banner_step['bannerInstructions'], distance_to_maneuver_along_geometry)
 </s> add     instruction = parse_banner_instructions(banner_step['bannerInstructions'], distance_to_maneuver_along_geometry)
    if instruction is not None:
      for k,v in instruction.items():
        setattr(msg.navInstruction, k, v)

    # All instructions
    maneuvers = []
    for i, step_i in enumerate(self.route):
      if i < self.step_idx:
        distance_to_maneuver = -sum(self.route[j]['distance'] for j in range(i+1, self.step_idx)) - along_geometry
      elif i == self.step_idx:
        distance_to_maneuver = distance_to_maneuver_along_geometry
      else:
        distance_to_maneuver = distance_to_maneuver_along_geometry + sum(self.route[j]['distance'] for j in range(self.step_idx+1, i+1))

      instruction = parse_banner_instructions(step_i['bannerInstructions'], distance_to_maneuver)
      if instruction is None:
        continue
      maneuver = {'distance': distance_to_maneuver}
      if 'maneuverType' in instruction:
        maneuver['type'] = instruction['maneuverType']
      if 'maneuverModifier' in instruction:
        maneuver['modifier'] = instruction['maneuverModifier']
      maneuvers.append(maneuver)

    msg.navInstruction.allManeuvers = maneuvers
    if (nav_enabled && sm.updated("navInstruction")) {
      memset(nav_instructions, 0, sizeof(float)*NAV_INSTRUCTION_LEN);
      auto maneuvers = sm["navInstruction"].getNavInstruction().getAllManeuvers();
      for (int i=0; i<maneuvers.size(); i++) {
        int distance_idx = 25 + (int)(maneuvers[i].getDistance() / 20);
        std::string direction = maneuvers[i].getModifier();
        int direction_idx = 0;
        if (direction == "left" || direction == "slight left" || direction == "sharp left") direction_idx = 1;
        if (direction == "right" || direction == "slight right" || direction == "sharp right") direction_idx = 2;
        if (distance_idx >= 0 && distance_idx < 50) {
          nav_instructions[distance_idx*3 + direction_idx] = 1;
        }
      }
    }

        }
      }
  
    if (nav_enabled && sm.updated("navInstruction")) {
      memset(nav_instructions, 0, sizeof(float)*NAV_INSTRUCTION_LEN);
      auto maneuvers = sm["navInstruction"].getNavInstruction().getAllManeuvers();
      for (int i=0; i<maneuvers.size(); i++) {
        int distance_idx = 25 + (int)(maneuvers[i].getDistance() / 20);
        std::string direction = maneuvers[i].getModifier();
        int direction_idx = 0;
        if (direction == "left" || direction == "slight left" || direction == "sharp left") direction_idx = 1;
        if (direction == "right" || direction == "slight right" || direction == "sharp right") direction_idx = 2;
        if (distance_idx >= 0 && distance_idx < 50) {
          nav_instructions[distance_idx*3 + direction_idx] = 1;
        }
      }
    }

      // tracked dropped frames
      uint32_t vipc_dropped_frames = meta_main.frame_id - last_vipc_frame_id - 1;
      float frames_dropped = frame_dropped_filter.update((float)std::min(vipc_dropped_frames, 10U));
      if (run_count < 10) { // let frame drops warm up
keep keep add keep keep keep keep
 Non-Inflatable Model :balloon:  (#29003)

* Added all maneuvers to navInstruction message

* Added nav instruction logic to modeld

* New model: fcee01c1-96bb-414f-b00d-e4a994a00922/700

* Fixed bug in navd

* Added sharp/slight modifiers

* Updated refs 
selfdrive/modeld/modeld.cc