```python
from typing import List, Dict, Optional

def split_segments(path: str) -> List[str]:
    if not isinstance(path, str) or not path.startswith("/") or not path:
        raise ValueError("Invalid path")
    segments = path.split("/")
    if segments[-1] == "":
        segments.pop()
    return segments

def first_route(patterns: List[str], path: str) -> int:
    if not isinstance(patterns, list) or not isinstance(path, str):
        raise ValueError("Invalid arguments")
    if not path:
        return -1
    for i, pattern in enumerate(patterns):
        if match_route(pattern, path) is not None:
            return i
    return -1

def match_route(pattern: str, path: str) -> Dict[str, str] | None:
    if not isinstance(pattern, str) or not isinstance(path, str):
        raise ValueError("Invalid arguments")
    if not path:
        return None
    if path == "/":
        return {}
    segments = path.split("/")
    pattern_segments = split_segments(pattern)
    if len(pattern_segments) != len(segments) + 1 or pattern_segments[-1] != "**":
        return None
    if not all(isinstance(segment, str) for segment in segments):
        return None
    if not all(isinstance(segment, str) or segment.startswith(":") for segment in pattern_segments):
        return None
    if len(pattern_segments) > 1 and pattern_segments[1] == "**":
        return None
    mapping = {}
    i = 0
    for segment, pattern_segment in zip(segments, pattern_segments):
        if pattern_segment == ":":
            if not segment or not all(char.isalnum() or char in "_-" for char in segment):
                raise ValueError("Invalid capture name")
            mapping[segment] = segments[i]
            i += 1
        elif pattern_segment == "*":
            i += 1
        elif pattern_segment == "**":
            i += len(segments[i:])
    return mapping
```