You are to write a function to transpose a guitar tab up or down a number of semitones. The amount to transpose is a number, positive or negative. The tab is given as an array, with six elements for each guitar string (fittingly passed as strings). Output your tab in a similar form.

Guitar tablature (or 'tab') is an alternative to sheet music, where notes are replaced by fret numbers and the five lines of the staff are replaced by six lines to represent each of the guitar's strings. It is still read from left to right like sheet music, and notes written directly above each other are played at the same time.

For example, Led Zeppelin's Stairway to Heaven begins:
```
e|-------5-7-----7-|-8-----8-2-----2-|-0---------0-----|-----------------|
B|-----5-----5-----|---5-------3-----|---1---1-----1---|-0-1-1-----------|
G|---5---------5---|-----5-------2---|-----2---------2-|-0-2-2-----------|
D|-7-------6-------|-5-------4-------|-3---------------|-----------------|
A|-----------------|-----------------|-----------------|-2-0-0---0--/8-7-|
E|-----------------|-----------------|-----------------|-----------------|
```
Transposed up two semitones, it would look like this:
```
e|-------7-9-----9-|-10-----10-4-----4-|-2---------2-----|------------------|
B|-----7-----7-----|----7--------5-----|---3---3-----3---|-2-3-3------------|
G|---7---------7---|------7--------4---|-----4---------4-|-2-4-4------------|
D|-9-------8-------|-7---------6-------|-5---------------|------------------|
A|-----------------|-------------------|-----------------|-4-2-2---2--/10-9-|
E|-----------------|-------------------|-----------------|------------------|
```
Note how when the 8th fret note on the top string in bar 2 gets transposed to the 10th fret, extra '-' are added on the other strings below so as to retain the single '-' that originally separated that beat (i.e. column) from the following note – fret 7 on the B string.

Each beat must retain at least one '-' separator before the next, to keep the tab legible. The inputted test tabs all obey this convention.

Electric guitars usually have 22 frets, with the 0th fret being an open string. If your fret numbers transpose to either negative values or values over 22, you should return 'Out of frets!' (and probably detune your guitar).

Tests include some randomly generated guitar tabs, which come with no guarantee of musical quality and/or playability...!

```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 = 'import re\n\nempty = [\'\'] * 6\nseparator = [\'-\'] * 6\nbar = [\'|\'] * 6\n\ndef transpose(amount, tab):\n\n    # "And if you listen very hard\n    #  The tune will come to you at last..."\n\n    #           -- Stairway to Heaven (1971)\n\n    try:\n        result = empty\n        chunk = empty\n\n        for i in range(len(tab[0])):\n            column = get_column(tab, i)\n            chunk = merge(chunk, column)\n    \n            if chunk == separator or chunk == bar:\n                result = merge(result, chunk)\n                chunk = empty\n            elif column == separator:\n                recalculated = recalculate(amount, chunk)\n                result = merge(result, recalculated)\n                chunk = empty\n\n        return result\n    except OutOfFretsException as oof:\n        return str(oof)\n\ndef get_column(tab, column_idx):\n    return [tab[string][column_idx] for string in range(0, 6)]\n\ndef merge(left, right):\n    return [left[i] + right[i] for i in range(0, 6)]\n\ndef recalculate(amount, chunk):\n    recalculated = [shift(string, amount) for string in chunk]\n    max_length = max([len(s) for s in recalculated])\n    padded = [string.ljust(max_length, \'-\') for string in recalculated]\n    return shrink(padded)\n\ndef shrink(chunk):\n    new_chunk = empty\n    for i in range(len(chunk[0])):\n        current_column = get_column(chunk, i)\n        next_column = get_column(chunk, i + 1) if i + 1 < len(chunk[0]) else None\n\n        if current_column == separator and next_column == separator:\n            continue\n        else:\n            new_chunk = merge(new_chunk, current_column)\n\n    return new_chunk\n\ndef shift(string, amount):\n    tokens = re.findall(r\'[^\\d]*[0-9]+[^\\d]*\', string)\n    if len(tokens) > 0:\n        numbers = [int(re.findall(r\'[0-9]+\', t)[0]) for t in tokens]\n        shifted = [(n, n + amount) for n in numbers]\n        if (any(s[1] > 22 or s[1] < 0 for s in shifted)):\n            raise OutOfFretsException()\n        else:\n            replaced = [tokens[i].replace(str(shifted[i][0]), str(shifted[i][1])) for i in range(len(tokens))]\n            return "".join(replaced)\n    else:\n        return string\n\nclass OutOfFretsException(Exception):\n    def __init__(self):\n        Exception.__init__(self, \'Out of frets!\')'
_co = compile(_CODE, USER_FILENAME, "exec")
exec(_co, ns, ns)

_target = None
_fn_name = 'transpose'
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: 41343