def max_circular_subarray(nums):
    if not nums:
        return None
    high_end = low_end = best = worst = total = nums[0]
    for i in range(1, len(nums)):
        value = nums[i]
        high_end = max(value, high_end + value)
        low_end = min(value, low_end + value)
        best, worst = max(best, high_end), min(worst, low_end)
        total += value
    return best if best < 0 else max(best, total - worst)
