{"files":{"main.py":"from core import run\nfrom policy import POLICY\n\n\ndef evaluate(payload):\n    return run(payload, POLICY)\n","core.py":"from datetime import datetime, time, timedelta\nfrom zoneinfo import ZoneInfo\n\nfrom helpers import overlaps, parse_instant, valid_duration\n\n\ndef run(payload, policy):\n    retained = {}\n    for index, row in enumerate(payload['appointments']):\n        appointment_id = row['id']\n        if appointment_id not in retained or policy['duplicate_policy'] == 'last':\n            retained[appointment_id] = (index, row)\n\n    outcomes = {'selected': [], 'blocked': [], 'rejected': []}\n    candidates = []\n    zone = ZoneInfo(policy['timezone'])\n    try:\n        earliest = parse_instant(payload['now']) + timedelta(minutes=policy['lead_minutes'])\n    except (ValueError, TypeError, OverflowError):\n        outcomes['rejected'] = list(retained)\n        return ordered_result(outcomes, retained, policy)\n\n    for appointment_id, (index, row) in retained.items():\n        try:\n            duration = row['duration']\n            priority = row['priority']\n            cancelled = row['cancelled']\n            if not valid_duration(duration, policy['duration_max']):\n                raise ValueError('Invalid duration')\n            if not isinstance(priority, int) or isinstance(priority, bool):\n                raise ValueError('Invalid priority')\n            if not isinstance(cancelled, bool):\n                raise ValueError('Invalid cancellation flag')\n            if cancelled and not policy['cancelled_blocks']:\n                raise ValueError('Cancelled')\n\n            start = parse_instant(row['start'])\n            end = start + timedelta(minutes=duration)\n            if start < earliest:\n                raise ValueError('Insufficient lead time')\n            local_start = start.astimezone(zone)\n            if local_start.date().isoformat() == policy['blackout_day']:\n                raise ValueError('Blackout day')\n            cutoff = datetime.combine(\n                local_start.date(), time(hour=policy['cutoff_hour']), tzinfo=zone\n            )\n            cutoff = cutoff.astimezone(start.tzinfo)\n            if policy['cutoff_inclusive']:\n                if end > cutoff:\n                    raise ValueError('After cutoff')\n            elif end >= cutoff:\n                raise ValueError('At or after cutoff')\n            candidates.append((priority, index, appointment_id, start, end, cancelled))\n        except (KeyError, ValueError, TypeError, OverflowError):\n            outcomes['rejected'].append(appointment_id)\n\n    candidates.sort(key=lambda item: (\n        -item[0] if policy['priority_high_first'] else item[0], item[1]\n    ))\n    accepted = []\n    for priority, index, appointment_id, start, end, cancelled in candidates:\n        intersection_count = sum(\n            overlaps(start, end, other_start, other_end, policy['adjacency_allowed'])\n            for other_start, other_end in accepted\n        )\n        if intersection_count >= policy['capacity']:\n            outcomes['rejected'].append(appointment_id)\n        else:\n            accepted.append((start, end))\n            outcomes['blocked' if cancelled else 'selected'].append(appointment_id)\n\n    return ordered_result(outcomes, retained, policy)\n\n\ndef ordered_result(outcomes, retained, policy):\n    for ids in outcomes.values():\n        if policy['report_order'] == 'id':\n            ids.sort()\n        else:\n            ids.sort(key=lambda appointment_id: retained[appointment_id][0])\n    return outcomes\n","policy.py":"POLICY = {\n    'adjacency_allowed': False,\n    'blackout_day': '2026-11-02',\n    'cancelled_blocks': False,\n    'capacity': 2,\n    'cutoff_hour': 18,\n    'cutoff_inclusive': False,\n    'duplicate_policy': 'last',\n    'duration_max': 90,\n    'lead_minutes': 60,\n    'priority_high_first': False,\n    'report_order': 'input',\n    'timezone': 'UTC',\n}\n","helpers.py":"from datetime import datetime, timezone\nfrom math import isfinite\n\n\ndef parse_instant(value):\n    if not isinstance(value, str):\n        raise ValueError('Expected an ISO datetime string')\n    parsed = datetime.fromisoformat(value.replace('Z', '+00:00'))\n    if parsed.tzinfo is None or parsed.utcoffset() is None:\n        raise ValueError('Datetime must be offset-aware')\n    return parsed.astimezone(timezone.utc)\n\n\ndef valid_duration(value, maximum):\n    return (\n        isinstance(value, (int, float))\n        and not isinstance(value, bool)\n        and 0 < value <= maximum\n        and isfinite(value)\n    )\n\n\ndef overlaps(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"}}