You are an oncology clinic schedule optimizer. Assign start_time and end_time to each treatment row. Output ONLY CSV between markers — no reasoning.

## RULES
- T = Schedule Time Block (from CLINIC TIMING below). end_time = start_time + (service_duration × T minutes)
- All times align to T-minute boundaries in HH:MM:SS format
- Each profile has exactly ONE service (treatment). No contiguity rules needed.
- If a profile cannot fit: set start_time="00:00:00" end_time="00:00:00"
- Return rows in same order as input. Only modify start_time and end_time.

## HARD CONSTRAINTS (never violate — mark profile UNASSIGNED rather than violate)
- Treatment Chairs: 1 per patient for entire duration. Never exceed chair capacity in ANY slot. If placing a profile would exceed max chairs at any slot, mark it UNASSIGNED instead.
- RN Staffing: RN demand per slot = starts + ends + (mid_patients × nurse_factor). Must never exceed available RN count.
- Staff work only within their defined hours.
- MAX STARTS PER SLOT: Each slot has its own limit (see config). Read the EXACT limit per slot. Do NOT assume uniform limits.
- DO NOT START / DO NOT BOOK: No treatment can begin during these windows.
- All treatments within clinic hours (start >= treatment_room_start, end <= treatment_room_end).
- If no valid slot exists, mark profile UNASSIGNED (start_time="00:00:00", end_time="00:00:00"). Never force a profile into an overloaded slot.

## ALGORITHM
1. Sort profiles by service_duration DESCENDING, then profile_id ASC for ties.
2. For each profile, find the EARLIEST valid slot where:
   a. starts_count < max_starts_limit for that slot
   b. chairs_occupied + 1 <= chair_capacity for ALL slots this treatment occupies
   c. RN demand does not exceed available RNs for ALL affected slots
   d. Treatment ends before clinic close
   e. Slot is not in a Do Not Start / Do Not Book window
3. ASSIGN and immediately update all slot counters before processing next profile.
4. If no valid slot exists, mark profile UNASSIGNED (start_time="00:00:00", end_time="00:00:00"). Never force a profile into an overloaded slot.

## GOALS (in priority order)
1. Never violate any constraint — unassigned is acceptable, capacity violation is not
2. Maximize assigned profiles (schedule as many as possible within constraints)
3. Minimize peak concurrent chairs — spread across the full clinic day
4. AM/PM balance: target 50% starts before 12pm, 50% at 12pm or later
5. Long treatments start earlier, short treatments fill later slots

## FULL-DAY UTILIZATION
Do NOT front-load all profiles into the first 2 hours. Keep chair occupancy flat across the day. When multiple valid slots exist, prefer the one that results in the lowest peak. Target 50/50 AM/PM split.

## TIME CALCULATION
- end_minutes = (HH×60 + MM) + (service_duration × T)
- Convert back: HH = end_minutes ÷ 60, MM = end_minutes mod 60
- Minutes NEVER exceed 59.

EXAMPLES (T=15):
- start=07:00, dur=8:  420+120=540 → 09:00:00
- start=07:30, dur=14: 450+210=660 → 11:00:00
- start=08:30, dur=6:  510+90=600  → 10:00:00
- start=10:00, dur=14: 600+210=810 → 13:30:00

## PRE-OUTPUT VALIDATION
✓ No slot exceeds chair capacity (if it does, move violating profiles to UNASSIGNED)
✓ No slot exceeds max starts limit
✓ RN demand ≤ available RNs at all slots
✓ No treatment starts during Do Not Start / Do Not Book window
✓ All treatments within clinic hours
✓ Every end_time = start_time + (service_duration × T)
✓ No invalid times (minutes >= 60)
✓ Output has exactly same rows as input
✓ Starts spread across the day (50/50 AM/PM)

If any violation found, mark the violating profile as UNASSIGNED rather than outputting an invalid schedule.

## OUTPUT FORMAT
Output ONLY CSV between ---CSV_START--- and ---CSV_END--- markers.
No header row. No reasoning. No commentary.
Columns: schedule_date,clinic_id,clinic_name,profile_id,service_id,start_time,service_duration,end_time,service_sequence_id,service_name


## SCHEDULING ALGORITHM
Use the **First Fit Decreasing** strategy:
Sort all profiles by total duration DESCENDING (longest first). For each profile in sorted order, assign it to the EARLIEST available time slot that satisfies ALL constraints (chairs, staff, max starts, clinic hours). Once placed, lock it and move to the next profile. Never revisit a placed profile. This is the recommended construction heuristic from Timefold's scheduling algorithms — it prevents long profiles from being blocked later and naturally spreads load across the day.

## CLINIC CONFIGURATION (dynamically loaded from CSV)
### CLINIC TIMING (for Monday)
- Clinic Hours: 7:00:00 - 17:00:00
- Treatment Room (TTCNP): start >= 7:00:00, end <= 17:00:00
- Lab Hours: start >= 7:00:00, end <= 17:00:00
- Nurse Factor (ongoing mid-treatment): 16% per patient → 1 RN covers up to 6.2 concurrent mid-treatment patients
- Schedule Time Block: 15 minutes per slot (all time calculations use this interval)
- *** IMPORTANT: T = 15. Use 15 minutes for ALL duration calculations, not 15. duration_minutes = service_duration × 15 ***

### RESOURCES (Physical Chairs)
- Treatment Chairs: 24 (max 24 patients using this resource simultaneously)
- Lab Chairs: 2 (max 2 patients using this resource simultaneously)
- Injection Chairs: 1 (max 1 patients using this resource simultaneously)

### STAFF AVAILABILITY (for Monday, Available only)
- RN (Registered Nurse): 07:30:00-16:45:00, 12 available per slot
- Lab Tech: 07:30:00-16:15:00, 1 available per slot
- LPN (Injection Nurse): 07:30:00-17:00:00, 1 available per slot
- MD (Provider): 08:00:00-16:15:00, 2 available per slot
- MA: 07:15:00-16:45:00, 1 available per slot

### DO NOT START RULES (for Monday)
  No Do Not Start rules configured.

### DO NOT BOOK RULES (for Monday)
  No Do Not Book rules configured.

### MAX TREATMENT STARTS PER SLOT (for Monday)
The maximum number of treatments that can START in each 15-minute slot is defined per slot below.
This is a HARD constraint — even if chairs and RNs are available, do not exceed these limits.
  - 07:00:00: max 0 treatment start(s)
  - 07:15:00: max 0 treatment start(s)
  - 07:30:00: max 1 treatment start(s)
  - 07:45:00: max 2 treatment start(s)
  - 08:00:00: max 2 treatment start(s)
  - 08:15:00: max 2 treatment start(s)
  - 08:30:00: max 3 treatment start(s)
  - 08:45:00: max 3 treatment start(s)
  - 09:00:00: max 3 treatment start(s)
  - 09:15:00: max 3 treatment start(s)
  - 09:30:00: max 3 treatment start(s)
  - 09:45:00: max 3 treatment start(s)
  - 10:00:00: max 3 treatment start(s)
  - 10:15:00: max 3 treatment start(s)
  - 10:30:00: max 3 treatment start(s)
  - 10:45:00: max 3 treatment start(s)
  - 11:00:00: max 3 treatment start(s)
  - 11:15:00: max 3 treatment start(s)
  - 11:30:00: max 3 treatment start(s)
  - 11:45:00: max 3 treatment start(s)
  - 12:00:00: max 3 treatment start(s)
  - 12:15:00: max 3 treatment start(s)
  - 12:30:00: max 3 treatment start(s)
  - 12:45:00: max 3 treatment start(s)
  - 13:00:00: max 3 treatment start(s)
  - 13:15:00: max 3 treatment start(s)
  - 13:30:00: max 3 treatment start(s)
  - 13:45:00: max 3 treatment start(s)
  - 14:00:00: max 3 treatment start(s)
  - 14:15:00: max 3 treatment start(s)
  - 14:30:00: max 3 treatment start(s)
  - 14:45:00: max 3 treatment start(s)
  - 15:00:00: max 3 treatment start(s)
  - 15:15:00: max 3 treatment start(s)
  - 15:30:00: max 3 treatment start(s)
  - 15:45:00: max 3 treatment start(s)
  - 16:00:00: max 3 treatment start(s)
  - 16:15:00: max 3 treatment start(s)
  - 16:30:00: max 0 treatment start(s)
  - 16:45:00: max 0 treatment start(s)
  - 17:00:00: max 0 treatment start(s)
  - 17:15:00: max 0 treatment start(s)
  - 17:30:00: max 0 treatment start(s)


## PROFILE LIST TO OPTIMIZE (CSV):
schedule_date,location_id,clinic_name,profile_id,service_id,start_time,service_duration,end_time,service_sequence_id,service_name
5/25/2026,20001,PostFalls,2000901,3,7:00:00,2,7:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000902,3,7:00:00,2,7:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000903,3,7:00:00,2,7:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000904,3,7:00:00,3,7:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000905,3,7:00:00,3,7:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000906,3,7:00:00,4,8:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000907,3,7:00:00,4,8:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000908,3,7:00:00,4,8:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000909,3,7:00:00,4,8:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000910,3,7:00:00,4,8:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000911,3,7:00:00,5,8:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000912,3,7:00:00,5,8:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000913,3,7:00:00,5,8:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000914,3,7:00:00,6,8:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000915,3,7:00:00,6,8:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000916,3,7:00:00,6,8:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000917,3,7:00:00,6,8:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000918,3,7:00:00,6,8:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000919,3,7:00:00,7,8:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000920,3,7:00:00,7,8:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000921,3,7:00:00,8,9:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000922,3,7:00:00,8,9:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000923,3,7:00:00,8,9:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000924,3,7:00:00,8,9:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000925,3,7:00:00,8,9:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000926,3,7:00:00,8,9:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000927,3,7:00:00,10,9:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000928,3,7:00:00,10,9:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000929,3,7:00:00,10,9:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000930,3,7:00:00,10,9:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000931,3,7:00:00,10,9:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000932,3,7:00:00,12,10:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000933,3,7:00:00,12,10:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000934,3,7:00:00,12,10:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000935,3,7:00:00,12,10:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000936,3,7:00:00,4,8:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000937,3,7:00:00,4,8:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000938,3,7:00:00,6,8:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000939,3,7:00:00,6,8:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000940,3,7:00:00,8,9:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000941,3,7:00:00,8,9:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000942,3,7:00:00,4,8:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000943,3,7:00:00,6,8:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000944,3,7:00:00,6,8:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000945,3,7:00:00,8,9:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000946,3,7:00:00,10,9:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000947,3,7:00:00,14,10:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000948,3,7:00:00,16,11:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000949,3,7:00:00,20,12:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000950,3,7:00:00,24,13:00:00,4,Treatment

## OUTPUT
Complete the scheduling algorithm defined in the instructions above, then run the pre-output validation checklist. Only after all checks pass, output the CSV.

Output ONLY the CSV between the markers below. Do NOT include any reasoning, working, justification, or commentary — only the CSV block.

---CSV_START---
(CSV rows here, one per line, no header row)
---CSV_END---

Columns: schedule_date,clinic_id,clinic_name,profile_id,service_id,start_time,service_duration,end_time,service_sequence_id,service_name

Rules:
- Keep schedule_date, clinic_id, clinic_name, profile_id, service_id, service_duration, service_sequence_id, service_name UNCHANGED from input
- Assign NEW start_time and end_time values (HH:MM:SS format)
- end_time = start_time + (service_duration × Schedule_Time_Block_minutes)  [Schedule_Time_Block_minutes is defined in CLINIC TIMING]
- For UNASSIGNED profiles: set start_time="00:00:00" and end_time="00:00:00" for ALL services in that profile
- Output ALL rows (assigned + unassigned) in the exact same order as the input
- Do NOT add quotes around values
- Do NOT include a header row inside the markers
- Do NOT include any text outside the ---CSV_START--- and ---CSV_END--- markers