```json
{
  "sym_variables": [
    ("x0", "hours worked by Ringo"),
    ("x1", "hours worked by Jean"),
    ("x2", "hours worked by Hank"),
    ("x3", "hours worked by Peggy")
  ],
  "objective_function": "3*x0 + 5*x1 + 8*x2 + 9*x3",
  "constraints": [
    "10*x1 + 6*x3 >= 51",
    "15*x0 + 10*x1 + 4*x2 >= 58",
    "15*x0 + 10*x1 + 6*x3 >= 58",
    "10*x1 + 4*x2 + 6*x3 >= 58",
    "15*x0 + 10*x1 + 4*x2 >= 69",
    "15*x0 + 10*x1 + 6*x3 >= 69",
    "10*x1 + 4*x2 + 6*x3 >= 69",
    "15*x0 + 10*x1 + 4*x2 >= 57",
    "15*x0 + 10*x1 + 6*x3 >= 57",
    "10*x1 + 4*x2 + 6*x3 >= 57",
    "17*x1 + 13*x3 >= 62",
    "1*x2 + 13*x3 >= 59",
    "17*x1 + 1*x2 >= 80",
    "6*x0 + 17*x1 + 13*x3 >= 77",
    "17*x1 + 1*x2 + 13*x3 >= 77",
    "6*x0 + 17*x1 + 13*x3 >= 59",
    "17*x1 + 1*x2 + 13*x3 >= 59",
    "6*x1 + 9*x2 - 9*x3 >= 0",
    "10*x1 + 4*x2 <= 165",
    "15*x0 + 10*x1 <= 445",
    "15*x0 + 4*x2 <= 380",
    "10*x1 + 6*x3 <= 153",
    "15*x0 + 6*x3 <= 120",
    "4*x2 + 6*x3 <= 258",
    "15*x0 + 10*x1 + 4*x2 + 6*x3 <= 258",
    "6*x0 + 17*x1 <= 243",
    "6*x0 + 13*x3 <= 220",
    "17*x1 + 13*x3 <= 112",
    "1*x2 + 13*x3 <= 201",
    "6*x0 + 17*x1 + 13*x3 <= 159",
    "17*x1 + 1*x2 + 13*x3 <= 303",
    "6*x0 + 17*x1 + 1*x2 + 13*x3 <= 303"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
ringo = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="ringo")
jean = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="jean")
hank = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="hank")
peggy = model.addVar(lb=0, vtype=gp.GRB.INTEGER, name="peggy")


# Set objective function
model.setObjective(3 * ringo + 5 * jean + 8 * hank + 9 * peggy, gp.GRB.MAXIMIZE)

# Add constraints
model.addConstr(10 * jean + 6 * peggy >= 51)
model.addConstr(15 * ringo + 10 * jean + 4 * hank >= 58)
model.addConstr(15 * ringo + 10 * jean + 6 * peggy >= 58)
model.addConstr(10 * jean + 4 * hank + 6 * peggy >= 58)
model.addConstr(15 * ringo + 10 * jean + 4 * hank >= 69)
model.addConstr(15 * ringo + 10 * jean + 6 * peggy >= 69)
model.addConstr(10 * jean + 4 * hank + 6 * peggy >= 69)
model.addConstr(15 * ringo + 10 * jean + 4 * hank >= 57)
model.addConstr(15 * ringo + 10 * jean + 6 * peggy >= 57)
model.addConstr(10 * jean + 4 * hank + 6 * peggy >= 57)
model.addConstr(17 * jean + 13 * peggy >= 62)
model.addConstr(1 * hank + 13 * peggy >= 59)
model.addConstr(17 * jean + 1 * hank >= 80)
model.addConstr(6 * ringo + 17 * jean + 13 * peggy >= 77)
model.addConstr(17 * jean + 1 * hank + 13 * peggy >= 77)
model.addConstr(6 * ringo + 17 * jean + 13 * peggy >= 59)
model.addConstr(17 * jean + 1 * hank + 13 * peggy >= 59)
model.addConstr(6 * jean + 9 * hank - 9 * peggy >= 0)
model.addConstr(10 * jean + 4 * hank <= 165)
model.addConstr(15 * ringo + 10 * jean <= 445)
model.addConstr(15 * ringo + 4 * hank <= 380)
model.addConstr(10 * jean + 6 * peggy <= 153)
model.addConstr(15 * ringo + 6 * peggy <= 120)
model.addConstr(4 * hank + 6 * peggy <= 258)
model.addConstr(15 * ringo + 10 * jean + 4 * hank + 6 * peggy <= 258)
model.addConstr(6 * ringo + 17 * jean <= 243)
model.addConstr(6 * ringo + 13 * peggy <= 220)
model.addConstr(17 * jean + 13 * peggy <= 112)
model.addConstr(1 * hank + 13 * peggy <= 201)
model.addConstr(6 * ringo + 17 * jean + 13 * peggy <= 159)
model.addConstr(17 * jean + 1 * hank + 13 * peggy <= 303)
model.addConstr(6 * ringo + 17 * jean + 1 * hank + 13 * peggy <= 303)



# Optimize model
model.optimize()

# Print results
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal objective value: {model.objVal}")
    print("Variable values:")
    for v in model.getVars():
        print(f"{v.varName}: {v.x}")
elif model.status == gp.GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print(f"Optimization ended with status {model.status}")

```