```json
{
  "sym_variables": [
    ("x0", "protein bars"),
    ("x1", "lemons"),
    ("x2", "blueberry pies"),
    ("x3", "peanutbutter sandwiches"),
    ("x4", "sashimi")
  ],
  "objective_function": "3.67 * x0 + 4.72 * x1 + 8.41 * x2 + 9.9 * x3 + 4.04 * x4",
  "constraints": [
    "1.4 * x0 + 0.8 * x1 + 1.18 * x2 + 1.55 * x3 + 1.17 * x4 <= 369",
    "1.6 * x0 + 1.4 * x1 + 0.29 * x2 + 0.33 * x3 + 2.27 * x4 <= 721",
    "0.3 * x0 + 0.81 * x1 + 1.75 * x2 + 2.36 * x3 + 1.97 * x4 <= 407",
    "0.8 * x1 + 1.55 * x3 >= 47",
    "1.55 * x3 + 1.17 * x4 >= 27",
    "0.8 * x1 + 1.18 * x2 + 1.17 * x4 >= 58",
    "1.4 * x0 + 1.55 * x3 + 1.17 * x4 >= 58",
    "0.8 * x1 + 1.18 * x2 + 1.17 * x4 >= 40",
    "1.4 * x0 + 1.55 * x3 + 1.17 * x4 >= 40",
    "1.6 * x0 + 0.29 * x2 >= 137",
    "1.6 * x0 + 0.33 * x3 >= 69",
    "1.4 * x1 + 0.33 * x3 >= 100",
    "1.4 * x1 + 0.29 * x2 >= 60",
    "1.4 * x1 + 0.33 * x3 + 2.27 * x4 >= 126",
    "1.6 * x0 + 1.4 * x1 + 0.33 * x3 >= 126",
    "1.4 * x1 + 0.29 * x2 + 2.27 * x4 >= 126",
    "1.6 * x0 + 0.29 * x2 + 2.27 * x4 >= 126",
    "1.6 * x0 + 0.29 * x2 + 0.33 * x3 >= 126",
    "1.4 * x1 + 0.33 * x3 + 2.27 * x4 >= 106",
    "1.6 * x0 + 1.4 * x1 + 0.33 * x3 >= 106",
    "1.4 * x1 + 0.29 * x2 + 2.27 * x4 >= 106",
    "1.6 * x0 + 0.29 * x2 + 2.27 * x4 >= 106",
    "1.6 * x0 + 0.29 * x2 + 0.33 * x3 >= 106",
    "1.4 * x1 + 0.33 * x3 + 2.27 * x4 >= 130",
    "1.6 * x0 + 1.4 * x1 + 0.33 * x3 >= 130",
    "1.4 * x1 + 0.29 * x2 + 2.27 * x4 >= 130",
    "1.6 * x0 + 0.29 * x2 + 2.27 * x4 >= 130",
    "1.6 * x0 + 0.29 * x2 + 0.33 * x3 >= 130",
    "1.4 * x1 + 0.33 * x3 + 2.27 * x4 >= 140",
    "1.6 * x0 + 1.4 * x1 + 0.33 * x3 >= 140",
    "1.4 * x1 + 0.29 * x2 + 2.27 * x4 >= 140",
    "1.6 * x0 + 0.29 * x2 + 2.27 * x4 >= 140",
    "1.6 * x0 + 0.29 * x2 + 0.33 * x3 >= 140",
    "1.4 * x1 + 0.33 * x3 + 2.27 * x4 >= 96",
    "1.6 * x0 + 1.4 * x1 + 0.33 * x3 >= 96",
    "1.4 * x1 + 0.29 * x2 + 2.27 * x4 >= 96",
    "1.6 * x0 + 0.29 * x2 + 2.27 * x4 >= 96",
    "1.6 * x0 + 0.29 * x2 + 0.33 * x3 >= 96",
    "0.81 * x1 + 1.75 * x2 >= 46",
    "0.3 * x0 + 0.81 * x1 >= 41",
    "0.3 * x0 + 1.75 * x2 >= 36",
    "0.81 * x1 + 1.97 * x4 >= 79",
    "0.3 * x0 + 2.36 * x3 >= 52",
    "1.75 * x2 + 1.97 * x4 >= 61",
    "0.81 * x1 + 1.75 * x2 + 1.97 * x4 >= 64",
    "1.4 * x0 + 0.8 * x1 <= 196",
    "1.4 * x0 + 1.55 * x3 <= 143",
    "0.8 * x1 + 1.55 * x3 <= 266",
    "0.8 * x1 + 1.17 * x4 <= 200",
    "0.8 * x1 + 1.18 * x2 <= 321",
    "1.4 * x0 + 1.17 * x4 <= 282",
    "1.18 * x2 + 1.17 * x4 <= 176",
    "1.4 * x0 + 1.55 * x3 + 1.17 * x4 <= 148",
    "1.18 * x2 + 1.55 * x3 + 1.17 * x4 <= 312",
    "1.4 * x0 + 0.8 * x1 + 1.18 * x2 + 1.55 * x3 + 1.17 * x4 <= 312",
    "1.6 * x0 + 0.33 * x3 <= 518",
    "1.4 * x1 + 0.29 * x2 <= 242",
    "0.29 * x2 + 0.33 * x3 <= 424",
    "0.33 * x3 + 2.27 * x4 <= 686",
    "1.4 * x1 + 2.27 * x4 <= 210",
    "1.4 * x1 + 0.33 * x3 <= 685",
    "1.6 * x0 + 0.29 * x2 + 2.27 * x4 <= 156",
    "1.6 * x0 + 1.4 * x1 + 0.29 * x2 + 0.33 * x3 + 2.27 * x4 <= 156",
    "1.75 * x2 + 1.97 * x4 <= 150",
    "0.81 * x1 + 1.97 * x4 <= 363",
    "0.3 * x0 + 1.97 * x4 <= 195",
    "1.75 * x2 + 2.36 * x3 <= 391",
    "0.81 * x1 + 1.75 * x2 <= 352",
    "0.3 * x0 + 2.36 * x3 <= 353",
    "0.81 * x1 + 2.36 * x3 <= 220",
    "0.3 * x0 + 0.81 * x1 <= 269",
    "0.3 * x0 + 0.81 * x1 + 2.36 * x3 <= 269",
    "0.3 * x0 + 1.75 * x2 + 2.36 * x3 <= 267",
    "0.3 * x0 + 0.81 * x1 + 1.75 * x2 + 2.36 * x3 + 1.97 * x4 <= 267"
  ]
}
```

```python
import gurobipy as gp

# Create a new model
m = gp.Model("optimization_problem")

# Create variables
x = m.addVars(5, lb=0, vtype=gp.GRB.CONTINUOUS, names=["protein bars", "lemons", "blueberry pies", "peanutbutter sandwiches", "sashimi"])


# Set objective function
m.setObjective(3.67 * x[0] + 4.72 * x[1] + 8.41 * x[2] + 9.9 * x[3] + 4.04 * x[4], gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(1.4 * x[0] + 0.8 * x[1] + 1.18 * x[2] + 1.55 * x[3] + 1.17 * x[4] <= 369, "r0")
m.addConstr(1.6 * x[0] + 1.4 * x[1] + 0.29 * x[2] + 0.33 * x[3] + 2.27 * x[4] <= 721, "r1")
m.addConstr(0.3 * x[0] + 0.81 * x[1] + 1.75 * x[2] + 2.36 * x[3] + 1.97 * x[4] <= 407, "r2")
m.addConstr(0.8 * x[1] + 1.55 * x[3] >= 47, "c1")
m.addConstr(1.55 * x[3] + 1.17 * x[4] >= 27, "c2")
m.addConstr(0.8 * x[1] + 1.18 * x[2] + 1.17 * x[4] >= 58, "c3")
m.addConstr(1.4 * x[0] + 1.55 * x[3] + 1.17 * x[4] >= 58, "c4")
m.addConstr(0.8 * x[1] + 1.18 * x[2] + 1.17 * x[4] >= 40, "c5")
m.addConstr(1.4 * x[0] + 1.55 * x[3] + 1.17 * x[4] >= 40, "c6")


#Fat Constraints
m.addConstr(1.6 * x[0] + 0.29 * x[2] >= 137, "c7")
m.addConstr(1.6 * x[0] + 0.33 * x[3] >= 69, "c8")
m.addConstr(1.4 * x[1] + 0.33 * x[3] >= 100, "c9")
m.addConstr(1.4 * x[1] + 0.29 * x[2] >= 60, "c10")
m.addConstr(1.4 * x[1] + 0.33 * x[3] + 2.27 * x[4] >= 126, "c11")
m.addConstr(1.6 * x[0] + 1.4 * x[1] + 0.33 * x[3] >= 126, "c12")
m.addConstr(1.4 * x[1] + 0.29 * x[2] + 2.27 * x[4] >= 126, "c13")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 2.27 * x[4] >= 126, "c14")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 0.33 * x[3] >= 126, "c15")
m.addConstr(1.4 * x[1] + 0.33 * x[3] + 2.27 * x[4] >= 106, "c16")
m.addConstr(1.6 * x[0] + 1.4 * x[1] + 0.33 * x[3] >= 106, "c17")
m.addConstr(1.4 * x[1] + 0.29 * x[2] + 2.27 * x[4] >= 106, "c18")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 2.27 * x[4] >= 106, "c19")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 0.33 * x[3] >= 106, "c20")
m.addConstr(1.4 * x[1] + 0.33 * x[3] + 2.27 * x[4] >= 130, "c21")
m.addConstr(1.6 * x[0] + 1.4 * x[1] + 0.33 * x[3] >= 130, "c22")
m.addConstr(1.4 * x[1] + 0.29 * x[2] + 2.27 * x[4] >= 130, "c23")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 2.27 * x[4] >= 130, "c24")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 0.33 * x[3] >= 130, "c25")
m.addConstr(1.4 * x[1] + 0.33 * x[3] + 2.27 * x[4] >= 140, "c26")
m.addConstr(1.6 * x[0] + 1.4 * x[1] + 0.33 * x[3] >= 140, "c27")
m.addConstr(1.4 * x[1] + 0.29 * x[2] + 2.27 * x[4] >= 140, "c28")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 2.27 * x[4] >= 140, "c29")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 0.33 * x[3] >= 140, "c30")
m.addConstr(1.4 * x[1] + 0.33 * x[3] + 2.27 * x[4] >= 96, "c31")
m.addConstr(1.6 * x[0] + 1.4 * x[1] + 0.33 * x[3] >= 96, "c32")
m.addConstr(1.4 * x[1] + 0.29 * x[2] + 2.27 * x[4] >= 96, "c33")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 2.27 * x[4] >= 96, "c34")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 0.33 * x[3] >= 96, "c35")


# Cost Constraints
m.addConstr(0.81 * x[1] + 1.75 * x[2] >= 46, "c36")
m.addConstr(0.3 * x[0] + 0.81 * x[1] >= 41, "c37")
m.addConstr(0.3 * x[0] + 1.75 * x[2] >= 36, "c38")
m.addConstr(0.81 * x[1] + 1.97 * x[4] >= 79, "c39")
m.addConstr(0.3 * x[0] + 2.36 * x[3] >= 52, "c40")
m.addConstr(1.75 * x[2] + 1.97 * x[4] >= 61, "c41")
m.addConstr(0.81 * x[1] + 1.75 * x[2] + 1.97 * x[4] >= 64, "c42")

# Sourness Upper Bound Constraints
m.addConstr(1.4 * x[0] + 0.8 * x[1] <= 196, "c43")
m.addConstr(1.4 * x[0] + 1.55 * x[3] <= 143, "c44")
m.addConstr(0.8 * x[1] + 1.55 * x[3] <= 266, "c45")
m.addConstr(0.8 * x[1] + 1.17 * x[4] <= 200, "c46")
m.addConstr(0.8 * x[1] + 1.18 * x[2] <= 321, "c47")
m.addConstr(1.4 * x[0] + 1.17 * x[4] <= 282, "c48")
m.addConstr(1.18 * x[2] + 1.17 * x[4] <= 176, "c49")
m.addConstr(1.4 * x[0] + 1.55 * x[3] + 1.17 * x[4] <= 148, "c50")
m.addConstr(1.18 * x[2] + 1.55 * x[3] + 1.17 * x[4] <= 312, "c51")
m.addConstr(1.4 * x[0] + 0.8 * x[1] + 1.18 * x[2] + 1.55 * x[3] + 1.17 * x[4] <= 312, "c52")

# Fat Upper Bound Constraints
m.addConstr(1.6 * x[0] + 0.33 * x[3] <= 518, "c53")
m.addConstr(1.4 * x[1] + 0.29 * x[2] <= 242, "c54")
m.addConstr(0.29 * x[2] + 0.33 * x[3] <= 424, "c55")
m.addConstr(0.33 * x[3] + 2.27 * x[4] <= 686, "c56")
m.addConstr(1.4 * x[1] + 2.27 * x[4] <= 210, "c57")
m.addConstr(1.4 * x[1] + 0.33 * x[3] <= 685, "c58")
m.addConstr(1.6 * x[0] + 0.29 * x[2] + 2.27 * x[4] <= 156, "c59")
m.addConstr(1.6 * x[0] + 1.4 * x[1] + 0.29 * x[2] + 0.33 * x[3] + 2.27 * x[4] <= 156, "c60")

# Cost Upper Bound Constraints
m.addConstr(1.75 * x[2] + 1.97 * x[4] <= 150, "c61")
m.addConstr(0.81 * x[1] + 1.97 * x[4] <= 363, "c62")
m.addConstr(0.3 * x[0] + 1.97 * x[4] <= 195, "c63")
m.addConstr(1.75 * x[2] + 2.36 * x[3] <= 391, "c64")
m.addConstr(0.81 * x[1] + 1.75 * x[2] <= 352, "c65")
m.addConstr(0.3 * x[0] + 2.36 * x[3] <= 353, "c66")
m.addConstr(0.81 * x[1] + 2.36 * x[3] <= 220, "c67")
m.addConstr(0.3 * x[0] + 0.81 * x[1] <= 269, "c68")
m.addConstr(0.3 * x[0] + 0.81 * x[1] + 2.36 * x[3] <= 269, "c69")
m.addConstr(0.3 * x[0] + 1.75 * x[2] + 2.36 * x[3] <= 267, "c70")
m.addConstr(0.3 * x[0] + 0.81 * x[1] + 1.75 * x[2] + 2.36 * x[3] + 1.97 * x[4] <= 267, "c71")


# Optimize model
m.optimize()

# Print results
if m.status == gp.GRB.OPTIMAL:
    print("Optimal solution found:")
    for v in m.getVars():
        print(f"{v.varName}: {v.x}")
    print(f"Objective value: {m.objVal}")
elif m.status == gp.GRB.INFEASIBLE:
    print("Model is infeasible.")
else:
    print(f"Optimization terminated with status {m.status}.")

```