You are given two sorted arrays of distinct integers nums1 and nums2.
A valid path is defined as follows:

Choose array nums1 or nums2 to traverse (from index-0).
Traverse the current array from left to right.
If you are reading any value that is present in nums1 and nums2 you are allowed to change your path to the other array. (Only one repeated value is considered in the valid path).

Score is defined as the sum of uniques values in a valid path.
Return the maximum score you can obtain of all possible valid paths.
Since the answer may be too large, return it modulo 10^9 + 7.
 
Example 1:

Input: nums1 = [2,4,5,8,10], nums2 = [4,6,8,9]
Output: 30
Explanation: Valid paths:
[2,4,5,8,10], [2,4,5,8,9], [2,4,6,8,9], [2,4,6,8,10],  (starting from nums1)
[4,6,8,9], [4,5,8,10], [4,5,8,9], [4,6,8,10]    (starting from nums2)
The maximum is obtained with the path in green [2,4,6,8,10].

Example 2:
Input: nums1 = [1,3,5,7,9], nums2 = [3,5,100]
Output: 109
Explanation: Maximum sum is obtained with the path [1,3,5,100].

Example 3:
Input: nums1 = [1,2,3,4,5], nums2 = [6,7,8,9,10]
Output: 40
Explanation: There are no common elements between nums1 and nums2.
Maximum sum is obtained with the path [6,7,8,9,10].

Example 4:
Input: nums1 = [1,4,5,8,9,11,19], nums2 = [2,3,4,11,12]
Output: 61

 
Constraints:

1 <= nums1.length <= 10^5
1 <= nums2.length <= 10^5
1 <= nums1[i], nums2[i] <= 10^7
nums1 and nums2 are strictly increasing.

```python

USER_FILENAME = "<user_code>"
import sys, json, builtins
import math, heapq, bisect, itertools, functools, collections, statistics, fractions, decimal, operator, array, random, re, string, os, pathlib
try:
    import resource as _res
except Exception:
    _res = None
from collections import Counter, defaultdict, deque, OrderedDict
from functools import lru_cache, reduce
from itertools import accumulate, permutations, combinations, product
from math import gcd, ceil, floor, sqrt
from decimal import Decimal
try:
    from typing import *
except Exception:
    pass
try:
    sys.setrecursionlimit(1_000_000)
except Exception:
    pass
try:
    import site as _site
    try:
        _sys_sites = _site.getsitepackages() if hasattr(_site, "getsitepackages") else []
        for _p in _sys_sites:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
    try:
        _usp = _site.getusersitepackages()
        if isinstance(_usp, str):
            _usp = [_usp]
        for _p in _usp:
            if _p and _p not in sys.path:
                sys.path.append(_p)
    except Exception:
        pass
except Exception:
    pass

def _disabled_input(*args, **kwargs):
    raise RuntimeError("input() is disabled in callable mode")
builtins.input = _disabled_input

ns = {"__name__": "__judge__"}  # prevent if __name__ == "__main__" blocks
for _k, _v in list(globals().items()):
    if not _k.startswith("_"):
        ns[_k] = _v
_CODE = '\'\'\'\nThis seems to be dynamic programming where we have to find out the maximum score we can possibly get given the number of elements left to see in nums1 and nums2\n\'\'\'\nclass Solution:\n    def maxSum(self, nums1: List[int], nums2: List[int]) -> int:\n        BIG_INT = 10**9+7\n        maxSums = {}\n        num1Values = {}\n        num2Values = {}\n        num1Values[0] = -1\n        for index, num in enumerate(nums1):\n            num1Values[num] = index\n        num2Values[0] = -1\n        for index,num in enumerate(nums2):\n            num2Values[num] = index\n        num1Length = len(nums1)\n        num2Length = len(nums2)\n        nums1.append(0)\n        nums2.append(0)\n        def computeMaxSum(num1Left,num2Left):\n            ##print(\\"(num1Left,num2Left) is: \\"+str((num1Left,num2Left)))\n            if num1Left*num2Left == 0:\n                return 0\n            else:\n                if (num1Left,num2Left) in maxSums:\n                    return maxSums[(num1Left,num2Left)]\n                current1 = 0 if num1Left == num1Length+1 else nums1[-num1Left-1]##had to do -num1Left-1 because we append 0 for future purposes of termination.\n                current2 = 0 if num2Left == num2Length+1 else nums2[-num2Left-1]\n                ##print(\\"(current1,current2) is: \\"+str((current1,current2)))\n                if current1 == current2:\n                    maxSums[(num1Left,num2Left)] = max(computeMaxSum(num1Left-1,num2Left)+nums1[-num1Left], computeMaxSum(num1Left,num2Left-1)+nums2[-num2Left])\n                elif current1 > current2:\n                    ##we can either progress to the next in current1 or possibly swap to current2.\n                    if current1 in num2Values:\n                        new2Index = num2Values[current1]\n                        maxSums[(num1Left,num2Left)] = computeMaxSum(num1Left,num2Length-new2Index)##remember you do computeMaxSum before actually calling dictionary because you haven\'t set it in dictionary yet.\n                    else:\n                        maxSums[(num1Left,num2Left)] = computeMaxSum(num1Left-1,num2Left)+nums1[-num1Left]\n                else:\n                    ##we can either progress to the next in current2 or possibly swap to current1.\n                    if current2 in num1Values:\n                        new1Index = num1Values[current2]\n                        maxSums[(num1Left,num2Left)] = computeMaxSum(num1Length-new1Index,num2Left)\n                    else:\n                        maxSums[(num1Left,num2Left)] = computeMaxSum(num1Left,num2Left-1)+nums2[-num2Left]\n                return maxSums[(num1Left,num2Left)]\n        return computeMaxSum(num1Length+1,num2Length+1)%BIG_INT\n'
_co = compile(_CODE, USER_FILENAME, "exec")
exec(_co, ns, ns)

_target = None
_fn_name = 'maxSum'
if _fn_name:
    if "Solution" in ns:
        try:
            _obj = ns["Solution"]()
            if hasattr(_obj, _fn_name):
                _target = getattr(_obj, _fn_name)
        except Exception:
            _target = None
    if _target is None and _fn_name in ns and callable(ns[_fn_name]):
        _target = ns[_fn_name]
# Fallback: if there's exactly one user-defined function, use it
if _target is None:
    _cands = [v for k, v in ns.items() if callable(v) and getattr(v, "__module__", "") in ("__judge__", "__main__")]
    _user_funcs = [c for c in _cands if getattr(c, "__name__", "").startswith("_") is False]
    if len(_user_funcs) == 1:
        _target = _user_funcs[0]
if _target is None:
    raise RuntimeError(f"Could not resolve callable '{_fn_name}'")

_raw = sys.stdin.read().strip()
if _raw:
    _parsed = json.loads(_raw)
    if isinstance(_parsed, dict):
        _kwargs = _parsed.get("kwargs", {})
        _args = _parsed.get("args", [])
    else:
        _args, _kwargs = _parsed, {}
else:
    _args, _kwargs = [], {}
if not isinstance(_args, (list, tuple)):
    _args = [_args]
_res = _target(*_args, **_kwargs)
try:
    sys.stdout.write(repr(_res) + "\n")
except Exception:
    pass

```

Measured memory_bytes: 10036