{"files": {"main.py": "from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n", "core.py": "from datetime import datetime, timedelta, timezone\nfrom zoneinfo import ZoneInfo\nfrom helpers import parse_datetime, intervals_overlap, make_cutoff\n\ndef run(payload, policy):\n    data = payload if isinstance(payload, dict) else {}\n    appointments = data.get('appointments') or []\n    tz = ZoneInfo(policy['timezone'])\n    now = parse_datetime(data.get('now'))\n    deduped = {}\n    order = []\n    policy_first = policy.get('duplicate_policy') == 'first'\n    for idx, raw in enumerate(list(appointments)):\n        if not isinstance(raw, dict):\n            continue\n        appt_id = raw.get('id')\n        if appt_id is None:\n            continue\n        entry = dict(raw)\n        if appt_id not in deduped:\n            deduped[appt_id] = (entry, idx)\n            order.append(appt_id)\n        elif not policy_first:\n            deduped[appt_id] = (entry, idx)\n    items = []\n    for appt_id in order:\n        entry, idx = deduped[appt_id]\n        items.append((entry, idx))\n    if policy.get('priority_high_first'):\n        items_sorted = sorted(items, key=lambda x: (-(x[0].get('priority') if isinstance(x[0].get('priority'), (int, float)) and not isinstance(x[0].get('priority'), bool) else 0), x[1]))\n    else:\n        items_sorted = sorted(items, key=lambda x: ((x[0].get('priority') if isinstance(x[0].get('priority'), (int, float)) and not isinstance(x[0].get('priority'), bool) else 0), x[1]))\n    selected = []\n    blocked = []\n    rejected = []\n    accepted_intervals = []\n    lead = timedelta(minutes=policy['lead_minutes'])\n    min_start = now + lead if now is not None else None\n    for entry, idx in items_sorted:\n        appt_id = entry.get('id')\n        cancelled = bool(entry.get('cancelled')) if entry.get('cancelled') is not None else False\n        if cancelled and not policy.get('cancelled_blocks'):\n            rejected.append((appt_id, idx))\n            continue\n        duration = entry.get('duration')\n        if isinstance(duration, bool) or not isinstance(duration, (int, float)) or duration <= 0 or duration > policy['duration_max']:\n            rejected.append((appt_id, idx))\n            continue\n        start = parse_datetime(entry.get('start'))\n        if start is None or min_start is None or start < min_start:\n            rejected.append((appt_id, idx))\n            continue\n        start_utc = start.astimezone(timezone.utc)\n        end_utc = start_utc + timedelta(minutes=float(duration))\n        start_local = start.astimezone(tz)\n        if start_local.date().isoformat() == str(policy['blackout_day']):\n            rejected.append((appt_id, idx))\n            continue\n        cutoff = make_cutoff(start_local.date(), policy['cutoff_hour'], tz)\n        if policy.get('cutoff_inclusive'):\n            if not (end_utc <= cutoff):\n                rejected.append((appt_id, idx))\n                continue\n        else:\n            if not (end_utc < cutoff):\n                rejected.append((appt_id, idx))\n                continue\n        overlap_count = 0\n        for other_start, other_end in accepted_intervals:\n            if intervals_overlap(start_utc, end_utc, other_start, other_end, policy.get('adjacency_allowed')):\n                overlap_count += 1\n        if overlap_count >= policy['capacity']:\n            rejected.append((appt_id, idx))\n            continue\n        accepted_intervals.append((start_utc, end_utc))\n        if cancelled:\n            blocked.append((appt_id, idx))\n        else:\n            selected.append((appt_id, idx))\n    def format_list(values):\n        if policy.get('report_order') == 'id':\n            ordered = sorted(values, key=lambda x: x[0])\n        else:\n            ordered = sorted(values, key=lambda x: x[1])\n        return [v[0] for v in ordered]\n    return {'selected': format_list(selected), 'blocked': format_list(blocked), 'rejected': format_list(rejected)}\n", "policy.py": "POLICY = {\n    'adjacency_allowed': True,\n    'blackout_day': '2026-11-01',\n    'cancelled_blocks': True,\n    'capacity': 1,\n    'cutoff_hour': 17,\n    'cutoff_inclusive': True,\n    'duplicate_policy': 'first',\n    'duration_max': 120,\n    'lead_minutes': 30,\n    'priority_high_first': True,\n    'report_order': 'id',\n    'timezone': 'America/New_York',\n}\n", "helpers.py": "from datetime import datetime\n\ndef parse_datetime(value):\n    if isinstance(value, datetime):\n        dt = value\n    elif isinstance(value, str):\n        text = value.strip()\n        if text.endswith(('Z', 'z')):\n            text = text[:-1] + '+00:00'\n        try:\n            dt = datetime.fromisoformat(text)\n        except ValueError:\n            return None\n    else:\n        return None\n    if dt.tzinfo is None:\n        return None\n    return dt\n\ndef intervals_overlap(start, end, other_start, other_end, adjacency_allowed):\n    if adjacency_allowed:\n        return start < other_end and other_start < end\n    return start <= other_end and other_start <= end\n\ndef make_cutoff(local_date, cutoff_hour, tz):\n    return datetime(local_date.year, local_date.month, local_date.day, int(cutoff_hour), 0, tzinfo=tz)\n"}}