{"files":{"main.py":"from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n","policy.py":"POLICY = {\"adjacency_allowed\": True, \"blackout_day\": \"2026-11-01\", \"cancelled_blocks\": True, \"capacity\": 1, \"cutoff_hour\": 17, \"cutoff_inclusive\": True, \"duplicate_policy\": \"first\", \"duration_max\": 120, \"lead_minutes\": 30, \"priority_high_first\": True, \"report_order\": \"id\", \"timezone\": \"America/New_York\"}\n","helpers.py":"from datetime import datetime, timezone\n\n\ndef parse_dt(s):\n    if isinstance(s, str) and s.endswith('Z'):\n        s = s[:-1] + '+00:00'\n    d = datetime.fromisoformat(s)\n    if d.tzinfo is None or d.utcoffset() is None:\n        raise ValueError('naive datetime')\n    return d.astimezone(timezone.utc)\n","core.py":"from datetime import datetime, timedelta, timezone\nfrom zoneinfo import ZoneInfo\nfrom helpers import parse_dt\n\n\ndef run(payload, policy):\n    zone = ZoneInfo(policy['timezone'])\n    now = parse_dt(payload['now'])\n    rows = list(payload.get('appointments', []))\n    chosen = {}\n    order = []\n    for i, a in enumerate(rows):\n        k = a['id']\n        if k not in chosen:\n            order.append(k)\n            chosen[k] = (i, a)\n        elif policy['duplicate_policy'] == 'last':\n            chosen[k] = (i, a)\n    items = [chosen[k] for k in order]\n    if policy['priority_high_first']:\n        items.sort(key=lambda t: (-t[1]['priority'], t[0]))\n    else:\n        items.sort(key=lambda t: (t[1]['priority'], t[0]))\n\n    selected, blocked, rejected = [], [], []\n    accepted = []\n    lead = timedelta(minutes=policy['lead_minutes'])\n    for idx, a in items:\n        aid = a['id']\n        try:\n            dur = a['duration']\n            if isinstance(dur, bool) or not isinstance(dur, (int, float)):\n                raise ValueError\n            start = parse_dt(a['start'])\n        except Exception:\n            rejected.append((idx, aid))\n            continue\n        ok = 0 < dur <= policy['duration_max']\n        if ok and start < now + lead:\n            ok = False\n        if ok:\n            local = start.astimezone(zone)\n            if local.date().isoformat() == policy['blackout_day']:\n                ok = False\n        end = start + timedelta(minutes=dur)\n        if ok:\n            cut = datetime(local.year, local.month, local.day,\n                           policy['cutoff_hour'], 0, tzinfo=zone).astimezone(timezone.utc)\n            if policy['cutoff_inclusive']:\n                ok = end <= cut\n            else:\n                ok = end < cut\n        cancelled = bool(a.get('cancelled', False))\n        if ok and cancelled and not policy['cancelled_blocks']:\n            ok = False\n        if ok:\n            cnt = 0\n            for s2, e2 in accepted:\n                if policy['adjacency_allowed']:\n                    ov = start < e2 and s2 < end\n                else:\n                    ov = start <= e2 and s2 <= end\n                if ov:\n                    cnt += 1\n            if cnt >= policy['capacity']:\n                ok = False\n        if not ok:\n            rejected.append((idx, aid))\n            continue\n        accepted.append((start, end))\n        (blocked if cancelled else selected).append((idx, aid))\n\n    def out(lst):\n        if policy['report_order'] == 'id':\n            try:\n                return [x[1] for x in sorted(lst, key=lambda t: t[1])]\n            except TypeError:\n                return [x[1] for x in sorted(lst, key=lambda t: str(t[1]))]\n        return [x[1] for x in sorted(lst, key=lambda t: t[0])]\n\n    return {'selected': out(selected), 'blocked': out(blocked), 'rejected': out(rejected)}\n"}}