```json
{
  "sym_variables": [
    ("x0", "hours worked by Mary"),
    ("x1", "hours worked by Paul"),
    ("x2", "hours worked by Jean"),
    ("x3", "hours worked by Ringo"),
    ("x4", "hours worked by Hank")
  ],
  "objective_function": "5*x0 + 5*x1 + 2*x2 + 9*x3 + 5*x4",
  "constraints": [
    "12*x3 + 2*x4 >= 78",
    "13*x0 + 15*x1 >= 45",
    "15*x1 + 12*x3 >= 49",
    "13*x0 + 2*x4 >= 48",
    "15*x1 + 20*x2 >= 34",
    "20*x2 + 12*x3 >= 40",
    "13*x0 + 20*x2 >= 59",
    "13*x0 + 15*x1 + 2*x4 >= 80",
    "15*x1 + 20*x2 + 2*x4 >= 80",
    "13*x0 + 15*x1 + 2*x4 >= 52",
    "15*x1 + 20*x2 + 2*x4 >= 52",
    "4*x1 + 6*x2 >= 56",
    "12*x3 + 18*x4 >= 68",
    "23*x0 + 6*x2 + 12*x3 >= 52",
    "13*x0 + 20*x2 <= 120",
    "12*x3 + 2*x4 <= 161",
    "13*x0 + 15*x1 <= 247",
    "13*x0 + 15*x1 + 20*x2 + 12*x3 + 2*x4 <= 247",
    "6*x2 + 12*x3 <= 205",
    "23*x0 + 18*x4 <= 294",
    "4*x1 + 6*x2 <= 320",
    "4*x1 + 12*x3 + 18*x4 <= 330",
    "23*x0 + 6*x2 + 12*x3 <= 175",
    "4*x1 + 6*x2 + 18*x4 <= 309",
    "23*x0 + 6*x2 + 18*x4 <= 293",
    "23*x0 + 4*x1 + 6*x2 + 12*x3 + 18*x4 <= 293",
    "x0, x1, x2, x3, x4 are integers"


  ]
}
```

```python
import gurobipy as gp

# Create a new model
model = gp.Model("Optimize Hours")

# Create variables
mary = model.addVar(vtype=gp.GRB.INTEGER, name="mary")
paul = model.addVar(vtype=gp.GRB.INTEGER, name="paul")
jean = model.addVar(vtype=gp.GRB.INTEGER, name="jean")
ringo = model.addVar(vtype=gp.GRB.INTEGER, name="ringo")
hank = model.addVar(vtype=gp.GRB.INTEGER, name="hank")


# Set objective function
model.setObjective(5*mary + 5*paul + 2*jean + 9*ringo + 5*hank, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(12*ringo + 2*hank >= 78)
model.addConstr(13*mary + 15*paul >= 45)
model.addConstr(15*paul + 12*ringo >= 49)
model.addConstr(13*mary + 2*hank >= 48)
model.addConstr(15*paul + 20*jean >= 34)
model.addConstr(20*jean + 12*ringo >= 40)
model.addConstr(13*mary + 20*jean >= 59)
model.addConstr(13*mary + 15*paul + 2*hank >= 80)
model.addConstr(15*paul + 20*jean + 2*hank >= 80)
model.addConstr(13*mary + 15*paul + 2*hank >= 52)
model.addConstr(15*paul + 20*jean + 2*hank >= 52)
model.addConstr(4*paul + 6*jean >= 56)
model.addConstr(12*ringo + 18*hank >= 68)
model.addConstr(23*mary + 6*jean + 12*ringo >= 52)
model.addConstr(13*mary + 20*jean <= 120)
model.addConstr(12*ringo + 2*hank <= 161)
model.addConstr(13*mary + 15*paul <= 247)
model.addConstr(13*mary + 15*paul + 20*jean + 12*ringo + 2*hank <= 247)
model.addConstr(6*jean + 12*ringo <= 205)
model.addConstr(23*mary + 18*hank <= 294)
model.addConstr(4*paul + 6*jean <= 320)
model.addConstr(4*paul + 12*ringo + 18*hank <= 330)
model.addConstr(23*mary + 6*jean + 12*ringo <= 175)
model.addConstr(4*paul + 6*jean + 18*hank <= 309)
model.addConstr(23*mary + 6*jean + 18*hank <= 293)
model.addConstr(23*mary + 4*paul + 6*jean + 12*ringo + 18*hank <= 293)



# Optimize model
model.optimize()

# Print results
if model.status == gp.GRB.OPTIMAL:
    print('Obj: %g' % model.objVal)
    for v in model.getVars():
        print('%s %g' % (v.varName, v.x))
elif model.status == gp.GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print(f"Optimization ended with status {model.status}")

```