diff --git a/scripts/make_cabaret_vc.py b/scripts/make_cabaret_vc.py new file mode 100644 index 0000000..68ce04a --- /dev/null +++ b/scripts/make_cabaret_vc.py @@ -0,0 +1,832 @@ +#!/usr/bin/env python3 +"""Generate shows/cabaret.qxw — grouped can RGB + per-mover position and RGB.""" + +from __future__ import annotations + +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +OUT = ROOT / "shows" / "cabaret.qxw" + +M1, M2 = 8, 9 + +# Can groups: 1-2 | 3-4-5-6 | 7-8 +GROUP_L = [0, 1] +GROUP_C = [2, 3, 4, 5] +GROUP_R = [6, 7] + +# Can 8ch: Dim=0, R=2, G=3, B=4 +# Mover 43ch: Focus=7, Center Bright=8; RGB heads 1–7 +MOVER_FOCUS = 7 +MOVER_DIM = 8 +MOVER_R = [10, 14, 18, 22, 26, 30, 34] +MOVER_G = [11, 15, 19, 23, 27, 31, 35] +MOVER_B = [12, 16, 20, 24, 28, 32, 36] +FOCUS_DEFAULT = 70 +CANS = list(range(8)) + +PALETTE: dict[str, tuple[int, int, int]] = { + "Amber": (255, 90, 0), + "Pink": (255, 50, 160), + "HotBlue": (round(0.30 * 255), 0, 255), # 30% red, 100% blue + "Red": (255, 0, 0), + "Green": (0, 255, 0), + "Blue": (0, 0, 255), + "Orange": (255, 127, 0), + "Yellow": (255, 255, 0), + "Purple": (127, 0, 255), +} + +CAN_ODD = [0, 2, 4, 6] # #1,3,5,7 +CAN_EVEN = [1, 3, 5, 7] # #2,4,6,8 +MOVER_SOLIDS = [ + "Amber", + "Pink", + "Red", + "Green", + "Blue", + "Orange", + "Yellow", + "Purple", +] + +# Pad display values. M2 (left) is hung 180°, so its pad pan is reversed: +# DMX pan = 255 - pad pan. M1 pad pan is DMX pan. +PAD_PAN = {M2: 181, M1: 80} +PAD_TILT = {M2: 145, M1: 161} +POSITION_FADE_MS = 2000 +# name, M1 (pan, tilt), M2 (pan, tilt), button colour +# Same DMX pan = split (180° hang). Cross left was mirrored (108) = 180° out. +# Now = live pad aim (M2 pad 181/145 → DMX 74/145, M1 pad 80/161). +POSITIONS: list[tuple[str, tuple[int, int], tuple[int, int], str]] = [ + ("Now", (80, 161), (74, 145), "4278236360"), + ("Here", (179, 0), (179, 0), "4282664004"), + ("Down", (179, 36), (179, 36), "4284900966"), + ("Mid", (164, 18), (144, 18), "4286611584"), + ("Cross", (140, 26), (140, 26), "4281545523"), + ("Out", (200, 22), (200, 22), "4279900698"), +] +POSITION_FUNC0 = 100 +PADS_FUNC = POSITION_FUNC0 + len(POSITIONS) +PADS_BG = "4282800750" # #465A6E pad grey-blue +FIGURE8_FUNC = 110 +FIGURE8_SIDE_FUNC = 111 +FIGURE8_MS = 12000 +FIGURE8_BG = "4282664004" +FIGURE8_SIDE_BG = "4286611584" +LOOK_PAIRS: list[tuple[str, str | None]] = [ + ("Amber", None), + ("Pink", "Amber"), + ("Pink", "HotBlue"), + ("Red", "Green"), + ("Blue", "Green"), + ("Blue", "Red"), + ("Orange", "Blue"), + ("Yellow", "Purple"), +] + + +def color_label(name: str) -> str: + return "Blue" if name == "HotBlue" else name + + +def qlc_color(r: int, g: int, b: int) -> str: + return str((0xFF << 24) | (r << 16) | (g << 8) | b) + + +def mix_color( + a: tuple[int, int, int], b: tuple[int, int, int] +) -> tuple[int, int, int]: + return ((a[0] + b[0]) // 2, (a[1] + b[1]) // 2, (a[2] + b[2]) // 2) + +RGB = [ + ("R", 2, MOVER_R, "4294901760", "Red"), + ("G", 3, MOVER_G, "4278255360", "Green"), + ("B", 4, MOVER_B, "4278190335", "Blue"), +] + + +def appearance( + fg: str = "Default", + bg: str = "Default", + frame: str = "Sunken", +) -> str: + return f""" + {frame} + {fg} + {bg} + None + Default + """ + + +def slider( + wid: int, + caption: str, + x: int, + y: int, + w: int, + h: int, + channels: list[tuple[int, int]], + *, + value: int = 0, + fg: str = "Default", + cng: str = "None", +) -> str: + ch_xml = "\n".join( + f' {ch}' for fid, ch in channels + ) + return f""" + +{appearance(fg=fg)} + Level + + +{ch_xml} + + + 4294967295 + + """ + + +def speed_dial( + wid: int, + caption: str, + x: int, + y: int, + w: int, + h: int, + func_ids: list[int], + *, + time_ms: int = FIGURE8_MS, + min_ms: int = 500, + max_ms: int = 30000, +) -> str: + fn_xml = "\n".join( + f' {fid}' + for fid in func_ids + ) + return f""" + +{appearance()} + 2 + + +{fn_xml} + """ + + +def xypad( + wid: int, + caption: str, + fid: int, + x: int, + y: int, + w: int, + h: int, + *, + reverse_pan: bool = False, + reverse_tilt: bool = False, + pan: int = 128, + tilt: int = 128, +) -> str: + pan_rev = "True" if reverse_pan else "False" + tilt_rev = "True" if reverse_tilt else "False" + return f""" + +{appearance()} + + + + + + + + """ + + +def label_frame(wid: int, caption: str, x: int, y: int, w: int, h: int) -> str: + return f""" + + Sunken + Default + Default + None + Default + + + True + True + True + False + False + False + """ + + +def button( + wid: int, + caption: str, + func_id: int, + x: int, + y: int, + w: int, + h: int, + bg: str, + fg: str = "4294967295", + *, + indent: str = " ", +) -> str: + inner = indent + " " + return f"""{indent}""" + + +def solo_frame(wid: int, caption: str, x: int, y: int, w: int, h: int, children: str) -> str: + return f""" + + Sunken + Default + Default + None + Default + + + True + True + True + False + False +{children} + """ + + +def can_fixture_val(fid: int, r: int, g: int, b: int) -> str: + # Dimmer is owned by the Can Bright slider (HTP). + return ( + f' ' + f"1,0,2,{r},3,{g},4,{b},5,0,6,0,7,0" + f"" + ) + + +def mover_fixture_val(fid: int, r: int, g: int, b: int) -> str: + # Dimmer is owned by the Mover Bright slider (HTP). + parts: list[int] = [] + for i in range(7): + base = 10 + i * 4 + parts.extend([base, r, base + 1, g, base + 2, b, base + 3, 0]) + return f' {",".join(str(x) for x in parts)}' + + +def look_scene_xml( + func_id: int, + name: str, + can_colors: dict[int, tuple[int, int, int]] | None = None, + mover_colors: dict[int, tuple[int, int, int]] | None = None, +) -> str: + vals: list[str] = [] + if can_colors: + vals += [can_fixture_val(fid, *rgb) for fid, rgb in can_colors.items()] + if mover_colors: + vals += [mover_fixture_val(fid, *rgb) for fid, rgb in mover_colors.items()] + return f""" + +{chr(10).join(vals)} + """ + + +def look_caption(kind: str, left_n: str, right_n: str | None) -> str: + ll, rl = color_label(left_n), color_label(right_n or left_n) + if right_n is None: + return ll + if kind == "cans": + return f"1-4 {ll} 5-8 {rl}" + return f"Odd {ll} Even {rl}" + + +def look_values( + kind: str, left: tuple[int, int, int], right: tuple[int, int, int] +) -> tuple[dict[int, tuple[int, int, int]] | None, dict[int, tuple[int, int, int]] | None]: + if kind == "cans": + return {**{i: left for i in range(4)}, **{i: right for i in range(4, 8)}}, None + if kind == "cans_oe": + return {**{i: left for i in CAN_ODD}, **{i: right for i in CAN_EVEN}}, None + raise ValueError(kind) + + +def build_looks() -> tuple[str, dict[str, list[tuple[str, int, str]]]]: + specs: dict[str, list[tuple[str, int, str]]] = { + "cans": [], + "movers": [], + "cans_oe": [], + } + scenes: list[str] = [] + func_id = 0 + for kind in ("cans", "cans_oe"): + for left_n, right_n in LOOK_PAIRS: + if kind == "cans_oe" and right_n is None: + continue + left = PALETTE[left_n] + right = PALETTE[right_n] if right_n else left + cans, movers = look_values(kind, left, right) + if right_n is None: + cans = {fid: left for fid in CANS} + movers = None + ll, rl = color_label(left_n), color_label(right_n or left_n) + name = f"{kind} {ll}" if right_n is None else f"{kind} {ll} {rl}" + scenes.append(look_scene_xml(func_id, name, cans, movers)) + bg = qlc_color(*left) if right_n is None else qlc_color(*mix_color(left, right)) + specs[kind].append((look_caption(kind, left_n, right_n), func_id, bg)) + func_id += 1 + for color_n in MOVER_SOLIDS: + rgb = PALETTE[color_n] + label = color_label(color_n) + scenes.append( + look_scene_xml( + func_id, + f"movers {label}", + mover_colors={M1: rgb, M2: rgb}, + ) + ) + specs["movers"].append((label, func_id, qlc_color(*rgb))) + func_id += 1 + return "\n".join(scenes), specs + + +def look_scenes_xml() -> str: + xml, _ = build_looks() + return xml + + +def position_scene_xml() -> str: + blocks = [ + f""" + + """ + ] + for i, (name, m1, m2, _bg) in enumerate(POSITIONS): + poses = {M1: m1, M2: m2} + vals = [] + for fid in (M1, M2): + pan, tilt = poses[fid] + vals.append( + f' 0,{pan},1,0,2,{tilt},3,0' + ) + blocks.append( + f""" + +{chr(10).join(vals)} + """ + ) + return "\n".join(blocks) + + +def position_button_specs() -> list[tuple[str, int, str]]: + return ( + [("Pads", PADS_FUNC, PADS_BG)] + + [ + (name, POSITION_FUNC0 + i, bg) + for i, (name, _m1, _m2, bg) in enumerate(POSITIONS) + ] + + [("Fig 8", FIGURE8_FUNC, FIGURE8_BG), ("Side 8", FIGURE8_SIDE_FUNC, FIGURE8_SIDE_BG)] + ) + + +def figure8_bounds() -> tuple[int, int, int, int]: + """Pan/tilt centre and amplitude covering Here–Out (not the live Now aim).""" + pans: list[int] = [] + tilts: list[int] = [] + for name, m1, m2, _bg in POSITIONS: + if name == "Now": + continue + for pan, tilt in (m1, m2): + pans.append(pan) + tilts.append(tilt) + p0, p1 = min(pans), max(pans) + t0, t1 = min(tilts), max(tilts) + return (p0 + p1) // 2, (t0 + t1) // 2, (p1 - p0) // 2, (t1 - t0) // 2 + + +def figure8_efx_block( + func_id: int, + name: str, + width: int, + height: int, + rotation: int, + pan_c: int, + tilt_c: int, +) -> str: + fixtures = "\n".join( + f""" + {fid} + Forward + 255 + """ + for fid in (M1, M2) + ) + return f""" +{fixtures} + Parallel + + Forward + Loop + Eight + {width} + {height} + {rotation} + + {pan_c} + 1 + 0 + + + {tilt_c} + 1 + 0 + + """ + + +def figure8_efx_xml() -> str: + pan_c, tilt_c, pan_amp, tilt_amp = figure8_bounds() + # Sideways ∞ is rotation 0. 90° is a vertical 8 (tilt 0 → 36 down); + # width/height are swapped so both still fill the Here–Out box. + return "\n".join( + [ + figure8_efx_block( + FIGURE8_FUNC, "Figure of 8", tilt_amp, pan_amp, 90, pan_c, tilt_c + ), + figure8_efx_block( + FIGURE8_SIDE_FUNC, + "Figure of 8 Side", + pan_amp, + tilt_amp, + 0, + pan_c, + tilt_c, + ), + ] + ) + + +def fixture_xml() -> str: + parts = [] + for i in range(8): + parts.append( + f""" + beamZ + BCC145 + 8 Channel + {i} + BCC145 #{i + 1} + 0 +
{87 + i * 8}
+ 8 +
""" + ) + for i, addr in enumerate((0, 44)): + parts.append( + f""" + Small Eye 7 + Mover + 43 Channel + {8 + i} + Small Eye 7 #{i + 1} + 0 +
{addr}
+ 43 +
""" + ) + return "\n".join(parts) + + +def fixture_groups_xml() -> str: + def heads(fids: list[int]) -> str: + return "\n".join( + f' 0' + for i, fid in enumerate(fids) + ) + + return f""" + Cans 1-2 + +{heads(GROUP_L)} + + + Cans 3-6 + +{heads(GROUP_C)} + + + Cans 7-8 + +{heads(GROUP_R)} + + + Small Eye Movers + + 0 + 0 + """ + + +def main() -> None: + pad_w, pad_h = 240, 240 + sl_w, sl_h = 44, 240 + gap = 8 + block_gap = 28 + + widgets: list[str] = [] + wid = 0 + max_x = 0 + max_y = 0 + + def place_slider(caption, x, y, w, h, channels, value=0, fg="Default", cng="None"): + nonlocal wid, max_x, max_y + widgets.append( + slider(wid, caption, x, y, w, h, channels, value=value, fg=fg, cng=cng) + ) + wid += 1 + max_x = max(max_x, x + w) + max_y = max(max_y, y + h) + + def place_rgb_block(prefix: str, x: int, y: int, dim_chs, rgb_chs_for): + """Dim + R G B. rgb_chs_for(name, can_ch, mover_chs) -> channel list.""" + place_slider( + f"{prefix} Dim", x, y, sl_w, sl_h, dim_chs, 0, "4294967295" + ) + x += sl_w + 2 + for name, can_ch, mover_chs, fg, cng in RGB: + place_slider( + f"{prefix} {name}", + x, + y, + sl_w, + sl_h, + rgb_chs_for(name, can_ch, mover_chs), + fg=fg, + cng=cng, + ) + x += sl_w + 2 + return x + + def place_mover(prefix: str, fid: int, x: int, y: int, *, reverse_pan: bool = False) -> int: + nonlocal wid, max_y + widgets.append( + xypad( + wid, + f"{prefix} Position", + fid, + x, + y, + pad_w, + pad_h, + reverse_pan=reverse_pan, + pan=PAD_PAN[fid], + tilt=PAD_TILT[fid], + ) + ) + wid += 1 + max_y = max(max_y, y + pad_h) + return x + pad_w + gap + + def place_looks( + title: str, + looks: list[tuple[str, int, str]], + x: int, + y: int, + *, + cols: int = 2, + btn_w: int = 156, + ) -> int: + nonlocal wid, max_x, max_y + header_h = 28 + pad = 4 + gap_x, gap_y = 6, 6 + n = len(looks) + cols = max(1, min(cols, n)) + rows = max(1, (n + cols - 1) // cols) + frame_w = pad * 2 + cols * btn_w + (cols - 1) * gap_x + frame_h = header_h + sl_h + inner_h = sl_h - pad + btn_h = (inner_h - gap_y * (rows - 1)) // rows + look_btns = [] + frame_id = wid + wid += 1 + for i, (caption, func_id, bg) in enumerate(looks): + col, row = i % cols, i // cols + look_btns.append( + button( + wid, + caption, + func_id, + pad + col * (btn_w + gap_x), + header_h + pad + row * (btn_h + gap_y), + btn_w, + btn_h, + bg, + indent=" ", + ) + ) + wid += 1 + widgets.append( + solo_frame( + frame_id, + title, + x, + y - header_h, + frame_w, + frame_h, + "\n".join(look_btns), + ) + ) + max_x = max(max_x, x + frame_w) + max_y = max(max_y, y - header_h + frame_h) + return x + frame_w + + _, look_specs = build_looks() + + y0 = 28 + x = 10 + # M2 on the left, M1 on the right. Left unit is hung opposite, so pan is reversed. + x = place_mover("M2", M2, x, y0, reverse_pan=True) + x += block_gap + x = place_mover("M1", M1, x, y0) + x += block_gap + place_slider( + "M Bright", + x, + y0, + sl_w, + sl_h, + [(M1, MOVER_DIM), (M2, MOVER_DIM)], + 255, + "4294967295", + ) + x += sl_w + 2 + place_slider( + "M Focus", + x, + y0, + sl_w, + sl_h, + [(M1, MOVER_FOCUS), (M2, MOVER_FOCUS)], + FOCUS_DEFAULT, + "4294902015", + ) + x += sl_w + 2 + widgets.append( + speed_dial( + wid, + "Speed", + x, + y0, + sl_w, + sl_h, + [FIGURE8_FUNC, FIGURE8_SIDE_FUNC], + ) + ) + wid += 1 + max_x = max(max_x, x + sl_w) + max_y = max(max_y, y0 + sl_h) + x += sl_w + 2 + for name, _can_ch, mover_chs, fg, cng in RGB: + place_slider( + f"M {name}", + x, + y0, + sl_w, + sl_h, + [(fid, c) for fid in (M1, M2) for c in mover_chs], + fg=fg, + cng=cng, + ) + x += sl_w + 2 + x += block_gap - 2 + x = place_looks( + "Position", + position_button_specs(), + x, + y0, + cols=2, + btn_w=72, + ) + x += block_gap + x = place_looks("Movers", look_specs["movers"], x, y0) + + y1 = y0 + pad_h + 40 + x = 10 + groups = [ + ("1-2", GROUP_L), + ("3-6", GROUP_C), + ("7-8", GROUP_R), + ] + for label, fids in groups: + block_w = 4 * sl_w + 3 * 2 + widgets.append(label_frame(wid, f"Cans {label}", x, y1 - 28, block_w, 24)) + wid += 1 + x = place_rgb_block( + label, + x, + y1, + [(f, 0) for f in fids], + lambda _n, can_ch, _m, fids=fids: [(f, can_ch) for f in fids], + ) + x += block_gap + + place_slider( + "C Bright", + x, + y1, + sl_w, + sl_h, + [(f, 0) for f in CANS], + 255, + "4294967295", + ) + x += sl_w + 2 + place_slider( + "C Color", + x, + y1, + sl_w, + sl_h, + [(f, ch) for f in CANS for ch in (2, 3, 4)], + 0, + "4294967295", + "RGB", + ) + x += sl_w + block_gap + x = place_looks("Cans", look_specs["cans"], x, y1) + x += block_gap + place_looks("Cans Odd/Even", look_specs["cans_oe"], x, y1) + + total_w = max_x + 16 + total_h = max_y + 16 + + qxw = f""" + + + + Q Light Controller Plus + 4.12.7 + Jimmy + + + + + + + + + + + + +{fixture_xml()} +{fixture_groups_xml()} +{look_scenes_xml()} +{position_scene_xml()} +{figure8_efx_xml()} + + + + + None + Default + Default + None + Default + +{"\n".join(widgets)} + + + + + + + + + + +""" + OUT.parent.mkdir(parents=True, exist_ok=True) + OUT.write_text(qxw) + print(f"Wrote {OUT} ({total_w}x{total_h}, {wid} widgets)") + + +if __name__ == "__main__": + main() diff --git a/shows/cabaret.qxw b/shows/cabaret.qxw new file mode 100644 index 0000000..b5d2746 --- /dev/null +++ b/shows/cabaret.qxw @@ -0,0 +1,1469 @@ + + + + + Q Light Controller Plus + 4.12.7 + Jimmy + + + + + + + + + + + + + + beamZ + BCC145 + 8 Channel + 0 + BCC145 #1 + 0 +
87
+ 8 +
+ + beamZ + BCC145 + 8 Channel + 1 + BCC145 #2 + 0 +
95
+ 8 +
+ + beamZ + BCC145 + 8 Channel + 2 + BCC145 #3 + 0 +
103
+ 8 +
+ + beamZ + BCC145 + 8 Channel + 3 + BCC145 #4 + 0 +
111
+ 8 +
+ + beamZ + BCC145 + 8 Channel + 4 + BCC145 #5 + 0 +
119
+ 8 +
+ + beamZ + BCC145 + 8 Channel + 5 + BCC145 #6 + 0 +
127
+ 8 +
+ + beamZ + BCC145 + 8 Channel + 6 + BCC145 #7 + 0 +
135
+ 8 +
+ + beamZ + BCC145 + 8 Channel + 7 + BCC145 #8 + 0 +
143
+ 8 +
+ + Small Eye 7 + Mover + 43 Channel + 8 + Small Eye 7 #1 + 0 +
0
+ 43 +
+ + Small Eye 7 + Mover + 43 Channel + 9 + Small Eye 7 #2 + 0 +
44
+ 43 +
+ + Cans 1-2 + + 0 + 0 + + + Cans 3-6 + + 0 + 0 + 0 + 0 + + + Cans 7-8 + + 0 + 0 + + + Small Eye Movers + + 0 + 0 + + + + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + + + + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + + + + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,76,3,0,4,255,5,0,6,0,7,0 + 1,0,2,76,3,0,4,255,5,0,6,0,7,0 + 1,0,2,76,3,0,4,255,5,0,6,0,7,0 + 1,0,2,76,3,0,4,255,5,0,6,0,7,0 + + + + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + + + + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + + + + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + + + + 1,0,2,255,3,127,4,0,5,0,6,0,7,0 + 1,0,2,255,3,127,4,0,5,0,6,0,7,0 + 1,0,2,255,3,127,4,0,5,0,6,0,7,0 + 1,0,2,255,3,127,4,0,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + + + + 1,0,2,255,3,255,4,0,5,0,6,0,7,0 + 1,0,2,255,3,255,4,0,5,0,6,0,7,0 + 1,0,2,255,3,255,4,0,5,0,6,0,7,0 + 1,0,2,255,3,255,4,0,5,0,6,0,7,0 + 1,0,2,127,3,0,4,255,5,0,6,0,7,0 + 1,0,2,127,3,0,4,255,5,0,6,0,7,0 + 1,0,2,127,3,0,4,255,5,0,6,0,7,0 + 1,0,2,127,3,0,4,255,5,0,6,0,7,0 + + + + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + 1,0,2,255,3,90,4,0,5,0,6,0,7,0 + + + + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,255,3,50,4,160,5,0,6,0,7,0 + 1,0,2,76,3,0,4,255,5,0,6,0,7,0 + 1,0,2,76,3,0,4,255,5,0,6,0,7,0 + 1,0,2,76,3,0,4,255,5,0,6,0,7,0 + 1,0,2,76,3,0,4,255,5,0,6,0,7,0 + + + + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + + + + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + 1,0,2,0,3,255,4,0,5,0,6,0,7,0 + + + + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + 1,0,2,255,3,0,4,0,5,0,6,0,7,0 + + + + 1,0,2,255,3,127,4,0,5,0,6,0,7,0 + 1,0,2,255,3,127,4,0,5,0,6,0,7,0 + 1,0,2,255,3,127,4,0,5,0,6,0,7,0 + 1,0,2,255,3,127,4,0,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + 1,0,2,0,3,0,4,255,5,0,6,0,7,0 + + + + 1,0,2,255,3,255,4,0,5,0,6,0,7,0 + 1,0,2,255,3,255,4,0,5,0,6,0,7,0 + 1,0,2,255,3,255,4,0,5,0,6,0,7,0 + 1,0,2,255,3,255,4,0,5,0,6,0,7,0 + 1,0,2,127,3,0,4,255,5,0,6,0,7,0 + 1,0,2,127,3,0,4,255,5,0,6,0,7,0 + 1,0,2,127,3,0,4,255,5,0,6,0,7,0 + 1,0,2,127,3,0,4,255,5,0,6,0,7,0 + + + + 10,255,11,90,12,0,13,0,14,255,15,90,16,0,17,0,18,255,19,90,20,0,21,0,22,255,23,90,24,0,25,0,26,255,27,90,28,0,29,0,30,255,31,90,32,0,33,0,34,255,35,90,36,0,37,0 + 10,255,11,90,12,0,13,0,14,255,15,90,16,0,17,0,18,255,19,90,20,0,21,0,22,255,23,90,24,0,25,0,26,255,27,90,28,0,29,0,30,255,31,90,32,0,33,0,34,255,35,90,36,0,37,0 + + + + 10,255,11,50,12,160,13,0,14,255,15,50,16,160,17,0,18,255,19,50,20,160,21,0,22,255,23,50,24,160,25,0,26,255,27,50,28,160,29,0,30,255,31,50,32,160,33,0,34,255,35,50,36,160,37,0 + 10,255,11,50,12,160,13,0,14,255,15,50,16,160,17,0,18,255,19,50,20,160,21,0,22,255,23,50,24,160,25,0,26,255,27,50,28,160,29,0,30,255,31,50,32,160,33,0,34,255,35,50,36,160,37,0 + + + + 10,255,11,0,12,0,13,0,14,255,15,0,16,0,17,0,18,255,19,0,20,0,21,0,22,255,23,0,24,0,25,0,26,255,27,0,28,0,29,0,30,255,31,0,32,0,33,0,34,255,35,0,36,0,37,0 + 10,255,11,0,12,0,13,0,14,255,15,0,16,0,17,0,18,255,19,0,20,0,21,0,22,255,23,0,24,0,25,0,26,255,27,0,28,0,29,0,30,255,31,0,32,0,33,0,34,255,35,0,36,0,37,0 + + + + 10,0,11,255,12,0,13,0,14,0,15,255,16,0,17,0,18,0,19,255,20,0,21,0,22,0,23,255,24,0,25,0,26,0,27,255,28,0,29,0,30,0,31,255,32,0,33,0,34,0,35,255,36,0,37,0 + 10,0,11,255,12,0,13,0,14,0,15,255,16,0,17,0,18,0,19,255,20,0,21,0,22,0,23,255,24,0,25,0,26,0,27,255,28,0,29,0,30,0,31,255,32,0,33,0,34,0,35,255,36,0,37,0 + + + + 10,0,11,0,12,255,13,0,14,0,15,0,16,255,17,0,18,0,19,0,20,255,21,0,22,0,23,0,24,255,25,0,26,0,27,0,28,255,29,0,30,0,31,0,32,255,33,0,34,0,35,0,36,255,37,0 + 10,0,11,0,12,255,13,0,14,0,15,0,16,255,17,0,18,0,19,0,20,255,21,0,22,0,23,0,24,255,25,0,26,0,27,0,28,255,29,0,30,0,31,0,32,255,33,0,34,0,35,0,36,255,37,0 + + + + 10,255,11,127,12,0,13,0,14,255,15,127,16,0,17,0,18,255,19,127,20,0,21,0,22,255,23,127,24,0,25,0,26,255,27,127,28,0,29,0,30,255,31,127,32,0,33,0,34,255,35,127,36,0,37,0 + 10,255,11,127,12,0,13,0,14,255,15,127,16,0,17,0,18,255,19,127,20,0,21,0,22,255,23,127,24,0,25,0,26,255,27,127,28,0,29,0,30,255,31,127,32,0,33,0,34,255,35,127,36,0,37,0 + + + + 10,255,11,255,12,0,13,0,14,255,15,255,16,0,17,0,18,255,19,255,20,0,21,0,22,255,23,255,24,0,25,0,26,255,27,255,28,0,29,0,30,255,31,255,32,0,33,0,34,255,35,255,36,0,37,0 + 10,255,11,255,12,0,13,0,14,255,15,255,16,0,17,0,18,255,19,255,20,0,21,0,22,255,23,255,24,0,25,0,26,255,27,255,28,0,29,0,30,255,31,255,32,0,33,0,34,255,35,255,36,0,37,0 + + + + 10,127,11,0,12,255,13,0,14,127,15,0,16,255,17,0,18,127,19,0,20,255,21,0,22,127,23,0,24,255,25,0,26,127,27,0,28,255,29,0,30,127,31,0,32,255,33,0,34,127,35,0,36,255,37,0 + 10,127,11,0,12,255,13,0,14,127,15,0,16,255,17,0,18,127,19,0,20,255,21,0,22,127,23,0,24,255,25,0,26,127,27,0,28,255,29,0,30,127,31,0,32,255,33,0,34,127,35,0,36,255,37,0 + + + + + + + 0,80,1,0,2,161,3,0 + 0,74,1,0,2,145,3,0 + + + + 0,179,1,0,2,0,3,0 + 0,179,1,0,2,0,3,0 + + + + 0,179,1,0,2,36,3,0 + 0,179,1,0,2,36,3,0 + + + + 0,164,1,0,2,18,3,0 + 0,144,1,0,2,18,3,0 + + + + 0,140,1,0,2,26,3,0 + 0,140,1,0,2,26,3,0 + + + + 0,200,1,0,2,22,3,0 + 0,200,1,0,2,22,3,0 + + + + 8 + Forward + 255 + + + 9 + Forward + 255 + + Parallel + + Forward + Loop + Eight + 18 + 30 + 90 + + 170 + 1 + 0 + + + 18 + 1 + 0 + + + + + 8 + Forward + 255 + + + 9 + Forward + 255 + + Parallel + + Forward + Loop + Eight + 30 + 18 + 0 + + 170 + 1 + 0 + + + 18 + 1 + 0 + + +
+ + + + None + Default + Default + None + Default + + + + + Sunken + Default + Default + None + Default + + + + + + + + + + + + + Sunken + Default + Default + None + Default + + + + + + + + + + + + + Sunken + 4294967295 + Default + None + Default + + Level + + + 8 + 8 + + + 4294967295 + + + + + + Sunken + 4294902015 + Default + None + Default + + Level + + + 7 + 7 + + + 4294967295 + + + + + + Sunken + Default + Default + None + Default + + 2 + + + 110 + 111 + + + + + Sunken + 4294901760 + Default + None + Default + + Level + + + 10 + 14 + 18 + 22 + 26 + 30 + 34 + 10 + 14 + 18 + 22 + 26 + 30 + 34 + + + 4294967295 + + + + + + Sunken + 4278255360 + Default + None + Default + + Level + + + 11 + 15 + 19 + 23 + 27 + 31 + 35 + 11 + 15 + 19 + 23 + 27 + 31 + 35 + + + 4294967295 + + + + + + Sunken + 4278190335 + Default + None + Default + + Level + + + 12 + 16 + 20 + 24 + 28 + 32 + 36 + 12 + 16 + 20 + 24 + 28 + 32 + 36 + + + 4294967295 + + + + + Sunken + Default + Default + None + Default + + + True + True + True + False + False + + + + + + + + + + + + + Sunken + Default + Default + None + Default + + + True + True + True + False + False + + + + + + + + + + + + Sunken + Default + Default + None + Default + + + True + True + True + False + False + False + + + + + Sunken + 4294967295 + Default + None + Default + + Level + + + 0 + 0 + + + 4294967295 + + + + + + Sunken + 4294901760 + Default + None + Default + + Level + + + 2 + 2 + + + 4294967295 + + + + + + Sunken + 4278255360 + Default + None + Default + + Level + + + 3 + 3 + + + 4294967295 + + + + + + Sunken + 4278190335 + Default + None + Default + + Level + + + 4 + 4 + + + 4294967295 + + + + + Sunken + Default + Default + None + Default + + + True + True + True + False + False + False + + + + + Sunken + 4294967295 + Default + None + Default + + Level + + + 0 + 0 + 0 + 0 + + + 4294967295 + + + + + + Sunken + 4294901760 + Default + None + Default + + Level + + + 2 + 2 + 2 + 2 + + + 4294967295 + + + + + + Sunken + 4278255360 + Default + None + Default + + Level + + + 3 + 3 + 3 + 3 + + + 4294967295 + + + + + + Sunken + 4278190335 + Default + None + Default + + Level + + + 4 + 4 + 4 + 4 + + + 4294967295 + + + + + Sunken + Default + Default + None + Default + + + True + True + True + False + False + False + + + + + Sunken + 4294967295 + Default + None + Default + + Level + + + 0 + 0 + + + 4294967295 + + + + + + Sunken + 4294901760 + Default + None + Default + + Level + + + 2 + 2 + + + 4294967295 + + + + + + Sunken + 4278255360 + Default + None + Default + + Level + + + 3 + 3 + + + 4294967295 + + + + + + Sunken + 4278190335 + Default + None + Default + + Level + + + 4 + 4 + + + 4294967295 + + + + + + Sunken + 4294967295 + Default + None + Default + + Level + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 4294967295 + + + + + + Sunken + 4294967295 + Default + None + Default + + Level + + + 2 + 3 + 4 + 2 + 3 + 4 + 2 + 3 + 4 + 2 + 3 + 4 + 2 + 3 + 4 + 2 + 3 + 4 + 2 + 3 + 4 + 2 + 3 + 4 + + + 4294967295 + + + + + Sunken + Default + Default + None + Default + + + True + True + True + False + False + + + + + + + + + + + + Sunken + Default + Default + None + Default + + + True + True + True + False + False + + + + + + + + + + + + + + + + + +