| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -5,7 +5,7 @@ from opendbc.can.can_define import CANDefine | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from opendbc.can.parser import CANParser | 
					 | 
					 | 
					 | 
					from opendbc.can.parser import CANParser | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.config import Conversions as CV | 
					 | 
					 | 
					 | 
					from selfdrive.config import Conversions as CV | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.car.interfaces import CarStateBase | 
					 | 
					 | 
					 | 
					from selfdrive.car.interfaces import CarStateBase | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.car.honda.values import CAR, DBC, STEER_THRESHOLD, HONDA_BOSCH, HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_ALT_BRAKE_SIGNAL | 
					 | 
					 | 
					 | 
					from selfdrive.car.honda.values import CAR, DBC, STEER_THRESHOLD, HONDA_BOSCH, HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_ALT_BRAKE_SIGNAL, HONDA_RADARLESS | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					TransmissionType = car.CarParams.TransmissionType | 
					 | 
					 | 
					 | 
					TransmissionType = car.CarParams.TransmissionType | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -77,7 +77,7 @@ def get_can_signals(CP, gearbox_msg, main_on_sig_msg): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    signals += [("BRAKE_PRESSED", "BRAKE_MODULE", 0)] | 
					 | 
					 | 
					 | 
					    signals += [("BRAKE_PRESSED", "BRAKE_MODULE", 0)] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    checks += [("BRAKE_MODULE", 50)] | 
					 | 
					 | 
					 | 
					    checks += [("BRAKE_MODULE", 50)] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if CP.carFingerprint in HONDA_BOSCH: | 
					 | 
					 | 
					 | 
					  if CP.carFingerprint in HONDA_BOSCH or CP.carFingerprint in HONDA_RADARLESS: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    signals += [ | 
					 | 
					 | 
					 | 
					    signals += [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("EPB_STATE", "EPB_STATUS", 0), | 
					 | 
					 | 
					 | 
					      ("EPB_STATE", "EPB_STATUS", 0), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("IMPERIAL_UNIT", "CAR_SPEED", 1), | 
					 | 
					 | 
					 | 
					      ("IMPERIAL_UNIT", "CAR_SPEED", 1), | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -95,7 +95,7 @@ def get_can_signals(CP, gearbox_msg, main_on_sig_msg): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ("AEB_STATUS", "ACC_CONTROL", 0), | 
					 | 
					 | 
					 | 
					        ("AEB_STATUS", "ACC_CONTROL", 0), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ] | 
					 | 
					 | 
					 | 
					      ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      checks += [ | 
					 | 
					 | 
					 | 
					      checks += [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ("ACC_HUD", 10), | 
					 | 
					 | 
					 | 
					        ("ACC_HUD", 0), # TODO: Fix this | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ("ACC_CONTROL", 50), | 
					 | 
					 | 
					 | 
					        ("ACC_CONTROL", 50), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ] | 
					 | 
					 | 
					 | 
					      ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  else:  # Nidec signals | 
					 | 
					 | 
					 | 
					  else:  # Nidec signals | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -107,7 +107,7 @@ def get_can_signals(CP, gearbox_msg, main_on_sig_msg): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else: | 
					 | 
					 | 
					 | 
					    else: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      checks += [("CRUISE_PARAMS", 50)] | 
					 | 
					 | 
					 | 
					      checks += [("CRUISE_PARAMS", 50)] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E): | 
					 | 
					 | 
					 | 
					  if CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.CIVIC_22): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    signals += [("DRIVERS_DOOR_OPEN", "SCM_FEEDBACK", 1)] | 
					 | 
					 | 
					 | 
					    signals += [("DRIVERS_DOOR_OPEN", "SCM_FEEDBACK", 1)] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  elif CP.carFingerprint == CAR.ODYSSEY_CHN: | 
					 | 
					 | 
					 | 
					  elif CP.carFingerprint == CAR.ODYSSEY_CHN: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    signals += [("DRIVERS_DOOR_OPEN", "SCM_BUTTONS", 1)] | 
					 | 
					 | 
					 | 
					    signals += [("DRIVERS_DOOR_OPEN", "SCM_BUTTONS", 1)] | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -185,7 +185,7 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # ******************* parse out can ******************* | 
					 | 
					 | 
					 | 
					    # ******************* parse out can ******************* | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # TODO: find wheels moving bit in dbc | 
					 | 
					 | 
					 | 
					    # TODO: find wheels moving bit in dbc | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E): | 
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.CIVIC_22): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 0.1 | 
					 | 
					 | 
					 | 
					      ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 0.1 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"]) | 
					 | 
					 | 
					 | 
					      ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"]) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    elif self.CP.carFingerprint == CAR.ODYSSEY_CHN: | 
					 | 
					 | 
					 | 
					    elif self.CP.carFingerprint == CAR.ODYSSEY_CHN: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -237,7 +237,7 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ret.brakeHoldActive = cp.vl["VSA_STATUS"]["BRAKE_HOLD_ACTIVE"] == 1 | 
					 | 
					 | 
					 | 
					    ret.brakeHoldActive = cp.vl["VSA_STATUS"]["BRAKE_HOLD_ACTIVE"] == 1 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in (CAR.CIVIC, CAR.ODYSSEY, CAR.ODYSSEY_CHN, CAR.CRV_5G, CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, | 
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in (CAR.CIVIC, CAR.ODYSSEY, CAR.ODYSSEY_CHN, CAR.CRV_5G, CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                                  CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E): | 
					 | 
					 | 
					 | 
					                                  CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.CIVIC_22): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.park_brake = cp.vl["EPB_STATUS"]["EPB_STATE"] != 0 | 
					 | 
					 | 
					 | 
					      self.park_brake = cp.vl["EPB_STATUS"]["EPB_STATE"] != 0 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else: | 
					 | 
					 | 
					 | 
					    else: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.park_brake = 0  # TODO | 
					 | 
					 | 
					 | 
					      self.park_brake = 0  # TODO | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -259,13 +259,14 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ret.steeringTorqueEps = cp.vl["STEER_MOTOR_TORQUE"]["MOTOR_TORQUE"] | 
					 | 
					 | 
					 | 
					    ret.steeringTorqueEps = cp.vl["STEER_MOTOR_TORQUE"]["MOTOR_TORQUE"] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD.get(self.CP.carFingerprint, 1200) | 
					 | 
					 | 
					 | 
					    ret.steeringPressed = abs(ret.steeringTorque) > STEER_THRESHOLD.get(self.CP.carFingerprint, 1200) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in HONDA_BOSCH: | 
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in HONDA_BOSCH or self.CP.carFingerprint in HONDA_RADARLESS: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if not self.CP.openpilotLongitudinalControl: | 
					 | 
					 | 
					 | 
					      if not self.CP.openpilotLongitudinalControl: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ret.cruiseState.nonAdaptive = cp.vl["ACC_HUD"]["CRUISE_CONTROL_LABEL"] != 0 | 
					 | 
					 | 
					 | 
					        ret.cruiseState.nonAdaptive = cp.vl["ACC_HUD"]["CRUISE_CONTROL_LABEL"] != 0 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ret.cruiseState.standstill = cp.vl["ACC_HUD"]["CRUISE_SPEED"] == 252. | 
					 | 
					 | 
					 | 
					        ret.cruiseState.standstill = cp.vl["ACC_HUD"]["CRUISE_SPEED"] == 252. | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        # On set, cruise set speed pulses between 254~255 and the set speed prev is set to avoid this. | 
					 | 
					 | 
					 | 
					        # On set, cruise set speed pulses between 254~255 and the set speed prev is set to avoid this. | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        ret.cruiseState.speed = self.v_cruise_pcm_prev if cp.vl["ACC_HUD"]["CRUISE_SPEED"] > 160.0 else cp.vl["ACC_HUD"]["CRUISE_SPEED"] * CV.KPH_TO_MS | 
					 | 
					 | 
					 | 
					        # TODO: Fix this to support both cam and pt bus parsing | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        ret.cruiseState.speed = self.v_cruise_pcm_prev if cp_cam.vl["ACC_HUD"]["CRUISE_SPEED"] > 160.0 else cp_cam.vl["ACC_HUD"]["CRUISE_SPEED"] * CV.MPH_TO_MS | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        self.v_cruise_pcm_prev = ret.cruiseState.speed | 
					 | 
					 | 
					 | 
					        self.v_cruise_pcm_prev = ret.cruiseState.speed | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else: | 
					 | 
					 | 
					 | 
					    else: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ret.cruiseState.speed = cp.vl["CRUISE"]["CRUISE_SPEED_PCM"] * CV.KPH_TO_MS | 
					 | 
					 | 
					 | 
					      ret.cruiseState.speed = cp.vl["CRUISE"]["CRUISE_SPEED_PCM"] * CV.KPH_TO_MS | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -300,12 +301,12 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else: | 
					 | 
					 | 
					 | 
					    else: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.is_metric = False | 
					 | 
					 | 
					 | 
					      self.is_metric = False | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in HONDA_BOSCH: | 
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in HONDA_BOSCH or self.CP.carFingerprint in HONDA_RADARLESS: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ret.stockAeb = (not self.CP.openpilotLongitudinalControl) and bool(cp.vl["ACC_CONTROL"]["AEB_STATUS"] and cp.vl["ACC_CONTROL"]["ACCEL_COMMAND"] < -1e-5) | 
					 | 
					 | 
					 | 
					      ret.stockAeb = (not self.CP.openpilotLongitudinalControl) and bool(cp.vl["ACC_CONTROL"]["AEB_STATUS"] and cp.vl["ACC_CONTROL"]["ACCEL_COMMAND"] < -1e-5) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else: | 
					 | 
					 | 
					 | 
					    else: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ret.stockAeb = bool(cp_cam.vl["BRAKE_COMMAND"]["AEB_REQ_1"] and cp_cam.vl["BRAKE_COMMAND"]["COMPUTER_BRAKE"] > 1e-5) | 
					 | 
					 | 
					 | 
					      ret.stockAeb = bool(cp_cam.vl["BRAKE_COMMAND"]["AEB_REQ_1"] and cp_cam.vl["BRAKE_COMMAND"]["COMPUTER_BRAKE"] > 1e-5) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in HONDA_BOSCH: | 
					 | 
					 | 
					 | 
					    if self.CP.carFingerprint in HONDA_BOSCH or self.CP.carFingerprint in HONDA_RADARLESS: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.stock_hud = False | 
					 | 
					 | 
					 | 
					      self.stock_hud = False | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ret.stockFcw = False | 
					 | 
					 | 
					 | 
					      ret.stockFcw = False | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else: | 
					 | 
					 | 
					 | 
					    else: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -333,7 +334,14 @@ class CarState(CarStateBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      ("STEERING_CONTROL", 100), | 
					 | 
					 | 
					 | 
					      ("STEERING_CONTROL", 100), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ] | 
					 | 
					 | 
					 | 
					    ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if CP.carFingerprint not in HONDA_BOSCH: | 
					 | 
					 | 
					 | 
					    if CP.carFingerprint in HONDA_RADARLESS: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      signals += [("CRUISE_SPEED", "ACC_HUD", 255), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					              ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      checks += [ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        ("ACC_HUD", 0), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      ] | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    elif CP.carFingerprint not in HONDA_BOSCH: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      signals += [("COMPUTER_BRAKE", "BRAKE_COMMAND", 0), | 
					 | 
					 | 
					 | 
					      signals += [("COMPUTER_BRAKE", "BRAKE_COMMAND", 0), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                  ("AEB_REQ_1", "BRAKE_COMMAND", 0), | 
					 | 
					 | 
					 | 
					                  ("AEB_REQ_1", "BRAKE_COMMAND", 0), | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                  ("FCW", "BRAKE_COMMAND", 0), | 
					 | 
					 | 
					 | 
					                  ("FCW", "BRAKE_COMMAND", 0), | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |